⚝
One Hat Cyber Team
⚝
Your IP:
216.73.216.45
Server IP:
185.238.29.86
Server:
Linux server2 6.8.12-6-pve #1 SMP PREEMPT_DYNAMIC PMX 6.8.12-6 (2024-12-19T19:05Z) x86_64
Server Software:
nginx/1.18.0
PHP Version:
8.1.31
Buat File
|
Buat Folder
Eksekusi
Dir :
~
/
var
/
www
/
makarnacimmix.xyz
/
node_modules
/
vls
/
dist
/
Edit File: vls.js.map
{ "version": 3, "sources": ["../node_modules/fast-glob/out/utils/array.js", "../node_modules/fast-glob/out/utils/errno.js", "../node_modules/fast-glob/out/utils/fs.js", "../node_modules/fast-glob/out/utils/path.js", "../node_modules/is-extglob/index.js", "../node_modules/is-glob/index.js", "../node_modules/glob-parent/index.js", "../node_modules/braces/lib/utils.js", "../node_modules/braces/lib/stringify.js", "../node_modules/to-regex-range/node_modules/is-number/index.js", "../node_modules/to-regex-range/index.js", "../node_modules/fill-range/index.js", "../node_modules/braces/lib/compile.js", "../node_modules/braces/lib/expand.js", "../node_modules/braces/lib/constants.js", "../node_modules/braces/lib/parse.js", "../node_modules/braces/index.js", "../node_modules/picomatch/lib/constants.js", "../node_modules/picomatch/lib/utils.js", "../node_modules/picomatch/lib/scan.js", "../node_modules/picomatch/lib/parse.js", "../node_modules/picomatch/lib/picomatch.js", "../node_modules/picomatch/index.js", "../node_modules/micromatch/index.js", "../node_modules/fast-glob/out/utils/pattern.js", "../node_modules/merge2/index.js", "../node_modules/fast-glob/out/utils/stream.js", "../node_modules/fast-glob/out/utils/string.js", "../node_modules/fast-glob/out/utils/index.js", "../node_modules/fast-glob/out/managers/tasks.js", "../node_modules/fast-glob/out/managers/patterns.js", "../node_modules/@nodelib/fs.stat/out/providers/async.js", "../node_modules/@nodelib/fs.stat/out/providers/sync.js", "../node_modules/@nodelib/fs.stat/out/adapters/fs.js", "../node_modules/@nodelib/fs.stat/out/settings.js", "../node_modules/@nodelib/fs.stat/out/index.js", "../node_modules/queue-microtask/index.js", "../node_modules/run-parallel/index.js", "../node_modules/@nodelib/fs.scandir/out/constants.js", "../node_modules/@nodelib/fs.scandir/out/utils/fs.js", "../node_modules/@nodelib/fs.scandir/out/utils/index.js", "../node_modules/@nodelib/fs.scandir/out/providers/common.js", "../node_modules/@nodelib/fs.scandir/out/providers/async.js", "../node_modules/@nodelib/fs.scandir/out/providers/sync.js", "../node_modules/@nodelib/fs.scandir/out/adapters/fs.js", "../node_modules/@nodelib/fs.scandir/out/settings.js", "../node_modules/@nodelib/fs.scandir/out/index.js", "../node_modules/reusify/reusify.js", "../node_modules/fastq/queue.js", "../node_modules/@nodelib/fs.walk/out/readers/common.js", "../node_modules/@nodelib/fs.walk/out/readers/reader.js", "../node_modules/@nodelib/fs.walk/out/readers/async.js", "../node_modules/@nodelib/fs.walk/out/providers/async.js", "../node_modules/@nodelib/fs.walk/out/providers/stream.js", "../node_modules/@nodelib/fs.walk/out/readers/sync.js", "../node_modules/@nodelib/fs.walk/out/providers/sync.js", "../node_modules/@nodelib/fs.walk/out/settings.js", "../node_modules/@nodelib/fs.walk/out/index.js", "../node_modules/fast-glob/out/readers/reader.js", "../node_modules/fast-glob/out/readers/stream.js", "../node_modules/fast-glob/out/readers/async.js", "../node_modules/fast-glob/out/providers/matchers/matcher.js", "../node_modules/fast-glob/out/providers/matchers/partial.js", "../node_modules/fast-glob/out/providers/filters/deep.js", "../node_modules/fast-glob/out/providers/filters/entry.js", "../node_modules/fast-glob/out/providers/filters/error.js", "../node_modules/fast-glob/out/providers/transformers/entry.js", "../node_modules/fast-glob/out/providers/provider.js", "../node_modules/fast-glob/out/providers/async.js", "../node_modules/fast-glob/out/providers/stream.js", "../node_modules/fast-glob/out/readers/sync.js", "../node_modules/fast-glob/out/providers/sync.js", "../node_modules/fast-glob/out/settings.js", "../node_modules/fast-glob/out/index.js", "../node_modules/lodash/lodash.js", "../node_modules/vscode-languageserver/lib/common/utils/is.js", "../node_modules/vscode-jsonrpc/lib/common/ral.js", "../node_modules/vscode-jsonrpc/lib/common/disposable.js", "../node_modules/vscode-jsonrpc/lib/common/messageBuffer.js", "../node_modules/vscode-jsonrpc/lib/node/ril.js", "../node_modules/vscode-jsonrpc/lib/common/is.js", "../node_modules/vscode-jsonrpc/lib/common/messages.js", "../node_modules/vscode-jsonrpc/lib/common/events.js", "../node_modules/vscode-jsonrpc/lib/common/cancellation.js", "../node_modules/vscode-jsonrpc/lib/common/messageReader.js", "../node_modules/vscode-jsonrpc/lib/common/semaphore.js", "../node_modules/vscode-jsonrpc/lib/common/messageWriter.js", "../node_modules/vscode-jsonrpc/lib/common/linkedMap.js", "../node_modules/vscode-jsonrpc/lib/common/connection.js", "../node_modules/vscode-jsonrpc/lib/common/api.js", "../node_modules/vscode-jsonrpc/lib/node/main.js", "../node_modules/vscode-jsonrpc/node.js", "../node_modules/vscode-languageserver-types/lib/esm/main.js", "../node_modules/vscode-languageserver-protocol/lib/common/messages.js", "../node_modules/vscode-languageserver-protocol/lib/common/utils/is.js", "../node_modules/vscode-languageserver-protocol/lib/common/protocol.implementation.js", "../node_modules/vscode-languageserver-protocol/lib/common/protocol.typeDefinition.js", "../node_modules/vscode-languageserver-protocol/lib/common/protocol.workspaceFolders.js", "../node_modules/vscode-languageserver-protocol/lib/common/protocol.configuration.js", "../node_modules/vscode-languageserver-protocol/lib/common/protocol.colorProvider.js", "../node_modules/vscode-languageserver-protocol/lib/common/protocol.foldingRange.js", "../node_modules/vscode-languageserver-protocol/lib/common/protocol.declaration.js", "../node_modules/vscode-languageserver-protocol/lib/common/protocol.selectionRange.js", "../node_modules/vscode-languageserver-protocol/lib/common/protocol.progress.js", "../node_modules/vscode-languageserver-protocol/lib/common/protocol.callHierarchy.js", "../node_modules/vscode-languageserver-protocol/lib/common/protocol.semanticTokens.js", "../node_modules/vscode-languageserver-protocol/lib/common/protocol.showDocument.js", "../node_modules/vscode-languageserver-protocol/lib/common/protocol.linkedEditingRange.js", "../node_modules/vscode-languageserver-protocol/lib/common/protocol.fileOperations.js", "../node_modules/vscode-languageserver-protocol/lib/common/protocol.moniker.js", "../node_modules/vscode-languageserver-protocol/lib/common/protocol.js", "../node_modules/vscode-languageserver-protocol/lib/common/connection.js", "../node_modules/vscode-languageserver-protocol/lib/common/api.js", "../node_modules/vscode-languageserver-protocol/lib/node/main.js", "../node_modules/vscode-languageserver/lib/common/utils/uuid.js", "../node_modules/vscode-languageserver/lib/common/progress.js", "../node_modules/vscode-languageserver/lib/common/configuration.js", "../node_modules/vscode-languageserver/lib/common/workspaceFolders.js", "../node_modules/vscode-languageserver/lib/common/callHierarchy.js", "../node_modules/vscode-languageserver/lib/common/semanticTokens.js", "../node_modules/vscode-languageserver/lib/common/showDocument.js", "../node_modules/vscode-languageserver/lib/common/fileOperations.js", "../node_modules/vscode-languageserver/lib/common/linkedEditingRange.js", "../node_modules/vscode-languageserver/lib/common/moniker.js", "../node_modules/vscode-languageserver/lib/common/server.js", "../node_modules/vscode-languageserver/lib/node/files.js", "../node_modules/vscode-languageserver-protocol/node.js", "../node_modules/vscode-languageserver/lib/common/api.js", "../node_modules/vscode-languageserver/lib/node/main.js", "../node_modules/vscode-nls/src/common/ral.ts", "../node_modules/vscode-nls/src/common/common.ts", "../node_modules/vscode-nls/src/node/main.ts", "../node_modules/js-beautify/js/src/core/output.js", "../node_modules/js-beautify/js/src/core/token.js", "../node_modules/js-beautify/js/src/javascript/acorn.js", "../node_modules/js-beautify/js/src/core/options.js", "../node_modules/js-beautify/js/src/javascript/options.js", "../node_modules/js-beautify/js/src/core/inputscanner.js", "../node_modules/js-beautify/js/src/core/tokenstream.js", "../node_modules/js-beautify/js/src/core/pattern.js", "../node_modules/js-beautify/js/src/core/whitespacepattern.js", "../node_modules/js-beautify/js/src/core/tokenizer.js", "../node_modules/js-beautify/js/src/core/directives.js", "../node_modules/js-beautify/js/src/core/templatablepattern.js", "../node_modules/js-beautify/js/src/javascript/tokenizer.js", "../node_modules/js-beautify/js/src/javascript/beautifier.js", "../node_modules/js-beautify/js/src/javascript/index.js", "../node_modules/js-beautify/js/src/css/options.js", "../node_modules/js-beautify/js/src/css/beautifier.js", "../node_modules/js-beautify/js/src/css/index.js", "../node_modules/js-beautify/js/src/html/options.js", "../node_modules/js-beautify/js/src/html/tokenizer.js", "../node_modules/js-beautify/js/src/html/beautifier.js", "../node_modules/js-beautify/js/src/html/index.js", "../node_modules/js-beautify/js/src/index.js", "../node_modules/js-beautify/js/index.js", "../node_modules/eslint-visitor-keys/dist/eslint-visitor-keys.cjs", "../node_modules/lodash/_freeGlobal.js", "../node_modules/lodash/_root.js", "../node_modules/lodash/_Symbol.js", "../node_modules/lodash/_getRawTag.js", "../node_modules/lodash/_objectToString.js", "../node_modules/lodash/_baseGetTag.js", "../node_modules/lodash/isObjectLike.js", "../node_modules/lodash/isSymbol.js", "../node_modules/lodash/_baseSortedIndexBy.js", "../node_modules/lodash/identity.js", "../node_modules/lodash/_baseSortedIndex.js", "../node_modules/lodash/sortedLastIndex.js", "../node_modules/lodash/last.js", "../node_modules/lodash/_baseFindIndex.js", "../node_modules/lodash/_listCacheClear.js", "../node_modules/lodash/eq.js", "../node_modules/lodash/_assocIndexOf.js", "../node_modules/lodash/_listCacheDelete.js", "../node_modules/lodash/_listCacheGet.js", "../node_modules/lodash/_listCacheHas.js", "../node_modules/lodash/_listCacheSet.js", "../node_modules/lodash/_ListCache.js", "../node_modules/lodash/_stackClear.js", "../node_modules/lodash/_stackDelete.js", "../node_modules/lodash/_stackGet.js", "../node_modules/lodash/_stackHas.js", "../node_modules/lodash/isObject.js", "../node_modules/lodash/isFunction.js", "../node_modules/lodash/_coreJsData.js", "../node_modules/lodash/_isMasked.js", "../node_modules/lodash/_toSource.js", "../node_modules/lodash/_baseIsNative.js", "../node_modules/lodash/_getValue.js", "../node_modules/lodash/_getNative.js", "../node_modules/lodash/_Map.js", "../node_modules/lodash/_nativeCreate.js", "../node_modules/lodash/_hashClear.js", "../node_modules/lodash/_hashDelete.js", "../node_modules/lodash/_hashGet.js", "../node_modules/lodash/_hashHas.js", "../node_modules/lodash/_hashSet.js", "../node_modules/lodash/_Hash.js", "../node_modules/lodash/_mapCacheClear.js", "../node_modules/lodash/_isKeyable.js", "../node_modules/lodash/_getMapData.js", "../node_modules/lodash/_mapCacheDelete.js", "../node_modules/lodash/_mapCacheGet.js", "../node_modules/lodash/_mapCacheHas.js", "../node_modules/lodash/_mapCacheSet.js", "../node_modules/lodash/_MapCache.js", "../node_modules/lodash/_stackSet.js", "../node_modules/lodash/_Stack.js", "../node_modules/lodash/_setCacheAdd.js", "../node_modules/lodash/_setCacheHas.js", "../node_modules/lodash/_SetCache.js", "../node_modules/lodash/_arraySome.js", "../node_modules/lodash/_cacheHas.js", "../node_modules/lodash/_equalArrays.js", "../node_modules/lodash/_Uint8Array.js", "../node_modules/lodash/_mapToArray.js", "../node_modules/lodash/_setToArray.js", "../node_modules/lodash/_equalByTag.js", "../node_modules/lodash/_arrayPush.js", "../node_modules/lodash/isArray.js", "../node_modules/lodash/_baseGetAllKeys.js", "../node_modules/lodash/_arrayFilter.js", "../node_modules/lodash/stubArray.js", "../node_modules/lodash/_getSymbols.js", "../node_modules/lodash/_baseTimes.js", "../node_modules/lodash/_baseIsArguments.js", "../node_modules/lodash/isArguments.js", "../node_modules/lodash/stubFalse.js", "../node_modules/lodash/isBuffer.js", "../node_modules/lodash/_isIndex.js", "../node_modules/lodash/isLength.js", "../node_modules/lodash/_baseIsTypedArray.js", "../node_modules/lodash/_baseUnary.js", "../node_modules/lodash/_nodeUtil.js", "../node_modules/lodash/isTypedArray.js", "../node_modules/lodash/_arrayLikeKeys.js", "../node_modules/lodash/_isPrototype.js", "../node_modules/lodash/_overArg.js", "../node_modules/lodash/_nativeKeys.js", "../node_modules/lodash/_baseKeys.js", "../node_modules/lodash/isArrayLike.js", "../node_modules/lodash/keys.js", "../node_modules/lodash/_getAllKeys.js", "../node_modules/lodash/_equalObjects.js", "../node_modules/lodash/_DataView.js", "../node_modules/lodash/_Promise.js", "../node_modules/lodash/_Set.js", "../node_modules/lodash/_WeakMap.js", "../node_modules/lodash/_getTag.js", "../node_modules/lodash/_baseIsEqualDeep.js", "../node_modules/lodash/_baseIsEqual.js", "../node_modules/lodash/_baseIsMatch.js", "../node_modules/lodash/_isStrictComparable.js", "../node_modules/lodash/_getMatchData.js", "../node_modules/lodash/_matchesStrictComparable.js", "../node_modules/lodash/_baseMatches.js", "../node_modules/lodash/_isKey.js", "../node_modules/lodash/memoize.js", "../node_modules/lodash/_memoizeCapped.js", "../node_modules/lodash/_stringToPath.js", "../node_modules/lodash/_arrayMap.js", "../node_modules/lodash/_baseToString.js", "../node_modules/lodash/toString.js", "../node_modules/lodash/_castPath.js", "../node_modules/lodash/_toKey.js", "../node_modules/lodash/_baseGet.js", "../node_modules/lodash/get.js", "../node_modules/lodash/_baseHasIn.js", "../node_modules/lodash/_hasPath.js", "../node_modules/lodash/hasIn.js", "../node_modules/lodash/_baseMatchesProperty.js", "../node_modules/lodash/_baseProperty.js", "../node_modules/lodash/_basePropertyDeep.js", "../node_modules/lodash/property.js", "../node_modules/lodash/_baseIteratee.js", "../node_modules/lodash/_trimmedEndIndex.js", "../node_modules/lodash/_baseTrim.js", "../node_modules/lodash/toNumber.js", "../node_modules/lodash/toFinite.js", "../node_modules/lodash/toInteger.js", "../node_modules/lodash/findLastIndex.js", "../node_modules/debug/node_modules/ms/index.js", "../node_modules/debug/src/common.js", "../node_modules/debug/src/browser.js", "../node_modules/supports-color/node_modules/has-flag/index.js", "../node_modules/supports-color/index.js", "../node_modules/debug/src/node.js", "../node_modules/debug/src/index.js", "../node_modules/lodash/head.js", "../node_modules/lodash/first.js", "../node_modules/lodash/sortedIndexBy.js", "../node_modules/estraverse/estraverse.js", "../node_modules/esrecurse/package.json", "../node_modules/esrecurse/esrecurse.js", "../node_modules/eslint-scope/dist/eslint-scope.cjs", "../node_modules/vue-eslint-parser/node_modules/semver/internal/constants.js", "../node_modules/vue-eslint-parser/node_modules/semver/internal/debug.js", "../node_modules/vue-eslint-parser/node_modules/semver/internal/re.js", "../node_modules/vue-eslint-parser/node_modules/semver/internal/parse-options.js", "../node_modules/vue-eslint-parser/node_modules/semver/internal/identifiers.js", "../node_modules/vue-eslint-parser/node_modules/semver/classes/semver.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/parse.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/valid.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/clean.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/inc.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/compare.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/eq.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/diff.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/major.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/minor.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/patch.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/prerelease.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/rcompare.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/compare-loose.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/compare-build.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/sort.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/rsort.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/gt.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/lt.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/neq.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/gte.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/lte.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/cmp.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/coerce.js", "../node_modules/vue-eslint-parser/node_modules/yallist/iterator.js", "../node_modules/vue-eslint-parser/node_modules/yallist/yallist.js", "../node_modules/vue-eslint-parser/node_modules/lru-cache/index.js", "../node_modules/vue-eslint-parser/node_modules/semver/classes/range.js", "../node_modules/vue-eslint-parser/node_modules/semver/classes/comparator.js", "../node_modules/vue-eslint-parser/node_modules/semver/functions/satisfies.js", "../node_modules/vue-eslint-parser/node_modules/semver/ranges/to-comparators.js", "../node_modules/vue-eslint-parser/node_modules/semver/ranges/max-satisfying.js", "../node_modules/vue-eslint-parser/node_modules/semver/ranges/min-satisfying.js", "../node_modules/vue-eslint-parser/node_modules/semver/ranges/min-version.js", "../node_modules/vue-eslint-parser/node_modules/semver/ranges/valid.js", "../node_modules/vue-eslint-parser/node_modules/semver/ranges/outside.js", "../node_modules/vue-eslint-parser/node_modules/semver/ranges/gtr.js", "../node_modules/vue-eslint-parser/node_modules/semver/ranges/ltr.js", "../node_modules/vue-eslint-parser/node_modules/semver/ranges/intersects.js", "../node_modules/vue-eslint-parser/node_modules/semver/ranges/simplify.js", "../node_modules/vue-eslint-parser/node_modules/semver/ranges/subset.js", "../node_modules/vue-eslint-parser/node_modules/semver/index.js", "../node_modules/acorn/dist/acorn.js", "../node_modules/acorn-jsx/xhtml.js", "../node_modules/acorn-jsx/index.js", "../node_modules/espree/dist/espree.cjs", "../node_modules/lodash/sortedLastIndexBy.js", "../node_modules/esquery/node_modules/estraverse/estraverse.js", "../node_modules/esquery/parser.js", "../node_modules/esquery/esquery.js", "../node_modules/lodash/_isFlattenable.js", "../node_modules/lodash/_baseFlatten.js", "../node_modules/lodash/_apply.js", "../node_modules/lodash/_overRest.js", "../node_modules/lodash/constant.js", "../node_modules/lodash/_defineProperty.js", "../node_modules/lodash/_baseSetToString.js", "../node_modules/lodash/_shortOut.js", "../node_modules/lodash/_setToString.js", "../node_modules/lodash/_baseRest.js", "../node_modules/lodash/_baseIsNaN.js", "../node_modules/lodash/_strictIndexOf.js", "../node_modules/lodash/_baseIndexOf.js", "../node_modules/lodash/_arrayIncludes.js", "../node_modules/lodash/_arrayIncludesWith.js", "../node_modules/lodash/noop.js", "../node_modules/lodash/_createSet.js", "../node_modules/lodash/_baseUniq.js", "../node_modules/lodash/isArrayLikeObject.js", "../node_modules/lodash/union.js", "../node_modules/lodash/_baseIntersection.js", "../node_modules/lodash/_castArrayLikeObject.js", "../node_modules/lodash/intersection.js", "../node_modules/vue-eslint-parser/.temp/ast/src/ast/errors.ts", "../node_modules/vue-eslint-parser/.temp/ast/src/ast/nodes.ts", "../node_modules/vue-eslint-parser/.temp/ast/src/ast/traverse.ts", "../node_modules/vue-eslint-parser/.temp/common/src/common/lines-and-columns.ts", "../node_modules/vue-eslint-parser/.temp/common/src/common/location-calculator.ts", "../node_modules/vue-eslint-parser/.temp/common/src/common/debug.ts", "../node_modules/vue-eslint-parser/.temp/common/src/common/ast-utils.ts", "../node_modules/vue-eslint-parser/.temp/common/src/common/parser-object.ts", "../node_modules/vue-eslint-parser/.temp/common/src/common/parser-options.ts", "../node_modules/vue-eslint-parser/.temp/common/src/common/create-require.ts", "../node_modules/vue-eslint-parser/.temp/common/src/common/linter-require.ts", "../node_modules/vue-eslint-parser/.temp/common/src/common/eslint-scope.ts", "../node_modules/vue-eslint-parser/.temp/common/src/common/espree.ts", "../node_modules/vue-eslint-parser/.temp/script/src/script/scope-analyzer.ts", "../node_modules/vue-eslint-parser/.temp/common/src/common/fix-locations.ts", "../node_modules/vue-eslint-parser/.temp/script-setup/src/script-setup/parser-options.ts", "../node_modules/vue-eslint-parser/.temp/script/src/script/index.ts", "../node_modules/vue-eslint-parser/.temp/common/src/common/token-utils.ts", "../node_modules/vue-eslint-parser/.temp/common/src/common/error-utils.ts", "../node_modules/vue-eslint-parser/.temp/template/src/template/index.ts", "../node_modules/vue-eslint-parser/.temp/html/util/src/html/util/attribute-names.ts", "../node_modules/vue-eslint-parser/.temp/html/util/src/html/util/tag-names.ts", "../node_modules/vue-eslint-parser/.temp/html/src/html/intermediate-tokenizer.ts", "../node_modules/vue-eslint-parser/.temp/html/src/html/parser.ts", "../node_modules/vue-eslint-parser/.temp/html/util/src/html/util/alternative-cr.ts", "../node_modules/vue-eslint-parser/.temp/html/util/src/html/util/entities.ts", "../node_modules/vue-eslint-parser/.temp/html/util/src/html/util/unicode.ts", "../node_modules/vue-eslint-parser/.temp/html/src/html/tokenizer.ts", "../node_modules/vue-eslint-parser/.temp/external/src/external/node-event-generator.ts", "../node_modules/vue-eslint-parser/.temp/external/token-store/src/external/token-store/utils.ts", "../node_modules/vue-eslint-parser/.temp/external/token-store/cursors/src/external/token-store/cursors/cursor.ts", "../node_modules/vue-eslint-parser/.temp/external/token-store/cursors/src/external/token-store/cursors/backward-token-comment-cursor.ts", "../node_modules/vue-eslint-parser/.temp/external/token-store/cursors/src/external/token-store/cursors/backward-token-cursor.ts", "../node_modules/vue-eslint-parser/.temp/external/token-store/cursors/src/external/token-store/cursors/decorative-cursor.ts", "../node_modules/vue-eslint-parser/.temp/external/token-store/cursors/src/external/token-store/cursors/filter-cursor.ts", "../node_modules/vue-eslint-parser/.temp/external/token-store/cursors/src/external/token-store/cursors/forward-token-comment-cursor.ts", "../node_modules/vue-eslint-parser/.temp/external/token-store/cursors/src/external/token-store/cursors/forward-token-cursor.ts", "../node_modules/vue-eslint-parser/.temp/external/token-store/cursors/src/external/token-store/cursors/limit-cursor.ts", "../node_modules/vue-eslint-parser/.temp/external/token-store/cursors/src/external/token-store/cursors/skip-cursor.ts", "../node_modules/vue-eslint-parser/.temp/external/token-store/cursors/src/external/token-store/cursors/index.ts", "../node_modules/vue-eslint-parser/.temp/external/token-store/cursors/src/external/token-store/cursors/padded-token-cursor.ts", "../node_modules/vue-eslint-parser/.temp/external/token-store/src/external/token-store/index.ts", "../node_modules/vue-eslint-parser/.temp/sfc/custom-block/src/sfc/custom-block/index.ts", "../node_modules/vue-eslint-parser/.temp/src/parser-services.ts", "../node_modules/vue-eslint-parser/.temp/script-setup/src/script-setup/index.ts", "../node_modules/vue-eslint-parser/.temp/style/src/style/tokenizer.ts", "../node_modules/vue-eslint-parser/.temp/style/src/style/index.ts", "../node_modules/vue-eslint-parser/.temp/script-setup/src/script-setup/scope-analyzer.ts", "../node_modules/vue-eslint-parser/.temp/src/index.ts", "../node_modules/stylus/lib/token.js", "../node_modules/stylus/lib/visitor/index.js", "../node_modules/stylus/lib/units.js", "../node_modules/stylus/lib/stack/index.js", "../node_modules/stylus/lib/stack/scope.js", "../node_modules/stylus/lib/stack/frame.js", "../node_modules/fs.realpath/old.js", "../node_modules/fs.realpath/index.js", "../node_modules/concat-map/index.js", "../node_modules/balanced-match/index.js", "../node_modules/minimatch/node_modules/brace-expansion/index.js", "../node_modules/minimatch/minimatch.js", "../node_modules/inherits/inherits_browser.js", "../node_modules/inherits/inherits.js", "../node_modules/path-is-absolute/index.js", "../node_modules/stylus/node_modules/glob/common.js", "../node_modules/stylus/node_modules/glob/sync.js", "../node_modules/wrappy/wrappy.js", "../node_modules/once/once.js", "../node_modules/inflight/inflight.js", "../node_modules/stylus/node_modules/glob/glob.js", "../node_modules/stylus/lib/selector-parser.js", "../node_modules/stylus/lib/utils.js", "../node_modules/stylus/lib/functions/add-property.js", "../node_modules/stylus/lib/functions/adjust.js", "../node_modules/stylus/lib/functions/rgba.js", "../node_modules/stylus/lib/functions/alpha.js", "../node_modules/stylus/lib/functions/base-convert.js", "../node_modules/stylus/lib/functions/basename.js", "../node_modules/stylus/lib/functions/blend.js", "../node_modules/stylus/lib/functions/blue.js", "../node_modules/stylus/lib/functions/clone.js", "../node_modules/stylus/lib/functions/component.js", "../node_modules/stylus/lib/functions/luminosity.js", "../node_modules/stylus/lib/functions/contrast.js", "../node_modules/stylus/lib/functions/convert.js", "../node_modules/stylus/lib/functions/current-media.js", "../node_modules/stylus/lib/functions/define.js", "../node_modules/stylus/lib/functions/dirname.js", "../node_modules/stylus/lib/functions/error.js", "../node_modules/stylus/lib/functions/extname.js", "../node_modules/stylus/lib/functions/green.js", "../node_modules/stylus/lib/functions/hsla.js", "../node_modules/stylus/lib/functions/hsl.js", "../node_modules/stylus/lib/functions/hue.js", "../node_modules/sax/lib/sax.js", "../node_modules/stylus/lib/functions/image.js", "../node_modules/stylus/lib/functions/image-size.js", "../node_modules/stylus/lib/functions/json.js", "../node_modules/stylus/lib/functions/length.js", "../node_modules/stylus/lib/functions/lightness.js", "../node_modules/stylus/lib/functions/list-separator.js", "../node_modules/stylus/lib/functions/lookup.js", "../node_modules/stylus/lib/functions/match.js", "../node_modules/stylus/lib/functions/math.js", "../node_modules/stylus/lib/functions/merge.js", "../node_modules/stylus/lib/functions/operate.js", "../node_modules/stylus/lib/functions/opposite-position.js", "../node_modules/stylus/lib/functions/p.js", "../node_modules/stylus/lib/functions/pathjoin.js", "../node_modules/stylus/lib/functions/pop.js", "../node_modules/stylus/lib/functions/push.js", "../node_modules/stylus/lib/functions/range.js", "../node_modules/stylus/lib/functions/red.js", "../node_modules/stylus/lib/functions/remove.js", "../node_modules/stylus/lib/functions/replace.js", "../node_modules/stylus/lib/functions/rgb.js", "../node_modules/stylus/lib/functions/convert-angle.js", "../node_modules/stylus/lib/functions/atan.js", "../node_modules/stylus/lib/functions/asin.js", "../node_modules/stylus/lib/functions/acos.js", "../node_modules/stylus/lib/visitor/compiler.js", "../node_modules/stylus/lib/functions/s.js", "../node_modules/stylus/lib/functions/saturation.js", "../node_modules/stylus/lib/visitor/normalizer.js", "../node_modules/stylus/lib/functions/selector-exists.js", "../node_modules/stylus/lib/functions/selector.js", "../node_modules/stylus/lib/functions/selectors.js", "../node_modules/stylus/lib/functions/shift.js", "../node_modules/stylus/lib/functions/split.js", "../node_modules/stylus/lib/functions/substr.js", "../node_modules/stylus/lib/functions/slice.js", "../node_modules/stylus/lib/functions/tan.js", "../node_modules/stylus/lib/functions/trace.js", "../node_modules/stylus/lib/functions/transparentify.js", "../node_modules/stylus/lib/functions/type.js", "../node_modules/stylus/lib/functions/unit.js", "../node_modules/stylus/lib/functions/unquote.js", "../node_modules/stylus/lib/functions/unshift.js", "../node_modules/stylus/lib/functions/use.js", "../node_modules/stylus/lib/functions/warn.js", "../node_modules/stylus/lib/functions/math-prop.js", "../node_modules/stylus/lib/functions/prefix-classes.js", "../node_modules/stylus/lib/functions/index.js", "../node_modules/stylus/lib/colors.js", "../node_modules/stylus/lib/functions/url.js", "../node_modules/stylus/lib/visitor/evaluator.js", "../node_modules/stylus/lib/nodes/node.js", "../node_modules/stylus/lib/nodes/root.js", "../node_modules/stylus/lib/nodes/null.js", "../node_modules/stylus/lib/nodes/each.js", "../node_modules/stylus/lib/nodes/if.js", "../node_modules/stylus/lib/nodes/call.js", "../node_modules/stylus/lib/nodes/unaryop.js", "../node_modules/stylus/lib/nodes/binop.js", "../node_modules/stylus/lib/nodes/ternary.js", "../node_modules/stylus/lib/nodes/block.js", "../node_modules/stylus/lib/nodes/unit.js", "../node_modules/stylus/lib/nodes/string.js", "../node_modules/stylus/lib/nodes/hsla.js", "../node_modules/stylus/lib/nodes/rgba.js", "../node_modules/stylus/lib/nodes/ident.js", "../node_modules/stylus/lib/nodes/group.js", "../node_modules/stylus/lib/nodes/literal.js", "../node_modules/stylus/lib/nodes/boolean.js", "../node_modules/stylus/lib/nodes/return.js", "../node_modules/stylus/lib/nodes/atrule.js", "../node_modules/stylus/lib/nodes/media.js", "../node_modules/stylus/lib/nodes/query-list.js", "../node_modules/stylus/lib/nodes/query.js", "../node_modules/stylus/lib/nodes/feature.js", "../node_modules/stylus/lib/nodes/params.js", "../node_modules/stylus/lib/nodes/comment.js", "../node_modules/stylus/lib/nodes/keyframes.js", "../node_modules/stylus/lib/nodes/member.js", "../node_modules/stylus/lib/nodes/charset.js", "../node_modules/stylus/lib/nodes/namespace.js", "../node_modules/stylus/lib/nodes/import.js", "../node_modules/stylus/lib/nodes/extend.js", "../node_modules/stylus/lib/nodes/object.js", "../node_modules/stylus/lib/nodes/function.js", "../node_modules/stylus/lib/nodes/property.js", "../node_modules/stylus/lib/nodes/selector.js", "../node_modules/stylus/lib/nodes/expression.js", "../node_modules/stylus/lib/nodes/arguments.js", "../node_modules/stylus/lib/nodes/atblock.js", "../node_modules/stylus/lib/nodes/supports.js", "../node_modules/stylus/lib/nodes/index.js", "../node_modules/stylus/lib/errors.js", "../node_modules/stylus/lib/lexer.js", "../node_modules/stylus/lib/cache/memory.js", "../node_modules/stylus/lib/cache/null.js", "../node_modules/stylus/lib/cache/index.js", "../node_modules/stylus/lib/parser.js", "../node_modules/stylus/node_modules/source-map/lib/base64.js", "../node_modules/stylus/node_modules/source-map/lib/base64-vlq.js", "../node_modules/stylus/node_modules/source-map/lib/util.js", "../node_modules/stylus/node_modules/source-map/lib/array-set.js", "../node_modules/stylus/node_modules/source-map/lib/mapping-list.js", "../node_modules/stylus/node_modules/source-map/lib/source-map-generator.js", "../node_modules/stylus/node_modules/source-map/lib/binary-search.js", "../node_modules/stylus/node_modules/source-map/lib/read-wasm.js", "../node_modules/stylus/node_modules/source-map/lib/wasm.js", "../node_modules/stylus/node_modules/source-map/lib/source-map-consumer.js", "../node_modules/stylus/node_modules/source-map/lib/source-node.js", "../node_modules/stylus/node_modules/source-map/source-map.js", "../node_modules/stylus/lib/visitor/sourcemapper.js", "../node_modules/stylus/lib/visitor/deps-resolver.js", "../node_modules/stylus/lib/renderer.js", "../node_modules/stylus/package.json", "../node_modules/stylus/lib/middleware.js", "../node_modules/@adobe/css-tools/dist/cjs/webpack:/@adobe/css-tools/src/CssParseError.ts", "../node_modules/@adobe/css-tools/dist/cjs/webpack:/@adobe/css-tools/src/CssPosition.ts", "../node_modules/@adobe/css-tools/dist/cjs/webpack:/@adobe/css-tools/src/index.ts", "../node_modules/@adobe/css-tools/dist/cjs/webpack:/@adobe/css-tools/src/parse/index.ts", "../node_modules/@adobe/css-tools/dist/cjs/webpack:/@adobe/css-tools/src/stringify/compiler.ts", "../node_modules/@adobe/css-tools/dist/cjs/webpack:/@adobe/css-tools/src/stringify/index.ts", "../node_modules/@adobe/css-tools/dist/cjs/webpack:/@adobe/css-tools/src/type.ts", "../node_modules/@adobe/css-tools/dist/cjs/webpack:/@adobe/css-tools/webpack/bootstrap", "../node_modules/@adobe/css-tools/dist/cjs/webpack:/@adobe/css-tools/webpack/startup", "../node_modules/stylus/lib/convert/css.js", "../node_modules/stylus/lib/functions/resolver.js", "../node_modules/stylus/lib/stylus.js", "../node_modules/stylus/index.js", "../node_modules/parse-gitignore/index.js", "../node_modules/sass-formatter/dist/regex/regex.js", "../node_modules/s.color/lib/HandleGet.js", "../node_modules/s.color/lib/regex.js", "../node_modules/s.color/lib/validators.js", "../node_modules/s.color/lib/ColorTypes.js", "../node_modules/s.color/lib/HandleSet.js", "../node_modules/s.color/lib/utils.js", "../node_modules/s.color/lib/ColorConverters.js", "../node_modules/s.color/lib/index.js", "../node_modules/suf-log/dist/utils.js", "../node_modules/suf-log/dist/transformStyles.js", "../node_modules/suf-log/dist/styler.js", "../node_modules/suf-log/dist/loggers.js", "../node_modules/suf-log/dist/interfaces.js", "../node_modules/suf-log/dist/index.js", "../node_modules/sass-formatter/dist/logger.js", "../node_modules/sass-formatter/dist/utility.js", "../node_modules/sass-formatter/dist/formatters/format.property.js", "../node_modules/sass-formatter/dist/formatters/format.convert.js", "../node_modules/sass-formatter/dist/formatters/format.atForwardOrAtUse.js", "../node_modules/sass-formatter/dist/formatters/format.blockComment.js", "../node_modules/sass-formatter/dist/formatters/format.header.js", "../node_modules/sass-formatter/dist/sassTextLine.js", "../node_modules/sass-formatter/dist/config.js", "../node_modules/sass-formatter/dist/state.js", "../node_modules/sass-formatter/dist/index.js", "../node_modules/is-expression/node_modules/acorn/dist/acorn.mjs", "../node_modules/object-assign/index.js", "../node_modules/is-expression/index.js", "../node_modules/has-symbols/shams.js", "../node_modules/has-symbols/index.js", "../node_modules/function-bind/implementation.js", "../node_modules/function-bind/index.js", "../node_modules/has/src/index.js", "../node_modules/get-intrinsic/index.js", "../node_modules/call-bind/index.js", "../node_modules/call-bind/callBound.js", "../node_modules/has-tostringtag/shams.js", "../node_modules/is-regex/index.js", "../node_modules/character-parser/index.js", "../node_modules/pug-error/index.js", "../node_modules/pug-lexer/index.js", "../node_modules/@starptech/prettyhtml/node_modules/unist-util-stringify-position/index.js", "../node_modules/@starptech/prettyhtml/node_modules/vfile-message/index.js", "../node_modules/replace-ext/index.js", "../node_modules/is-buffer/index.js", "../node_modules/@starptech/prettyhtml/node_modules/vfile/core.js", "../node_modules/@starptech/prettyhtml/node_modules/vfile/index.js", "../node_modules/extend/index.js", "../node_modules/bail/index.js", "../node_modules/unist-util-stringify-position/index.js", "../node_modules/vfile-message/index.js", "../node_modules/vfile/core.js", "../node_modules/vfile/index.js", "../node_modules/trough/wrap.js", "../node_modules/trough/index.js", "../node_modules/x-is-string/index.js", "../node_modules/is-plain-obj/index.js", "../node_modules/unified/index.js", "../node_modules/@starptech/webparser/src/tags.ts", "../node_modules/@starptech/webparser/src/html_tags.ts", "../node_modules/@starptech/webparser/src/assertions.ts", "../node_modules/@starptech/webparser/src/interpolation_config.ts", "../node_modules/@starptech/webparser/src/chars.ts", "../node_modules/@starptech/webparser/src/parse_util.ts", "../node_modules/@starptech/webparser/src/ast_path.ts", "../node_modules/@starptech/webparser/src/ast.ts", "../node_modules/@starptech/webparser/src/lexer.ts", "../node_modules/@starptech/webparser/src/parser.ts", "../node_modules/@starptech/webparser/src/html_parser.ts", "../node_modules/@starptech/webparser/src/public_api.ts", "../node_modules/xtend/immutable.js", "../node_modules/property-information/lib/util/schema.js", "../node_modules/property-information/lib/util/merge.js", "../node_modules/property-information/normalize.js", "../node_modules/property-information/lib/util/info.js", "../node_modules/property-information/lib/util/types.js", "../node_modules/property-information/lib/util/defined-info.js", "../node_modules/property-information/lib/util/create.js", "../node_modules/property-information/lib/xlink.js", "../node_modules/property-information/lib/xml.js", "../node_modules/property-information/lib/util/case-sensitive-transform.js", "../node_modules/property-information/lib/util/case-insensitive-transform.js", "../node_modules/property-information/lib/xmlns.js", "../node_modules/property-information/lib/aria.js", "../node_modules/property-information/lib/html.js", "../node_modules/property-information/html.js", "../node_modules/property-information/lib/svg.js", "../node_modules/property-information/svg.js", "../node_modules/property-information/find.js", "../node_modules/hast-util-parse-selector/index.js", "../node_modules/space-separated-tokens/index.js", "../node_modules/comma-separated-tokens/index.js", "../node_modules/@starptech/prettyhtml-hastscript/factory.js", "../node_modules/@starptech/prettyhtml-hastscript/svg.js", "../node_modules/@starptech/prettyhtml-hastscript/html.js", "../node_modules/@starptech/prettyhtml-hastscript/index.js", "../node_modules/@starptech/hast-util-from-webparser/index.ts", "../node_modules/@starptech/rehype-webparser/index.ts", "../node_modules/html-void-elements/index.json", "../node_modules/unist-util-is/index.js", "../node_modules/hast-util-is-element/index.js", "../node_modules/hast-util-whitespace/index.js", "../node_modules/@starptech/prettyhtml-hast-to-html/lib/omission/util/siblings.js", "../node_modules/@starptech/prettyhtml-hast-to-html/lib/omission/util/first.js", "../node_modules/@starptech/prettyhtml-hast-to-html/lib/omission/util/place.js", "../node_modules/@starptech/prettyhtml-hast-to-html/lib/omission/util/white-space-left.js", "../node_modules/@starptech/prettyhtml-hast-to-html/lib/omission/omission.js", "../node_modules/@starptech/prettyhtml-hast-to-html/lib/omission/closing.js", "../node_modules/@starptech/prettyhtml-hast-to-html/lib/omission/opening.js", "../node_modules/@starptech/prettyhtml-hast-to-html/lib/omission/index.js", "../node_modules/html-whitespace-sensitive-tag-names/index.json", "../node_modules/@starptech/prettyhtml-hast-to-html/lib/all.js", "../node_modules/@starptech/prettyhtml-hast-to-html/lib/text.js", "../node_modules/character-entities-html4/index.json", "../node_modules/character-entities-legacy/index.json", "../node_modules/is-hexadecimal/index.js", "../node_modules/is-decimal/index.js", "../node_modules/is-alphabetical/index.js", "../node_modules/is-alphanumerical/index.js", "../node_modules/stringify-entities/dangerous.json", "../node_modules/stringify-entities/index.js", "../node_modules/@starptech/prettyhtml-hast-to-html/lib/constants.js", "../node_modules/repeat-string/index.js", "../node_modules/@starptech/prettyhtml-hast-to-html/lib/element.js", "../node_modules/@starptech/prettyhtml-hast-to-html/lib/doctype.js", "../node_modules/@starptech/prettyhtml-hast-to-html/lib/comment.js", "../node_modules/@starptech/prettyhtml-hast-to-html/lib/raw.js", "../node_modules/@starptech/prettyhtml-hast-to-html/lib/one.js", "../node_modules/@starptech/prettyhtml-hast-to-html/lib/index.js", "../node_modules/@starptech/prettyhtml-hast-to-html/index.js", "../node_modules/@starptech/prettyhtml-formatter/stringify.js", "../node_modules/collapse-white-space/index.js", "../node_modules/array-iterate/index.js", "../node_modules/unist-util-modify-children/index.js", "../node_modules/hast-util-has-property/index.js", "../node_modules/hast-util-embedded/index.js", "../node_modules/hast-util-is-body-ok-link/index.js", "../node_modules/@starptech/rehype-minify-whitespace/list.js", "../node_modules/@starptech/rehype-minify-whitespace/index.js", "../node_modules/unist-util-visit-parents/node_modules/unist-util-is/convert.js", "../node_modules/unist-util-visit-parents/index.js", "../node_modules/unist-util-visit/index.js", "../node_modules/lodash.iteratee/index.js", "../node_modules/unist-util-find/index.js", "../node_modules/hast-util-to-string/index.js", "../node_modules/@starptech/expression-parser/index.js", "../node_modules/@starptech/prettyhtml-formatter/index.js", "../node_modules/@starptech/prettyhtml-sort-attributes/index.js", "../node_modules/@starptech/prettyhtml/index.js", "../node_modules/require-relative/index.js", "../node_modules/pretty-format/node_modules/color-name/index.js", "../node_modules/pretty-format/node_modules/color-convert/conversions.js", "../node_modules/pretty-format/node_modules/color-convert/route.js", "../node_modules/pretty-format/node_modules/color-convert/index.js", "../node_modules/pretty-format/node_modules/ansi-styles/index.js", "../node_modules/pretty-format/build/collections.js", "../node_modules/pretty-format/build/plugins/asymmetric_matcher.js", "../node_modules/pretty-format/node_modules/ansi-regex/index.js", "../node_modules/pretty-format/build/plugins/convert_ansi.js", "../node_modules/pretty-format/build/plugins/dom_collection.js", "../node_modules/pretty-format/build/plugins/lib/escape_html.js", "../node_modules/pretty-format/build/plugins/lib/markup.js", "../node_modules/pretty-format/build/plugins/dom_element.js", "../node_modules/pretty-format/build/plugins/immutable.js", "../node_modules/pretty-format/build/plugins/react_element.js", "../node_modules/pretty-format/build/plugins/react_test_component.js", "../node_modules/pretty-format/build/index.js", "../node_modules/common-tags/src/TemplateTag/TemplateTag.js", "../node_modules/common-tags/src/trimResultTransformer/trimResultTransformer.js", "../node_modules/common-tags/src/stripIndentTransformer/stripIndentTransformer.js", "../node_modules/common-tags/src/replaceResultTransformer/replaceResultTransformer.js", "../node_modules/common-tags/src/replaceSubstitutionTransformer/replaceSubstitutionTransformer.js", "../node_modules/common-tags/src/replaceStringTransformer/replaceStringTransformer.js", "../node_modules/common-tags/src/inlineArrayTransformer/inlineArrayTransformer.js", "../node_modules/common-tags/src/splitStringTransformer/splitStringTransformer.js", "../node_modules/common-tags/src/removeNonPrintingValuesTransformer/removeNonPrintingValuesTransformer.js", "../node_modules/common-tags/src/commaLists/commaLists.js", "../node_modules/common-tags/src/commaListsAnd/commaListsAnd.js", "../node_modules/common-tags/src/commaListsOr/commaListsOr.js", "../node_modules/common-tags/src/html/html.js", "../node_modules/common-tags/src/safeHtml/safeHtml.js", "../node_modules/common-tags/src/oneLine/oneLine.js", "../node_modules/common-tags/src/oneLineTrim/oneLineTrim.js", "../node_modules/common-tags/src/oneLineCommaLists/oneLineCommaLists.js", "../node_modules/common-tags/src/oneLineCommaListsOr/oneLineCommaListsOr.js", "../node_modules/common-tags/src/oneLineCommaListsAnd/oneLineCommaListsAnd.js", "../node_modules/common-tags/src/inlineLists/inlineLists.js", "../node_modules/common-tags/src/oneLineInlineLists/oneLineInlineLists.js", "../node_modules/common-tags/src/stripIndent/stripIndent.js", "../node_modules/common-tags/src/stripIndents/stripIndents.js", "../node_modules/common-tags/src/index.js", "../node_modules/indent-string/index.js", "../node_modules/loglevel/lib/loglevel.js", "../node_modules/escape-string-regexp/index.js", "../node_modules/loglevel-colored-level-prefix/node_modules/ansi-styles/index.js", "../node_modules/ansi-regex/index.js", "../node_modules/strip-ansi/index.js", "../node_modules/has-ansi/index.js", "../node_modules/loglevel-colored-level-prefix/node_modules/supports-color/index.js", "../node_modules/loglevel-colored-level-prefix/node_modules/chalk/index.js", "../node_modules/loglevel-colored-level-prefix/dist/index.js", "../node_modules/lodash.merge/index.js", "../node_modules/dlv/index.js", "../node_modules/prettier-eslint/dist/utils.js", "../node_modules/prettier-eslint/dist/index.js", "../node_modules/chalk/node_modules/color-name/index.js", "../node_modules/chalk/node_modules/color-convert/conversions.js", "../node_modules/chalk/node_modules/color-convert/route.js", "../node_modules/chalk/node_modules/color-convert/index.js", "../node_modules/chalk/node_modules/ansi-styles/index.js", "../node_modules/has-flag/index.js", "../node_modules/chalk/node_modules/supports-color/index.js", "../node_modules/chalk/templates.js", "../node_modules/chalk/index.js", "../node_modules/camelcase/index.js", "../node_modules/prettier-tslint/node_modules/yargs-parser/lib/tokenize-arg-string.js", "../node_modules/prettier-tslint/node_modules/yargs-parser/index.js", "../node_modules/require-directory/index.js", "../node_modules/which-module/index.js", "../node_modules/prettier-tslint/node_modules/yargs/lib/command.js", "../node_modules/prettier-tslint/node_modules/yargs/lib/yerror.js", "../node_modules/prettier-tslint/node_modules/yargs/lib/argsert.js", "../node_modules/prettier-tslint/node_modules/yargs/lib/completion.js", "../node_modules/prettier-tslint/node_modules/ansi-regex/index.js", "../node_modules/prettier-tslint/node_modules/strip-ansi/index.js", "../node_modules/is-fullwidth-code-point/index.js", "../node_modules/prettier-tslint/node_modules/string-width/index.js", "../node_modules/prettier-tslint/node_modules/yargs/lib/obj-filter.js", "../node_modules/set-blocking/index.js", "../node_modules/cliui/node_modules/ansi-regex/index.js", "../node_modules/cliui/node_modules/strip-ansi/index.js", "../node_modules/cliui/node_modules/string-width/index.js", "../node_modules/code-point-at/index.js", "../node_modules/number-is-nan/index.js", "../node_modules/wrap-ansi/node_modules/is-fullwidth-code-point/index.js", "../node_modules/wrap-ansi/node_modules/string-width/index.js", "../node_modules/wrap-ansi/index.js", "../node_modules/cliui/index.js", "../node_modules/decamelize/index.js", "../node_modules/prettier-tslint/node_modules/yargs/lib/usage.js", "../node_modules/prettier-tslint/node_modules/yargs/lib/levenshtein.js", "../node_modules/prettier-tslint/node_modules/yargs/lib/validation.js", "../node_modules/y18n/index.js", "../node_modules/prettier-tslint/node_modules/yargs/lib/apply-extends.js", "../node_modules/prettier-tslint/node_modules/get-caller-file/index.js", "../node_modules/prettier-tslint/node_modules/path-exists/index.js", "../node_modules/prettier-tslint/node_modules/p-try/index.js", "../node_modules/prettier-tslint/node_modules/p-limit/index.js", "../node_modules/prettier-tslint/node_modules/p-locate/index.js", "../node_modules/prettier-tslint/node_modules/locate-path/index.js", "../node_modules/prettier-tslint/node_modules/find-up/index.js", "../node_modules/require-main-filename/index.js", "../node_modules/isexe/windows.js", "../node_modules/isexe/mode.js", "../node_modules/isexe/index.js", "../node_modules/execa/node_modules/which/which.js", "../node_modules/pseudomap/pseudomap.js", "../node_modules/pseudomap/map.js", "../node_modules/yallist/yallist.js", "../node_modules/lru-cache/index.js", "../node_modules/execa/node_modules/cross-spawn/lib/util/resolveCommand.js", "../node_modules/execa/node_modules/cross-spawn/lib/util/hasEmptyArgumentBug.js", "../node_modules/execa/node_modules/cross-spawn/lib/util/escapeArgument.js", "../node_modules/execa/node_modules/cross-spawn/lib/util/escapeCommand.js", "../node_modules/execa/node_modules/shebang-regex/index.js", "../node_modules/execa/node_modules/shebang-command/index.js", "../node_modules/execa/node_modules/cross-spawn/lib/util/readShebang.js", "../node_modules/execa/node_modules/cross-spawn/lib/parse.js", "../node_modules/execa/node_modules/cross-spawn/lib/enoent.js", "../node_modules/execa/node_modules/cross-spawn/index.js", "../node_modules/strip-eof/index.js", "../node_modules/npm-run-path/node_modules/path-key/index.js", "../node_modules/npm-run-path/index.js", "../node_modules/execa/node_modules/is-stream/index.js", "../node_modules/get-stream/buffer-stream.js", "../node_modules/get-stream/index.js", "../node_modules/p-finally/index.js", "../node_modules/signal-exit/signals.js", "../node_modules/signal-exit/index.js", "../node_modules/execa/lib/errname.js", "../node_modules/execa/lib/stdio.js", "../node_modules/execa/index.js", "../node_modules/invert-kv/index.js", "../node_modules/lcid/lcid.json", "../node_modules/lcid/index.js", "../node_modules/mimic-fn/index.js", "../node_modules/mem/index.js", "../node_modules/os-locale/index.js", "../node_modules/prettier-tslint/node_modules/yargs/yargs.js", "../node_modules/prettier-tslint/node_modules/yargs/index.js", "../node_modules/prettier-tslint/dist/utils.js", "../node_modules/prettier-tslint/dist/create-program.js", "../node_modules/prettier-tslint/dist/run-tslint.js", "../node_modules/prettier-tslint/dist/run-prettier.js", "../node_modules/ignore/ignore.js", "../node_modules/prettier-tslint/dist/create-ignorer.js", "../node_modules/prettier-tslint/dist/fix.js", "../node_modules/prettier-tslint/dist/check.js", "../node_modules/array-uniq/index.js", "../node_modules/array-union/index.js", "../node_modules/globby/node_modules/glob/common.js", "../node_modules/globby/node_modules/glob/sync.js", "../node_modules/globby/node_modules/glob/glob.js", "../node_modules/globby/node_modules/fast-glob/out/managers/options.js", "../node_modules/globby/node_modules/glob-parent/node_modules/is-glob/index.js", "../node_modules/path-dirname/index.js", "../node_modules/globby/node_modules/glob-parent/index.js", "../node_modules/globby/node_modules/is-glob/index.js", "../node_modules/ret/lib/types.js", "../node_modules/ret/lib/sets.js", "../node_modules/ret/lib/util.js", "../node_modules/ret/lib/positions.js", "../node_modules/ret/lib/index.js", "../node_modules/safe-regex/index.js", "../node_modules/isobject/index.js", "../node_modules/is-descriptor/node_modules/kind-of/index.js", "../node_modules/is-accessor-descriptor/node_modules/kind-of/index.js", "../node_modules/is-accessor-descriptor/index.js", "../node_modules/is-data-descriptor/node_modules/kind-of/index.js", "../node_modules/is-data-descriptor/index.js", "../node_modules/is-descriptor/index.js", "../node_modules/to-regex/node_modules/define-property/index.js", "../node_modules/is-plain-object/index.js", "../node_modules/to-regex/node_modules/is-extendable/index.js", "../node_modules/assign-symbols/index.js", "../node_modules/to-regex/node_modules/extend-shallow/index.js", "../node_modules/regex-not/node_modules/is-extendable/index.js", "../node_modules/regex-not/node_modules/extend-shallow/index.js", "../node_modules/regex-not/index.js", "../node_modules/to-regex/index.js", "../node_modules/array-unique/index.js", "../node_modules/globby/node_modules/braces/node_modules/is-extendable/index.js", "../node_modules/globby/node_modules/braces/node_modules/extend-shallow/index.js", "../node_modules/split-string/node_modules/is-extendable/index.js", "../node_modules/split-string/node_modules/extend-shallow/index.js", "../node_modules/split-string/index.js", "../node_modules/arr-flatten/index.js", "../node_modules/kind-of/node_modules/is-buffer/index.js", "../node_modules/kind-of/index.js", "../node_modules/is-number/index.js", "../node_modules/globby/node_modules/fill-range/node_modules/is-extendable/index.js", "../node_modules/globby/node_modules/fill-range/node_modules/extend-shallow/index.js", "../node_modules/globby/node_modules/to-regex-range/index.js", "../node_modules/globby/node_modules/fill-range/index.js", "../node_modules/repeat-element/index.js", "../node_modules/globby/node_modules/braces/lib/utils.js", "../node_modules/globby/node_modules/braces/lib/compilers.js", "../node_modules/snapdragon-node/node_modules/define-property/index.js", "../node_modules/snapdragon-util/index.js", "../node_modules/snapdragon-node/index.js", "../node_modules/globby/node_modules/braces/lib/parsers.js", "../node_modules/base/node_modules/define-property/index.js", "../node_modules/component-emitter/index.js", "../node_modules/object-visit/index.js", "../node_modules/map-visit/index.js", "../node_modules/collection-visit/index.js", "../node_modules/to-object-path/index.js", "../node_modules/is-extendable/index.js", "../node_modules/arr-union/index.js", "../node_modules/get-value/index.js", "../node_modules/extend-shallow/index.js", "../node_modules/union-value/node_modules/set-value/index.js", "../node_modules/union-value/index.js", "../node_modules/isarray/index.js", "../node_modules/unset-value/node_modules/has-value/node_modules/isobject/index.js", "../node_modules/unset-value/node_modules/has-values/index.js", "../node_modules/unset-value/node_modules/has-value/index.js", "../node_modules/unset-value/index.js", "../node_modules/has-values/node_modules/is-buffer/index.js", "../node_modules/has-values/node_modules/kind-of/index.js", "../node_modules/has-values/index.js", "../node_modules/has-value/index.js", "../node_modules/set-value/index.js", "../node_modules/cache-base/index.js", "../node_modules/mixin-deep/node_modules/is-extendable/index.js", "../node_modules/for-in/index.js", "../node_modules/mixin-deep/index.js", "../node_modules/pascalcase/index.js", "../node_modules/define-property/node_modules/kind-of/index.js", "../node_modules/define-property/node_modules/is-buffer/index.js", "../node_modules/define-property/node_modules/is-accessor-descriptor/node_modules/kind-of/index.js", "../node_modules/define-property/node_modules/is-accessor-descriptor/index.js", "../node_modules/define-property/node_modules/is-data-descriptor/node_modules/kind-of/index.js", "../node_modules/define-property/node_modules/is-data-descriptor/index.js", "../node_modules/define-property/node_modules/is-descriptor/index.js", "../node_modules/define-property/index.js", "../node_modules/copy-descriptor/index.js", "../node_modules/object-copy/index.js", "../node_modules/static-extend/index.js", "../node_modules/class-utils/index.js", "../node_modules/base/index.js", "../node_modules/use/index.js", "../node_modules/snapdragon/node_modules/ms/index.js", "../node_modules/snapdragon/node_modules/debug/src/debug.js", "../node_modules/snapdragon/node_modules/debug/src/browser.js", "../node_modules/snapdragon/node_modules/debug/src/node.js", "../node_modules/snapdragon/node_modules/debug/src/index.js", "../node_modules/source-map/lib/base64.js", "../node_modules/source-map/lib/base64-vlq.js", "../node_modules/source-map/lib/util.js", "../node_modules/source-map/lib/array-set.js", "../node_modules/source-map/lib/mapping-list.js", "../node_modules/source-map/lib/source-map-generator.js", "../node_modules/source-map/lib/binary-search.js", "../node_modules/source-map/lib/quick-sort.js", "../node_modules/source-map/lib/source-map-consumer.js", "../node_modules/source-map/lib/source-node.js", "../node_modules/source-map/source-map.js", "../node_modules/source-map-url/source-map-url.js", "../node_modules/source-map-resolve/lib/resolve-url.js", "../node_modules/decode-uri-component/index.js", "../node_modules/source-map-resolve/lib/decode-uri-component.js", "../node_modules/urix/index.js", "../node_modules/atob/node-atob.js", "../node_modules/source-map-resolve/lib/source-map-resolve-node.js", "../node_modules/snapdragon/lib/utils.js", "../node_modules/snapdragon/lib/source-maps.js", "../node_modules/snapdragon/lib/compiler.js", "../node_modules/map-cache/index.js", "../node_modules/snapdragon/lib/position.js", "../node_modules/snapdragon/lib/parser.js", "../node_modules/snapdragon/index.js", "../node_modules/globby/node_modules/braces/lib/braces.js", "../node_modules/globby/node_modules/braces/index.js", "../node_modules/globby/node_modules/is-extendable/index.js", "../node_modules/globby/node_modules/extend-shallow/index.js", "../node_modules/nanomatch/node_modules/is-extendable/index.js", "../node_modules/nanomatch/node_modules/extend-shallow/index.js", "../node_modules/nanomatch/lib/compilers.js", "../node_modules/nanomatch/lib/parsers.js", "../node_modules/fragment-cache/index.js", "../node_modules/nanomatch/lib/cache.js", "../node_modules/is-windows/index.js", "../node_modules/nanomatch/node_modules/define-property/index.js", "../node_modules/arr-diff/index.js", "../node_modules/object.pick/index.js", "../node_modules/nanomatch/node_modules/kind-of/index.js", "../node_modules/nanomatch/lib/utils.js", "../node_modules/nanomatch/index.js", "../node_modules/posix-character-classes/index.js", "../node_modules/expand-brackets/lib/compilers.js", "../node_modules/expand-brackets/lib/utils.js", "../node_modules/expand-brackets/lib/parsers.js", "../node_modules/expand-brackets/node_modules/ms/index.js", "../node_modules/expand-brackets/node_modules/debug/src/debug.js", "../node_modules/expand-brackets/node_modules/debug/src/browser.js", "../node_modules/expand-brackets/node_modules/debug/src/node.js", "../node_modules/expand-brackets/node_modules/debug/src/index.js", "../node_modules/expand-brackets/index.js", "../node_modules/extglob/lib/compilers.js", "../node_modules/extglob/node_modules/define-property/index.js", "../node_modules/extglob/lib/utils.js", "../node_modules/extglob/lib/parsers.js", "../node_modules/extglob/lib/extglob.js", "../node_modules/extglob/index.js", "../node_modules/globby/node_modules/micromatch/lib/compilers.js", "../node_modules/globby/node_modules/micromatch/lib/parsers.js", "../node_modules/globby/node_modules/micromatch/lib/cache.js", "../node_modules/globby/node_modules/define-property/index.js", "../node_modules/globby/node_modules/kind-of/index.js", "../node_modules/globby/node_modules/micromatch/lib/utils.js", "../node_modules/globby/node_modules/micromatch/index.js", "../node_modules/globby/node_modules/fast-glob/out/utils/pattern.js", "../node_modules/globby/node_modules/fast-glob/out/managers/tasks.js", "../node_modules/glob-to-regexp/index.js", "../node_modules/@mrmlnc/readdir-enhanced/lib/normalize-options.js", "../node_modules/@mrmlnc/readdir-enhanced/lib/call.js", "../node_modules/@mrmlnc/readdir-enhanced/lib/stat.js", "../node_modules/@mrmlnc/readdir-enhanced/lib/directory-reader.js", "../node_modules/@mrmlnc/readdir-enhanced/lib/sync/fs.js", "../node_modules/@mrmlnc/readdir-enhanced/lib/sync/for-each.js", "../node_modules/@mrmlnc/readdir-enhanced/lib/sync/index.js", "../node_modules/call-me-maybe/index.js", "../node_modules/@mrmlnc/readdir-enhanced/lib/async/for-each.js", "../node_modules/@mrmlnc/readdir-enhanced/lib/async/index.js", "../node_modules/@mrmlnc/readdir-enhanced/lib/stream/index.js", "../node_modules/@mrmlnc/readdir-enhanced/lib/index.js", "../node_modules/globby/node_modules/fast-glob/out/utils/path.js", "../node_modules/globby/node_modules/fast-glob/out/providers/filters/deep.js", "../node_modules/globby/node_modules/fast-glob/out/providers/filters/entry.js", "../node_modules/globby/node_modules/fast-glob/out/providers/reader.js", "../node_modules/globby/node_modules/@nodelib/fs.stat/out/adapters/fs.js", "../node_modules/globby/node_modules/@nodelib/fs.stat/out/managers/options.js", "../node_modules/globby/node_modules/@nodelib/fs.stat/out/providers/stat.js", "../node_modules/globby/node_modules/@nodelib/fs.stat/out/index.js", "../node_modules/globby/node_modules/fast-glob/out/adapters/fs.js", "../node_modules/globby/node_modules/fast-glob/out/adapters/fs-stream.js", "../node_modules/globby/node_modules/fast-glob/out/providers/reader-async.js", "../node_modules/globby/node_modules/fast-glob/out/providers/reader-stream.js", "../node_modules/globby/node_modules/fast-glob/out/adapters/fs-sync.js", "../node_modules/globby/node_modules/fast-glob/out/providers/reader-sync.js", "../node_modules/globby/node_modules/fast-glob/out/utils/array.js", "../node_modules/globby/node_modules/fast-glob/out/utils/stream.js", "../node_modules/globby/node_modules/fast-glob/out/index.js", "../node_modules/globby/node_modules/fast-glob/index.js", "../node_modules/arrify/index.js", "../node_modules/pify/index.js", "../node_modules/path-type/index.js", "../node_modules/dir-glob/index.js", "../node_modules/slash/index.js", "../node_modules/globby/gitignore.js", "../node_modules/globby/index.js", "../node_modules/prettier-tslint/dist/expand-globs.js", "../node_modules/prettier-tslint/dist/cli.js", "../node_modules/prettier-tslint/dist/format.js", "../node_modules/prettier-tslint/dist/index.js", "../node_modules/lodash/_createFind.js", "../node_modules/lodash/findLast.js", "../node_modules/lodash/compact.js", "../node_modules/lodash/_baseDifference.js", "../node_modules/lodash/difference.js", "../node_modules/lodash/_createBaseFor.js", "../node_modules/lodash/_baseFor.js", "../node_modules/lodash/_baseForOwn.js", "../node_modules/lodash/_createBaseEach.js", "../node_modules/lodash/_baseEach.js", "../node_modules/lodash/_baseMap.js", "../node_modules/lodash/_baseSortBy.js", "../node_modules/lodash/_compareAscending.js", "../node_modules/lodash/_compareMultiple.js", "../node_modules/lodash/_baseOrderBy.js", "../node_modules/lodash/_isIterateeCall.js", "../node_modules/lodash/sortBy.js", "../node_modules/lodash/uniq.js", "../node_modules/lodash/_arrayAggregator.js", "../node_modules/lodash/_baseAggregator.js", "../node_modules/lodash/_createAggregator.js", "../node_modules/lodash/partition.js", "../node_modules/lodash/_baseSlice.js", "../node_modules/lodash/_baseWhile.js", "../node_modules/lodash/takeRightWhile.js", "../node_modules/lodash/_baseExtremum.js", "../node_modules/lodash/_baseLt.js", "../node_modules/lodash/min.js", "../node_modules/lodash/_baseGt.js", "../node_modules/lodash/maxBy.js", "../node_modules/lodash/escapeRegExp.js", "../node_modules/lodash/_castSlice.js", "../node_modules/lodash/_charsStartIndex.js", "../node_modules/lodash/_asciiToArray.js", "../node_modules/lodash/_hasUnicode.js", "../node_modules/lodash/_unicodeToArray.js", "../node_modules/lodash/_stringToArray.js", "../node_modules/lodash/trimStart.js", "../node_modules/lodash/_charsEndIndex.js", "../node_modules/lodash/trimEnd.js", "../node_modules/lodash/_getPrototype.js", "../node_modules/lodash/isPlainObject.js", "../node_modules/lodash/isString.js", "../node_modules/lodash/isInteger.js", "../node_modules/lodash/isBoolean.js", "../node_modules/lodash/_arrayEach.js", "../node_modules/lodash/_baseAssignValue.js", "../node_modules/lodash/_assignValue.js", "../node_modules/lodash/_copyObject.js", "../node_modules/lodash/_baseAssign.js", "../node_modules/lodash/_nativeKeysIn.js", "../node_modules/lodash/_baseKeysIn.js", "../node_modules/lodash/keysIn.js", "../node_modules/lodash/_baseAssignIn.js", "../node_modules/lodash/_cloneBuffer.js", "../node_modules/lodash/_copyArray.js", "../node_modules/lodash/_copySymbols.js", "../node_modules/lodash/_getSymbolsIn.js", "../node_modules/lodash/_copySymbolsIn.js", "../node_modules/lodash/_getAllKeysIn.js", "../node_modules/lodash/_initCloneArray.js", "../node_modules/lodash/_cloneArrayBuffer.js", "../node_modules/lodash/_cloneDataView.js", "../node_modules/lodash/_cloneRegExp.js", "../node_modules/lodash/_cloneSymbol.js", "../node_modules/lodash/_cloneTypedArray.js", "../node_modules/lodash/_initCloneByTag.js", "../node_modules/lodash/_baseCreate.js", "../node_modules/lodash/_initCloneObject.js", "../node_modules/lodash/_baseIsMap.js", "../node_modules/lodash/isMap.js", "../node_modules/lodash/_baseIsSet.js", "../node_modules/lodash/isSet.js", "../node_modules/lodash/_baseClone.js", "../node_modules/lodash/clone.js", "../node_modules/stylint/src/data/ordering.json", "../node_modules/stylus-supremacy/edge/createSortedProperties.js", "../node_modules/stylus-supremacy/edge/schema.js", "../node_modules/stylus-supremacy/edge/createFormattingOptions.js", "../node_modules/stylus-supremacy/edge/createStringBuffer.js", "../node_modules/stylus-supremacy/edge/findChildNodes.js", "../node_modules/stylus-supremacy/edge/format.js", "../node_modules/lodash/chunk.js", "../node_modules/stylus-supremacy/edge/createFormattingOptionsFromStylint.js", "../node_modules/stylus-supremacy/node_modules/minimatch/lib/path.js", "../node_modules/brace-expansion/index.js", "../node_modules/stylus-supremacy/node_modules/minimatch/minimatch.js", "../node_modules/stylus-supremacy/edge/checkIfFilePathIsIgnored.js", "../node_modules/stylus-supremacy/edge/findParentNode.js", "../node_modules/stylus-supremacy/edge/index.js", "../node_modules/@prettier/plugin-pug/src/logger.ts", "../node_modules/@prettier/plugin-pug/src/options/constants.ts", "../node_modules/@prettier/plugin-pug/src/options/attribute-sorting/index.ts", "../node_modules/@prettier/plugin-pug/src/options/common.ts", "../node_modules/@prettier/plugin-pug/src/options/empty-attributes/index.ts", "../node_modules/@prettier/plugin-pug/src/options/pug-attribute-separator.ts", "../node_modules/@prettier/plugin-pug/src/options/pug-class-location.ts", "../node_modules/@prettier/plugin-pug/src/options/pug-class-notation.ts", "../node_modules/@prettier/plugin-pug/src/options/pug-comment-preserve-spaces.ts", "../node_modules/@prettier/plugin-pug/src/options/pug-explicit-div.ts", "../node_modules/@prettier/plugin-pug/src/options/pug-framework.ts", "../node_modules/@prettier/plugin-pug/src/options/pug-id-notation.ts", "../node_modules/@prettier/plugin-pug/src/options/pug-preserve-attribute-brackets.ts", "../node_modules/@prettier/plugin-pug/src/options/pug-single-file-component-indentation.ts", "../node_modules/@prettier/plugin-pug/src/options/pug-wrap-attributes.ts", "../node_modules/@prettier/plugin-pug/src/options/index.ts", "../node_modules/@prettier/plugin-pug/src/options/converge.ts", "../node_modules/@prettier/plugin-pug/src/doctype-shortcut-registry.ts", "../node_modules/@prettier/plugin-pug/src/options/attribute-sorting/utils.ts", "../node_modules/@prettier/plugin-pug/src/options/empty-attributes/utils.ts", "../node_modules/@prettier/plugin-pug/src/utils/common.ts", "../node_modules/@prettier/plugin-pug/src/utils/angular.ts", "../node_modules/@prettier/plugin-pug/src/utils/script-mime-types.ts", "../node_modules/@prettier/plugin-pug/src/utils/svelte.ts", "../node_modules/@prettier/plugin-pug/src/utils/vue.ts", "../node_modules/@prettier/plugin-pug/src/printer.ts", "../node_modules/@prettier/plugin-pug/src/index.ts", "../src/index.ts", "../src/config.ts", "../src/utils/paths.ts", "../node_modules/vscode-uri/lib/esm/webpack:/LIB/node_modules/path-browserify/index.js", "../node_modules/vscode-uri/lib/esm/webpack:/LIB/webpack/bootstrap", "../node_modules/vscode-uri/lib/esm/webpack:/LIB/webpack/runtime/define property getters", "../node_modules/vscode-uri/lib/esm/webpack:/LIB/webpack/runtime/hasOwnProperty shorthand", "../node_modules/vscode-uri/lib/esm/webpack:/LIB/webpack/runtime/make namespace object", "../node_modules/vscode-uri/lib/esm/webpack:/LIB/src/platform.ts", "../node_modules/vscode-uri/lib/esm/webpack:/LIB/src/uri.ts", "../node_modules/vscode-uri/lib/esm/webpack:/LIB/src/utils.ts", "../src/utils/workspace.ts", "../src/log.ts", "../src/types.ts", "../node_modules/vscode-languageserver-textdocument/lib/esm/main.js", "../src/modes/template/parser/htmlScanner.ts", "../src/utils/strings.ts", "../src/embeddedSupport/vueDocumentRegionParser.ts", "../src/embeddedSupport/embeddedSupport.ts", "../src/embeddedSupport/languageModelCache.ts", "../src/modes/vue/snippets.ts", "../node_modules/vscode-css-languageservice/lib/esm/parser/cssScanner.js", "../node_modules/vscode-css-languageservice/lib/esm/utils/strings.js", "../node_modules/vscode-css-languageservice/lib/esm/parser/cssNodes.js", "../node_modules/@vscode/l10n/dist/browser.esm.js", "../node_modules/vscode-css-languageservice/lib/esm/parser/cssErrors.js", "../node_modules/vscode-css-languageservice/node_modules/vscode-languageserver-types/lib/esm/main.js", "../node_modules/vscode-css-languageservice/lib/esm/cssLanguageTypes.js", "../node_modules/vscode-css-languageservice/lib/esm/languageFacts/entry.js", "../node_modules/vscode-css-languageservice/lib/esm/languageFacts/colors.js", "../node_modules/vscode-css-languageservice/lib/esm/languageFacts/builtinData.js", "../node_modules/vscode-css-languageservice/lib/esm/utils/objects.js", "../node_modules/vscode-css-languageservice/lib/esm/parser/cssParser.js", "../node_modules/vscode-css-languageservice/lib/esm/utils/arrays.js", "../node_modules/vscode-css-languageservice/lib/esm/parser/cssSymbolScope.js", "../node_modules/vscode-css-languageservice/node_modules/vscode-uri/lib/esm/webpack:/LIB/node_modules/path-browserify/index.js", "../node_modules/vscode-css-languageservice/node_modules/vscode-uri/lib/esm/webpack:/LIB/webpack/bootstrap", "../node_modules/vscode-css-languageservice/node_modules/vscode-uri/lib/esm/webpack:/LIB/webpack/runtime/define property getters", "../node_modules/vscode-css-languageservice/node_modules/vscode-uri/lib/esm/webpack:/LIB/webpack/runtime/hasOwnProperty shorthand", "../node_modules/vscode-css-languageservice/node_modules/vscode-uri/lib/esm/webpack:/LIB/webpack/runtime/make namespace object", "../node_modules/vscode-css-languageservice/node_modules/vscode-uri/lib/esm/webpack:/LIB/src/platform.ts", "../node_modules/vscode-css-languageservice/node_modules/vscode-uri/lib/esm/webpack:/LIB/src/uri.ts", "../node_modules/vscode-css-languageservice/node_modules/vscode-uri/lib/esm/webpack:/LIB/src/utils.ts", "../node_modules/vscode-css-languageservice/lib/esm/utils/resources.js", "../node_modules/vscode-css-languageservice/lib/esm/services/pathCompletion.js", "../node_modules/vscode-css-languageservice/lib/esm/services/cssCompletion.js", "../node_modules/vscode-css-languageservice/lib/esm/services/selectorPrinting.js", "../node_modules/vscode-css-languageservice/lib/esm/services/cssHover.js", "../node_modules/vscode-css-languageservice/lib/esm/services/cssNavigation.js", "../node_modules/vscode-css-languageservice/lib/esm/services/lintRules.js", "../node_modules/vscode-css-languageservice/lib/esm/services/cssCodeActions.js", "../node_modules/vscode-css-languageservice/lib/esm/services/lintUtil.js", "../node_modules/vscode-css-languageservice/lib/esm/services/lint.js", "../node_modules/vscode-css-languageservice/lib/esm/services/cssValidation.js", "../node_modules/vscode-css-languageservice/lib/esm/parser/scssScanner.js", "../node_modules/vscode-css-languageservice/lib/esm/parser/scssErrors.js", "../node_modules/vscode-css-languageservice/lib/esm/parser/scssParser.js", "../node_modules/vscode-css-languageservice/lib/esm/services/scssCompletion.js", "../node_modules/vscode-css-languageservice/lib/esm/parser/lessScanner.js", "../node_modules/vscode-css-languageservice/lib/esm/parser/lessParser.js", "../node_modules/vscode-css-languageservice/lib/esm/services/lessCompletion.js", "../node_modules/vscode-css-languageservice/lib/esm/services/cssFolding.js", "../node_modules/vscode-css-languageservice/lib/esm/beautify/beautify-css.js", "../node_modules/vscode-css-languageservice/lib/esm/services/cssFormatter.js", "../node_modules/vscode-css-languageservice/lib/esm/data/webCustomData.js", "../node_modules/vscode-css-languageservice/lib/esm/languageFacts/dataProvider.js", "../node_modules/vscode-css-languageservice/lib/esm/languageFacts/dataManager.js", "../node_modules/vscode-css-languageservice/lib/esm/services/cssSelectionRange.js", "../node_modules/vscode-css-languageservice/lib/esm/services/scssNavigation.js", "../node_modules/vscode-css-languageservice/lib/esm/cssLanguageService.js", "../src/modes/vue/index.ts", "../src/modes/style/index.ts", "../node_modules/vscode-emmet-helper/node_modules/vscode-languageserver-types/lib/esm/main.js", "../node_modules/jsonc-parser/lib/esm/impl/parser.js", "../node_modules/vscode-emmet-helper/src/data.ts", "../node_modules/vscode-emmet-helper/node_modules/vscode-uri/lib/esm/index.js", "../node_modules/vscode-emmet-helper/src/fileService.ts", "../node_modules/@emmetio/scanner/src/utils.ts", "../node_modules/@emmetio/scanner/src/index.ts", "../node_modules/@emmetio/abbreviation/src/parser/TokenScanner.ts", "../node_modules/@emmetio/abbreviation/src/parser/index.ts", "../node_modules/@emmetio/abbreviation/src/tokenizer/utils.ts", "../node_modules/@emmetio/abbreviation/src/tokenizer/index.ts", "../node_modules/@emmetio/abbreviation/src/stringify.ts", "../node_modules/@emmetio/abbreviation/src/convert.ts", "../node_modules/@emmetio/abbreviation/src/index.ts", "../node_modules/@emmetio/css-abbreviation/dist/css-abbreviation.es.js", "../node_modules/emmet/src/markup/attributes.ts", "../node_modules/emmet/src/markup/utils.ts", "../node_modules/emmet/src/markup/snippets.ts", "../node_modules/emmet/src/output-stream.ts", "../node_modules/emmet/src/markup/implicit-tag.ts", "../node_modules/emmet/src/markup/lorem/latin.json", "../node_modules/emmet/src/markup/lorem/russian.json", "../node_modules/emmet/src/markup/lorem/spanish.json", "../node_modules/emmet/src/markup/lorem/index.ts", "../node_modules/emmet/src/markup/addon/jsx.ts", "../node_modules/emmet/src/markup/addon/xsl.ts", "../node_modules/emmet/src/markup/addon/bem.ts", "../node_modules/emmet/src/markup/format/walk.ts", "../node_modules/emmet/src/markup/format/utils.ts", "../node_modules/emmet/src/markup/format/template.ts", "../node_modules/emmet/src/markup/format/comment.ts", "../node_modules/emmet/src/markup/format/html.ts", "../node_modules/emmet/src/markup/format/indent-format.ts", "../node_modules/emmet/src/markup/format/haml.ts", "../node_modules/emmet/src/markup/format/slim.ts", "../node_modules/emmet/src/markup/format/pug.ts", "../node_modules/emmet/src/markup/index.ts", "../node_modules/emmet/src/stylesheet/snippets.ts", "../node_modules/emmet/src/stylesheet/score.ts", "../node_modules/emmet/src/stylesheet/color.ts", "../node_modules/emmet/src/stylesheet/format.ts", "../node_modules/emmet/src/stylesheet/index.ts", "../node_modules/emmet/snippets/html.json", "../node_modules/emmet/snippets/css.json", "../node_modules/emmet/snippets/xsl.json", "../node_modules/emmet/snippets/pug.json", "../node_modules/emmet/snippets/variables.json", "../node_modules/emmet/src/config.ts", "../node_modules/emmet/src/extract-abbreviation/reader.ts", "../node_modules/emmet/src/extract-abbreviation/quotes.ts", "../node_modules/emmet/src/extract-abbreviation/brackets.ts", "../node_modules/emmet/src/extract-abbreviation/is-html.ts", "../node_modules/emmet/src/extract-abbreviation/index.ts", "../node_modules/emmet/src/index.ts", "../node_modules/vscode-emmet-helper/src/configCompat.ts", "../node_modules/vscode-emmet-helper/src/emmetHelper.ts", "../src/modes/style/emmet.ts", "../src/utils/prettier/index.ts", "../src/modes/nullMode.ts", "../src/modes/script/javascript.ts", "../src/modes/script/componentInfo.ts", "../src/utils/vueVersion.ts", "../src/modes/script/childComponents.ts", "../src/modes/script/globalComponents.ts", "../src/services/typescriptService/util.ts", "../src/modes/script/previewer.ts", "../src/utils/cancellationToken.ts", "../src/modes/script/CodeActionKindConverter.ts", "../src/modes/script/semanticToken.ts", "../src/services/typescriptService/diagnosticFilter.ts", "../src/modes/template/services/htmlCompletion.ts", "../src/modes/template/modifierProvider.ts", "../src/modes/template/tagProviders/common.ts", "../src/modes/template/services/htmlHover.ts", "../src/modes/template/services/htmlHighlighting.ts", "../src/modes/template/services/htmlLinks.ts", "../src/modes/template/services/htmlSymbolsProvider.ts", "../src/modes/template/services/htmlFormat.ts", "../src/modes/template/services/htmlEslintValidation.ts", "../src/modes/template-common/tagDefinition.ts", "../src/modes/template/services/htmlDefinition.ts", "../src/modes/template/tagProviders/htmlTags.ts", "../src/modes/template/tagProviders/vueTags.ts", "../src/modes/template/tagProviders/routerTags.ts", "../src/modes/template/tagProviders/externalTagProviders.ts", "../node_modules/element-helper-json/element-tags.json", "../node_modules/element-helper-json/element-attributes.json", "../node_modules/vue-onsenui-helper-json/vue-onsenui-tags.json", "../node_modules/vue-onsenui-helper-json/vue-onsenui-attributes.json", "../node_modules/bootstrap-vue-helper-json/tags.json", "../node_modules/bootstrap-vue-helper-json/attributes.json", "../node_modules/gridsome-helper-json/gridsome-tags.json", "../node_modules/gridsome-helper-json/gridsome-attributes.json", "../src/modes/template/tagProviders/index.ts", "../src/modes/template/tagProviders/nuxtTags.ts", "../src/modes/template/tagProviders/componentInfoTagProvider.ts", "../src/modes/template/services/vuePropValidation.ts", "../src/modes/template/services/htmlFolding.ts", "../src/modes/template/htmlMode.ts", "../src/modes/template/interpolationMode.ts", "../src/services/typescriptService/sourceMap.ts", "../src/modes/template/services/isInsideInterpolation.ts", "../src/modes/template/parser/htmlParser.ts", "../src/modes/template/index.ts", "../src/modes/style/stylus/index.ts", "../src/modes/style/stylus/completion-item.ts", "../src/modes/style/stylus/css-colors-list.ts", "../src/modes/style/stylus/parser.ts", "../node_modules/vscode-web-custom-data/data/browsers.css-data.json", "../src/modes/style/stylus/css-browser-data.ts", "../src/modes/style/stylus/built-in.ts", "../src/modes/style/stylus/symbols-finder.ts", "../src/modes/style/stylus/stylus-hover.ts", "../src/services/typescriptService/serviceHost.ts", "../src/services/typescriptService/preprocess.ts", "../src/services/typescriptService/transformTemplate.ts", "../src/services/typescriptService/walkExpression.ts", "../src/services/typescriptService/bridge.ts", "../src/services/typescriptService/vueSys.ts", "../src/services/typescriptService/moduleResolutionCache.ts", "../src/modes/style/sass/sassLanguageMode.ts", "../src/modes/pug/index.ts", "../src/modes/pug/languageService.ts", "../src/modes/plugins/autoImportSfcPlugin.ts", "../src/embeddedSupport/languageModes.ts", "../src/services/EnvironmentService.ts", "../src/services/RefTokenService.ts", "../src/services/dependencyService.ts", "../src/services/documentService.ts", "../src/services/projectService.ts", "../src/services/vueInfoService.ts", "../src/services/vls.ts", "../src/utils/sleep.ts", "../src/modes/test-util/completion-test-util.ts", "../src/modes/test-util/hover-test-util.ts"], "sourcesContent": ["\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.splitWhen = exports.flatten = void 0;\r\nfunction flatten(items) {\r\n return items.reduce((collection, item) => [].concat(collection, item), []);\r\n}\r\nexports.flatten = flatten;\r\nfunction splitWhen(items, predicate) {\r\n const result = [[]];\r\n let groupIndex = 0;\r\n for (const item of items) {\r\n if (predicate(item)) {\r\n groupIndex++;\r\n result[groupIndex] = [];\r\n }\r\n else {\r\n result[groupIndex].push(item);\r\n }\r\n }\r\n return result;\r\n}\r\nexports.splitWhen = splitWhen;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.isEnoentCodeError = void 0;\r\nfunction isEnoentCodeError(error) {\r\n return error.code === 'ENOENT';\r\n}\r\nexports.isEnoentCodeError = isEnoentCodeError;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.createDirentFromStats = void 0;\r\nclass DirentFromStats {\r\n constructor(name, stats) {\r\n this.name = name;\r\n this.isBlockDevice = stats.isBlockDevice.bind(stats);\r\n this.isCharacterDevice = stats.isCharacterDevice.bind(stats);\r\n this.isDirectory = stats.isDirectory.bind(stats);\r\n this.isFIFO = stats.isFIFO.bind(stats);\r\n this.isFile = stats.isFile.bind(stats);\r\n this.isSocket = stats.isSocket.bind(stats);\r\n this.isSymbolicLink = stats.isSymbolicLink.bind(stats);\r\n }\r\n}\r\nfunction createDirentFromStats(name, stats) {\r\n return new DirentFromStats(name, stats);\r\n}\r\nexports.createDirentFromStats = createDirentFromStats;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.removeLeadingDotSegment = exports.escape = exports.makeAbsolute = exports.unixify = void 0;\r\nconst path = require(\"path\");\r\nconst LEADING_DOT_SEGMENT_CHARACTERS_COUNT = 2; // ./ or .\\\\\r\nconst UNESCAPED_GLOB_SYMBOLS_RE = /(\\\\?)([()*?[\\]{|}]|^!|[!+@](?=\\())/g;\r\n/**\r\n * Designed to work only with simple paths: `dir\\\\file`.\r\n */\r\nfunction unixify(filepath) {\r\n return filepath.replace(/\\\\/g, '/');\r\n}\r\nexports.unixify = unixify;\r\nfunction makeAbsolute(cwd, filepath) {\r\n return path.resolve(cwd, filepath);\r\n}\r\nexports.makeAbsolute = makeAbsolute;\r\nfunction escape(pattern) {\r\n return pattern.replace(UNESCAPED_GLOB_SYMBOLS_RE, '\\\\$2');\r\n}\r\nexports.escape = escape;\r\nfunction removeLeadingDotSegment(entry) {\r\n // We do not use `startsWith` because this is 10x slower than current implementation for some cases.\r\n // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with\r\n if (entry.charAt(0) === '.') {\r\n const secondCharactery = entry.charAt(1);\r\n if (secondCharactery === '/' || secondCharactery === '\\\\') {\r\n return entry.slice(LEADING_DOT_SEGMENT_CHARACTERS_COUNT);\r\n }\r\n }\r\n return entry;\r\n}\r\nexports.removeLeadingDotSegment = removeLeadingDotSegment;\r\n", "/*!\n * is-extglob <https://github.com/jonschlinkert/is-extglob>\n *\n * Copyright (c) 2014-2016, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\nmodule.exports = function isExtglob(str) {\n if (typeof str !== 'string' || str === '') {\n return false;\n }\n\n var match;\n while ((match = /(\\\\).|([@?!+*]\\(.*\\))/g.exec(str))) {\n if (match[2]) return true;\n str = str.slice(match.index + match[0].length);\n }\n\n return false;\n};\n", "/*!\n * is-glob <https://github.com/jonschlinkert/is-glob>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nvar isExtglob = require('is-extglob');\nvar chars = { '{': '}', '(': ')', '[': ']'};\nvar strictCheck = function(str) {\n if (str[0] === '!') {\n return true;\n }\n var index = 0;\n var pipeIndex = -2;\n var closeSquareIndex = -2;\n var closeCurlyIndex = -2;\n var closeParenIndex = -2;\n var backSlashIndex = -2;\n while (index < str.length) {\n if (str[index] === '*') {\n return true;\n }\n\n if (str[index + 1] === '?' && /[\\].+)]/.test(str[index])) {\n return true;\n }\n\n if (closeSquareIndex !== -1 && str[index] === '[' && str[index + 1] !== ']') {\n if (closeSquareIndex < index) {\n closeSquareIndex = str.indexOf(']', index);\n }\n if (closeSquareIndex > index) {\n if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) {\n return true;\n }\n backSlashIndex = str.indexOf('\\\\', index);\n if (backSlashIndex === -1 || backSlashIndex > closeSquareIndex) {\n return true;\n }\n }\n }\n\n if (closeCurlyIndex !== -1 && str[index] === '{' && str[index + 1] !== '}') {\n closeCurlyIndex = str.indexOf('}', index);\n if (closeCurlyIndex > index) {\n backSlashIndex = str.indexOf('\\\\', index);\n if (backSlashIndex === -1 || backSlashIndex > closeCurlyIndex) {\n return true;\n }\n }\n }\n\n if (closeParenIndex !== -1 && str[index] === '(' && str[index + 1] === '?' && /[:!=]/.test(str[index + 2]) && str[index + 3] !== ')') {\n closeParenIndex = str.indexOf(')', index);\n if (closeParenIndex > index) {\n backSlashIndex = str.indexOf('\\\\', index);\n if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) {\n return true;\n }\n }\n }\n\n if (pipeIndex !== -1 && str[index] === '(' && str[index + 1] !== '|') {\n if (pipeIndex < index) {\n pipeIndex = str.indexOf('|', index);\n }\n if (pipeIndex !== -1 && str[pipeIndex + 1] !== ')') {\n closeParenIndex = str.indexOf(')', pipeIndex);\n if (closeParenIndex > pipeIndex) {\n backSlashIndex = str.indexOf('\\\\', pipeIndex);\n if (backSlashIndex === -1 || backSlashIndex > closeParenIndex) {\n return true;\n }\n }\n }\n }\n\n if (str[index] === '\\\\') {\n var open = str[index + 1];\n index += 2;\n var close = chars[open];\n\n if (close) {\n var n = str.indexOf(close, index);\n if (n !== -1) {\n index = n + 1;\n }\n }\n\n if (str[index] === '!') {\n return true;\n }\n } else {\n index++;\n }\n }\n return false;\n};\n\nvar relaxedCheck = function(str) {\n if (str[0] === '!') {\n return true;\n }\n var index = 0;\n while (index < str.length) {\n if (/[*?{}()[\\]]/.test(str[index])) {\n return true;\n }\n\n if (str[index] === '\\\\') {\n var open = str[index + 1];\n index += 2;\n var close = chars[open];\n\n if (close) {\n var n = str.indexOf(close, index);\n if (n !== -1) {\n index = n + 1;\n }\n }\n\n if (str[index] === '!') {\n return true;\n }\n } else {\n index++;\n }\n }\n return false;\n};\n\nmodule.exports = function isGlob(str, options) {\n if (typeof str !== 'string' || str === '') {\n return false;\n }\n\n if (isExtglob(str)) {\n return true;\n }\n\n var check = strictCheck;\n\n // optionally relax check\n if (options && options.strict === false) {\n check = relaxedCheck;\n }\n\n return check(str);\n};\n", "'use strict';\n\nvar isGlob = require('is-glob');\nvar pathPosixDirname = require('path').posix.dirname;\nvar isWin32 = require('os').platform() === 'win32';\n\nvar slash = '/';\nvar backslash = /\\\\/g;\nvar enclosure = /[\\{\\[].*[\\}\\]]$/;\nvar globby = /(^|[^\\\\])([\\{\\[]|\\([^\\)]+$)/;\nvar escaped = /\\\\([\\!\\*\\?\\|\\[\\]\\(\\)\\{\\}])/g;\n\n/**\n * @param {string} str\n * @param {Object} opts\n * @param {boolean} [opts.flipBackslashes=true]\n * @returns {string}\n */\nmodule.exports = function globParent(str, opts) {\n var options = Object.assign({ flipBackslashes: true }, opts);\n\n // flip windows path separators\n if (options.flipBackslashes && isWin32 && str.indexOf(slash) < 0) {\n str = str.replace(backslash, slash);\n }\n\n // special case for strings ending in enclosure containing path separator\n if (enclosure.test(str)) {\n str += slash;\n }\n\n // preserves full path in case of trailing path separator\n str += 'a';\n\n // remove path parts that are globby\n do {\n str = pathPosixDirname(str);\n } while (isGlob(str) || globby.test(str));\n\n // remove escape chars and return result\n return str.replace(escaped, '$1');\n};\n", "'use strict';\n\nexports.isInteger = num => {\n if (typeof num === 'number') {\n return Number.isInteger(num);\n }\n if (typeof num === 'string' && num.trim() !== '') {\n return Number.isInteger(Number(num));\n }\n return false;\n};\n\n/**\n * Find a node of the given type\n */\n\nexports.find = (node, type) => node.nodes.find(node => node.type === type);\n\n/**\n * Find a node of the given type\n */\n\nexports.exceedsLimit = (min, max, step = 1, limit) => {\n if (limit === false) return false;\n if (!exports.isInteger(min) || !exports.isInteger(max)) return false;\n return ((Number(max) - Number(min)) / Number(step)) >= limit;\n};\n\n/**\n * Escape the given node with '\\\\' before node.value\n */\n\nexports.escapeNode = (block, n = 0, type) => {\n let node = block.nodes[n];\n if (!node) return;\n\n if ((type && node.type === type) || node.type === 'open' || node.type === 'close') {\n if (node.escaped !== true) {\n node.value = '\\\\' + node.value;\n node.escaped = true;\n }\n }\n};\n\n/**\n * Returns true if the given brace node should be enclosed in literal braces\n */\n\nexports.encloseBrace = node => {\n if (node.type !== 'brace') return false;\n if ((node.commas >> 0 + node.ranges >> 0) === 0) {\n node.invalid = true;\n return true;\n }\n return false;\n};\n\n/**\n * Returns true if a brace node is invalid.\n */\n\nexports.isInvalidBrace = block => {\n if (block.type !== 'brace') return false;\n if (block.invalid === true || block.dollar) return true;\n if ((block.commas >> 0 + block.ranges >> 0) === 0) {\n block.invalid = true;\n return true;\n }\n if (block.open !== true || block.close !== true) {\n block.invalid = true;\n return true;\n }\n return false;\n};\n\n/**\n * Returns true if a node is an open or close node\n */\n\nexports.isOpenOrClose = node => {\n if (node.type === 'open' || node.type === 'close') {\n return true;\n }\n return node.open === true || node.close === true;\n};\n\n/**\n * Reduce an array of text nodes.\n */\n\nexports.reduce = nodes => nodes.reduce((acc, node) => {\n if (node.type === 'text') acc.push(node.value);\n if (node.type === 'range') node.type = 'text';\n return acc;\n}, []);\n\n/**\n * Flatten an array\n */\n\nexports.flatten = (...args) => {\n const result = [];\n const flat = arr => {\n for (let i = 0; i < arr.length; i++) {\n let ele = arr[i];\n Array.isArray(ele) ? flat(ele, result) : ele !== void 0 && result.push(ele);\n }\n return result;\n };\n flat(args);\n return result;\n};\n", "'use strict';\n\nconst utils = require('./utils');\n\nmodule.exports = (ast, options = {}) => {\n let stringify = (node, parent = {}) => {\n let invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent);\n let invalidNode = node.invalid === true && options.escapeInvalid === true;\n let output = '';\n\n if (node.value) {\n if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) {\n return '\\\\' + node.value;\n }\n return node.value;\n }\n\n if (node.value) {\n return node.value;\n }\n\n if (node.nodes) {\n for (let child of node.nodes) {\n output += stringify(child);\n }\n }\n return output;\n };\n\n return stringify(ast);\n};\n\n", "/*!\n * is-number <https://github.com/jonschlinkert/is-number>\n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function(num) {\n if (typeof num === 'number') {\n return num - num === 0;\n }\n if (typeof num === 'string' && num.trim() !== '') {\n return Number.isFinite ? Number.isFinite(+num) : isFinite(+num);\n }\n return false;\n};\n", "/*!\n * to-regex-range <https://github.com/micromatch/to-regex-range>\n *\n * Copyright (c) 2015-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nconst isNumber = require('is-number');\n\nconst toRegexRange = (min, max, options) => {\n if (isNumber(min) === false) {\n throw new TypeError('toRegexRange: expected the first argument to be a number');\n }\n\n if (max === void 0 || min === max) {\n return String(min);\n }\n\n if (isNumber(max) === false) {\n throw new TypeError('toRegexRange: expected the second argument to be a number.');\n }\n\n let opts = { relaxZeros: true, ...options };\n if (typeof opts.strictZeros === 'boolean') {\n opts.relaxZeros = opts.strictZeros === false;\n }\n\n let relax = String(opts.relaxZeros);\n let shorthand = String(opts.shorthand);\n let capture = String(opts.capture);\n let wrap = String(opts.wrap);\n let cacheKey = min + ':' + max + '=' + relax + shorthand + capture + wrap;\n\n if (toRegexRange.cache.hasOwnProperty(cacheKey)) {\n return toRegexRange.cache[cacheKey].result;\n }\n\n let a = Math.min(min, max);\n let b = Math.max(min, max);\n\n if (Math.abs(a - b) === 1) {\n let result = min + '|' + max;\n if (opts.capture) {\n return `(${result})`;\n }\n if (opts.wrap === false) {\n return result;\n }\n return `(?:${result})`;\n }\n\n let isPadded = hasPadding(min) || hasPadding(max);\n let state = { min, max, a, b };\n let positives = [];\n let negatives = [];\n\n if (isPadded) {\n state.isPadded = isPadded;\n state.maxLen = String(state.max).length;\n }\n\n if (a < 0) {\n let newMin = b < 0 ? Math.abs(b) : 1;\n negatives = splitToPatterns(newMin, Math.abs(a), state, opts);\n a = state.a = 0;\n }\n\n if (b >= 0) {\n positives = splitToPatterns(a, b, state, opts);\n }\n\n state.negatives = negatives;\n state.positives = positives;\n state.result = collatePatterns(negatives, positives, opts);\n\n if (opts.capture === true) {\n state.result = `(${state.result})`;\n } else if (opts.wrap !== false && (positives.length + negatives.length) > 1) {\n state.result = `(?:${state.result})`;\n }\n\n toRegexRange.cache[cacheKey] = state;\n return state.result;\n};\n\nfunction collatePatterns(neg, pos, options) {\n let onlyNegative = filterPatterns(neg, pos, '-', false, options) || [];\n let onlyPositive = filterPatterns(pos, neg, '', false, options) || [];\n let intersected = filterPatterns(neg, pos, '-?', true, options) || [];\n let subpatterns = onlyNegative.concat(intersected).concat(onlyPositive);\n return subpatterns.join('|');\n}\n\nfunction splitToRanges(min, max) {\n let nines = 1;\n let zeros = 1;\n\n let stop = countNines(min, nines);\n let stops = new Set([max]);\n\n while (min <= stop && stop <= max) {\n stops.add(stop);\n nines += 1;\n stop = countNines(min, nines);\n }\n\n stop = countZeros(max + 1, zeros) - 1;\n\n while (min < stop && stop <= max) {\n stops.add(stop);\n zeros += 1;\n stop = countZeros(max + 1, zeros) - 1;\n }\n\n stops = [...stops];\n stops.sort(compare);\n return stops;\n}\n\n/**\n * Convert a range to a regex pattern\n * @param {Number} `start`\n * @param {Number} `stop`\n * @return {String}\n */\n\nfunction rangeToPattern(start, stop, options) {\n if (start === stop) {\n return { pattern: start, count: [], digits: 0 };\n }\n\n let zipped = zip(start, stop);\n let digits = zipped.length;\n let pattern = '';\n let count = 0;\n\n for (let i = 0; i < digits; i++) {\n let [startDigit, stopDigit] = zipped[i];\n\n if (startDigit === stopDigit) {\n pattern += startDigit;\n\n } else if (startDigit !== '0' || stopDigit !== '9') {\n pattern += toCharacterClass(startDigit, stopDigit, options);\n\n } else {\n count++;\n }\n }\n\n if (count) {\n pattern += options.shorthand === true ? '\\\\d' : '[0-9]';\n }\n\n return { pattern, count: [count], digits };\n}\n\nfunction splitToPatterns(min, max, tok, options) {\n let ranges = splitToRanges(min, max);\n let tokens = [];\n let start = min;\n let prev;\n\n for (let i = 0; i < ranges.length; i++) {\n let max = ranges[i];\n let obj = rangeToPattern(String(start), String(max), options);\n let zeros = '';\n\n if (!tok.isPadded && prev && prev.pattern === obj.pattern) {\n if (prev.count.length > 1) {\n prev.count.pop();\n }\n\n prev.count.push(obj.count[0]);\n prev.string = prev.pattern + toQuantifier(prev.count);\n start = max + 1;\n continue;\n }\n\n if (tok.isPadded) {\n zeros = padZeros(max, tok, options);\n }\n\n obj.string = zeros + obj.pattern + toQuantifier(obj.count);\n tokens.push(obj);\n start = max + 1;\n prev = obj;\n }\n\n return tokens;\n}\n\nfunction filterPatterns(arr, comparison, prefix, intersection, options) {\n let result = [];\n\n for (let ele of arr) {\n let { string } = ele;\n\n // only push if _both_ are negative...\n if (!intersection && !contains(comparison, 'string', string)) {\n result.push(prefix + string);\n }\n\n // or _both_ are positive\n if (intersection && contains(comparison, 'string', string)) {\n result.push(prefix + string);\n }\n }\n return result;\n}\n\n/**\n * Zip strings\n */\n\nfunction zip(a, b) {\n let arr = [];\n for (let i = 0; i < a.length; i++) arr.push([a[i], b[i]]);\n return arr;\n}\n\nfunction compare(a, b) {\n return a > b ? 1 : b > a ? -1 : 0;\n}\n\nfunction contains(arr, key, val) {\n return arr.some(ele => ele[key] === val);\n}\n\nfunction countNines(min, len) {\n return Number(String(min).slice(0, -len) + '9'.repeat(len));\n}\n\nfunction countZeros(integer, zeros) {\n return integer - (integer % Math.pow(10, zeros));\n}\n\nfunction toQuantifier(digits) {\n let [start = 0, stop = ''] = digits;\n if (stop || start > 1) {\n return `{${start + (stop ? ',' + stop : '')}}`;\n }\n return '';\n}\n\nfunction toCharacterClass(a, b, options) {\n return `[${a}${(b - a === 1) ? '' : '-'}${b}]`;\n}\n\nfunction hasPadding(str) {\n return /^-?(0+)\\d/.test(str);\n}\n\nfunction padZeros(value, tok, options) {\n if (!tok.isPadded) {\n return value;\n }\n\n let diff = Math.abs(tok.maxLen - String(value).length);\n let relax = options.relaxZeros !== false;\n\n switch (diff) {\n case 0:\n return '';\n case 1:\n return relax ? '0?' : '0';\n case 2:\n return relax ? '0{0,2}' : '00';\n default: {\n return relax ? `0{0,${diff}}` : `0{${diff}}`;\n }\n }\n}\n\n/**\n * Cache\n */\n\ntoRegexRange.cache = {};\ntoRegexRange.clearCache = () => (toRegexRange.cache = {});\n\n/**\n * Expose `toRegexRange`\n */\n\nmodule.exports = toRegexRange;\n", "/*!\n * fill-range <https://github.com/jonschlinkert/fill-range>\n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nconst util = require('util');\nconst toRegexRange = require('to-regex-range');\n\nconst isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);\n\nconst transform = toNumber => {\n return value => toNumber === true ? Number(value) : String(value);\n};\n\nconst isValidValue = value => {\n return typeof value === 'number' || (typeof value === 'string' && value !== '');\n};\n\nconst isNumber = num => Number.isInteger(+num);\n\nconst zeros = input => {\n let value = `${input}`;\n let index = -1;\n if (value[0] === '-') value = value.slice(1);\n if (value === '0') return false;\n while (value[++index] === '0');\n return index > 0;\n};\n\nconst stringify = (start, end, options) => {\n if (typeof start === 'string' || typeof end === 'string') {\n return true;\n }\n return options.stringify === true;\n};\n\nconst pad = (input, maxLength, toNumber) => {\n if (maxLength > 0) {\n let dash = input[0] === '-' ? '-' : '';\n if (dash) input = input.slice(1);\n input = (dash + input.padStart(dash ? maxLength - 1 : maxLength, '0'));\n }\n if (toNumber === false) {\n return String(input);\n }\n return input;\n};\n\nconst toMaxLen = (input, maxLength) => {\n let negative = input[0] === '-' ? '-' : '';\n if (negative) {\n input = input.slice(1);\n maxLength--;\n }\n while (input.length < maxLength) input = '0' + input;\n return negative ? ('-' + input) : input;\n};\n\nconst toSequence = (parts, options) => {\n parts.negatives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);\n parts.positives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);\n\n let prefix = options.capture ? '' : '?:';\n let positives = '';\n let negatives = '';\n let result;\n\n if (parts.positives.length) {\n positives = parts.positives.join('|');\n }\n\n if (parts.negatives.length) {\n negatives = `-(${prefix}${parts.negatives.join('|')})`;\n }\n\n if (positives && negatives) {\n result = `${positives}|${negatives}`;\n } else {\n result = positives || negatives;\n }\n\n if (options.wrap) {\n return `(${prefix}${result})`;\n }\n\n return result;\n};\n\nconst toRange = (a, b, isNumbers, options) => {\n if (isNumbers) {\n return toRegexRange(a, b, { wrap: false, ...options });\n }\n\n let start = String.fromCharCode(a);\n if (a === b) return start;\n\n let stop = String.fromCharCode(b);\n return `[${start}-${stop}]`;\n};\n\nconst toRegex = (start, end, options) => {\n if (Array.isArray(start)) {\n let wrap = options.wrap === true;\n let prefix = options.capture ? '' : '?:';\n return wrap ? `(${prefix}${start.join('|')})` : start.join('|');\n }\n return toRegexRange(start, end, options);\n};\n\nconst rangeError = (...args) => {\n return new RangeError('Invalid range arguments: ' + util.inspect(...args));\n};\n\nconst invalidRange = (start, end, options) => {\n if (options.strictRanges === true) throw rangeError([start, end]);\n return [];\n};\n\nconst invalidStep = (step, options) => {\n if (options.strictRanges === true) {\n throw new TypeError(`Expected step \"${step}\" to be a number`);\n }\n return [];\n};\n\nconst fillNumbers = (start, end, step = 1, options = {}) => {\n let a = Number(start);\n let b = Number(end);\n\n if (!Number.isInteger(a) || !Number.isInteger(b)) {\n if (options.strictRanges === true) throw rangeError([start, end]);\n return [];\n }\n\n // fix negative zero\n if (a === 0) a = 0;\n if (b === 0) b = 0;\n\n let descending = a > b;\n let startString = String(start);\n let endString = String(end);\n let stepString = String(step);\n step = Math.max(Math.abs(step), 1);\n\n let padded = zeros(startString) || zeros(endString) || zeros(stepString);\n let maxLen = padded ? Math.max(startString.length, endString.length, stepString.length) : 0;\n let toNumber = padded === false && stringify(start, end, options) === false;\n let format = options.transform || transform(toNumber);\n\n if (options.toRegex && step === 1) {\n return toRange(toMaxLen(start, maxLen), toMaxLen(end, maxLen), true, options);\n }\n\n let parts = { negatives: [], positives: [] };\n let push = num => parts[num < 0 ? 'negatives' : 'positives'].push(Math.abs(num));\n let range = [];\n let index = 0;\n\n while (descending ? a >= b : a <= b) {\n if (options.toRegex === true && step > 1) {\n push(a);\n } else {\n range.push(pad(format(a, index), maxLen, toNumber));\n }\n a = descending ? a - step : a + step;\n index++;\n }\n\n if (options.toRegex === true) {\n return step > 1\n ? toSequence(parts, options)\n : toRegex(range, null, { wrap: false, ...options });\n }\n\n return range;\n};\n\nconst fillLetters = (start, end, step = 1, options = {}) => {\n if ((!isNumber(start) && start.length > 1) || (!isNumber(end) && end.length > 1)) {\n return invalidRange(start, end, options);\n }\n\n\n let format = options.transform || (val => String.fromCharCode(val));\n let a = `${start}`.charCodeAt(0);\n let b = `${end}`.charCodeAt(0);\n\n let descending = a > b;\n let min = Math.min(a, b);\n let max = Math.max(a, b);\n\n if (options.toRegex && step === 1) {\n return toRange(min, max, false, options);\n }\n\n let range = [];\n let index = 0;\n\n while (descending ? a >= b : a <= b) {\n range.push(format(a, index));\n a = descending ? a - step : a + step;\n index++;\n }\n\n if (options.toRegex === true) {\n return toRegex(range, null, { wrap: false, options });\n }\n\n return range;\n};\n\nconst fill = (start, end, step, options = {}) => {\n if (end == null && isValidValue(start)) {\n return [start];\n }\n\n if (!isValidValue(start) || !isValidValue(end)) {\n return invalidRange(start, end, options);\n }\n\n if (typeof step === 'function') {\n return fill(start, end, 1, { transform: step });\n }\n\n if (isObject(step)) {\n return fill(start, end, 0, step);\n }\n\n let opts = { ...options };\n if (opts.capture === true) opts.wrap = true;\n step = step || opts.step || 1;\n\n if (!isNumber(step)) {\n if (step != null && !isObject(step)) return invalidStep(step, opts);\n return fill(start, end, 1, step);\n }\n\n if (isNumber(start) && isNumber(end)) {\n return fillNumbers(start, end, step, opts);\n }\n\n return fillLetters(start, end, Math.max(Math.abs(step), 1), opts);\n};\n\nmodule.exports = fill;\n", "'use strict';\n\nconst fill = require('fill-range');\nconst utils = require('./utils');\n\nconst compile = (ast, options = {}) => {\n let walk = (node, parent = {}) => {\n let invalidBlock = utils.isInvalidBrace(parent);\n let invalidNode = node.invalid === true && options.escapeInvalid === true;\n let invalid = invalidBlock === true || invalidNode === true;\n let prefix = options.escapeInvalid === true ? '\\\\' : '';\n let output = '';\n\n if (node.isOpen === true) {\n return prefix + node.value;\n }\n if (node.isClose === true) {\n return prefix + node.value;\n }\n\n if (node.type === 'open') {\n return invalid ? (prefix + node.value) : '(';\n }\n\n if (node.type === 'close') {\n return invalid ? (prefix + node.value) : ')';\n }\n\n if (node.type === 'comma') {\n return node.prev.type === 'comma' ? '' : (invalid ? node.value : '|');\n }\n\n if (node.value) {\n return node.value;\n }\n\n if (node.nodes && node.ranges > 0) {\n let args = utils.reduce(node.nodes);\n let range = fill(...args, { ...options, wrap: false, toRegex: true });\n\n if (range.length !== 0) {\n return args.length > 1 && range.length > 1 ? `(${range})` : range;\n }\n }\n\n if (node.nodes) {\n for (let child of node.nodes) {\n output += walk(child, node);\n }\n }\n return output;\n };\n\n return walk(ast);\n};\n\nmodule.exports = compile;\n", "'use strict';\n\nconst fill = require('fill-range');\nconst stringify = require('./stringify');\nconst utils = require('./utils');\n\nconst append = (queue = '', stash = '', enclose = false) => {\n let result = [];\n\n queue = [].concat(queue);\n stash = [].concat(stash);\n\n if (!stash.length) return queue;\n if (!queue.length) {\n return enclose ? utils.flatten(stash).map(ele => `{${ele}}`) : stash;\n }\n\n for (let item of queue) {\n if (Array.isArray(item)) {\n for (let value of item) {\n result.push(append(value, stash, enclose));\n }\n } else {\n for (let ele of stash) {\n if (enclose === true && typeof ele === 'string') ele = `{${ele}}`;\n result.push(Array.isArray(ele) ? append(item, ele, enclose) : (item + ele));\n }\n }\n }\n return utils.flatten(result);\n};\n\nconst expand = (ast, options = {}) => {\n let rangeLimit = options.rangeLimit === void 0 ? 1000 : options.rangeLimit;\n\n let walk = (node, parent = {}) => {\n node.queue = [];\n\n let p = parent;\n let q = parent.queue;\n\n while (p.type !== 'brace' && p.type !== 'root' && p.parent) {\n p = p.parent;\n q = p.queue;\n }\n\n if (node.invalid || node.dollar) {\n q.push(append(q.pop(), stringify(node, options)));\n return;\n }\n\n if (node.type === 'brace' && node.invalid !== true && node.nodes.length === 2) {\n q.push(append(q.pop(), ['{}']));\n return;\n }\n\n if (node.nodes && node.ranges > 0) {\n let args = utils.reduce(node.nodes);\n\n if (utils.exceedsLimit(...args, options.step, rangeLimit)) {\n throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.');\n }\n\n let range = fill(...args, options);\n if (range.length === 0) {\n range = stringify(node, options);\n }\n\n q.push(append(q.pop(), range));\n node.nodes = [];\n return;\n }\n\n let enclose = utils.encloseBrace(node);\n let queue = node.queue;\n let block = node;\n\n while (block.type !== 'brace' && block.type !== 'root' && block.parent) {\n block = block.parent;\n queue = block.queue;\n }\n\n for (let i = 0; i < node.nodes.length; i++) {\n let child = node.nodes[i];\n\n if (child.type === 'comma' && node.type === 'brace') {\n if (i === 1) queue.push('');\n queue.push('');\n continue;\n }\n\n if (child.type === 'close') {\n q.push(append(q.pop(), queue, enclose));\n continue;\n }\n\n if (child.value && child.type !== 'open') {\n queue.push(append(queue.pop(), child.value));\n continue;\n }\n\n if (child.nodes) {\n walk(child, node);\n }\n }\n\n return queue;\n };\n\n return utils.flatten(walk(ast));\n};\n\nmodule.exports = expand;\n", "'use strict';\n\nmodule.exports = {\n MAX_LENGTH: 1024 * 64,\n\n // Digits\n CHAR_0: '0', /* 0 */\n CHAR_9: '9', /* 9 */\n\n // Alphabet chars.\n CHAR_UPPERCASE_A: 'A', /* A */\n CHAR_LOWERCASE_A: 'a', /* a */\n CHAR_UPPERCASE_Z: 'Z', /* Z */\n CHAR_LOWERCASE_Z: 'z', /* z */\n\n CHAR_LEFT_PARENTHESES: '(', /* ( */\n CHAR_RIGHT_PARENTHESES: ')', /* ) */\n\n CHAR_ASTERISK: '*', /* * */\n\n // Non-alphabetic chars.\n CHAR_AMPERSAND: '&', /* & */\n CHAR_AT: '@', /* @ */\n CHAR_BACKSLASH: '\\\\', /* \\ */\n CHAR_BACKTICK: '`', /* ` */\n CHAR_CARRIAGE_RETURN: '\\r', /* \\r */\n CHAR_CIRCUMFLEX_ACCENT: '^', /* ^ */\n CHAR_COLON: ':', /* : */\n CHAR_COMMA: ',', /* , */\n CHAR_DOLLAR: '$', /* . */\n CHAR_DOT: '.', /* . */\n CHAR_DOUBLE_QUOTE: '\"', /* \" */\n CHAR_EQUAL: '=', /* = */\n CHAR_EXCLAMATION_MARK: '!', /* ! */\n CHAR_FORM_FEED: '\\f', /* \\f */\n CHAR_FORWARD_SLASH: '/', /* / */\n CHAR_HASH: '#', /* # */\n CHAR_HYPHEN_MINUS: '-', /* - */\n CHAR_LEFT_ANGLE_BRACKET: '<', /* < */\n CHAR_LEFT_CURLY_BRACE: '{', /* { */\n CHAR_LEFT_SQUARE_BRACKET: '[', /* [ */\n CHAR_LINE_FEED: '\\n', /* \\n */\n CHAR_NO_BREAK_SPACE: '\\u00A0', /* \\u00A0 */\n CHAR_PERCENT: '%', /* % */\n CHAR_PLUS: '+', /* + */\n CHAR_QUESTION_MARK: '?', /* ? */\n CHAR_RIGHT_ANGLE_BRACKET: '>', /* > */\n CHAR_RIGHT_CURLY_BRACE: '}', /* } */\n CHAR_RIGHT_SQUARE_BRACKET: ']', /* ] */\n CHAR_SEMICOLON: ';', /* ; */\n CHAR_SINGLE_QUOTE: '\\'', /* ' */\n CHAR_SPACE: ' ', /* */\n CHAR_TAB: '\\t', /* \\t */\n CHAR_UNDERSCORE: '_', /* _ */\n CHAR_VERTICAL_LINE: '|', /* | */\n CHAR_ZERO_WIDTH_NOBREAK_SPACE: '\\uFEFF' /* \\uFEFF */\n};\n", "'use strict';\n\nconst stringify = require('./stringify');\n\n/**\n * Constants\n */\n\nconst {\n MAX_LENGTH,\n CHAR_BACKSLASH, /* \\ */\n CHAR_BACKTICK, /* ` */\n CHAR_COMMA, /* , */\n CHAR_DOT, /* . */\n CHAR_LEFT_PARENTHESES, /* ( */\n CHAR_RIGHT_PARENTHESES, /* ) */\n CHAR_LEFT_CURLY_BRACE, /* { */\n CHAR_RIGHT_CURLY_BRACE, /* } */\n CHAR_LEFT_SQUARE_BRACKET, /* [ */\n CHAR_RIGHT_SQUARE_BRACKET, /* ] */\n CHAR_DOUBLE_QUOTE, /* \" */\n CHAR_SINGLE_QUOTE, /* ' */\n CHAR_NO_BREAK_SPACE,\n CHAR_ZERO_WIDTH_NOBREAK_SPACE\n} = require('./constants');\n\n/**\n * parse\n */\n\nconst parse = (input, options = {}) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n let opts = options || {};\n let max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n if (input.length > max) {\n throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`);\n }\n\n let ast = { type: 'root', input, nodes: [] };\n let stack = [ast];\n let block = ast;\n let prev = ast;\n let brackets = 0;\n let length = input.length;\n let index = 0;\n let depth = 0;\n let value;\n let memo = {};\n\n /**\n * Helpers\n */\n\n const advance = () => input[index++];\n const push = node => {\n if (node.type === 'text' && prev.type === 'dot') {\n prev.type = 'text';\n }\n\n if (prev && prev.type === 'text' && node.type === 'text') {\n prev.value += node.value;\n return;\n }\n\n block.nodes.push(node);\n node.parent = block;\n node.prev = prev;\n prev = node;\n return node;\n };\n\n push({ type: 'bos' });\n\n while (index < length) {\n block = stack[stack.length - 1];\n value = advance();\n\n /**\n * Invalid chars\n */\n\n if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) {\n continue;\n }\n\n /**\n * Escaped chars\n */\n\n if (value === CHAR_BACKSLASH) {\n push({ type: 'text', value: (options.keepEscaping ? value : '') + advance() });\n continue;\n }\n\n /**\n * Right square bracket (literal): ']'\n */\n\n if (value === CHAR_RIGHT_SQUARE_BRACKET) {\n push({ type: 'text', value: '\\\\' + value });\n continue;\n }\n\n /**\n * Left square bracket: '['\n */\n\n if (value === CHAR_LEFT_SQUARE_BRACKET) {\n brackets++;\n\n let closed = true;\n let next;\n\n while (index < length && (next = advance())) {\n value += next;\n\n if (next === CHAR_LEFT_SQUARE_BRACKET) {\n brackets++;\n continue;\n }\n\n if (next === CHAR_BACKSLASH) {\n value += advance();\n continue;\n }\n\n if (next === CHAR_RIGHT_SQUARE_BRACKET) {\n brackets--;\n\n if (brackets === 0) {\n break;\n }\n }\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Parentheses\n */\n\n if (value === CHAR_LEFT_PARENTHESES) {\n block = push({ type: 'paren', nodes: [] });\n stack.push(block);\n push({ type: 'text', value });\n continue;\n }\n\n if (value === CHAR_RIGHT_PARENTHESES) {\n if (block.type !== 'paren') {\n push({ type: 'text', value });\n continue;\n }\n block = stack.pop();\n push({ type: 'text', value });\n block = stack[stack.length - 1];\n continue;\n }\n\n /**\n * Quotes: '|\"|`\n */\n\n if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) {\n let open = value;\n let next;\n\n if (options.keepQuotes !== true) {\n value = '';\n }\n\n while (index < length && (next = advance())) {\n if (next === CHAR_BACKSLASH) {\n value += next + advance();\n continue;\n }\n\n if (next === open) {\n if (options.keepQuotes === true) value += next;\n break;\n }\n\n value += next;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Left curly brace: '{'\n */\n\n if (value === CHAR_LEFT_CURLY_BRACE) {\n depth++;\n\n let dollar = prev.value && prev.value.slice(-1) === '$' || block.dollar === true;\n let brace = {\n type: 'brace',\n open: true,\n close: false,\n dollar,\n depth,\n commas: 0,\n ranges: 0,\n nodes: []\n };\n\n block = push(brace);\n stack.push(block);\n push({ type: 'open', value });\n continue;\n }\n\n /**\n * Right curly brace: '}'\n */\n\n if (value === CHAR_RIGHT_CURLY_BRACE) {\n if (block.type !== 'brace') {\n push({ type: 'text', value });\n continue;\n }\n\n let type = 'close';\n block = stack.pop();\n block.close = true;\n\n push({ type, value });\n depth--;\n\n block = stack[stack.length - 1];\n continue;\n }\n\n /**\n * Comma: ','\n */\n\n if (value === CHAR_COMMA && depth > 0) {\n if (block.ranges > 0) {\n block.ranges = 0;\n let open = block.nodes.shift();\n block.nodes = [open, { type: 'text', value: stringify(block) }];\n }\n\n push({ type: 'comma', value });\n block.commas++;\n continue;\n }\n\n /**\n * Dot: '.'\n */\n\n if (value === CHAR_DOT && depth > 0 && block.commas === 0) {\n let siblings = block.nodes;\n\n if (depth === 0 || siblings.length === 0) {\n push({ type: 'text', value });\n continue;\n }\n\n if (prev.type === 'dot') {\n block.range = [];\n prev.value += value;\n prev.type = 'range';\n\n if (block.nodes.length !== 3 && block.nodes.length !== 5) {\n block.invalid = true;\n block.ranges = 0;\n prev.type = 'text';\n continue;\n }\n\n block.ranges++;\n block.args = [];\n continue;\n }\n\n if (prev.type === 'range') {\n siblings.pop();\n\n let before = siblings[siblings.length - 1];\n before.value += prev.value + value;\n prev = before;\n block.ranges--;\n continue;\n }\n\n push({ type: 'dot', value });\n continue;\n }\n\n /**\n * Text\n */\n\n push({ type: 'text', value });\n }\n\n // Mark imbalanced braces and brackets as invalid\n do {\n block = stack.pop();\n\n if (block.type !== 'root') {\n block.nodes.forEach(node => {\n if (!node.nodes) {\n if (node.type === 'open') node.isOpen = true;\n if (node.type === 'close') node.isClose = true;\n if (!node.nodes) node.type = 'text';\n node.invalid = true;\n }\n });\n\n // get the location of the block on parent.nodes (block's siblings)\n let parent = stack[stack.length - 1];\n let index = parent.nodes.indexOf(block);\n // replace the (invalid) block with it's nodes\n parent.nodes.splice(index, 1, ...block.nodes);\n }\n } while (stack.length > 0);\n\n push({ type: 'eos' });\n return ast;\n};\n\nmodule.exports = parse;\n", "'use strict';\n\nconst stringify = require('./lib/stringify');\nconst compile = require('./lib/compile');\nconst expand = require('./lib/expand');\nconst parse = require('./lib/parse');\n\n/**\n * Expand the given pattern or create a regex-compatible string.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces('{a,b,c}', { compile: true })); //=> ['(a|b|c)']\n * console.log(braces('{a,b,c}')); //=> ['a', 'b', 'c']\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {String}\n * @api public\n */\n\nconst braces = (input, options = {}) => {\n let output = [];\n\n if (Array.isArray(input)) {\n for (let pattern of input) {\n let result = braces.create(pattern, options);\n if (Array.isArray(result)) {\n output.push(...result);\n } else {\n output.push(result);\n }\n }\n } else {\n output = [].concat(braces.create(input, options));\n }\n\n if (options && options.expand === true && options.nodupes === true) {\n output = [...new Set(output)];\n }\n return output;\n};\n\n/**\n * Parse the given `str` with the given `options`.\n *\n * ```js\n * // braces.parse(pattern, [, options]);\n * const ast = braces.parse('a/{b,c}/d');\n * console.log(ast);\n * ```\n * @param {String} pattern Brace pattern to parse\n * @param {Object} options\n * @return {Object} Returns an AST\n * @api public\n */\n\nbraces.parse = (input, options = {}) => parse(input, options);\n\n/**\n * Creates a braces string from an AST, or an AST node.\n *\n * ```js\n * const braces = require('braces');\n * let ast = braces.parse('foo/{a,b}/bar');\n * console.log(stringify(ast.nodes[2])); //=> '{a,b}'\n * ```\n * @param {String} `input` Brace pattern or AST.\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.stringify = (input, options = {}) => {\n if (typeof input === 'string') {\n return stringify(braces.parse(input, options), options);\n }\n return stringify(input, options);\n};\n\n/**\n * Compiles a brace pattern into a regex-compatible, optimized string.\n * This method is called by the main [braces](#braces) function by default.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces.compile('a/{b,c}/d'));\n * //=> ['a/(b|c)/d']\n * ```\n * @param {String} `input` Brace pattern or AST.\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.compile = (input, options = {}) => {\n if (typeof input === 'string') {\n input = braces.parse(input, options);\n }\n return compile(input, options);\n};\n\n/**\n * Expands a brace pattern into an array. This method is called by the\n * main [braces](#braces) function when `options.expand` is true. Before\n * using this method it's recommended that you read the [performance notes](#performance))\n * and advantages of using [.compile](#compile) instead.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces.expand('a/{b,c}/d'));\n * //=> ['a/b/d', 'a/c/d'];\n * ```\n * @param {String} `pattern` Brace pattern\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.expand = (input, options = {}) => {\n if (typeof input === 'string') {\n input = braces.parse(input, options);\n }\n\n let result = expand(input, options);\n\n // filter out empty strings if specified\n if (options.noempty === true) {\n result = result.filter(Boolean);\n }\n\n // filter out duplicates if specified\n if (options.nodupes === true) {\n result = [...new Set(result)];\n }\n\n return result;\n};\n\n/**\n * Processes a brace pattern and returns either an expanded array\n * (if `options.expand` is true), a highly optimized regex-compatible string.\n * This method is called by the main [braces](#braces) function.\n *\n * ```js\n * const braces = require('braces');\n * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}'))\n * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)'\n * ```\n * @param {String} `pattern` Brace pattern\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.create = (input, options = {}) => {\n if (input === '' || input.length < 3) {\n return [input];\n }\n\n return options.expand !== true\n ? braces.compile(input, options)\n : braces.expand(input, options);\n};\n\n/**\n * Expose \"braces\"\n */\n\nmodule.exports = braces;\n", "'use strict';\n\nconst path = require('path');\nconst WIN_SLASH = '\\\\\\\\/';\nconst WIN_NO_SLASH = `[^${WIN_SLASH}]`;\n\n/**\n * Posix glob regex\n */\n\nconst DOT_LITERAL = '\\\\.';\nconst PLUS_LITERAL = '\\\\+';\nconst QMARK_LITERAL = '\\\\?';\nconst SLASH_LITERAL = '\\\\/';\nconst ONE_CHAR = '(?=.)';\nconst QMARK = '[^/]';\nconst END_ANCHOR = `(?:${SLASH_LITERAL}|$)`;\nconst START_ANCHOR = `(?:^|${SLASH_LITERAL})`;\nconst DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`;\nconst NO_DOT = `(?!${DOT_LITERAL})`;\nconst NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`;\nconst NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`;\nconst NO_DOTS_SLASH = `(?!${DOTS_SLASH})`;\nconst QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`;\nconst STAR = `${QMARK}*?`;\n\nconst POSIX_CHARS = {\n DOT_LITERAL,\n PLUS_LITERAL,\n QMARK_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n QMARK,\n END_ANCHOR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOTS,\n NO_DOT_SLASH,\n NO_DOTS_SLASH,\n QMARK_NO_DOT,\n STAR,\n START_ANCHOR\n};\n\n/**\n * Windows glob regex\n */\n\nconst WINDOWS_CHARS = {\n ...POSIX_CHARS,\n\n SLASH_LITERAL: `[${WIN_SLASH}]`,\n QMARK: WIN_NO_SLASH,\n STAR: `${WIN_NO_SLASH}*?`,\n DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`,\n NO_DOT: `(?!${DOT_LITERAL})`,\n NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`,\n NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`,\n QMARK_NO_DOT: `[^.${WIN_SLASH}]`,\n START_ANCHOR: `(?:^|[${WIN_SLASH}])`,\n END_ANCHOR: `(?:[${WIN_SLASH}]|$)`\n};\n\n/**\n * POSIX Bracket Regex\n */\n\nconst POSIX_REGEX_SOURCE = {\n alnum: 'a-zA-Z0-9',\n alpha: 'a-zA-Z',\n ascii: '\\\\x00-\\\\x7F',\n blank: ' \\\\t',\n cntrl: '\\\\x00-\\\\x1F\\\\x7F',\n digit: '0-9',\n graph: '\\\\x21-\\\\x7E',\n lower: 'a-z',\n print: '\\\\x20-\\\\x7E ',\n punct: '\\\\-!\"#$%&\\'()\\\\*+,./:;<=>?@[\\\\]^_`{|}~',\n space: ' \\\\t\\\\r\\\\n\\\\v\\\\f',\n upper: 'A-Z',\n word: 'A-Za-z0-9_',\n xdigit: 'A-Fa-f0-9'\n};\n\nmodule.exports = {\n MAX_LENGTH: 1024 * 64,\n POSIX_REGEX_SOURCE,\n\n // regular expressions\n REGEX_BACKSLASH: /\\\\(?![*+?^${}(|)[\\]])/g,\n REGEX_NON_SPECIAL_CHARS: /^[^@![\\].,$*+?^{}()|\\\\/]+/,\n REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\\]]/,\n REGEX_SPECIAL_CHARS_BACKREF: /(\\\\?)((\\W)(\\3*))/g,\n REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\\]])/g,\n REGEX_REMOVE_BACKSLASH: /(?:\\[.*?[^\\\\]\\]|\\\\(?=.))/g,\n\n // Replace globs with equivalent patterns to reduce parsing time.\n REPLACEMENTS: {\n '***': '*',\n '**/**': '**',\n '**/**/**': '**'\n },\n\n // Digits\n CHAR_0: 48, /* 0 */\n CHAR_9: 57, /* 9 */\n\n // Alphabet chars.\n CHAR_UPPERCASE_A: 65, /* A */\n CHAR_LOWERCASE_A: 97, /* a */\n CHAR_UPPERCASE_Z: 90, /* Z */\n CHAR_LOWERCASE_Z: 122, /* z */\n\n CHAR_LEFT_PARENTHESES: 40, /* ( */\n CHAR_RIGHT_PARENTHESES: 41, /* ) */\n\n CHAR_ASTERISK: 42, /* * */\n\n // Non-alphabetic chars.\n CHAR_AMPERSAND: 38, /* & */\n CHAR_AT: 64, /* @ */\n CHAR_BACKWARD_SLASH: 92, /* \\ */\n CHAR_CARRIAGE_RETURN: 13, /* \\r */\n CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */\n CHAR_COLON: 58, /* : */\n CHAR_COMMA: 44, /* , */\n CHAR_DOT: 46, /* . */\n CHAR_DOUBLE_QUOTE: 34, /* \" */\n CHAR_EQUAL: 61, /* = */\n CHAR_EXCLAMATION_MARK: 33, /* ! */\n CHAR_FORM_FEED: 12, /* \\f */\n CHAR_FORWARD_SLASH: 47, /* / */\n CHAR_GRAVE_ACCENT: 96, /* ` */\n CHAR_HASH: 35, /* # */\n CHAR_HYPHEN_MINUS: 45, /* - */\n CHAR_LEFT_ANGLE_BRACKET: 60, /* < */\n CHAR_LEFT_CURLY_BRACE: 123, /* { */\n CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */\n CHAR_LINE_FEED: 10, /* \\n */\n CHAR_NO_BREAK_SPACE: 160, /* \\u00A0 */\n CHAR_PERCENT: 37, /* % */\n CHAR_PLUS: 43, /* + */\n CHAR_QUESTION_MARK: 63, /* ? */\n CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */\n CHAR_RIGHT_CURLY_BRACE: 125, /* } */\n CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */\n CHAR_SEMICOLON: 59, /* ; */\n CHAR_SINGLE_QUOTE: 39, /* ' */\n CHAR_SPACE: 32, /* */\n CHAR_TAB: 9, /* \\t */\n CHAR_UNDERSCORE: 95, /* _ */\n CHAR_VERTICAL_LINE: 124, /* | */\n CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \\uFEFF */\n\n SEP: path.sep,\n\n /**\n * Create EXTGLOB_CHARS\n */\n\n extglobChars(chars) {\n return {\n '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` },\n '?': { type: 'qmark', open: '(?:', close: ')?' },\n '+': { type: 'plus', open: '(?:', close: ')+' },\n '*': { type: 'star', open: '(?:', close: ')*' },\n '@': { type: 'at', open: '(?:', close: ')' }\n };\n },\n\n /**\n * Create GLOB_CHARS\n */\n\n globChars(win32) {\n return win32 === true ? WINDOWS_CHARS : POSIX_CHARS;\n }\n};\n", "'use strict';\n\nconst path = require('path');\nconst win32 = process.platform === 'win32';\nconst {\n REGEX_BACKSLASH,\n REGEX_REMOVE_BACKSLASH,\n REGEX_SPECIAL_CHARS,\n REGEX_SPECIAL_CHARS_GLOBAL\n} = require('./constants');\n\nexports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val);\nexports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str);\nexports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str);\nexports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\\\$1');\nexports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/');\n\nexports.removeBackslashes = str => {\n return str.replace(REGEX_REMOVE_BACKSLASH, match => {\n return match === '\\\\' ? '' : match;\n });\n};\n\nexports.supportsLookbehinds = () => {\n const segs = process.version.slice(1).split('.').map(Number);\n if (segs.length === 3 && segs[0] >= 9 || (segs[0] === 8 && segs[1] >= 10)) {\n return true;\n }\n return false;\n};\n\nexports.isWindows = options => {\n if (options && typeof options.windows === 'boolean') {\n return options.windows;\n }\n return win32 === true || path.sep === '\\\\';\n};\n\nexports.escapeLast = (input, char, lastIdx) => {\n const idx = input.lastIndexOf(char, lastIdx);\n if (idx === -1) return input;\n if (input[idx - 1] === '\\\\') return exports.escapeLast(input, char, idx - 1);\n return `${input.slice(0, idx)}\\\\${input.slice(idx)}`;\n};\n\nexports.removePrefix = (input, state = {}) => {\n let output = input;\n if (output.startsWith('./')) {\n output = output.slice(2);\n state.prefix = './';\n }\n return output;\n};\n\nexports.wrapOutput = (input, state = {}, options = {}) => {\n const prepend = options.contains ? '' : '^';\n const append = options.contains ? '' : '$';\n\n let output = `${prepend}(?:${input})${append}`;\n if (state.negated === true) {\n output = `(?:^(?!${output}).*$)`;\n }\n return output;\n};\n", "'use strict';\n\nconst utils = require('./utils');\nconst {\n CHAR_ASTERISK, /* * */\n CHAR_AT, /* @ */\n CHAR_BACKWARD_SLASH, /* \\ */\n CHAR_COMMA, /* , */\n CHAR_DOT, /* . */\n CHAR_EXCLAMATION_MARK, /* ! */\n CHAR_FORWARD_SLASH, /* / */\n CHAR_LEFT_CURLY_BRACE, /* { */\n CHAR_LEFT_PARENTHESES, /* ( */\n CHAR_LEFT_SQUARE_BRACKET, /* [ */\n CHAR_PLUS, /* + */\n CHAR_QUESTION_MARK, /* ? */\n CHAR_RIGHT_CURLY_BRACE, /* } */\n CHAR_RIGHT_PARENTHESES, /* ) */\n CHAR_RIGHT_SQUARE_BRACKET /* ] */\n} = require('./constants');\n\nconst isPathSeparator = code => {\n return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;\n};\n\nconst depth = token => {\n if (token.isPrefix !== true) {\n token.depth = token.isGlobstar ? Infinity : 1;\n }\n};\n\n/**\n * Quickly scans a glob pattern and returns an object with a handful of\n * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists),\n * `glob` (the actual pattern), `negated` (true if the path starts with `!` but not\n * with `!(`) and `negatedExtglob` (true if the path starts with `!(`).\n *\n * ```js\n * const pm = require('picomatch');\n * console.log(pm.scan('foo/bar/*.js'));\n * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' }\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {Object} Returns an object with tokens and regex source string.\n * @api public\n */\n\nconst scan = (input, options) => {\n const opts = options || {};\n\n const length = input.length - 1;\n const scanToEnd = opts.parts === true || opts.scanToEnd === true;\n const slashes = [];\n const tokens = [];\n const parts = [];\n\n let str = input;\n let index = -1;\n let start = 0;\n let lastIndex = 0;\n let isBrace = false;\n let isBracket = false;\n let isGlob = false;\n let isExtglob = false;\n let isGlobstar = false;\n let braceEscaped = false;\n let backslashes = false;\n let negated = false;\n let negatedExtglob = false;\n let finished = false;\n let braces = 0;\n let prev;\n let code;\n let token = { value: '', depth: 0, isGlob: false };\n\n const eos = () => index >= length;\n const peek = () => str.charCodeAt(index + 1);\n const advance = () => {\n prev = code;\n return str.charCodeAt(++index);\n };\n\n while (index < length) {\n code = advance();\n let next;\n\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braceEscaped = true;\n }\n continue;\n }\n\n if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (code === CHAR_LEFT_CURLY_BRACE) {\n braces++;\n continue;\n }\n\n if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (braceEscaped !== true && code === CHAR_COMMA) {\n isBrace = token.isBrace = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_RIGHT_CURLY_BRACE) {\n braces--;\n\n if (braces === 0) {\n braceEscaped = false;\n isBrace = token.isBrace = true;\n finished = true;\n break;\n }\n }\n }\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (code === CHAR_FORWARD_SLASH) {\n slashes.push(index);\n tokens.push(token);\n token = { value: '', depth: 0, isGlob: false };\n\n if (finished === true) continue;\n if (prev === CHAR_DOT && index === (start + 1)) {\n start += 2;\n continue;\n }\n\n lastIndex = index + 1;\n continue;\n }\n\n if (opts.noext !== true) {\n const isExtglobChar = code === CHAR_PLUS\n || code === CHAR_AT\n || code === CHAR_ASTERISK\n || code === CHAR_QUESTION_MARK\n || code === CHAR_EXCLAMATION_MARK;\n\n if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n isExtglob = token.isExtglob = true;\n finished = true;\n if (code === CHAR_EXCLAMATION_MARK && index === start) {\n negatedExtglob = true;\n }\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n isGlob = token.isGlob = true;\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n }\n\n if (code === CHAR_ASTERISK) {\n if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true;\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_QUESTION_MARK) {\n isGlob = token.isGlob = true;\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n break;\n }\n\n if (code === CHAR_LEFT_SQUARE_BRACKET) {\n while (eos() !== true && (next = advance())) {\n if (next === CHAR_BACKWARD_SLASH) {\n backslashes = token.backslashes = true;\n advance();\n continue;\n }\n\n if (next === CHAR_RIGHT_SQUARE_BRACKET) {\n isBracket = token.isBracket = true;\n isGlob = token.isGlob = true;\n finished = true;\n break;\n }\n }\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n\n if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) {\n negated = token.negated = true;\n start++;\n continue;\n }\n\n if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) {\n isGlob = token.isGlob = true;\n\n if (scanToEnd === true) {\n while (eos() !== true && (code = advance())) {\n if (code === CHAR_LEFT_PARENTHESES) {\n backslashes = token.backslashes = true;\n code = advance();\n continue;\n }\n\n if (code === CHAR_RIGHT_PARENTHESES) {\n finished = true;\n break;\n }\n }\n continue;\n }\n break;\n }\n\n if (isGlob === true) {\n finished = true;\n\n if (scanToEnd === true) {\n continue;\n }\n\n break;\n }\n }\n\n if (opts.noext === true) {\n isExtglob = false;\n isGlob = false;\n }\n\n let base = str;\n let prefix = '';\n let glob = '';\n\n if (start > 0) {\n prefix = str.slice(0, start);\n str = str.slice(start);\n lastIndex -= start;\n }\n\n if (base && isGlob === true && lastIndex > 0) {\n base = str.slice(0, lastIndex);\n glob = str.slice(lastIndex);\n } else if (isGlob === true) {\n base = '';\n glob = str;\n } else {\n base = str;\n }\n\n if (base && base !== '' && base !== '/' && base !== str) {\n if (isPathSeparator(base.charCodeAt(base.length - 1))) {\n base = base.slice(0, -1);\n }\n }\n\n if (opts.unescape === true) {\n if (glob) glob = utils.removeBackslashes(glob);\n\n if (base && backslashes === true) {\n base = utils.removeBackslashes(base);\n }\n }\n\n const state = {\n prefix,\n input,\n start,\n base,\n glob,\n isBrace,\n isBracket,\n isGlob,\n isExtglob,\n isGlobstar,\n negated,\n negatedExtglob\n };\n\n if (opts.tokens === true) {\n state.maxDepth = 0;\n if (!isPathSeparator(code)) {\n tokens.push(token);\n }\n state.tokens = tokens;\n }\n\n if (opts.parts === true || opts.tokens === true) {\n let prevIndex;\n\n for (let idx = 0; idx < slashes.length; idx++) {\n const n = prevIndex ? prevIndex + 1 : start;\n const i = slashes[idx];\n const value = input.slice(n, i);\n if (opts.tokens) {\n if (idx === 0 && start !== 0) {\n tokens[idx].isPrefix = true;\n tokens[idx].value = prefix;\n } else {\n tokens[idx].value = value;\n }\n depth(tokens[idx]);\n state.maxDepth += tokens[idx].depth;\n }\n if (idx !== 0 || value !== '') {\n parts.push(value);\n }\n prevIndex = i;\n }\n\n if (prevIndex && prevIndex + 1 < input.length) {\n const value = input.slice(prevIndex + 1);\n parts.push(value);\n\n if (opts.tokens) {\n tokens[tokens.length - 1].value = value;\n depth(tokens[tokens.length - 1]);\n state.maxDepth += tokens[tokens.length - 1].depth;\n }\n }\n\n state.slashes = slashes;\n state.parts = parts;\n }\n\n return state;\n};\n\nmodule.exports = scan;\n", "'use strict';\n\nconst constants = require('./constants');\nconst utils = require('./utils');\n\n/**\n * Constants\n */\n\nconst {\n MAX_LENGTH,\n POSIX_REGEX_SOURCE,\n REGEX_NON_SPECIAL_CHARS,\n REGEX_SPECIAL_CHARS_BACKREF,\n REPLACEMENTS\n} = constants;\n\n/**\n * Helpers\n */\n\nconst expandRange = (args, options) => {\n if (typeof options.expandRange === 'function') {\n return options.expandRange(...args, options);\n }\n\n args.sort();\n const value = `[${args.join('-')}]`;\n\n try {\n /* eslint-disable-next-line no-new */\n new RegExp(value);\n } catch (ex) {\n return args.map(v => utils.escapeRegex(v)).join('..');\n }\n\n return value;\n};\n\n/**\n * Create the message for a syntax error\n */\n\nconst syntaxError = (type, char) => {\n return `Missing ${type}: \"${char}\" - use \"\\\\\\\\${char}\" to match literal characters`;\n};\n\n/**\n * Parse the given input string.\n * @param {String} input\n * @param {Object} options\n * @return {Object}\n */\n\nconst parse = (input, options) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n input = REPLACEMENTS[input] || input;\n\n const opts = { ...options };\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n\n let len = input.length;\n if (len > max) {\n throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n }\n\n const bos = { type: 'bos', value: '', output: opts.prepend || '' };\n const tokens = [bos];\n\n const capture = opts.capture ? '' : '?:';\n const win32 = utils.isWindows(options);\n\n // create constants based on platform, for windows or posix\n const PLATFORM_CHARS = constants.globChars(win32);\n const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS);\n\n const {\n DOT_LITERAL,\n PLUS_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOT_SLASH,\n NO_DOTS_SLASH,\n QMARK,\n QMARK_NO_DOT,\n STAR,\n START_ANCHOR\n } = PLATFORM_CHARS;\n\n const globstar = opts => {\n return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n };\n\n const nodot = opts.dot ? '' : NO_DOT;\n const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT;\n let star = opts.bash === true ? globstar(opts) : STAR;\n\n if (opts.capture) {\n star = `(${star})`;\n }\n\n // minimatch options support\n if (typeof opts.noext === 'boolean') {\n opts.noextglob = opts.noext;\n }\n\n const state = {\n input,\n index: -1,\n start: 0,\n dot: opts.dot === true,\n consumed: '',\n output: '',\n prefix: '',\n backtrack: false,\n negated: false,\n brackets: 0,\n braces: 0,\n parens: 0,\n quotes: 0,\n globstar: false,\n tokens\n };\n\n input = utils.removePrefix(input, state);\n len = input.length;\n\n const extglobs = [];\n const braces = [];\n const stack = [];\n let prev = bos;\n let value;\n\n /**\n * Tokenizing helpers\n */\n\n const eos = () => state.index === len - 1;\n const peek = state.peek = (n = 1) => input[state.index + n];\n const advance = state.advance = () => input[++state.index] || '';\n const remaining = () => input.slice(state.index + 1);\n const consume = (value = '', num = 0) => {\n state.consumed += value;\n state.index += num;\n };\n\n const append = token => {\n state.output += token.output != null ? token.output : token.value;\n consume(token.value);\n };\n\n const negate = () => {\n let count = 1;\n\n while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) {\n advance();\n state.start++;\n count++;\n }\n\n if (count % 2 === 0) {\n return false;\n }\n\n state.negated = true;\n state.start++;\n return true;\n };\n\n const increment = type => {\n state[type]++;\n stack.push(type);\n };\n\n const decrement = type => {\n state[type]--;\n stack.pop();\n };\n\n /**\n * Push tokens onto the tokens array. This helper speeds up\n * tokenizing by 1) helping us avoid backtracking as much as possible,\n * and 2) helping us avoid creating extra tokens when consecutive\n * characters are plain text. This improves performance and simplifies\n * lookbehinds.\n */\n\n const push = tok => {\n if (prev.type === 'globstar') {\n const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace');\n const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren'));\n\n if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) {\n state.output = state.output.slice(0, -prev.output.length);\n prev.type = 'star';\n prev.value = '*';\n prev.output = star;\n state.output += prev.output;\n }\n }\n\n if (extglobs.length && tok.type !== 'paren') {\n extglobs[extglobs.length - 1].inner += tok.value;\n }\n\n if (tok.value || tok.output) append(tok);\n if (prev && prev.type === 'text' && tok.type === 'text') {\n prev.value += tok.value;\n prev.output = (prev.output || '') + tok.value;\n return;\n }\n\n tok.prev = prev;\n tokens.push(tok);\n prev = tok;\n };\n\n const extglobOpen = (type, value) => {\n const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' };\n\n token.prev = prev;\n token.parens = state.parens;\n token.output = state.output;\n const output = (opts.capture ? '(' : '') + token.open;\n\n increment('parens');\n push({ type, value, output: state.output ? '' : ONE_CHAR });\n push({ type: 'paren', extglob: true, value: advance(), output });\n extglobs.push(token);\n };\n\n const extglobClose = token => {\n let output = token.close + (opts.capture ? ')' : '');\n let rest;\n\n if (token.type === 'negate') {\n let extglobStar = star;\n\n if (token.inner && token.inner.length > 1 && token.inner.includes('/')) {\n extglobStar = globstar(opts);\n }\n\n if (extglobStar !== star || eos() || /^\\)+$/.test(remaining())) {\n output = token.close = `)$))${extglobStar}`;\n }\n\n if (token.inner.includes('*') && (rest = remaining()) && /^\\.[^\\\\/.]+$/.test(rest)) {\n // Any non-magical string (`.ts`) or even nested expression (`.{ts,tsx}`) can follow after the closing parenthesis.\n // In this case, we need to parse the string and use it in the output of the original pattern.\n // Suitable patterns: `/!(*.d).ts`, `/!(*.d).{ts,tsx}`, `**/!(*-dbg).@(js)`.\n //\n // Disabling the `fastpaths` option due to a problem with parsing strings as `.ts` in the pattern like `**/!(*.d).ts`.\n const expression = parse(rest, { ...options, fastpaths: false }).output;\n\n output = token.close = `)${expression})${extglobStar})`;\n }\n\n if (token.prev.type === 'bos') {\n state.negatedExtglob = true;\n }\n }\n\n push({ type: 'paren', extglob: true, value, output });\n decrement('parens');\n };\n\n /**\n * Fast paths\n */\n\n if (opts.fastpaths !== false && !/(^[*!]|[/()[\\]{}\"])/.test(input)) {\n let backslashes = false;\n\n let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => {\n if (first === '\\\\') {\n backslashes = true;\n return m;\n }\n\n if (first === '?') {\n if (esc) {\n return esc + first + (rest ? QMARK.repeat(rest.length) : '');\n }\n if (index === 0) {\n return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : '');\n }\n return QMARK.repeat(chars.length);\n }\n\n if (first === '.') {\n return DOT_LITERAL.repeat(chars.length);\n }\n\n if (first === '*') {\n if (esc) {\n return esc + first + (rest ? star : '');\n }\n return star;\n }\n return esc ? m : `\\\\${m}`;\n });\n\n if (backslashes === true) {\n if (opts.unescape === true) {\n output = output.replace(/\\\\/g, '');\n } else {\n output = output.replace(/\\\\+/g, m => {\n return m.length % 2 === 0 ? '\\\\\\\\' : (m ? '\\\\' : '');\n });\n }\n }\n\n if (output === input && opts.contains === true) {\n state.output = input;\n return state;\n }\n\n state.output = utils.wrapOutput(output, state, options);\n return state;\n }\n\n /**\n * Tokenize input until we reach end-of-string\n */\n\n while (!eos()) {\n value = advance();\n\n if (value === '\\u0000') {\n continue;\n }\n\n /**\n * Escaped characters\n */\n\n if (value === '\\\\') {\n const next = peek();\n\n if (next === '/' && opts.bash !== true) {\n continue;\n }\n\n if (next === '.' || next === ';') {\n continue;\n }\n\n if (!next) {\n value += '\\\\';\n push({ type: 'text', value });\n continue;\n }\n\n // collapse slashes to reduce potential for exploits\n const match = /^\\\\+/.exec(remaining());\n let slashes = 0;\n\n if (match && match[0].length > 2) {\n slashes = match[0].length;\n state.index += slashes;\n if (slashes % 2 !== 0) {\n value += '\\\\';\n }\n }\n\n if (opts.unescape === true) {\n value = advance();\n } else {\n value += advance();\n }\n\n if (state.brackets === 0) {\n push({ type: 'text', value });\n continue;\n }\n }\n\n /**\n * If we're inside a regex character class, continue\n * until we reach the closing bracket.\n */\n\n if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) {\n if (opts.posix !== false && value === ':') {\n const inner = prev.value.slice(1);\n if (inner.includes('[')) {\n prev.posix = true;\n\n if (inner.includes(':')) {\n const idx = prev.value.lastIndexOf('[');\n const pre = prev.value.slice(0, idx);\n const rest = prev.value.slice(idx + 2);\n const posix = POSIX_REGEX_SOURCE[rest];\n if (posix) {\n prev.value = pre + posix;\n state.backtrack = true;\n advance();\n\n if (!bos.output && tokens.indexOf(prev) === 1) {\n bos.output = ONE_CHAR;\n }\n continue;\n }\n }\n }\n }\n\n if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) {\n value = `\\\\${value}`;\n }\n\n if (value === ']' && (prev.value === '[' || prev.value === '[^')) {\n value = `\\\\${value}`;\n }\n\n if (opts.posix === true && value === '!' && prev.value === '[') {\n value = '^';\n }\n\n prev.value += value;\n append({ value });\n continue;\n }\n\n /**\n * If we're inside a quoted string, continue\n * until we reach the closing double quote.\n */\n\n if (state.quotes === 1 && value !== '\"') {\n value = utils.escapeRegex(value);\n prev.value += value;\n append({ value });\n continue;\n }\n\n /**\n * Double quotes\n */\n\n if (value === '\"') {\n state.quotes = state.quotes === 1 ? 0 : 1;\n if (opts.keepQuotes === true) {\n push({ type: 'text', value });\n }\n continue;\n }\n\n /**\n * Parentheses\n */\n\n if (value === '(') {\n increment('parens');\n push({ type: 'paren', value });\n continue;\n }\n\n if (value === ')') {\n if (state.parens === 0 && opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('opening', '('));\n }\n\n const extglob = extglobs[extglobs.length - 1];\n if (extglob && state.parens === extglob.parens + 1) {\n extglobClose(extglobs.pop());\n continue;\n }\n\n push({ type: 'paren', value, output: state.parens ? ')' : '\\\\)' });\n decrement('parens');\n continue;\n }\n\n /**\n * Square brackets\n */\n\n if (value === '[') {\n if (opts.nobracket === true || !remaining().includes(']')) {\n if (opts.nobracket !== true && opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('closing', ']'));\n }\n\n value = `\\\\${value}`;\n } else {\n increment('brackets');\n }\n\n push({ type: 'bracket', value });\n continue;\n }\n\n if (value === ']') {\n if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) {\n push({ type: 'text', value, output: `\\\\${value}` });\n continue;\n }\n\n if (state.brackets === 0) {\n if (opts.strictBrackets === true) {\n throw new SyntaxError(syntaxError('opening', '['));\n }\n\n push({ type: 'text', value, output: `\\\\${value}` });\n continue;\n }\n\n decrement('brackets');\n\n const prevValue = prev.value.slice(1);\n if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) {\n value = `/${value}`;\n }\n\n prev.value += value;\n append({ value });\n\n // when literal brackets are explicitly disabled\n // assume we should match with a regex character class\n if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) {\n continue;\n }\n\n const escaped = utils.escapeRegex(prev.value);\n state.output = state.output.slice(0, -prev.value.length);\n\n // when literal brackets are explicitly enabled\n // assume we should escape the brackets to match literal characters\n if (opts.literalBrackets === true) {\n state.output += escaped;\n prev.value = escaped;\n continue;\n }\n\n // when the user specifies nothing, try to match both\n prev.value = `(${capture}${escaped}|${prev.value})`;\n state.output += prev.value;\n continue;\n }\n\n /**\n * Braces\n */\n\n if (value === '{' && opts.nobrace !== true) {\n increment('braces');\n\n const open = {\n type: 'brace',\n value,\n output: '(',\n outputIndex: state.output.length,\n tokensIndex: state.tokens.length\n };\n\n braces.push(open);\n push(open);\n continue;\n }\n\n if (value === '}') {\n const brace = braces[braces.length - 1];\n\n if (opts.nobrace === true || !brace) {\n push({ type: 'text', value, output: value });\n continue;\n }\n\n let output = ')';\n\n if (brace.dots === true) {\n const arr = tokens.slice();\n const range = [];\n\n for (let i = arr.length - 1; i >= 0; i--) {\n tokens.pop();\n if (arr[i].type === 'brace') {\n break;\n }\n if (arr[i].type !== 'dots') {\n range.unshift(arr[i].value);\n }\n }\n\n output = expandRange(range, opts);\n state.backtrack = true;\n }\n\n if (brace.comma !== true && brace.dots !== true) {\n const out = state.output.slice(0, brace.outputIndex);\n const toks = state.tokens.slice(brace.tokensIndex);\n brace.value = brace.output = '\\\\{';\n value = output = '\\\\}';\n state.output = out;\n for (const t of toks) {\n state.output += (t.output || t.value);\n }\n }\n\n push({ type: 'brace', value, output });\n decrement('braces');\n braces.pop();\n continue;\n }\n\n /**\n * Pipes\n */\n\n if (value === '|') {\n if (extglobs.length > 0) {\n extglobs[extglobs.length - 1].conditions++;\n }\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Commas\n */\n\n if (value === ',') {\n let output = value;\n\n const brace = braces[braces.length - 1];\n if (brace && stack[stack.length - 1] === 'braces') {\n brace.comma = true;\n output = '|';\n }\n\n push({ type: 'comma', value, output });\n continue;\n }\n\n /**\n * Slashes\n */\n\n if (value === '/') {\n // if the beginning of the glob is \"./\", advance the start\n // to the current index, and don't add the \"./\" characters\n // to the state. This greatly simplifies lookbehinds when\n // checking for BOS characters like \"!\" and \".\" (not \"./\")\n if (prev.type === 'dot' && state.index === state.start + 1) {\n state.start = state.index + 1;\n state.consumed = '';\n state.output = '';\n tokens.pop();\n prev = bos; // reset \"prev\" to the first token\n continue;\n }\n\n push({ type: 'slash', value, output: SLASH_LITERAL });\n continue;\n }\n\n /**\n * Dots\n */\n\n if (value === '.') {\n if (state.braces > 0 && prev.type === 'dot') {\n if (prev.value === '.') prev.output = DOT_LITERAL;\n const brace = braces[braces.length - 1];\n prev.type = 'dots';\n prev.output += value;\n prev.value += value;\n brace.dots = true;\n continue;\n }\n\n if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') {\n push({ type: 'text', value, output: DOT_LITERAL });\n continue;\n }\n\n push({ type: 'dot', value, output: DOT_LITERAL });\n continue;\n }\n\n /**\n * Question marks\n */\n\n if (value === '?') {\n const isGroup = prev && prev.value === '(';\n if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n extglobOpen('qmark', value);\n continue;\n }\n\n if (prev && prev.type === 'paren') {\n const next = peek();\n let output = value;\n\n if (next === '<' && !utils.supportsLookbehinds()) {\n throw new Error('Node.js v10 or higher is required for regex lookbehinds');\n }\n\n if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\\w+>)/.test(remaining()))) {\n output = `\\\\${value}`;\n }\n\n push({ type: 'text', value, output });\n continue;\n }\n\n if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) {\n push({ type: 'qmark', value, output: QMARK_NO_DOT });\n continue;\n }\n\n push({ type: 'qmark', value, output: QMARK });\n continue;\n }\n\n /**\n * Exclamation\n */\n\n if (value === '!') {\n if (opts.noextglob !== true && peek() === '(') {\n if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) {\n extglobOpen('negate', value);\n continue;\n }\n }\n\n if (opts.nonegate !== true && state.index === 0) {\n negate();\n continue;\n }\n }\n\n /**\n * Plus\n */\n\n if (value === '+') {\n if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n extglobOpen('plus', value);\n continue;\n }\n\n if ((prev && prev.value === '(') || opts.regex === false) {\n push({ type: 'plus', value, output: PLUS_LITERAL });\n continue;\n }\n\n if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) {\n push({ type: 'plus', value });\n continue;\n }\n\n push({ type: 'plus', value: PLUS_LITERAL });\n continue;\n }\n\n /**\n * Plain text\n */\n\n if (value === '@') {\n if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') {\n push({ type: 'at', extglob: true, value, output: '' });\n continue;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Plain text\n */\n\n if (value !== '*') {\n if (value === '$' || value === '^') {\n value = `\\\\${value}`;\n }\n\n const match = REGEX_NON_SPECIAL_CHARS.exec(remaining());\n if (match) {\n value += match[0];\n state.index += match[0].length;\n }\n\n push({ type: 'text', value });\n continue;\n }\n\n /**\n * Stars\n */\n\n if (prev && (prev.type === 'globstar' || prev.star === true)) {\n prev.type = 'star';\n prev.star = true;\n prev.value += value;\n prev.output = star;\n state.backtrack = true;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n let rest = remaining();\n if (opts.noextglob !== true && /^\\([^?]/.test(rest)) {\n extglobOpen('star', value);\n continue;\n }\n\n if (prev.type === 'star') {\n if (opts.noglobstar === true) {\n consume(value);\n continue;\n }\n\n const prior = prev.prev;\n const before = prior.prev;\n const isStart = prior.type === 'slash' || prior.type === 'bos';\n const afterStar = before && (before.type === 'star' || before.type === 'globstar');\n\n if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) {\n push({ type: 'star', value, output: '' });\n continue;\n }\n\n const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace');\n const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren');\n if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) {\n push({ type: 'star', value, output: '' });\n continue;\n }\n\n // strip consecutive `/**/`\n while (rest.slice(0, 3) === '/**') {\n const after = input[state.index + 4];\n if (after && after !== '/') {\n break;\n }\n rest = rest.slice(3);\n consume('/**', 3);\n }\n\n if (prior.type === 'bos' && eos()) {\n prev.type = 'globstar';\n prev.value += value;\n prev.output = globstar(opts);\n state.output = prev.output;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) {\n state.output = state.output.slice(0, -(prior.output + prev.output).length);\n prior.output = `(?:${prior.output}`;\n\n prev.type = 'globstar';\n prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)');\n prev.value += value;\n state.globstar = true;\n state.output += prior.output + prev.output;\n consume(value);\n continue;\n }\n\n if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') {\n const end = rest[1] !== void 0 ? '|$' : '';\n\n state.output = state.output.slice(0, -(prior.output + prev.output).length);\n prior.output = `(?:${prior.output}`;\n\n prev.type = 'globstar';\n prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`;\n prev.value += value;\n\n state.output += prior.output + prev.output;\n state.globstar = true;\n\n consume(value + advance());\n\n push({ type: 'slash', value: '/', output: '' });\n continue;\n }\n\n if (prior.type === 'bos' && rest[0] === '/') {\n prev.type = 'globstar';\n prev.value += value;\n prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`;\n state.output = prev.output;\n state.globstar = true;\n consume(value + advance());\n push({ type: 'slash', value: '/', output: '' });\n continue;\n }\n\n // remove single star from output\n state.output = state.output.slice(0, -prev.output.length);\n\n // reset previous token to globstar\n prev.type = 'globstar';\n prev.output = globstar(opts);\n prev.value += value;\n\n // reset output with globstar\n state.output += prev.output;\n state.globstar = true;\n consume(value);\n continue;\n }\n\n const token = { type: 'star', value, output: star };\n\n if (opts.bash === true) {\n token.output = '.*?';\n if (prev.type === 'bos' || prev.type === 'slash') {\n token.output = nodot + token.output;\n }\n push(token);\n continue;\n }\n\n if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) {\n token.output = value;\n push(token);\n continue;\n }\n\n if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') {\n if (prev.type === 'dot') {\n state.output += NO_DOT_SLASH;\n prev.output += NO_DOT_SLASH;\n\n } else if (opts.dot === true) {\n state.output += NO_DOTS_SLASH;\n prev.output += NO_DOTS_SLASH;\n\n } else {\n state.output += nodot;\n prev.output += nodot;\n }\n\n if (peek() !== '*') {\n state.output += ONE_CHAR;\n prev.output += ONE_CHAR;\n }\n }\n\n push(token);\n }\n\n while (state.brackets > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']'));\n state.output = utils.escapeLast(state.output, '[');\n decrement('brackets');\n }\n\n while (state.parens > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')'));\n state.output = utils.escapeLast(state.output, '(');\n decrement('parens');\n }\n\n while (state.braces > 0) {\n if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}'));\n state.output = utils.escapeLast(state.output, '{');\n decrement('braces');\n }\n\n if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) {\n push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` });\n }\n\n // rebuild the output if we had to backtrack at any point\n if (state.backtrack === true) {\n state.output = '';\n\n for (const token of state.tokens) {\n state.output += token.output != null ? token.output : token.value;\n\n if (token.suffix) {\n state.output += token.suffix;\n }\n }\n }\n\n return state;\n};\n\n/**\n * Fast paths for creating regular expressions for common glob patterns.\n * This can significantly speed up processing and has very little downside\n * impact when none of the fast paths match.\n */\n\nparse.fastpaths = (input, options) => {\n const opts = { ...options };\n const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH;\n const len = input.length;\n if (len > max) {\n throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`);\n }\n\n input = REPLACEMENTS[input] || input;\n const win32 = utils.isWindows(options);\n\n // create constants based on platform, for windows or posix\n const {\n DOT_LITERAL,\n SLASH_LITERAL,\n ONE_CHAR,\n DOTS_SLASH,\n NO_DOT,\n NO_DOTS,\n NO_DOTS_SLASH,\n STAR,\n START_ANCHOR\n } = constants.globChars(win32);\n\n const nodot = opts.dot ? NO_DOTS : NO_DOT;\n const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT;\n const capture = opts.capture ? '' : '?:';\n const state = { negated: false, prefix: '' };\n let star = opts.bash === true ? '.*?' : STAR;\n\n if (opts.capture) {\n star = `(${star})`;\n }\n\n const globstar = opts => {\n if (opts.noglobstar === true) return star;\n return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`;\n };\n\n const create = str => {\n switch (str) {\n case '*':\n return `${nodot}${ONE_CHAR}${star}`;\n\n case '.*':\n return `${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '*.*':\n return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '*/*':\n return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`;\n\n case '**':\n return nodot + globstar(opts);\n\n case '**/*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`;\n\n case '**/*.*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n case '**/.*':\n return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`;\n\n default: {\n const match = /^(.*?)\\.(\\w+)$/.exec(str);\n if (!match) return;\n\n const source = create(match[1]);\n if (!source) return;\n\n return source + DOT_LITERAL + match[2];\n }\n }\n };\n\n const output = utils.removePrefix(input, state);\n let source = create(output);\n\n if (source && opts.strictSlashes !== true) {\n source += `${SLASH_LITERAL}?`;\n }\n\n return source;\n};\n\nmodule.exports = parse;\n", "'use strict';\n\nconst path = require('path');\nconst scan = require('./scan');\nconst parse = require('./parse');\nconst utils = require('./utils');\nconst constants = require('./constants');\nconst isObject = val => val && typeof val === 'object' && !Array.isArray(val);\n\n/**\n * Creates a matcher function from one or more glob patterns. The\n * returned function takes a string to match as its first argument,\n * and returns true if the string is a match. The returned matcher\n * function also takes a boolean as the second argument that, when true,\n * returns an object with additional information.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch(glob[, options]);\n *\n * const isMatch = picomatch('*.!(*a)');\n * console.log(isMatch('a.a')); //=> false\n * console.log(isMatch('a.b')); //=> true\n * ```\n * @name picomatch\n * @param {String|Array} `globs` One or more glob patterns.\n * @param {Object=} `options`\n * @return {Function=} Returns a matcher function.\n * @api public\n */\n\nconst picomatch = (glob, options, returnState = false) => {\n if (Array.isArray(glob)) {\n const fns = glob.map(input => picomatch(input, options, returnState));\n const arrayMatcher = str => {\n for (const isMatch of fns) {\n const state = isMatch(str);\n if (state) return state;\n }\n return false;\n };\n return arrayMatcher;\n }\n\n const isState = isObject(glob) && glob.tokens && glob.input;\n\n if (glob === '' || (typeof glob !== 'string' && !isState)) {\n throw new TypeError('Expected pattern to be a non-empty string');\n }\n\n const opts = options || {};\n const posix = utils.isWindows(options);\n const regex = isState\n ? picomatch.compileRe(glob, options)\n : picomatch.makeRe(glob, options, false, true);\n\n const state = regex.state;\n delete regex.state;\n\n let isIgnored = () => false;\n if (opts.ignore) {\n const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null };\n isIgnored = picomatch(opts.ignore, ignoreOpts, returnState);\n }\n\n const matcher = (input, returnObject = false) => {\n const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix });\n const result = { glob, state, regex, posix, input, output, match, isMatch };\n\n if (typeof opts.onResult === 'function') {\n opts.onResult(result);\n }\n\n if (isMatch === false) {\n result.isMatch = false;\n return returnObject ? result : false;\n }\n\n if (isIgnored(input)) {\n if (typeof opts.onIgnore === 'function') {\n opts.onIgnore(result);\n }\n result.isMatch = false;\n return returnObject ? result : false;\n }\n\n if (typeof opts.onMatch === 'function') {\n opts.onMatch(result);\n }\n return returnObject ? result : true;\n };\n\n if (returnState) {\n matcher.state = state;\n }\n\n return matcher;\n};\n\n/**\n * Test `input` with the given `regex`. This is used by the main\n * `picomatch()` function to test the input string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.test(input, regex[, options]);\n *\n * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\\/([^/]*?))$/));\n * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' }\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp} `regex`\n * @return {Object} Returns an object with matching info.\n * @api public\n */\n\npicomatch.test = (input, regex, options, { glob, posix } = {}) => {\n if (typeof input !== 'string') {\n throw new TypeError('Expected input to be a string');\n }\n\n if (input === '') {\n return { isMatch: false, output: '' };\n }\n\n const opts = options || {};\n const format = opts.format || (posix ? utils.toPosixSlashes : null);\n let match = input === glob;\n let output = (match && format) ? format(input) : input;\n\n if (match === false) {\n output = format ? format(input) : input;\n match = output === glob;\n }\n\n if (match === false || opts.capture === true) {\n if (opts.matchBase === true || opts.basename === true) {\n match = picomatch.matchBase(input, regex, options, posix);\n } else {\n match = regex.exec(output);\n }\n }\n\n return { isMatch: Boolean(match), match, output };\n};\n\n/**\n * Match the basename of a filepath.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.matchBase(input, glob[, options]);\n * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true\n * ```\n * @param {String} `input` String to test.\n * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe).\n * @return {Boolean}\n * @api public\n */\n\npicomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => {\n const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options);\n return regex.test(path.basename(input));\n};\n\n/**\n * Returns true if **any** of the given glob `patterns` match the specified `string`.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.isMatch(string, patterns[, options]);\n *\n * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true\n * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false\n * ```\n * @param {String|Array} str The string to test.\n * @param {String|Array} patterns One or more glob patterns to use for matching.\n * @param {Object} [options] See available [options](#options).\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\npicomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);\n\n/**\n * Parse a glob pattern to create the source string for a regular\n * expression.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const result = picomatch.parse(pattern[, options]);\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {Object} Returns an object with useful properties and output to be used as a regex source string.\n * @api public\n */\n\npicomatch.parse = (pattern, options) => {\n if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options));\n return parse(pattern, { ...options, fastpaths: false });\n};\n\n/**\n * Scan a glob pattern to separate the pattern into segments.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.scan(input[, options]);\n *\n * const result = picomatch.scan('!./foo/*.js');\n * console.log(result);\n * { prefix: '!./',\n * input: '!./foo/*.js',\n * start: 3,\n * base: 'foo',\n * glob: '*.js',\n * isBrace: false,\n * isBracket: false,\n * isGlob: true,\n * isExtglob: false,\n * isGlobstar: false,\n * negated: true }\n * ```\n * @param {String} `input` Glob pattern to scan.\n * @param {Object} `options`\n * @return {Object} Returns an object with\n * @api public\n */\n\npicomatch.scan = (input, options) => scan(input, options);\n\n/**\n * Compile a regular expression from the `state` object returned by the\n * [parse()](#parse) method.\n *\n * @param {Object} `state`\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Intended for implementors, this argument allows you to return the raw output from the parser.\n * @param {Boolean} `returnState` Adds the state to a `state` property on the returned regex. Useful for implementors and debugging.\n * @return {RegExp}\n * @api public\n */\n\npicomatch.compileRe = (state, options, returnOutput = false, returnState = false) => {\n if (returnOutput === true) {\n return state.output;\n }\n\n const opts = options || {};\n const prepend = opts.contains ? '' : '^';\n const append = opts.contains ? '' : '$';\n\n let source = `${prepend}(?:${state.output})${append}`;\n if (state && state.negated === true) {\n source = `^(?!${source}).*$`;\n }\n\n const regex = picomatch.toRegex(source, options);\n if (returnState === true) {\n regex.state = state;\n }\n\n return regex;\n};\n\n/**\n * Create a regular expression from a parsed glob pattern.\n *\n * ```js\n * const picomatch = require('picomatch');\n * const state = picomatch.parse('*.js');\n * // picomatch.compileRe(state[, options]);\n *\n * console.log(picomatch.compileRe(state));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `state` The object returned from the `.parse` method.\n * @param {Object} `options`\n * @param {Boolean} `returnOutput` Implementors may use this argument to return the compiled output, instead of a regular expression. This is not exposed on the options to prevent end-users from mutating the result.\n * @param {Boolean} `returnState` Implementors may use this argument to return the state from the parsed glob with the returned regular expression.\n * @return {RegExp} Returns a regex created from the given pattern.\n * @api public\n */\n\npicomatch.makeRe = (input, options = {}, returnOutput = false, returnState = false) => {\n if (!input || typeof input !== 'string') {\n throw new TypeError('Expected a non-empty string');\n }\n\n let parsed = { negated: false, fastpaths: true };\n\n if (options.fastpaths !== false && (input[0] === '.' || input[0] === '*')) {\n parsed.output = parse.fastpaths(input, options);\n }\n\n if (!parsed.output) {\n parsed = parse(input, options);\n }\n\n return picomatch.compileRe(parsed, options, returnOutput, returnState);\n};\n\n/**\n * Create a regular expression from the given regex source string.\n *\n * ```js\n * const picomatch = require('picomatch');\n * // picomatch.toRegex(source[, options]);\n *\n * const { output } = picomatch.parse('*.js');\n * console.log(picomatch.toRegex(output));\n * //=> /^(?:(?!\\.)(?=.)[^/]*?\\.js)$/\n * ```\n * @param {String} `source` Regular expression source string.\n * @param {Object} `options`\n * @return {RegExp}\n * @api public\n */\n\npicomatch.toRegex = (source, options) => {\n try {\n const opts = options || {};\n return new RegExp(source, opts.flags || (opts.nocase ? 'i' : ''));\n } catch (err) {\n if (options && options.debug === true) throw err;\n return /$^/;\n }\n};\n\n/**\n * Picomatch constants.\n * @return {Object}\n */\n\npicomatch.constants = constants;\n\n/**\n * Expose \"picomatch\"\n */\n\nmodule.exports = picomatch;\n", "'use strict';\n\nmodule.exports = require('./lib/picomatch');\n", "'use strict';\n\nconst util = require('util');\nconst braces = require('braces');\nconst picomatch = require('picomatch');\nconst utils = require('picomatch/lib/utils');\nconst isEmptyString = val => val === '' || val === './';\n\n/**\n * Returns an array of strings that match one or more glob patterns.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm(list, patterns[, options]);\n *\n * console.log(mm(['a.js', 'a.txt'], ['*.js']));\n * //=> [ 'a.js' ]\n * ```\n * @param {String|Array<string>} `list` List of strings to match.\n * @param {String|Array<string>} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options)\n * @return {Array} Returns an array of matches\n * @summary false\n * @api public\n */\n\nconst micromatch = (list, patterns, options) => {\n patterns = [].concat(patterns);\n list = [].concat(list);\n\n let omit = new Set();\n let keep = new Set();\n let items = new Set();\n let negatives = 0;\n\n let onResult = state => {\n items.add(state.output);\n if (options && options.onResult) {\n options.onResult(state);\n }\n };\n\n for (let i = 0; i < patterns.length; i++) {\n let isMatch = picomatch(String(patterns[i]), { ...options, onResult }, true);\n let negated = isMatch.state.negated || isMatch.state.negatedExtglob;\n if (negated) negatives++;\n\n for (let item of list) {\n let matched = isMatch(item, true);\n\n let match = negated ? !matched.isMatch : matched.isMatch;\n if (!match) continue;\n\n if (negated) {\n omit.add(matched.output);\n } else {\n omit.delete(matched.output);\n keep.add(matched.output);\n }\n }\n }\n\n let result = negatives === patterns.length ? [...items] : [...keep];\n let matches = result.filter(item => !omit.has(item));\n\n if (options && matches.length === 0) {\n if (options.failglob === true) {\n throw new Error(`No matches found for \"${patterns.join(', ')}\"`);\n }\n\n if (options.nonull === true || options.nullglob === true) {\n return options.unescape ? patterns.map(p => p.replace(/\\\\/g, '')) : patterns;\n }\n }\n\n return matches;\n};\n\n/**\n * Backwards compatibility\n */\n\nmicromatch.match = micromatch;\n\n/**\n * Returns a matcher function from the given glob `pattern` and `options`.\n * The returned function takes a string to match as its only argument and returns\n * true if the string is a match.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.matcher(pattern[, options]);\n *\n * const isMatch = mm.matcher('*.!(*a)');\n * console.log(isMatch('a.a')); //=> false\n * console.log(isMatch('a.b')); //=> true\n * ```\n * @param {String} `pattern` Glob pattern\n * @param {Object} `options`\n * @return {Function} Returns a matcher function.\n * @api public\n */\n\nmicromatch.matcher = (pattern, options) => picomatch(pattern, options);\n\n/**\n * Returns true if **any** of the given glob `patterns` match the specified `string`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.isMatch(string, patterns[, options]);\n *\n * console.log(mm.isMatch('a.a', ['b.*', '*.a'])); //=> true\n * console.log(mm.isMatch('a.a', 'b.*')); //=> false\n * ```\n * @param {String} `str` The string to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `[options]` See available [options](#options).\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nmicromatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str);\n\n/**\n * Backwards compatibility\n */\n\nmicromatch.any = micromatch.isMatch;\n\n/**\n * Returns a list of strings that _**do not match any**_ of the given `patterns`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.not(list, patterns[, options]);\n *\n * console.log(mm.not(['a.a', 'b.b', 'c.c'], '*.a'));\n * //=> ['b.b', 'c.c']\n * ```\n * @param {Array} `list` Array of strings to match.\n * @param {String|Array} `patterns` One or more glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Array} Returns an array of strings that **do not match** the given patterns.\n * @api public\n */\n\nmicromatch.not = (list, patterns, options = {}) => {\n patterns = [].concat(patterns).map(String);\n let result = new Set();\n let items = [];\n\n let onResult = state => {\n if (options.onResult) options.onResult(state);\n items.push(state.output);\n };\n\n let matches = new Set(micromatch(list, patterns, { ...options, onResult }));\n\n for (let item of items) {\n if (!matches.has(item)) {\n result.add(item);\n }\n }\n return [...result];\n};\n\n/**\n * Returns true if the given `string` contains the given pattern. Similar\n * to [.isMatch](#isMatch) but the pattern can match any part of the string.\n *\n * ```js\n * var mm = require('micromatch');\n * // mm.contains(string, pattern[, options]);\n *\n * console.log(mm.contains('aa/bb/cc', '*b'));\n * //=> true\n * console.log(mm.contains('aa/bb/cc', '*d'));\n * //=> false\n * ```\n * @param {String} `str` The string to match.\n * @param {String|Array} `patterns` Glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any of the patterns matches any part of `str`.\n * @api public\n */\n\nmicromatch.contains = (str, pattern, options) => {\n if (typeof str !== 'string') {\n throw new TypeError(`Expected a string: \"${util.inspect(str)}\"`);\n }\n\n if (Array.isArray(pattern)) {\n return pattern.some(p => micromatch.contains(str, p, options));\n }\n\n if (typeof pattern === 'string') {\n if (isEmptyString(str) || isEmptyString(pattern)) {\n return false;\n }\n\n if (str.includes(pattern) || (str.startsWith('./') && str.slice(2).includes(pattern))) {\n return true;\n }\n }\n\n return micromatch.isMatch(str, pattern, { ...options, contains: true });\n};\n\n/**\n * Filter the keys of the given object with the given `glob` pattern\n * and `options`. Does not attempt to match nested keys. If you need this feature,\n * use [glob-object][] instead.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.matchKeys(object, patterns[, options]);\n *\n * const obj = { aa: 'a', ab: 'b', ac: 'c' };\n * console.log(mm.matchKeys(obj, '*b'));\n * //=> { ab: 'b' }\n * ```\n * @param {Object} `object` The object with keys to filter.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Object} Returns an object with only keys that match the given patterns.\n * @api public\n */\n\nmicromatch.matchKeys = (obj, patterns, options) => {\n if (!utils.isObject(obj)) {\n throw new TypeError('Expected the first argument to be an object');\n }\n let keys = micromatch(Object.keys(obj), patterns, options);\n let res = {};\n for (let key of keys) res[key] = obj[key];\n return res;\n};\n\n/**\n * Returns true if some of the strings in the given `list` match any of the given glob `patterns`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.some(list, patterns[, options]);\n *\n * console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js']));\n * // true\n * console.log(mm.some(['foo.js'], ['*.js', '!foo.js']));\n * // false\n * ```\n * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any `patterns` matches any of the strings in `list`\n * @api public\n */\n\nmicromatch.some = (list, patterns, options) => {\n let items = [].concat(list);\n\n for (let pattern of [].concat(patterns)) {\n let isMatch = picomatch(String(pattern), options);\n if (items.some(item => isMatch(item))) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * Returns true if every string in the given `list` matches\n * any of the given glob `patterns`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.every(list, patterns[, options]);\n *\n * console.log(mm.every('foo.js', ['foo.js']));\n * // true\n * console.log(mm.every(['foo.js', 'bar.js'], ['*.js']));\n * // true\n * console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js']));\n * // false\n * console.log(mm.every(['foo.js'], ['*.js', '!foo.js']));\n * // false\n * ```\n * @param {String|Array} `list` The string or array of strings to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if all `patterns` matches all of the strings in `list`\n * @api public\n */\n\nmicromatch.every = (list, patterns, options) => {\n let items = [].concat(list);\n\n for (let pattern of [].concat(patterns)) {\n let isMatch = picomatch(String(pattern), options);\n if (!items.every(item => isMatch(item))) {\n return false;\n }\n }\n return true;\n};\n\n/**\n * Returns true if **all** of the given `patterns` match\n * the specified string.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.all(string, patterns[, options]);\n *\n * console.log(mm.all('foo.js', ['foo.js']));\n * // true\n *\n * console.log(mm.all('foo.js', ['*.js', '!foo.js']));\n * // false\n *\n * console.log(mm.all('foo.js', ['*.js', 'foo.js']));\n * // true\n *\n * console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js']));\n * // true\n * ```\n * @param {String|Array} `str` The string to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nmicromatch.all = (str, patterns, options) => {\n if (typeof str !== 'string') {\n throw new TypeError(`Expected a string: \"${util.inspect(str)}\"`);\n }\n\n return [].concat(patterns).every(p => picomatch(p, options)(str));\n};\n\n/**\n * Returns an array of matches captured by `pattern` in `string, or `null` if the pattern did not match.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.capture(pattern, string[, options]);\n *\n * console.log(mm.capture('test/*.js', 'test/foo.js'));\n * //=> ['foo']\n * console.log(mm.capture('test/*.js', 'foo/bar.css'));\n * //=> null\n * ```\n * @param {String} `glob` Glob pattern to use for matching.\n * @param {String} `input` String to match\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Array|null} Returns an array of captures if the input matches the glob pattern, otherwise `null`.\n * @api public\n */\n\nmicromatch.capture = (glob, input, options) => {\n let posix = utils.isWindows(options);\n let regex = picomatch.makeRe(String(glob), { ...options, capture: true });\n let match = regex.exec(posix ? utils.toPosixSlashes(input) : input);\n\n if (match) {\n return match.slice(1).map(v => v === void 0 ? '' : v);\n }\n};\n\n/**\n * Create a regular expression from the given glob `pattern`.\n *\n * ```js\n * const mm = require('micromatch');\n * // mm.makeRe(pattern[, options]);\n *\n * console.log(mm.makeRe('*.js'));\n * //=> /^(?:(\\.[\\\\\\/])?(?!\\.)(?=.)[^\\/]*?\\.js)$/\n * ```\n * @param {String} `pattern` A glob pattern to convert to regex.\n * @param {Object} `options`\n * @return {RegExp} Returns a regex created from the given pattern.\n * @api public\n */\n\nmicromatch.makeRe = (...args) => picomatch.makeRe(...args);\n\n/**\n * Scan a glob pattern to separate the pattern into segments. Used\n * by the [split](#split) method.\n *\n * ```js\n * const mm = require('micromatch');\n * const state = mm.scan(pattern[, options]);\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {Object} Returns an object with\n * @api public\n */\n\nmicromatch.scan = (...args) => picomatch.scan(...args);\n\n/**\n * Parse a glob pattern to create the source string for a regular\n * expression.\n *\n * ```js\n * const mm = require('micromatch');\n * const state = mm.parse(pattern[, options]);\n * ```\n * @param {String} `glob`\n * @param {Object} `options`\n * @return {Object} Returns an object with useful properties and output to be used as regex source string.\n * @api public\n */\n\nmicromatch.parse = (patterns, options) => {\n let res = [];\n for (let pattern of [].concat(patterns || [])) {\n for (let str of braces(String(pattern), options)) {\n res.push(picomatch.parse(str, options));\n }\n }\n return res;\n};\n\n/**\n * Process the given brace `pattern`.\n *\n * ```js\n * const { braces } = require('micromatch');\n * console.log(braces('foo/{a,b,c}/bar'));\n * //=> [ 'foo/(a|b|c)/bar' ]\n *\n * console.log(braces('foo/{a,b,c}/bar', { expand: true }));\n * //=> [ 'foo/a/bar', 'foo/b/bar', 'foo/c/bar' ]\n * ```\n * @param {String} `pattern` String with brace pattern to process.\n * @param {Object} `options` Any [options](#options) to change how expansion is performed. See the [braces][] library for all available options.\n * @return {Array}\n * @api public\n */\n\nmicromatch.braces = (pattern, options) => {\n if (typeof pattern !== 'string') throw new TypeError('Expected a string');\n if ((options && options.nobrace === true) || !/\\{.*\\}/.test(pattern)) {\n return [pattern];\n }\n return braces(pattern, options);\n};\n\n/**\n * Expand braces\n */\n\nmicromatch.braceExpand = (pattern, options) => {\n if (typeof pattern !== 'string') throw new TypeError('Expected a string');\n return micromatch.braces(pattern, { ...options, expand: true });\n};\n\n/**\n * Expose micromatch\n */\n\nmodule.exports = micromatch;\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.matchAny = exports.convertPatternsToRe = exports.makeRe = exports.getPatternParts = exports.expandBraceExpansion = exports.expandPatternsWithBraceExpansion = exports.isAffectDepthOfReadingPattern = exports.endsWithSlashGlobStar = exports.hasGlobStar = exports.getBaseDirectory = exports.isPatternRelatedToParentDirectory = exports.getPatternsOutsideCurrentDirectory = exports.getPatternsInsideCurrentDirectory = exports.getPositivePatterns = exports.getNegativePatterns = exports.isPositivePattern = exports.isNegativePattern = exports.convertToNegativePattern = exports.convertToPositivePattern = exports.isDynamicPattern = exports.isStaticPattern = void 0;\r\nconst path = require(\"path\");\r\nconst globParent = require(\"glob-parent\");\r\nconst micromatch = require(\"micromatch\");\r\nconst GLOBSTAR = '**';\r\nconst ESCAPE_SYMBOL = '\\\\';\r\nconst COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/;\r\nconst REGEX_CHARACTER_CLASS_SYMBOLS_RE = /\\[[^[]*]/;\r\nconst REGEX_GROUP_SYMBOLS_RE = /(?:^|[^!*+?@])\\([^(]*\\|[^|]*\\)/;\r\nconst GLOB_EXTENSION_SYMBOLS_RE = /[!*+?@]\\([^(]*\\)/;\r\nconst BRACE_EXPANSION_SEPARATORS_RE = /,|\\.\\./;\r\nfunction isStaticPattern(pattern, options = {}) {\r\n return !isDynamicPattern(pattern, options);\r\n}\r\nexports.isStaticPattern = isStaticPattern;\r\nfunction isDynamicPattern(pattern, options = {}) {\r\n /**\r\n * A special case with an empty string is necessary for matching patterns that start with a forward slash.\r\n * An empty string cannot be a dynamic pattern.\r\n * For example, the pattern `/lib/*` will be spread into parts: '', 'lib', '*'.\r\n */\r\n if (pattern === '') {\r\n return false;\r\n }\r\n /**\r\n * When the `caseSensitiveMatch` option is disabled, all patterns must be marked as dynamic, because we cannot check\r\n * filepath directly (without read directory).\r\n */\r\n if (options.caseSensitiveMatch === false || pattern.includes(ESCAPE_SYMBOL)) {\r\n return true;\r\n }\r\n if (COMMON_GLOB_SYMBOLS_RE.test(pattern) || REGEX_CHARACTER_CLASS_SYMBOLS_RE.test(pattern) || REGEX_GROUP_SYMBOLS_RE.test(pattern)) {\r\n return true;\r\n }\r\n if (options.extglob !== false && GLOB_EXTENSION_SYMBOLS_RE.test(pattern)) {\r\n return true;\r\n }\r\n if (options.braceExpansion !== false && hasBraceExpansion(pattern)) {\r\n return true;\r\n }\r\n return false;\r\n}\r\nexports.isDynamicPattern = isDynamicPattern;\r\nfunction hasBraceExpansion(pattern) {\r\n const openingBraceIndex = pattern.indexOf('{');\r\n if (openingBraceIndex === -1) {\r\n return false;\r\n }\r\n const closingBraceIndex = pattern.indexOf('}', openingBraceIndex + 1);\r\n if (closingBraceIndex === -1) {\r\n return false;\r\n }\r\n const braceContent = pattern.slice(openingBraceIndex, closingBraceIndex);\r\n return BRACE_EXPANSION_SEPARATORS_RE.test(braceContent);\r\n}\r\nfunction convertToPositivePattern(pattern) {\r\n return isNegativePattern(pattern) ? pattern.slice(1) : pattern;\r\n}\r\nexports.convertToPositivePattern = convertToPositivePattern;\r\nfunction convertToNegativePattern(pattern) {\r\n return '!' + pattern;\r\n}\r\nexports.convertToNegativePattern = convertToNegativePattern;\r\nfunction isNegativePattern(pattern) {\r\n return pattern.startsWith('!') && pattern[1] !== '(';\r\n}\r\nexports.isNegativePattern = isNegativePattern;\r\nfunction isPositivePattern(pattern) {\r\n return !isNegativePattern(pattern);\r\n}\r\nexports.isPositivePattern = isPositivePattern;\r\nfunction getNegativePatterns(patterns) {\r\n return patterns.filter(isNegativePattern);\r\n}\r\nexports.getNegativePatterns = getNegativePatterns;\r\nfunction getPositivePatterns(patterns) {\r\n return patterns.filter(isPositivePattern);\r\n}\r\nexports.getPositivePatterns = getPositivePatterns;\r\n/**\r\n * Returns patterns that can be applied inside the current directory.\r\n *\r\n * @example\r\n * // ['./*', '*', 'a/*']\r\n * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*'])\r\n */\r\nfunction getPatternsInsideCurrentDirectory(patterns) {\r\n return patterns.filter((pattern) => !isPatternRelatedToParentDirectory(pattern));\r\n}\r\nexports.getPatternsInsideCurrentDirectory = getPatternsInsideCurrentDirectory;\r\n/**\r\n * Returns patterns to be expanded relative to (outside) the current directory.\r\n *\r\n * @example\r\n * // ['../*', './../*']\r\n * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*'])\r\n */\r\nfunction getPatternsOutsideCurrentDirectory(patterns) {\r\n return patterns.filter(isPatternRelatedToParentDirectory);\r\n}\r\nexports.getPatternsOutsideCurrentDirectory = getPatternsOutsideCurrentDirectory;\r\nfunction isPatternRelatedToParentDirectory(pattern) {\r\n return pattern.startsWith('..') || pattern.startsWith('./..');\r\n}\r\nexports.isPatternRelatedToParentDirectory = isPatternRelatedToParentDirectory;\r\nfunction getBaseDirectory(pattern) {\r\n return globParent(pattern, { flipBackslashes: false });\r\n}\r\nexports.getBaseDirectory = getBaseDirectory;\r\nfunction hasGlobStar(pattern) {\r\n return pattern.includes(GLOBSTAR);\r\n}\r\nexports.hasGlobStar = hasGlobStar;\r\nfunction endsWithSlashGlobStar(pattern) {\r\n return pattern.endsWith('/' + GLOBSTAR);\r\n}\r\nexports.endsWithSlashGlobStar = endsWithSlashGlobStar;\r\nfunction isAffectDepthOfReadingPattern(pattern) {\r\n const basename = path.basename(pattern);\r\n return endsWithSlashGlobStar(pattern) || isStaticPattern(basename);\r\n}\r\nexports.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern;\r\nfunction expandPatternsWithBraceExpansion(patterns) {\r\n return patterns.reduce((collection, pattern) => {\r\n return collection.concat(expandBraceExpansion(pattern));\r\n }, []);\r\n}\r\nexports.expandPatternsWithBraceExpansion = expandPatternsWithBraceExpansion;\r\nfunction expandBraceExpansion(pattern) {\r\n return micromatch.braces(pattern, {\r\n expand: true,\r\n nodupes: true\r\n });\r\n}\r\nexports.expandBraceExpansion = expandBraceExpansion;\r\nfunction getPatternParts(pattern, options) {\r\n let { parts } = micromatch.scan(pattern, Object.assign(Object.assign({}, options), { parts: true }));\r\n /**\r\n * The scan method returns an empty array in some cases.\r\n * See micromatch/picomatch#58 for more details.\r\n */\r\n if (parts.length === 0) {\r\n parts = [pattern];\r\n }\r\n /**\r\n * The scan method does not return an empty part for the pattern with a forward slash.\r\n * This is another part of micromatch/picomatch#58.\r\n */\r\n if (parts[0].startsWith('/')) {\r\n parts[0] = parts[0].slice(1);\r\n parts.unshift('');\r\n }\r\n return parts;\r\n}\r\nexports.getPatternParts = getPatternParts;\r\nfunction makeRe(pattern, options) {\r\n return micromatch.makeRe(pattern, options);\r\n}\r\nexports.makeRe = makeRe;\r\nfunction convertPatternsToRe(patterns, options) {\r\n return patterns.map((pattern) => makeRe(pattern, options));\r\n}\r\nexports.convertPatternsToRe = convertPatternsToRe;\r\nfunction matchAny(entry, patternsRe) {\r\n return patternsRe.some((patternRe) => patternRe.test(entry));\r\n}\r\nexports.matchAny = matchAny;\r\n", "'use strict'\n/*\n * merge2\n * https://github.com/teambition/merge2\n *\n * Copyright (c) 2014-2020 Teambition\n * Licensed under the MIT license.\n */\nconst Stream = require('stream')\nconst PassThrough = Stream.PassThrough\nconst slice = Array.prototype.slice\n\nmodule.exports = merge2\n\nfunction merge2 () {\n const streamsQueue = []\n const args = slice.call(arguments)\n let merging = false\n let options = args[args.length - 1]\n\n if (options && !Array.isArray(options) && options.pipe == null) {\n args.pop()\n } else {\n options = {}\n }\n\n const doEnd = options.end !== false\n const doPipeError = options.pipeError === true\n if (options.objectMode == null) {\n options.objectMode = true\n }\n if (options.highWaterMark == null) {\n options.highWaterMark = 64 * 1024\n }\n const mergedStream = PassThrough(options)\n\n function addStream () {\n for (let i = 0, len = arguments.length; i < len; i++) {\n streamsQueue.push(pauseStreams(arguments[i], options))\n }\n mergeStream()\n return this\n }\n\n function mergeStream () {\n if (merging) {\n return\n }\n merging = true\n\n let streams = streamsQueue.shift()\n if (!streams) {\n process.nextTick(endStream)\n return\n }\n if (!Array.isArray(streams)) {\n streams = [streams]\n }\n\n let pipesCount = streams.length + 1\n\n function next () {\n if (--pipesCount > 0) {\n return\n }\n merging = false\n mergeStream()\n }\n\n function pipe (stream) {\n function onend () {\n stream.removeListener('merge2UnpipeEnd', onend)\n stream.removeListener('end', onend)\n if (doPipeError) {\n stream.removeListener('error', onerror)\n }\n next()\n }\n function onerror (err) {\n mergedStream.emit('error', err)\n }\n // skip ended stream\n if (stream._readableState.endEmitted) {\n return next()\n }\n\n stream.on('merge2UnpipeEnd', onend)\n stream.on('end', onend)\n\n if (doPipeError) {\n stream.on('error', onerror)\n }\n\n stream.pipe(mergedStream, { end: false })\n // compatible for old stream\n stream.resume()\n }\n\n for (let i = 0; i < streams.length; i++) {\n pipe(streams[i])\n }\n\n next()\n }\n\n function endStream () {\n merging = false\n // emit 'queueDrain' when all streams merged.\n mergedStream.emit('queueDrain')\n if (doEnd) {\n mergedStream.end()\n }\n }\n\n mergedStream.setMaxListeners(0)\n mergedStream.add = addStream\n mergedStream.on('unpipe', function (stream) {\n stream.emit('merge2UnpipeEnd')\n })\n\n if (args.length) {\n addStream.apply(null, args)\n }\n return mergedStream\n}\n\n// check and pause streams for pipe.\nfunction pauseStreams (streams, options) {\n if (!Array.isArray(streams)) {\n // Backwards-compat with old-style streams\n if (!streams._readableState && streams.pipe) {\n streams = streams.pipe(PassThrough(options))\n }\n if (!streams._readableState || !streams.pause || !streams.pipe) {\n throw new Error('Only readable stream can be merged.')\n }\n streams.pause()\n } else {\n for (let i = 0, len = streams.length; i < len; i++) {\n streams[i] = pauseStreams(streams[i], options)\n }\n }\n return streams\n}\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.merge = void 0;\r\nconst merge2 = require(\"merge2\");\r\nfunction merge(streams) {\r\n const mergedStream = merge2(streams);\r\n streams.forEach((stream) => {\r\n stream.once('error', (error) => mergedStream.emit('error', error));\r\n });\r\n mergedStream.once('close', () => propagateCloseEventToSources(streams));\r\n mergedStream.once('end', () => propagateCloseEventToSources(streams));\r\n return mergedStream;\r\n}\r\nexports.merge = merge;\r\nfunction propagateCloseEventToSources(streams) {\r\n streams.forEach((stream) => stream.emit('close'));\r\n}\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.isEmpty = exports.isString = void 0;\r\nfunction isString(input) {\r\n return typeof input === 'string';\r\n}\r\nexports.isString = isString;\r\nfunction isEmpty(input) {\r\n return input === '';\r\n}\r\nexports.isEmpty = isEmpty;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.string = exports.stream = exports.pattern = exports.path = exports.fs = exports.errno = exports.array = void 0;\r\nconst array = require(\"./array\");\r\nexports.array = array;\r\nconst errno = require(\"./errno\");\r\nexports.errno = errno;\r\nconst fs = require(\"./fs\");\r\nexports.fs = fs;\r\nconst path = require(\"./path\");\r\nexports.path = path;\r\nconst pattern = require(\"./pattern\");\r\nexports.pattern = pattern;\r\nconst stream = require(\"./stream\");\r\nexports.stream = stream;\r\nconst string = require(\"./string\");\r\nexports.string = string;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.convertPatternGroupToTask = exports.convertPatternGroupsToTasks = exports.groupPatternsByBaseDirectory = exports.getNegativePatternsAsPositive = exports.getPositivePatterns = exports.convertPatternsToTasks = exports.generate = void 0;\r\nconst utils = require(\"../utils\");\r\nfunction generate(patterns, settings) {\r\n const positivePatterns = getPositivePatterns(patterns);\r\n const negativePatterns = getNegativePatternsAsPositive(patterns, settings.ignore);\r\n const staticPatterns = positivePatterns.filter((pattern) => utils.pattern.isStaticPattern(pattern, settings));\r\n const dynamicPatterns = positivePatterns.filter((pattern) => utils.pattern.isDynamicPattern(pattern, settings));\r\n const staticTasks = convertPatternsToTasks(staticPatterns, negativePatterns, /* dynamic */ false);\r\n const dynamicTasks = convertPatternsToTasks(dynamicPatterns, negativePatterns, /* dynamic */ true);\r\n return staticTasks.concat(dynamicTasks);\r\n}\r\nexports.generate = generate;\r\n/**\r\n * Returns tasks grouped by basic pattern directories.\r\n *\r\n * Patterns that can be found inside (`./`) and outside (`../`) the current directory are handled separately.\r\n * This is necessary because directory traversal starts at the base directory and goes deeper.\r\n */\r\nfunction convertPatternsToTasks(positive, negative, dynamic) {\r\n const tasks = [];\r\n const patternsOutsideCurrentDirectory = utils.pattern.getPatternsOutsideCurrentDirectory(positive);\r\n const patternsInsideCurrentDirectory = utils.pattern.getPatternsInsideCurrentDirectory(positive);\r\n const outsideCurrentDirectoryGroup = groupPatternsByBaseDirectory(patternsOutsideCurrentDirectory);\r\n const insideCurrentDirectoryGroup = groupPatternsByBaseDirectory(patternsInsideCurrentDirectory);\r\n tasks.push(...convertPatternGroupsToTasks(outsideCurrentDirectoryGroup, negative, dynamic));\r\n /*\r\n * For the sake of reducing future accesses to the file system, we merge all tasks within the current directory\r\n * into a global task, if at least one pattern refers to the root (`.`). In this case, the global task covers the rest.\r\n */\r\n if ('.' in insideCurrentDirectoryGroup) {\r\n tasks.push(convertPatternGroupToTask('.', patternsInsideCurrentDirectory, negative, dynamic));\r\n }\r\n else {\r\n tasks.push(...convertPatternGroupsToTasks(insideCurrentDirectoryGroup, negative, dynamic));\r\n }\r\n return tasks;\r\n}\r\nexports.convertPatternsToTasks = convertPatternsToTasks;\r\nfunction getPositivePatterns(patterns) {\r\n return utils.pattern.getPositivePatterns(patterns);\r\n}\r\nexports.getPositivePatterns = getPositivePatterns;\r\nfunction getNegativePatternsAsPositive(patterns, ignore) {\r\n const negative = utils.pattern.getNegativePatterns(patterns).concat(ignore);\r\n const positive = negative.map(utils.pattern.convertToPositivePattern);\r\n return positive;\r\n}\r\nexports.getNegativePatternsAsPositive = getNegativePatternsAsPositive;\r\nfunction groupPatternsByBaseDirectory(patterns) {\r\n const group = {};\r\n return patterns.reduce((collection, pattern) => {\r\n const base = utils.pattern.getBaseDirectory(pattern);\r\n if (base in collection) {\r\n collection[base].push(pattern);\r\n }\r\n else {\r\n collection[base] = [pattern];\r\n }\r\n return collection;\r\n }, group);\r\n}\r\nexports.groupPatternsByBaseDirectory = groupPatternsByBaseDirectory;\r\nfunction convertPatternGroupsToTasks(positive, negative, dynamic) {\r\n return Object.keys(positive).map((base) => {\r\n return convertPatternGroupToTask(base, positive[base], negative, dynamic);\r\n });\r\n}\r\nexports.convertPatternGroupsToTasks = convertPatternGroupsToTasks;\r\nfunction convertPatternGroupToTask(base, positive, negative, dynamic) {\r\n return {\r\n dynamic,\r\n positive,\r\n negative,\r\n base,\r\n patterns: [].concat(positive, negative.map(utils.pattern.convertToNegativePattern))\r\n };\r\n}\r\nexports.convertPatternGroupToTask = convertPatternGroupToTask;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.removeDuplicateSlashes = exports.transform = void 0;\r\n/**\r\n * Matches a sequence of two or more consecutive slashes, excluding the first two slashes at the beginning of the string.\r\n * The latter is due to the presence of the device path at the beginning of the UNC path.\r\n * @todo rewrite to negative lookbehind with the next major release.\r\n */\r\nconst DOUBLE_SLASH_RE = /(?!^)\\/{2,}/g;\r\nfunction transform(patterns) {\r\n return patterns.map((pattern) => removeDuplicateSlashes(pattern));\r\n}\r\nexports.transform = transform;\r\n/**\r\n * This package only works with forward slashes as a path separator.\r\n * Because of this, we cannot use the standard `path.normalize` method, because on Windows platform it will use of backslashes.\r\n */\r\nfunction removeDuplicateSlashes(pattern) {\r\n return pattern.replace(DOUBLE_SLASH_RE, '/');\r\n}\r\nexports.removeDuplicateSlashes = removeDuplicateSlashes;\r\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.read = void 0;\nfunction read(path, settings, callback) {\n settings.fs.lstat(path, (lstatError, lstat) => {\n if (lstatError !== null) {\n callFailureCallback(callback, lstatError);\n return;\n }\n if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) {\n callSuccessCallback(callback, lstat);\n return;\n }\n settings.fs.stat(path, (statError, stat) => {\n if (statError !== null) {\n if (settings.throwErrorOnBrokenSymbolicLink) {\n callFailureCallback(callback, statError);\n return;\n }\n callSuccessCallback(callback, lstat);\n return;\n }\n if (settings.markSymbolicLink) {\n stat.isSymbolicLink = () => true;\n }\n callSuccessCallback(callback, stat);\n });\n });\n}\nexports.read = read;\nfunction callFailureCallback(callback, error) {\n callback(error);\n}\nfunction callSuccessCallback(callback, result) {\n callback(null, result);\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.read = void 0;\nfunction read(path, settings) {\n const lstat = settings.fs.lstatSync(path);\n if (!lstat.isSymbolicLink() || !settings.followSymbolicLink) {\n return lstat;\n }\n try {\n const stat = settings.fs.statSync(path);\n if (settings.markSymbolicLink) {\n stat.isSymbolicLink = () => true;\n }\n return stat;\n }\n catch (error) {\n if (!settings.throwErrorOnBrokenSymbolicLink) {\n return lstat;\n }\n throw error;\n }\n}\nexports.read = read;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0;\nconst fs = require(\"fs\");\nexports.FILE_SYSTEM_ADAPTER = {\n lstat: fs.lstat,\n stat: fs.stat,\n lstatSync: fs.lstatSync,\n statSync: fs.statSync\n};\nfunction createFileSystemAdapter(fsMethods) {\n if (fsMethods === undefined) {\n return exports.FILE_SYSTEM_ADAPTER;\n }\n return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods);\n}\nexports.createFileSystemAdapter = createFileSystemAdapter;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fs = require(\"./adapters/fs\");\nclass Settings {\n constructor(_options = {}) {\n this._options = _options;\n this.followSymbolicLink = this._getValue(this._options.followSymbolicLink, true);\n this.fs = fs.createFileSystemAdapter(this._options.fs);\n this.markSymbolicLink = this._getValue(this._options.markSymbolicLink, false);\n this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true);\n }\n _getValue(option, value) {\n return option !== null && option !== void 0 ? option : value;\n }\n}\nexports.default = Settings;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.statSync = exports.stat = exports.Settings = void 0;\nconst async = require(\"./providers/async\");\nconst sync = require(\"./providers/sync\");\nconst settings_1 = require(\"./settings\");\nexports.Settings = settings_1.default;\nfunction stat(path, optionsOrSettingsOrCallback, callback) {\n if (typeof optionsOrSettingsOrCallback === 'function') {\n async.read(path, getSettings(), optionsOrSettingsOrCallback);\n return;\n }\n async.read(path, getSettings(optionsOrSettingsOrCallback), callback);\n}\nexports.stat = stat;\nfunction statSync(path, optionsOrSettings) {\n const settings = getSettings(optionsOrSettings);\n return sync.read(path, settings);\n}\nexports.statSync = statSync;\nfunction getSettings(settingsOrOptions = {}) {\n if (settingsOrOptions instanceof settings_1.default) {\n return settingsOrOptions;\n }\n return new settings_1.default(settingsOrOptions);\n}\n", "/*! queue-microtask. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */\nlet promise\n\nmodule.exports = typeof queueMicrotask === 'function'\n ? queueMicrotask.bind(typeof window !== 'undefined' ? window : global)\n // reuse resolved promise, and allocate it lazily\n : cb => (promise || (promise = Promise.resolve()))\n .then(cb)\n .catch(err => setTimeout(() => { throw err }, 0))\n", "/*! run-parallel. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */\nmodule.exports = runParallel\n\nconst queueMicrotask = require('queue-microtask')\n\nfunction runParallel (tasks, cb) {\n let results, pending, keys\n let isSync = true\n\n if (Array.isArray(tasks)) {\n results = []\n pending = tasks.length\n } else {\n keys = Object.keys(tasks)\n results = {}\n pending = keys.length\n }\n\n function done (err) {\n function end () {\n if (cb) cb(err, results)\n cb = null\n }\n if (isSync) queueMicrotask(end)\n else end()\n }\n\n function each (i, err, result) {\n results[i] = result\n if (--pending === 0 || err) {\n done(err)\n }\n }\n\n if (!pending) {\n // empty\n done(null)\n } else if (keys) {\n // object\n keys.forEach(function (key) {\n tasks[key](function (err, result) { each(key, err, result) })\n })\n } else {\n // array\n tasks.forEach(function (task, i) {\n task(function (err, result) { each(i, err, result) })\n })\n }\n\n isSync = false\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = void 0;\nconst NODE_PROCESS_VERSION_PARTS = process.versions.node.split('.');\nif (NODE_PROCESS_VERSION_PARTS[0] === undefined || NODE_PROCESS_VERSION_PARTS[1] === undefined) {\n throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);\n}\nconst MAJOR_VERSION = Number.parseInt(NODE_PROCESS_VERSION_PARTS[0], 10);\nconst MINOR_VERSION = Number.parseInt(NODE_PROCESS_VERSION_PARTS[1], 10);\nconst SUPPORTED_MAJOR_VERSION = 10;\nconst SUPPORTED_MINOR_VERSION = 10;\nconst IS_MATCHED_BY_MAJOR = MAJOR_VERSION > SUPPORTED_MAJOR_VERSION;\nconst IS_MATCHED_BY_MAJOR_AND_MINOR = MAJOR_VERSION === SUPPORTED_MAJOR_VERSION && MINOR_VERSION >= SUPPORTED_MINOR_VERSION;\n/**\n * IS `true` for Node.js 10.10 and greater.\n */\nexports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = IS_MATCHED_BY_MAJOR || IS_MATCHED_BY_MAJOR_AND_MINOR;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createDirentFromStats = void 0;\nclass DirentFromStats {\n constructor(name, stats) {\n this.name = name;\n this.isBlockDevice = stats.isBlockDevice.bind(stats);\n this.isCharacterDevice = stats.isCharacterDevice.bind(stats);\n this.isDirectory = stats.isDirectory.bind(stats);\n this.isFIFO = stats.isFIFO.bind(stats);\n this.isFile = stats.isFile.bind(stats);\n this.isSocket = stats.isSocket.bind(stats);\n this.isSymbolicLink = stats.isSymbolicLink.bind(stats);\n }\n}\nfunction createDirentFromStats(name, stats) {\n return new DirentFromStats(name, stats);\n}\nexports.createDirentFromStats = createDirentFromStats;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.fs = void 0;\nconst fs = require(\"./fs\");\nexports.fs = fs;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.joinPathSegments = void 0;\nfunction joinPathSegments(a, b, separator) {\n /**\n * The correct handling of cases when the first segment is a root (`/`, `C:/`) or UNC path (`//?/C:/`).\n */\n if (a.endsWith(separator)) {\n return a + b;\n }\n return a + separator + b;\n}\nexports.joinPathSegments = joinPathSegments;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.readdir = exports.readdirWithFileTypes = exports.read = void 0;\nconst fsStat = require(\"@nodelib/fs.stat\");\nconst rpl = require(\"run-parallel\");\nconst constants_1 = require(\"../constants\");\nconst utils = require(\"../utils\");\nconst common = require(\"./common\");\nfunction read(directory, settings, callback) {\n if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) {\n readdirWithFileTypes(directory, settings, callback);\n return;\n }\n readdir(directory, settings, callback);\n}\nexports.read = read;\nfunction readdirWithFileTypes(directory, settings, callback) {\n settings.fs.readdir(directory, { withFileTypes: true }, (readdirError, dirents) => {\n if (readdirError !== null) {\n callFailureCallback(callback, readdirError);\n return;\n }\n const entries = dirents.map((dirent) => ({\n dirent,\n name: dirent.name,\n path: common.joinPathSegments(directory, dirent.name, settings.pathSegmentSeparator)\n }));\n if (!settings.followSymbolicLinks) {\n callSuccessCallback(callback, entries);\n return;\n }\n const tasks = entries.map((entry) => makeRplTaskEntry(entry, settings));\n rpl(tasks, (rplError, rplEntries) => {\n if (rplError !== null) {\n callFailureCallback(callback, rplError);\n return;\n }\n callSuccessCallback(callback, rplEntries);\n });\n });\n}\nexports.readdirWithFileTypes = readdirWithFileTypes;\nfunction makeRplTaskEntry(entry, settings) {\n return (done) => {\n if (!entry.dirent.isSymbolicLink()) {\n done(null, entry);\n return;\n }\n settings.fs.stat(entry.path, (statError, stats) => {\n if (statError !== null) {\n if (settings.throwErrorOnBrokenSymbolicLink) {\n done(statError);\n return;\n }\n done(null, entry);\n return;\n }\n entry.dirent = utils.fs.createDirentFromStats(entry.name, stats);\n done(null, entry);\n });\n };\n}\nfunction readdir(directory, settings, callback) {\n settings.fs.readdir(directory, (readdirError, names) => {\n if (readdirError !== null) {\n callFailureCallback(callback, readdirError);\n return;\n }\n const tasks = names.map((name) => {\n const path = common.joinPathSegments(directory, name, settings.pathSegmentSeparator);\n return (done) => {\n fsStat.stat(path, settings.fsStatSettings, (error, stats) => {\n if (error !== null) {\n done(error);\n return;\n }\n const entry = {\n name,\n path,\n dirent: utils.fs.createDirentFromStats(name, stats)\n };\n if (settings.stats) {\n entry.stats = stats;\n }\n done(null, entry);\n });\n };\n });\n rpl(tasks, (rplError, entries) => {\n if (rplError !== null) {\n callFailureCallback(callback, rplError);\n return;\n }\n callSuccessCallback(callback, entries);\n });\n });\n}\nexports.readdir = readdir;\nfunction callFailureCallback(callback, error) {\n callback(error);\n}\nfunction callSuccessCallback(callback, result) {\n callback(null, result);\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.readdir = exports.readdirWithFileTypes = exports.read = void 0;\nconst fsStat = require(\"@nodelib/fs.stat\");\nconst constants_1 = require(\"../constants\");\nconst utils = require(\"../utils\");\nconst common = require(\"./common\");\nfunction read(directory, settings) {\n if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) {\n return readdirWithFileTypes(directory, settings);\n }\n return readdir(directory, settings);\n}\nexports.read = read;\nfunction readdirWithFileTypes(directory, settings) {\n const dirents = settings.fs.readdirSync(directory, { withFileTypes: true });\n return dirents.map((dirent) => {\n const entry = {\n dirent,\n name: dirent.name,\n path: common.joinPathSegments(directory, dirent.name, settings.pathSegmentSeparator)\n };\n if (entry.dirent.isSymbolicLink() && settings.followSymbolicLinks) {\n try {\n const stats = settings.fs.statSync(entry.path);\n entry.dirent = utils.fs.createDirentFromStats(entry.name, stats);\n }\n catch (error) {\n if (settings.throwErrorOnBrokenSymbolicLink) {\n throw error;\n }\n }\n }\n return entry;\n });\n}\nexports.readdirWithFileTypes = readdirWithFileTypes;\nfunction readdir(directory, settings) {\n const names = settings.fs.readdirSync(directory);\n return names.map((name) => {\n const entryPath = common.joinPathSegments(directory, name, settings.pathSegmentSeparator);\n const stats = fsStat.statSync(entryPath, settings.fsStatSettings);\n const entry = {\n name,\n path: entryPath,\n dirent: utils.fs.createDirentFromStats(name, stats)\n };\n if (settings.stats) {\n entry.stats = stats;\n }\n return entry;\n });\n}\nexports.readdir = readdir;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createFileSystemAdapter = exports.FILE_SYSTEM_ADAPTER = void 0;\nconst fs = require(\"fs\");\nexports.FILE_SYSTEM_ADAPTER = {\n lstat: fs.lstat,\n stat: fs.stat,\n lstatSync: fs.lstatSync,\n statSync: fs.statSync,\n readdir: fs.readdir,\n readdirSync: fs.readdirSync\n};\nfunction createFileSystemAdapter(fsMethods) {\n if (fsMethods === undefined) {\n return exports.FILE_SYSTEM_ADAPTER;\n }\n return Object.assign(Object.assign({}, exports.FILE_SYSTEM_ADAPTER), fsMethods);\n}\nexports.createFileSystemAdapter = createFileSystemAdapter;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = require(\"path\");\nconst fsStat = require(\"@nodelib/fs.stat\");\nconst fs = require(\"./adapters/fs\");\nclass Settings {\n constructor(_options = {}) {\n this._options = _options;\n this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, false);\n this.fs = fs.createFileSystemAdapter(this._options.fs);\n this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep);\n this.stats = this._getValue(this._options.stats, false);\n this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, true);\n this.fsStatSettings = new fsStat.Settings({\n followSymbolicLink: this.followSymbolicLinks,\n fs: this.fs,\n throwErrorOnBrokenSymbolicLink: this.throwErrorOnBrokenSymbolicLink\n });\n }\n _getValue(option, value) {\n return option !== null && option !== void 0 ? option : value;\n }\n}\nexports.default = Settings;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Settings = exports.scandirSync = exports.scandir = void 0;\nconst async = require(\"./providers/async\");\nconst sync = require(\"./providers/sync\");\nconst settings_1 = require(\"./settings\");\nexports.Settings = settings_1.default;\nfunction scandir(path, optionsOrSettingsOrCallback, callback) {\n if (typeof optionsOrSettingsOrCallback === 'function') {\n async.read(path, getSettings(), optionsOrSettingsOrCallback);\n return;\n }\n async.read(path, getSettings(optionsOrSettingsOrCallback), callback);\n}\nexports.scandir = scandir;\nfunction scandirSync(path, optionsOrSettings) {\n const settings = getSettings(optionsOrSettings);\n return sync.read(path, settings);\n}\nexports.scandirSync = scandirSync;\nfunction getSettings(settingsOrOptions = {}) {\n if (settingsOrOptions instanceof settings_1.default) {\n return settingsOrOptions;\n }\n return new settings_1.default(settingsOrOptions);\n}\n", "'use strict'\n\nfunction reusify (Constructor) {\n var head = new Constructor()\n var tail = head\n\n function get () {\n var current = head\n\n if (current.next) {\n head = current.next\n } else {\n head = new Constructor()\n tail = head\n }\n\n current.next = null\n\n return current\n }\n\n function release (obj) {\n tail.next = obj\n tail = obj\n }\n\n return {\n get: get,\n release: release\n }\n}\n\nmodule.exports = reusify\n", "'use strict'\n\n/* eslint-disable no-var */\n\nvar reusify = require('reusify')\n\nfunction fastqueue (context, worker, concurrency) {\n if (typeof context === 'function') {\n concurrency = worker\n worker = context\n context = null\n }\n\n if (concurrency < 1) {\n throw new Error('fastqueue concurrency must be greater than 1')\n }\n\n var cache = reusify(Task)\n var queueHead = null\n var queueTail = null\n var _running = 0\n var errorHandler = null\n\n var self = {\n push: push,\n drain: noop,\n saturated: noop,\n pause: pause,\n paused: false,\n concurrency: concurrency,\n running: running,\n resume: resume,\n idle: idle,\n length: length,\n getQueue: getQueue,\n unshift: unshift,\n empty: noop,\n kill: kill,\n killAndDrain: killAndDrain,\n error: error\n }\n\n return self\n\n function running () {\n return _running\n }\n\n function pause () {\n self.paused = true\n }\n\n function length () {\n var current = queueHead\n var counter = 0\n\n while (current) {\n current = current.next\n counter++\n }\n\n return counter\n }\n\n function getQueue () {\n var current = queueHead\n var tasks = []\n\n while (current) {\n tasks.push(current.value)\n current = current.next\n }\n\n return tasks\n }\n\n function resume () {\n if (!self.paused) return\n self.paused = false\n for (var i = 0; i < self.concurrency; i++) {\n _running++\n release()\n }\n }\n\n function idle () {\n return _running === 0 && self.length() === 0\n }\n\n function push (value, done) {\n var current = cache.get()\n\n current.context = context\n current.release = release\n current.value = value\n current.callback = done || noop\n current.errorHandler = errorHandler\n\n if (_running === self.concurrency || self.paused) {\n if (queueTail) {\n queueTail.next = current\n queueTail = current\n } else {\n queueHead = current\n queueTail = current\n self.saturated()\n }\n } else {\n _running++\n worker.call(context, current.value, current.worked)\n }\n }\n\n function unshift (value, done) {\n var current = cache.get()\n\n current.context = context\n current.release = release\n current.value = value\n current.callback = done || noop\n\n if (_running === self.concurrency || self.paused) {\n if (queueHead) {\n current.next = queueHead\n queueHead = current\n } else {\n queueHead = current\n queueTail = current\n self.saturated()\n }\n } else {\n _running++\n worker.call(context, current.value, current.worked)\n }\n }\n\n function release (holder) {\n if (holder) {\n cache.release(holder)\n }\n var next = queueHead\n if (next) {\n if (!self.paused) {\n if (queueTail === queueHead) {\n queueTail = null\n }\n queueHead = next.next\n next.next = null\n worker.call(context, next.value, next.worked)\n if (queueTail === null) {\n self.empty()\n }\n } else {\n _running--\n }\n } else if (--_running === 0) {\n self.drain()\n }\n }\n\n function kill () {\n queueHead = null\n queueTail = null\n self.drain = noop\n }\n\n function killAndDrain () {\n queueHead = null\n queueTail = null\n self.drain()\n self.drain = noop\n }\n\n function error (handler) {\n errorHandler = handler\n }\n}\n\nfunction noop () {}\n\nfunction Task () {\n this.value = null\n this.callback = noop\n this.next = null\n this.release = noop\n this.context = null\n this.errorHandler = null\n\n var self = this\n\n this.worked = function worked (err, result) {\n var callback = self.callback\n var errorHandler = self.errorHandler\n var val = self.value\n self.value = null\n self.callback = noop\n if (self.errorHandler) {\n errorHandler(err, val)\n }\n callback.call(self.context, err, result)\n self.release(self)\n }\n}\n\nfunction queueAsPromised (context, worker, concurrency) {\n if (typeof context === 'function') {\n concurrency = worker\n worker = context\n context = null\n }\n\n function asyncWrapper (arg, cb) {\n worker.call(this, arg)\n .then(function (res) {\n cb(null, res)\n }, cb)\n }\n\n var queue = fastqueue(context, asyncWrapper, concurrency)\n\n var pushCb = queue.push\n var unshiftCb = queue.unshift\n\n queue.push = push\n queue.unshift = unshift\n queue.drained = drained\n\n return queue\n\n function push (value) {\n var p = new Promise(function (resolve, reject) {\n pushCb(value, function (err, result) {\n if (err) {\n reject(err)\n return\n }\n resolve(result)\n })\n })\n\n // Let's fork the promise chain to\n // make the error bubble up to the user but\n // not lead to a unhandledRejection\n p.catch(noop)\n\n return p\n }\n\n function unshift (value) {\n var p = new Promise(function (resolve, reject) {\n unshiftCb(value, function (err, result) {\n if (err) {\n reject(err)\n return\n }\n resolve(result)\n })\n })\n\n // Let's fork the promise chain to\n // make the error bubble up to the user but\n // not lead to a unhandledRejection\n p.catch(noop)\n\n return p\n }\n\n function drained () {\n var previousDrain = queue.drain\n\n var p = new Promise(function (resolve) {\n queue.drain = function () {\n previousDrain()\n resolve()\n }\n })\n\n return p\n }\n}\n\nmodule.exports = fastqueue\nmodule.exports.promise = queueAsPromised\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.joinPathSegments = exports.replacePathSegmentSeparator = exports.isAppliedFilter = exports.isFatalError = void 0;\nfunction isFatalError(settings, error) {\n if (settings.errorFilter === null) {\n return true;\n }\n return !settings.errorFilter(error);\n}\nexports.isFatalError = isFatalError;\nfunction isAppliedFilter(filter, value) {\n return filter === null || filter(value);\n}\nexports.isAppliedFilter = isAppliedFilter;\nfunction replacePathSegmentSeparator(filepath, separator) {\n return filepath.split(/[/\\\\]/).join(separator);\n}\nexports.replacePathSegmentSeparator = replacePathSegmentSeparator;\nfunction joinPathSegments(a, b, separator) {\n if (a === '') {\n return b;\n }\n /**\n * The correct handling of cases when the first segment is a root (`/`, `C:/`) or UNC path (`//?/C:/`).\n */\n if (a.endsWith(separator)) {\n return a + b;\n }\n return a + separator + b;\n}\nexports.joinPathSegments = joinPathSegments;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst common = require(\"./common\");\nclass Reader {\n constructor(_root, _settings) {\n this._root = _root;\n this._settings = _settings;\n this._root = common.replacePathSegmentSeparator(_root, _settings.pathSegmentSeparator);\n }\n}\nexports.default = Reader;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst events_1 = require(\"events\");\nconst fsScandir = require(\"@nodelib/fs.scandir\");\nconst fastq = require(\"fastq\");\nconst common = require(\"./common\");\nconst reader_1 = require(\"./reader\");\nclass AsyncReader extends reader_1.default {\n constructor(_root, _settings) {\n super(_root, _settings);\n this._settings = _settings;\n this._scandir = fsScandir.scandir;\n this._emitter = new events_1.EventEmitter();\n this._queue = fastq(this._worker.bind(this), this._settings.concurrency);\n this._isFatalError = false;\n this._isDestroyed = false;\n this._queue.drain = () => {\n if (!this._isFatalError) {\n this._emitter.emit('end');\n }\n };\n }\n read() {\n this._isFatalError = false;\n this._isDestroyed = false;\n setImmediate(() => {\n this._pushToQueue(this._root, this._settings.basePath);\n });\n return this._emitter;\n }\n get isDestroyed() {\n return this._isDestroyed;\n }\n destroy() {\n if (this._isDestroyed) {\n throw new Error('The reader is already destroyed');\n }\n this._isDestroyed = true;\n this._queue.killAndDrain();\n }\n onEntry(callback) {\n this._emitter.on('entry', callback);\n }\n onError(callback) {\n this._emitter.once('error', callback);\n }\n onEnd(callback) {\n this._emitter.once('end', callback);\n }\n _pushToQueue(directory, base) {\n const queueItem = { directory, base };\n this._queue.push(queueItem, (error) => {\n if (error !== null) {\n this._handleError(error);\n }\n });\n }\n _worker(item, done) {\n this._scandir(item.directory, this._settings.fsScandirSettings, (error, entries) => {\n if (error !== null) {\n done(error, undefined);\n return;\n }\n for (const entry of entries) {\n this._handleEntry(entry, item.base);\n }\n done(null, undefined);\n });\n }\n _handleError(error) {\n if (this._isDestroyed || !common.isFatalError(this._settings, error)) {\n return;\n }\n this._isFatalError = true;\n this._isDestroyed = true;\n this._emitter.emit('error', error);\n }\n _handleEntry(entry, base) {\n if (this._isDestroyed || this._isFatalError) {\n return;\n }\n const fullpath = entry.path;\n if (base !== undefined) {\n entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator);\n }\n if (common.isAppliedFilter(this._settings.entryFilter, entry)) {\n this._emitEntry(entry);\n }\n if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) {\n this._pushToQueue(fullpath, base === undefined ? undefined : entry.path);\n }\n }\n _emitEntry(entry) {\n this._emitter.emit('entry', entry);\n }\n}\nexports.default = AsyncReader;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst async_1 = require(\"../readers/async\");\nclass AsyncProvider {\n constructor(_root, _settings) {\n this._root = _root;\n this._settings = _settings;\n this._reader = new async_1.default(this._root, this._settings);\n this._storage = [];\n }\n read(callback) {\n this._reader.onError((error) => {\n callFailureCallback(callback, error);\n });\n this._reader.onEntry((entry) => {\n this._storage.push(entry);\n });\n this._reader.onEnd(() => {\n callSuccessCallback(callback, this._storage);\n });\n this._reader.read();\n }\n}\nexports.default = AsyncProvider;\nfunction callFailureCallback(callback, error) {\n callback(error);\n}\nfunction callSuccessCallback(callback, entries) {\n callback(null, entries);\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst stream_1 = require(\"stream\");\nconst async_1 = require(\"../readers/async\");\nclass StreamProvider {\n constructor(_root, _settings) {\n this._root = _root;\n this._settings = _settings;\n this._reader = new async_1.default(this._root, this._settings);\n this._stream = new stream_1.Readable({\n objectMode: true,\n read: () => { },\n destroy: () => {\n if (!this._reader.isDestroyed) {\n this._reader.destroy();\n }\n }\n });\n }\n read() {\n this._reader.onError((error) => {\n this._stream.emit('error', error);\n });\n this._reader.onEntry((entry) => {\n this._stream.push(entry);\n });\n this._reader.onEnd(() => {\n this._stream.push(null);\n });\n this._reader.read();\n return this._stream;\n }\n}\nexports.default = StreamProvider;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fsScandir = require(\"@nodelib/fs.scandir\");\nconst common = require(\"./common\");\nconst reader_1 = require(\"./reader\");\nclass SyncReader extends reader_1.default {\n constructor() {\n super(...arguments);\n this._scandir = fsScandir.scandirSync;\n this._storage = [];\n this._queue = new Set();\n }\n read() {\n this._pushToQueue(this._root, this._settings.basePath);\n this._handleQueue();\n return this._storage;\n }\n _pushToQueue(directory, base) {\n this._queue.add({ directory, base });\n }\n _handleQueue() {\n for (const item of this._queue.values()) {\n this._handleDirectory(item.directory, item.base);\n }\n }\n _handleDirectory(directory, base) {\n try {\n const entries = this._scandir(directory, this._settings.fsScandirSettings);\n for (const entry of entries) {\n this._handleEntry(entry, base);\n }\n }\n catch (error) {\n this._handleError(error);\n }\n }\n _handleError(error) {\n if (!common.isFatalError(this._settings, error)) {\n return;\n }\n throw error;\n }\n _handleEntry(entry, base) {\n const fullpath = entry.path;\n if (base !== undefined) {\n entry.path = common.joinPathSegments(base, entry.name, this._settings.pathSegmentSeparator);\n }\n if (common.isAppliedFilter(this._settings.entryFilter, entry)) {\n this._pushToStorage(entry);\n }\n if (entry.dirent.isDirectory() && common.isAppliedFilter(this._settings.deepFilter, entry)) {\n this._pushToQueue(fullpath, base === undefined ? undefined : entry.path);\n }\n }\n _pushToStorage(entry) {\n this._storage.push(entry);\n }\n}\nexports.default = SyncReader;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst sync_1 = require(\"../readers/sync\");\nclass SyncProvider {\n constructor(_root, _settings) {\n this._root = _root;\n this._settings = _settings;\n this._reader = new sync_1.default(this._root, this._settings);\n }\n read() {\n return this._reader.read();\n }\n}\nexports.default = SyncProvider;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst path = require(\"path\");\nconst fsScandir = require(\"@nodelib/fs.scandir\");\nclass Settings {\n constructor(_options = {}) {\n this._options = _options;\n this.basePath = this._getValue(this._options.basePath, undefined);\n this.concurrency = this._getValue(this._options.concurrency, Number.POSITIVE_INFINITY);\n this.deepFilter = this._getValue(this._options.deepFilter, null);\n this.entryFilter = this._getValue(this._options.entryFilter, null);\n this.errorFilter = this._getValue(this._options.errorFilter, null);\n this.pathSegmentSeparator = this._getValue(this._options.pathSegmentSeparator, path.sep);\n this.fsScandirSettings = new fsScandir.Settings({\n followSymbolicLinks: this._options.followSymbolicLinks,\n fs: this._options.fs,\n pathSegmentSeparator: this._options.pathSegmentSeparator,\n stats: this._options.stats,\n throwErrorOnBrokenSymbolicLink: this._options.throwErrorOnBrokenSymbolicLink\n });\n }\n _getValue(option, value) {\n return option !== null && option !== void 0 ? option : value;\n }\n}\nexports.default = Settings;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Settings = exports.walkStream = exports.walkSync = exports.walk = void 0;\nconst async_1 = require(\"./providers/async\");\nconst stream_1 = require(\"./providers/stream\");\nconst sync_1 = require(\"./providers/sync\");\nconst settings_1 = require(\"./settings\");\nexports.Settings = settings_1.default;\nfunction walk(directory, optionsOrSettingsOrCallback, callback) {\n if (typeof optionsOrSettingsOrCallback === 'function') {\n new async_1.default(directory, getSettings()).read(optionsOrSettingsOrCallback);\n return;\n }\n new async_1.default(directory, getSettings(optionsOrSettingsOrCallback)).read(callback);\n}\nexports.walk = walk;\nfunction walkSync(directory, optionsOrSettings) {\n const settings = getSettings(optionsOrSettings);\n const provider = new sync_1.default(directory, settings);\n return provider.read();\n}\nexports.walkSync = walkSync;\nfunction walkStream(directory, optionsOrSettings) {\n const settings = getSettings(optionsOrSettings);\n const provider = new stream_1.default(directory, settings);\n return provider.read();\n}\nexports.walkStream = walkStream;\nfunction getSettings(settingsOrOptions = {}) {\n if (settingsOrOptions instanceof settings_1.default) {\n return settingsOrOptions;\n }\n return new settings_1.default(settingsOrOptions);\n}\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst path = require(\"path\");\r\nconst fsStat = require(\"@nodelib/fs.stat\");\r\nconst utils = require(\"../utils\");\r\nclass Reader {\r\n constructor(_settings) {\r\n this._settings = _settings;\r\n this._fsStatSettings = new fsStat.Settings({\r\n followSymbolicLink: this._settings.followSymbolicLinks,\r\n fs: this._settings.fs,\r\n throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks\r\n });\r\n }\r\n _getFullEntryPath(filepath) {\r\n return path.resolve(this._settings.cwd, filepath);\r\n }\r\n _makeEntry(stats, pattern) {\r\n const entry = {\r\n name: pattern,\r\n path: pattern,\r\n dirent: utils.fs.createDirentFromStats(pattern, stats)\r\n };\r\n if (this._settings.stats) {\r\n entry.stats = stats;\r\n }\r\n return entry;\r\n }\r\n _isFatalError(error) {\r\n return !utils.errno.isEnoentCodeError(error) && !this._settings.suppressErrors;\r\n }\r\n}\r\nexports.default = Reader;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst stream_1 = require(\"stream\");\r\nconst fsStat = require(\"@nodelib/fs.stat\");\r\nconst fsWalk = require(\"@nodelib/fs.walk\");\r\nconst reader_1 = require(\"./reader\");\r\nclass ReaderStream extends reader_1.default {\r\n constructor() {\r\n super(...arguments);\r\n this._walkStream = fsWalk.walkStream;\r\n this._stat = fsStat.stat;\r\n }\r\n dynamic(root, options) {\r\n return this._walkStream(root, options);\r\n }\r\n static(patterns, options) {\r\n const filepaths = patterns.map(this._getFullEntryPath, this);\r\n const stream = new stream_1.PassThrough({ objectMode: true });\r\n stream._write = (index, _enc, done) => {\r\n return this._getEntry(filepaths[index], patterns[index], options)\r\n .then((entry) => {\r\n if (entry !== null && options.entryFilter(entry)) {\r\n stream.push(entry);\r\n }\r\n if (index === filepaths.length - 1) {\r\n stream.end();\r\n }\r\n done();\r\n })\r\n .catch(done);\r\n };\r\n for (let i = 0; i < filepaths.length; i++) {\r\n stream.write(i);\r\n }\r\n return stream;\r\n }\r\n _getEntry(filepath, pattern, options) {\r\n return this._getStat(filepath)\r\n .then((stats) => this._makeEntry(stats, pattern))\r\n .catch((error) => {\r\n if (options.errorFilter(error)) {\r\n return null;\r\n }\r\n throw error;\r\n });\r\n }\r\n _getStat(filepath) {\r\n return new Promise((resolve, reject) => {\r\n this._stat(filepath, this._fsStatSettings, (error, stats) => {\r\n return error === null ? resolve(stats) : reject(error);\r\n });\r\n });\r\n }\r\n}\r\nexports.default = ReaderStream;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst fsWalk = require(\"@nodelib/fs.walk\");\r\nconst reader_1 = require(\"./reader\");\r\nconst stream_1 = require(\"./stream\");\r\nclass ReaderAsync extends reader_1.default {\r\n constructor() {\r\n super(...arguments);\r\n this._walkAsync = fsWalk.walk;\r\n this._readerStream = new stream_1.default(this._settings);\r\n }\r\n dynamic(root, options) {\r\n return new Promise((resolve, reject) => {\r\n this._walkAsync(root, options, (error, entries) => {\r\n if (error === null) {\r\n resolve(entries);\r\n }\r\n else {\r\n reject(error);\r\n }\r\n });\r\n });\r\n }\r\n async static(patterns, options) {\r\n const entries = [];\r\n const stream = this._readerStream.static(patterns, options);\r\n // After #235, replace it with an asynchronous iterator.\r\n return new Promise((resolve, reject) => {\r\n stream.once('error', reject);\r\n stream.on('data', (entry) => entries.push(entry));\r\n stream.once('end', () => resolve(entries));\r\n });\r\n }\r\n}\r\nexports.default = ReaderAsync;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst utils = require(\"../../utils\");\r\nclass Matcher {\r\n constructor(_patterns, _settings, _micromatchOptions) {\r\n this._patterns = _patterns;\r\n this._settings = _settings;\r\n this._micromatchOptions = _micromatchOptions;\r\n this._storage = [];\r\n this._fillStorage();\r\n }\r\n _fillStorage() {\r\n /**\r\n * The original pattern may include `{,*,**,a/*}`, which will lead to problems with matching (unresolved level).\r\n * So, before expand patterns with brace expansion into separated patterns.\r\n */\r\n const patterns = utils.pattern.expandPatternsWithBraceExpansion(this._patterns);\r\n for (const pattern of patterns) {\r\n const segments = this._getPatternSegments(pattern);\r\n const sections = this._splitSegmentsIntoSections(segments);\r\n this._storage.push({\r\n complete: sections.length <= 1,\r\n pattern,\r\n segments,\r\n sections\r\n });\r\n }\r\n }\r\n _getPatternSegments(pattern) {\r\n const parts = utils.pattern.getPatternParts(pattern, this._micromatchOptions);\r\n return parts.map((part) => {\r\n const dynamic = utils.pattern.isDynamicPattern(part, this._settings);\r\n if (!dynamic) {\r\n return {\r\n dynamic: false,\r\n pattern: part\r\n };\r\n }\r\n return {\r\n dynamic: true,\r\n pattern: part,\r\n patternRe: utils.pattern.makeRe(part, this._micromatchOptions)\r\n };\r\n });\r\n }\r\n _splitSegmentsIntoSections(segments) {\r\n return utils.array.splitWhen(segments, (segment) => segment.dynamic && utils.pattern.hasGlobStar(segment.pattern));\r\n }\r\n}\r\nexports.default = Matcher;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst matcher_1 = require(\"./matcher\");\r\nclass PartialMatcher extends matcher_1.default {\r\n match(filepath) {\r\n const parts = filepath.split('/');\r\n const levels = parts.length;\r\n const patterns = this._storage.filter((info) => !info.complete || info.segments.length > levels);\r\n for (const pattern of patterns) {\r\n const section = pattern.sections[0];\r\n /**\r\n * In this case, the pattern has a globstar and we must read all directories unconditionally,\r\n * but only if the level has reached the end of the first group.\r\n *\r\n * fixtures/{a,b}/**\r\n * ^ true/false ^ always true\r\n */\r\n if (!pattern.complete && levels > section.length) {\r\n return true;\r\n }\r\n const match = parts.every((part, index) => {\r\n const segment = pattern.segments[index];\r\n if (segment.dynamic && segment.patternRe.test(part)) {\r\n return true;\r\n }\r\n if (!segment.dynamic && segment.pattern === part) {\r\n return true;\r\n }\r\n return false;\r\n });\r\n if (match) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\nexports.default = PartialMatcher;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst utils = require(\"../../utils\");\r\nconst partial_1 = require(\"../matchers/partial\");\r\nclass DeepFilter {\r\n constructor(_settings, _micromatchOptions) {\r\n this._settings = _settings;\r\n this._micromatchOptions = _micromatchOptions;\r\n }\r\n getFilter(basePath, positive, negative) {\r\n const matcher = this._getMatcher(positive);\r\n const negativeRe = this._getNegativePatternsRe(negative);\r\n return (entry) => this._filter(basePath, entry, matcher, negativeRe);\r\n }\r\n _getMatcher(patterns) {\r\n return new partial_1.default(patterns, this._settings, this._micromatchOptions);\r\n }\r\n _getNegativePatternsRe(patterns) {\r\n const affectDepthOfReadingPatterns = patterns.filter(utils.pattern.isAffectDepthOfReadingPattern);\r\n return utils.pattern.convertPatternsToRe(affectDepthOfReadingPatterns, this._micromatchOptions);\r\n }\r\n _filter(basePath, entry, matcher, negativeRe) {\r\n if (this._isSkippedByDeep(basePath, entry.path)) {\r\n return false;\r\n }\r\n if (this._isSkippedSymbolicLink(entry)) {\r\n return false;\r\n }\r\n const filepath = utils.path.removeLeadingDotSegment(entry.path);\r\n if (this._isSkippedByPositivePatterns(filepath, matcher)) {\r\n return false;\r\n }\r\n return this._isSkippedByNegativePatterns(filepath, negativeRe);\r\n }\r\n _isSkippedByDeep(basePath, entryPath) {\r\n /**\r\n * Avoid unnecessary depth calculations when it doesn't matter.\r\n */\r\n if (this._settings.deep === Infinity) {\r\n return false;\r\n }\r\n return this._getEntryLevel(basePath, entryPath) >= this._settings.deep;\r\n }\r\n _getEntryLevel(basePath, entryPath) {\r\n const entryPathDepth = entryPath.split('/').length;\r\n if (basePath === '') {\r\n return entryPathDepth;\r\n }\r\n const basePathDepth = basePath.split('/').length;\r\n return entryPathDepth - basePathDepth;\r\n }\r\n _isSkippedSymbolicLink(entry) {\r\n return !this._settings.followSymbolicLinks && entry.dirent.isSymbolicLink();\r\n }\r\n _isSkippedByPositivePatterns(entryPath, matcher) {\r\n return !this._settings.baseNameMatch && !matcher.match(entryPath);\r\n }\r\n _isSkippedByNegativePatterns(entryPath, patternsRe) {\r\n return !utils.pattern.matchAny(entryPath, patternsRe);\r\n }\r\n}\r\nexports.default = DeepFilter;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst utils = require(\"../../utils\");\r\nclass EntryFilter {\r\n constructor(_settings, _micromatchOptions) {\r\n this._settings = _settings;\r\n this._micromatchOptions = _micromatchOptions;\r\n this.index = new Map();\r\n }\r\n getFilter(positive, negative) {\r\n const positiveRe = utils.pattern.convertPatternsToRe(positive, this._micromatchOptions);\r\n const negativeRe = utils.pattern.convertPatternsToRe(negative, this._micromatchOptions);\r\n return (entry) => this._filter(entry, positiveRe, negativeRe);\r\n }\r\n _filter(entry, positiveRe, negativeRe) {\r\n if (this._settings.unique && this._isDuplicateEntry(entry)) {\r\n return false;\r\n }\r\n if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) {\r\n return false;\r\n }\r\n if (this._isSkippedByAbsoluteNegativePatterns(entry.path, negativeRe)) {\r\n return false;\r\n }\r\n const filepath = this._settings.baseNameMatch ? entry.name : entry.path;\r\n const isDirectory = entry.dirent.isDirectory();\r\n const isMatched = this._isMatchToPatterns(filepath, positiveRe, isDirectory) && !this._isMatchToPatterns(entry.path, negativeRe, isDirectory);\r\n if (this._settings.unique && isMatched) {\r\n this._createIndexRecord(entry);\r\n }\r\n return isMatched;\r\n }\r\n _isDuplicateEntry(entry) {\r\n return this.index.has(entry.path);\r\n }\r\n _createIndexRecord(entry) {\r\n this.index.set(entry.path, undefined);\r\n }\r\n _onlyFileFilter(entry) {\r\n return this._settings.onlyFiles && !entry.dirent.isFile();\r\n }\r\n _onlyDirectoryFilter(entry) {\r\n return this._settings.onlyDirectories && !entry.dirent.isDirectory();\r\n }\r\n _isSkippedByAbsoluteNegativePatterns(entryPath, patternsRe) {\r\n if (!this._settings.absolute) {\r\n return false;\r\n }\r\n const fullpath = utils.path.makeAbsolute(this._settings.cwd, entryPath);\r\n return utils.pattern.matchAny(fullpath, patternsRe);\r\n }\r\n _isMatchToPatterns(entryPath, patternsRe, isDirectory) {\r\n const filepath = utils.path.removeLeadingDotSegment(entryPath);\r\n // Trying to match files and directories by patterns.\r\n const isMatched = utils.pattern.matchAny(filepath, patternsRe);\r\n // A pattern with a trailling slash can be used for directory matching.\r\n // To apply such pattern, we need to add a tralling slash to the path.\r\n if (!isMatched && isDirectory) {\r\n return utils.pattern.matchAny(filepath + '/', patternsRe);\r\n }\r\n return isMatched;\r\n }\r\n}\r\nexports.default = EntryFilter;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst utils = require(\"../../utils\");\r\nclass ErrorFilter {\r\n constructor(_settings) {\r\n this._settings = _settings;\r\n }\r\n getFilter() {\r\n return (error) => this._isNonFatalError(error);\r\n }\r\n _isNonFatalError(error) {\r\n return utils.errno.isEnoentCodeError(error) || this._settings.suppressErrors;\r\n }\r\n}\r\nexports.default = ErrorFilter;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst utils = require(\"../../utils\");\r\nclass EntryTransformer {\r\n constructor(_settings) {\r\n this._settings = _settings;\r\n }\r\n getTransformer() {\r\n return (entry) => this._transform(entry);\r\n }\r\n _transform(entry) {\r\n let filepath = entry.path;\r\n if (this._settings.absolute) {\r\n filepath = utils.path.makeAbsolute(this._settings.cwd, filepath);\r\n filepath = utils.path.unixify(filepath);\r\n }\r\n if (this._settings.markDirectories && entry.dirent.isDirectory()) {\r\n filepath += '/';\r\n }\r\n if (!this._settings.objectMode) {\r\n return filepath;\r\n }\r\n return Object.assign(Object.assign({}, entry), { path: filepath });\r\n }\r\n}\r\nexports.default = EntryTransformer;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst path = require(\"path\");\r\nconst deep_1 = require(\"./filters/deep\");\r\nconst entry_1 = require(\"./filters/entry\");\r\nconst error_1 = require(\"./filters/error\");\r\nconst entry_2 = require(\"./transformers/entry\");\r\nclass Provider {\r\n constructor(_settings) {\r\n this._settings = _settings;\r\n this.errorFilter = new error_1.default(this._settings);\r\n this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions());\r\n this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions());\r\n this.entryTransformer = new entry_2.default(this._settings);\r\n }\r\n _getRootDirectory(task) {\r\n return path.resolve(this._settings.cwd, task.base);\r\n }\r\n _getReaderOptions(task) {\r\n const basePath = task.base === '.' ? '' : task.base;\r\n return {\r\n basePath,\r\n pathSegmentSeparator: '/',\r\n concurrency: this._settings.concurrency,\r\n deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative),\r\n entryFilter: this.entryFilter.getFilter(task.positive, task.negative),\r\n errorFilter: this.errorFilter.getFilter(),\r\n followSymbolicLinks: this._settings.followSymbolicLinks,\r\n fs: this._settings.fs,\r\n stats: this._settings.stats,\r\n throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink,\r\n transform: this.entryTransformer.getTransformer()\r\n };\r\n }\r\n _getMicromatchOptions() {\r\n return {\r\n dot: this._settings.dot,\r\n matchBase: this._settings.baseNameMatch,\r\n nobrace: !this._settings.braceExpansion,\r\n nocase: !this._settings.caseSensitiveMatch,\r\n noext: !this._settings.extglob,\r\n noglobstar: !this._settings.globstar,\r\n posix: true,\r\n strictSlashes: false\r\n };\r\n }\r\n}\r\nexports.default = Provider;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst async_1 = require(\"../readers/async\");\r\nconst provider_1 = require(\"./provider\");\r\nclass ProviderAsync extends provider_1.default {\r\n constructor() {\r\n super(...arguments);\r\n this._reader = new async_1.default(this._settings);\r\n }\r\n async read(task) {\r\n const root = this._getRootDirectory(task);\r\n const options = this._getReaderOptions(task);\r\n const entries = await this.api(root, task, options);\r\n return entries.map((entry) => options.transform(entry));\r\n }\r\n api(root, task, options) {\r\n if (task.dynamic) {\r\n return this._reader.dynamic(root, options);\r\n }\r\n return this._reader.static(task.patterns, options);\r\n }\r\n}\r\nexports.default = ProviderAsync;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst stream_1 = require(\"stream\");\r\nconst stream_2 = require(\"../readers/stream\");\r\nconst provider_1 = require(\"./provider\");\r\nclass ProviderStream extends provider_1.default {\r\n constructor() {\r\n super(...arguments);\r\n this._reader = new stream_2.default(this._settings);\r\n }\r\n read(task) {\r\n const root = this._getRootDirectory(task);\r\n const options = this._getReaderOptions(task);\r\n const source = this.api(root, task, options);\r\n const destination = new stream_1.Readable({ objectMode: true, read: () => { } });\r\n source\r\n .once('error', (error) => destination.emit('error', error))\r\n .on('data', (entry) => destination.emit('data', options.transform(entry)))\r\n .once('end', () => destination.emit('end'));\r\n destination\r\n .once('close', () => source.destroy());\r\n return destination;\r\n }\r\n api(root, task, options) {\r\n if (task.dynamic) {\r\n return this._reader.dynamic(root, options);\r\n }\r\n return this._reader.static(task.patterns, options);\r\n }\r\n}\r\nexports.default = ProviderStream;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst fsStat = require(\"@nodelib/fs.stat\");\r\nconst fsWalk = require(\"@nodelib/fs.walk\");\r\nconst reader_1 = require(\"./reader\");\r\nclass ReaderSync extends reader_1.default {\r\n constructor() {\r\n super(...arguments);\r\n this._walkSync = fsWalk.walkSync;\r\n this._statSync = fsStat.statSync;\r\n }\r\n dynamic(root, options) {\r\n return this._walkSync(root, options);\r\n }\r\n static(patterns, options) {\r\n const entries = [];\r\n for (const pattern of patterns) {\r\n const filepath = this._getFullEntryPath(pattern);\r\n const entry = this._getEntry(filepath, pattern, options);\r\n if (entry === null || !options.entryFilter(entry)) {\r\n continue;\r\n }\r\n entries.push(entry);\r\n }\r\n return entries;\r\n }\r\n _getEntry(filepath, pattern, options) {\r\n try {\r\n const stats = this._getStat(filepath);\r\n return this._makeEntry(stats, pattern);\r\n }\r\n catch (error) {\r\n if (options.errorFilter(error)) {\r\n return null;\r\n }\r\n throw error;\r\n }\r\n }\r\n _getStat(filepath) {\r\n return this._statSync(filepath, this._fsStatSettings);\r\n }\r\n}\r\nexports.default = ReaderSync;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst sync_1 = require(\"../readers/sync\");\r\nconst provider_1 = require(\"./provider\");\r\nclass ProviderSync extends provider_1.default {\r\n constructor() {\r\n super(...arguments);\r\n this._reader = new sync_1.default(this._settings);\r\n }\r\n read(task) {\r\n const root = this._getRootDirectory(task);\r\n const options = this._getReaderOptions(task);\r\n const entries = this.api(root, task, options);\r\n return entries.map(options.transform);\r\n }\r\n api(root, task, options) {\r\n if (task.dynamic) {\r\n return this._reader.dynamic(root, options);\r\n }\r\n return this._reader.static(task.patterns, options);\r\n }\r\n}\r\nexports.default = ProviderSync;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.DEFAULT_FILE_SYSTEM_ADAPTER = void 0;\r\nconst fs = require(\"fs\");\r\nconst os = require(\"os\");\r\n/**\r\n * The `os.cpus` method can return zero. We expect the number of cores to be greater than zero.\r\n * https://github.com/nodejs/node/blob/7faeddf23a98c53896f8b574a6e66589e8fb1eb8/lib/os.js#L106-L107\r\n */\r\nconst CPU_COUNT = Math.max(os.cpus().length, 1);\r\nexports.DEFAULT_FILE_SYSTEM_ADAPTER = {\r\n lstat: fs.lstat,\r\n lstatSync: fs.lstatSync,\r\n stat: fs.stat,\r\n statSync: fs.statSync,\r\n readdir: fs.readdir,\r\n readdirSync: fs.readdirSync\r\n};\r\nclass Settings {\r\n constructor(_options = {}) {\r\n this._options = _options;\r\n this.absolute = this._getValue(this._options.absolute, false);\r\n this.baseNameMatch = this._getValue(this._options.baseNameMatch, false);\r\n this.braceExpansion = this._getValue(this._options.braceExpansion, true);\r\n this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true);\r\n this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT);\r\n this.cwd = this._getValue(this._options.cwd, process.cwd());\r\n this.deep = this._getValue(this._options.deep, Infinity);\r\n this.dot = this._getValue(this._options.dot, false);\r\n this.extglob = this._getValue(this._options.extglob, true);\r\n this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true);\r\n this.fs = this._getFileSystemMethods(this._options.fs);\r\n this.globstar = this._getValue(this._options.globstar, true);\r\n this.ignore = this._getValue(this._options.ignore, []);\r\n this.markDirectories = this._getValue(this._options.markDirectories, false);\r\n this.objectMode = this._getValue(this._options.objectMode, false);\r\n this.onlyDirectories = this._getValue(this._options.onlyDirectories, false);\r\n this.onlyFiles = this._getValue(this._options.onlyFiles, true);\r\n this.stats = this._getValue(this._options.stats, false);\r\n this.suppressErrors = this._getValue(this._options.suppressErrors, false);\r\n this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, false);\r\n this.unique = this._getValue(this._options.unique, true);\r\n if (this.onlyDirectories) {\r\n this.onlyFiles = false;\r\n }\r\n if (this.stats) {\r\n this.objectMode = true;\r\n }\r\n }\r\n _getValue(option, value) {\r\n return option === undefined ? value : option;\r\n }\r\n _getFileSystemMethods(methods = {}) {\r\n return Object.assign(Object.assign({}, exports.DEFAULT_FILE_SYSTEM_ADAPTER), methods);\r\n }\r\n}\r\nexports.default = Settings;\r\n", "\"use strict\";\r\nconst taskManager = require(\"./managers/tasks\");\r\nconst patternManager = require(\"./managers/patterns\");\r\nconst async_1 = require(\"./providers/async\");\r\nconst stream_1 = require(\"./providers/stream\");\r\nconst sync_1 = require(\"./providers/sync\");\r\nconst settings_1 = require(\"./settings\");\r\nconst utils = require(\"./utils\");\r\nasync function FastGlob(source, options) {\r\n assertPatternsInput(source);\r\n const works = getWorks(source, async_1.default, options);\r\n const result = await Promise.all(works);\r\n return utils.array.flatten(result);\r\n}\r\n// https://github.com/typescript-eslint/typescript-eslint/issues/60\r\n// eslint-disable-next-line no-redeclare\r\n(function (FastGlob) {\r\n function sync(source, options) {\r\n assertPatternsInput(source);\r\n const works = getWorks(source, sync_1.default, options);\r\n return utils.array.flatten(works);\r\n }\r\n FastGlob.sync = sync;\r\n function stream(source, options) {\r\n assertPatternsInput(source);\r\n const works = getWorks(source, stream_1.default, options);\r\n /**\r\n * The stream returned by the provider cannot work with an asynchronous iterator.\r\n * To support asynchronous iterators, regardless of the number of tasks, we always multiplex streams.\r\n * This affects performance (+25%). I don't see best solution right now.\r\n */\r\n return utils.stream.merge(works);\r\n }\r\n FastGlob.stream = stream;\r\n function generateTasks(source, options) {\r\n assertPatternsInput(source);\r\n const patterns = patternManager.transform([].concat(source));\r\n const settings = new settings_1.default(options);\r\n return taskManager.generate(patterns, settings);\r\n }\r\n FastGlob.generateTasks = generateTasks;\r\n function isDynamicPattern(source, options) {\r\n assertPatternsInput(source);\r\n const settings = new settings_1.default(options);\r\n return utils.pattern.isDynamicPattern(source, settings);\r\n }\r\n FastGlob.isDynamicPattern = isDynamicPattern;\r\n function escapePath(source) {\r\n assertPatternsInput(source);\r\n return utils.path.escape(source);\r\n }\r\n FastGlob.escapePath = escapePath;\r\n})(FastGlob || (FastGlob = {}));\r\nfunction getWorks(source, _Provider, options) {\r\n const patterns = patternManager.transform([].concat(source));\r\n const settings = new settings_1.default(options);\r\n const tasks = taskManager.generate(patterns, settings);\r\n const provider = new _Provider(settings);\r\n return tasks.map(provider.read, provider);\r\n}\r\nfunction assertPatternsInput(input) {\r\n const source = [].concat(input);\r\n const isValidSource = source.every((item) => utils.string.isString(item) && !utils.string.isEmpty(item));\r\n if (!isValidSource) {\r\n throw new TypeError('Patterns must be a string (non empty) or an array of strings');\r\n }\r\n}\r\nmodule.exports = FastGlob;\r\n", "/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n var undefined;\n\n /** Used as the semantic version number. */\n var VERSION = '4.17.21';\n\n /** Used as the size to enable large array optimizations. */\n var LARGE_ARRAY_SIZE = 200;\n\n /** Error message constants. */\n var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n FUNC_ERROR_TEXT = 'Expected a function',\n INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';\n\n /** Used to stand-in for `undefined` hash values. */\n var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n /** Used as the maximum memoize cache size. */\n var MAX_MEMOIZE_SIZE = 500;\n\n /** Used as the internal argument placeholder. */\n var PLACEHOLDER = '__lodash_placeholder__';\n\n /** Used to compose bitmasks for cloning. */\n var CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n /** Used to compose bitmasks for value comparisons. */\n var COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n /** Used to compose bitmasks for function metadata. */\n var WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_BOUND_FLAG = 4,\n WRAP_CURRY_FLAG = 8,\n WRAP_CURRY_RIGHT_FLAG = 16,\n WRAP_PARTIAL_FLAG = 32,\n WRAP_PARTIAL_RIGHT_FLAG = 64,\n WRAP_ARY_FLAG = 128,\n WRAP_REARG_FLAG = 256,\n WRAP_FLIP_FLAG = 512;\n\n /** Used as default options for `_.truncate`. */\n var DEFAULT_TRUNC_LENGTH = 30,\n DEFAULT_TRUNC_OMISSION = '...';\n\n /** Used to detect hot functions by number of calls within a span of milliseconds. */\n var HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n /** Used to indicate the type of lazy iteratees. */\n var LAZY_FILTER_FLAG = 1,\n LAZY_MAP_FLAG = 2,\n LAZY_WHILE_FLAG = 3;\n\n /** Used as references for various `Number` constants. */\n var INFINITY = 1 / 0,\n MAX_SAFE_INTEGER = 9007199254740991,\n MAX_INTEGER = 1.7976931348623157e+308,\n NAN = 0 / 0;\n\n /** Used as references for the maximum length and index of an array. */\n var MAX_ARRAY_LENGTH = 4294967295,\n MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n /** Used to associate wrap methods with their bit flags. */\n var wrapFlags = [\n ['ary', WRAP_ARY_FLAG],\n ['bind', WRAP_BIND_FLAG],\n ['bindKey', WRAP_BIND_KEY_FLAG],\n ['curry', WRAP_CURRY_FLAG],\n ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n ['flip', WRAP_FLIP_FLAG],\n ['partial', WRAP_PARTIAL_FLAG],\n ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n ['rearg', WRAP_REARG_FLAG]\n ];\n\n /** `Object#toString` result references. */\n var argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n asyncTag = '[object AsyncFunction]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n domExcTag = '[object DOMException]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n nullTag = '[object Null]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n proxyTag = '[object Proxy]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n undefinedTag = '[object Undefined]',\n weakMapTag = '[object WeakMap]',\n weakSetTag = '[object WeakSet]';\n\n var arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n /** Used to match empty string literals in compiled template source. */\n var reEmptyStringLeading = /\\b__p \\+= '';/g,\n reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n /** Used to match HTML entities and HTML characters. */\n var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n reUnescapedHtml = /[&<>\"']/g,\n reHasEscapedHtml = RegExp(reEscapedHtml.source),\n reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n /** Used to match template delimiters. */\n var reEscape = /<%-([\\s\\S]+?)%>/g,\n reEvaluate = /<%([\\s\\S]+?)%>/g,\n reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n /** Used to match property names within property paths. */\n var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n /**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\n var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n reHasRegExpChar = RegExp(reRegExpChar.source);\n\n /** Used to match leading whitespace. */\n var reTrimStart = /^\\s+/;\n\n /** Used to match a single whitespace character. */\n var reWhitespace = /\\s/;\n\n /** Used to match wrap detail comments. */\n var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n reSplitDetails = /,? & /;\n\n /** Used to match words composed of alphanumeric characters. */\n var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n /**\n * Used to validate the `validate` option in `_.template` variable.\n *\n * Forbids characters which could potentially change the meaning of the function argument definition:\n * - \"(),\" (modification of function parameters)\n * - \"=\" (default value)\n * - \"[]{}\" (destructuring of function parameters)\n * - \"/\" (beginning of a comment)\n * - whitespace\n */\n var reForbiddenIdentifierChars = /[()=,{}\\[\\]\\/\\s]/;\n\n /** Used to match backslashes in property paths. */\n var reEscapeChar = /\\\\(\\\\)?/g;\n\n /**\n * Used to match\n * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n */\n var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n /** Used to match `RegExp` flags from their coerced string values. */\n var reFlags = /\\w*$/;\n\n /** Used to detect bad signed hexadecimal string values. */\n var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n /** Used to detect binary string values. */\n var reIsBinary = /^0b[01]+$/i;\n\n /** Used to detect host constructors (Safari). */\n var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n /** Used to detect octal string values. */\n var reIsOctal = /^0o[0-7]+$/i;\n\n /** Used to detect unsigned integer values. */\n var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n /** Used to match Latin Unicode letters (excluding mathematical operators). */\n var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n /** Used to ensure capturing order of template delimiters. */\n var reNoMatch = /($^)/;\n\n /** Used to match unescaped characters in compiled string literals. */\n var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n /** Used to compose unicode character classes. */\n var rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsDingbatRange = '\\\\u2700-\\\\u27bf',\n rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n rsPunctuationRange = '\\\\u2000-\\\\u206f',\n rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n rsVarRange = '\\\\ufe0e\\\\ufe0f',\n rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n /** Used to compose unicode capture groups. */\n var rsApos = \"['\\u2019]\",\n rsAstral = '[' + rsAstralRange + ']',\n rsBreak = '[' + rsBreakRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsDigits = '\\\\d+',\n rsDingbat = '[' + rsDingbatRange + ']',\n rsLower = '[' + rsLowerRange + ']',\n rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsUpper = '[' + rsUpperRange + ']',\n rsZWJ = '\\\\u200d';\n\n /** Used to compose unicode regexes. */\n var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n /** Used to match apostrophes. */\n var reApos = RegExp(rsApos, 'g');\n\n /**\n * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n */\n var reComboMark = RegExp(rsCombo, 'g');\n\n /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n /** Used to match complex or compound words. */\n var reUnicodeWord = RegExp([\n rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n rsUpper + '+' + rsOptContrUpper,\n rsOrdUpper,\n rsOrdLower,\n rsDigits,\n rsEmoji\n ].join('|'), 'g');\n\n /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n\n /** Used to detect strings that need a more robust regexp to match words. */\n var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n /** Used to assign default `context` object properties. */\n var contextProps = [\n 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n ];\n\n /** Used to make template sourceURLs easier to identify. */\n var templateCounter = -1;\n\n /** Used to identify `toStringTag` values of typed arrays. */\n var typedArrayTags = {};\n typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n typedArrayTags[uint32Tag] = true;\n typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n typedArrayTags[setTag] = typedArrayTags[stringTag] =\n typedArrayTags[weakMapTag] = false;\n\n /** Used to identify `toStringTag` values supported by `_.clone`. */\n var cloneableTags = {};\n cloneableTags[argsTag] = cloneableTags[arrayTag] =\n cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n cloneableTags[boolTag] = cloneableTags[dateTag] =\n cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n cloneableTags[int32Tag] = cloneableTags[mapTag] =\n cloneableTags[numberTag] = cloneableTags[objectTag] =\n cloneableTags[regexpTag] = cloneableTags[setTag] =\n cloneableTags[stringTag] = cloneableTags[symbolTag] =\n cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n cloneableTags[errorTag] = cloneableTags[funcTag] =\n cloneableTags[weakMapTag] = false;\n\n /** Used to map Latin Unicode letters to basic Latin letters. */\n var deburredLetters = {\n // Latin-1 Supplement block.\n '\\xc0': 'A', '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n '\\xe0': 'a', '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n '\\xc7': 'C', '\\xe7': 'c',\n '\\xd0': 'D', '\\xf0': 'd',\n '\\xc8': 'E', '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n '\\xe8': 'e', '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n '\\xcc': 'I', '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n '\\xec': 'i', '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n '\\xd1': 'N', '\\xf1': 'n',\n '\\xd2': 'O', '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n '\\xf2': 'o', '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n '\\xd9': 'U', '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n '\\xf9': 'u', '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n '\\xdd': 'Y', '\\xfd': 'y', '\\xff': 'y',\n '\\xc6': 'Ae', '\\xe6': 'ae',\n '\\xde': 'Th', '\\xfe': 'th',\n '\\xdf': 'ss',\n // Latin Extended-A block.\n '\\u0100': 'A', '\\u0102': 'A', '\\u0104': 'A',\n '\\u0101': 'a', '\\u0103': 'a', '\\u0105': 'a',\n '\\u0106': 'C', '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n '\\u0107': 'c', '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n '\\u010e': 'D', '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n '\\u0112': 'E', '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n '\\u0113': 'e', '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n '\\u011c': 'G', '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n '\\u011d': 'g', '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n '\\u0124': 'H', '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n '\\u0128': 'I', '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n '\\u0129': 'i', '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n '\\u0134': 'J', '\\u0135': 'j',\n '\\u0136': 'K', '\\u0137': 'k', '\\u0138': 'k',\n '\\u0139': 'L', '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n '\\u013a': 'l', '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n '\\u0143': 'N', '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n '\\u0144': 'n', '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n '\\u014c': 'O', '\\u014e': 'O', '\\u0150': 'O',\n '\\u014d': 'o', '\\u014f': 'o', '\\u0151': 'o',\n '\\u0154': 'R', '\\u0156': 'R', '\\u0158': 'R',\n '\\u0155': 'r', '\\u0157': 'r', '\\u0159': 'r',\n '\\u015a': 'S', '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n '\\u015b': 's', '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n '\\u0162': 'T', '\\u0164': 'T', '\\u0166': 'T',\n '\\u0163': 't', '\\u0165': 't', '\\u0167': 't',\n '\\u0168': 'U', '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n '\\u0169': 'u', '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n '\\u0174': 'W', '\\u0175': 'w',\n '\\u0176': 'Y', '\\u0177': 'y', '\\u0178': 'Y',\n '\\u0179': 'Z', '\\u017b': 'Z', '\\u017d': 'Z',\n '\\u017a': 'z', '\\u017c': 'z', '\\u017e': 'z',\n '\\u0132': 'IJ', '\\u0133': 'ij',\n '\\u0152': 'Oe', '\\u0153': 'oe',\n '\\u0149': \"'n\", '\\u017f': 's'\n };\n\n /** Used to map characters to HTML entities. */\n var htmlEscapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n };\n\n /** Used to map HTML entities to characters. */\n var htmlUnescapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\"\n };\n\n /** Used to escape characters for inclusion in compiled string literals. */\n var stringEscapes = {\n '\\\\': '\\\\',\n \"'\": \"'\",\n '\\n': 'n',\n '\\r': 'r',\n '\\u2028': 'u2028',\n '\\u2029': 'u2029'\n };\n\n /** Built-in method references without a dependency on `root`. */\n var freeParseFloat = parseFloat,\n freeParseInt = parseInt;\n\n /** Detect free variable `global` from Node.js. */\n var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n /** Detect free variable `self`. */\n var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n /** Used as a reference to the global object. */\n var root = freeGlobal || freeSelf || Function('return this')();\n\n /** Detect free variable `exports`. */\n var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n /** Detect free variable `module`. */\n var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n /** Detect the popular CommonJS extension `module.exports`. */\n var moduleExports = freeModule && freeModule.exports === freeExports;\n\n /** Detect free variable `process` from Node.js. */\n var freeProcess = moduleExports && freeGlobal.process;\n\n /** Used to access faster Node.js helpers. */\n var nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n }());\n\n /* Node.js helper references. */\n var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n nodeIsDate = nodeUtil && nodeUtil.isDate,\n nodeIsMap = nodeUtil && nodeUtil.isMap,\n nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n nodeIsSet = nodeUtil && nodeUtil.isSet,\n nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\n function apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n }\n\n /**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\n function arrayAggregator(array, setter, iteratee, accumulator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n var value = array[index];\n setter(accumulator, value, iteratee(value), array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\n function arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n }\n\n /**\n * A specialized version of `_.forEachRight` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\n function arrayEachRight(array, iteratee) {\n var length = array == null ? 0 : array.length;\n\n while (length--) {\n if (iteratee(array[length], length, array) === false) {\n break;\n }\n }\n return array;\n }\n\n /**\n * A specialized version of `_.every` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n */\n function arrayEvery(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (!predicate(array[index], index, array)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\n function arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n }\n\n /**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\n function arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n }\n\n /**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\n function arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n }\n\n /**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\n function arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.reduceRight` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the last element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\n function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n var length = array == null ? 0 : array.length;\n if (initAccum && length) {\n accumulator = array[--length];\n }\n while (length--) {\n accumulator = iteratee(accumulator, array[length], length, array);\n }\n return accumulator;\n }\n\n /**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\n function arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Gets the size of an ASCII `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\n var asciiSize = baseProperty('length');\n\n /**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function asciiToArray(string) {\n return string.split('');\n }\n\n /**\n * Splits an ASCII `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\n function asciiWords(string) {\n return string.match(reAsciiWord) || [];\n }\n\n /**\n * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n * without support for iteratee shorthands, which iterates over `collection`\n * using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the found element or its key, else `undefined`.\n */\n function baseFindKey(collection, predicate, eachFunc) {\n var result;\n eachFunc(collection, function(value, key, collection) {\n if (predicate(value, key, collection)) {\n result = key;\n return false;\n }\n });\n return result;\n }\n\n /**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n }\n\n /**\n * This function is like `baseIndexOf` except that it accepts a comparator.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function baseIndexOfWith(array, value, fromIndex, comparator) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (comparator(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\n function baseIsNaN(value) {\n return value !== value;\n }\n\n /**\n * The base implementation of `_.mean` and `_.meanBy` without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the mean.\n */\n function baseMean(array, iteratee) {\n var length = array == null ? 0 : array.length;\n return length ? (baseSum(array, iteratee) / length) : NAN;\n }\n\n /**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\n function baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n }\n\n /**\n * The base implementation of `_.propertyOf` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n */\n function basePropertyOf(object) {\n return function(key) {\n return object == null ? undefined : object[key];\n };\n }\n\n /**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n * `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\n function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n eachFunc(collection, function(value, index, collection) {\n accumulator = initAccum\n ? (initAccum = false, value)\n : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\n function baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n }\n\n /**\n * The base implementation of `_.sum` and `_.sumBy` without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {number} Returns the sum.\n */\n function baseSum(array, iteratee) {\n var result,\n index = -1,\n length = array.length;\n\n while (++index < length) {\n var current = iteratee(array[index]);\n if (current !== undefined) {\n result = result === undefined ? current : (result + current);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\n function baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n * of key-value pairs for `object` corresponding to the property names of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the key-value pairs.\n */\n function baseToPairs(object, props) {\n return arrayMap(props, function(key) {\n return [key, object[key]];\n });\n }\n\n /**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\n function baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n }\n\n /**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\n function baseUnary(func) {\n return function(value) {\n return func(value);\n };\n }\n\n /**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\n function baseValues(object, props) {\n return arrayMap(props, function(key) {\n return object[key];\n });\n }\n\n /**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function cacheHas(cache, key) {\n return cache.has(key);\n }\n\n /**\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the first unmatched string symbol.\n */\n function charsStartIndex(strSymbols, chrSymbols) {\n var index = -1,\n length = strSymbols.length;\n\n while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n }\n\n /**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the last unmatched string symbol.\n */\n function charsEndIndex(strSymbols, chrSymbols) {\n var index = strSymbols.length;\n\n while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n }\n\n /**\n * Gets the number of `placeholder` occurrences in `array`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} placeholder The placeholder to search for.\n * @returns {number} Returns the placeholder count.\n */\n function countHolders(array, placeholder) {\n var length = array.length,\n result = 0;\n\n while (length--) {\n if (array[length] === placeholder) {\n ++result;\n }\n }\n return result;\n }\n\n /**\n * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n * letters to basic Latin letters.\n *\n * @private\n * @param {string} letter The matched letter to deburr.\n * @returns {string} Returns the deburred letter.\n */\n var deburrLetter = basePropertyOf(deburredLetters);\n\n /**\n * Used by `_.escape` to convert characters to HTML entities.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n /**\n * Used by `_.template` to escape characters for inclusion in compiled string literals.\n *\n * @private\n * @param {string} chr The matched character to escape.\n * @returns {string} Returns the escaped character.\n */\n function escapeStringChar(chr) {\n return '\\\\' + stringEscapes[chr];\n }\n\n /**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\n function getValue(object, key) {\n return object == null ? undefined : object[key];\n }\n\n /**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\n function hasUnicode(string) {\n return reHasUnicode.test(string);\n }\n\n /**\n * Checks if `string` contains a word composed of Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a word is found, else `false`.\n */\n function hasUnicodeWord(string) {\n return reHasUnicodeWord.test(string);\n }\n\n /**\n * Converts `iterator` to an array.\n *\n * @private\n * @param {Object} iterator The iterator to convert.\n * @returns {Array} Returns the converted array.\n */\n function iteratorToArray(iterator) {\n var data,\n result = [];\n\n while (!(data = iterator.next()).done) {\n result.push(data.value);\n }\n return result;\n }\n\n /**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\n function mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n }\n\n /**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\n function overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n }\n\n /**\n * Replaces all `placeholder` elements in `array` with an internal placeholder\n * and returns an array of their indexes.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {*} placeholder The placeholder to replace.\n * @returns {Array} Returns the new array of placeholder indexes.\n */\n function replaceHolders(array, placeholder) {\n var index = -1,\n length = array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value === placeholder || value === PLACEHOLDER) {\n array[index] = PLACEHOLDER;\n result[resIndex++] = index;\n }\n }\n return result;\n }\n\n /**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\n function setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n }\n\n /**\n * Converts `set` to its value-value pairs.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the value-value pairs.\n */\n function setToPairs(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = [value, value];\n });\n return result;\n }\n\n /**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * A specialized version of `_.lastIndexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function strictLastIndexOf(array, value, fromIndex) {\n var index = fromIndex + 1;\n while (index--) {\n if (array[index] === value) {\n return index;\n }\n }\n return index;\n }\n\n /**\n * Gets the number of symbols in `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the string size.\n */\n function stringSize(string) {\n return hasUnicode(string)\n ? unicodeSize(string)\n : asciiSize(string);\n }\n\n /**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n }\n\n /**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\n function trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n }\n\n /**\n * Used by `_.unescape` to convert HTML entities to characters.\n *\n * @private\n * @param {string} chr The matched character to unescape.\n * @returns {string} Returns the unescaped character.\n */\n var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n /**\n * Gets the size of a Unicode `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\n function unicodeSize(string) {\n var result = reUnicode.lastIndex = 0;\n while (reUnicode.test(string)) {\n ++result;\n }\n return result;\n }\n\n /**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\n function unicodeToArray(string) {\n return string.match(reUnicode) || [];\n }\n\n /**\n * Splits a Unicode `string` into an array of its words.\n *\n * @private\n * @param {string} The string to inspect.\n * @returns {Array} Returns the words of `string`.\n */\n function unicodeWords(string) {\n return string.match(reUnicodeWord) || [];\n }\n\n /*--------------------------------------------------------------------------*/\n\n /**\n * Create a new pristine `lodash` function using the `context` object.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Util\n * @param {Object} [context=root] The context object.\n * @returns {Function} Returns a new `lodash` function.\n * @example\n *\n * _.mixin({ 'foo': _.constant('foo') });\n *\n * var lodash = _.runInContext();\n * lodash.mixin({ 'bar': lodash.constant('bar') });\n *\n * _.isFunction(_.foo);\n * // => true\n * _.isFunction(_.bar);\n * // => false\n *\n * lodash.isFunction(lodash.foo);\n * // => false\n * lodash.isFunction(lodash.bar);\n * // => true\n *\n * // Create a suped-up `defer` in Node.js.\n * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n */\n var runInContext = (function runInContext(context) {\n context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n /** Built-in constructor references. */\n var Array = context.Array,\n Date = context.Date,\n Error = context.Error,\n Function = context.Function,\n Math = context.Math,\n Object = context.Object,\n RegExp = context.RegExp,\n String = context.String,\n TypeError = context.TypeError;\n\n /** Used for built-in method references. */\n var arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n /** Used to detect overreaching core-js shims. */\n var coreJsData = context['__core-js_shared__'];\n\n /** Used to resolve the decompiled source of functions. */\n var funcToString = funcProto.toString;\n\n /** Used to check objects for own properties. */\n var hasOwnProperty = objectProto.hasOwnProperty;\n\n /** Used to generate unique IDs. */\n var idCounter = 0;\n\n /** Used to detect methods masquerading as native. */\n var maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n }());\n\n /**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\n var nativeObjectToString = objectProto.toString;\n\n /** Used to infer the `Object` constructor. */\n var objectCtorString = funcToString.call(Object);\n\n /** Used to restore the original `_` reference in `_.noConflict`. */\n var oldDash = root._;\n\n /** Used to detect if a method is native. */\n var reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n );\n\n /** Built-in value references. */\n var Buffer = moduleExports ? context.Buffer : undefined,\n Symbol = context.Symbol,\n Uint8Array = context.Uint8Array,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n getPrototype = overArg(Object.getPrototypeOf, Object),\n objectCreate = Object.create,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice,\n spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n symIterator = Symbol ? Symbol.iterator : undefined,\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n var defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n }());\n\n /** Mocked built-ins. */\n var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n ctxNow = Date && Date.now !== root.Date.now && Date.now,\n ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n /* Built-in method references for those with the same name as other `lodash` methods. */\n var nativeCeil = Math.ceil,\n nativeFloor = Math.floor,\n nativeGetSymbols = Object.getOwnPropertySymbols,\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n nativeIsFinite = context.isFinite,\n nativeJoin = arrayProto.join,\n nativeKeys = overArg(Object.keys, Object),\n nativeMax = Math.max,\n nativeMin = Math.min,\n nativeNow = Date.now,\n nativeParseInt = context.parseInt,\n nativeRandom = Math.random,\n nativeReverse = arrayProto.reverse;\n\n /* Built-in method references that are verified to be native. */\n var DataView = getNative(context, 'DataView'),\n Map = getNative(context, 'Map'),\n Promise = getNative(context, 'Promise'),\n Set = getNative(context, 'Set'),\n WeakMap = getNative(context, 'WeakMap'),\n nativeCreate = getNative(Object, 'create');\n\n /** Used to store function metadata. */\n var metaMap = WeakMap && new WeakMap;\n\n /** Used to lookup unminified function names. */\n var realNames = {};\n\n /** Used to detect maps, sets, and weakmaps. */\n var dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n /** Used to convert symbols to primitives and strings. */\n var symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` object which wraps `value` to enable implicit method\n * chain sequences. Methods that operate on and return arrays, collections,\n * and functions can be chained together. Methods that retrieve a single value\n * or may return a primitive value will automatically end the chain sequence\n * and return the unwrapped value. Otherwise, the value must be unwrapped\n * with `_#value`.\n *\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n * enabled using `_.chain`.\n *\n * The execution of chained methods is lazy, that is, it's deferred until\n * `_#value` is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion.\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n * the creation of intermediate arrays and can greatly reduce the number of\n * iteratee executions. Sections of a chain sequence qualify for shortcut\n * fusion if the section is applied to an array and iteratees accept only\n * one argument. The heuristic for whether a section qualifies for shortcut\n * fusion is subject to change.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n * `zipObject`, `zipObjectDeep`, and `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n * `upperFirst`, `value`, and `words`\n *\n * @name _\n * @constructor\n * @category Seq\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // Returns an unwrapped value.\n * wrapped.reduce(_.add);\n * // => 6\n *\n * // Returns a wrapped value.\n * var squares = wrapped.map(square);\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\n function lodash(value) {\n if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n if (value instanceof LodashWrapper) {\n return value;\n }\n if (hasOwnProperty.call(value, '__wrapped__')) {\n return wrapperClone(value);\n }\n }\n return new LodashWrapper(value);\n }\n\n /**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\n var baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n }());\n\n /**\n * The function whose prototype chain sequence wrappers inherit from.\n *\n * @private\n */\n function baseLodash() {\n // No operation performed.\n }\n\n /**\n * The base constructor for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap.\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\n */\n function LodashWrapper(value, chainAll) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__chain__ = !!chainAll;\n this.__index__ = 0;\n this.__values__ = undefined;\n }\n\n /**\n * By default, the template delimiters used by lodash are like those in\n * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n * following template settings to use alternative delimiters.\n *\n * @static\n * @memberOf _\n * @type {Object}\n */\n lodash.templateSettings = {\n\n /**\n * Used to detect `data` property values to be HTML-escaped.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'escape': reEscape,\n\n /**\n * Used to detect code to be evaluated.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'evaluate': reEvaluate,\n\n /**\n * Used to detect `data` property values to inject.\n *\n * @memberOf _.templateSettings\n * @type {RegExp}\n */\n 'interpolate': reInterpolate,\n\n /**\n * Used to reference the data object in the template text.\n *\n * @memberOf _.templateSettings\n * @type {string}\n */\n 'variable': '',\n\n /**\n * Used to import variables into the compiled template.\n *\n * @memberOf _.templateSettings\n * @type {Object}\n */\n 'imports': {\n\n /**\n * A reference to the `lodash` function.\n *\n * @memberOf _.templateSettings.imports\n * @type {Function}\n */\n '_': lodash\n }\n };\n\n // Ensure wrappers are instances of `baseLodash`.\n lodash.prototype = baseLodash.prototype;\n lodash.prototype.constructor = lodash;\n\n LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n LodashWrapper.prototype.constructor = LodashWrapper;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @constructor\n * @param {*} value The value to wrap.\n */\n function LazyWrapper(value) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__dir__ = 1;\n this.__filtered__ = false;\n this.__iteratees__ = [];\n this.__takeCount__ = MAX_ARRAY_LENGTH;\n this.__views__ = [];\n }\n\n /**\n * Creates a clone of the lazy wrapper object.\n *\n * @private\n * @name clone\n * @memberOf LazyWrapper\n * @returns {Object} Returns the cloned `LazyWrapper` object.\n */\n function lazyClone() {\n var result = new LazyWrapper(this.__wrapped__);\n result.__actions__ = copyArray(this.__actions__);\n result.__dir__ = this.__dir__;\n result.__filtered__ = this.__filtered__;\n result.__iteratees__ = copyArray(this.__iteratees__);\n result.__takeCount__ = this.__takeCount__;\n result.__views__ = copyArray(this.__views__);\n return result;\n }\n\n /**\n * Reverses the direction of lazy iteration.\n *\n * @private\n * @name reverse\n * @memberOf LazyWrapper\n * @returns {Object} Returns the new reversed `LazyWrapper` object.\n */\n function lazyReverse() {\n if (this.__filtered__) {\n var result = new LazyWrapper(this);\n result.__dir__ = -1;\n result.__filtered__ = true;\n } else {\n result = this.clone();\n result.__dir__ *= -1;\n }\n return result;\n }\n\n /**\n * Extracts the unwrapped value from its lazy wrapper.\n *\n * @private\n * @name value\n * @memberOf LazyWrapper\n * @returns {*} Returns the unwrapped value.\n */\n function lazyValue() {\n var array = this.__wrapped__.value(),\n dir = this.__dir__,\n isArr = isArray(array),\n isRight = dir < 0,\n arrLength = isArr ? array.length : 0,\n view = getView(0, arrLength, this.__views__),\n start = view.start,\n end = view.end,\n length = end - start,\n index = isRight ? end : (start - 1),\n iteratees = this.__iteratees__,\n iterLength = iteratees.length,\n resIndex = 0,\n takeCount = nativeMin(length, this.__takeCount__);\n\n if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n return baseWrapperValue(array, this.__actions__);\n }\n var result = [];\n\n outer:\n while (length-- && resIndex < takeCount) {\n index += dir;\n\n var iterIndex = -1,\n value = array[index];\n\n while (++iterIndex < iterLength) {\n var data = iteratees[iterIndex],\n iteratee = data.iteratee,\n type = data.type,\n computed = iteratee(value);\n\n if (type == LAZY_MAP_FLAG) {\n value = computed;\n } else if (!computed) {\n if (type == LAZY_FILTER_FLAG) {\n continue outer;\n } else {\n break outer;\n }\n }\n }\n result[resIndex++] = value;\n }\n return result;\n }\n\n // Ensure `LazyWrapper` is an instance of `baseLodash`.\n LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n LazyWrapper.prototype.constructor = LazyWrapper;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\n function hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n }\n\n /**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n }\n\n /**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\n function hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n }\n\n // Add methods to `Hash`.\n Hash.prototype.clear = hashClear;\n Hash.prototype['delete'] = hashDelete;\n Hash.prototype.get = hashGet;\n Hash.prototype.has = hashHas;\n Hash.prototype.set = hashSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\n function listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n }\n\n /**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n }\n\n /**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n }\n\n /**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\n function listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n }\n\n // Add methods to `ListCache`.\n ListCache.prototype.clear = listCacheClear;\n ListCache.prototype['delete'] = listCacheDelete;\n ListCache.prototype.get = listCacheGet;\n ListCache.prototype.has = listCacheHas;\n ListCache.prototype.set = listCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n }\n\n /**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\n function mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n }\n\n /**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n }\n\n /**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function mapCacheGet(key) {\n return getMapData(this, key).get(key);\n }\n\n /**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function mapCacheHas(key) {\n return getMapData(this, key).has(key);\n }\n\n /**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\n function mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n }\n\n // Add methods to `MapCache`.\n MapCache.prototype.clear = mapCacheClear;\n MapCache.prototype['delete'] = mapCacheDelete;\n MapCache.prototype.get = mapCacheGet;\n MapCache.prototype.has = mapCacheHas;\n MapCache.prototype.set = mapCacheSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\n function SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n }\n\n /**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\n function setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n }\n\n /**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\n function setCacheHas(value) {\n return this.__data__.has(value);\n }\n\n // Add methods to `SetCache`.\n SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n SetCache.prototype.has = setCacheHas;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n function Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n }\n\n /**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\n function stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n }\n\n /**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n function stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n }\n\n /**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n function stackGet(key) {\n return this.__data__.get(key);\n }\n\n /**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n function stackHas(key) {\n return this.__data__.has(key);\n }\n\n /**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\n function stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n }\n\n // Add methods to `Stack`.\n Stack.prototype.clear = stackClear;\n Stack.prototype['delete'] = stackDelete;\n Stack.prototype.get = stackGet;\n Stack.prototype.has = stackHas;\n Stack.prototype.set = stackSet;\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\n function arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `_.sample` for arrays.\n *\n * @private\n * @param {Array} array The array to sample.\n * @returns {*} Returns the random element.\n */\n function arraySample(array) {\n var length = array.length;\n return length ? array[baseRandom(0, length - 1)] : undefined;\n }\n\n /**\n * A specialized version of `_.sampleSize` for arrays.\n *\n * @private\n * @param {Array} array The array to sample.\n * @param {number} n The number of elements to sample.\n * @returns {Array} Returns the random elements.\n */\n function arraySampleSize(array, n) {\n return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n }\n\n /**\n * A specialized version of `_.shuffle` for arrays.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */\n function arrayShuffle(array) {\n return shuffleSelf(copyArray(array));\n }\n\n /**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n }\n\n /**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n }\n\n /**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n function assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n }\n\n /**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\n function baseAggregator(collection, setter, iteratee, accumulator) {\n baseEach(collection, function(value, key, collection) {\n setter(accumulator, value, iteratee(value), collection);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\n function baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n }\n\n /**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\n function baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n }\n\n /**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\n function baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n }\n\n /**\n * The base implementation of `_.at` without support for individual paths.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {string[]} paths The property paths to pick.\n * @returns {Array} Returns the picked elements.\n */\n function baseAt(object, paths) {\n var index = -1,\n length = paths.length,\n result = Array(length),\n skip = object == null;\n\n while (++index < length) {\n result[index] = skip ? undefined : get(object, paths[index]);\n }\n return result;\n }\n\n /**\n * The base implementation of `_.clamp` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n */\n function baseClamp(number, lower, upper) {\n if (number === number) {\n if (upper !== undefined) {\n number = number <= upper ? number : upper;\n }\n if (lower !== undefined) {\n number = number >= lower ? number : lower;\n }\n }\n return number;\n }\n\n /**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\n function baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n }\n\n /**\n * The base implementation of `_.conforms` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property predicates to conform to.\n * @returns {Function} Returns the new spec function.\n */\n function baseConforms(source) {\n var props = keys(source);\n return function(object) {\n return baseConformsTo(object, source, props);\n };\n }\n\n /**\n * The base implementation of `_.conformsTo` which accepts `props` to check.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n */\n function baseConformsTo(object, source, props) {\n var length = props.length;\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (length--) {\n var key = props[length],\n predicate = source[key],\n value = object[key];\n\n if ((value === undefined && !(key in object)) || !predicate(value)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * The base implementation of `_.delay` and `_.defer` which accepts `args`\n * to provide to `func`.\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {Array} args The arguments to provide to `func`.\n * @returns {number|Object} Returns the timer id or timeout object.\n */\n function baseDelay(func, wait, args) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return setTimeout(function() { func.apply(undefined, args); }, wait);\n }\n\n /**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\n function baseDifference(array, values, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n isCommon = true,\n length = array.length,\n result = [],\n valuesLength = values.length;\n\n if (!length) {\n return result;\n }\n if (iteratee) {\n values = arrayMap(values, baseUnary(iteratee));\n }\n if (comparator) {\n includes = arrayIncludesWith;\n isCommon = false;\n }\n else if (values.length >= LARGE_ARRAY_SIZE) {\n includes = cacheHas;\n isCommon = false;\n values = new SetCache(values);\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee == null ? value : iteratee(value);\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var valuesIndex = valuesLength;\n while (valuesIndex--) {\n if (values[valuesIndex] === computed) {\n continue outer;\n }\n }\n result.push(value);\n }\n else if (!includes(values, computed, comparator)) {\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\n var baseEach = createBaseEach(baseForOwn);\n\n /**\n * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\n var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n /**\n * The base implementation of `_.every` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`\n */\n function baseEvery(collection, predicate) {\n var result = true;\n baseEach(collection, function(value, index, collection) {\n result = !!predicate(value, index, collection);\n return result;\n });\n return result;\n }\n\n /**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\n function baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.fill` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n */\n function baseFill(array, value, start, end) {\n var length = array.length;\n\n start = toInteger(start);\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = (end === undefined || end > length) ? length : toInteger(end);\n if (end < 0) {\n end += length;\n }\n end = start > end ? 0 : toLength(end);\n while (start < end) {\n array[start++] = value;\n }\n return array;\n }\n\n /**\n * The base implementation of `_.filter` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\n function baseFilter(collection, predicate) {\n var result = [];\n baseEach(collection, function(value, index, collection) {\n if (predicate(value, index, collection)) {\n result.push(value);\n }\n });\n return result;\n }\n\n /**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\n function baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\n var baseFor = createBaseFor();\n\n /**\n * This function is like `baseFor` except that it iterates over properties\n * in the opposite order.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\n var baseForRight = createBaseFor(true);\n\n /**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n }\n\n /**\n * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\n function baseForOwnRight(object, iteratee) {\n return object && baseForRight(object, iteratee, keys);\n }\n\n /**\n * The base implementation of `_.functions` which creates an array of\n * `object` function property names filtered from `props`.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Array} props The property names to filter.\n * @returns {Array} Returns the function names.\n */\n function baseFunctions(object, props) {\n return arrayFilter(props, function(key) {\n return isFunction(object[key]);\n });\n }\n\n /**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\n function baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n }\n\n /**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n }\n\n /**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n function baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n }\n\n /**\n * The base implementation of `_.gt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n */\n function baseGt(value, other) {\n return value > other;\n }\n\n /**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\n function baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n }\n\n /**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\n function baseHasIn(object, key) {\n return object != null && key in Object(object);\n }\n\n /**\n * The base implementation of `_.inRange` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to check.\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n */\n function baseInRange(number, start, end) {\n return number >= nativeMin(start, end) && number < nativeMax(start, end);\n }\n\n /**\n * The base implementation of methods like `_.intersection`, without support\n * for iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of shared values.\n */\n function baseIntersection(arrays, iteratee, comparator) {\n var includes = comparator ? arrayIncludesWith : arrayIncludes,\n length = arrays[0].length,\n othLength = arrays.length,\n othIndex = othLength,\n caches = Array(othLength),\n maxLength = Infinity,\n result = [];\n\n while (othIndex--) {\n var array = arrays[othIndex];\n if (othIndex && iteratee) {\n array = arrayMap(array, baseUnary(iteratee));\n }\n maxLength = nativeMin(array.length, maxLength);\n caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n ? new SetCache(othIndex && array)\n : undefined;\n }\n array = arrays[0];\n\n var index = -1,\n seen = caches[0];\n\n outer:\n while (++index < length && result.length < maxLength) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (!(seen\n ? cacheHas(seen, computed)\n : includes(result, computed, comparator)\n )) {\n othIndex = othLength;\n while (--othIndex) {\n var cache = caches[othIndex];\n if (!(cache\n ? cacheHas(cache, computed)\n : includes(arrays[othIndex], computed, comparator))\n ) {\n continue outer;\n }\n }\n if (seen) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.invert` and `_.invertBy` which inverts\n * `object` with values transformed by `iteratee` and set by `setter`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform values.\n * @param {Object} accumulator The initial inverted object.\n * @returns {Function} Returns `accumulator`.\n */\n function baseInverter(object, setter, iteratee, accumulator) {\n baseForOwn(object, function(value, key, object) {\n setter(accumulator, iteratee(value), key, object);\n });\n return accumulator;\n }\n\n /**\n * The base implementation of `_.invoke` without support for individual\n * method arguments.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {Array} args The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n */\n function baseInvoke(object, path, args) {\n path = castPath(path, object);\n object = parent(object, path);\n var func = object == null ? object : object[toKey(last(path))];\n return func == null ? undefined : apply(func, object, args);\n }\n\n /**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\n function baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n }\n\n /**\n * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n */\n function baseIsArrayBuffer(value) {\n return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n }\n\n /**\n * The base implementation of `_.isDate` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n */\n function baseIsDate(value) {\n return isObjectLike(value) && baseGetTag(value) == dateTag;\n }\n\n /**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\n function baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n }\n\n /**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n }\n\n /**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\n function baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n }\n\n /**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\n function baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n }\n\n /**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\n function baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n }\n\n /**\n * The base implementation of `_.isRegExp` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n */\n function baseIsRegExp(value) {\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\n }\n\n /**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\n function baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n }\n\n /**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\n function baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n }\n\n /**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\n function baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n }\n\n /**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.lt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n */\n function baseLt(value, other) {\n return value < other;\n }\n\n /**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\n function baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n }\n\n /**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\n function baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n }\n\n /**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\n function baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n }\n\n /**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\n function baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n }\n\n /**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\n function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n }\n\n /**\n * The base implementation of `_.nth` which doesn't coerce arguments.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {number} n The index of the element to return.\n * @returns {*} Returns the nth element of `array`.\n */\n function baseNth(array, n) {\n var length = array.length;\n if (!length) {\n return;\n }\n n += n < 0 ? length : 0;\n return isIndex(n, length) ? array[n] : undefined;\n }\n\n /**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\n function baseOrderBy(collection, iteratees, orders) {\n if (iteratees.length) {\n iteratees = arrayMap(iteratees, function(iteratee) {\n if (isArray(iteratee)) {\n return function(value) {\n return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n }\n }\n return iteratee;\n });\n } else {\n iteratees = [identity];\n }\n\n var index = -1;\n iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n }\n\n /**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @returns {Object} Returns the new object.\n */\n function basePick(object, paths) {\n return basePickBy(object, paths, function(value, path) {\n return hasIn(object, path);\n });\n }\n\n /**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\n function basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n }\n\n /**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\n function basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n }\n\n /**\n * The base implementation of `_.pullAllBy` without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n */\n function basePullAll(array, values, iteratee, comparator) {\n var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n index = -1,\n length = values.length,\n seen = array;\n\n if (array === values) {\n values = copyArray(values);\n }\n if (iteratee) {\n seen = arrayMap(array, baseUnary(iteratee));\n }\n while (++index < length) {\n var fromIndex = 0,\n value = values[index],\n computed = iteratee ? iteratee(value) : value;\n\n while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n if (seen !== array) {\n splice.call(seen, fromIndex, 1);\n }\n splice.call(array, fromIndex, 1);\n }\n }\n return array;\n }\n\n /**\n * The base implementation of `_.pullAt` without support for individual\n * indexes or capturing the removed elements.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {number[]} indexes The indexes of elements to remove.\n * @returns {Array} Returns `array`.\n */\n function basePullAt(array, indexes) {\n var length = array ? indexes.length : 0,\n lastIndex = length - 1;\n\n while (length--) {\n var index = indexes[length];\n if (length == lastIndex || index !== previous) {\n var previous = index;\n if (isIndex(index)) {\n splice.call(array, index, 1);\n } else {\n baseUnset(array, index);\n }\n }\n }\n return array;\n }\n\n /**\n * The base implementation of `_.random` without support for returning\n * floating-point numbers.\n *\n * @private\n * @param {number} lower The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the random number.\n */\n function baseRandom(lower, upper) {\n return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n }\n\n /**\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\n * coerce arguments.\n *\n * @private\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @param {number} step The value to increment or decrement by.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the range of numbers.\n */\n function baseRange(start, end, step, fromRight) {\n var index = -1,\n length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n result = Array(length);\n\n while (length--) {\n result[fromRight ? length : ++index] = start;\n start += step;\n }\n return result;\n }\n\n /**\n * The base implementation of `_.repeat` which doesn't coerce arguments.\n *\n * @private\n * @param {string} string The string to repeat.\n * @param {number} n The number of times to repeat the string.\n * @returns {string} Returns the repeated string.\n */\n function baseRepeat(string, n) {\n var result = '';\n if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n return result;\n }\n // Leverage the exponentiation by squaring algorithm for a faster repeat.\n // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n do {\n if (n % 2) {\n result += string;\n }\n n = nativeFloor(n / 2);\n if (n) {\n string += string;\n }\n } while (n);\n\n return result;\n }\n\n /**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\n function baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n }\n\n /**\n * The base implementation of `_.sample`.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n */\n function baseSample(collection) {\n return arraySample(values(collection));\n }\n\n /**\n * The base implementation of `_.sampleSize` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to sample.\n * @param {number} n The number of elements to sample.\n * @returns {Array} Returns the random elements.\n */\n function baseSampleSize(collection, n) {\n var array = values(collection);\n return shuffleSelf(array, baseClamp(n, 0, array.length));\n }\n\n /**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\n function baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return object;\n }\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n }\n\n /**\n * The base implementation of `setData` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var baseSetData = !metaMap ? identity : function(func, data) {\n metaMap.set(func, data);\n return func;\n };\n\n /**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n };\n\n /**\n * The base implementation of `_.shuffle`.\n *\n * @private\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n */\n function baseShuffle(collection) {\n return shuffleSelf(values(collection));\n }\n\n /**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\n function baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n }\n\n /**\n * The base implementation of `_.some` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\n function baseSome(collection, predicate) {\n var result;\n\n baseEach(collection, function(value, index, collection) {\n result = predicate(value, index, collection);\n return !result;\n });\n return !!result;\n }\n\n /**\n * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n * performs a binary search of `array` to determine the index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function baseSortedIndex(array, value, retHighest) {\n var low = 0,\n high = array == null ? low : array.length;\n\n if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n while (low < high) {\n var mid = (low + high) >>> 1,\n computed = array[mid];\n\n if (computed !== null && !isSymbol(computed) &&\n (retHighest ? (computed <= value) : (computed < value))) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return high;\n }\n return baseSortedIndexBy(array, value, identity, retHighest);\n }\n\n /**\n * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n * which invokes `iteratee` for `value` and each element of `array` to compute\n * their sort ranking. The iteratee is invoked with one argument; (value).\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} iteratee The iteratee invoked per element.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\n function baseSortedIndexBy(array, value, iteratee, retHighest) {\n var low = 0,\n high = array == null ? 0 : array.length;\n if (high === 0) {\n return 0;\n }\n\n value = iteratee(value);\n var valIsNaN = value !== value,\n valIsNull = value === null,\n valIsSymbol = isSymbol(value),\n valIsUndefined = value === undefined;\n\n while (low < high) {\n var mid = nativeFloor((low + high) / 2),\n computed = iteratee(array[mid]),\n othIsDefined = computed !== undefined,\n othIsNull = computed === null,\n othIsReflexive = computed === computed,\n othIsSymbol = isSymbol(computed);\n\n if (valIsNaN) {\n var setLow = retHighest || othIsReflexive;\n } else if (valIsUndefined) {\n setLow = othIsReflexive && (retHighest || othIsDefined);\n } else if (valIsNull) {\n setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n } else if (valIsSymbol) {\n setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n } else if (othIsNull || othIsSymbol) {\n setLow = false;\n } else {\n setLow = retHighest ? (computed <= value) : (computed < value);\n }\n if (setLow) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return nativeMin(high, MAX_ARRAY_INDEX);\n }\n\n /**\n * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\n function baseSortedUniq(array, iteratee) {\n var index = -1,\n length = array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n if (!index || !eq(computed, seen)) {\n var seen = computed;\n result[resIndex++] = value === 0 ? 0 : value;\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.toNumber` which doesn't ensure correct\n * conversions of binary, hexadecimal, or octal string values.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n */\n function baseToNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n return +value;\n }\n\n /**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\n function baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n }\n\n /**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\n function baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n }\n\n /**\n * The base implementation of `_.unset`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The property path to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n */\n function baseUnset(object, path) {\n path = castPath(path, object);\n object = parent(object, path);\n return object == null || delete object[toKey(last(path))];\n }\n\n /**\n * The base implementation of `_.update`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to update.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\n function baseUpdate(object, path, updater, customizer) {\n return baseSet(object, path, updater(baseGet(object, path)), customizer);\n }\n\n /**\n * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n * without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {Function} predicate The function invoked per iteration.\n * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the slice of `array`.\n */\n function baseWhile(array, predicate, isDrop, fromRight) {\n var length = array.length,\n index = fromRight ? length : -1;\n\n while ((fromRight ? index-- : ++index < length) &&\n predicate(array[index], index, array)) {}\n\n return isDrop\n ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n }\n\n /**\n * The base implementation of `wrapperValue` which returns the result of\n * performing a sequence of actions on the unwrapped `value`, where each\n * successive action is supplied the return value of the previous.\n *\n * @private\n * @param {*} value The unwrapped value.\n * @param {Array} actions Actions to perform to resolve the unwrapped value.\n * @returns {*} Returns the resolved value.\n */\n function baseWrapperValue(value, actions) {\n var result = value;\n if (result instanceof LazyWrapper) {\n result = result.value();\n }\n return arrayReduce(actions, function(result, action) {\n return action.func.apply(action.thisArg, arrayPush([result], action.args));\n }, result);\n }\n\n /**\n * The base implementation of methods like `_.xor`, without support for\n * iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of values.\n */\n function baseXor(arrays, iteratee, comparator) {\n var length = arrays.length;\n if (length < 2) {\n return length ? baseUniq(arrays[0]) : [];\n }\n var index = -1,\n result = Array(length);\n\n while (++index < length) {\n var array = arrays[index],\n othIndex = -1;\n\n while (++othIndex < length) {\n if (othIndex != index) {\n result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n }\n }\n }\n return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n }\n\n /**\n * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n *\n * @private\n * @param {Array} props The property identifiers.\n * @param {Array} values The property values.\n * @param {Function} assignFunc The function to assign values.\n * @returns {Object} Returns the new object.\n */\n function baseZipObject(props, values, assignFunc) {\n var index = -1,\n length = props.length,\n valsLength = values.length,\n result = {};\n\n while (++index < length) {\n var value = index < valsLength ? values[index] : undefined;\n assignFunc(result, props[index], value);\n }\n return result;\n }\n\n /**\n * Casts `value` to an empty array if it's not an array like object.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array|Object} Returns the cast array-like object.\n */\n function castArrayLikeObject(value) {\n return isArrayLikeObject(value) ? value : [];\n }\n\n /**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\n function castFunction(value) {\n return typeof value == 'function' ? value : identity;\n }\n\n /**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\n function castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n }\n\n /**\n * A `baseRest` alias which can be replaced with `identity` by module\n * replacement plugins.\n *\n * @private\n * @type {Function}\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\n var castRest = baseRest;\n\n /**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\n function castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n }\n\n /**\n * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n *\n * @private\n * @param {number|Object} id The timer id or timeout object of the timer to clear.\n */\n var clearTimeout = ctxClearTimeout || function(id) {\n return root.clearTimeout(id);\n };\n\n /**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\n function cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n }\n\n /**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\n function cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n }\n\n /**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\n function cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n }\n\n /**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\n function cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n }\n\n /**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\n function cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n }\n\n /**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\n function cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n }\n\n /**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\n function compareAscending(value, other) {\n if (value !== other) {\n var valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive) {\n return 1;\n }\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive) {\n return -1;\n }\n }\n return 0;\n }\n\n /**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\n function compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = compareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order == 'desc' ? -1 : 1);\n }\n }\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n }\n\n /**\n * Creates an array that is the composition of partially applied arguments,\n * placeholders, and provided arguments into a single array of arguments.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to prepend to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgs(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersLength = holders.length,\n leftIndex = -1,\n leftLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(leftLength + rangeLength),\n isUncurried = !isCurried;\n\n while (++leftIndex < leftLength) {\n result[leftIndex] = partials[leftIndex];\n }\n while (++argsIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[holders[argsIndex]] = args[argsIndex];\n }\n }\n while (rangeLength--) {\n result[leftIndex++] = args[argsIndex++];\n }\n return result;\n }\n\n /**\n * This function is like `composeArgs` except that the arguments composition\n * is tailored for `_.partialRight`.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to append to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\n function composeArgsRight(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersIndex = -1,\n holdersLength = holders.length,\n rightIndex = -1,\n rightLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(rangeLength + rightLength),\n isUncurried = !isCurried;\n\n while (++argsIndex < rangeLength) {\n result[argsIndex] = args[argsIndex];\n }\n var offset = argsIndex;\n while (++rightIndex < rightLength) {\n result[offset + rightIndex] = partials[rightIndex];\n }\n while (++holdersIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[offset + holders[holdersIndex]] = args[argsIndex++];\n }\n }\n return result;\n }\n\n /**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\n function copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n }\n\n /**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\n function copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n }\n\n /**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\n function copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n }\n\n /**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\n function copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n }\n\n /**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\n function createAggregator(setter, initializer) {\n return function(collection, iteratee) {\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\n accumulator = initializer ? initializer() : {};\n\n return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n };\n }\n\n /**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\n function createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n }\n\n /**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n }\n\n /**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\n function createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with the optional `this`\n * binding of `thisArg`.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createBind(func, bitmask, thisArg) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return fn.apply(isBind ? thisArg : this, arguments);\n }\n return wrapper;\n }\n\n /**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\n function createCaseFirst(methodName) {\n return function(string) {\n string = toString(string);\n\n var strSymbols = hasUnicode(string)\n ? stringToArray(string)\n : undefined;\n\n var chr = strSymbols\n ? strSymbols[0]\n : string.charAt(0);\n\n var trailing = strSymbols\n ? castSlice(strSymbols, 1).join('')\n : string.slice(1);\n\n return chr[methodName]() + trailing;\n };\n }\n\n /**\n * Creates a function like `_.camelCase`.\n *\n * @private\n * @param {Function} callback The function to combine each word.\n * @returns {Function} Returns the new compounder function.\n */\n function createCompounder(callback) {\n return function(string) {\n return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n };\n }\n\n /**\n * Creates a function that produces an instance of `Ctor` regardless of\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n *\n * @private\n * @param {Function} Ctor The constructor to wrap.\n * @returns {Function} Returns the new wrapped function.\n */\n function createCtor(Ctor) {\n return function() {\n // Use a `switch` statement to work with class constructors. See\n // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n // for more details.\n var args = arguments;\n switch (args.length) {\n case 0: return new Ctor;\n case 1: return new Ctor(args[0]);\n case 2: return new Ctor(args[0], args[1]);\n case 3: return new Ctor(args[0], args[1], args[2]);\n case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n }\n var thisBinding = baseCreate(Ctor.prototype),\n result = Ctor.apply(thisBinding, args);\n\n // Mimic the constructor's `return` behavior.\n // See https://es5.github.io/#x13.2.2 for more details.\n return isObject(result) ? result : thisBinding;\n };\n }\n\n /**\n * Creates a function that wraps `func` to enable currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {number} arity The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createCurry(func, bitmask, arity) {\n var Ctor = createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length,\n placeholder = getHolder(wrapper);\n\n while (index--) {\n args[index] = arguments[index];\n }\n var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n ? []\n : replaceHolders(args, placeholder);\n\n length -= holders.length;\n if (length < arity) {\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, undefined,\n args, holders, undefined, undefined, arity - length);\n }\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return apply(fn, this, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\n function createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = getIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n }\n\n /**\n * Creates a `_.flow` or `_.flowRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new flow function.\n */\n function createFlow(fromRight) {\n return flatRest(function(funcs) {\n var length = funcs.length,\n index = length,\n prereq = LodashWrapper.prototype.thru;\n\n if (fromRight) {\n funcs.reverse();\n }\n while (index--) {\n var func = funcs[index];\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n var wrapper = new LodashWrapper([], true);\n }\n }\n index = wrapper ? index : length;\n while (++index < length) {\n func = funcs[index];\n\n var funcName = getFuncName(func),\n data = funcName == 'wrapper' ? getData(func) : undefined;\n\n if (data && isLaziable(data[0]) &&\n data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n !data[4].length && data[9] == 1\n ) {\n wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n } else {\n wrapper = (func.length == 1 && isLaziable(func))\n ? wrapper[funcName]()\n : wrapper.thru(func);\n }\n }\n return function() {\n var args = arguments,\n value = args[0];\n\n if (wrapper && args.length == 1 && isArray(value)) {\n return wrapper.plant(value).value();\n }\n var index = 0,\n result = length ? funcs[index].apply(this, args) : value;\n\n while (++index < length) {\n result = funcs[index].call(this, result);\n }\n return result;\n };\n });\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with optional `this`\n * binding of `thisArg`, partial application, and currying.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [partialsRight] The arguments to append to those provided\n * to the new function.\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n var isAry = bitmask & WRAP_ARY_FLAG,\n isBind = bitmask & WRAP_BIND_FLAG,\n isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n isFlip = bitmask & WRAP_FLIP_FLAG,\n Ctor = isBindKey ? undefined : createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length;\n\n while (index--) {\n args[index] = arguments[index];\n }\n if (isCurried) {\n var placeholder = getHolder(wrapper),\n holdersCount = countHolders(args, placeholder);\n }\n if (partials) {\n args = composeArgs(args, partials, holders, isCurried);\n }\n if (partialsRight) {\n args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n }\n length -= holdersCount;\n if (isCurried && length < arity) {\n var newHolders = replaceHolders(args, placeholder);\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n args, newHolders, argPos, ary, arity - length\n );\n }\n var thisBinding = isBind ? thisArg : this,\n fn = isBindKey ? thisBinding[func] : func;\n\n length = args.length;\n if (argPos) {\n args = reorder(args, argPos);\n } else if (isFlip && length > 1) {\n args.reverse();\n }\n if (isAry && ary < length) {\n args.length = ary;\n }\n if (this && this !== root && this instanceof wrapper) {\n fn = Ctor || createCtor(fn);\n }\n return fn.apply(thisBinding, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a function like `_.invertBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} toIteratee The function to resolve iteratees.\n * @returns {Function} Returns the new inverter function.\n */\n function createInverter(setter, toIteratee) {\n return function(object, iteratee) {\n return baseInverter(object, setter, toIteratee(iteratee), {});\n };\n }\n\n /**\n * Creates a function that performs a mathematical operation on two values.\n *\n * @private\n * @param {Function} operator The function to perform the operation.\n * @param {number} [defaultValue] The value used for `undefined` arguments.\n * @returns {Function} Returns the new mathematical operation function.\n */\n function createMathOperation(operator, defaultValue) {\n return function(value, other) {\n var result;\n if (value === undefined && other === undefined) {\n return defaultValue;\n }\n if (value !== undefined) {\n result = value;\n }\n if (other !== undefined) {\n if (result === undefined) {\n return other;\n }\n if (typeof value == 'string' || typeof other == 'string') {\n value = baseToString(value);\n other = baseToString(other);\n } else {\n value = baseToNumber(value);\n other = baseToNumber(other);\n }\n result = operator(value, other);\n }\n return result;\n };\n }\n\n /**\n * Creates a function like `_.over`.\n *\n * @private\n * @param {Function} arrayFunc The function to iterate over iteratees.\n * @returns {Function} Returns the new over function.\n */\n function createOver(arrayFunc) {\n return flatRest(function(iteratees) {\n iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n return baseRest(function(args) {\n var thisArg = this;\n return arrayFunc(iteratees, function(iteratee) {\n return apply(iteratee, thisArg, args);\n });\n });\n });\n }\n\n /**\n * Creates the padding for `string` based on `length`. The `chars` string\n * is truncated if the number of characters exceeds `length`.\n *\n * @private\n * @param {number} length The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padding for `string`.\n */\n function createPadding(length, chars) {\n chars = chars === undefined ? ' ' : baseToString(chars);\n\n var charsLength = chars.length;\n if (charsLength < 2) {\n return charsLength ? baseRepeat(chars, length) : chars;\n }\n var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n return hasUnicode(chars)\n ? castSlice(stringToArray(result), 0, length).join('')\n : result.slice(0, length);\n }\n\n /**\n * Creates a function that wraps `func` to invoke it with the `this` binding\n * of `thisArg` and `partials` prepended to the arguments it receives.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} partials The arguments to prepend to those provided to\n * the new function.\n * @returns {Function} Returns the new wrapped function.\n */\n function createPartial(func, bitmask, thisArg, partials) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var argsIndex = -1,\n argsLength = arguments.length,\n leftIndex = -1,\n leftLength = partials.length,\n args = Array(leftLength + argsLength),\n fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n while (++leftIndex < leftLength) {\n args[leftIndex] = partials[leftIndex];\n }\n while (argsLength--) {\n args[leftIndex++] = arguments[++argsIndex];\n }\n return apply(fn, isBind ? thisArg : this, args);\n }\n return wrapper;\n }\n\n /**\n * Creates a `_.range` or `_.rangeRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new range function.\n */\n function createRange(fromRight) {\n return function(start, end, step) {\n if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n end = step = undefined;\n }\n // Ensure the sign of `-0` is preserved.\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n return baseRange(start, end, step, fromRight);\n };\n }\n\n /**\n * Creates a function that performs a relational operation on two values.\n *\n * @private\n * @param {Function} operator The function to perform the operation.\n * @returns {Function} Returns the new relational operation function.\n */\n function createRelationalOperation(operator) {\n return function(value, other) {\n if (!(typeof value == 'string' && typeof other == 'string')) {\n value = toNumber(value);\n other = toNumber(other);\n }\n return operator(value, other);\n };\n }\n\n /**\n * Creates a function that wraps `func` to continue currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {Function} wrapFunc The function to create the `func` wrapper.\n * @param {*} placeholder The placeholder value.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n var isCurry = bitmask & WRAP_CURRY_FLAG,\n newHolders = isCurry ? holders : undefined,\n newHoldersRight = isCurry ? undefined : holders,\n newPartials = isCurry ? partials : undefined,\n newPartialsRight = isCurry ? undefined : partials;\n\n bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n }\n var newData = [\n func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n newHoldersRight, argPos, ary, arity\n ];\n\n var result = wrapFunc.apply(undefined, newData);\n if (isLaziable(func)) {\n setData(result, newData);\n }\n result.placeholder = placeholder;\n return setWrapToString(result, func, bitmask);\n }\n\n /**\n * Creates a function like `_.round`.\n *\n * @private\n * @param {string} methodName The name of the `Math` method to use when rounding.\n * @returns {Function} Returns the new round function.\n */\n function createRound(methodName) {\n var func = Math[methodName];\n return function(number, precision) {\n number = toNumber(number);\n precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n if (precision && nativeIsFinite(number)) {\n // Shift with exponential notation to avoid floating-point issues.\n // See [MDN](https://mdn.io/round#Examples) for more details.\n var pair = (toString(number) + 'e').split('e'),\n value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n pair = (toString(value) + 'e').split('e');\n return +(pair[0] + 'e' + (+pair[1] - precision));\n }\n return func(number);\n };\n }\n\n /**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\n var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n };\n\n /**\n * Creates a `_.toPairs` or `_.toPairsIn` function.\n *\n * @private\n * @param {Function} keysFunc The function to get the keys of a given object.\n * @returns {Function} Returns the new pairs function.\n */\n function createToPairs(keysFunc) {\n return function(object) {\n var tag = getTag(object);\n if (tag == mapTag) {\n return mapToArray(object);\n }\n if (tag == setTag) {\n return setToPairs(object);\n }\n return baseToPairs(object, keysFunc(object));\n };\n }\n\n /**\n * Creates a function that either curries or invokes `func` with optional\n * `this` binding and partially applied arguments.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags.\n * 1 - `_.bind`\n * 2 - `_.bindKey`\n * 4 - `_.curry` or `_.curryRight` of a bound function\n * 8 - `_.curry`\n * 16 - `_.curryRight`\n * 32 - `_.partial`\n * 64 - `_.partialRight`\n * 128 - `_.rearg`\n * 256 - `_.ary`\n * 512 - `_.flip`\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to be partially applied.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\n function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n if (!isBindKey && typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var length = partials ? partials.length : 0;\n if (!length) {\n bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n partials = holders = undefined;\n }\n ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n arity = arity === undefined ? arity : toInteger(arity);\n length -= holders ? holders.length : 0;\n\n if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n var partialsRight = partials,\n holdersRight = holders;\n\n partials = holders = undefined;\n }\n var data = isBindKey ? undefined : getData(func);\n\n var newData = [\n func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n argPos, ary, arity\n ];\n\n if (data) {\n mergeData(newData, data);\n }\n func = newData[0];\n bitmask = newData[1];\n thisArg = newData[2];\n partials = newData[3];\n holders = newData[4];\n arity = newData[9] = newData[9] === undefined\n ? (isBindKey ? 0 : func.length)\n : nativeMax(newData[9] - length, 0);\n\n if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n }\n if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n var result = createBind(func, bitmask, thisArg);\n } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n result = createCurry(func, bitmask, arity);\n } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n result = createPartial(func, bitmask, thisArg, partials);\n } else {\n result = createHybrid.apply(undefined, newData);\n }\n var setter = data ? baseSetData : setData;\n return setWrapToString(setter(result, newData), func, bitmask);\n }\n\n /**\n * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n * of source objects to the destination object for all destination properties\n * that resolve to `undefined`.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to assign.\n * @param {Object} object The parent object of `objValue`.\n * @returns {*} Returns the value to assign.\n */\n function customDefaultsAssignIn(objValue, srcValue, key, object) {\n if (objValue === undefined ||\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n return srcValue;\n }\n return objValue;\n }\n\n /**\n * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n * objects into destination objects that are passed thru.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to merge.\n * @param {Object} object The parent object of `objValue`.\n * @param {Object} source The parent object of `srcValue`.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n * @returns {*} Returns the value to assign.\n */\n function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n if (isObject(objValue) && isObject(srcValue)) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, objValue);\n baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n stack['delete'](srcValue);\n }\n return objValue;\n }\n\n /**\n * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n * objects.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {string} key The key of the property to inspect.\n * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n */\n function customOmitClone(value) {\n return isPlainObject(value) ? undefined : value;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\n function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Check that cyclic values are equal.\n var arrStacked = stack.get(array);\n var othStacked = stack.get(other);\n if (arrStacked && othStacked) {\n return arrStacked == other && othStacked == array;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n }\n\n /**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Check that cyclic values are equal.\n var objStacked = stack.get(object);\n var othStacked = stack.get(other);\n if (objStacked && othStacked) {\n return objStacked == other && othStacked == object;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n }\n\n /**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\n function flatRest(func) {\n return setToString(overRest(func, undefined, flatten), func + '');\n }\n\n /**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n }\n\n /**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\n function getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n }\n\n /**\n * Gets metadata for `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {*} Returns the metadata for `func`.\n */\n var getData = !metaMap ? noop : function(func) {\n return metaMap.get(func);\n };\n\n /**\n * Gets the name of `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {string} Returns the function name.\n */\n function getFuncName(func) {\n var result = (func.name + ''),\n array = realNames[result],\n length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n while (length--) {\n var data = array[length],\n otherFunc = data.func;\n if (otherFunc == null || otherFunc == func) {\n return data.name;\n }\n }\n return result;\n }\n\n /**\n * Gets the argument placeholder value for `func`.\n *\n * @private\n * @param {Function} func The function to inspect.\n * @returns {*} Returns the placeholder value.\n */\n function getHolder(func) {\n var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n return object.placeholder;\n }\n\n /**\n * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n * this function returns the custom method, otherwise it returns `baseIteratee`.\n * If arguments are provided, the chosen function is invoked with them and\n * its result is returned.\n *\n * @private\n * @param {*} [value] The value to convert to an iteratee.\n * @param {number} [arity] The arity of the created iteratee.\n * @returns {Function} Returns the chosen function or its result.\n */\n function getIteratee() {\n var result = lodash.iteratee || iteratee;\n result = result === iteratee ? baseIteratee : result;\n return arguments.length ? result(arguments[0], arguments[1]) : result;\n }\n\n /**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\n function getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n }\n\n /**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\n function getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n }\n\n /**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\n function getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n }\n\n /**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\n function getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n }\n\n /**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\n var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n };\n\n /**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\n var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n };\n\n /**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n var getTag = baseGetTag;\n\n // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n }\n\n /**\n * Gets the view, applying any `transforms` to the `start` and `end` positions.\n *\n * @private\n * @param {number} start The start of the view.\n * @param {number} end The end of the view.\n * @param {Array} transforms The transformations to apply to the view.\n * @returns {Object} Returns an object containing the `start` and `end`\n * positions of the view.\n */\n function getView(start, end, transforms) {\n var index = -1,\n length = transforms.length;\n\n while (++index < length) {\n var data = transforms[index],\n size = data.size;\n\n switch (data.type) {\n case 'drop': start += size; break;\n case 'dropRight': end -= size; break;\n case 'take': end = nativeMin(end, start + size); break;\n case 'takeRight': start = nativeMax(start, end - size); break;\n }\n }\n return { 'start': start, 'end': end };\n }\n\n /**\n * Extracts wrapper details from the `source` body comment.\n *\n * @private\n * @param {string} source The source to inspect.\n * @returns {Array} Returns the wrapper details.\n */\n function getWrapDetails(source) {\n var match = source.match(reWrapDetails);\n return match ? match[1].split(reSplitDetails) : [];\n }\n\n /**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\n function hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n }\n\n /**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\n function initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n }\n\n /**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\n function initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n }\n\n /**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\n function initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n }\n\n /**\n * Inserts wrapper `details` in a comment at the top of the `source` body.\n *\n * @private\n * @param {string} source The source to modify.\n * @returns {Array} details The details to insert.\n * @returns {string} Returns the modified source.\n */\n function insertWrapDetails(source, details) {\n var length = details.length;\n if (!length) {\n return source;\n }\n var lastIndex = length - 1;\n details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n details = details.join(length > 2 ? ', ' : ' ');\n return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n }\n\n /**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\n function isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n }\n\n /**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\n function isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n }\n\n /**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\n function isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n }\n\n /**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\n function isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n }\n\n /**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\n function isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n }\n\n /**\n * Checks if `func` has a lazy counterpart.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n * else `false`.\n */\n function isLaziable(func) {\n var funcName = getFuncName(func),\n other = lodash[funcName];\n\n if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n return false;\n }\n if (func === other) {\n return true;\n }\n var data = getData(other);\n return !!data && func === data[0];\n }\n\n /**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\n function isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n }\n\n /**\n * Checks if `func` is capable of being masked.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n */\n var isMaskable = coreJsData ? isFunction : stubFalse;\n\n /**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\n function isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n }\n\n /**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\n function isStrictComparable(value) {\n return value === value && !isObject(value);\n }\n\n /**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\n function matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n }\n\n /**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\n function memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n }\n\n /**\n * Merges the function metadata of `source` into `data`.\n *\n * Merging metadata reduces the number of wrappers used to invoke a function.\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n * may be applied regardless of execution order. Methods like `_.ary` and\n * `_.rearg` modify function arguments, making the order in which they are\n * executed important, preventing the merging of metadata. However, we make\n * an exception for a safe combined case where curried functions have `_.ary`\n * and or `_.rearg` applied.\n *\n * @private\n * @param {Array} data The destination metadata.\n * @param {Array} source The source metadata.\n * @returns {Array} Returns `data`.\n */\n function mergeData(data, source) {\n var bitmask = data[1],\n srcBitmask = source[1],\n newBitmask = bitmask | srcBitmask,\n isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n var isCombo =\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n // Exit early if metadata can't be merged.\n if (!(isCommon || isCombo)) {\n return data;\n }\n // Use source `thisArg` if available.\n if (srcBitmask & WRAP_BIND_FLAG) {\n data[2] = source[2];\n // Set when currying a bound function.\n newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n }\n // Compose partial arguments.\n var value = source[3];\n if (value) {\n var partials = data[3];\n data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n }\n // Compose partial right arguments.\n value = source[5];\n if (value) {\n partials = data[5];\n data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n }\n // Use source `argPos` if available.\n value = source[7];\n if (value) {\n data[7] = value;\n }\n // Use source `ary` if it's smaller.\n if (srcBitmask & WRAP_ARY_FLAG) {\n data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n }\n // Use source `arity` if one is not provided.\n if (data[9] == null) {\n data[9] = source[9];\n }\n // Use source `func` and merge bitmasks.\n data[0] = source[0];\n data[1] = newBitmask;\n\n return data;\n }\n\n /**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n function nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n }\n\n /**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\n function objectToString(value) {\n return nativeObjectToString.call(value);\n }\n\n /**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\n function overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n }\n\n /**\n * Gets the parent value at `path` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path to get the parent value of.\n * @returns {*} Returns the parent value.\n */\n function parent(object, path) {\n return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n }\n\n /**\n * Reorder `array` according to the specified indexes where the element at\n * the first index is assigned as the first element, the element at\n * the second index is assigned as the second element, and so on.\n *\n * @private\n * @param {Array} array The array to reorder.\n * @param {Array} indexes The arranged array indexes.\n * @returns {Array} Returns `array`.\n */\n function reorder(array, indexes) {\n var arrLength = array.length,\n length = nativeMin(indexes.length, arrLength),\n oldArray = copyArray(array);\n\n while (length--) {\n var index = indexes[length];\n array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n }\n return array;\n }\n\n /**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\n function safeGet(object, key) {\n if (key === 'constructor' && typeof object[key] === 'function') {\n return;\n }\n\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n }\n\n /**\n * Sets metadata for `func`.\n *\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n * period of time, it will trip its breaker and transition to an identity\n * function to avoid garbage collection pauses in V8. See\n * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n * for more details.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\n var setData = shortOut(baseSetData);\n\n /**\n * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n *\n * @private\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @returns {number|Object} Returns the timer id or timeout object.\n */\n var setTimeout = ctxSetTimeout || function(func, wait) {\n return root.setTimeout(func, wait);\n };\n\n /**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\n var setToString = shortOut(baseSetToString);\n\n /**\n * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n * with wrapper details in a comment at the top of the source body.\n *\n * @private\n * @param {Function} wrapper The function to modify.\n * @param {Function} reference The reference function.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Function} Returns `wrapper`.\n */\n function setWrapToString(wrapper, reference, bitmask) {\n var source = (reference + '');\n return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n }\n\n /**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\n function shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n }\n\n /**\n * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n *\n * @private\n * @param {Array} array The array to shuffle.\n * @param {number} [size=array.length] The size of `array`.\n * @returns {Array} Returns `array`.\n */\n function shuffleSelf(array, size) {\n var index = -1,\n length = array.length,\n lastIndex = length - 1;\n\n size = size === undefined ? length : size;\n while (++index < size) {\n var rand = baseRandom(index, lastIndex),\n value = array[rand];\n\n array[rand] = array[index];\n array[index] = value;\n }\n array.length = size;\n return array;\n }\n\n /**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\n var stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n });\n\n /**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\n function toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n }\n\n /**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\n function toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n }\n\n /**\n * Updates wrapper `details` based on `bitmask` flags.\n *\n * @private\n * @returns {Array} details The details to modify.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Array} Returns `details`.\n */\n function updateWrapDetails(details, bitmask) {\n arrayEach(wrapFlags, function(pair) {\n var value = '_.' + pair[0];\n if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n details.push(value);\n }\n });\n return details.sort();\n }\n\n /**\n * Creates a clone of `wrapper`.\n *\n * @private\n * @param {Object} wrapper The wrapper to clone.\n * @returns {Object} Returns the cloned wrapper.\n */\n function wrapperClone(wrapper) {\n if (wrapper instanceof LazyWrapper) {\n return wrapper.clone();\n }\n var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n result.__actions__ = copyArray(wrapper.__actions__);\n result.__index__ = wrapper.__index__;\n result.__values__ = wrapper.__values__;\n return result;\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an array of elements split into groups the length of `size`.\n * If `array` can't be split evenly, the final chunk will be the remaining\n * elements.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to process.\n * @param {number} [size=1] The length of each chunk\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the new array of chunks.\n * @example\n *\n * _.chunk(['a', 'b', 'c', 'd'], 2);\n * // => [['a', 'b'], ['c', 'd']]\n *\n * _.chunk(['a', 'b', 'c', 'd'], 3);\n * // => [['a', 'b', 'c'], ['d']]\n */\n function chunk(array, size, guard) {\n if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n size = 1;\n } else {\n size = nativeMax(toInteger(size), 0);\n }\n var length = array == null ? 0 : array.length;\n if (!length || size < 1) {\n return [];\n }\n var index = 0,\n resIndex = 0,\n result = Array(nativeCeil(length / size));\n\n while (index < length) {\n result[resIndex++] = baseSlice(array, index, (index += size));\n }\n return result;\n }\n\n /**\n * Creates an array with all falsey values removed. The values `false`, `null`,\n * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to compact.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.compact([0, 1, false, 2, '', 3]);\n * // => [1, 2, 3]\n */\n function compact(array) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value) {\n result[resIndex++] = value;\n }\n }\n return result;\n }\n\n /**\n * Creates a new array concatenating `array` with any additional arrays\n * and/or values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to concatenate.\n * @param {...*} [values] The values to concatenate.\n * @returns {Array} Returns the new concatenated array.\n * @example\n *\n * var array = [1];\n * var other = _.concat(array, 2, [3], [[4]]);\n *\n * console.log(other);\n * // => [1, 2, 3, [4]]\n *\n * console.log(array);\n * // => [1]\n */\n function concat() {\n var length = arguments.length;\n if (!length) {\n return [];\n }\n var args = Array(length - 1),\n array = arguments[0],\n index = length;\n\n while (index--) {\n args[index - 1] = arguments[index];\n }\n return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n }\n\n /**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */\n var difference = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n : [];\n });\n\n /**\n * This method is like `_.difference` except that it accepts `iteratee` which\n * is invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n * // => [{ 'x': 2 }]\n */\n var differenceBy = baseRest(function(array, values) {\n var iteratee = last(values);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n : [];\n });\n\n /**\n * This method is like `_.difference` except that it accepts `comparator`\n * which is invoked to compare elements of `array` to `values`. The order and\n * references of result values are determined by the first array. The comparator\n * is invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n *\n * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }]\n */\n var differenceWith = baseRest(function(array, values) {\n var comparator = last(values);\n if (isArrayLikeObject(comparator)) {\n comparator = undefined;\n }\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n : [];\n });\n\n /**\n * Creates a slice of `array` with `n` elements dropped from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.drop([1, 2, 3]);\n * // => [2, 3]\n *\n * _.drop([1, 2, 3], 2);\n * // => [3]\n *\n * _.drop([1, 2, 3], 5);\n * // => []\n *\n * _.drop([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\n function drop(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n return baseSlice(array, n < 0 ? 0 : n, length);\n }\n\n /**\n * Creates a slice of `array` with `n` elements dropped from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropRight([1, 2, 3]);\n * // => [1, 2]\n *\n * _.dropRight([1, 2, 3], 2);\n * // => [1]\n *\n * _.dropRight([1, 2, 3], 5);\n * // => []\n *\n * _.dropRight([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\n function dropRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, 0, n < 0 ? 0 : n);\n }\n\n /**\n * Creates a slice of `array` excluding elements dropped from the end.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.dropRightWhile(users, function(o) { return !o.active; });\n * // => objects for ['barney']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n * // => objects for ['barney', 'fred']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropRightWhile(users, ['active', false]);\n * // => objects for ['barney']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropRightWhile(users, 'active');\n * // => objects for ['barney', 'fred', 'pebbles']\n */\n function dropRightWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), true, true)\n : [];\n }\n\n /**\n * Creates a slice of `array` excluding elements dropped from the beginning.\n * Elements are dropped until `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.dropWhile(users, function(o) { return !o.active; });\n * // => objects for ['pebbles']\n *\n * // The `_.matches` iteratee shorthand.\n * _.dropWhile(users, { 'user': 'barney', 'active': false });\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.dropWhile(users, ['active', false]);\n * // => objects for ['pebbles']\n *\n * // The `_.property` iteratee shorthand.\n * _.dropWhile(users, 'active');\n * // => objects for ['barney', 'fred', 'pebbles']\n */\n function dropWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), true)\n : [];\n }\n\n /**\n * Fills elements of `array` with `value` from `start` up to, but not\n * including, `end`.\n *\n * **Note:** This method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Array\n * @param {Array} array The array to fill.\n * @param {*} value The value to fill `array` with.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.fill(array, 'a');\n * console.log(array);\n * // => ['a', 'a', 'a']\n *\n * _.fill(Array(3), 2);\n * // => [2, 2, 2]\n *\n * _.fill([4, 6, 8, 10], '*', 1, 3);\n * // => [4, '*', '*', 10]\n */\n function fill(array, value, start, end) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n start = 0;\n end = length;\n }\n return baseFill(array, value, start, end);\n }\n\n /**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\n function findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, getIteratee(predicate, 3), index);\n }\n\n /**\n * This method is like `_.findIndex` except that it iterates over elements\n * of `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n * // => 2\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n * // => 0\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastIndex(users, ['active', false]);\n * // => 2\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastIndex(users, 'active');\n * // => 0\n */\n function findLastIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = length - 1;\n if (fromIndex !== undefined) {\n index = toInteger(fromIndex);\n index = fromIndex < 0\n ? nativeMax(length + index, 0)\n : nativeMin(index, length - 1);\n }\n return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n }\n\n /**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\n function flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n }\n\n /**\n * Recursively flattens `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flattenDeep([1, [2, [3, [4]], 5]]);\n * // => [1, 2, 3, 4, 5]\n */\n function flattenDeep(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, INFINITY) : [];\n }\n\n /**\n * Recursively flatten `array` up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * var array = [1, [2, [3, [4]], 5]];\n *\n * _.flattenDepth(array, 1);\n * // => [1, 2, [3, [4]], 5]\n *\n * _.flattenDepth(array, 2);\n * // => [1, 2, 3, [4], 5]\n */\n function flattenDepth(array, depth) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n depth = depth === undefined ? 1 : toInteger(depth);\n return baseFlatten(array, depth);\n }\n\n /**\n * The inverse of `_.toPairs`; this method returns an object composed\n * from key-value `pairs`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} pairs The key-value pairs.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.fromPairs([['a', 1], ['b', 2]]);\n * // => { 'a': 1, 'b': 2 }\n */\n function fromPairs(pairs) {\n var index = -1,\n length = pairs == null ? 0 : pairs.length,\n result = {};\n\n while (++index < length) {\n var pair = pairs[index];\n result[pair[0]] = pair[1];\n }\n return result;\n }\n\n /**\n * Gets the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias first\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the first element of `array`.\n * @example\n *\n * _.head([1, 2, 3]);\n * // => 1\n *\n * _.head([]);\n * // => undefined\n */\n function head(array) {\n return (array && array.length) ? array[0] : undefined;\n }\n\n /**\n * Gets the index at which the first occurrence of `value` is found in `array`\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it's used as the\n * offset from the end of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.indexOf([1, 2, 1, 2], 2);\n * // => 1\n *\n * // Search from the `fromIndex`.\n * _.indexOf([1, 2, 1, 2], 2, 2);\n * // => 3\n */\n function indexOf(array, value, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseIndexOf(array, value, index);\n }\n\n /**\n * Gets all but the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.initial([1, 2, 3]);\n * // => [1, 2]\n */\n function initial(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseSlice(array, 0, -1) : [];\n }\n\n /**\n * Creates an array of unique values that are included in all given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersection([2, 1], [2, 3]);\n * // => [2]\n */\n var intersection = baseRest(function(arrays) {\n var mapped = arrayMap(arrays, castArrayLikeObject);\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped)\n : [];\n });\n\n /**\n * This method is like `_.intersection` except that it accepts `iteratee`\n * which is invoked for each element of each `arrays` to generate the criterion\n * by which they're compared. The order and references of result values are\n * determined by the first array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [2.1]\n *\n * // The `_.property` iteratee shorthand.\n * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }]\n */\n var intersectionBy = baseRest(function(arrays) {\n var iteratee = last(arrays),\n mapped = arrayMap(arrays, castArrayLikeObject);\n\n if (iteratee === last(mapped)) {\n iteratee = undefined;\n } else {\n mapped.pop();\n }\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped, getIteratee(iteratee, 2))\n : [];\n });\n\n /**\n * This method is like `_.intersection` except that it accepts `comparator`\n * which is invoked to compare elements of `arrays`. The order and references\n * of result values are determined by the first array. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.intersectionWith(objects, others, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }]\n */\n var intersectionWith = baseRest(function(arrays) {\n var comparator = last(arrays),\n mapped = arrayMap(arrays, castArrayLikeObject);\n\n comparator = typeof comparator == 'function' ? comparator : undefined;\n if (comparator) {\n mapped.pop();\n }\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped, undefined, comparator)\n : [];\n });\n\n /**\n * Converts all elements in `array` into a string separated by `separator`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to convert.\n * @param {string} [separator=','] The element separator.\n * @returns {string} Returns the joined string.\n * @example\n *\n * _.join(['a', 'b', 'c'], '~');\n * // => 'a~b~c'\n */\n function join(array, separator) {\n return array == null ? '' : nativeJoin.call(array, separator);\n }\n\n /**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\n function last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n }\n\n /**\n * This method is like `_.indexOf` except that it iterates over elements of\n * `array` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.lastIndexOf([1, 2, 1, 2], 2);\n * // => 3\n *\n * // Search from the `fromIndex`.\n * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n * // => 1\n */\n function lastIndexOf(array, value, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = length;\n if (fromIndex !== undefined) {\n index = toInteger(fromIndex);\n index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n }\n return value === value\n ? strictLastIndexOf(array, value, index)\n : baseFindIndex(array, baseIsNaN, index, true);\n }\n\n /**\n * Gets the element at index `n` of `array`. If `n` is negative, the nth\n * element from the end is returned.\n *\n * @static\n * @memberOf _\n * @since 4.11.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=0] The index of the element to return.\n * @returns {*} Returns the nth element of `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'd'];\n *\n * _.nth(array, 1);\n * // => 'b'\n *\n * _.nth(array, -2);\n * // => 'c';\n */\n function nth(array, n) {\n return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n }\n\n /**\n * Removes all given values from `array` using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n * to remove elements from an array by predicate.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...*} [values] The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pull(array, 'a', 'c');\n * console.log(array);\n * // => ['b', 'b']\n */\n var pull = baseRest(pullAll);\n\n /**\n * This method is like `_.pull` except that it accepts an array of values to remove.\n *\n * **Note:** Unlike `_.difference`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pullAll(array, ['a', 'c']);\n * console.log(array);\n * // => ['b', 'b']\n */\n function pullAll(array, values) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values)\n : array;\n }\n\n /**\n * This method is like `_.pullAll` except that it accepts `iteratee` which is\n * invoked for each element of `array` and `values` to generate the criterion\n * by which they're compared. The iteratee is invoked with one argument: (value).\n *\n * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n *\n * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n * console.log(array);\n * // => [{ 'x': 2 }]\n */\n function pullAllBy(array, values, iteratee) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values, getIteratee(iteratee, 2))\n : array;\n }\n\n /**\n * This method is like `_.pullAll` except that it accepts `comparator` which\n * is invoked to compare elements of `array` to `values`. The comparator is\n * invoked with two arguments: (arrVal, othVal).\n *\n * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n *\n * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n * console.log(array);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n */\n function pullAllWith(array, values, comparator) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values, undefined, comparator)\n : array;\n }\n\n /**\n * Removes elements from `array` corresponding to `indexes` and returns an\n * array of removed elements.\n *\n * **Note:** Unlike `_.at`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = ['a', 'b', 'c', 'd'];\n * var pulled = _.pullAt(array, [1, 3]);\n *\n * console.log(array);\n * // => ['a', 'c']\n *\n * console.log(pulled);\n * // => ['b', 'd']\n */\n var pullAt = flatRest(function(array, indexes) {\n var length = array == null ? 0 : array.length,\n result = baseAt(array, indexes);\n\n basePullAt(array, arrayMap(indexes, function(index) {\n return isIndex(index, length) ? +index : index;\n }).sort(compareAscending));\n\n return result;\n });\n\n /**\n * Removes all elements from `array` that `predicate` returns truthy for\n * and returns an array of the removed elements. The predicate is invoked\n * with three arguments: (value, index, array).\n *\n * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n * to pull elements from an array by value.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new array of removed elements.\n * @example\n *\n * var array = [1, 2, 3, 4];\n * var evens = _.remove(array, function(n) {\n * return n % 2 == 0;\n * });\n *\n * console.log(array);\n * // => [1, 3]\n *\n * console.log(evens);\n * // => [2, 4]\n */\n function remove(array, predicate) {\n var result = [];\n if (!(array && array.length)) {\n return result;\n }\n var index = -1,\n indexes = [],\n length = array.length;\n\n predicate = getIteratee(predicate, 3);\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result.push(value);\n indexes.push(index);\n }\n }\n basePullAt(array, indexes);\n return result;\n }\n\n /**\n * Reverses `array` so that the first element becomes the last, the second\n * element becomes the second to last, and so on.\n *\n * **Note:** This method mutates `array` and is based on\n * [`Array#reverse`](https://mdn.io/Array/reverse).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _.reverse(array);\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */\n function reverse(array) {\n return array == null ? array : nativeReverse.call(array);\n }\n\n /**\n * Creates a slice of `array` from `start` up to, but not including, `end`.\n *\n * **Note:** This method is used instead of\n * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n * returned.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\n function slice(array, start, end) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n start = 0;\n end = length;\n }\n else {\n start = start == null ? 0 : toInteger(start);\n end = end === undefined ? length : toInteger(end);\n }\n return baseSlice(array, start, end);\n }\n\n /**\n * Uses a binary search to determine the lowest index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedIndex([30, 50], 40);\n * // => 1\n */\n function sortedIndex(array, value) {\n return baseSortedIndex(array, value);\n }\n\n /**\n * This method is like `_.sortedIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n * // => 0\n */\n function sortedIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n }\n\n /**\n * This method is like `_.indexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n * // => 1\n */\n function sortedIndexOf(array, value) {\n var length = array == null ? 0 : array.length;\n if (length) {\n var index = baseSortedIndex(array, value);\n if (index < length && eq(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * This method is like `_.sortedIndex` except that it returns the highest\n * index at which `value` should be inserted into `array` in order to\n * maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n * // => 4\n */\n function sortedLastIndex(array, value) {\n return baseSortedIndex(array, value, true);\n }\n\n /**\n * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 1\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n * // => 1\n */\n function sortedLastIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n }\n\n /**\n * This method is like `_.lastIndexOf` except that it performs a binary\n * search on a sorted `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n * // => 3\n */\n function sortedLastIndexOf(array, value) {\n var length = array == null ? 0 : array.length;\n if (length) {\n var index = baseSortedIndex(array, value, true) - 1;\n if (eq(array[index], value)) {\n return index;\n }\n }\n return -1;\n }\n\n /**\n * This method is like `_.uniq` except that it's designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniq([1, 1, 2]);\n * // => [1, 2]\n */\n function sortedUniq(array) {\n return (array && array.length)\n ? baseSortedUniq(array)\n : [];\n }\n\n /**\n * This method is like `_.uniqBy` except that it's designed and optimized\n * for sorted arrays.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n * // => [1.1, 2.3]\n */\n function sortedUniqBy(array, iteratee) {\n return (array && array.length)\n ? baseSortedUniq(array, getIteratee(iteratee, 2))\n : [];\n }\n\n /**\n * Gets all but the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.tail([1, 2, 3]);\n * // => [2, 3]\n */\n function tail(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseSlice(array, 1, length) : [];\n }\n\n /**\n * Creates a slice of `array` with `n` elements taken from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.take([1, 2, 3]);\n * // => [1]\n *\n * _.take([1, 2, 3], 2);\n * // => [1, 2]\n *\n * _.take([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.take([1, 2, 3], 0);\n * // => []\n */\n function take(array, n, guard) {\n if (!(array && array.length)) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n return baseSlice(array, 0, n < 0 ? 0 : n);\n }\n\n /**\n * Creates a slice of `array` with `n` elements taken from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to take.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.takeRight([1, 2, 3]);\n * // => [3]\n *\n * _.takeRight([1, 2, 3], 2);\n * // => [2, 3]\n *\n * _.takeRight([1, 2, 3], 5);\n * // => [1, 2, 3]\n *\n * _.takeRight([1, 2, 3], 0);\n * // => []\n */\n function takeRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, n < 0 ? 0 : n, length);\n }\n\n /**\n * Creates a slice of `array` with elements taken from the end. Elements are\n * taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.takeRightWhile(users, function(o) { return !o.active; });\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n * // => objects for ['pebbles']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeRightWhile(users, ['active', false]);\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeRightWhile(users, 'active');\n * // => []\n */\n function takeRightWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3), false, true)\n : [];\n }\n\n /**\n * Creates a slice of `array` with elements taken from the beginning. Elements\n * are taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.takeWhile(users, function(o) { return !o.active; });\n * // => objects for ['barney', 'fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeWhile(users, { 'user': 'barney', 'active': false });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeWhile(users, ['active', false]);\n * // => objects for ['barney', 'fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeWhile(users, 'active');\n * // => []\n */\n function takeWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, getIteratee(predicate, 3))\n : [];\n }\n\n /**\n * Creates an array of unique values, in order, from all given arrays using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([2], [1, 2]);\n * // => [2, 1]\n */\n var union = baseRest(function(arrays) {\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n });\n\n /**\n * This method is like `_.union` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which uniqueness is computed. Result values are chosen from the first\n * array in which the value occurs. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\n var unionBy = baseRest(function(arrays) {\n var iteratee = last(arrays);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n });\n\n /**\n * This method is like `_.union` except that it accepts `comparator` which\n * is invoked to compare elements of `arrays`. Result values are chosen from\n * the first array in which the value occurs. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.unionWith(objects, others, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n */\n var unionWith = baseRest(function(arrays) {\n var comparator = last(arrays);\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n });\n\n /**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\n function uniq(array) {\n return (array && array.length) ? baseUniq(array) : [];\n }\n\n /**\n * This method is like `_.uniq` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\n function uniqBy(array, iteratee) {\n return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n }\n\n /**\n * This method is like `_.uniq` except that it accepts `comparator` which\n * is invoked to compare elements of `array`. The order of result values is\n * determined by the order they occur in the array.The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.uniqWith(objects, _.isEqual);\n * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n */\n function uniqWith(array, comparator) {\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n }\n\n /**\n * This method is like `_.zip` except that it accepts an array of grouped\n * elements and creates an array regrouping the elements to their pre-zip\n * configuration.\n *\n * @static\n * @memberOf _\n * @since 1.2.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n *\n * _.unzip(zipped);\n * // => [['a', 'b'], [1, 2], [true, false]]\n */\n function unzip(array) {\n if (!(array && array.length)) {\n return [];\n }\n var length = 0;\n array = arrayFilter(array, function(group) {\n if (isArrayLikeObject(group)) {\n length = nativeMax(group.length, length);\n return true;\n }\n });\n return baseTimes(length, function(index) {\n return arrayMap(array, baseProperty(index));\n });\n }\n\n /**\n * This method is like `_.unzip` except that it accepts `iteratee` to specify\n * how regrouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {Array} array The array of grouped elements to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n * regrouped values.\n * @returns {Array} Returns the new array of regrouped elements.\n * @example\n *\n * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n * // => [[1, 10, 100], [2, 20, 200]]\n *\n * _.unzipWith(zipped, _.add);\n * // => [3, 30, 300]\n */\n function unzipWith(array, iteratee) {\n if (!(array && array.length)) {\n return [];\n }\n var result = unzip(array);\n if (iteratee == null) {\n return result;\n }\n return arrayMap(result, function(group) {\n return apply(iteratee, undefined, group);\n });\n }\n\n /**\n * Creates an array excluding all given values using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.pull`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...*} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.xor\n * @example\n *\n * _.without([2, 1, 2, 3], 1, 2);\n * // => [3]\n */\n var without = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, values)\n : [];\n });\n\n /**\n * Creates an array of unique values that is the\n * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n * of the given arrays. The order of result values is determined by the order\n * they occur in the arrays.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.without\n * @example\n *\n * _.xor([2, 1], [2, 3]);\n * // => [1, 3]\n */\n var xor = baseRest(function(arrays) {\n return baseXor(arrayFilter(arrays, isArrayLikeObject));\n });\n\n /**\n * This method is like `_.xor` except that it accepts `iteratee` which is\n * invoked for each element of each `arrays` to generate the criterion by\n * which by which they're compared. The order of result values is determined\n * by the order they occur in the arrays. The iteratee is invoked with one\n * argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n * // => [1.2, 3.4]\n *\n * // The `_.property` iteratee shorthand.\n * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 2 }]\n */\n var xorBy = baseRest(function(arrays) {\n var iteratee = last(arrays);\n if (isArrayLikeObject(iteratee)) {\n iteratee = undefined;\n }\n return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n });\n\n /**\n * This method is like `_.xor` except that it accepts `comparator` which is\n * invoked to compare elements of `arrays`. The order of result values is\n * determined by the order they occur in the arrays. The comparator is invoked\n * with two arguments: (arrVal, othVal).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n *\n * _.xorWith(objects, others, _.isEqual);\n * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n */\n var xorWith = baseRest(function(arrays) {\n var comparator = last(arrays);\n comparator = typeof comparator == 'function' ? comparator : undefined;\n return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n });\n\n /**\n * Creates an array of grouped elements, the first of which contains the\n * first elements of the given arrays, the second of which contains the\n * second elements of the given arrays, and so on.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zip(['a', 'b'], [1, 2], [true, false]);\n * // => [['a', 1, true], ['b', 2, false]]\n */\n var zip = baseRest(unzip);\n\n /**\n * This method is like `_.fromPairs` except that it accepts two arrays,\n * one of property identifiers and one of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 0.4.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObject(['a', 'b'], [1, 2]);\n * // => { 'a': 1, 'b': 2 }\n */\n function zipObject(props, values) {\n return baseZipObject(props || [], values || [], assignValue);\n }\n\n /**\n * This method is like `_.zipObject` except that it supports property paths.\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n */\n function zipObjectDeep(props, values) {\n return baseZipObject(props || [], values || [], baseSet);\n }\n\n /**\n * This method is like `_.zip` except that it accepts `iteratee` to specify\n * how grouped values should be combined. The iteratee is invoked with the\n * elements of each group: (...group).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Array\n * @param {...Array} [arrays] The arrays to process.\n * @param {Function} [iteratee=_.identity] The function to combine\n * grouped values.\n * @returns {Array} Returns the new array of grouped elements.\n * @example\n *\n * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n * return a + b + c;\n * });\n * // => [111, 222]\n */\n var zipWith = baseRest(function(arrays) {\n var length = arrays.length,\n iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n return unzipWith(arrays, iteratee);\n });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n * chain sequences enabled. The result of such sequences must be unwrapped\n * with `_#value`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Seq\n * @param {*} value The value to wrap.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'pebbles', 'age': 1 }\n * ];\n *\n * var youngest = _\n * .chain(users)\n * .sortBy('age')\n * .map(function(o) {\n * return o.user + ' is ' + o.age;\n * })\n * .head()\n * .value();\n * // => 'pebbles is 1'\n */\n function chain(value) {\n var result = lodash(value);\n result.__chain__ = true;\n return result;\n }\n\n /**\n * This method invokes `interceptor` and returns `value`. The interceptor\n * is invoked with one argument; (value). The purpose of this method is to\n * \"tap into\" a method chain sequence in order to modify intermediate results.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns `value`.\n * @example\n *\n * _([1, 2, 3])\n * .tap(function(array) {\n * // Mutate input array.\n * array.pop();\n * })\n * .reverse()\n * .value();\n * // => [2, 1]\n */\n function tap(value, interceptor) {\n interceptor(value);\n return value;\n }\n\n /**\n * This method is like `_.tap` except that it returns the result of `interceptor`.\n * The purpose of this method is to \"pass thru\" values replacing intermediate\n * results in a method chain sequence.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Seq\n * @param {*} value The value to provide to `interceptor`.\n * @param {Function} interceptor The function to invoke.\n * @returns {*} Returns the result of `interceptor`.\n * @example\n *\n * _(' abc ')\n * .chain()\n * .trim()\n * .thru(function(value) {\n * return [value];\n * })\n * .value();\n * // => ['abc']\n */\n function thru(value, interceptor) {\n return interceptor(value);\n }\n\n /**\n * This method is the wrapper version of `_.at`.\n *\n * @name at\n * @memberOf _\n * @since 1.0.0\n * @category Seq\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n *\n * _(object).at(['a[0].b.c', 'a[1]']).value();\n * // => [3, 4]\n */\n var wrapperAt = flatRest(function(paths) {\n var length = paths.length,\n start = length ? paths[0] : 0,\n value = this.__wrapped__,\n interceptor = function(object) { return baseAt(object, paths); };\n\n if (length > 1 || this.__actions__.length ||\n !(value instanceof LazyWrapper) || !isIndex(start)) {\n return this.thru(interceptor);\n }\n value = value.slice(start, +start + (length ? 1 : 0));\n value.__actions__.push({\n 'func': thru,\n 'args': [interceptor],\n 'thisArg': undefined\n });\n return new LodashWrapper(value, this.__chain__).thru(function(array) {\n if (length && !array.length) {\n array.push(undefined);\n }\n return array;\n });\n });\n\n /**\n * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n *\n * @name chain\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 40 }\n * ];\n *\n * // A sequence without explicit chaining.\n * _(users).head();\n * // => { 'user': 'barney', 'age': 36 }\n *\n * // A sequence with explicit chaining.\n * _(users)\n * .chain()\n * .head()\n * .pick('user')\n * .value();\n * // => { 'user': 'barney' }\n */\n function wrapperChain() {\n return chain(this);\n }\n\n /**\n * Executes the chain sequence and returns the wrapped result.\n *\n * @name commit\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2];\n * var wrapped = _(array).push(3);\n *\n * console.log(array);\n * // => [1, 2]\n *\n * wrapped = wrapped.commit();\n * console.log(array);\n * // => [1, 2, 3]\n *\n * wrapped.last();\n * // => 3\n *\n * console.log(array);\n * // => [1, 2, 3]\n */\n function wrapperCommit() {\n return new LodashWrapper(this.value(), this.__chain__);\n }\n\n /**\n * Gets the next value on a wrapped object following the\n * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n *\n * @name next\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the next iterator value.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped.next();\n * // => { 'done': false, 'value': 1 }\n *\n * wrapped.next();\n * // => { 'done': false, 'value': 2 }\n *\n * wrapped.next();\n * // => { 'done': true, 'value': undefined }\n */\n function wrapperNext() {\n if (this.__values__ === undefined) {\n this.__values__ = toArray(this.value());\n }\n var done = this.__index__ >= this.__values__.length,\n value = done ? undefined : this.__values__[this.__index__++];\n\n return { 'done': done, 'value': value };\n }\n\n /**\n * Enables the wrapper to be iterable.\n *\n * @name Symbol.iterator\n * @memberOf _\n * @since 4.0.0\n * @category Seq\n * @returns {Object} Returns the wrapper object.\n * @example\n *\n * var wrapped = _([1, 2]);\n *\n * wrapped[Symbol.iterator]() === wrapped;\n * // => true\n *\n * Array.from(wrapped);\n * // => [1, 2]\n */\n function wrapperToIterator() {\n return this;\n }\n\n /**\n * Creates a clone of the chain sequence planting `value` as the wrapped value.\n *\n * @name plant\n * @memberOf _\n * @since 3.2.0\n * @category Seq\n * @param {*} value The value to plant.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2]).map(square);\n * var other = wrapped.plant([3, 4]);\n *\n * other.value();\n * // => [9, 16]\n *\n * wrapped.value();\n * // => [1, 4]\n */\n function wrapperPlant(value) {\n var result,\n parent = this;\n\n while (parent instanceof baseLodash) {\n var clone = wrapperClone(parent);\n clone.__index__ = 0;\n clone.__values__ = undefined;\n if (result) {\n previous.__wrapped__ = clone;\n } else {\n result = clone;\n }\n var previous = clone;\n parent = parent.__wrapped__;\n }\n previous.__wrapped__ = value;\n return result;\n }\n\n /**\n * This method is the wrapper version of `_.reverse`.\n *\n * **Note:** This method mutates the wrapped array.\n *\n * @name reverse\n * @memberOf _\n * @since 0.1.0\n * @category Seq\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * var array = [1, 2, 3];\n *\n * _(array).reverse().value()\n * // => [3, 2, 1]\n *\n * console.log(array);\n * // => [3, 2, 1]\n */\n function wrapperReverse() {\n var value = this.__wrapped__;\n if (value instanceof LazyWrapper) {\n var wrapped = value;\n if (this.__actions__.length) {\n wrapped = new LazyWrapper(this);\n }\n wrapped = wrapped.reverse();\n wrapped.__actions__.push({\n 'func': thru,\n 'args': [reverse],\n 'thisArg': undefined\n });\n return new LodashWrapper(wrapped, this.__chain__);\n }\n return this.thru(reverse);\n }\n\n /**\n * Executes the chain sequence to resolve the unwrapped value.\n *\n * @name value\n * @memberOf _\n * @since 0.1.0\n * @alias toJSON, valueOf\n * @category Seq\n * @returns {*} Returns the resolved unwrapped value.\n * @example\n *\n * _([1, 2, 3]).value();\n * // => [1, 2, 3]\n */\n function wrapperValue() {\n return baseWrapperValue(this.__wrapped__, this.__actions__);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the number of times the key was returned by `iteratee`. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.countBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': 1, '6': 2 }\n *\n * // The `_.property` iteratee shorthand.\n * _.countBy(['one', 'two', 'three'], 'length');\n * // => { '3': 2, '5': 1 }\n */\n var countBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n ++result[key];\n } else {\n baseAssignValue(result, key, 1);\n }\n });\n\n /**\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\n * Iteration is stopped once `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * **Note:** This method returns `true` for\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n * elements of empty collections.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.every(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.every(users, 'active');\n * // => false\n */\n function every(collection, predicate, guard) {\n var func = isArray(collection) ? arrayEvery : baseEvery;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `_.remove`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n *\n * // Combining several predicates using `_.overEvery` or `_.overSome`.\n * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n * // => objects for ['fred', 'barney']\n */\n function filter(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\n var find = createFind(findIndex);\n\n /**\n * This method is like `_.find` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=collection.length-1] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * _.findLast([1, 2, 3, 4], function(n) {\n * return n % 2 == 1;\n * });\n * // => 3\n */\n var findLast = createFind(findLastIndex);\n\n /**\n * Creates a flattened array of values by running each element in `collection`\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n * with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [n, n];\n * }\n *\n * _.flatMap([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\n function flatMap(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), 1);\n }\n\n /**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [[[n, n]]];\n * }\n *\n * _.flatMapDeep([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\n function flatMapDeep(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), INFINITY);\n }\n\n /**\n * This method is like `_.flatMap` except that it recursively flattens the\n * mapped results up to `depth` times.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {number} [depth=1] The maximum recursion depth.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [[[n, n]]];\n * }\n *\n * _.flatMapDepth([1, 2], duplicate, 2);\n * // => [[1, 1], [2, 2]]\n */\n function flatMapDepth(collection, iteratee, depth) {\n depth = depth === undefined ? 1 : toInteger(depth);\n return baseFlatten(map(collection, iteratee), depth);\n }\n\n /**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\n function forEach(collection, iteratee) {\n var func = isArray(collection) ? arrayEach : baseEach;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.forEach` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @alias eachRight\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEach\n * @example\n *\n * _.forEachRight([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `2` then `1`.\n */\n function forEachRight(collection, iteratee) {\n var func = isArray(collection) ? arrayEachRight : baseEachRight;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': [4.2], '6': [6.1, 6.3] }\n *\n * // The `_.property` iteratee shorthand.\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */\n var groupBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n result[key].push(value);\n } else {\n baseAssignValue(result, key, [value]);\n }\n });\n\n /**\n * Checks if `value` is in `collection`. If `collection` is a string, it's\n * checked for a substring of `value`, otherwise\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\n * the offset from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ 'a': 1, 'b': 2 }, 1);\n * // => true\n *\n * _.includes('abcd', 'bc');\n * // => true\n */\n function includes(collection, value, fromIndex, guard) {\n collection = isArrayLike(collection) ? collection : values(collection);\n fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n var length = collection.length;\n if (fromIndex < 0) {\n fromIndex = nativeMax(length + fromIndex, 0);\n }\n return isString(collection)\n ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n }\n\n /**\n * Invokes the method at `path` of each element in `collection`, returning\n * an array of the results of each invoked method. Any additional arguments\n * are provided to each invoked method. If `path` is a function, it's invoked\n * for, and `this` bound to, each element in `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array|Function|string} path The path of the method to invoke or\n * the function invoked per iteration.\n * @param {...*} [args] The arguments to invoke each method with.\n * @returns {Array} Returns the array of results.\n * @example\n *\n * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n * // => [[1, 5, 7], [1, 2, 3]]\n *\n * _.invokeMap([123, 456], String.prototype.split, '');\n * // => [['1', '2', '3'], ['4', '5', '6']]\n */\n var invokeMap = baseRest(function(collection, path, args) {\n var index = -1,\n isFunc = typeof path == 'function',\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value) {\n result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n });\n return result;\n });\n\n /**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the last element responsible for generating the key. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * var array = [\n * { 'dir': 'left', 'code': 97 },\n * { 'dir': 'right', 'code': 100 }\n * ];\n *\n * _.keyBy(array, function(o) {\n * return String.fromCharCode(o.code);\n * });\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n *\n * _.keyBy(array, 'dir');\n * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n */\n var keyBy = createAggregator(function(result, value, key) {\n baseAssignValue(result, key, value);\n });\n\n /**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\n function map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.sortBy` except that it allows specifying the sort\n * orders of the iteratees to sort by. If `orders` is unspecified, all values\n * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n * descending or \"asc\" for ascending sort order of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @param {string[]} [orders] The sort orders of `iteratees`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 34 },\n * { 'user': 'fred', 'age': 40 },\n * { 'user': 'barney', 'age': 36 }\n * ];\n *\n * // Sort by `user` in ascending order and by `age` in descending order.\n * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n */\n function orderBy(collection, iteratees, orders, guard) {\n if (collection == null) {\n return [];\n }\n if (!isArray(iteratees)) {\n iteratees = iteratees == null ? [] : [iteratees];\n }\n orders = guard ? undefined : orders;\n if (!isArray(orders)) {\n orders = orders == null ? [] : [orders];\n }\n return baseOrderBy(collection, iteratees, orders);\n }\n\n /**\n * Creates an array of elements split into two groups, the first of which\n * contains elements `predicate` returns truthy for, the second of which\n * contains elements `predicate` returns falsey for. The predicate is\n * invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the array of grouped elements.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true },\n * { 'user': 'pebbles', 'age': 1, 'active': false }\n * ];\n *\n * _.partition(users, function(o) { return o.active; });\n * // => objects for [['fred'], ['barney', 'pebbles']]\n *\n * // The `_.matches` iteratee shorthand.\n * _.partition(users, { 'age': 1, 'active': false });\n * // => objects for [['pebbles'], ['barney', 'fred']]\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.partition(users, ['active', false]);\n * // => objects for [['barney', 'pebbles'], ['fred']]\n *\n * // The `_.property` iteratee shorthand.\n * _.partition(users, 'active');\n * // => objects for [['fred'], ['barney', 'pebbles']]\n */\n var partition = createAggregator(function(result, value, key) {\n result[key ? 0 : 1].push(value);\n }, function() { return [[], []]; });\n\n /**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n * return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */\n function reduce(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduce : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n }\n\n /**\n * This method is like `_.reduce` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduce\n * @example\n *\n * var array = [[0, 1], [2, 3], [4, 5]];\n *\n * _.reduceRight(array, function(flattened, other) {\n * return flattened.concat(other);\n * }, []);\n * // => [4, 5, 2, 3, 0, 1]\n */\n function reduceRight(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduceRight : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n }\n\n /**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.filter\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true }\n * ];\n *\n * _.reject(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.reject(users, { 'age': 40, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.reject(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.reject(users, 'active');\n * // => objects for ['barney']\n */\n function reject(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, negate(getIteratee(predicate, 3)));\n }\n\n /**\n * Gets a random element from `collection`.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @returns {*} Returns the random element.\n * @example\n *\n * _.sample([1, 2, 3, 4]);\n * // => 2\n */\n function sample(collection) {\n var func = isArray(collection) ? arraySample : baseSample;\n return func(collection);\n }\n\n /**\n * Gets `n` random elements at unique keys from `collection` up to the\n * size of `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to sample.\n * @param {number} [n=1] The number of elements to sample.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the random elements.\n * @example\n *\n * _.sampleSize([1, 2, 3], 2);\n * // => [3, 1]\n *\n * _.sampleSize([1, 2, 3], 4);\n * // => [2, 3, 1]\n */\n function sampleSize(collection, n, guard) {\n if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n n = 1;\n } else {\n n = toInteger(n);\n }\n var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n return func(collection, n);\n }\n\n /**\n * Creates an array of shuffled values, using a version of the\n * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to shuffle.\n * @returns {Array} Returns the new shuffled array.\n * @example\n *\n * _.shuffle([1, 2, 3, 4]);\n * // => [4, 1, 3, 2]\n */\n function shuffle(collection) {\n var func = isArray(collection) ? arrayShuffle : baseShuffle;\n return func(collection);\n }\n\n /**\n * Gets the size of `collection` by returning its length for array-like\n * values or the number of own enumerable string keyed properties for objects.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @returns {number} Returns the collection size.\n * @example\n *\n * _.size([1, 2, 3]);\n * // => 3\n *\n * _.size({ 'a': 1, 'b': 2 });\n * // => 2\n *\n * _.size('pebbles');\n * // => 7\n */\n function size(collection) {\n if (collection == null) {\n return 0;\n }\n if (isArrayLike(collection)) {\n return isString(collection) ? stringSize(collection) : collection.length;\n }\n var tag = getTag(collection);\n if (tag == mapTag || tag == setTag) {\n return collection.size;\n }\n return baseKeys(collection).length;\n }\n\n /**\n * Checks if `predicate` returns truthy for **any** element of `collection`.\n * Iteration is stopped once `predicate` returns truthy. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n * @example\n *\n * _.some([null, 0, 'yes', false], Boolean);\n * // => true\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.some(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.some(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.some(users, 'active');\n * // => true\n */\n function some(collection, predicate, guard) {\n var func = isArray(collection) ? arraySome : baseSome;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, getIteratee(predicate, 3));\n }\n\n /**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 30 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n */\n var sortBy = baseRest(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\n var now = ctxNow || function() {\n return root.Date.now();\n };\n\n /*------------------------------------------------------------------------*/\n\n /**\n * The opposite of `_.before`; this method creates a function that invokes\n * `func` once it's called `n` or more times.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {number} n The number of calls before `func` is invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var saves = ['profile', 'settings'];\n *\n * var done = _.after(saves.length, function() {\n * console.log('done saving!');\n * });\n *\n * _.forEach(saves, function(type) {\n * asyncSave({ 'type': type, 'complete': done });\n * });\n * // => Logs 'done saving!' after the two async saves have completed.\n */\n function after(n, func) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n n = toInteger(n);\n return function() {\n if (--n < 1) {\n return func.apply(this, arguments);\n }\n };\n }\n\n /**\n * Creates a function that invokes `func`, with up to `n` arguments,\n * ignoring any additional arguments.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @param {number} [n=func.length] The arity cap.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n * // => [6, 8, 10]\n */\n function ary(func, n, guard) {\n n = guard ? undefined : n;\n n = (func && n == null) ? func.length : n;\n return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n }\n\n /**\n * Creates a function that invokes `func`, with the `this` binding and arguments\n * of the created function, while it's called less than `n` times. Subsequent\n * calls to the created function return the result of the last `func` invocation.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {number} n The number of calls at which `func` is no longer invoked.\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * jQuery(element).on('click', _.before(5, addContactToList));\n * // => Allows adding up to 4 contacts to the list.\n */\n function before(n, func) {\n var result;\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n n = toInteger(n);\n return function() {\n if (--n > 0) {\n result = func.apply(this, arguments);\n }\n if (n <= 1) {\n func = undefined;\n }\n return result;\n };\n }\n\n /**\n * Creates a function that invokes `func` with the `this` binding of `thisArg`\n * and `partials` prepended to the arguments it receives.\n *\n * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for partially applied arguments.\n *\n * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n * property of bound functions.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to bind.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * function greet(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * }\n *\n * var object = { 'user': 'fred' };\n *\n * var bound = _.bind(greet, object, 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * // Bound with placeholders.\n * var bound = _.bind(greet, object, _, '!');\n * bound('hi');\n * // => 'hi fred!'\n */\n var bind = baseRest(function(func, thisArg, partials) {\n var bitmask = WRAP_BIND_FLAG;\n if (partials.length) {\n var holders = replaceHolders(partials, getHolder(bind));\n bitmask |= WRAP_PARTIAL_FLAG;\n }\n return createWrap(func, bitmask, thisArg, partials, holders);\n });\n\n /**\n * Creates a function that invokes the method at `object[key]` with `partials`\n * prepended to the arguments it receives.\n *\n * This method differs from `_.bind` by allowing bound functions to reference\n * methods that may be redefined or don't yet exist. See\n * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n * for more details.\n *\n * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Function\n * @param {Object} object The object to invoke the method on.\n * @param {string} key The key of the method.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new bound function.\n * @example\n *\n * var object = {\n * 'user': 'fred',\n * 'greet': function(greeting, punctuation) {\n * return greeting + ' ' + this.user + punctuation;\n * }\n * };\n *\n * var bound = _.bindKey(object, 'greet', 'hi');\n * bound('!');\n * // => 'hi fred!'\n *\n * object.greet = function(greeting, punctuation) {\n * return greeting + 'ya ' + this.user + punctuation;\n * };\n *\n * bound('!');\n * // => 'hiya fred!'\n *\n * // Bound with placeholders.\n * var bound = _.bindKey(object, 'greet', _, '!');\n * bound('hi');\n * // => 'hiya fred!'\n */\n var bindKey = baseRest(function(object, key, partials) {\n var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n if (partials.length) {\n var holders = replaceHolders(partials, getHolder(bindKey));\n bitmask |= WRAP_PARTIAL_FLAG;\n }\n return createWrap(key, bitmask, object, partials, holders);\n });\n\n /**\n * Creates a function that accepts arguments of `func` and either invokes\n * `func` returning its result, if at least `arity` number of arguments have\n * been provided, or returns a function that accepts the remaining `func`\n * arguments, and so on. The arity of `func` may be specified if `func.length`\n * is not sufficient.\n *\n * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n * may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curry(abc);\n *\n * curried(1)(2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2)(3);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(1)(_, 3)(2);\n * // => [1, 2, 3]\n */\n function curry(func, arity, guard) {\n arity = guard ? undefined : arity;\n var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n result.placeholder = curry.placeholder;\n return result;\n }\n\n /**\n * This method is like `_.curry` except that arguments are applied to `func`\n * in the manner of `_.partialRight` instead of `_.partial`.\n *\n * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for provided arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of curried functions.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to curry.\n * @param {number} [arity=func.length] The arity of `func`.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the new curried function.\n * @example\n *\n * var abc = function(a, b, c) {\n * return [a, b, c];\n * };\n *\n * var curried = _.curryRight(abc);\n *\n * curried(3)(2)(1);\n * // => [1, 2, 3]\n *\n * curried(2, 3)(1);\n * // => [1, 2, 3]\n *\n * curried(1, 2, 3);\n * // => [1, 2, 3]\n *\n * // Curried with placeholders.\n * curried(3)(1, _)(2);\n * // => [1, 2, 3]\n */\n function curryRight(func, arity, guard) {\n arity = guard ? undefined : arity;\n var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n result.placeholder = curryRight.placeholder;\n return result;\n }\n\n /**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\n function debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n }\n\n /**\n * Defers invoking the `func` until the current call stack has cleared. Any\n * additional arguments are provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to defer.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.defer(function(text) {\n * console.log(text);\n * }, 'deferred');\n * // => Logs 'deferred' after one millisecond.\n */\n var defer = baseRest(function(func, args) {\n return baseDelay(func, 1, args);\n });\n\n /**\n * Invokes `func` after `wait` milliseconds. Any additional arguments are\n * provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to delay.\n * @param {number} wait The number of milliseconds to delay invocation.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {number} Returns the timer id.\n * @example\n *\n * _.delay(function(text) {\n * console.log(text);\n * }, 1000, 'later');\n * // => Logs 'later' after one second.\n */\n var delay = baseRest(function(func, wait, args) {\n return baseDelay(func, toNumber(wait) || 0, args);\n });\n\n /**\n * Creates a function that invokes `func` with arguments reversed.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to flip arguments for.\n * @returns {Function} Returns the new flipped function.\n * @example\n *\n * var flipped = _.flip(function() {\n * return _.toArray(arguments);\n * });\n *\n * flipped('a', 'b', 'c', 'd');\n * // => ['d', 'c', 'b', 'a']\n */\n function flip(func) {\n return createWrap(func, WRAP_FLIP_FLAG);\n }\n\n /**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\n function memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n }\n\n // Expose `MapCache`.\n memoize.Cache = MapCache;\n\n /**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new negated function.\n * @example\n *\n * function isEven(n) {\n * return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */\n function negate(predicate) {\n if (typeof predicate != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return function() {\n var args = arguments;\n switch (args.length) {\n case 0: return !predicate.call(this);\n case 1: return !predicate.call(this, args[0]);\n case 2: return !predicate.call(this, args[0], args[1]);\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\n }\n return !predicate.apply(this, args);\n };\n }\n\n /**\n * Creates a function that is restricted to invoking `func` once. Repeat calls\n * to the function return the value of the first invocation. The `func` is\n * invoked with the `this` binding and arguments of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new restricted function.\n * @example\n *\n * var initialize = _.once(createApplication);\n * initialize();\n * initialize();\n * // => `createApplication` is invoked once\n */\n function once(func) {\n return before(2, func);\n }\n\n /**\n * Creates a function that invokes `func` with its arguments transformed.\n *\n * @static\n * @since 4.0.0\n * @memberOf _\n * @category Function\n * @param {Function} func The function to wrap.\n * @param {...(Function|Function[])} [transforms=[_.identity]]\n * The argument transforms.\n * @returns {Function} Returns the new function.\n * @example\n *\n * function doubled(n) {\n * return n * 2;\n * }\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var func = _.overArgs(function(x, y) {\n * return [x, y];\n * }, [square, doubled]);\n *\n * func(9, 3);\n * // => [81, 6]\n *\n * func(10, 5);\n * // => [100, 10]\n */\n var overArgs = castRest(function(func, transforms) {\n transforms = (transforms.length == 1 && isArray(transforms[0]))\n ? arrayMap(transforms[0], baseUnary(getIteratee()))\n : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n var funcsLength = transforms.length;\n return baseRest(function(args) {\n var index = -1,\n length = nativeMin(args.length, funcsLength);\n\n while (++index < length) {\n args[index] = transforms[index].call(this, args[index]);\n }\n return apply(func, this, args);\n });\n });\n\n /**\n * Creates a function that invokes `func` with `partials` prepended to the\n * arguments it receives. This method is like `_.bind` except it does **not**\n * alter the `this` binding.\n *\n * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 0.2.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n * return greeting + ' ' + name;\n * }\n *\n * var sayHelloTo = _.partial(greet, 'hello');\n * sayHelloTo('fred');\n * // => 'hello fred'\n *\n * // Partially applied with placeholders.\n * var greetFred = _.partial(greet, _, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n */\n var partial = baseRest(function(func, partials) {\n var holders = replaceHolders(partials, getHolder(partial));\n return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n });\n\n /**\n * This method is like `_.partial` except that partially applied arguments\n * are appended to the arguments it receives.\n *\n * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n * return greeting + ' ' + name;\n * }\n *\n * var greetFred = _.partialRight(greet, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n *\n * // Partially applied with placeholders.\n * var sayHelloTo = _.partialRight(greet, 'hello', _);\n * sayHelloTo('fred');\n * // => 'hello fred'\n */\n var partialRight = baseRest(function(func, partials) {\n var holders = replaceHolders(partials, getHolder(partialRight));\n return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n });\n\n /**\n * Creates a function that invokes `func` with arguments arranged according\n * to the specified `indexes` where the argument value at the first index is\n * provided as the first argument, the argument value at the second index is\n * provided as the second argument, and so on.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} func The function to rearrange arguments for.\n * @param {...(number|number[])} indexes The arranged argument indexes.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var rearged = _.rearg(function(a, b, c) {\n * return [a, b, c];\n * }, [2, 0, 1]);\n *\n * rearged('b', 'c', 'a')\n * // => ['a', 'b', 'c']\n */\n var rearg = flatRest(function(func, indexes) {\n return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n });\n\n /**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as\n * an array.\n *\n * **Note:** This method is based on the\n * [rest parameter](https://mdn.io/rest_parameters).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.rest(function(what, names) {\n * return what + ' ' + _.initial(names).join(', ') +\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\n function rest(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = start === undefined ? start : toInteger(start);\n return baseRest(func, start);\n }\n\n /**\n * Creates a function that invokes `func` with the `this` binding of the\n * create function and an array of arguments much like\n * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n *\n * **Note:** This method is based on the\n * [spread operator](https://mdn.io/spread_operator).\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Function\n * @param {Function} func The function to spread arguments over.\n * @param {number} [start=0] The start position of the spread.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.spread(function(who, what) {\n * return who + ' says ' + what;\n * });\n *\n * say(['fred', 'hello']);\n * // => 'fred says hello'\n *\n * var numbers = Promise.all([\n * Promise.resolve(40),\n * Promise.resolve(36)\n * ]);\n *\n * numbers.then(_.spread(function(x, y) {\n * return x + y;\n * }));\n * // => a Promise of 76\n */\n function spread(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = start == null ? 0 : nativeMax(toInteger(start), 0);\n return baseRest(function(args) {\n var array = args[start],\n otherArgs = castSlice(args, 0, start);\n\n if (array) {\n arrayPush(otherArgs, array);\n }\n return apply(func, this, otherArgs);\n });\n }\n\n /**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\n function throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n }\n\n /**\n * Creates a function that accepts up to one argument, ignoring any\n * additional arguments.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n * @example\n *\n * _.map(['6', '8', '10'], _.unary(parseInt));\n * // => [6, 8, 10]\n */\n function unary(func) {\n return ary(func, 1);\n }\n\n /**\n * Creates a function that provides `value` to `wrapper` as its first\n * argument. Any additional arguments provided to the function are appended\n * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n * binding of the created function.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {*} value The value to wrap.\n * @param {Function} [wrapper=identity] The wrapper function.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var p = _.wrap(_.escape, function(func, text) {\n * return '<p>' + func(text) + '</p>';\n * });\n *\n * p('fred, barney, & pebbles');\n * // => '<p>fred, barney, & pebbles</p>'\n */\n function wrap(value, wrapper) {\n return partial(castFunction(wrapper), value);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Casts `value` as an array if it's not one.\n *\n * @static\n * @memberOf _\n * @since 4.4.0\n * @category Lang\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast array.\n * @example\n *\n * _.castArray(1);\n * // => [1]\n *\n * _.castArray({ 'a': 1 });\n * // => [{ 'a': 1 }]\n *\n * _.castArray('abc');\n * // => ['abc']\n *\n * _.castArray(null);\n * // => [null]\n *\n * _.castArray(undefined);\n * // => [undefined]\n *\n * _.castArray();\n * // => []\n *\n * var array = [1, 2, 3];\n * console.log(_.castArray(array) === array);\n * // => true\n */\n function castArray() {\n if (!arguments.length) {\n return [];\n }\n var value = arguments[0];\n return isArray(value) ? value : [value];\n }\n\n /**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\n function clone(value) {\n return baseClone(value, CLONE_SYMBOLS_FLAG);\n }\n\n /**\n * This method is like `_.clone` except that it accepts `customizer` which\n * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n * cloning is handled by the method instead. The `customizer` is invoked with\n * up to four arguments; (value [, index|key, object, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeepWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(false);\n * }\n * }\n *\n * var el = _.cloneWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 0\n */\n function cloneWith(value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n }\n\n /**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\n function cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n }\n\n /**\n * This method is like `_.cloneWith` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @param {Function} [customizer] The function to customize cloning.\n * @returns {*} Returns the deep cloned value.\n * @see _.cloneWith\n * @example\n *\n * function customizer(value) {\n * if (_.isElement(value)) {\n * return value.cloneNode(true);\n * }\n * }\n *\n * var el = _.cloneDeepWith(document.body, customizer);\n *\n * console.log(el === document.body);\n * // => false\n * console.log(el.nodeName);\n * // => 'BODY'\n * console.log(el.childNodes.length);\n * // => 20\n */\n function cloneDeepWith(value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n }\n\n /**\n * Checks if `object` conforms to `source` by invoking the predicate\n * properties of `source` with the corresponding property values of `object`.\n *\n * **Note:** This method is equivalent to `_.conforms` when `source` is\n * partially applied.\n *\n * @static\n * @memberOf _\n * @since 4.14.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property predicates to conform to.\n * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n * // => true\n *\n * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n * // => false\n */\n function conformsTo(object, source) {\n return source == null || baseConformsTo(object, source, keys(source));\n }\n\n /**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\n function eq(value, other) {\n return value === other || (value !== value && other !== other);\n }\n\n /**\n * Checks if `value` is greater than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n * @see _.lt\n * @example\n *\n * _.gt(3, 1);\n * // => true\n *\n * _.gt(3, 3);\n * // => false\n *\n * _.gt(1, 3);\n * // => false\n */\n var gt = createRelationalOperation(baseGt);\n\n /**\n * Checks if `value` is greater than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than or equal to\n * `other`, else `false`.\n * @see _.lte\n * @example\n *\n * _.gte(3, 1);\n * // => true\n *\n * _.gte(3, 3);\n * // => true\n *\n * _.gte(1, 3);\n * // => false\n */\n var gte = createRelationalOperation(function(value, other) {\n return value >= other;\n });\n\n /**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\n var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n };\n\n /**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\n var isArray = Array.isArray;\n\n /**\n * Checks if `value` is classified as an `ArrayBuffer` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n * @example\n *\n * _.isArrayBuffer(new ArrayBuffer(2));\n * // => true\n *\n * _.isArrayBuffer(new Array(2));\n * // => false\n */\n var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n /**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\n function isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n }\n\n /**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\n function isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n }\n\n /**\n * Checks if `value` is classified as a boolean primitive or object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n * @example\n *\n * _.isBoolean(false);\n * // => true\n *\n * _.isBoolean(null);\n * // => false\n */\n function isBoolean(value) {\n return value === true || value === false ||\n (isObjectLike(value) && baseGetTag(value) == boolTag);\n }\n\n /**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\n var isBuffer = nativeIsBuffer || stubFalse;\n\n /**\n * Checks if `value` is classified as a `Date` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n * @example\n *\n * _.isDate(new Date);\n * // => true\n *\n * _.isDate('Mon April 23 2012');\n * // => false\n */\n var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n /**\n * Checks if `value` is likely a DOM element.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n * @example\n *\n * _.isElement(document.body);\n * // => true\n *\n * _.isElement('<body>');\n * // => false\n */\n function isElement(value) {\n return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n }\n\n /**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\n function isEmpty(value) {\n if (value == null) {\n return true;\n }\n if (isArrayLike(value) &&\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n return !value.length;\n }\n var tag = getTag(value);\n if (tag == mapTag || tag == setTag) {\n return !value.size;\n }\n if (isPrototype(value)) {\n return !baseKeys(value).length;\n }\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\n function isEqual(value, other) {\n return baseIsEqual(value, other);\n }\n\n /**\n * This method is like `_.isEqual` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with up to\n * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, othValue) {\n * if (isGreeting(objValue) && isGreeting(othValue)) {\n * return true;\n * }\n * }\n *\n * var array = ['hello', 'goodbye'];\n * var other = ['hi', 'goodbye'];\n *\n * _.isEqualWith(array, other, customizer);\n * // => true\n */\n function isEqualWith(value, other, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n var result = customizer ? customizer(value, other) : undefined;\n return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n }\n\n /**\n * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n * `SyntaxError`, `TypeError`, or `URIError` object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n * @example\n *\n * _.isError(new Error);\n * // => true\n *\n * _.isError(Error);\n * // => false\n */\n function isError(value) {\n if (!isObjectLike(value)) {\n return false;\n }\n var tag = baseGetTag(value);\n return tag == errorTag || tag == domExcTag ||\n (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n }\n\n /**\n * Checks if `value` is a finite primitive number.\n *\n * **Note:** This method is based on\n * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n * @example\n *\n * _.isFinite(3);\n * // => true\n *\n * _.isFinite(Number.MIN_VALUE);\n * // => true\n *\n * _.isFinite(Infinity);\n * // => false\n *\n * _.isFinite('3');\n * // => false\n */\n function isFinite(value) {\n return typeof value == 'number' && nativeIsFinite(value);\n }\n\n /**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\n function isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n }\n\n /**\n * Checks if `value` is an integer.\n *\n * **Note:** This method is based on\n * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n * @example\n *\n * _.isInteger(3);\n * // => true\n *\n * _.isInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isInteger(Infinity);\n * // => false\n *\n * _.isInteger('3');\n * // => false\n */\n function isInteger(value) {\n return typeof value == 'number' && value == toInteger(value);\n }\n\n /**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\n function isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\n function isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n }\n\n /**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\n function isObjectLike(value) {\n return value != null && typeof value == 'object';\n }\n\n /**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\n var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n /**\n * Performs a partial deep comparison between `object` and `source` to\n * determine if `object` contains equivalent property values.\n *\n * **Note:** This method is equivalent to `_.matches` when `source` is\n * partially applied.\n *\n * Partial comparisons will match empty array and empty object `source`\n * values against any array or object value, respectively. See `_.isEqual`\n * for a list of supported value comparisons.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n *\n * _.isMatch(object, { 'b': 2 });\n * // => true\n *\n * _.isMatch(object, { 'b': 1 });\n * // => false\n */\n function isMatch(object, source) {\n return object === source || baseIsMatch(object, source, getMatchData(source));\n }\n\n /**\n * This method is like `_.isMatch` except that it accepts `customizer` which\n * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n * are handled by the method instead. The `customizer` is invoked with five\n * arguments: (objValue, srcValue, index|key, object, source).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n * @example\n *\n * function isGreeting(value) {\n * return /^h(?:i|ello)$/.test(value);\n * }\n *\n * function customizer(objValue, srcValue) {\n * if (isGreeting(objValue) && isGreeting(srcValue)) {\n * return true;\n * }\n * }\n *\n * var object = { 'greeting': 'hello' };\n * var source = { 'greeting': 'hi' };\n *\n * _.isMatchWith(object, source, customizer);\n * // => true\n */\n function isMatchWith(object, source, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return baseIsMatch(object, source, getMatchData(source), customizer);\n }\n\n /**\n * Checks if `value` is `NaN`.\n *\n * **Note:** This method is based on\n * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n * `undefined` and other non-number values.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n * @example\n *\n * _.isNaN(NaN);\n * // => true\n *\n * _.isNaN(new Number(NaN));\n * // => true\n *\n * isNaN(undefined);\n * // => true\n *\n * _.isNaN(undefined);\n * // => false\n */\n function isNaN(value) {\n // An `NaN` primitive is the only value that is not equal to itself.\n // Perform the `toStringTag` check first to avoid errors with some\n // ActiveX objects in IE.\n return isNumber(value) && value != +value;\n }\n\n /**\n * Checks if `value` is a pristine native function.\n *\n * **Note:** This method can't reliably detect native functions in the presence\n * of the core-js package because core-js circumvents this kind of detection.\n * Despite multiple requests, the core-js maintainer has made it clear: any\n * attempt to fix the detection will be obstructed. As a result, we're left\n * with little choice but to throw an error. Unfortunately, this also affects\n * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n * which rely on core-js.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\n function isNative(value) {\n if (isMaskable(value)) {\n throw new Error(CORE_ERROR_TEXT);\n }\n return baseIsNative(value);\n }\n\n /**\n * Checks if `value` is `null`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n * @example\n *\n * _.isNull(null);\n * // => true\n *\n * _.isNull(void 0);\n * // => false\n */\n function isNull(value) {\n return value === null;\n }\n\n /**\n * Checks if `value` is `null` or `undefined`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n * @example\n *\n * _.isNil(null);\n * // => true\n *\n * _.isNil(void 0);\n * // => true\n *\n * _.isNil(NaN);\n * // => false\n */\n function isNil(value) {\n return value == null;\n }\n\n /**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n * classified as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber('3');\n * // => false\n */\n function isNumber(value) {\n return typeof value == 'number' ||\n (isObjectLike(value) && baseGetTag(value) == numberTag);\n }\n\n /**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\n function isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n }\n\n /**\n * Checks if `value` is classified as a `RegExp` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\n var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n /**\n * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n * double precision number which isn't the result of a rounded unsafe integer.\n *\n * **Note:** This method is based on\n * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n * @example\n *\n * _.isSafeInteger(3);\n * // => true\n *\n * _.isSafeInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isSafeInteger(Infinity);\n * // => false\n *\n * _.isSafeInteger('3');\n * // => false\n */\n function isSafeInteger(value) {\n return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n }\n\n /**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\n var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n /**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\n function isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n }\n\n /**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\n function isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n }\n\n /**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\n var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n /**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\n function isUndefined(value) {\n return value === undefined;\n }\n\n /**\n * Checks if `value` is classified as a `WeakMap` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n * @example\n *\n * _.isWeakMap(new WeakMap);\n * // => true\n *\n * _.isWeakMap(new Map);\n * // => false\n */\n function isWeakMap(value) {\n return isObjectLike(value) && getTag(value) == weakMapTag;\n }\n\n /**\n * Checks if `value` is classified as a `WeakSet` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n * @example\n *\n * _.isWeakSet(new WeakSet);\n * // => true\n *\n * _.isWeakSet(new Set);\n * // => false\n */\n function isWeakSet(value) {\n return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n }\n\n /**\n * Checks if `value` is less than `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n * @see _.gt\n * @example\n *\n * _.lt(1, 3);\n * // => true\n *\n * _.lt(3, 3);\n * // => false\n *\n * _.lt(3, 1);\n * // => false\n */\n var lt = createRelationalOperation(baseLt);\n\n /**\n * Checks if `value` is less than or equal to `other`.\n *\n * @static\n * @memberOf _\n * @since 3.9.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than or equal to\n * `other`, else `false`.\n * @see _.gte\n * @example\n *\n * _.lte(1, 3);\n * // => true\n *\n * _.lte(3, 3);\n * // => true\n *\n * _.lte(3, 1);\n * // => false\n */\n var lte = createRelationalOperation(function(value, other) {\n return value <= other;\n });\n\n /**\n * Converts `value` to an array.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Array} Returns the converted array.\n * @example\n *\n * _.toArray({ 'a': 1, 'b': 2 });\n * // => [1, 2]\n *\n * _.toArray('abc');\n * // => ['a', 'b', 'c']\n *\n * _.toArray(1);\n * // => []\n *\n * _.toArray(null);\n * // => []\n */\n function toArray(value) {\n if (!value) {\n return [];\n }\n if (isArrayLike(value)) {\n return isString(value) ? stringToArray(value) : copyArray(value);\n }\n if (symIterator && value[symIterator]) {\n return iteratorToArray(value[symIterator]());\n }\n var tag = getTag(value),\n func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n return func(value);\n }\n\n /**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\n function toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n }\n\n /**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\n function toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n }\n\n /**\n * Converts `value` to an integer suitable for use as the length of an\n * array-like object.\n *\n * **Note:** This method is based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toLength(3.2);\n * // => 3\n *\n * _.toLength(Number.MIN_VALUE);\n * // => 0\n *\n * _.toLength(Infinity);\n * // => 4294967295\n *\n * _.toLength('3.2');\n * // => 3\n */\n function toLength(value) {\n return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n }\n\n /**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\n function toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n }\n\n /**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\n function toPlainObject(value) {\n return copyObject(value, keysIn(value));\n }\n\n /**\n * Converts `value` to a safe integer. A safe integer can be compared and\n * represented correctly.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toSafeInteger(3.2);\n * // => 3\n *\n * _.toSafeInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toSafeInteger(Infinity);\n * // => 9007199254740991\n *\n * _.toSafeInteger('3.2');\n * // => 3\n */\n function toSafeInteger(value) {\n return value\n ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n : (value === 0 ? value : 0);\n }\n\n /**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\n function toString(value) {\n return value == null ? '' : baseToString(value);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Assigns own enumerable string keyed properties of source objects to the\n * destination object. Source objects are applied from left to right.\n * Subsequent sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assignIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assign({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3 }\n */\n var assign = createAssigner(function(object, source) {\n if (isPrototype(source) || isArrayLike(source)) {\n copyObject(source, keys(source), object);\n return;\n }\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n assignValue(object, key, source[key]);\n }\n }\n });\n\n /**\n * This method is like `_.assign` except that it iterates over own and\n * inherited source properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extend\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assign\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n */\n var assignIn = createAssigner(function(object, source) {\n copyObject(source, keysIn(source), object);\n });\n\n /**\n * This method is like `_.assignIn` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extendWith\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignInWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keysIn(source), object, customizer);\n });\n\n /**\n * This method is like `_.assign` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignInWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keys(source), object, customizer);\n });\n\n /**\n * Creates an array of values corresponding to `paths` of `object`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Array} Returns the picked values.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n *\n * _.at(object, ['a[0].b.c', 'a[1]']);\n * // => [3, 4]\n */\n var at = flatRest(baseAt);\n\n /**\n * Creates an object that inherits from the `prototype` object. If a\n * `properties` object is given, its own enumerable string keyed properties\n * are assigned to the created object.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Object\n * @param {Object} prototype The object to inherit from.\n * @param {Object} [properties] The properties to assign to the object.\n * @returns {Object} Returns the new object.\n * @example\n *\n * function Shape() {\n * this.x = 0;\n * this.y = 0;\n * }\n *\n * function Circle() {\n * Shape.call(this);\n * }\n *\n * Circle.prototype = _.create(Shape.prototype, {\n * 'constructor': Circle\n * });\n *\n * var circle = new Circle;\n * circle instanceof Circle;\n * // => true\n *\n * circle instanceof Shape;\n * // => true\n */\n function create(prototype, properties) {\n var result = baseCreate(prototype);\n return properties == null ? result : baseAssign(result, properties);\n }\n\n /**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\n var defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n });\n\n /**\n * This method is like `_.defaults` except that it recursively assigns\n * default properties.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaults\n * @example\n *\n * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n * // => { 'a': { 'b': 2, 'c': 3 } }\n */\n var defaultsDeep = baseRest(function(args) {\n args.push(undefined, customDefaultsMerge);\n return apply(mergeWith, undefined, args);\n });\n\n /**\n * This method is like `_.find` except that it returns the key of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findKey(users, function(o) { return o.age < 40; });\n * // => 'barney' (iteration order is not guaranteed)\n *\n * // The `_.matches` iteratee shorthand.\n * _.findKey(users, { 'age': 1, 'active': true });\n * // => 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findKey(users, 'active');\n * // => 'barney'\n */\n function findKey(object, predicate) {\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n }\n\n /**\n * This method is like `_.findKey` except that it iterates over elements of\n * a collection in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {string|undefined} Returns the key of the matched element,\n * else `undefined`.\n * @example\n *\n * var users = {\n * 'barney': { 'age': 36, 'active': true },\n * 'fred': { 'age': 40, 'active': false },\n * 'pebbles': { 'age': 1, 'active': true }\n * };\n *\n * _.findLastKey(users, function(o) { return o.age < 40; });\n * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastKey(users, { 'age': 36, 'active': true });\n * // => 'barney'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastKey(users, ['active', false]);\n * // => 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastKey(users, 'active');\n * // => 'pebbles'\n */\n function findLastKey(object, predicate) {\n return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n }\n\n /**\n * Iterates over own and inherited enumerable string keyed properties of an\n * object and invokes `iteratee` for each property. The iteratee is invoked\n * with three arguments: (value, key, object). Iteratee functions may exit\n * iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forInRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forIn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n */\n function forIn(object, iteratee) {\n return object == null\n ? object\n : baseFor(object, getIteratee(iteratee, 3), keysIn);\n }\n\n /**\n * This method is like `_.forIn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forInRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n */\n function forInRight(object, iteratee) {\n return object == null\n ? object\n : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n }\n\n /**\n * Iterates over own enumerable string keyed properties of an object and\n * invokes `iteratee` for each property. The iteratee is invoked with three\n * arguments: (value, key, object). Iteratee functions may exit iteration\n * early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwnRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\n function forOwn(object, iteratee) {\n return object && baseForOwn(object, getIteratee(iteratee, 3));\n }\n\n /**\n * This method is like `_.forOwn` except that it iterates over properties of\n * `object` in the opposite order.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwnRight(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n */\n function forOwnRight(object, iteratee) {\n return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n }\n\n /**\n * Creates an array of function property names from own enumerable properties\n * of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functionsIn\n * @example\n *\n * function Foo() {\n * this.a = _.constant('a');\n * this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functions(new Foo);\n * // => ['a', 'b']\n */\n function functions(object) {\n return object == null ? [] : baseFunctions(object, keys(object));\n }\n\n /**\n * Creates an array of function property names from own and inherited\n * enumerable properties of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to inspect.\n * @returns {Array} Returns the function names.\n * @see _.functions\n * @example\n *\n * function Foo() {\n * this.a = _.constant('a');\n * this.b = _.constant('b');\n * }\n *\n * Foo.prototype.c = _.constant('c');\n *\n * _.functionsIn(new Foo);\n * // => ['a', 'b', 'c']\n */\n function functionsIn(object) {\n return object == null ? [] : baseFunctions(object, keysIn(object));\n }\n\n /**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\n function get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n }\n\n /**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\n function has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n }\n\n /**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\n function hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n }\n\n /**\n * Creates an object composed of the inverted keys and values of `object`.\n * If `object` contains duplicate values, subsequent values overwrite\n * property assignments of previous values.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Object\n * @param {Object} object The object to invert.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invert(object);\n * // => { '1': 'c', '2': 'b' }\n */\n var invert = createInverter(function(result, value, key) {\n if (value != null &&\n typeof value.toString != 'function') {\n value = nativeObjectToString.call(value);\n }\n\n result[value] = key;\n }, constant(identity));\n\n /**\n * This method is like `_.invert` except that the inverted object is generated\n * from the results of running each element of `object` thru `iteratee`. The\n * corresponding inverted value of each inverted key is an array of keys\n * responsible for generating the inverted value. The iteratee is invoked\n * with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.1.0\n * @category Object\n * @param {Object} object The object to invert.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invertBy(object);\n * // => { '1': ['a', 'c'], '2': ['b'] }\n *\n * _.invertBy(object, function(value) {\n * return 'group' + value;\n * });\n * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n */\n var invertBy = createInverter(function(result, value, key) {\n if (value != null &&\n typeof value.toString != 'function') {\n value = nativeObjectToString.call(value);\n }\n\n if (hasOwnProperty.call(result, value)) {\n result[value].push(key);\n } else {\n result[value] = [key];\n }\n }, getIteratee);\n\n /**\n * Invokes the method at `path` of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n *\n * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n * // => [2, 3]\n */\n var invoke = baseRest(baseInvoke);\n\n /**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\n function keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n }\n\n /**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\n function keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n }\n\n /**\n * The opposite of `_.mapValues`; this method creates an object with the\n * same values as `object` and keys generated by running each own enumerable\n * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n * with three arguments: (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 3.8.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapValues\n * @example\n *\n * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n * return key + value;\n * });\n * // => { 'a1': 1, 'b2': 2 }\n */\n function mapKeys(object, iteratee) {\n var result = {};\n iteratee = getIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, iteratee(value, key, object), value);\n });\n return result;\n }\n\n /**\n * Creates an object with the same keys as `object` and values generated\n * by running each own enumerable string keyed property of `object` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapKeys\n * @example\n *\n * var users = {\n * 'fred': { 'user': 'fred', 'age': 40 },\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * _.mapValues(users, function(o) { return o.age; });\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n *\n * // The `_.property` iteratee shorthand.\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */\n function mapValues(object, iteratee) {\n var result = {};\n iteratee = getIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, key, iteratee(value, key, object));\n });\n return result;\n }\n\n /**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\n var merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n });\n\n /**\n * This method is like `_.merge` except that it accepts `customizer` which\n * is invoked to produce the merged values of the destination and source\n * properties. If `customizer` returns `undefined`, merging is handled by the\n * method instead. The `customizer` is invoked with six arguments:\n * (objValue, srcValue, key, object, source, stack).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} customizer The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function customizer(objValue, srcValue) {\n * if (_.isArray(objValue)) {\n * return objValue.concat(srcValue);\n * }\n * }\n *\n * var object = { 'a': [1], 'b': [2] };\n * var other = { 'a': [3], 'b': [4] };\n *\n * _.mergeWith(object, other, customizer);\n * // => { 'a': [1, 3], 'b': [2, 4] }\n */\n var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n baseMerge(object, source, srcIndex, customizer);\n });\n\n /**\n * The opposite of `_.pick`; this method creates an object composed of the\n * own and inherited enumerable property paths of `object` that are not omitted.\n *\n * **Note:** This method is considerably slower than `_.pick`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to omit.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omit(object, ['a', 'c']);\n * // => { 'b': '2' }\n */\n var omit = flatRest(function(object, paths) {\n var result = {};\n if (object == null) {\n return result;\n }\n var isDeep = false;\n paths = arrayMap(paths, function(path) {\n path = castPath(path, object);\n isDeep || (isDeep = path.length > 1);\n return path;\n });\n copyObject(object, getAllKeysIn(object), result);\n if (isDeep) {\n result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n }\n var length = paths.length;\n while (length--) {\n baseUnset(result, paths[length]);\n }\n return result;\n });\n\n /**\n * The opposite of `_.pickBy`; this method creates an object composed of\n * the own and inherited enumerable string keyed properties of `object` that\n * `predicate` doesn't return truthy for. The predicate is invoked with two\n * arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omitBy(object, _.isNumber);\n * // => { 'b': '2' }\n */\n function omitBy(object, predicate) {\n return pickBy(object, negate(getIteratee(predicate)));\n }\n\n /**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */\n var pick = flatRest(function(object, paths) {\n return object == null ? {} : basePick(object, paths);\n });\n\n /**\n * Creates an object composed of the `object` properties `predicate` returns\n * truthy for. The predicate is invoked with two arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pickBy(object, _.isNumber);\n * // => { 'a': 1, 'c': 3 }\n */\n function pickBy(object, predicate) {\n if (object == null) {\n return {};\n }\n var props = arrayMap(getAllKeysIn(object), function(prop) {\n return [prop];\n });\n predicate = getIteratee(predicate);\n return basePickBy(object, props, function(value, path) {\n return predicate(value, path[0]);\n });\n }\n\n /**\n * This method is like `_.get` except that if the resolved value is a\n * function it's invoked with the `this` binding of its parent object and\n * its result is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to resolve.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n *\n * _.result(object, 'a[0].b.c1');\n * // => 3\n *\n * _.result(object, 'a[0].b.c2');\n * // => 4\n *\n * _.result(object, 'a[0].b.c3', 'default');\n * // => 'default'\n *\n * _.result(object, 'a[0].b.c3', _.constant('default'));\n * // => 'default'\n */\n function result(object, path, defaultValue) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length;\n\n // Ensure the loop is entered when path is empty.\n if (!length) {\n length = 1;\n object = undefined;\n }\n while (++index < length) {\n var value = object == null ? undefined : object[toKey(path[index])];\n if (value === undefined) {\n index = length;\n value = defaultValue;\n }\n object = isFunction(value) ? value.call(object) : value;\n }\n return object;\n }\n\n /**\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n * it's created. Arrays are created for missing index properties while objects\n * are created for all other missing properties. Use `_.setWith` to customize\n * `path` creation.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.set(object, 'a[0].b.c', 4);\n * console.log(object.a[0].b.c);\n * // => 4\n *\n * _.set(object, ['x', '0', 'y', 'z'], 5);\n * console.log(object.x[0].y.z);\n * // => 5\n */\n function set(object, path, value) {\n return object == null ? object : baseSet(object, path, value);\n }\n\n /**\n * This method is like `_.set` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.setWith(object, '[0][1]', 'a', Object);\n * // => { '0': { '1': 'a' } }\n */\n function setWith(object, path, value, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return object == null ? object : baseSet(object, path, value, customizer);\n }\n\n /**\n * Creates an array of own enumerable string keyed-value pairs for `object`\n * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n * entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entries\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairs(new Foo);\n * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n */\n var toPairs = createToPairs(keys);\n\n /**\n * Creates an array of own and inherited enumerable string keyed-value pairs\n * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n * or set, its entries are returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias entriesIn\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the key-value pairs.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.toPairsIn(new Foo);\n * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n */\n var toPairsIn = createToPairs(keysIn);\n\n /**\n * An alternative to `_.reduce`; this method transforms `object` to a new\n * `accumulator` object which is the result of running each of its own\n * enumerable string keyed properties thru `iteratee`, with each invocation\n * potentially mutating the `accumulator` object. If `accumulator` is not\n * provided, a new object with the same `[[Prototype]]` will be used. The\n * iteratee is invoked with four arguments: (accumulator, value, key, object).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 1.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The custom accumulator value.\n * @returns {*} Returns the accumulated value.\n * @example\n *\n * _.transform([2, 3, 4], function(result, n) {\n * result.push(n *= n);\n * return n % 2 == 0;\n * }, []);\n * // => [4, 9]\n *\n * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] }\n */\n function transform(object, iteratee, accumulator) {\n var isArr = isArray(object),\n isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n iteratee = getIteratee(iteratee, 4);\n if (accumulator == null) {\n var Ctor = object && object.constructor;\n if (isArrLike) {\n accumulator = isArr ? new Ctor : [];\n }\n else if (isObject(object)) {\n accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n }\n else {\n accumulator = {};\n }\n }\n (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n return iteratee(accumulator, value, index, object);\n });\n return accumulator;\n }\n\n /**\n * Removes the property at `path` of `object`.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n * _.unset(object, 'a[0].b.c');\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n *\n * _.unset(object, ['a', '0', 'b', 'c']);\n * // => true\n *\n * console.log(object);\n * // => { 'a': [{ 'b': {} }] };\n */\n function unset(object, path) {\n return object == null ? true : baseUnset(object, path);\n }\n\n /**\n * This method is like `_.set` except that accepts `updater` to produce the\n * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n * is invoked with one argument: (value).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n * console.log(object.a[0].b.c);\n * // => 9\n *\n * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n * console.log(object.x[0].y.z);\n * // => 0\n */\n function update(object, path, updater) {\n return object == null ? object : baseUpdate(object, path, castFunction(updater));\n }\n\n /**\n * This method is like `_.update` except that it accepts `customizer` which is\n * invoked to produce the objects of `path`. If `customizer` returns `undefined`\n * path creation is handled by the method instead. The `customizer` is invoked\n * with three arguments: (nsValue, key, nsObject).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.6.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {Function} updater The function to produce the updated value.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {};\n *\n * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n * // => { '0': { '1': 'a' } }\n */\n function updateWith(object, path, updater, customizer) {\n customizer = typeof customizer == 'function' ? customizer : undefined;\n return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n }\n\n /**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\n function values(object) {\n return object == null ? [] : baseValues(object, keys(object));\n }\n\n /**\n * Creates an array of the own and inherited enumerable string keyed property\n * values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.valuesIn(new Foo);\n * // => [1, 2, 3] (iteration order is not guaranteed)\n */\n function valuesIn(object) {\n return object == null ? [] : baseValues(object, keysIn(object));\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Clamps `number` within the inclusive `lower` and `upper` bounds.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Number\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n * @example\n *\n * _.clamp(-10, -5, 5);\n * // => -5\n *\n * _.clamp(10, -5, 5);\n * // => 5\n */\n function clamp(number, lower, upper) {\n if (upper === undefined) {\n upper = lower;\n lower = undefined;\n }\n if (upper !== undefined) {\n upper = toNumber(upper);\n upper = upper === upper ? upper : 0;\n }\n if (lower !== undefined) {\n lower = toNumber(lower);\n lower = lower === lower ? lower : 0;\n }\n return baseClamp(toNumber(number), lower, upper);\n }\n\n /**\n * Checks if `n` is between `start` and up to, but not including, `end`. If\n * `end` is not specified, it's set to `start` with `start` then set to `0`.\n * If `start` is greater than `end` the params are swapped to support\n * negative ranges.\n *\n * @static\n * @memberOf _\n * @since 3.3.0\n * @category Number\n * @param {number} number The number to check.\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n * @see _.range, _.rangeRight\n * @example\n *\n * _.inRange(3, 2, 4);\n * // => true\n *\n * _.inRange(4, 8);\n * // => true\n *\n * _.inRange(4, 2);\n * // => false\n *\n * _.inRange(2, 2);\n * // => false\n *\n * _.inRange(1.2, 2);\n * // => true\n *\n * _.inRange(5.2, 4);\n * // => false\n *\n * _.inRange(-3, -2, -6);\n * // => true\n */\n function inRange(number, start, end) {\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n number = toNumber(number);\n return baseInRange(number, start, end);\n }\n\n /**\n * Produces a random number between the inclusive `lower` and `upper` bounds.\n * If only one argument is provided a number between `0` and the given number\n * is returned. If `floating` is `true`, or either `lower` or `upper` are\n * floats, a floating-point number is returned instead of an integer.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Number\n * @param {number} [lower=0] The lower bound.\n * @param {number} [upper=1] The upper bound.\n * @param {boolean} [floating] Specify returning a floating-point number.\n * @returns {number} Returns the random number.\n * @example\n *\n * _.random(0, 5);\n * // => an integer between 0 and 5\n *\n * _.random(5);\n * // => also an integer between 0 and 5\n *\n * _.random(5, true);\n * // => a floating-point number between 0 and 5\n *\n * _.random(1.2, 5.2);\n * // => a floating-point number between 1.2 and 5.2\n */\n function random(lower, upper, floating) {\n if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n upper = floating = undefined;\n }\n if (floating === undefined) {\n if (typeof upper == 'boolean') {\n floating = upper;\n upper = undefined;\n }\n else if (typeof lower == 'boolean') {\n floating = lower;\n lower = undefined;\n }\n }\n if (lower === undefined && upper === undefined) {\n lower = 0;\n upper = 1;\n }\n else {\n lower = toFinite(lower);\n if (upper === undefined) {\n upper = lower;\n lower = 0;\n } else {\n upper = toFinite(upper);\n }\n }\n if (lower > upper) {\n var temp = lower;\n lower = upper;\n upper = temp;\n }\n if (floating || lower % 1 || upper % 1) {\n var rand = nativeRandom();\n return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n }\n return baseRandom(lower, upper);\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the camel cased string.\n * @example\n *\n * _.camelCase('Foo Bar');\n * // => 'fooBar'\n *\n * _.camelCase('--foo-bar--');\n * // => 'fooBar'\n *\n * _.camelCase('__FOO_BAR__');\n * // => 'fooBar'\n */\n var camelCase = createCompounder(function(result, word, index) {\n word = word.toLowerCase();\n return result + (index ? capitalize(word) : word);\n });\n\n /**\n * Converts the first character of `string` to upper case and the remaining\n * to lower case.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to capitalize.\n * @returns {string} Returns the capitalized string.\n * @example\n *\n * _.capitalize('FRED');\n * // => 'Fred'\n */\n function capitalize(string) {\n return upperFirst(toString(string).toLowerCase());\n }\n\n /**\n * Deburrs `string` by converting\n * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n * letters to basic Latin letters and removing\n * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to deburr.\n * @returns {string} Returns the deburred string.\n * @example\n *\n * _.deburr('d\u00E9j\u00E0 vu');\n * // => 'deja vu'\n */\n function deburr(string) {\n string = toString(string);\n return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n }\n\n /**\n * Checks if `string` ends with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=string.length] The position to search up to.\n * @returns {boolean} Returns `true` if `string` ends with `target`,\n * else `false`.\n * @example\n *\n * _.endsWith('abc', 'c');\n * // => true\n *\n * _.endsWith('abc', 'b');\n * // => false\n *\n * _.endsWith('abc', 'b', 2);\n * // => true\n */\n function endsWith(string, target, position) {\n string = toString(string);\n target = baseToString(target);\n\n var length = string.length;\n position = position === undefined\n ? length\n : baseClamp(toInteger(position), 0, length);\n\n var end = position;\n position -= target.length;\n return position >= 0 && string.slice(position, end) == target;\n }\n\n /**\n * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n * corresponding HTML entities.\n *\n * **Note:** No other characters are escaped. To escape additional\n * characters use a third-party library like [_he_](https://mths.be/he).\n *\n * Though the \">\" character is escaped for symmetry, characters like\n * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n * unless they're part of a tag or unquoted attribute value. See\n * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n * (under \"semi-related fun fact\") for more details.\n *\n * When working with HTML you should always\n * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n * XSS vectors.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escape('fred, barney, & pebbles');\n * // => 'fred, barney, & pebbles'\n */\n function escape(string) {\n string = toString(string);\n return (string && reHasUnescapedHtml.test(string))\n ? string.replace(reUnescapedHtml, escapeHtmlChar)\n : string;\n }\n\n /**\n * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escapeRegExp('[lodash](https://lodash.com/)');\n * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n */\n function escapeRegExp(string) {\n string = toString(string);\n return (string && reHasRegExpChar.test(string))\n ? string.replace(reRegExpChar, '\\\\$&')\n : string;\n }\n\n /**\n * Converts `string` to\n * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the kebab cased string.\n * @example\n *\n * _.kebabCase('Foo Bar');\n * // => 'foo-bar'\n *\n * _.kebabCase('fooBar');\n * // => 'foo-bar'\n *\n * _.kebabCase('__FOO_BAR__');\n * // => 'foo-bar'\n */\n var kebabCase = createCompounder(function(result, word, index) {\n return result + (index ? '-' : '') + word.toLowerCase();\n });\n\n /**\n * Converts `string`, as space separated words, to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the lower cased string.\n * @example\n *\n * _.lowerCase('--Foo-Bar--');\n * // => 'foo bar'\n *\n * _.lowerCase('fooBar');\n * // => 'foo bar'\n *\n * _.lowerCase('__FOO_BAR__');\n * // => 'foo bar'\n */\n var lowerCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + word.toLowerCase();\n });\n\n /**\n * Converts the first character of `string` to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.lowerFirst('Fred');\n * // => 'fred'\n *\n * _.lowerFirst('FRED');\n * // => 'fRED'\n */\n var lowerFirst = createCaseFirst('toLowerCase');\n\n /**\n * Pads `string` on the left and right sides if it's shorter than `length`.\n * Padding characters are truncated if they can't be evenly divided by `length`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.pad('abc', 8);\n * // => ' abc '\n *\n * _.pad('abc', 8, '_-');\n * // => '_-abc_-_'\n *\n * _.pad('abc', 3);\n * // => 'abc'\n */\n function pad(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n if (!length || strLength >= length) {\n return string;\n }\n var mid = (length - strLength) / 2;\n return (\n createPadding(nativeFloor(mid), chars) +\n string +\n createPadding(nativeCeil(mid), chars)\n );\n }\n\n /**\n * Pads `string` on the right side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padEnd('abc', 6);\n * // => 'abc '\n *\n * _.padEnd('abc', 6, '_-');\n * // => 'abc_-_'\n *\n * _.padEnd('abc', 3);\n * // => 'abc'\n */\n function padEnd(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n return (length && strLength < length)\n ? (string + createPadding(length - strLength, chars))\n : string;\n }\n\n /**\n * Pads `string` on the left side if it's shorter than `length`. Padding\n * characters are truncated if they exceed `length`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to pad.\n * @param {number} [length=0] The padding length.\n * @param {string} [chars=' '] The string used as padding.\n * @returns {string} Returns the padded string.\n * @example\n *\n * _.padStart('abc', 6);\n * // => ' abc'\n *\n * _.padStart('abc', 6, '_-');\n * // => '_-_abc'\n *\n * _.padStart('abc', 3);\n * // => 'abc'\n */\n function padStart(string, length, chars) {\n string = toString(string);\n length = toInteger(length);\n\n var strLength = length ? stringSize(string) : 0;\n return (length && strLength < length)\n ? (createPadding(length - strLength, chars) + string)\n : string;\n }\n\n /**\n * Converts `string` to an integer of the specified radix. If `radix` is\n * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n * hexadecimal, in which case a `radix` of `16` is used.\n *\n * **Note:** This method aligns with the\n * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category String\n * @param {string} string The string to convert.\n * @param {number} [radix=10] The radix to interpret `value` by.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.parseInt('08');\n * // => 8\n *\n * _.map(['6', '08', '10'], _.parseInt);\n * // => [6, 8, 10]\n */\n function parseInt(string, radix, guard) {\n if (guard || radix == null) {\n radix = 0;\n } else if (radix) {\n radix = +radix;\n }\n return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n }\n\n /**\n * Repeats the given string `n` times.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to repeat.\n * @param {number} [n=1] The number of times to repeat the string.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the repeated string.\n * @example\n *\n * _.repeat('*', 3);\n * // => '***'\n *\n * _.repeat('abc', 2);\n * // => 'abcabc'\n *\n * _.repeat('abc', 0);\n * // => ''\n */\n function repeat(string, n, guard) {\n if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n n = 1;\n } else {\n n = toInteger(n);\n }\n return baseRepeat(toString(string), n);\n }\n\n /**\n * Replaces matches for `pattern` in `string` with `replacement`.\n *\n * **Note:** This method is based on\n * [`String#replace`](https://mdn.io/String/replace).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to modify.\n * @param {RegExp|string} pattern The pattern to replace.\n * @param {Function|string} replacement The match replacement.\n * @returns {string} Returns the modified string.\n * @example\n *\n * _.replace('Hi Fred', 'Fred', 'Barney');\n * // => 'Hi Barney'\n */\n function replace() {\n var args = arguments,\n string = toString(args[0]);\n\n return args.length < 3 ? string : string.replace(args[1], args[2]);\n }\n\n /**\n * Converts `string` to\n * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the snake cased string.\n * @example\n *\n * _.snakeCase('Foo Bar');\n * // => 'foo_bar'\n *\n * _.snakeCase('fooBar');\n * // => 'foo_bar'\n *\n * _.snakeCase('--FOO-BAR--');\n * // => 'foo_bar'\n */\n var snakeCase = createCompounder(function(result, word, index) {\n return result + (index ? '_' : '') + word.toLowerCase();\n });\n\n /**\n * Splits `string` by `separator`.\n *\n * **Note:** This method is based on\n * [`String#split`](https://mdn.io/String/split).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to split.\n * @param {RegExp|string} separator The separator pattern to split by.\n * @param {number} [limit] The length to truncate results to.\n * @returns {Array} Returns the string segments.\n * @example\n *\n * _.split('a-b-c', '-', 2);\n * // => ['a', 'b']\n */\n function split(string, separator, limit) {\n if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n separator = limit = undefined;\n }\n limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n if (!limit) {\n return [];\n }\n string = toString(string);\n if (string && (\n typeof separator == 'string' ||\n (separator != null && !isRegExp(separator))\n )) {\n separator = baseToString(separator);\n if (!separator && hasUnicode(string)) {\n return castSlice(stringToArray(string), 0, limit);\n }\n }\n return string.split(separator, limit);\n }\n\n /**\n * Converts `string` to\n * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n *\n * @static\n * @memberOf _\n * @since 3.1.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the start cased string.\n * @example\n *\n * _.startCase('--foo-bar--');\n * // => 'Foo Bar'\n *\n * _.startCase('fooBar');\n * // => 'Foo Bar'\n *\n * _.startCase('__FOO_BAR__');\n * // => 'FOO BAR'\n */\n var startCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + upperFirst(word);\n });\n\n /**\n * Checks if `string` starts with the given target string.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {string} [target] The string to search for.\n * @param {number} [position=0] The position to search from.\n * @returns {boolean} Returns `true` if `string` starts with `target`,\n * else `false`.\n * @example\n *\n * _.startsWith('abc', 'a');\n * // => true\n *\n * _.startsWith('abc', 'b');\n * // => false\n *\n * _.startsWith('abc', 'b', 1);\n * // => true\n */\n function startsWith(string, target, position) {\n string = toString(string);\n position = position == null\n ? 0\n : baseClamp(toInteger(position), 0, string.length);\n\n target = baseToString(target);\n return string.slice(position, position + target.length) == target;\n }\n\n /**\n * Creates a compiled template function that can interpolate data properties\n * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n * properties may be accessed as free variables in the template. If a setting\n * object is given, it takes precedence over `_.templateSettings` values.\n *\n * **Note:** In the development build `_.template` utilizes\n * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n * for easier debugging.\n *\n * For more information on precompiling templates see\n * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n *\n * For more information on Chrome extension sandboxes see\n * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category String\n * @param {string} [string=''] The template string.\n * @param {Object} [options={}] The options object.\n * @param {RegExp} [options.escape=_.templateSettings.escape]\n * The HTML \"escape\" delimiter.\n * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n * The \"evaluate\" delimiter.\n * @param {Object} [options.imports=_.templateSettings.imports]\n * An object to import into the template as free variables.\n * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n * The \"interpolate\" delimiter.\n * @param {string} [options.sourceURL='lodash.templateSources[n]']\n * The sourceURL of the compiled template.\n * @param {string} [options.variable='obj']\n * The data object variable name.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Function} Returns the compiled template function.\n * @example\n *\n * // Use the \"interpolate\" delimiter to create a compiled template.\n * var compiled = _.template('hello <%= user %>!');\n * compiled({ 'user': 'fred' });\n * // => 'hello fred!'\n *\n * // Use the HTML \"escape\" delimiter to escape data property values.\n * var compiled = _.template('<b><%- value %></b>');\n * compiled({ 'value': '<script>' });\n * // => '<b><script></b>'\n *\n * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n * compiled({ 'users': ['fred', 'barney'] });\n * // => '<li>fred</li><li>barney</li>'\n *\n * // Use the internal `print` function in \"evaluate\" delimiters.\n * var compiled = _.template('<% print(\"hello \" + user); %>!');\n * compiled({ 'user': 'barney' });\n * // => 'hello barney!'\n *\n * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n * // Disable support by replacing the \"interpolate\" delimiter.\n * var compiled = _.template('hello ${ user }!');\n * compiled({ 'user': 'pebbles' });\n * // => 'hello pebbles!'\n *\n * // Use backslashes to treat delimiters as plain text.\n * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n * compiled({ 'value': 'ignored' });\n * // => '<%- value %>'\n *\n * // Use the `imports` option to import `jQuery` as `jq`.\n * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n * compiled({ 'users': ['fred', 'barney'] });\n * // => '<li>fred</li><li>barney</li>'\n *\n * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n * compiled(data);\n * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n *\n * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n * compiled.source;\n * // => function(data) {\n * // var __t, __p = '';\n * // __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n * // return __p;\n * // }\n *\n * // Use custom template delimiters.\n * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n * var compiled = _.template('hello {{ user }}!');\n * compiled({ 'user': 'mustache' });\n * // => 'hello mustache!'\n *\n * // Use the `source` property to inline compiled templates for meaningful\n * // line numbers in error messages and stack traces.\n * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n * var JST = {\\\n * \"main\": ' + _.template(mainText).source + '\\\n * };\\\n * ');\n */\n function template(string, options, guard) {\n // Based on John Resig's `tmpl` implementation\n // (http://ejohn.org/blog/javascript-micro-templating/)\n // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n var settings = lodash.templateSettings;\n\n if (guard && isIterateeCall(string, options, guard)) {\n options = undefined;\n }\n string = toString(string);\n options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n importsKeys = keys(imports),\n importsValues = baseValues(imports, importsKeys);\n\n var isEscaping,\n isEvaluating,\n index = 0,\n interpolate = options.interpolate || reNoMatch,\n source = \"__p += '\";\n\n // Compile the regexp to match each delimiter.\n var reDelimiters = RegExp(\n (options.escape || reNoMatch).source + '|' +\n interpolate.source + '|' +\n (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n (options.evaluate || reNoMatch).source + '|$'\n , 'g');\n\n // Use a sourceURL for easier debugging.\n // The sourceURL gets injected into the source that's eval-ed, so be careful\n // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in\n // and escape the comment, thus injecting code that gets evaled.\n var sourceURL = '//# sourceURL=' +\n (hasOwnProperty.call(options, 'sourceURL')\n ? (options.sourceURL + '').replace(/\\s/g, ' ')\n : ('lodash.templateSources[' + (++templateCounter) + ']')\n ) + '\\n';\n\n string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n interpolateValue || (interpolateValue = esTemplateValue);\n\n // Escape characters that can't be included in string literals.\n source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n // Replace delimiters with snippets.\n if (escapeValue) {\n isEscaping = true;\n source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n }\n if (evaluateValue) {\n isEvaluating = true;\n source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n }\n if (interpolateValue) {\n source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n }\n index = offset + match.length;\n\n // The JS engine embedded in Adobe products needs `match` returned in\n // order to produce the correct `offset` value.\n return match;\n });\n\n source += \"';\\n\";\n\n // If `variable` is not specified wrap a with-statement around the generated\n // code to add the data object to the top of the scope chain.\n var variable = hasOwnProperty.call(options, 'variable') && options.variable;\n if (!variable) {\n source = 'with (obj) {\\n' + source + '\\n}\\n';\n }\n // Throw an error if a forbidden character was found in `variable`, to prevent\n // potential command injection attacks.\n else if (reForbiddenIdentifierChars.test(variable)) {\n throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);\n }\n\n // Cleanup code by stripping empty strings.\n source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n .replace(reEmptyStringMiddle, '$1')\n .replace(reEmptyStringTrailing, '$1;');\n\n // Frame code as the function body.\n source = 'function(' + (variable || 'obj') + ') {\\n' +\n (variable\n ? ''\n : 'obj || (obj = {});\\n'\n ) +\n \"var __t, __p = ''\" +\n (isEscaping\n ? ', __e = _.escape'\n : ''\n ) +\n (isEvaluating\n ? ', __j = Array.prototype.join;\\n' +\n \"function print() { __p += __j.call(arguments, '') }\\n\"\n : ';\\n'\n ) +\n source +\n 'return __p\\n}';\n\n var result = attempt(function() {\n return Function(importsKeys, sourceURL + 'return ' + source)\n .apply(undefined, importsValues);\n });\n\n // Provide the compiled function's source by its `toString` method or\n // the `source` property as a convenience for inlining compiled templates.\n result.source = source;\n if (isError(result)) {\n throw result;\n }\n return result;\n }\n\n /**\n * Converts `string`, as a whole, to lower case just like\n * [String#toLowerCase](https://mdn.io/toLowerCase).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the lower cased string.\n * @example\n *\n * _.toLower('--Foo-Bar--');\n * // => '--foo-bar--'\n *\n * _.toLower('fooBar');\n * // => 'foobar'\n *\n * _.toLower('__FOO_BAR__');\n * // => '__foo_bar__'\n */\n function toLower(value) {\n return toString(value).toLowerCase();\n }\n\n /**\n * Converts `string`, as a whole, to upper case just like\n * [String#toUpperCase](https://mdn.io/toUpperCase).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the upper cased string.\n * @example\n *\n * _.toUpper('--foo-bar--');\n * // => '--FOO-BAR--'\n *\n * _.toUpper('fooBar');\n * // => 'FOOBAR'\n *\n * _.toUpper('__foo_bar__');\n * // => '__FOO_BAR__'\n */\n function toUpper(value) {\n return toString(value).toUpperCase();\n }\n\n /**\n * Removes leading and trailing whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trim(' abc ');\n * // => 'abc'\n *\n * _.trim('-_-abc-_-', '_-');\n * // => 'abc'\n *\n * _.map([' foo ', ' bar '], _.trim);\n * // => ['foo', 'bar']\n */\n function trim(string, chars, guard) {\n string = toString(string);\n if (string && (guard || chars === undefined)) {\n return baseTrim(string);\n }\n if (!string || !(chars = baseToString(chars))) {\n return string;\n }\n var strSymbols = stringToArray(string),\n chrSymbols = stringToArray(chars),\n start = charsStartIndex(strSymbols, chrSymbols),\n end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n return castSlice(strSymbols, start, end).join('');\n }\n\n /**\n * Removes trailing whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trimEnd(' abc ');\n * // => ' abc'\n *\n * _.trimEnd('-_-abc-_-', '_-');\n * // => '-_-abc'\n */\n function trimEnd(string, chars, guard) {\n string = toString(string);\n if (string && (guard || chars === undefined)) {\n return string.slice(0, trimmedEndIndex(string) + 1);\n }\n if (!string || !(chars = baseToString(chars))) {\n return string;\n }\n var strSymbols = stringToArray(string),\n end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n return castSlice(strSymbols, 0, end).join('');\n }\n\n /**\n * Removes leading whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trimStart(' abc ');\n * // => 'abc '\n *\n * _.trimStart('-_-abc-_-', '_-');\n * // => 'abc-_-'\n */\n function trimStart(string, chars, guard) {\n string = toString(string);\n if (string && (guard || chars === undefined)) {\n return string.replace(reTrimStart, '');\n }\n if (!string || !(chars = baseToString(chars))) {\n return string;\n }\n var strSymbols = stringToArray(string),\n start = charsStartIndex(strSymbols, stringToArray(chars));\n\n return castSlice(strSymbols, start).join('');\n }\n\n /**\n * Truncates `string` if it's longer than the given maximum string length.\n * The last characters of the truncated string are replaced with the omission\n * string which defaults to \"...\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to truncate.\n * @param {Object} [options={}] The options object.\n * @param {number} [options.length=30] The maximum string length.\n * @param {string} [options.omission='...'] The string to indicate text is omitted.\n * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n * @returns {string} Returns the truncated string.\n * @example\n *\n * _.truncate('hi-diddly-ho there, neighborino');\n * // => 'hi-diddly-ho there, neighbo...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n * 'length': 24,\n * 'separator': ' '\n * });\n * // => 'hi-diddly-ho there,...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n * 'length': 24,\n * 'separator': /,? +/\n * });\n * // => 'hi-diddly-ho there...'\n *\n * _.truncate('hi-diddly-ho there, neighborino', {\n * 'omission': ' [...]'\n * });\n * // => 'hi-diddly-ho there, neig [...]'\n */\n function truncate(string, options) {\n var length = DEFAULT_TRUNC_LENGTH,\n omission = DEFAULT_TRUNC_OMISSION;\n\n if (isObject(options)) {\n var separator = 'separator' in options ? options.separator : separator;\n length = 'length' in options ? toInteger(options.length) : length;\n omission = 'omission' in options ? baseToString(options.omission) : omission;\n }\n string = toString(string);\n\n var strLength = string.length;\n if (hasUnicode(string)) {\n var strSymbols = stringToArray(string);\n strLength = strSymbols.length;\n }\n if (length >= strLength) {\n return string;\n }\n var end = length - stringSize(omission);\n if (end < 1) {\n return omission;\n }\n var result = strSymbols\n ? castSlice(strSymbols, 0, end).join('')\n : string.slice(0, end);\n\n if (separator === undefined) {\n return result + omission;\n }\n if (strSymbols) {\n end += (result.length - end);\n }\n if (isRegExp(separator)) {\n if (string.slice(end).search(separator)) {\n var match,\n substring = result;\n\n if (!separator.global) {\n separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n }\n separator.lastIndex = 0;\n while ((match = separator.exec(substring))) {\n var newEnd = match.index;\n }\n result = result.slice(0, newEnd === undefined ? end : newEnd);\n }\n } else if (string.indexOf(baseToString(separator), end) != end) {\n var index = result.lastIndexOf(separator);\n if (index > -1) {\n result = result.slice(0, index);\n }\n }\n return result + omission;\n }\n\n /**\n * The inverse of `_.escape`; this method converts the HTML entities\n * `&`, `<`, `>`, `"`, and `'` in `string` to\n * their corresponding characters.\n *\n * **Note:** No other HTML entities are unescaped. To unescape additional\n * HTML entities use a third-party library like [_he_](https://mths.be/he).\n *\n * @static\n * @memberOf _\n * @since 0.6.0\n * @category String\n * @param {string} [string=''] The string to unescape.\n * @returns {string} Returns the unescaped string.\n * @example\n *\n * _.unescape('fred, barney, & pebbles');\n * // => 'fred, barney, & pebbles'\n */\n function unescape(string) {\n string = toString(string);\n return (string && reHasEscapedHtml.test(string))\n ? string.replace(reEscapedHtml, unescapeHtmlChar)\n : string;\n }\n\n /**\n * Converts `string`, as space separated words, to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the upper cased string.\n * @example\n *\n * _.upperCase('--foo-bar');\n * // => 'FOO BAR'\n *\n * _.upperCase('fooBar');\n * // => 'FOO BAR'\n *\n * _.upperCase('__foo_bar__');\n * // => 'FOO BAR'\n */\n var upperCase = createCompounder(function(result, word, index) {\n return result + (index ? ' ' : '') + word.toUpperCase();\n });\n\n /**\n * Converts the first character of `string` to upper case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.upperFirst('fred');\n * // => 'Fred'\n *\n * _.upperFirst('FRED');\n * // => 'FRED'\n */\n var upperFirst = createCaseFirst('toUpperCase');\n\n /**\n * Splits `string` into an array of its words.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to inspect.\n * @param {RegExp|string} [pattern] The pattern to match words.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the words of `string`.\n * @example\n *\n * _.words('fred, barney, & pebbles');\n * // => ['fred', 'barney', 'pebbles']\n *\n * _.words('fred, barney, & pebbles', /[^, ]+/g);\n * // => ['fred', 'barney', '&', 'pebbles']\n */\n function words(string, pattern, guard) {\n string = toString(string);\n pattern = guard ? undefined : pattern;\n\n if (pattern === undefined) {\n return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n }\n return string.match(pattern) || [];\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Attempts to invoke `func`, returning either the result or the caught error\n * object. Any additional arguments are provided to `func` when it's invoked.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {Function} func The function to attempt.\n * @param {...*} [args] The arguments to invoke `func` with.\n * @returns {*} Returns the `func` result or error object.\n * @example\n *\n * // Avoid throwing errors for invalid selectors.\n * var elements = _.attempt(function(selector) {\n * return document.querySelectorAll(selector);\n * }, '>_>');\n *\n * if (_.isError(elements)) {\n * elements = [];\n * }\n */\n var attempt = baseRest(function(func, args) {\n try {\n return apply(func, undefined, args);\n } catch (e) {\n return isError(e) ? e : new Error(e);\n }\n });\n\n /**\n * Binds methods of an object to the object itself, overwriting the existing\n * method.\n *\n * **Note:** This method doesn't set the \"length\" property of bound functions.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {Object} object The object to bind and assign the bound methods to.\n * @param {...(string|string[])} methodNames The object method names to bind.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var view = {\n * 'label': 'docs',\n * 'click': function() {\n * console.log('clicked ' + this.label);\n * }\n * };\n *\n * _.bindAll(view, ['click']);\n * jQuery(element).on('click', view.click);\n * // => Logs 'clicked docs' when clicked.\n */\n var bindAll = flatRest(function(object, methodNames) {\n arrayEach(methodNames, function(key) {\n key = toKey(key);\n baseAssignValue(object, key, bind(object[key], object));\n });\n return object;\n });\n\n /**\n * Creates a function that iterates over `pairs` and invokes the corresponding\n * function of the first predicate to return truthy. The predicate-function\n * pairs are invoked with the `this` binding and arguments of the created\n * function.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {Array} pairs The predicate-function pairs.\n * @returns {Function} Returns the new composite function.\n * @example\n *\n * var func = _.cond([\n * [_.matches({ 'a': 1 }), _.constant('matches A')],\n * [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n * [_.stubTrue, _.constant('no match')]\n * ]);\n *\n * func({ 'a': 1, 'b': 2 });\n * // => 'matches A'\n *\n * func({ 'a': 0, 'b': 1 });\n * // => 'matches B'\n *\n * func({ 'a': '1', 'b': '2' });\n * // => 'no match'\n */\n function cond(pairs) {\n var length = pairs == null ? 0 : pairs.length,\n toIteratee = getIteratee();\n\n pairs = !length ? [] : arrayMap(pairs, function(pair) {\n if (typeof pair[1] != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return [toIteratee(pair[0]), pair[1]];\n });\n\n return baseRest(function(args) {\n var index = -1;\n while (++index < length) {\n var pair = pairs[index];\n if (apply(pair[0], this, args)) {\n return apply(pair[1], this, args);\n }\n }\n });\n }\n\n /**\n * Creates a function that invokes the predicate properties of `source` with\n * the corresponding property values of a given object, returning `true` if\n * all predicates return truthy, else `false`.\n *\n * **Note:** The created function is equivalent to `_.conformsTo` with\n * `source` partially applied.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {Object} source The object of property predicates to conform to.\n * @returns {Function} Returns the new spec function.\n * @example\n *\n * var objects = [\n * { 'a': 2, 'b': 1 },\n * { 'a': 1, 'b': 2 }\n * ];\n *\n * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n * // => [{ 'a': 1, 'b': 2 }]\n */\n function conforms(source) {\n return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n }\n\n /**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\n function constant(value) {\n return function() {\n return value;\n };\n }\n\n /**\n * Checks `value` to determine whether a default value should be returned in\n * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n * or `undefined`.\n *\n * @static\n * @memberOf _\n * @since 4.14.0\n * @category Util\n * @param {*} value The value to check.\n * @param {*} defaultValue The default value.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * _.defaultTo(1, 10);\n * // => 1\n *\n * _.defaultTo(undefined, 10);\n * // => 10\n */\n function defaultTo(value, defaultValue) {\n return (value == null || value !== value) ? defaultValue : value;\n }\n\n /**\n * Creates a function that returns the result of invoking the given functions\n * with the `this` binding of the created function, where each successive\n * invocation is supplied the return value of the previous.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {...(Function|Function[])} [funcs] The functions to invoke.\n * @returns {Function} Returns the new composite function.\n * @see _.flowRight\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var addSquare = _.flow([_.add, square]);\n * addSquare(1, 2);\n * // => 9\n */\n var flow = createFlow();\n\n /**\n * This method is like `_.flow` except that it creates a function that\n * invokes the given functions from right to left.\n *\n * @static\n * @since 3.0.0\n * @memberOf _\n * @category Util\n * @param {...(Function|Function[])} [funcs] The functions to invoke.\n * @returns {Function} Returns the new composite function.\n * @see _.flow\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var addSquare = _.flowRight([square, _.add]);\n * addSquare(1, 2);\n * // => 9\n */\n var flowRight = createFlow(true);\n\n /**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\n function identity(value) {\n return value;\n }\n\n /**\n * Creates a function that invokes `func` with the arguments of the created\n * function. If `func` is a property name, the created function returns the\n * property value for a given element. If `func` is an array or object, the\n * created function returns `true` for elements that contain the equivalent\n * source properties, otherwise it returns `false`.\n *\n * @static\n * @since 4.0.0\n * @memberOf _\n * @category Util\n * @param {*} [func=_.identity] The value to convert to a callback.\n * @returns {Function} Returns the callback.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, _.iteratee(['user', 'fred']));\n * // => [{ 'user': 'fred', 'age': 40 }]\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, _.iteratee('user'));\n * // => ['barney', 'fred']\n *\n * // Create custom iteratee shorthands.\n * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n * return !_.isRegExp(func) ? iteratee(func) : function(string) {\n * return func.test(string);\n * };\n * });\n *\n * _.filter(['abc', 'def'], /ef/);\n * // => ['def']\n */\n function iteratee(func) {\n return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n }\n\n /**\n * Creates a function that performs a partial deep comparison between a given\n * object and `source`, returning `true` if the given object has equivalent\n * property values, else `false`.\n *\n * **Note:** The created function is equivalent to `_.isMatch` with `source`\n * partially applied.\n *\n * Partial comparisons will match empty array and empty object `source`\n * values against any array or object value, respectively. See `_.isEqual`\n * for a list of supported value comparisons.\n *\n * **Note:** Multiple values can be checked by combining several matchers\n * using `_.overSome`\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n * @example\n *\n * var objects = [\n * { 'a': 1, 'b': 2, 'c': 3 },\n * { 'a': 4, 'b': 5, 'c': 6 }\n * ];\n *\n * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n *\n * // Checking for several possible values\n * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));\n * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n */\n function matches(source) {\n return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n }\n\n /**\n * Creates a function that performs a partial deep comparison between the\n * value at `path` of a given object to `srcValue`, returning `true` if the\n * object value is equivalent, else `false`.\n *\n * **Note:** Partial comparisons will match empty array and empty object\n * `srcValue` values against any array or object value, respectively. See\n * `_.isEqual` for a list of supported value comparisons.\n *\n * **Note:** Multiple values can be checked by combining several matchers\n * using `_.overSome`\n *\n * @static\n * @memberOf _\n * @since 3.2.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n * @example\n *\n * var objects = [\n * { 'a': 1, 'b': 2, 'c': 3 },\n * { 'a': 4, 'b': 5, 'c': 6 }\n * ];\n *\n * _.find(objects, _.matchesProperty('a', 4));\n * // => { 'a': 4, 'b': 5, 'c': 6 }\n *\n * // Checking for several possible values\n * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));\n * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n */\n function matchesProperty(path, srcValue) {\n return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n }\n\n /**\n * Creates a function that invokes the method at `path` of a given object.\n * Any additional arguments are provided to the invoked method.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Util\n * @param {Array|string} path The path of the method to invoke.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {Function} Returns the new invoker function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': _.constant(2) } },\n * { 'a': { 'b': _.constant(1) } }\n * ];\n *\n * _.map(objects, _.method('a.b'));\n * // => [2, 1]\n *\n * _.map(objects, _.method(['a', 'b']));\n * // => [2, 1]\n */\n var method = baseRest(function(path, args) {\n return function(object) {\n return baseInvoke(object, path, args);\n };\n });\n\n /**\n * The opposite of `_.method`; this method creates a function that invokes\n * the method at a given path of `object`. Any additional arguments are\n * provided to the invoked method.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Util\n * @param {Object} object The object to query.\n * @param {...*} [args] The arguments to invoke the method with.\n * @returns {Function} Returns the new invoker function.\n * @example\n *\n * var array = _.times(3, _.constant),\n * object = { 'a': array, 'b': array, 'c': array };\n *\n * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n * // => [2, 0]\n *\n * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n * // => [2, 0]\n */\n var methodOf = baseRest(function(object, args) {\n return function(path) {\n return baseInvoke(object, path, args);\n };\n });\n\n /**\n * Adds all own enumerable string keyed function properties of a source\n * object to the destination object. If `object` is a function, then methods\n * are added to its prototype as well.\n *\n * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n * avoid conflicts caused by modifying the original.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {Function|Object} [object=lodash] The destination object.\n * @param {Object} source The object of functions to add.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n * @returns {Function|Object} Returns `object`.\n * @example\n *\n * function vowels(string) {\n * return _.filter(string, function(v) {\n * return /[aeiou]/i.test(v);\n * });\n * }\n *\n * _.mixin({ 'vowels': vowels });\n * _.vowels('fred');\n * // => ['e']\n *\n * _('fred').vowels().value();\n * // => ['e']\n *\n * _.mixin({ 'vowels': vowels }, { 'chain': false });\n * _('fred').vowels();\n * // => ['e']\n */\n function mixin(object, source, options) {\n var props = keys(source),\n methodNames = baseFunctions(source, props);\n\n if (options == null &&\n !(isObject(source) && (methodNames.length || !props.length))) {\n options = source;\n source = object;\n object = this;\n methodNames = baseFunctions(source, keys(source));\n }\n var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n isFunc = isFunction(object);\n\n arrayEach(methodNames, function(methodName) {\n var func = source[methodName];\n object[methodName] = func;\n if (isFunc) {\n object.prototype[methodName] = function() {\n var chainAll = this.__chain__;\n if (chain || chainAll) {\n var result = object(this.__wrapped__),\n actions = result.__actions__ = copyArray(this.__actions__);\n\n actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n result.__chain__ = chainAll;\n return result;\n }\n return func.apply(object, arrayPush([this.value()], arguments));\n };\n }\n });\n\n return object;\n }\n\n /**\n * Reverts the `_` variable to its previous value and returns a reference to\n * the `lodash` function.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @returns {Function} Returns the `lodash` function.\n * @example\n *\n * var lodash = _.noConflict();\n */\n function noConflict() {\n if (root._ === this) {\n root._ = oldDash;\n }\n return this;\n }\n\n /**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\n function noop() {\n // No operation performed.\n }\n\n /**\n * Creates a function that gets the argument at index `n`. If `n` is negative,\n * the nth argument from the end is returned.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {number} [n=0] The index of the argument to return.\n * @returns {Function} Returns the new pass-thru function.\n * @example\n *\n * var func = _.nthArg(1);\n * func('a', 'b', 'c', 'd');\n * // => 'b'\n *\n * var func = _.nthArg(-2);\n * func('a', 'b', 'c', 'd');\n * // => 'c'\n */\n function nthArg(n) {\n n = toInteger(n);\n return baseRest(function(args) {\n return baseNth(args, n);\n });\n }\n\n /**\n * Creates a function that invokes `iteratees` with the arguments it receives\n * and returns their results.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to invoke.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var func = _.over([Math.max, Math.min]);\n *\n * func(1, 2, 3, 4);\n * // => [4, 1]\n */\n var over = createOver(arrayMap);\n\n /**\n * Creates a function that checks if **all** of the `predicates` return\n * truthy when invoked with the arguments it receives.\n *\n * Following shorthands are possible for providing predicates.\n * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {...(Function|Function[])} [predicates=[_.identity]]\n * The predicates to check.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var func = _.overEvery([Boolean, isFinite]);\n *\n * func('1');\n * // => true\n *\n * func(null);\n * // => false\n *\n * func(NaN);\n * // => false\n */\n var overEvery = createOver(arrayEvery);\n\n /**\n * Creates a function that checks if **any** of the `predicates` return\n * truthy when invoked with the arguments it receives.\n *\n * Following shorthands are possible for providing predicates.\n * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {...(Function|Function[])} [predicates=[_.identity]]\n * The predicates to check.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var func = _.overSome([Boolean, isFinite]);\n *\n * func('1');\n * // => true\n *\n * func(null);\n * // => true\n *\n * func(NaN);\n * // => false\n *\n * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])\n * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])\n */\n var overSome = createOver(arraySome);\n\n /**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\n function property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n }\n\n /**\n * The opposite of `_.property`; this method creates a function that returns\n * the value at a given path of `object`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Util\n * @param {Object} object The object to query.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var array = [0, 1, 2],\n * object = { 'a': array, 'b': array, 'c': array };\n *\n * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n * // => [2, 0]\n *\n * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n * // => [2, 0]\n */\n function propertyOf(object) {\n return function(path) {\n return object == null ? undefined : baseGet(object, path);\n };\n }\n\n /**\n * Creates an array of numbers (positive and/or negative) progressing from\n * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n * `start` is specified without an `end` or `step`. If `end` is not specified,\n * it's set to `start` with `start` then set to `0`.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @param {number} [step=1] The value to increment or decrement by.\n * @returns {Array} Returns the range of numbers.\n * @see _.inRange, _.rangeRight\n * @example\n *\n * _.range(4);\n * // => [0, 1, 2, 3]\n *\n * _.range(-4);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 5);\n * // => [1, 2, 3, 4]\n *\n * _.range(0, 20, 5);\n * // => [0, 5, 10, 15]\n *\n * _.range(0, -4, -1);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 4, 0);\n * // => [1, 1, 1]\n *\n * _.range(0);\n * // => []\n */\n var range = createRange();\n\n /**\n * This method is like `_.range` except that it populates values in\n * descending order.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @param {number} [step=1] The value to increment or decrement by.\n * @returns {Array} Returns the range of numbers.\n * @see _.inRange, _.range\n * @example\n *\n * _.rangeRight(4);\n * // => [3, 2, 1, 0]\n *\n * _.rangeRight(-4);\n * // => [-3, -2, -1, 0]\n *\n * _.rangeRight(1, 5);\n * // => [4, 3, 2, 1]\n *\n * _.rangeRight(0, 20, 5);\n * // => [15, 10, 5, 0]\n *\n * _.rangeRight(0, -4, -1);\n * // => [-3, -2, -1, 0]\n *\n * _.rangeRight(1, 4, 0);\n * // => [1, 1, 1]\n *\n * _.rangeRight(0);\n * // => []\n */\n var rangeRight = createRange(true);\n\n /**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\n function stubArray() {\n return [];\n }\n\n /**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\n function stubFalse() {\n return false;\n }\n\n /**\n * This method returns a new empty object.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Object} Returns the new empty object.\n * @example\n *\n * var objects = _.times(2, _.stubObject);\n *\n * console.log(objects);\n * // => [{}, {}]\n *\n * console.log(objects[0] === objects[1]);\n * // => false\n */\n function stubObject() {\n return {};\n }\n\n /**\n * This method returns an empty string.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {string} Returns the empty string.\n * @example\n *\n * _.times(2, _.stubString);\n * // => ['', '']\n */\n function stubString() {\n return '';\n }\n\n /**\n * This method returns `true`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `true`.\n * @example\n *\n * _.times(2, _.stubTrue);\n * // => [true, true]\n */\n function stubTrue() {\n return true;\n }\n\n /**\n * Invokes the iteratee `n` times, returning an array of the results of\n * each invocation. The iteratee is invoked with one argument; (index).\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n * @example\n *\n * _.times(3, String);\n * // => ['0', '1', '2']\n *\n * _.times(4, _.constant(0));\n * // => [0, 0, 0, 0]\n */\n function times(n, iteratee) {\n n = toInteger(n);\n if (n < 1 || n > MAX_SAFE_INTEGER) {\n return [];\n }\n var index = MAX_ARRAY_LENGTH,\n length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n iteratee = getIteratee(iteratee);\n n -= MAX_ARRAY_LENGTH;\n\n var result = baseTimes(length, iteratee);\n while (++index < n) {\n iteratee(index);\n }\n return result;\n }\n\n /**\n * Converts `value` to a property path array.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Util\n * @param {*} value The value to convert.\n * @returns {Array} Returns the new property path array.\n * @example\n *\n * _.toPath('a.b.c');\n * // => ['a', 'b', 'c']\n *\n * _.toPath('a[0].b.c');\n * // => ['a', '0', 'b', 'c']\n */\n function toPath(value) {\n if (isArray(value)) {\n return arrayMap(value, toKey);\n }\n return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n }\n\n /**\n * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {string} [prefix=''] The value to prefix the ID with.\n * @returns {string} Returns the unique ID.\n * @example\n *\n * _.uniqueId('contact_');\n * // => 'contact_104'\n *\n * _.uniqueId();\n * // => '105'\n */\n function uniqueId(prefix) {\n var id = ++idCounter;\n return toString(prefix) + id;\n }\n\n /*------------------------------------------------------------------------*/\n\n /**\n * Adds two numbers.\n *\n * @static\n * @memberOf _\n * @since 3.4.0\n * @category Math\n * @param {number} augend The first number in an addition.\n * @param {number} addend The second number in an addition.\n * @returns {number} Returns the total.\n * @example\n *\n * _.add(6, 4);\n * // => 10\n */\n var add = createMathOperation(function(augend, addend) {\n return augend + addend;\n }, 0);\n\n /**\n * Computes `number` rounded up to `precision`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Math\n * @param {number} number The number to round up.\n * @param {number} [precision=0] The precision to round up to.\n * @returns {number} Returns the rounded up number.\n * @example\n *\n * _.ceil(4.006);\n * // => 5\n *\n * _.ceil(6.004, 2);\n * // => 6.01\n *\n * _.ceil(6040, -2);\n * // => 6100\n */\n var ceil = createRound('ceil');\n\n /**\n * Divide two numbers.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Math\n * @param {number} dividend The first number in a division.\n * @param {number} divisor The second number in a division.\n * @returns {number} Returns the quotient.\n * @example\n *\n * _.divide(6, 4);\n * // => 1.5\n */\n var divide = createMathOperation(function(dividend, divisor) {\n return dividend / divisor;\n }, 1);\n\n /**\n * Computes `number` rounded down to `precision`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Math\n * @param {number} number The number to round down.\n * @param {number} [precision=0] The precision to round down to.\n * @returns {number} Returns the rounded down number.\n * @example\n *\n * _.floor(4.006);\n * // => 4\n *\n * _.floor(0.046, 2);\n * // => 0.04\n *\n * _.floor(4060, -2);\n * // => 4000\n */\n var floor = createRound('floor');\n\n /**\n * Computes the maximum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * _.max([4, 2, 8, 6]);\n * // => 8\n *\n * _.max([]);\n * // => undefined\n */\n function max(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseGt)\n : undefined;\n }\n\n /**\n * This method is like `_.max` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * the value is ranked. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * var objects = [{ 'n': 1 }, { 'n': 2 }];\n *\n * _.maxBy(objects, function(o) { return o.n; });\n * // => { 'n': 2 }\n *\n * // The `_.property` iteratee shorthand.\n * _.maxBy(objects, 'n');\n * // => { 'n': 2 }\n */\n function maxBy(array, iteratee) {\n return (array && array.length)\n ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)\n : undefined;\n }\n\n /**\n * Computes the mean of the values in `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {number} Returns the mean.\n * @example\n *\n * _.mean([4, 2, 8, 6]);\n * // => 5\n */\n function mean(array) {\n return baseMean(array, identity);\n }\n\n /**\n * This method is like `_.mean` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the value to be averaged.\n * The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the mean.\n * @example\n *\n * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n *\n * _.meanBy(objects, function(o) { return o.n; });\n * // => 5\n *\n * // The `_.property` iteratee shorthand.\n * _.meanBy(objects, 'n');\n * // => 5\n */\n function meanBy(array, iteratee) {\n return baseMean(array, getIteratee(iteratee, 2));\n }\n\n /**\n * Computes the minimum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * _.min([]);\n * // => undefined\n */\n function min(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseLt)\n : undefined;\n }\n\n /**\n * This method is like `_.min` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * the value is ranked. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * var objects = [{ 'n': 1 }, { 'n': 2 }];\n *\n * _.minBy(objects, function(o) { return o.n; });\n * // => { 'n': 1 }\n *\n * // The `_.property` iteratee shorthand.\n * _.minBy(objects, 'n');\n * // => { 'n': 1 }\n */\n function minBy(array, iteratee) {\n return (array && array.length)\n ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)\n : undefined;\n }\n\n /**\n * Multiply two numbers.\n *\n * @static\n * @memberOf _\n * @since 4.7.0\n * @category Math\n * @param {number} multiplier The first number in a multiplication.\n * @param {number} multiplicand The second number in a multiplication.\n * @returns {number} Returns the product.\n * @example\n *\n * _.multiply(6, 4);\n * // => 24\n */\n var multiply = createMathOperation(function(multiplier, multiplicand) {\n return multiplier * multiplicand;\n }, 1);\n\n /**\n * Computes `number` rounded to `precision`.\n *\n * @static\n * @memberOf _\n * @since 3.10.0\n * @category Math\n * @param {number} number The number to round.\n * @param {number} [precision=0] The precision to round to.\n * @returns {number} Returns the rounded number.\n * @example\n *\n * _.round(4.006);\n * // => 4\n *\n * _.round(4.006, 2);\n * // => 4.01\n *\n * _.round(4060, -2);\n * // => 4100\n */\n var round = createRound('round');\n\n /**\n * Subtract two numbers.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {number} minuend The first number in a subtraction.\n * @param {number} subtrahend The second number in a subtraction.\n * @returns {number} Returns the difference.\n * @example\n *\n * _.subtract(6, 4);\n * // => 2\n */\n var subtract = createMathOperation(function(minuend, subtrahend) {\n return minuend - subtrahend;\n }, 0);\n\n /**\n * Computes the sum of the values in `array`.\n *\n * @static\n * @memberOf _\n * @since 3.4.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {number} Returns the sum.\n * @example\n *\n * _.sum([4, 2, 8, 6]);\n * // => 20\n */\n function sum(array) {\n return (array && array.length)\n ? baseSum(array, identity)\n : 0;\n }\n\n /**\n * This method is like `_.sum` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the value to be summed.\n * The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the sum.\n * @example\n *\n * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n *\n * _.sumBy(objects, function(o) { return o.n; });\n * // => 20\n *\n * // The `_.property` iteratee shorthand.\n * _.sumBy(objects, 'n');\n * // => 20\n */\n function sumBy(array, iteratee) {\n return (array && array.length)\n ? baseSum(array, getIteratee(iteratee, 2))\n : 0;\n }\n\n /*------------------------------------------------------------------------*/\n\n // Add methods that return wrapped values in chain sequences.\n lodash.after = after;\n lodash.ary = ary;\n lodash.assign = assign;\n lodash.assignIn = assignIn;\n lodash.assignInWith = assignInWith;\n lodash.assignWith = assignWith;\n lodash.at = at;\n lodash.before = before;\n lodash.bind = bind;\n lodash.bindAll = bindAll;\n lodash.bindKey = bindKey;\n lodash.castArray = castArray;\n lodash.chain = chain;\n lodash.chunk = chunk;\n lodash.compact = compact;\n lodash.concat = concat;\n lodash.cond = cond;\n lodash.conforms = conforms;\n lodash.constant = constant;\n lodash.countBy = countBy;\n lodash.create = create;\n lodash.curry = curry;\n lodash.curryRight = curryRight;\n lodash.debounce = debounce;\n lodash.defaults = defaults;\n lodash.defaultsDeep = defaultsDeep;\n lodash.defer = defer;\n lodash.delay = delay;\n lodash.difference = difference;\n lodash.differenceBy = differenceBy;\n lodash.differenceWith = differenceWith;\n lodash.drop = drop;\n lodash.dropRight = dropRight;\n lodash.dropRightWhile = dropRightWhile;\n lodash.dropWhile = dropWhile;\n lodash.fill = fill;\n lodash.filter = filter;\n lodash.flatMap = flatMap;\n lodash.flatMapDeep = flatMapDeep;\n lodash.flatMapDepth = flatMapDepth;\n lodash.flatten = flatten;\n lodash.flattenDeep = flattenDeep;\n lodash.flattenDepth = flattenDepth;\n lodash.flip = flip;\n lodash.flow = flow;\n lodash.flowRight = flowRight;\n lodash.fromPairs = fromPairs;\n lodash.functions = functions;\n lodash.functionsIn = functionsIn;\n lodash.groupBy = groupBy;\n lodash.initial = initial;\n lodash.intersection = intersection;\n lodash.intersectionBy = intersectionBy;\n lodash.intersectionWith = intersectionWith;\n lodash.invert = invert;\n lodash.invertBy = invertBy;\n lodash.invokeMap = invokeMap;\n lodash.iteratee = iteratee;\n lodash.keyBy = keyBy;\n lodash.keys = keys;\n lodash.keysIn = keysIn;\n lodash.map = map;\n lodash.mapKeys = mapKeys;\n lodash.mapValues = mapValues;\n lodash.matches = matches;\n lodash.matchesProperty = matchesProperty;\n lodash.memoize = memoize;\n lodash.merge = merge;\n lodash.mergeWith = mergeWith;\n lodash.method = method;\n lodash.methodOf = methodOf;\n lodash.mixin = mixin;\n lodash.negate = negate;\n lodash.nthArg = nthArg;\n lodash.omit = omit;\n lodash.omitBy = omitBy;\n lodash.once = once;\n lodash.orderBy = orderBy;\n lodash.over = over;\n lodash.overArgs = overArgs;\n lodash.overEvery = overEvery;\n lodash.overSome = overSome;\n lodash.partial = partial;\n lodash.partialRight = partialRight;\n lodash.partition = partition;\n lodash.pick = pick;\n lodash.pickBy = pickBy;\n lodash.property = property;\n lodash.propertyOf = propertyOf;\n lodash.pull = pull;\n lodash.pullAll = pullAll;\n lodash.pullAllBy = pullAllBy;\n lodash.pullAllWith = pullAllWith;\n lodash.pullAt = pullAt;\n lodash.range = range;\n lodash.rangeRight = rangeRight;\n lodash.rearg = rearg;\n lodash.reject = reject;\n lodash.remove = remove;\n lodash.rest = rest;\n lodash.reverse = reverse;\n lodash.sampleSize = sampleSize;\n lodash.set = set;\n lodash.setWith = setWith;\n lodash.shuffle = shuffle;\n lodash.slice = slice;\n lodash.sortBy = sortBy;\n lodash.sortedUniq = sortedUniq;\n lodash.sortedUniqBy = sortedUniqBy;\n lodash.split = split;\n lodash.spread = spread;\n lodash.tail = tail;\n lodash.take = take;\n lodash.takeRight = takeRight;\n lodash.takeRightWhile = takeRightWhile;\n lodash.takeWhile = takeWhile;\n lodash.tap = tap;\n lodash.throttle = throttle;\n lodash.thru = thru;\n lodash.toArray = toArray;\n lodash.toPairs = toPairs;\n lodash.toPairsIn = toPairsIn;\n lodash.toPath = toPath;\n lodash.toPlainObject = toPlainObject;\n lodash.transform = transform;\n lodash.unary = unary;\n lodash.union = union;\n lodash.unionBy = unionBy;\n lodash.unionWith = unionWith;\n lodash.uniq = uniq;\n lodash.uniqBy = uniqBy;\n lodash.uniqWith = uniqWith;\n lodash.unset = unset;\n lodash.unzip = unzip;\n lodash.unzipWith = unzipWith;\n lodash.update = update;\n lodash.updateWith = updateWith;\n lodash.values = values;\n lodash.valuesIn = valuesIn;\n lodash.without = without;\n lodash.words = words;\n lodash.wrap = wrap;\n lodash.xor = xor;\n lodash.xorBy = xorBy;\n lodash.xorWith = xorWith;\n lodash.zip = zip;\n lodash.zipObject = zipObject;\n lodash.zipObjectDeep = zipObjectDeep;\n lodash.zipWith = zipWith;\n\n // Add aliases.\n lodash.entries = toPairs;\n lodash.entriesIn = toPairsIn;\n lodash.extend = assignIn;\n lodash.extendWith = assignInWith;\n\n // Add methods to `lodash.prototype`.\n mixin(lodash, lodash);\n\n /*------------------------------------------------------------------------*/\n\n // Add methods that return unwrapped values in chain sequences.\n lodash.add = add;\n lodash.attempt = attempt;\n lodash.camelCase = camelCase;\n lodash.capitalize = capitalize;\n lodash.ceil = ceil;\n lodash.clamp = clamp;\n lodash.clone = clone;\n lodash.cloneDeep = cloneDeep;\n lodash.cloneDeepWith = cloneDeepWith;\n lodash.cloneWith = cloneWith;\n lodash.conformsTo = conformsTo;\n lodash.deburr = deburr;\n lodash.defaultTo = defaultTo;\n lodash.divide = divide;\n lodash.endsWith = endsWith;\n lodash.eq = eq;\n lodash.escape = escape;\n lodash.escapeRegExp = escapeRegExp;\n lodash.every = every;\n lodash.find = find;\n lodash.findIndex = findIndex;\n lodash.findKey = findKey;\n lodash.findLast = findLast;\n lodash.findLastIndex = findLastIndex;\n lodash.findLastKey = findLastKey;\n lodash.floor = floor;\n lodash.forEach = forEach;\n lodash.forEachRight = forEachRight;\n lodash.forIn = forIn;\n lodash.forInRight = forInRight;\n lodash.forOwn = forOwn;\n lodash.forOwnRight = forOwnRight;\n lodash.get = get;\n lodash.gt = gt;\n lodash.gte = gte;\n lodash.has = has;\n lodash.hasIn = hasIn;\n lodash.head = head;\n lodash.identity = identity;\n lodash.includes = includes;\n lodash.indexOf = indexOf;\n lodash.inRange = inRange;\n lodash.invoke = invoke;\n lodash.isArguments = isArguments;\n lodash.isArray = isArray;\n lodash.isArrayBuffer = isArrayBuffer;\n lodash.isArrayLike = isArrayLike;\n lodash.isArrayLikeObject = isArrayLikeObject;\n lodash.isBoolean = isBoolean;\n lodash.isBuffer = isBuffer;\n lodash.isDate = isDate;\n lodash.isElement = isElement;\n lodash.isEmpty = isEmpty;\n lodash.isEqual = isEqual;\n lodash.isEqualWith = isEqualWith;\n lodash.isError = isError;\n lodash.isFinite = isFinite;\n lodash.isFunction = isFunction;\n lodash.isInteger = isInteger;\n lodash.isLength = isLength;\n lodash.isMap = isMap;\n lodash.isMatch = isMatch;\n lodash.isMatchWith = isMatchWith;\n lodash.isNaN = isNaN;\n lodash.isNative = isNative;\n lodash.isNil = isNil;\n lodash.isNull = isNull;\n lodash.isNumber = isNumber;\n lodash.isObject = isObject;\n lodash.isObjectLike = isObjectLike;\n lodash.isPlainObject = isPlainObject;\n lodash.isRegExp = isRegExp;\n lodash.isSafeInteger = isSafeInteger;\n lodash.isSet = isSet;\n lodash.isString = isString;\n lodash.isSymbol = isSymbol;\n lodash.isTypedArray = isTypedArray;\n lodash.isUndefined = isUndefined;\n lodash.isWeakMap = isWeakMap;\n lodash.isWeakSet = isWeakSet;\n lodash.join = join;\n lodash.kebabCase = kebabCase;\n lodash.last = last;\n lodash.lastIndexOf = lastIndexOf;\n lodash.lowerCase = lowerCase;\n lodash.lowerFirst = lowerFirst;\n lodash.lt = lt;\n lodash.lte = lte;\n lodash.max = max;\n lodash.maxBy = maxBy;\n lodash.mean = mean;\n lodash.meanBy = meanBy;\n lodash.min = min;\n lodash.minBy = minBy;\n lodash.stubArray = stubArray;\n lodash.stubFalse = stubFalse;\n lodash.stubObject = stubObject;\n lodash.stubString = stubString;\n lodash.stubTrue = stubTrue;\n lodash.multiply = multiply;\n lodash.nth = nth;\n lodash.noConflict = noConflict;\n lodash.noop = noop;\n lodash.now = now;\n lodash.pad = pad;\n lodash.padEnd = padEnd;\n lodash.padStart = padStart;\n lodash.parseInt = parseInt;\n lodash.random = random;\n lodash.reduce = reduce;\n lodash.reduceRight = reduceRight;\n lodash.repeat = repeat;\n lodash.replace = replace;\n lodash.result = result;\n lodash.round = round;\n lodash.runInContext = runInContext;\n lodash.sample = sample;\n lodash.size = size;\n lodash.snakeCase = snakeCase;\n lodash.some = some;\n lodash.sortedIndex = sortedIndex;\n lodash.sortedIndexBy = sortedIndexBy;\n lodash.sortedIndexOf = sortedIndexOf;\n lodash.sortedLastIndex = sortedLastIndex;\n lodash.sortedLastIndexBy = sortedLastIndexBy;\n lodash.sortedLastIndexOf = sortedLastIndexOf;\n lodash.startCase = startCase;\n lodash.startsWith = startsWith;\n lodash.subtract = subtract;\n lodash.sum = sum;\n lodash.sumBy = sumBy;\n lodash.template = template;\n lodash.times = times;\n lodash.toFinite = toFinite;\n lodash.toInteger = toInteger;\n lodash.toLength = toLength;\n lodash.toLower = toLower;\n lodash.toNumber = toNumber;\n lodash.toSafeInteger = toSafeInteger;\n lodash.toString = toString;\n lodash.toUpper = toUpper;\n lodash.trim = trim;\n lodash.trimEnd = trimEnd;\n lodash.trimStart = trimStart;\n lodash.truncate = truncate;\n lodash.unescape = unescape;\n lodash.uniqueId = uniqueId;\n lodash.upperCase = upperCase;\n lodash.upperFirst = upperFirst;\n\n // Add aliases.\n lodash.each = forEach;\n lodash.eachRight = forEachRight;\n lodash.first = head;\n\n mixin(lodash, (function() {\n var source = {};\n baseForOwn(lodash, function(func, methodName) {\n if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n source[methodName] = func;\n }\n });\n return source;\n }()), { 'chain': false });\n\n /*------------------------------------------------------------------------*/\n\n /**\n * The semantic version number.\n *\n * @static\n * @memberOf _\n * @type {string}\n */\n lodash.VERSION = VERSION;\n\n // Assign default placeholders.\n arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n lodash[methodName].placeholder = lodash;\n });\n\n // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n arrayEach(['drop', 'take'], function(methodName, index) {\n LazyWrapper.prototype[methodName] = function(n) {\n n = n === undefined ? 1 : nativeMax(toInteger(n), 0);\n\n var result = (this.__filtered__ && !index)\n ? new LazyWrapper(this)\n : this.clone();\n\n if (result.__filtered__) {\n result.__takeCount__ = nativeMin(n, result.__takeCount__);\n } else {\n result.__views__.push({\n 'size': nativeMin(n, MAX_ARRAY_LENGTH),\n 'type': methodName + (result.__dir__ < 0 ? 'Right' : '')\n });\n }\n return result;\n };\n\n LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n return this.reverse()[methodName](n).reverse();\n };\n });\n\n // Add `LazyWrapper` methods that accept an `iteratee` value.\n arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n var type = index + 1,\n isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;\n\n LazyWrapper.prototype[methodName] = function(iteratee) {\n var result = this.clone();\n result.__iteratees__.push({\n 'iteratee': getIteratee(iteratee, 3),\n 'type': type\n });\n result.__filtered__ = result.__filtered__ || isFilter;\n return result;\n };\n });\n\n // Add `LazyWrapper` methods for `_.head` and `_.last`.\n arrayEach(['head', 'last'], function(methodName, index) {\n var takeName = 'take' + (index ? 'Right' : '');\n\n LazyWrapper.prototype[methodName] = function() {\n return this[takeName](1).value()[0];\n };\n });\n\n // Add `LazyWrapper` methods for `_.initial` and `_.tail`.\n arrayEach(['initial', 'tail'], function(methodName, index) {\n var dropName = 'drop' + (index ? '' : 'Right');\n\n LazyWrapper.prototype[methodName] = function() {\n return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n };\n });\n\n LazyWrapper.prototype.compact = function() {\n return this.filter(identity);\n };\n\n LazyWrapper.prototype.find = function(predicate) {\n return this.filter(predicate).head();\n };\n\n LazyWrapper.prototype.findLast = function(predicate) {\n return this.reverse().find(predicate);\n };\n\n LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {\n if (typeof path == 'function') {\n return new LazyWrapper(this);\n }\n return this.map(function(value) {\n return baseInvoke(value, path, args);\n });\n });\n\n LazyWrapper.prototype.reject = function(predicate) {\n return this.filter(negate(getIteratee(predicate)));\n };\n\n LazyWrapper.prototype.slice = function(start, end) {\n start = toInteger(start);\n\n var result = this;\n if (result.__filtered__ && (start > 0 || end < 0)) {\n return new LazyWrapper(result);\n }\n if (start < 0) {\n result = result.takeRight(-start);\n } else if (start) {\n result = result.drop(start);\n }\n if (end !== undefined) {\n end = toInteger(end);\n result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n }\n return result;\n };\n\n LazyWrapper.prototype.takeRightWhile = function(predicate) {\n return this.reverse().takeWhile(predicate).reverse();\n };\n\n LazyWrapper.prototype.toArray = function() {\n return this.take(MAX_ARRAY_LENGTH);\n };\n\n // Add `LazyWrapper` methods to `lodash.prototype`.\n baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),\n isTaker = /^(?:head|last)$/.test(methodName),\n lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],\n retUnwrapped = isTaker || /^find/.test(methodName);\n\n if (!lodashFunc) {\n return;\n }\n lodash.prototype[methodName] = function() {\n var value = this.__wrapped__,\n args = isTaker ? [1] : arguments,\n isLazy = value instanceof LazyWrapper,\n iteratee = args[0],\n useLazy = isLazy || isArray(value);\n\n var interceptor = function(value) {\n var result = lodashFunc.apply(lodash, arrayPush([value], args));\n return (isTaker && chainAll) ? result[0] : result;\n };\n\n if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n isLazy = useLazy = false;\n }\n var chainAll = this.__chain__,\n isHybrid = !!this.__actions__.length,\n isUnwrapped = retUnwrapped && !chainAll,\n onlyLazy = isLazy && !isHybrid;\n\n if (!retUnwrapped && useLazy) {\n value = onlyLazy ? value : new LazyWrapper(this);\n var result = func.apply(value, args);\n result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n return new LodashWrapper(result, chainAll);\n }\n if (isUnwrapped && onlyLazy) {\n return func.apply(this, args);\n }\n result = this.thru(interceptor);\n return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;\n };\n });\n\n // Add `Array` methods to `lodash.prototype`.\n arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n var func = arrayProto[methodName],\n chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n retUnwrapped = /^(?:pop|shift)$/.test(methodName);\n\n lodash.prototype[methodName] = function() {\n var args = arguments;\n if (retUnwrapped && !this.__chain__) {\n var value = this.value();\n return func.apply(isArray(value) ? value : [], args);\n }\n return this[chainName](function(value) {\n return func.apply(isArray(value) ? value : [], args);\n });\n };\n });\n\n // Map minified method names to their real names.\n baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n var lodashFunc = lodash[methodName];\n if (lodashFunc) {\n var key = lodashFunc.name + '';\n if (!hasOwnProperty.call(realNames, key)) {\n realNames[key] = [];\n }\n realNames[key].push({ 'name': methodName, 'func': lodashFunc });\n }\n });\n\n realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{\n 'name': 'wrapper',\n 'func': undefined\n }];\n\n // Add methods to `LazyWrapper`.\n LazyWrapper.prototype.clone = lazyClone;\n LazyWrapper.prototype.reverse = lazyReverse;\n LazyWrapper.prototype.value = lazyValue;\n\n // Add chain sequence methods to the `lodash` wrapper.\n lodash.prototype.at = wrapperAt;\n lodash.prototype.chain = wrapperChain;\n lodash.prototype.commit = wrapperCommit;\n lodash.prototype.next = wrapperNext;\n lodash.prototype.plant = wrapperPlant;\n lodash.prototype.reverse = wrapperReverse;\n lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n // Add lazy aliases.\n lodash.prototype.first = lodash.prototype.head;\n\n if (symIterator) {\n lodash.prototype[symIterator] = wrapperToIterator;\n }\n return lodash;\n });\n\n /*--------------------------------------------------------------------------*/\n\n // Export lodash.\n var _ = runInContext();\n\n // Some AMD build optimizers, like r.js, check for condition patterns like:\n if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n // Expose Lodash on the global object to prevent errors when Lodash is\n // loaded by a script tag in the presence of an AMD loader.\n // See http://requirejs.org/docs/errors.html#mismatch for more details.\n // Use `_.noConflict` to remove Lodash from the global object.\n root._ = _;\n\n // Define as an anonymous module so, through path mapping, it can be\n // referenced as the \"underscore\" module.\n define(function() {\n return _;\n });\n }\n // Check for `exports` after `define` in case a build optimizer adds it.\n else if (freeModule) {\n // Export for Node.js.\n (freeModule.exports = _)._ = _;\n // Export for CommonJS support.\n freeExports._ = _;\n }\n else {\n // Export to the global object.\n root._ = _;\n }\n}.call(this));\n", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.thenable = exports.typedArray = exports.stringArray = exports.array = exports.func = exports.error = exports.number = exports.string = exports.boolean = void 0;\nfunction boolean(value) {\n return value === true || value === false;\n}\nexports.boolean = boolean;\nfunction string(value) {\n return typeof value === 'string' || value instanceof String;\n}\nexports.string = string;\nfunction number(value) {\n return typeof value === 'number' || value instanceof Number;\n}\nexports.number = number;\nfunction error(value) {\n return value instanceof Error;\n}\nexports.error = error;\nfunction func(value) {\n return typeof value === 'function';\n}\nexports.func = func;\nfunction array(value) {\n return Array.isArray(value);\n}\nexports.array = array;\nfunction stringArray(value) {\n return array(value) && value.every(elem => string(elem));\n}\nexports.stringArray = stringArray;\nfunction typedArray(value, check) {\n return Array.isArray(value) && value.every(check);\n}\nexports.typedArray = typedArray;\nfunction thenable(value) {\n return value && func(value.then);\n}\nexports.thenable = thenable;\n//# sourceMappingURL=is.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nlet _ral;\nfunction RAL() {\n if (_ral === undefined) {\n throw new Error(`No runtime abstraction layer installed`);\n }\n return _ral;\n}\n(function (RAL) {\n function install(ral) {\n if (ral === undefined) {\n throw new Error(`No runtime abstraction layer provided`);\n }\n _ral = ral;\n }\n RAL.install = install;\n})(RAL || (RAL = {}));\nexports.default = RAL;\n//# sourceMappingURL=ral.js.map", "\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Disposable = void 0;\nvar Disposable;\n(function (Disposable) {\n function create(func) {\n return {\n dispose: func\n };\n }\n Disposable.create = create;\n})(Disposable = exports.Disposable || (exports.Disposable = {}));\n//# sourceMappingURL=disposable.js.map", "\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AbstractMessageBuffer = void 0;\nconst CR = 13;\nconst LF = 10;\nconst CRLF = '\\r\\n';\nclass AbstractMessageBuffer {\n constructor(encoding = 'utf-8') {\n this._encoding = encoding;\n this._chunks = [];\n this._totalLength = 0;\n }\n get encoding() {\n return this._encoding;\n }\n append(chunk) {\n const toAppend = typeof chunk === 'string' ? this.fromString(chunk, this._encoding) : chunk;\n this._chunks.push(toAppend);\n this._totalLength += toAppend.byteLength;\n }\n tryReadHeaders() {\n if (this._chunks.length === 0) {\n return undefined;\n }\n let state = 0;\n let chunkIndex = 0;\n let offset = 0;\n let chunkBytesRead = 0;\n row: while (chunkIndex < this._chunks.length) {\n const chunk = this._chunks[chunkIndex];\n offset = 0;\n column: while (offset < chunk.length) {\n const value = chunk[offset];\n switch (value) {\n case CR:\n switch (state) {\n case 0:\n state = 1;\n break;\n case 2:\n state = 3;\n break;\n default:\n state = 0;\n }\n break;\n case LF:\n switch (state) {\n case 1:\n state = 2;\n break;\n case 3:\n state = 4;\n offset++;\n break row;\n default:\n state = 0;\n }\n break;\n default:\n state = 0;\n }\n offset++;\n }\n chunkBytesRead += chunk.byteLength;\n chunkIndex++;\n }\n if (state !== 4) {\n return undefined;\n }\n // The buffer contains the two CRLF at the end. So we will\n // have two empty lines after the split at the end as well.\n const buffer = this._read(chunkBytesRead + offset);\n const result = new Map();\n const headers = this.toString(buffer, 'ascii').split(CRLF);\n if (headers.length < 2) {\n return result;\n }\n for (let i = 0; i < headers.length - 2; i++) {\n const header = headers[i];\n const index = header.indexOf(':');\n if (index === -1) {\n throw new Error('Message header must separate key and value using :');\n }\n const key = header.substr(0, index);\n const value = header.substr(index + 1).trim();\n result.set(key, value);\n }\n return result;\n }\n tryReadBody(length) {\n if (this._totalLength < length) {\n return undefined;\n }\n return this._read(length);\n }\n get numberOfBytes() {\n return this._totalLength;\n }\n _read(byteCount) {\n if (byteCount === 0) {\n return this.emptyBuffer();\n }\n if (byteCount > this._totalLength) {\n throw new Error(`Cannot read so many bytes!`);\n }\n if (this._chunks[0].byteLength === byteCount) {\n // super fast path, precisely first chunk must be returned\n const chunk = this._chunks[0];\n this._chunks.shift();\n this._totalLength -= byteCount;\n return this.asNative(chunk);\n }\n if (this._chunks[0].byteLength > byteCount) {\n // fast path, the reading is entirely within the first chunk\n const chunk = this._chunks[0];\n const result = this.asNative(chunk, byteCount);\n this._chunks[0] = chunk.slice(byteCount);\n this._totalLength -= byteCount;\n return result;\n }\n const result = this.allocNative(byteCount);\n let resultOffset = 0;\n let chunkIndex = 0;\n while (byteCount > 0) {\n const chunk = this._chunks[chunkIndex];\n if (chunk.byteLength > byteCount) {\n // this chunk will survive\n const chunkPart = chunk.slice(0, byteCount);\n result.set(chunkPart, resultOffset);\n resultOffset += byteCount;\n this._chunks[chunkIndex] = chunk.slice(byteCount);\n this._totalLength -= byteCount;\n byteCount -= byteCount;\n }\n else {\n // this chunk will be entirely read\n result.set(chunk, resultOffset);\n resultOffset += chunk.byteLength;\n this._chunks.shift();\n this._totalLength -= chunk.byteLength;\n byteCount -= chunk.byteLength;\n }\n }\n return result;\n }\n}\nexports.AbstractMessageBuffer = AbstractMessageBuffer;\n//# sourceMappingURL=messageBuffer.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst ral_1 = require(\"../common/ral\");\nconst util_1 = require(\"util\");\nconst disposable_1 = require(\"../common/disposable\");\nconst messageBuffer_1 = require(\"../common/messageBuffer\");\nclass MessageBuffer extends messageBuffer_1.AbstractMessageBuffer {\n constructor(encoding = 'utf-8') {\n super(encoding);\n }\n emptyBuffer() {\n return MessageBuffer.emptyBuffer;\n }\n fromString(value, encoding) {\n return Buffer.from(value, encoding);\n }\n toString(value, encoding) {\n if (value instanceof Buffer) {\n return value.toString(encoding);\n }\n else {\n return new util_1.TextDecoder(encoding).decode(value);\n }\n }\n asNative(buffer, length) {\n if (length === undefined) {\n return buffer instanceof Buffer ? buffer : Buffer.from(buffer);\n }\n else {\n return buffer instanceof Buffer ? buffer.slice(0, length) : Buffer.from(buffer, 0, length);\n }\n }\n allocNative(length) {\n return Buffer.allocUnsafe(length);\n }\n}\nMessageBuffer.emptyBuffer = Buffer.allocUnsafe(0);\nclass ReadableStreamWrapper {\n constructor(stream) {\n this.stream = stream;\n }\n onClose(listener) {\n this.stream.on('close', listener);\n return disposable_1.Disposable.create(() => this.stream.off('close', listener));\n }\n onError(listener) {\n this.stream.on('error', listener);\n return disposable_1.Disposable.create(() => this.stream.off('error', listener));\n }\n onEnd(listener) {\n this.stream.on('end', listener);\n return disposable_1.Disposable.create(() => this.stream.off('end', listener));\n }\n onData(listener) {\n this.stream.on('data', listener);\n return disposable_1.Disposable.create(() => this.stream.off('data', listener));\n }\n}\nclass WritableStreamWrapper {\n constructor(stream) {\n this.stream = stream;\n }\n onClose(listener) {\n this.stream.on('close', listener);\n return disposable_1.Disposable.create(() => this.stream.off('close', listener));\n }\n onError(listener) {\n this.stream.on('error', listener);\n return disposable_1.Disposable.create(() => this.stream.off('error', listener));\n }\n onEnd(listener) {\n this.stream.on('end', listener);\n return disposable_1.Disposable.create(() => this.stream.off('end', listener));\n }\n write(data, encoding) {\n return new Promise((resolve, reject) => {\n const callback = (error) => {\n if (error === undefined || error === null) {\n resolve();\n }\n else {\n reject(error);\n }\n };\n if (typeof data === 'string') {\n this.stream.write(data, encoding, callback);\n }\n else {\n this.stream.write(data, callback);\n }\n });\n }\n end() {\n this.stream.end();\n }\n}\nconst _ril = Object.freeze({\n messageBuffer: Object.freeze({\n create: (encoding) => new MessageBuffer(encoding)\n }),\n applicationJson: Object.freeze({\n encoder: Object.freeze({\n name: 'application/json',\n encode: (msg, options) => {\n try {\n return Promise.resolve(Buffer.from(JSON.stringify(msg, undefined, 0), options.charset));\n }\n catch (err) {\n return Promise.reject(err);\n }\n }\n }),\n decoder: Object.freeze({\n name: 'application/json',\n decode: (buffer, options) => {\n try {\n if (buffer instanceof Buffer) {\n return Promise.resolve(JSON.parse(buffer.toString(options.charset)));\n }\n else {\n return Promise.resolve(JSON.parse(new util_1.TextDecoder(options.charset).decode(buffer)));\n }\n }\n catch (err) {\n return Promise.reject(err);\n }\n }\n })\n }),\n stream: Object.freeze({\n asReadableStream: (stream) => new ReadableStreamWrapper(stream),\n asWritableStream: (stream) => new WritableStreamWrapper(stream)\n }),\n console: console,\n timer: Object.freeze({\n setTimeout(callback, ms, ...args) {\n return setTimeout(callback, ms, ...args);\n },\n clearTimeout(handle) {\n clearTimeout(handle);\n },\n setImmediate(callback, ...args) {\n return setImmediate(callback, ...args);\n },\n clearImmediate(handle) {\n clearImmediate(handle);\n }\n })\n});\nfunction RIL() {\n return _ril;\n}\n(function (RIL) {\n function install() {\n ral_1.default.install(_ril);\n }\n RIL.install = install;\n})(RIL || (RIL = {}));\nexports.default = RIL;\n//# sourceMappingURL=ril.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.stringArray = exports.array = exports.func = exports.error = exports.number = exports.string = exports.boolean = void 0;\nfunction boolean(value) {\n return value === true || value === false;\n}\nexports.boolean = boolean;\nfunction string(value) {\n return typeof value === 'string' || value instanceof String;\n}\nexports.string = string;\nfunction number(value) {\n return typeof value === 'number' || value instanceof Number;\n}\nexports.number = number;\nfunction error(value) {\n return value instanceof Error;\n}\nexports.error = error;\nfunction func(value) {\n return typeof value === 'function';\n}\nexports.func = func;\nfunction array(value) {\n return Array.isArray(value);\n}\nexports.array = array;\nfunction stringArray(value) {\n return array(value) && value.every(elem => string(elem));\n}\nexports.stringArray = stringArray;\n//# sourceMappingURL=is.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isResponseMessage = exports.isNotificationMessage = exports.isRequestMessage = exports.NotificationType9 = exports.NotificationType8 = exports.NotificationType7 = exports.NotificationType6 = exports.NotificationType5 = exports.NotificationType4 = exports.NotificationType3 = exports.NotificationType2 = exports.NotificationType1 = exports.NotificationType0 = exports.NotificationType = exports.RequestType9 = exports.RequestType8 = exports.RequestType7 = exports.RequestType6 = exports.RequestType5 = exports.RequestType4 = exports.RequestType3 = exports.RequestType2 = exports.RequestType1 = exports.RequestType = exports.RequestType0 = exports.AbstractMessageSignature = exports.ParameterStructures = exports.ResponseError = exports.ErrorCodes = void 0;\nconst is = require(\"./is\");\n/**\n * Predefined error codes.\n */\nvar ErrorCodes;\n(function (ErrorCodes) {\n // Defined by JSON RPC\n ErrorCodes.ParseError = -32700;\n ErrorCodes.InvalidRequest = -32600;\n ErrorCodes.MethodNotFound = -32601;\n ErrorCodes.InvalidParams = -32602;\n ErrorCodes.InternalError = -32603;\n /**\n * This is the start range of JSON RPC reserved error codes.\n * It doesn't denote a real error code. No application error codes should\n * be defined between the start and end range. For backwards\n * compatibility the `ServerNotInitialized` and the `UnknownErrorCode`\n * are left in the range.\n *\n * @since 3.16.0\n */\n ErrorCodes.jsonrpcReservedErrorRangeStart = -32099;\n /** @deprecated use jsonrpcReservedErrorRangeStart */\n ErrorCodes.serverErrorStart = ErrorCodes.jsonrpcReservedErrorRangeStart;\n ErrorCodes.MessageWriteError = -32099;\n ErrorCodes.MessageReadError = -32098;\n ErrorCodes.ServerNotInitialized = -32002;\n ErrorCodes.UnknownErrorCode = -32001;\n /**\n * This is the end range of JSON RPC reserved error codes.\n * It doesn't denote a real error code.\n *\n * @since 3.16.0\n */\n ErrorCodes.jsonrpcReservedErrorRangeEnd = -32000;\n /** @deprecated use jsonrpcReservedErrorRangeEnd */\n ErrorCodes.serverErrorEnd = ErrorCodes.jsonrpcReservedErrorRangeEnd;\n})(ErrorCodes = exports.ErrorCodes || (exports.ErrorCodes = {}));\n/**\n * An error object return in a response in case a request\n * has failed.\n */\nclass ResponseError extends Error {\n constructor(code, message, data) {\n super(message);\n this.code = is.number(code) ? code : ErrorCodes.UnknownErrorCode;\n this.data = data;\n Object.setPrototypeOf(this, ResponseError.prototype);\n }\n toJson() {\n return {\n code: this.code,\n message: this.message,\n data: this.data,\n };\n }\n}\nexports.ResponseError = ResponseError;\nclass ParameterStructures {\n constructor(kind) {\n this.kind = kind;\n }\n static is(value) {\n return value === ParameterStructures.auto || value === ParameterStructures.byName || value === ParameterStructures.byPosition;\n }\n toString() {\n return this.kind;\n }\n}\nexports.ParameterStructures = ParameterStructures;\n/**\n * The parameter structure is automatically inferred on the number of parameters\n * and the parameter type in case of a single param.\n */\nParameterStructures.auto = new ParameterStructures('auto');\n/**\n * Forces `byPosition` parameter structure. This is useful if you have a single\n * parameter which has a literal type.\n */\nParameterStructures.byPosition = new ParameterStructures('byPosition');\n/**\n * Forces `byName` parameter structure. This is only useful when having a single\n * parameter. The library will report errors if used with a different number of\n * parameters.\n */\nParameterStructures.byName = new ParameterStructures('byName');\n/**\n * An abstract implementation of a MessageType.\n */\nclass AbstractMessageSignature {\n constructor(method, numberOfParams) {\n this.method = method;\n this.numberOfParams = numberOfParams;\n }\n get parameterStructures() {\n return ParameterStructures.auto;\n }\n}\nexports.AbstractMessageSignature = AbstractMessageSignature;\n/**\n * Classes to type request response pairs\n */\nclass RequestType0 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 0);\n }\n}\nexports.RequestType0 = RequestType0;\nclass RequestType extends AbstractMessageSignature {\n constructor(method, _parameterStructures = ParameterStructures.auto) {\n super(method, 1);\n this._parameterStructures = _parameterStructures;\n }\n get parameterStructures() {\n return this._parameterStructures;\n }\n}\nexports.RequestType = RequestType;\nclass RequestType1 extends AbstractMessageSignature {\n constructor(method, _parameterStructures = ParameterStructures.auto) {\n super(method, 1);\n this._parameterStructures = _parameterStructures;\n }\n get parameterStructures() {\n return this._parameterStructures;\n }\n}\nexports.RequestType1 = RequestType1;\nclass RequestType2 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 2);\n }\n}\nexports.RequestType2 = RequestType2;\nclass RequestType3 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 3);\n }\n}\nexports.RequestType3 = RequestType3;\nclass RequestType4 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 4);\n }\n}\nexports.RequestType4 = RequestType4;\nclass RequestType5 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 5);\n }\n}\nexports.RequestType5 = RequestType5;\nclass RequestType6 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 6);\n }\n}\nexports.RequestType6 = RequestType6;\nclass RequestType7 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 7);\n }\n}\nexports.RequestType7 = RequestType7;\nclass RequestType8 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 8);\n }\n}\nexports.RequestType8 = RequestType8;\nclass RequestType9 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 9);\n }\n}\nexports.RequestType9 = RequestType9;\nclass NotificationType extends AbstractMessageSignature {\n constructor(method, _parameterStructures = ParameterStructures.auto) {\n super(method, 1);\n this._parameterStructures = _parameterStructures;\n }\n get parameterStructures() {\n return this._parameterStructures;\n }\n}\nexports.NotificationType = NotificationType;\nclass NotificationType0 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 0);\n }\n}\nexports.NotificationType0 = NotificationType0;\nclass NotificationType1 extends AbstractMessageSignature {\n constructor(method, _parameterStructures = ParameterStructures.auto) {\n super(method, 1);\n this._parameterStructures = _parameterStructures;\n }\n get parameterStructures() {\n return this._parameterStructures;\n }\n}\nexports.NotificationType1 = NotificationType1;\nclass NotificationType2 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 2);\n }\n}\nexports.NotificationType2 = NotificationType2;\nclass NotificationType3 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 3);\n }\n}\nexports.NotificationType3 = NotificationType3;\nclass NotificationType4 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 4);\n }\n}\nexports.NotificationType4 = NotificationType4;\nclass NotificationType5 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 5);\n }\n}\nexports.NotificationType5 = NotificationType5;\nclass NotificationType6 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 6);\n }\n}\nexports.NotificationType6 = NotificationType6;\nclass NotificationType7 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 7);\n }\n}\nexports.NotificationType7 = NotificationType7;\nclass NotificationType8 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 8);\n }\n}\nexports.NotificationType8 = NotificationType8;\nclass NotificationType9 extends AbstractMessageSignature {\n constructor(method) {\n super(method, 9);\n }\n}\nexports.NotificationType9 = NotificationType9;\n/**\n * Tests if the given message is a request message\n */\nfunction isRequestMessage(message) {\n const candidate = message;\n return candidate && is.string(candidate.method) && (is.string(candidate.id) || is.number(candidate.id));\n}\nexports.isRequestMessage = isRequestMessage;\n/**\n * Tests if the given message is a notification message\n */\nfunction isNotificationMessage(message) {\n const candidate = message;\n return candidate && is.string(candidate.method) && message.id === void 0;\n}\nexports.isNotificationMessage = isNotificationMessage;\n/**\n * Tests if the given message is a response message\n */\nfunction isResponseMessage(message) {\n const candidate = message;\n return candidate && (candidate.result !== void 0 || !!candidate.error) && (is.string(candidate.id) || is.number(candidate.id) || candidate.id === null);\n}\nexports.isResponseMessage = isResponseMessage;\n//# sourceMappingURL=messages.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Emitter = exports.Event = void 0;\nconst ral_1 = require(\"./ral\");\nvar Event;\n(function (Event) {\n const _disposable = { dispose() { } };\n Event.None = function () { return _disposable; };\n})(Event = exports.Event || (exports.Event = {}));\nclass CallbackList {\n add(callback, context = null, bucket) {\n if (!this._callbacks) {\n this._callbacks = [];\n this._contexts = [];\n }\n this._callbacks.push(callback);\n this._contexts.push(context);\n if (Array.isArray(bucket)) {\n bucket.push({ dispose: () => this.remove(callback, context) });\n }\n }\n remove(callback, context = null) {\n if (!this._callbacks) {\n return;\n }\n let foundCallbackWithDifferentContext = false;\n for (let i = 0, len = this._callbacks.length; i < len; i++) {\n if (this._callbacks[i] === callback) {\n if (this._contexts[i] === context) {\n // callback & context match => remove it\n this._callbacks.splice(i, 1);\n this._contexts.splice(i, 1);\n return;\n }\n else {\n foundCallbackWithDifferentContext = true;\n }\n }\n }\n if (foundCallbackWithDifferentContext) {\n throw new Error('When adding a listener with a context, you should remove it with the same context');\n }\n }\n invoke(...args) {\n if (!this._callbacks) {\n return [];\n }\n const ret = [], callbacks = this._callbacks.slice(0), contexts = this._contexts.slice(0);\n for (let i = 0, len = callbacks.length; i < len; i++) {\n try {\n ret.push(callbacks[i].apply(contexts[i], args));\n }\n catch (e) {\n // eslint-disable-next-line no-console\n ral_1.default().console.error(e);\n }\n }\n return ret;\n }\n isEmpty() {\n return !this._callbacks || this._callbacks.length === 0;\n }\n dispose() {\n this._callbacks = undefined;\n this._contexts = undefined;\n }\n}\nclass Emitter {\n constructor(_options) {\n this._options = _options;\n }\n /**\n * For the public to allow to subscribe\n * to events from this Emitter\n */\n get event() {\n if (!this._event) {\n this._event = (listener, thisArgs, disposables) => {\n if (!this._callbacks) {\n this._callbacks = new CallbackList();\n }\n if (this._options && this._options.onFirstListenerAdd && this._callbacks.isEmpty()) {\n this._options.onFirstListenerAdd(this);\n }\n this._callbacks.add(listener, thisArgs);\n const result = {\n dispose: () => {\n if (!this._callbacks) {\n // disposable is disposed after emitter is disposed.\n return;\n }\n this._callbacks.remove(listener, thisArgs);\n result.dispose = Emitter._noop;\n if (this._options && this._options.onLastListenerRemove && this._callbacks.isEmpty()) {\n this._options.onLastListenerRemove(this);\n }\n }\n };\n if (Array.isArray(disposables)) {\n disposables.push(result);\n }\n return result;\n };\n }\n return this._event;\n }\n /**\n * To be kept private to fire an event to\n * subscribers\n */\n fire(event) {\n if (this._callbacks) {\n this._callbacks.invoke.call(this._callbacks, event);\n }\n }\n dispose() {\n if (this._callbacks) {\n this._callbacks.dispose();\n this._callbacks = undefined;\n }\n }\n}\nexports.Emitter = Emitter;\nEmitter._noop = function () { };\n//# sourceMappingURL=events.js.map", "\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CancellationTokenSource = exports.CancellationToken = void 0;\nconst ral_1 = require(\"./ral\");\nconst Is = require(\"./is\");\nconst events_1 = require(\"./events\");\nvar CancellationToken;\n(function (CancellationToken) {\n CancellationToken.None = Object.freeze({\n isCancellationRequested: false,\n onCancellationRequested: events_1.Event.None\n });\n CancellationToken.Cancelled = Object.freeze({\n isCancellationRequested: true,\n onCancellationRequested: events_1.Event.None\n });\n function is(value) {\n const candidate = value;\n return candidate && (candidate === CancellationToken.None\n || candidate === CancellationToken.Cancelled\n || (Is.boolean(candidate.isCancellationRequested) && !!candidate.onCancellationRequested));\n }\n CancellationToken.is = is;\n})(CancellationToken = exports.CancellationToken || (exports.CancellationToken = {}));\nconst shortcutEvent = Object.freeze(function (callback, context) {\n const handle = ral_1.default().timer.setTimeout(callback.bind(context), 0);\n return { dispose() { ral_1.default().timer.clearTimeout(handle); } };\n});\nclass MutableToken {\n constructor() {\n this._isCancelled = false;\n }\n cancel() {\n if (!this._isCancelled) {\n this._isCancelled = true;\n if (this._emitter) {\n this._emitter.fire(undefined);\n this.dispose();\n }\n }\n }\n get isCancellationRequested() {\n return this._isCancelled;\n }\n get onCancellationRequested() {\n if (this._isCancelled) {\n return shortcutEvent;\n }\n if (!this._emitter) {\n this._emitter = new events_1.Emitter();\n }\n return this._emitter.event;\n }\n dispose() {\n if (this._emitter) {\n this._emitter.dispose();\n this._emitter = undefined;\n }\n }\n}\nclass CancellationTokenSource {\n get token() {\n if (!this._token) {\n // be lazy and create the token only when\n // actually needed\n this._token = new MutableToken();\n }\n return this._token;\n }\n cancel() {\n if (!this._token) {\n // save an object by returning the default\n // cancelled token when cancellation happens\n // before someone asks for the token\n this._token = CancellationToken.Cancelled;\n }\n else {\n this._token.cancel();\n }\n }\n dispose() {\n if (!this._token) {\n // ensure to initialize with an empty token if we had none\n this._token = CancellationToken.None;\n }\n else if (this._token instanceof MutableToken) {\n // actually dispose\n this._token.dispose();\n }\n }\n}\nexports.CancellationTokenSource = CancellationTokenSource;\n//# sourceMappingURL=cancellation.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ReadableStreamMessageReader = exports.AbstractMessageReader = exports.MessageReader = void 0;\nconst ral_1 = require(\"./ral\");\nconst Is = require(\"./is\");\nconst events_1 = require(\"./events\");\nvar MessageReader;\n(function (MessageReader) {\n function is(value) {\n let candidate = value;\n return candidate && Is.func(candidate.listen) && Is.func(candidate.dispose) &&\n Is.func(candidate.onError) && Is.func(candidate.onClose) && Is.func(candidate.onPartialMessage);\n }\n MessageReader.is = is;\n})(MessageReader = exports.MessageReader || (exports.MessageReader = {}));\nclass AbstractMessageReader {\n constructor() {\n this.errorEmitter = new events_1.Emitter();\n this.closeEmitter = new events_1.Emitter();\n this.partialMessageEmitter = new events_1.Emitter();\n }\n dispose() {\n this.errorEmitter.dispose();\n this.closeEmitter.dispose();\n }\n get onError() {\n return this.errorEmitter.event;\n }\n fireError(error) {\n this.errorEmitter.fire(this.asError(error));\n }\n get onClose() {\n return this.closeEmitter.event;\n }\n fireClose() {\n this.closeEmitter.fire(undefined);\n }\n get onPartialMessage() {\n return this.partialMessageEmitter.event;\n }\n firePartialMessage(info) {\n this.partialMessageEmitter.fire(info);\n }\n asError(error) {\n if (error instanceof Error) {\n return error;\n }\n else {\n return new Error(`Reader received error. Reason: ${Is.string(error.message) ? error.message : 'unknown'}`);\n }\n }\n}\nexports.AbstractMessageReader = AbstractMessageReader;\nvar ResolvedMessageReaderOptions;\n(function (ResolvedMessageReaderOptions) {\n function fromOptions(options) {\n var _a;\n let charset;\n let result;\n let contentDecoder;\n const contentDecoders = new Map();\n let contentTypeDecoder;\n const contentTypeDecoders = new Map();\n if (options === undefined || typeof options === 'string') {\n charset = options !== null && options !== void 0 ? options : 'utf-8';\n }\n else {\n charset = (_a = options.charset) !== null && _a !== void 0 ? _a : 'utf-8';\n if (options.contentDecoder !== undefined) {\n contentDecoder = options.contentDecoder;\n contentDecoders.set(contentDecoder.name, contentDecoder);\n }\n if (options.contentDecoders !== undefined) {\n for (const decoder of options.contentDecoders) {\n contentDecoders.set(decoder.name, decoder);\n }\n }\n if (options.contentTypeDecoder !== undefined) {\n contentTypeDecoder = options.contentTypeDecoder;\n contentTypeDecoders.set(contentTypeDecoder.name, contentTypeDecoder);\n }\n if (options.contentTypeDecoders !== undefined) {\n for (const decoder of options.contentTypeDecoders) {\n contentTypeDecoders.set(decoder.name, decoder);\n }\n }\n }\n if (contentTypeDecoder === undefined) {\n contentTypeDecoder = ral_1.default().applicationJson.decoder;\n contentTypeDecoders.set(contentTypeDecoder.name, contentTypeDecoder);\n }\n return { charset, contentDecoder, contentDecoders, contentTypeDecoder, contentTypeDecoders };\n }\n ResolvedMessageReaderOptions.fromOptions = fromOptions;\n})(ResolvedMessageReaderOptions || (ResolvedMessageReaderOptions = {}));\nclass ReadableStreamMessageReader extends AbstractMessageReader {\n constructor(readable, options) {\n super();\n this.readable = readable;\n this.options = ResolvedMessageReaderOptions.fromOptions(options);\n this.buffer = ral_1.default().messageBuffer.create(this.options.charset);\n this._partialMessageTimeout = 10000;\n this.nextMessageLength = -1;\n this.messageToken = 0;\n }\n set partialMessageTimeout(timeout) {\n this._partialMessageTimeout = timeout;\n }\n get partialMessageTimeout() {\n return this._partialMessageTimeout;\n }\n listen(callback) {\n this.nextMessageLength = -1;\n this.messageToken = 0;\n this.partialMessageTimer = undefined;\n this.callback = callback;\n const result = this.readable.onData((data) => {\n this.onData(data);\n });\n this.readable.onError((error) => this.fireError(error));\n this.readable.onClose(() => this.fireClose());\n return result;\n }\n onData(data) {\n this.buffer.append(data);\n while (true) {\n if (this.nextMessageLength === -1) {\n const headers = this.buffer.tryReadHeaders();\n if (!headers) {\n return;\n }\n const contentLength = headers.get('Content-Length');\n if (!contentLength) {\n throw new Error('Header must provide a Content-Length property.');\n }\n const length = parseInt(contentLength);\n if (isNaN(length)) {\n throw new Error('Content-Length value must be a number.');\n }\n this.nextMessageLength = length;\n }\n const body = this.buffer.tryReadBody(this.nextMessageLength);\n if (body === undefined) {\n /** We haven't received the full message yet. */\n this.setPartialMessageTimer();\n return;\n }\n this.clearPartialMessageTimer();\n this.nextMessageLength = -1;\n let p;\n if (this.options.contentDecoder !== undefined) {\n p = this.options.contentDecoder.decode(body);\n }\n else {\n p = Promise.resolve(body);\n }\n p.then((value) => {\n this.options.contentTypeDecoder.decode(value, this.options).then((msg) => {\n this.callback(msg);\n }, (error) => {\n this.fireError(error);\n });\n }, (error) => {\n this.fireError(error);\n });\n }\n }\n clearPartialMessageTimer() {\n if (this.partialMessageTimer) {\n ral_1.default().timer.clearTimeout(this.partialMessageTimer);\n this.partialMessageTimer = undefined;\n }\n }\n setPartialMessageTimer() {\n this.clearPartialMessageTimer();\n if (this._partialMessageTimeout <= 0) {\n return;\n }\n this.partialMessageTimer = ral_1.default().timer.setTimeout((token, timeout) => {\n this.partialMessageTimer = undefined;\n if (token === this.messageToken) {\n this.firePartialMessage({ messageToken: token, waitingTime: timeout });\n this.setPartialMessageTimer();\n }\n }, this._partialMessageTimeout, this.messageToken, this._partialMessageTimeout);\n }\n}\nexports.ReadableStreamMessageReader = ReadableStreamMessageReader;\n//# sourceMappingURL=messageReader.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Semaphore = void 0;\nconst ral_1 = require(\"./ral\");\nclass Semaphore {\n constructor(capacity = 1) {\n if (capacity <= 0) {\n throw new Error('Capacity must be greater than 0');\n }\n this._capacity = capacity;\n this._active = 0;\n this._waiting = [];\n }\n lock(thunk) {\n return new Promise((resolve, reject) => {\n this._waiting.push({ thunk, resolve, reject });\n this.runNext();\n });\n }\n get active() {\n return this._active;\n }\n runNext() {\n if (this._waiting.length === 0 || this._active === this._capacity) {\n return;\n }\n ral_1.default().timer.setImmediate(() => this.doRunNext());\n }\n doRunNext() {\n if (this._waiting.length === 0 || this._active === this._capacity) {\n return;\n }\n const next = this._waiting.shift();\n this._active++;\n if (this._active > this._capacity) {\n throw new Error(`To many thunks active`);\n }\n try {\n const result = next.thunk();\n if (result instanceof Promise) {\n result.then((value) => {\n this._active--;\n next.resolve(value);\n this.runNext();\n }, (err) => {\n this._active--;\n next.reject(err);\n this.runNext();\n });\n }\n else {\n this._active--;\n next.resolve(result);\n this.runNext();\n }\n }\n catch (err) {\n this._active--;\n next.reject(err);\n this.runNext();\n }\n }\n}\nexports.Semaphore = Semaphore;\n//# sourceMappingURL=semaphore.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.WriteableStreamMessageWriter = exports.AbstractMessageWriter = exports.MessageWriter = void 0;\nconst ral_1 = require(\"./ral\");\nconst Is = require(\"./is\");\nconst semaphore_1 = require(\"./semaphore\");\nconst events_1 = require(\"./events\");\nconst ContentLength = 'Content-Length: ';\nconst CRLF = '\\r\\n';\nvar MessageWriter;\n(function (MessageWriter) {\n function is(value) {\n let candidate = value;\n return candidate && Is.func(candidate.dispose) && Is.func(candidate.onClose) &&\n Is.func(candidate.onError) && Is.func(candidate.write);\n }\n MessageWriter.is = is;\n})(MessageWriter = exports.MessageWriter || (exports.MessageWriter = {}));\nclass AbstractMessageWriter {\n constructor() {\n this.errorEmitter = new events_1.Emitter();\n this.closeEmitter = new events_1.Emitter();\n }\n dispose() {\n this.errorEmitter.dispose();\n this.closeEmitter.dispose();\n }\n get onError() {\n return this.errorEmitter.event;\n }\n fireError(error, message, count) {\n this.errorEmitter.fire([this.asError(error), message, count]);\n }\n get onClose() {\n return this.closeEmitter.event;\n }\n fireClose() {\n this.closeEmitter.fire(undefined);\n }\n asError(error) {\n if (error instanceof Error) {\n return error;\n }\n else {\n return new Error(`Writer received error. Reason: ${Is.string(error.message) ? error.message : 'unknown'}`);\n }\n }\n}\nexports.AbstractMessageWriter = AbstractMessageWriter;\nvar ResolvedMessageWriterOptions;\n(function (ResolvedMessageWriterOptions) {\n function fromOptions(options) {\n var _a, _b;\n if (options === undefined || typeof options === 'string') {\n return { charset: options !== null && options !== void 0 ? options : 'utf-8', contentTypeEncoder: ral_1.default().applicationJson.encoder };\n }\n else {\n return { charset: (_a = options.charset) !== null && _a !== void 0 ? _a : 'utf-8', contentEncoder: options.contentEncoder, contentTypeEncoder: (_b = options.contentTypeEncoder) !== null && _b !== void 0 ? _b : ral_1.default().applicationJson.encoder };\n }\n }\n ResolvedMessageWriterOptions.fromOptions = fromOptions;\n})(ResolvedMessageWriterOptions || (ResolvedMessageWriterOptions = {}));\nclass WriteableStreamMessageWriter extends AbstractMessageWriter {\n constructor(writable, options) {\n super();\n this.writable = writable;\n this.options = ResolvedMessageWriterOptions.fromOptions(options);\n this.errorCount = 0;\n this.writeSemaphore = new semaphore_1.Semaphore(1);\n this.writable.onError((error) => this.fireError(error));\n this.writable.onClose(() => this.fireClose());\n }\n async write(msg) {\n return this.writeSemaphore.lock(async () => {\n const payload = this.options.contentTypeEncoder.encode(msg, this.options).then((buffer) => {\n if (this.options.contentEncoder !== undefined) {\n return this.options.contentEncoder.encode(buffer);\n }\n else {\n return buffer;\n }\n });\n return payload.then((buffer) => {\n const headers = [];\n headers.push(ContentLength, buffer.byteLength.toString(), CRLF);\n headers.push(CRLF);\n return this.doWrite(msg, headers, buffer);\n }, (error) => {\n this.fireError(error);\n throw error;\n });\n });\n }\n async doWrite(msg, headers, data) {\n try {\n await this.writable.write(headers.join(''), 'ascii');\n return this.writable.write(data);\n }\n catch (error) {\n this.handleError(error, msg);\n return Promise.reject(error);\n }\n }\n handleError(error, msg) {\n this.errorCount++;\n this.fireError(error, msg, this.errorCount);\n }\n end() {\n this.writable.end();\n }\n}\nexports.WriteableStreamMessageWriter = WriteableStreamMessageWriter;\n//# sourceMappingURL=messageWriter.js.map", "\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LRUCache = exports.LinkedMap = exports.Touch = void 0;\nvar Touch;\n(function (Touch) {\n Touch.None = 0;\n Touch.First = 1;\n Touch.AsOld = Touch.First;\n Touch.Last = 2;\n Touch.AsNew = Touch.Last;\n})(Touch = exports.Touch || (exports.Touch = {}));\nclass LinkedMap {\n constructor() {\n this[Symbol.toStringTag] = 'LinkedMap';\n this._map = new Map();\n this._head = undefined;\n this._tail = undefined;\n this._size = 0;\n this._state = 0;\n }\n clear() {\n this._map.clear();\n this._head = undefined;\n this._tail = undefined;\n this._size = 0;\n this._state++;\n }\n isEmpty() {\n return !this._head && !this._tail;\n }\n get size() {\n return this._size;\n }\n get first() {\n var _a;\n return (_a = this._head) === null || _a === void 0 ? void 0 : _a.value;\n }\n get last() {\n var _a;\n return (_a = this._tail) === null || _a === void 0 ? void 0 : _a.value;\n }\n has(key) {\n return this._map.has(key);\n }\n get(key, touch = Touch.None) {\n const item = this._map.get(key);\n if (!item) {\n return undefined;\n }\n if (touch !== Touch.None) {\n this.touch(item, touch);\n }\n return item.value;\n }\n set(key, value, touch = Touch.None) {\n let item = this._map.get(key);\n if (item) {\n item.value = value;\n if (touch !== Touch.None) {\n this.touch(item, touch);\n }\n }\n else {\n item = { key, value, next: undefined, previous: undefined };\n switch (touch) {\n case Touch.None:\n this.addItemLast(item);\n break;\n case Touch.First:\n this.addItemFirst(item);\n break;\n case Touch.Last:\n this.addItemLast(item);\n break;\n default:\n this.addItemLast(item);\n break;\n }\n this._map.set(key, item);\n this._size++;\n }\n return this;\n }\n delete(key) {\n return !!this.remove(key);\n }\n remove(key) {\n const item = this._map.get(key);\n if (!item) {\n return undefined;\n }\n this._map.delete(key);\n this.removeItem(item);\n this._size--;\n return item.value;\n }\n shift() {\n if (!this._head && !this._tail) {\n return undefined;\n }\n if (!this._head || !this._tail) {\n throw new Error('Invalid list');\n }\n const item = this._head;\n this._map.delete(item.key);\n this.removeItem(item);\n this._size--;\n return item.value;\n }\n forEach(callbackfn, thisArg) {\n const state = this._state;\n let current = this._head;\n while (current) {\n if (thisArg) {\n callbackfn.bind(thisArg)(current.value, current.key, this);\n }\n else {\n callbackfn(current.value, current.key, this);\n }\n if (this._state !== state) {\n throw new Error(`LinkedMap got modified during iteration.`);\n }\n current = current.next;\n }\n }\n keys() {\n const map = this;\n const state = this._state;\n let current = this._head;\n const iterator = {\n [Symbol.iterator]() {\n return iterator;\n },\n next() {\n if (map._state !== state) {\n throw new Error(`LinkedMap got modified during iteration.`);\n }\n if (current) {\n const result = { value: current.key, done: false };\n current = current.next;\n return result;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n };\n return iterator;\n }\n values() {\n const map = this;\n const state = this._state;\n let current = this._head;\n const iterator = {\n [Symbol.iterator]() {\n return iterator;\n },\n next() {\n if (map._state !== state) {\n throw new Error(`LinkedMap got modified during iteration.`);\n }\n if (current) {\n const result = { value: current.value, done: false };\n current = current.next;\n return result;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n };\n return iterator;\n }\n entries() {\n const map = this;\n const state = this._state;\n let current = this._head;\n const iterator = {\n [Symbol.iterator]() {\n return iterator;\n },\n next() {\n if (map._state !== state) {\n throw new Error(`LinkedMap got modified during iteration.`);\n }\n if (current) {\n const result = { value: [current.key, current.value], done: false };\n current = current.next;\n return result;\n }\n else {\n return { value: undefined, done: true };\n }\n }\n };\n return iterator;\n }\n [Symbol.iterator]() {\n return this.entries();\n }\n trimOld(newSize) {\n if (newSize >= this.size) {\n return;\n }\n if (newSize === 0) {\n this.clear();\n return;\n }\n let current = this._head;\n let currentSize = this.size;\n while (current && currentSize > newSize) {\n this._map.delete(current.key);\n current = current.next;\n currentSize--;\n }\n this._head = current;\n this._size = currentSize;\n if (current) {\n current.previous = undefined;\n }\n this._state++;\n }\n addItemFirst(item) {\n // First time Insert\n if (!this._head && !this._tail) {\n this._tail = item;\n }\n else if (!this._head) {\n throw new Error('Invalid list');\n }\n else {\n item.next = this._head;\n this._head.previous = item;\n }\n this._head = item;\n this._state++;\n }\n addItemLast(item) {\n // First time Insert\n if (!this._head && !this._tail) {\n this._head = item;\n }\n else if (!this._tail) {\n throw new Error('Invalid list');\n }\n else {\n item.previous = this._tail;\n this._tail.next = item;\n }\n this._tail = item;\n this._state++;\n }\n removeItem(item) {\n if (item === this._head && item === this._tail) {\n this._head = undefined;\n this._tail = undefined;\n }\n else if (item === this._head) {\n // This can only happend if size === 1 which is handle\n // by the case above.\n if (!item.next) {\n throw new Error('Invalid list');\n }\n item.next.previous = undefined;\n this._head = item.next;\n }\n else if (item === this._tail) {\n // This can only happend if size === 1 which is handle\n // by the case above.\n if (!item.previous) {\n throw new Error('Invalid list');\n }\n item.previous.next = undefined;\n this._tail = item.previous;\n }\n else {\n const next = item.next;\n const previous = item.previous;\n if (!next || !previous) {\n throw new Error('Invalid list');\n }\n next.previous = previous;\n previous.next = next;\n }\n item.next = undefined;\n item.previous = undefined;\n this._state++;\n }\n touch(item, touch) {\n if (!this._head || !this._tail) {\n throw new Error('Invalid list');\n }\n if ((touch !== Touch.First && touch !== Touch.Last)) {\n return;\n }\n if (touch === Touch.First) {\n if (item === this._head) {\n return;\n }\n const next = item.next;\n const previous = item.previous;\n // Unlink the item\n if (item === this._tail) {\n // previous must be defined since item was not head but is tail\n // So there are more than on item in the map\n previous.next = undefined;\n this._tail = previous;\n }\n else {\n // Both next and previous are not undefined since item was neither head nor tail.\n next.previous = previous;\n previous.next = next;\n }\n // Insert the node at head\n item.previous = undefined;\n item.next = this._head;\n this._head.previous = item;\n this._head = item;\n this._state++;\n }\n else if (touch === Touch.Last) {\n if (item === this._tail) {\n return;\n }\n const next = item.next;\n const previous = item.previous;\n // Unlink the item.\n if (item === this._head) {\n // next must be defined since item was not tail but is head\n // So there are more than on item in the map\n next.previous = undefined;\n this._head = next;\n }\n else {\n // Both next and previous are not undefined since item was neither head nor tail.\n next.previous = previous;\n previous.next = next;\n }\n item.next = undefined;\n item.previous = this._tail;\n this._tail.next = item;\n this._tail = item;\n this._state++;\n }\n }\n toJSON() {\n const data = [];\n this.forEach((value, key) => {\n data.push([key, value]);\n });\n return data;\n }\n fromJSON(data) {\n this.clear();\n for (const [key, value] of data) {\n this.set(key, value);\n }\n }\n}\nexports.LinkedMap = LinkedMap;\nclass LRUCache extends LinkedMap {\n constructor(limit, ratio = 1) {\n super();\n this._limit = limit;\n this._ratio = Math.min(Math.max(0, ratio), 1);\n }\n get limit() {\n return this._limit;\n }\n set limit(limit) {\n this._limit = limit;\n this.checkTrim();\n }\n get ratio() {\n return this._ratio;\n }\n set ratio(ratio) {\n this._ratio = Math.min(Math.max(0, ratio), 1);\n this.checkTrim();\n }\n get(key, touch = Touch.AsNew) {\n return super.get(key, touch);\n }\n peek(key) {\n return super.get(key, Touch.None);\n }\n set(key, value) {\n super.set(key, value, Touch.Last);\n this.checkTrim();\n return this;\n }\n checkTrim() {\n if (this.size > this._limit) {\n this.trimOld(Math.round(this._limit * this._ratio));\n }\n }\n}\nexports.LRUCache = LRUCache;\n//# sourceMappingURL=linkedMap.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createMessageConnection = exports.ConnectionOptions = exports.CancellationStrategy = exports.CancellationSenderStrategy = exports.CancellationReceiverStrategy = exports.ConnectionStrategy = exports.ConnectionError = exports.ConnectionErrors = exports.LogTraceNotification = exports.SetTraceNotification = exports.TraceFormat = exports.Trace = exports.NullLogger = exports.ProgressType = void 0;\nconst ral_1 = require(\"./ral\");\nconst Is = require(\"./is\");\nconst messages_1 = require(\"./messages\");\nconst linkedMap_1 = require(\"./linkedMap\");\nconst events_1 = require(\"./events\");\nconst cancellation_1 = require(\"./cancellation\");\nvar CancelNotification;\n(function (CancelNotification) {\n CancelNotification.type = new messages_1.NotificationType('$/cancelRequest');\n})(CancelNotification || (CancelNotification = {}));\nvar ProgressNotification;\n(function (ProgressNotification) {\n ProgressNotification.type = new messages_1.NotificationType('$/progress');\n})(ProgressNotification || (ProgressNotification = {}));\nclass ProgressType {\n constructor() {\n }\n}\nexports.ProgressType = ProgressType;\nvar StarRequestHandler;\n(function (StarRequestHandler) {\n function is(value) {\n return Is.func(value);\n }\n StarRequestHandler.is = is;\n})(StarRequestHandler || (StarRequestHandler = {}));\nexports.NullLogger = Object.freeze({\n error: () => { },\n warn: () => { },\n info: () => { },\n log: () => { }\n});\nvar Trace;\n(function (Trace) {\n Trace[Trace[\"Off\"] = 0] = \"Off\";\n Trace[Trace[\"Messages\"] = 1] = \"Messages\";\n Trace[Trace[\"Verbose\"] = 2] = \"Verbose\";\n})(Trace = exports.Trace || (exports.Trace = {}));\n(function (Trace) {\n function fromString(value) {\n if (!Is.string(value)) {\n return Trace.Off;\n }\n value = value.toLowerCase();\n switch (value) {\n case 'off':\n return Trace.Off;\n case 'messages':\n return Trace.Messages;\n case 'verbose':\n return Trace.Verbose;\n default:\n return Trace.Off;\n }\n }\n Trace.fromString = fromString;\n function toString(value) {\n switch (value) {\n case Trace.Off:\n return 'off';\n case Trace.Messages:\n return 'messages';\n case Trace.Verbose:\n return 'verbose';\n default:\n return 'off';\n }\n }\n Trace.toString = toString;\n})(Trace = exports.Trace || (exports.Trace = {}));\nvar TraceFormat;\n(function (TraceFormat) {\n TraceFormat[\"Text\"] = \"text\";\n TraceFormat[\"JSON\"] = \"json\";\n})(TraceFormat = exports.TraceFormat || (exports.TraceFormat = {}));\n(function (TraceFormat) {\n function fromString(value) {\n value = value.toLowerCase();\n if (value === 'json') {\n return TraceFormat.JSON;\n }\n else {\n return TraceFormat.Text;\n }\n }\n TraceFormat.fromString = fromString;\n})(TraceFormat = exports.TraceFormat || (exports.TraceFormat = {}));\nvar SetTraceNotification;\n(function (SetTraceNotification) {\n SetTraceNotification.type = new messages_1.NotificationType('$/setTrace');\n})(SetTraceNotification = exports.SetTraceNotification || (exports.SetTraceNotification = {}));\nvar LogTraceNotification;\n(function (LogTraceNotification) {\n LogTraceNotification.type = new messages_1.NotificationType('$/logTrace');\n})(LogTraceNotification = exports.LogTraceNotification || (exports.LogTraceNotification = {}));\nvar ConnectionErrors;\n(function (ConnectionErrors) {\n /**\n * The connection is closed.\n */\n ConnectionErrors[ConnectionErrors[\"Closed\"] = 1] = \"Closed\";\n /**\n * The connection got disposed.\n */\n ConnectionErrors[ConnectionErrors[\"Disposed\"] = 2] = \"Disposed\";\n /**\n * The connection is already in listening mode.\n */\n ConnectionErrors[ConnectionErrors[\"AlreadyListening\"] = 3] = \"AlreadyListening\";\n})(ConnectionErrors = exports.ConnectionErrors || (exports.ConnectionErrors = {}));\nclass ConnectionError extends Error {\n constructor(code, message) {\n super(message);\n this.code = code;\n Object.setPrototypeOf(this, ConnectionError.prototype);\n }\n}\nexports.ConnectionError = ConnectionError;\nvar ConnectionStrategy;\n(function (ConnectionStrategy) {\n function is(value) {\n const candidate = value;\n return candidate && Is.func(candidate.cancelUndispatched);\n }\n ConnectionStrategy.is = is;\n})(ConnectionStrategy = exports.ConnectionStrategy || (exports.ConnectionStrategy = {}));\nvar CancellationReceiverStrategy;\n(function (CancellationReceiverStrategy) {\n CancellationReceiverStrategy.Message = Object.freeze({\n createCancellationTokenSource(_) {\n return new cancellation_1.CancellationTokenSource();\n }\n });\n function is(value) {\n const candidate = value;\n return candidate && Is.func(candidate.createCancellationTokenSource);\n }\n CancellationReceiverStrategy.is = is;\n})(CancellationReceiverStrategy = exports.CancellationReceiverStrategy || (exports.CancellationReceiverStrategy = {}));\nvar CancellationSenderStrategy;\n(function (CancellationSenderStrategy) {\n CancellationSenderStrategy.Message = Object.freeze({\n sendCancellation(conn, id) {\n conn.sendNotification(CancelNotification.type, { id });\n },\n cleanup(_) { }\n });\n function is(value) {\n const candidate = value;\n return candidate && Is.func(candidate.sendCancellation) && Is.func(candidate.cleanup);\n }\n CancellationSenderStrategy.is = is;\n})(CancellationSenderStrategy = exports.CancellationSenderStrategy || (exports.CancellationSenderStrategy = {}));\nvar CancellationStrategy;\n(function (CancellationStrategy) {\n CancellationStrategy.Message = Object.freeze({\n receiver: CancellationReceiverStrategy.Message,\n sender: CancellationSenderStrategy.Message\n });\n function is(value) {\n const candidate = value;\n return candidate && CancellationReceiverStrategy.is(candidate.receiver) && CancellationSenderStrategy.is(candidate.sender);\n }\n CancellationStrategy.is = is;\n})(CancellationStrategy = exports.CancellationStrategy || (exports.CancellationStrategy = {}));\nvar ConnectionOptions;\n(function (ConnectionOptions) {\n function is(value) {\n const candidate = value;\n return candidate && (CancellationStrategy.is(candidate.cancellationStrategy) || ConnectionStrategy.is(candidate.connectionStrategy));\n }\n ConnectionOptions.is = is;\n})(ConnectionOptions = exports.ConnectionOptions || (exports.ConnectionOptions = {}));\nvar ConnectionState;\n(function (ConnectionState) {\n ConnectionState[ConnectionState[\"New\"] = 1] = \"New\";\n ConnectionState[ConnectionState[\"Listening\"] = 2] = \"Listening\";\n ConnectionState[ConnectionState[\"Closed\"] = 3] = \"Closed\";\n ConnectionState[ConnectionState[\"Disposed\"] = 4] = \"Disposed\";\n})(ConnectionState || (ConnectionState = {}));\nfunction createMessageConnection(messageReader, messageWriter, _logger, options) {\n const logger = _logger !== undefined ? _logger : exports.NullLogger;\n let sequenceNumber = 0;\n let notificationSquenceNumber = 0;\n let unknownResponseSquenceNumber = 0;\n const version = '2.0';\n let starRequestHandler = undefined;\n const requestHandlers = Object.create(null);\n let starNotificationHandler = undefined;\n const notificationHandlers = Object.create(null);\n const progressHandlers = new Map();\n let timer;\n let messageQueue = new linkedMap_1.LinkedMap();\n let responsePromises = Object.create(null);\n let requestTokens = Object.create(null);\n let trace = Trace.Off;\n let traceFormat = TraceFormat.Text;\n let tracer;\n let state = ConnectionState.New;\n const errorEmitter = new events_1.Emitter();\n const closeEmitter = new events_1.Emitter();\n const unhandledNotificationEmitter = new events_1.Emitter();\n const unhandledProgressEmitter = new events_1.Emitter();\n const disposeEmitter = new events_1.Emitter();\n const cancellationStrategy = (options && options.cancellationStrategy) ? options.cancellationStrategy : CancellationStrategy.Message;\n function createRequestQueueKey(id) {\n if (id === null) {\n throw new Error(`Can't send requests with id null since the response can't be correlated.`);\n }\n return 'req-' + id.toString();\n }\n function createResponseQueueKey(id) {\n if (id === null) {\n return 'res-unknown-' + (++unknownResponseSquenceNumber).toString();\n }\n else {\n return 'res-' + id.toString();\n }\n }\n function createNotificationQueueKey() {\n return 'not-' + (++notificationSquenceNumber).toString();\n }\n function addMessageToQueue(queue, message) {\n if (messages_1.isRequestMessage(message)) {\n queue.set(createRequestQueueKey(message.id), message);\n }\n else if (messages_1.isResponseMessage(message)) {\n queue.set(createResponseQueueKey(message.id), message);\n }\n else {\n queue.set(createNotificationQueueKey(), message);\n }\n }\n function cancelUndispatched(_message) {\n return undefined;\n }\n function isListening() {\n return state === ConnectionState.Listening;\n }\n function isClosed() {\n return state === ConnectionState.Closed;\n }\n function isDisposed() {\n return state === ConnectionState.Disposed;\n }\n function closeHandler() {\n if (state === ConnectionState.New || state === ConnectionState.Listening) {\n state = ConnectionState.Closed;\n closeEmitter.fire(undefined);\n }\n // If the connection is disposed don't sent close events.\n }\n function readErrorHandler(error) {\n errorEmitter.fire([error, undefined, undefined]);\n }\n function writeErrorHandler(data) {\n errorEmitter.fire(data);\n }\n messageReader.onClose(closeHandler);\n messageReader.onError(readErrorHandler);\n messageWriter.onClose(closeHandler);\n messageWriter.onError(writeErrorHandler);\n function triggerMessageQueue() {\n if (timer || messageQueue.size === 0) {\n return;\n }\n timer = ral_1.default().timer.setImmediate(() => {\n timer = undefined;\n processMessageQueue();\n });\n }\n function processMessageQueue() {\n if (messageQueue.size === 0) {\n return;\n }\n const message = messageQueue.shift();\n try {\n if (messages_1.isRequestMessage(message)) {\n handleRequest(message);\n }\n else if (messages_1.isNotificationMessage(message)) {\n handleNotification(message);\n }\n else if (messages_1.isResponseMessage(message)) {\n handleResponse(message);\n }\n else {\n handleInvalidMessage(message);\n }\n }\n finally {\n triggerMessageQueue();\n }\n }\n const callback = (message) => {\n try {\n // We have received a cancellation message. Check if the message is still in the queue\n // and cancel it if allowed to do so.\n if (messages_1.isNotificationMessage(message) && message.method === CancelNotification.type.method) {\n const key = createRequestQueueKey(message.params.id);\n const toCancel = messageQueue.get(key);\n if (messages_1.isRequestMessage(toCancel)) {\n const strategy = options === null || options === void 0 ? void 0 : options.connectionStrategy;\n const response = (strategy && strategy.cancelUndispatched) ? strategy.cancelUndispatched(toCancel, cancelUndispatched) : cancelUndispatched(toCancel);\n if (response && (response.error !== undefined || response.result !== undefined)) {\n messageQueue.delete(key);\n response.id = toCancel.id;\n traceSendingResponse(response, message.method, Date.now());\n messageWriter.write(response);\n return;\n }\n }\n }\n addMessageToQueue(messageQueue, message);\n }\n finally {\n triggerMessageQueue();\n }\n };\n function handleRequest(requestMessage) {\n if (isDisposed()) {\n // we return here silently since we fired an event when the\n // connection got disposed.\n return;\n }\n function reply(resultOrError, method, startTime) {\n const message = {\n jsonrpc: version,\n id: requestMessage.id\n };\n if (resultOrError instanceof messages_1.ResponseError) {\n message.error = resultOrError.toJson();\n }\n else {\n message.result = resultOrError === undefined ? null : resultOrError;\n }\n traceSendingResponse(message, method, startTime);\n messageWriter.write(message);\n }\n function replyError(error, method, startTime) {\n const message = {\n jsonrpc: version,\n id: requestMessage.id,\n error: error.toJson()\n };\n traceSendingResponse(message, method, startTime);\n messageWriter.write(message);\n }\n function replySuccess(result, method, startTime) {\n // The JSON RPC defines that a response must either have a result or an error\n // So we can't treat undefined as a valid response result.\n if (result === undefined) {\n result = null;\n }\n const message = {\n jsonrpc: version,\n id: requestMessage.id,\n result: result\n };\n traceSendingResponse(message, method, startTime);\n messageWriter.write(message);\n }\n traceReceivedRequest(requestMessage);\n const element = requestHandlers[requestMessage.method];\n let type;\n let requestHandler;\n if (element) {\n type = element.type;\n requestHandler = element.handler;\n }\n const startTime = Date.now();\n if (requestHandler || starRequestHandler) {\n const tokenKey = String(requestMessage.id);\n const cancellationSource = cancellationStrategy.receiver.createCancellationTokenSource(tokenKey);\n requestTokens[tokenKey] = cancellationSource;\n try {\n let handlerResult;\n if (requestHandler) {\n if (requestMessage.params === undefined) {\n if (type !== undefined && type.numberOfParams !== 0) {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InvalidParams, `Request ${requestMessage.method} defines ${type.numberOfParams} params but recevied none.`), requestMessage.method, startTime);\n return;\n }\n handlerResult = requestHandler(cancellationSource.token);\n }\n else if (Array.isArray(requestMessage.params)) {\n if (type !== undefined && type.parameterStructures === messages_1.ParameterStructures.byName) {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InvalidParams, `Request ${requestMessage.method} defines parameters by name but received parameters by position`), requestMessage.method, startTime);\n return;\n }\n handlerResult = requestHandler(...requestMessage.params, cancellationSource.token);\n }\n else {\n if (type !== undefined && type.parameterStructures === messages_1.ParameterStructures.byPosition) {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InvalidParams, `Request ${requestMessage.method} defines parameters by position but received parameters by name`), requestMessage.method, startTime);\n return;\n }\n handlerResult = requestHandler(requestMessage.params, cancellationSource.token);\n }\n }\n else if (starRequestHandler) {\n handlerResult = starRequestHandler(requestMessage.method, requestMessage.params, cancellationSource.token);\n }\n const promise = handlerResult;\n if (!handlerResult) {\n delete requestTokens[tokenKey];\n replySuccess(handlerResult, requestMessage.method, startTime);\n }\n else if (promise.then) {\n promise.then((resultOrError) => {\n delete requestTokens[tokenKey];\n reply(resultOrError, requestMessage.method, startTime);\n }, error => {\n delete requestTokens[tokenKey];\n if (error instanceof messages_1.ResponseError) {\n replyError(error, requestMessage.method, startTime);\n }\n else if (error && Is.string(error.message)) {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed with message: ${error.message}`), requestMessage.method, startTime);\n }\n else {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`), requestMessage.method, startTime);\n }\n });\n }\n else {\n delete requestTokens[tokenKey];\n reply(handlerResult, requestMessage.method, startTime);\n }\n }\n catch (error) {\n delete requestTokens[tokenKey];\n if (error instanceof messages_1.ResponseError) {\n reply(error, requestMessage.method, startTime);\n }\n else if (error && Is.string(error.message)) {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed with message: ${error.message}`), requestMessage.method, startTime);\n }\n else {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`), requestMessage.method, startTime);\n }\n }\n }\n else {\n replyError(new messages_1.ResponseError(messages_1.ErrorCodes.MethodNotFound, `Unhandled method ${requestMessage.method}`), requestMessage.method, startTime);\n }\n }\n function handleResponse(responseMessage) {\n if (isDisposed()) {\n // See handle request.\n return;\n }\n if (responseMessage.id === null) {\n if (responseMessage.error) {\n logger.error(`Received response message without id: Error is: \\n${JSON.stringify(responseMessage.error, undefined, 4)}`);\n }\n else {\n logger.error(`Received response message without id. No further error information provided.`);\n }\n }\n else {\n const key = String(responseMessage.id);\n const responsePromise = responsePromises[key];\n traceReceivedResponse(responseMessage, responsePromise);\n if (responsePromise) {\n delete responsePromises[key];\n try {\n if (responseMessage.error) {\n const error = responseMessage.error;\n responsePromise.reject(new messages_1.ResponseError(error.code, error.message, error.data));\n }\n else if (responseMessage.result !== undefined) {\n responsePromise.resolve(responseMessage.result);\n }\n else {\n throw new Error('Should never happen.');\n }\n }\n catch (error) {\n if (error.message) {\n logger.error(`Response handler '${responsePromise.method}' failed with message: ${error.message}`);\n }\n else {\n logger.error(`Response handler '${responsePromise.method}' failed unexpectedly.`);\n }\n }\n }\n }\n }\n function handleNotification(message) {\n if (isDisposed()) {\n // See handle request.\n return;\n }\n let type = undefined;\n let notificationHandler;\n if (message.method === CancelNotification.type.method) {\n notificationHandler = (params) => {\n const id = params.id;\n const source = requestTokens[String(id)];\n if (source) {\n source.cancel();\n }\n };\n }\n else {\n const element = notificationHandlers[message.method];\n if (element) {\n notificationHandler = element.handler;\n type = element.type;\n }\n }\n if (notificationHandler || starNotificationHandler) {\n try {\n traceReceivedNotification(message);\n if (notificationHandler) {\n if (message.params === undefined) {\n if (type !== undefined) {\n if (type.numberOfParams !== 0 && type.parameterStructures !== messages_1.ParameterStructures.byName) {\n logger.error(`Notification ${message.method} defines ${type.numberOfParams} params but recevied none.`);\n }\n }\n notificationHandler();\n }\n else if (Array.isArray(message.params)) {\n if (type !== undefined) {\n if (type.parameterStructures === messages_1.ParameterStructures.byName) {\n logger.error(`Notification ${message.method} defines parameters by name but received parameters by position`);\n }\n if (type.numberOfParams !== message.params.length) {\n logger.error(`Notification ${message.method} defines ${type.numberOfParams} params but received ${message.params.length} argumennts`);\n }\n }\n notificationHandler(...message.params);\n }\n else {\n if (type !== undefined && type.parameterStructures === messages_1.ParameterStructures.byPosition) {\n logger.error(`Notification ${message.method} defines parameters by position but received parameters by name`);\n }\n notificationHandler(message.params);\n }\n }\n else if (starNotificationHandler) {\n starNotificationHandler(message.method, message.params);\n }\n }\n catch (error) {\n if (error.message) {\n logger.error(`Notification handler '${message.method}' failed with message: ${error.message}`);\n }\n else {\n logger.error(`Notification handler '${message.method}' failed unexpectedly.`);\n }\n }\n }\n else {\n unhandledNotificationEmitter.fire(message);\n }\n }\n function handleInvalidMessage(message) {\n if (!message) {\n logger.error('Received empty message.');\n return;\n }\n logger.error(`Received message which is neither a response nor a notification message:\\n${JSON.stringify(message, null, 4)}`);\n // Test whether we find an id to reject the promise\n const responseMessage = message;\n if (Is.string(responseMessage.id) || Is.number(responseMessage.id)) {\n const key = String(responseMessage.id);\n const responseHandler = responsePromises[key];\n if (responseHandler) {\n responseHandler.reject(new Error('The received response has neither a result nor an error property.'));\n }\n }\n }\n function traceSendingRequest(message) {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if (trace === Trace.Verbose && message.params) {\n data = `Params: ${JSON.stringify(message.params, null, 4)}\\n\\n`;\n }\n tracer.log(`Sending request '${message.method} - (${message.id})'.`, data);\n }\n else {\n logLSPMessage('send-request', message);\n }\n }\n function traceSendingNotification(message) {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if (trace === Trace.Verbose) {\n if (message.params) {\n data = `Params: ${JSON.stringify(message.params, null, 4)}\\n\\n`;\n }\n else {\n data = 'No parameters provided.\\n\\n';\n }\n }\n tracer.log(`Sending notification '${message.method}'.`, data);\n }\n else {\n logLSPMessage('send-notification', message);\n }\n }\n function traceSendingResponse(message, method, startTime) {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if (trace === Trace.Verbose) {\n if (message.error && message.error.data) {\n data = `Error data: ${JSON.stringify(message.error.data, null, 4)}\\n\\n`;\n }\n else {\n if (message.result) {\n data = `Result: ${JSON.stringify(message.result, null, 4)}\\n\\n`;\n }\n else if (message.error === undefined) {\n data = 'No result returned.\\n\\n';\n }\n }\n }\n tracer.log(`Sending response '${method} - (${message.id})'. Processing request took ${Date.now() - startTime}ms`, data);\n }\n else {\n logLSPMessage('send-response', message);\n }\n }\n function traceReceivedRequest(message) {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if (trace === Trace.Verbose && message.params) {\n data = `Params: ${JSON.stringify(message.params, null, 4)}\\n\\n`;\n }\n tracer.log(`Received request '${message.method} - (${message.id})'.`, data);\n }\n else {\n logLSPMessage('receive-request', message);\n }\n }\n function traceReceivedNotification(message) {\n if (trace === Trace.Off || !tracer || message.method === LogTraceNotification.type.method) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if (trace === Trace.Verbose) {\n if (message.params) {\n data = `Params: ${JSON.stringify(message.params, null, 4)}\\n\\n`;\n }\n else {\n data = 'No parameters provided.\\n\\n';\n }\n }\n tracer.log(`Received notification '${message.method}'.`, data);\n }\n else {\n logLSPMessage('receive-notification', message);\n }\n }\n function traceReceivedResponse(message, responsePromise) {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n if (traceFormat === TraceFormat.Text) {\n let data = undefined;\n if (trace === Trace.Verbose) {\n if (message.error && message.error.data) {\n data = `Error data: ${JSON.stringify(message.error.data, null, 4)}\\n\\n`;\n }\n else {\n if (message.result) {\n data = `Result: ${JSON.stringify(message.result, null, 4)}\\n\\n`;\n }\n else if (message.error === undefined) {\n data = 'No result returned.\\n\\n';\n }\n }\n }\n if (responsePromise) {\n const error = message.error ? ` Request failed: ${message.error.message} (${message.error.code}).` : '';\n tracer.log(`Received response '${responsePromise.method} - (${message.id})' in ${Date.now() - responsePromise.timerStart}ms.${error}`, data);\n }\n else {\n tracer.log(`Received response ${message.id} without active response promise.`, data);\n }\n }\n else {\n logLSPMessage('receive-response', message);\n }\n }\n function logLSPMessage(type, message) {\n if (!tracer || trace === Trace.Off) {\n return;\n }\n const lspMessage = {\n isLSPMessage: true,\n type,\n message,\n timestamp: Date.now()\n };\n tracer.log(lspMessage);\n }\n function throwIfClosedOrDisposed() {\n if (isClosed()) {\n throw new ConnectionError(ConnectionErrors.Closed, 'Connection is closed.');\n }\n if (isDisposed()) {\n throw new ConnectionError(ConnectionErrors.Disposed, 'Connection is disposed.');\n }\n }\n function throwIfListening() {\n if (isListening()) {\n throw new ConnectionError(ConnectionErrors.AlreadyListening, 'Connection is already listening');\n }\n }\n function throwIfNotListening() {\n if (!isListening()) {\n throw new Error('Call listen() first.');\n }\n }\n function undefinedToNull(param) {\n if (param === undefined) {\n return null;\n }\n else {\n return param;\n }\n }\n function nullToUndefined(param) {\n if (param === null) {\n return undefined;\n }\n else {\n return param;\n }\n }\n function isNamedParam(param) {\n return param !== undefined && param !== null && !Array.isArray(param) && typeof param === 'object';\n }\n function computeSingleParam(parameterStructures, param) {\n switch (parameterStructures) {\n case messages_1.ParameterStructures.auto:\n if (isNamedParam(param)) {\n return nullToUndefined(param);\n }\n else {\n return [undefinedToNull(param)];\n }\n break;\n case messages_1.ParameterStructures.byName:\n if (!isNamedParam(param)) {\n throw new Error(`Recevied parameters by name but param is not an object literal.`);\n }\n return nullToUndefined(param);\n case messages_1.ParameterStructures.byPosition:\n return [undefinedToNull(param)];\n default:\n throw new Error(`Unknown parameter structure ${parameterStructures.toString()}`);\n }\n }\n function computeMessageParams(type, params) {\n let result;\n const numberOfParams = type.numberOfParams;\n switch (numberOfParams) {\n case 0:\n result = undefined;\n break;\n case 1:\n result = computeSingleParam(type.parameterStructures, params[0]);\n break;\n default:\n result = [];\n for (let i = 0; i < params.length && i < numberOfParams; i++) {\n result.push(undefinedToNull(params[i]));\n }\n if (params.length < numberOfParams) {\n for (let i = params.length; i < numberOfParams; i++) {\n result.push(null);\n }\n }\n break;\n }\n return result;\n }\n const connection = {\n sendNotification: (type, ...args) => {\n throwIfClosedOrDisposed();\n let method;\n let messageParams;\n if (Is.string(type)) {\n method = type;\n const first = args[0];\n let paramStart = 0;\n let parameterStructures = messages_1.ParameterStructures.auto;\n if (messages_1.ParameterStructures.is(first)) {\n paramStart = 1;\n parameterStructures = first;\n }\n let paramEnd = args.length;\n const numberOfParams = paramEnd - paramStart;\n switch (numberOfParams) {\n case 0:\n messageParams = undefined;\n break;\n case 1:\n messageParams = computeSingleParam(parameterStructures, args[paramStart]);\n break;\n default:\n if (parameterStructures === messages_1.ParameterStructures.byName) {\n throw new Error(`Recevied ${numberOfParams} parameters for 'by Name' notification parameter structure.`);\n }\n messageParams = args.slice(paramStart, paramEnd).map(value => undefinedToNull(value));\n break;\n }\n }\n else {\n const params = args;\n method = type.method;\n messageParams = computeMessageParams(type, params);\n }\n const notificationMessage = {\n jsonrpc: version,\n method: method,\n params: messageParams\n };\n traceSendingNotification(notificationMessage);\n messageWriter.write(notificationMessage);\n },\n onNotification: (type, handler) => {\n throwIfClosedOrDisposed();\n let method;\n if (Is.func(type)) {\n starNotificationHandler = type;\n }\n else if (handler) {\n if (Is.string(type)) {\n method = type;\n notificationHandlers[type] = { type: undefined, handler };\n }\n else {\n method = type.method;\n notificationHandlers[type.method] = { type, handler };\n }\n }\n return {\n dispose: () => {\n if (method !== undefined) {\n delete notificationHandlers[method];\n }\n else {\n starNotificationHandler = undefined;\n }\n }\n };\n },\n onProgress: (_type, token, handler) => {\n if (progressHandlers.has(token)) {\n throw new Error(`Progress handler for token ${token} already registered`);\n }\n progressHandlers.set(token, handler);\n return {\n dispose: () => {\n progressHandlers.delete(token);\n }\n };\n },\n sendProgress: (_type, token, value) => {\n connection.sendNotification(ProgressNotification.type, { token, value });\n },\n onUnhandledProgress: unhandledProgressEmitter.event,\n sendRequest: (type, ...args) => {\n throwIfClosedOrDisposed();\n throwIfNotListening();\n let method;\n let messageParams;\n let token = undefined;\n if (Is.string(type)) {\n method = type;\n const first = args[0];\n const last = args[args.length - 1];\n let paramStart = 0;\n let parameterStructures = messages_1.ParameterStructures.auto;\n if (messages_1.ParameterStructures.is(first)) {\n paramStart = 1;\n parameterStructures = first;\n }\n let paramEnd = args.length;\n if (cancellation_1.CancellationToken.is(last)) {\n paramEnd = paramEnd - 1;\n token = last;\n }\n const numberOfParams = paramEnd - paramStart;\n switch (numberOfParams) {\n case 0:\n messageParams = undefined;\n break;\n case 1:\n messageParams = computeSingleParam(parameterStructures, args[paramStart]);\n break;\n default:\n if (parameterStructures === messages_1.ParameterStructures.byName) {\n throw new Error(`Recevied ${numberOfParams} parameters for 'by Name' request parameter structure.`);\n }\n messageParams = args.slice(paramStart, paramEnd).map(value => undefinedToNull(value));\n break;\n }\n }\n else {\n const params = args;\n method = type.method;\n messageParams = computeMessageParams(type, params);\n const numberOfParams = type.numberOfParams;\n token = cancellation_1.CancellationToken.is(params[numberOfParams]) ? params[numberOfParams] : undefined;\n }\n const id = sequenceNumber++;\n let disposable;\n if (token) {\n disposable = token.onCancellationRequested(() => {\n cancellationStrategy.sender.sendCancellation(connection, id);\n });\n }\n const result = new Promise((resolve, reject) => {\n const requestMessage = {\n jsonrpc: version,\n id: id,\n method: method,\n params: messageParams\n };\n const resolveWithCleanup = (r) => {\n resolve(r);\n cancellationStrategy.sender.cleanup(id);\n disposable === null || disposable === void 0 ? void 0 : disposable.dispose();\n };\n const rejectWithCleanup = (r) => {\n reject(r);\n cancellationStrategy.sender.cleanup(id);\n disposable === null || disposable === void 0 ? void 0 : disposable.dispose();\n };\n let responsePromise = { method: method, timerStart: Date.now(), resolve: resolveWithCleanup, reject: rejectWithCleanup };\n traceSendingRequest(requestMessage);\n try {\n messageWriter.write(requestMessage);\n }\n catch (e) {\n // Writing the message failed. So we need to reject the promise.\n responsePromise.reject(new messages_1.ResponseError(messages_1.ErrorCodes.MessageWriteError, e.message ? e.message : 'Unknown reason'));\n responsePromise = null;\n }\n if (responsePromise) {\n responsePromises[String(id)] = responsePromise;\n }\n });\n return result;\n },\n onRequest: (type, handler) => {\n throwIfClosedOrDisposed();\n let method = null;\n if (StarRequestHandler.is(type)) {\n method = undefined;\n starRequestHandler = type;\n }\n else if (Is.string(type)) {\n method = null;\n if (handler !== undefined) {\n method = type;\n requestHandlers[type] = { handler: handler, type: undefined };\n }\n }\n else {\n if (handler !== undefined) {\n method = type.method;\n requestHandlers[type.method] = { type, handler };\n }\n }\n return {\n dispose: () => {\n if (method === null) {\n return;\n }\n if (method !== undefined) {\n delete requestHandlers[method];\n }\n else {\n starRequestHandler = undefined;\n }\n }\n };\n },\n trace: (_value, _tracer, sendNotificationOrTraceOptions) => {\n let _sendNotification = false;\n let _traceFormat = TraceFormat.Text;\n if (sendNotificationOrTraceOptions !== undefined) {\n if (Is.boolean(sendNotificationOrTraceOptions)) {\n _sendNotification = sendNotificationOrTraceOptions;\n }\n else {\n _sendNotification = sendNotificationOrTraceOptions.sendNotification || false;\n _traceFormat = sendNotificationOrTraceOptions.traceFormat || TraceFormat.Text;\n }\n }\n trace = _value;\n traceFormat = _traceFormat;\n if (trace === Trace.Off) {\n tracer = undefined;\n }\n else {\n tracer = _tracer;\n }\n if (_sendNotification && !isClosed() && !isDisposed()) {\n connection.sendNotification(SetTraceNotification.type, { value: Trace.toString(_value) });\n }\n },\n onError: errorEmitter.event,\n onClose: closeEmitter.event,\n onUnhandledNotification: unhandledNotificationEmitter.event,\n onDispose: disposeEmitter.event,\n end: () => {\n messageWriter.end();\n },\n dispose: () => {\n if (isDisposed()) {\n return;\n }\n state = ConnectionState.Disposed;\n disposeEmitter.fire(undefined);\n const error = new Error('Connection got disposed.');\n Object.keys(responsePromises).forEach((key) => {\n responsePromises[key].reject(error);\n });\n responsePromises = Object.create(null);\n requestTokens = Object.create(null);\n messageQueue = new linkedMap_1.LinkedMap();\n // Test for backwards compatibility\n if (Is.func(messageWriter.dispose)) {\n messageWriter.dispose();\n }\n if (Is.func(messageReader.dispose)) {\n messageReader.dispose();\n }\n },\n listen: () => {\n throwIfClosedOrDisposed();\n throwIfListening();\n state = ConnectionState.Listening;\n messageReader.listen(callback);\n },\n inspect: () => {\n // eslint-disable-next-line no-console\n ral_1.default().console.log('inspect');\n }\n };\n connection.onNotification(LogTraceNotification.type, (params) => {\n if (trace === Trace.Off || !tracer) {\n return;\n }\n tracer.log(params.message, trace === Trace.Verbose ? params.verbose : undefined);\n });\n connection.onNotification(ProgressNotification.type, (params) => {\n const handler = progressHandlers.get(params.token);\n if (handler) {\n handler(params.value);\n }\n else {\n unhandledProgressEmitter.fire(params);\n }\n });\n return connection;\n}\nexports.createMessageConnection = createMessageConnection;\n//# sourceMappingURL=connection.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\n/// <reference path=\"../../typings/thenable.d.ts\" />\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CancellationSenderStrategy = exports.CancellationReceiverStrategy = exports.ConnectionError = exports.ConnectionErrors = exports.LogTraceNotification = exports.SetTraceNotification = exports.TraceFormat = exports.Trace = exports.ProgressType = exports.createMessageConnection = exports.NullLogger = exports.ConnectionOptions = exports.ConnectionStrategy = exports.WriteableStreamMessageWriter = exports.AbstractMessageWriter = exports.MessageWriter = exports.ReadableStreamMessageReader = exports.AbstractMessageReader = exports.MessageReader = exports.CancellationToken = exports.CancellationTokenSource = exports.Emitter = exports.Event = exports.Disposable = exports.ParameterStructures = exports.NotificationType9 = exports.NotificationType8 = exports.NotificationType7 = exports.NotificationType6 = exports.NotificationType5 = exports.NotificationType4 = exports.NotificationType3 = exports.NotificationType2 = exports.NotificationType1 = exports.NotificationType0 = exports.NotificationType = exports.ErrorCodes = exports.ResponseError = exports.RequestType9 = exports.RequestType8 = exports.RequestType7 = exports.RequestType6 = exports.RequestType5 = exports.RequestType4 = exports.RequestType3 = exports.RequestType2 = exports.RequestType1 = exports.RequestType0 = exports.RequestType = exports.RAL = void 0;\nexports.CancellationStrategy = void 0;\nconst messages_1 = require(\"../common/messages\");\nObject.defineProperty(exports, \"RequestType\", { enumerable: true, get: function () { return messages_1.RequestType; } });\nObject.defineProperty(exports, \"RequestType0\", { enumerable: true, get: function () { return messages_1.RequestType0; } });\nObject.defineProperty(exports, \"RequestType1\", { enumerable: true, get: function () { return messages_1.RequestType1; } });\nObject.defineProperty(exports, \"RequestType2\", { enumerable: true, get: function () { return messages_1.RequestType2; } });\nObject.defineProperty(exports, \"RequestType3\", { enumerable: true, get: function () { return messages_1.RequestType3; } });\nObject.defineProperty(exports, \"RequestType4\", { enumerable: true, get: function () { return messages_1.RequestType4; } });\nObject.defineProperty(exports, \"RequestType5\", { enumerable: true, get: function () { return messages_1.RequestType5; } });\nObject.defineProperty(exports, \"RequestType6\", { enumerable: true, get: function () { return messages_1.RequestType6; } });\nObject.defineProperty(exports, \"RequestType7\", { enumerable: true, get: function () { return messages_1.RequestType7; } });\nObject.defineProperty(exports, \"RequestType8\", { enumerable: true, get: function () { return messages_1.RequestType8; } });\nObject.defineProperty(exports, \"RequestType9\", { enumerable: true, get: function () { return messages_1.RequestType9; } });\nObject.defineProperty(exports, \"ResponseError\", { enumerable: true, get: function () { return messages_1.ResponseError; } });\nObject.defineProperty(exports, \"ErrorCodes\", { enumerable: true, get: function () { return messages_1.ErrorCodes; } });\nObject.defineProperty(exports, \"NotificationType\", { enumerable: true, get: function () { return messages_1.NotificationType; } });\nObject.defineProperty(exports, \"NotificationType0\", { enumerable: true, get: function () { return messages_1.NotificationType0; } });\nObject.defineProperty(exports, \"NotificationType1\", { enumerable: true, get: function () { return messages_1.NotificationType1; } });\nObject.defineProperty(exports, \"NotificationType2\", { enumerable: true, get: function () { return messages_1.NotificationType2; } });\nObject.defineProperty(exports, \"NotificationType3\", { enumerable: true, get: function () { return messages_1.NotificationType3; } });\nObject.defineProperty(exports, \"NotificationType4\", { enumerable: true, get: function () { return messages_1.NotificationType4; } });\nObject.defineProperty(exports, \"NotificationType5\", { enumerable: true, get: function () { return messages_1.NotificationType5; } });\nObject.defineProperty(exports, \"NotificationType6\", { enumerable: true, get: function () { return messages_1.NotificationType6; } });\nObject.defineProperty(exports, \"NotificationType7\", { enumerable: true, get: function () { return messages_1.NotificationType7; } });\nObject.defineProperty(exports, \"NotificationType8\", { enumerable: true, get: function () { return messages_1.NotificationType8; } });\nObject.defineProperty(exports, \"NotificationType9\", { enumerable: true, get: function () { return messages_1.NotificationType9; } });\nObject.defineProperty(exports, \"ParameterStructures\", { enumerable: true, get: function () { return messages_1.ParameterStructures; } });\nconst disposable_1 = require(\"../common/disposable\");\nObject.defineProperty(exports, \"Disposable\", { enumerable: true, get: function () { return disposable_1.Disposable; } });\nconst events_1 = require(\"../common/events\");\nObject.defineProperty(exports, \"Event\", { enumerable: true, get: function () { return events_1.Event; } });\nObject.defineProperty(exports, \"Emitter\", { enumerable: true, get: function () { return events_1.Emitter; } });\nconst cancellation_1 = require(\"../common/cancellation\");\nObject.defineProperty(exports, \"CancellationTokenSource\", { enumerable: true, get: function () { return cancellation_1.CancellationTokenSource; } });\nObject.defineProperty(exports, \"CancellationToken\", { enumerable: true, get: function () { return cancellation_1.CancellationToken; } });\nconst messageReader_1 = require(\"../common/messageReader\");\nObject.defineProperty(exports, \"MessageReader\", { enumerable: true, get: function () { return messageReader_1.MessageReader; } });\nObject.defineProperty(exports, \"AbstractMessageReader\", { enumerable: true, get: function () { return messageReader_1.AbstractMessageReader; } });\nObject.defineProperty(exports, \"ReadableStreamMessageReader\", { enumerable: true, get: function () { return messageReader_1.ReadableStreamMessageReader; } });\nconst messageWriter_1 = require(\"../common/messageWriter\");\nObject.defineProperty(exports, \"MessageWriter\", { enumerable: true, get: function () { return messageWriter_1.MessageWriter; } });\nObject.defineProperty(exports, \"AbstractMessageWriter\", { enumerable: true, get: function () { return messageWriter_1.AbstractMessageWriter; } });\nObject.defineProperty(exports, \"WriteableStreamMessageWriter\", { enumerable: true, get: function () { return messageWriter_1.WriteableStreamMessageWriter; } });\nconst connection_1 = require(\"../common/connection\");\nObject.defineProperty(exports, \"ConnectionStrategy\", { enumerable: true, get: function () { return connection_1.ConnectionStrategy; } });\nObject.defineProperty(exports, \"ConnectionOptions\", { enumerable: true, get: function () { return connection_1.ConnectionOptions; } });\nObject.defineProperty(exports, \"NullLogger\", { enumerable: true, get: function () { return connection_1.NullLogger; } });\nObject.defineProperty(exports, \"createMessageConnection\", { enumerable: true, get: function () { return connection_1.createMessageConnection; } });\nObject.defineProperty(exports, \"ProgressType\", { enumerable: true, get: function () { return connection_1.ProgressType; } });\nObject.defineProperty(exports, \"Trace\", { enumerable: true, get: function () { return connection_1.Trace; } });\nObject.defineProperty(exports, \"TraceFormat\", { enumerable: true, get: function () { return connection_1.TraceFormat; } });\nObject.defineProperty(exports, \"SetTraceNotification\", { enumerable: true, get: function () { return connection_1.SetTraceNotification; } });\nObject.defineProperty(exports, \"LogTraceNotification\", { enumerable: true, get: function () { return connection_1.LogTraceNotification; } });\nObject.defineProperty(exports, \"ConnectionErrors\", { enumerable: true, get: function () { return connection_1.ConnectionErrors; } });\nObject.defineProperty(exports, \"ConnectionError\", { enumerable: true, get: function () { return connection_1.ConnectionError; } });\nObject.defineProperty(exports, \"CancellationReceiverStrategy\", { enumerable: true, get: function () { return connection_1.CancellationReceiverStrategy; } });\nObject.defineProperty(exports, \"CancellationSenderStrategy\", { enumerable: true, get: function () { return connection_1.CancellationSenderStrategy; } });\nObject.defineProperty(exports, \"CancellationStrategy\", { enumerable: true, get: function () { return connection_1.CancellationStrategy; } });\nconst ral_1 = require(\"./ral\");\nexports.RAL = ral_1.default;\n//# sourceMappingURL=api.js.map", "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createMessageConnection = exports.createServerSocketTransport = exports.createClientSocketTransport = exports.createServerPipeTransport = exports.createClientPipeTransport = exports.generateRandomPipeName = exports.StreamMessageWriter = exports.StreamMessageReader = exports.SocketMessageWriter = exports.SocketMessageReader = exports.IPCMessageWriter = exports.IPCMessageReader = void 0;\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ----------------------------------------------------------------------------------------- */\nconst ril_1 = require(\"./ril\");\n// Install the node runtime abstract.\nril_1.default.install();\nconst api_1 = require(\"../common/api\");\nconst path = require(\"path\");\nconst os = require(\"os\");\nconst crypto_1 = require(\"crypto\");\nconst net_1 = require(\"net\");\n__exportStar(require(\"../common/api\"), exports);\nclass IPCMessageReader extends api_1.AbstractMessageReader {\n constructor(process) {\n super();\n this.process = process;\n let eventEmitter = this.process;\n eventEmitter.on('error', (error) => this.fireError(error));\n eventEmitter.on('close', () => this.fireClose());\n }\n listen(callback) {\n this.process.on('message', callback);\n return api_1.Disposable.create(() => this.process.off('message', callback));\n }\n}\nexports.IPCMessageReader = IPCMessageReader;\nclass IPCMessageWriter extends api_1.AbstractMessageWriter {\n constructor(process) {\n super();\n this.process = process;\n this.errorCount = 0;\n let eventEmitter = this.process;\n eventEmitter.on('error', (error) => this.fireError(error));\n eventEmitter.on('close', () => this.fireClose);\n }\n write(msg) {\n try {\n if (typeof this.process.send === 'function') {\n this.process.send(msg, undefined, undefined, (error) => {\n if (error) {\n this.errorCount++;\n this.handleError(error, msg);\n }\n else {\n this.errorCount = 0;\n }\n });\n }\n return Promise.resolve();\n }\n catch (error) {\n this.handleError(error, msg);\n return Promise.reject(error);\n }\n }\n handleError(error, msg) {\n this.errorCount++;\n this.fireError(error, msg, this.errorCount);\n }\n end() {\n }\n}\nexports.IPCMessageWriter = IPCMessageWriter;\nclass SocketMessageReader extends api_1.ReadableStreamMessageReader {\n constructor(socket, encoding = 'utf-8') {\n super(ril_1.default().stream.asReadableStream(socket), encoding);\n }\n}\nexports.SocketMessageReader = SocketMessageReader;\nclass SocketMessageWriter extends api_1.WriteableStreamMessageWriter {\n constructor(socket, options) {\n super(ril_1.default().stream.asWritableStream(socket), options);\n this.socket = socket;\n }\n dispose() {\n super.dispose();\n this.socket.destroy();\n }\n}\nexports.SocketMessageWriter = SocketMessageWriter;\nclass StreamMessageReader extends api_1.ReadableStreamMessageReader {\n constructor(readble, encoding) {\n super(ril_1.default().stream.asReadableStream(readble), encoding);\n }\n}\nexports.StreamMessageReader = StreamMessageReader;\nclass StreamMessageWriter extends api_1.WriteableStreamMessageWriter {\n constructor(writable, options) {\n super(ril_1.default().stream.asWritableStream(writable), options);\n }\n}\nexports.StreamMessageWriter = StreamMessageWriter;\nconst XDG_RUNTIME_DIR = process.env['XDG_RUNTIME_DIR'];\nconst safeIpcPathLengths = new Map([\n ['linux', 107],\n ['darwin', 103]\n]);\nfunction generateRandomPipeName() {\n const randomSuffix = crypto_1.randomBytes(21).toString('hex');\n if (process.platform === 'win32') {\n return `\\\\\\\\.\\\\pipe\\\\vscode-jsonrpc-${randomSuffix}-sock`;\n }\n let result;\n if (XDG_RUNTIME_DIR) {\n result = path.join(XDG_RUNTIME_DIR, `vscode-ipc-${randomSuffix}.sock`);\n }\n else {\n result = path.join(os.tmpdir(), `vscode-${randomSuffix}.sock`);\n }\n const limit = safeIpcPathLengths.get(process.platform);\n if (limit !== undefined && result.length >= limit) {\n ril_1.default().console.warn(`WARNING: IPC handle \"${result}\" is longer than ${limit} characters.`);\n }\n return result;\n}\nexports.generateRandomPipeName = generateRandomPipeName;\nfunction createClientPipeTransport(pipeName, encoding = 'utf-8') {\n let connectResolve;\n const connected = new Promise((resolve, _reject) => {\n connectResolve = resolve;\n });\n return new Promise((resolve, reject) => {\n let server = net_1.createServer((socket) => {\n server.close();\n connectResolve([\n new SocketMessageReader(socket, encoding),\n new SocketMessageWriter(socket, encoding)\n ]);\n });\n server.on('error', reject);\n server.listen(pipeName, () => {\n server.removeListener('error', reject);\n resolve({\n onConnected: () => { return connected; }\n });\n });\n });\n}\nexports.createClientPipeTransport = createClientPipeTransport;\nfunction createServerPipeTransport(pipeName, encoding = 'utf-8') {\n const socket = net_1.createConnection(pipeName);\n return [\n new SocketMessageReader(socket, encoding),\n new SocketMessageWriter(socket, encoding)\n ];\n}\nexports.createServerPipeTransport = createServerPipeTransport;\nfunction createClientSocketTransport(port, encoding = 'utf-8') {\n let connectResolve;\n const connected = new Promise((resolve, _reject) => {\n connectResolve = resolve;\n });\n return new Promise((resolve, reject) => {\n const server = net_1.createServer((socket) => {\n server.close();\n connectResolve([\n new SocketMessageReader(socket, encoding),\n new SocketMessageWriter(socket, encoding)\n ]);\n });\n server.on('error', reject);\n server.listen(port, '127.0.0.1', () => {\n server.removeListener('error', reject);\n resolve({\n onConnected: () => { return connected; }\n });\n });\n });\n}\nexports.createClientSocketTransport = createClientSocketTransport;\nfunction createServerSocketTransport(port, encoding = 'utf-8') {\n const socket = net_1.createConnection(port, '127.0.0.1');\n return [\n new SocketMessageReader(socket, encoding),\n new SocketMessageWriter(socket, encoding)\n ];\n}\nexports.createServerSocketTransport = createServerSocketTransport;\nfunction isReadableStream(value) {\n const candidate = value;\n return candidate.read !== undefined && candidate.addListener !== undefined;\n}\nfunction isWritableStream(value) {\n const candidate = value;\n return candidate.write !== undefined && candidate.addListener !== undefined;\n}\nfunction createMessageConnection(input, output, logger, options) {\n if (!logger) {\n logger = api_1.NullLogger;\n }\n const reader = isReadableStream(input) ? new StreamMessageReader(input) : input;\n const writer = isWritableStream(output) ? new StreamMessageWriter(output) : output;\n if (api_1.ConnectionStrategy.is(options)) {\n options = { connectionStrategy: options };\n }\n return api_1.createMessageConnection(reader, writer, logger, options);\n}\nexports.createMessageConnection = createMessageConnection;\n//# sourceMappingURL=main.js.map", "/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ----------------------------------------------------------------------------------------- */\n'use strict';\n\nmodule.exports = require('./lib/node/main');", "/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\n'use strict';\nexport var integer;\n(function (integer) {\n integer.MIN_VALUE = -2147483648;\n integer.MAX_VALUE = 2147483647;\n})(integer || (integer = {}));\nexport var uinteger;\n(function (uinteger) {\n uinteger.MIN_VALUE = 0;\n uinteger.MAX_VALUE = 2147483647;\n})(uinteger || (uinteger = {}));\n/**\n * The Position namespace provides helper functions to work with\n * [Position](#Position) literals.\n */\nexport var Position;\n(function (Position) {\n /**\n * Creates a new Position literal from the given line and character.\n * @param line The position's line.\n * @param character The position's character.\n */\n function create(line, character) {\n if (line === Number.MAX_VALUE) {\n line = uinteger.MAX_VALUE;\n }\n if (character === Number.MAX_VALUE) {\n character = uinteger.MAX_VALUE;\n }\n return { line: line, character: character };\n }\n Position.create = create;\n /**\n * Checks whether the given literal conforms to the [Position](#Position) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Is.uinteger(candidate.line) && Is.uinteger(candidate.character);\n }\n Position.is = is;\n})(Position || (Position = {}));\n/**\n * The Range namespace provides helper functions to work with\n * [Range](#Range) literals.\n */\nexport var Range;\n(function (Range) {\n function create(one, two, three, four) {\n if (Is.uinteger(one) && Is.uinteger(two) && Is.uinteger(three) && Is.uinteger(four)) {\n return { start: Position.create(one, two), end: Position.create(three, four) };\n }\n else if (Position.is(one) && Position.is(two)) {\n return { start: one, end: two };\n }\n else {\n throw new Error(\"Range#create called with invalid arguments[\" + one + \", \" + two + \", \" + three + \", \" + four + \"]\");\n }\n }\n Range.create = create;\n /**\n * Checks whether the given literal conforms to the [Range](#Range) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Position.is(candidate.start) && Position.is(candidate.end);\n }\n Range.is = is;\n})(Range || (Range = {}));\n/**\n * The Location namespace provides helper functions to work with\n * [Location](#Location) literals.\n */\nexport var Location;\n(function (Location) {\n /**\n * Creates a Location literal.\n * @param uri The location's uri.\n * @param range The location's range.\n */\n function create(uri, range) {\n return { uri: uri, range: range };\n }\n Location.create = create;\n /**\n * Checks whether the given literal conforms to the [Location](#Location) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Range.is(candidate.range) && (Is.string(candidate.uri) || Is.undefined(candidate.uri));\n }\n Location.is = is;\n})(Location || (Location = {}));\n/**\n * The LocationLink namespace provides helper functions to work with\n * [LocationLink](#LocationLink) literals.\n */\nexport var LocationLink;\n(function (LocationLink) {\n /**\n * Creates a LocationLink literal.\n * @param targetUri The definition's uri.\n * @param targetRange The full range of the definition.\n * @param targetSelectionRange The span of the symbol definition at the target.\n * @param originSelectionRange The span of the symbol being defined in the originating source file.\n */\n function create(targetUri, targetRange, targetSelectionRange, originSelectionRange) {\n return { targetUri: targetUri, targetRange: targetRange, targetSelectionRange: targetSelectionRange, originSelectionRange: originSelectionRange };\n }\n LocationLink.create = create;\n /**\n * Checks whether the given literal conforms to the [LocationLink](#LocationLink) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Range.is(candidate.targetRange) && Is.string(candidate.targetUri)\n && (Range.is(candidate.targetSelectionRange) || Is.undefined(candidate.targetSelectionRange))\n && (Range.is(candidate.originSelectionRange) || Is.undefined(candidate.originSelectionRange));\n }\n LocationLink.is = is;\n})(LocationLink || (LocationLink = {}));\n/**\n * The Color namespace provides helper functions to work with\n * [Color](#Color) literals.\n */\nexport var Color;\n(function (Color) {\n /**\n * Creates a new Color literal.\n */\n function create(red, green, blue, alpha) {\n return {\n red: red,\n green: green,\n blue: blue,\n alpha: alpha,\n };\n }\n Color.create = create;\n /**\n * Checks whether the given literal conforms to the [Color](#Color) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.numberRange(candidate.red, 0, 1)\n && Is.numberRange(candidate.green, 0, 1)\n && Is.numberRange(candidate.blue, 0, 1)\n && Is.numberRange(candidate.alpha, 0, 1);\n }\n Color.is = is;\n})(Color || (Color = {}));\n/**\n * The ColorInformation namespace provides helper functions to work with\n * [ColorInformation](#ColorInformation) literals.\n */\nexport var ColorInformation;\n(function (ColorInformation) {\n /**\n * Creates a new ColorInformation literal.\n */\n function create(range, color) {\n return {\n range: range,\n color: color,\n };\n }\n ColorInformation.create = create;\n /**\n * Checks whether the given literal conforms to the [ColorInformation](#ColorInformation) interface.\n */\n function is(value) {\n var candidate = value;\n return Range.is(candidate.range) && Color.is(candidate.color);\n }\n ColorInformation.is = is;\n})(ColorInformation || (ColorInformation = {}));\n/**\n * The Color namespace provides helper functions to work with\n * [ColorPresentation](#ColorPresentation) literals.\n */\nexport var ColorPresentation;\n(function (ColorPresentation) {\n /**\n * Creates a new ColorInformation literal.\n */\n function create(label, textEdit, additionalTextEdits) {\n return {\n label: label,\n textEdit: textEdit,\n additionalTextEdits: additionalTextEdits,\n };\n }\n ColorPresentation.create = create;\n /**\n * Checks whether the given literal conforms to the [ColorInformation](#ColorInformation) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.string(candidate.label)\n && (Is.undefined(candidate.textEdit) || TextEdit.is(candidate))\n && (Is.undefined(candidate.additionalTextEdits) || Is.typedArray(candidate.additionalTextEdits, TextEdit.is));\n }\n ColorPresentation.is = is;\n})(ColorPresentation || (ColorPresentation = {}));\n/**\n * Enum of known range kinds\n */\nexport var FoldingRangeKind;\n(function (FoldingRangeKind) {\n /**\n * Folding range for a comment\n */\n FoldingRangeKind[\"Comment\"] = \"comment\";\n /**\n * Folding range for a imports or includes\n */\n FoldingRangeKind[\"Imports\"] = \"imports\";\n /**\n * Folding range for a region (e.g. `#region`)\n */\n FoldingRangeKind[\"Region\"] = \"region\";\n})(FoldingRangeKind || (FoldingRangeKind = {}));\n/**\n * The folding range namespace provides helper functions to work with\n * [FoldingRange](#FoldingRange) literals.\n */\nexport var FoldingRange;\n(function (FoldingRange) {\n /**\n * Creates a new FoldingRange literal.\n */\n function create(startLine, endLine, startCharacter, endCharacter, kind) {\n var result = {\n startLine: startLine,\n endLine: endLine\n };\n if (Is.defined(startCharacter)) {\n result.startCharacter = startCharacter;\n }\n if (Is.defined(endCharacter)) {\n result.endCharacter = endCharacter;\n }\n if (Is.defined(kind)) {\n result.kind = kind;\n }\n return result;\n }\n FoldingRange.create = create;\n /**\n * Checks whether the given literal conforms to the [FoldingRange](#FoldingRange) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.uinteger(candidate.startLine) && Is.uinteger(candidate.startLine)\n && (Is.undefined(candidate.startCharacter) || Is.uinteger(candidate.startCharacter))\n && (Is.undefined(candidate.endCharacter) || Is.uinteger(candidate.endCharacter))\n && (Is.undefined(candidate.kind) || Is.string(candidate.kind));\n }\n FoldingRange.is = is;\n})(FoldingRange || (FoldingRange = {}));\n/**\n * The DiagnosticRelatedInformation namespace provides helper functions to work with\n * [DiagnosticRelatedInformation](#DiagnosticRelatedInformation) literals.\n */\nexport var DiagnosticRelatedInformation;\n(function (DiagnosticRelatedInformation) {\n /**\n * Creates a new DiagnosticRelatedInformation literal.\n */\n function create(location, message) {\n return {\n location: location,\n message: message\n };\n }\n DiagnosticRelatedInformation.create = create;\n /**\n * Checks whether the given literal conforms to the [DiagnosticRelatedInformation](#DiagnosticRelatedInformation) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Location.is(candidate.location) && Is.string(candidate.message);\n }\n DiagnosticRelatedInformation.is = is;\n})(DiagnosticRelatedInformation || (DiagnosticRelatedInformation = {}));\n/**\n * The diagnostic's severity.\n */\nexport var DiagnosticSeverity;\n(function (DiagnosticSeverity) {\n /**\n * Reports an error.\n */\n DiagnosticSeverity.Error = 1;\n /**\n * Reports a warning.\n */\n DiagnosticSeverity.Warning = 2;\n /**\n * Reports an information.\n */\n DiagnosticSeverity.Information = 3;\n /**\n * Reports a hint.\n */\n DiagnosticSeverity.Hint = 4;\n})(DiagnosticSeverity || (DiagnosticSeverity = {}));\n/**\n * The diagnostic tags.\n *\n * @since 3.15.0\n */\nexport var DiagnosticTag;\n(function (DiagnosticTag) {\n /**\n * Unused or unnecessary code.\n *\n * Clients are allowed to render diagnostics with this tag faded out instead of having\n * an error squiggle.\n */\n DiagnosticTag.Unnecessary = 1;\n /**\n * Deprecated or obsolete code.\n *\n * Clients are allowed to rendered diagnostics with this tag strike through.\n */\n DiagnosticTag.Deprecated = 2;\n})(DiagnosticTag || (DiagnosticTag = {}));\n/**\n * The CodeDescription namespace provides functions to deal with descriptions for diagnostic codes.\n *\n * @since 3.16.0\n */\nexport var CodeDescription;\n(function (CodeDescription) {\n function is(value) {\n var candidate = value;\n return candidate !== undefined && candidate !== null && Is.string(candidate.href);\n }\n CodeDescription.is = is;\n})(CodeDescription || (CodeDescription = {}));\n/**\n * The Diagnostic namespace provides helper functions to work with\n * [Diagnostic](#Diagnostic) literals.\n */\nexport var Diagnostic;\n(function (Diagnostic) {\n /**\n * Creates a new Diagnostic literal.\n */\n function create(range, message, severity, code, source, relatedInformation) {\n var result = { range: range, message: message };\n if (Is.defined(severity)) {\n result.severity = severity;\n }\n if (Is.defined(code)) {\n result.code = code;\n }\n if (Is.defined(source)) {\n result.source = source;\n }\n if (Is.defined(relatedInformation)) {\n result.relatedInformation = relatedInformation;\n }\n return result;\n }\n Diagnostic.create = create;\n /**\n * Checks whether the given literal conforms to the [Diagnostic](#Diagnostic) interface.\n */\n function is(value) {\n var _a;\n var candidate = value;\n return Is.defined(candidate)\n && Range.is(candidate.range)\n && Is.string(candidate.message)\n && (Is.number(candidate.severity) || Is.undefined(candidate.severity))\n && (Is.integer(candidate.code) || Is.string(candidate.code) || Is.undefined(candidate.code))\n && (Is.undefined(candidate.codeDescription) || (Is.string((_a = candidate.codeDescription) === null || _a === void 0 ? void 0 : _a.href)))\n && (Is.string(candidate.source) || Is.undefined(candidate.source))\n && (Is.undefined(candidate.relatedInformation) || Is.typedArray(candidate.relatedInformation, DiagnosticRelatedInformation.is));\n }\n Diagnostic.is = is;\n})(Diagnostic || (Diagnostic = {}));\n/**\n * The Command namespace provides helper functions to work with\n * [Command](#Command) literals.\n */\nexport var Command;\n(function (Command) {\n /**\n * Creates a new Command literal.\n */\n function create(title, command) {\n var args = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n args[_i - 2] = arguments[_i];\n }\n var result = { title: title, command: command };\n if (Is.defined(args) && args.length > 0) {\n result.arguments = args;\n }\n return result;\n }\n Command.create = create;\n /**\n * Checks whether the given literal conforms to the [Command](#Command) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.string(candidate.title) && Is.string(candidate.command);\n }\n Command.is = is;\n})(Command || (Command = {}));\n/**\n * The TextEdit namespace provides helper function to create replace,\n * insert and delete edits more easily.\n */\nexport var TextEdit;\n(function (TextEdit) {\n /**\n * Creates a replace text edit.\n * @param range The range of text to be replaced.\n * @param newText The new text.\n */\n function replace(range, newText) {\n return { range: range, newText: newText };\n }\n TextEdit.replace = replace;\n /**\n * Creates a insert text edit.\n * @param position The position to insert the text at.\n * @param newText The text to be inserted.\n */\n function insert(position, newText) {\n return { range: { start: position, end: position }, newText: newText };\n }\n TextEdit.insert = insert;\n /**\n * Creates a delete text edit.\n * @param range The range of text to be deleted.\n */\n function del(range) {\n return { range: range, newText: '' };\n }\n TextEdit.del = del;\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate)\n && Is.string(candidate.newText)\n && Range.is(candidate.range);\n }\n TextEdit.is = is;\n})(TextEdit || (TextEdit = {}));\nexport var ChangeAnnotation;\n(function (ChangeAnnotation) {\n function create(label, needsConfirmation, description) {\n var result = { label: label };\n if (needsConfirmation !== undefined) {\n result.needsConfirmation = needsConfirmation;\n }\n if (description !== undefined) {\n result.description = description;\n }\n return result;\n }\n ChangeAnnotation.create = create;\n function is(value) {\n var candidate = value;\n return candidate !== undefined && Is.objectLiteral(candidate) && Is.string(candidate.label) &&\n (Is.boolean(candidate.needsConfirmation) || candidate.needsConfirmation === undefined) &&\n (Is.string(candidate.description) || candidate.description === undefined);\n }\n ChangeAnnotation.is = is;\n})(ChangeAnnotation || (ChangeAnnotation = {}));\nexport var ChangeAnnotationIdentifier;\n(function (ChangeAnnotationIdentifier) {\n function is(value) {\n var candidate = value;\n return typeof candidate === 'string';\n }\n ChangeAnnotationIdentifier.is = is;\n})(ChangeAnnotationIdentifier || (ChangeAnnotationIdentifier = {}));\nexport var AnnotatedTextEdit;\n(function (AnnotatedTextEdit) {\n /**\n * Creates an annotated replace text edit.\n *\n * @param range The range of text to be replaced.\n * @param newText The new text.\n * @param annotation The annotation.\n */\n function replace(range, newText, annotation) {\n return { range: range, newText: newText, annotationId: annotation };\n }\n AnnotatedTextEdit.replace = replace;\n /**\n * Creates an annotated insert text edit.\n *\n * @param position The position to insert the text at.\n * @param newText The text to be inserted.\n * @param annotation The annotation.\n */\n function insert(position, newText, annotation) {\n return { range: { start: position, end: position }, newText: newText, annotationId: annotation };\n }\n AnnotatedTextEdit.insert = insert;\n /**\n * Creates an annotated delete text edit.\n *\n * @param range The range of text to be deleted.\n * @param annotation The annotation.\n */\n function del(range, annotation) {\n return { range: range, newText: '', annotationId: annotation };\n }\n AnnotatedTextEdit.del = del;\n function is(value) {\n var candidate = value;\n return TextEdit.is(candidate) && (ChangeAnnotation.is(candidate.annotationId) || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n AnnotatedTextEdit.is = is;\n})(AnnotatedTextEdit || (AnnotatedTextEdit = {}));\n/**\n * The TextDocumentEdit namespace provides helper function to create\n * an edit that manipulates a text document.\n */\nexport var TextDocumentEdit;\n(function (TextDocumentEdit) {\n /**\n * Creates a new `TextDocumentEdit`\n */\n function create(textDocument, edits) {\n return { textDocument: textDocument, edits: edits };\n }\n TextDocumentEdit.create = create;\n function is(value) {\n var candidate = value;\n return Is.defined(candidate)\n && OptionalVersionedTextDocumentIdentifier.is(candidate.textDocument)\n && Array.isArray(candidate.edits);\n }\n TextDocumentEdit.is = is;\n})(TextDocumentEdit || (TextDocumentEdit = {}));\nexport var CreateFile;\n(function (CreateFile) {\n function create(uri, options, annotation) {\n var result = {\n kind: 'create',\n uri: uri\n };\n if (options !== undefined && (options.overwrite !== undefined || options.ignoreIfExists !== undefined)) {\n result.options = options;\n }\n if (annotation !== undefined) {\n result.annotationId = annotation;\n }\n return result;\n }\n CreateFile.create = create;\n function is(value) {\n var candidate = value;\n return candidate && candidate.kind === 'create' && Is.string(candidate.uri) && (candidate.options === undefined ||\n ((candidate.options.overwrite === undefined || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === undefined || Is.boolean(candidate.options.ignoreIfExists)))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n CreateFile.is = is;\n})(CreateFile || (CreateFile = {}));\nexport var RenameFile;\n(function (RenameFile) {\n function create(oldUri, newUri, options, annotation) {\n var result = {\n kind: 'rename',\n oldUri: oldUri,\n newUri: newUri\n };\n if (options !== undefined && (options.overwrite !== undefined || options.ignoreIfExists !== undefined)) {\n result.options = options;\n }\n if (annotation !== undefined) {\n result.annotationId = annotation;\n }\n return result;\n }\n RenameFile.create = create;\n function is(value) {\n var candidate = value;\n return candidate && candidate.kind === 'rename' && Is.string(candidate.oldUri) && Is.string(candidate.newUri) && (candidate.options === undefined ||\n ((candidate.options.overwrite === undefined || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === undefined || Is.boolean(candidate.options.ignoreIfExists)))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n RenameFile.is = is;\n})(RenameFile || (RenameFile = {}));\nexport var DeleteFile;\n(function (DeleteFile) {\n function create(uri, options, annotation) {\n var result = {\n kind: 'delete',\n uri: uri\n };\n if (options !== undefined && (options.recursive !== undefined || options.ignoreIfNotExists !== undefined)) {\n result.options = options;\n }\n if (annotation !== undefined) {\n result.annotationId = annotation;\n }\n return result;\n }\n DeleteFile.create = create;\n function is(value) {\n var candidate = value;\n return candidate && candidate.kind === 'delete' && Is.string(candidate.uri) && (candidate.options === undefined ||\n ((candidate.options.recursive === undefined || Is.boolean(candidate.options.recursive)) && (candidate.options.ignoreIfNotExists === undefined || Is.boolean(candidate.options.ignoreIfNotExists)))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n DeleteFile.is = is;\n})(DeleteFile || (DeleteFile = {}));\nexport var WorkspaceEdit;\n(function (WorkspaceEdit) {\n function is(value) {\n var candidate = value;\n return candidate &&\n (candidate.changes !== undefined || candidate.documentChanges !== undefined) &&\n (candidate.documentChanges === undefined || candidate.documentChanges.every(function (change) {\n if (Is.string(change.kind)) {\n return CreateFile.is(change) || RenameFile.is(change) || DeleteFile.is(change);\n }\n else {\n return TextDocumentEdit.is(change);\n }\n }));\n }\n WorkspaceEdit.is = is;\n})(WorkspaceEdit || (WorkspaceEdit = {}));\nvar TextEditChangeImpl = /** @class */ (function () {\n function TextEditChangeImpl(edits, changeAnnotations) {\n this.edits = edits;\n this.changeAnnotations = changeAnnotations;\n }\n TextEditChangeImpl.prototype.insert = function (position, newText, annotation) {\n var edit;\n var id;\n if (annotation === undefined) {\n edit = TextEdit.insert(position, newText);\n }\n else if (ChangeAnnotationIdentifier.is(annotation)) {\n id = annotation;\n edit = AnnotatedTextEdit.insert(position, newText, annotation);\n }\n else {\n this.assertChangeAnnotations(this.changeAnnotations);\n id = this.changeAnnotations.manage(annotation);\n edit = AnnotatedTextEdit.insert(position, newText, id);\n }\n this.edits.push(edit);\n if (id !== undefined) {\n return id;\n }\n };\n TextEditChangeImpl.prototype.replace = function (range, newText, annotation) {\n var edit;\n var id;\n if (annotation === undefined) {\n edit = TextEdit.replace(range, newText);\n }\n else if (ChangeAnnotationIdentifier.is(annotation)) {\n id = annotation;\n edit = AnnotatedTextEdit.replace(range, newText, annotation);\n }\n else {\n this.assertChangeAnnotations(this.changeAnnotations);\n id = this.changeAnnotations.manage(annotation);\n edit = AnnotatedTextEdit.replace(range, newText, id);\n }\n this.edits.push(edit);\n if (id !== undefined) {\n return id;\n }\n };\n TextEditChangeImpl.prototype.delete = function (range, annotation) {\n var edit;\n var id;\n if (annotation === undefined) {\n edit = TextEdit.del(range);\n }\n else if (ChangeAnnotationIdentifier.is(annotation)) {\n id = annotation;\n edit = AnnotatedTextEdit.del(range, annotation);\n }\n else {\n this.assertChangeAnnotations(this.changeAnnotations);\n id = this.changeAnnotations.manage(annotation);\n edit = AnnotatedTextEdit.del(range, id);\n }\n this.edits.push(edit);\n if (id !== undefined) {\n return id;\n }\n };\n TextEditChangeImpl.prototype.add = function (edit) {\n this.edits.push(edit);\n };\n TextEditChangeImpl.prototype.all = function () {\n return this.edits;\n };\n TextEditChangeImpl.prototype.clear = function () {\n this.edits.splice(0, this.edits.length);\n };\n TextEditChangeImpl.prototype.assertChangeAnnotations = function (value) {\n if (value === undefined) {\n throw new Error(\"Text edit change is not configured to manage change annotations.\");\n }\n };\n return TextEditChangeImpl;\n}());\n/**\n * A helper class\n */\nvar ChangeAnnotations = /** @class */ (function () {\n function ChangeAnnotations(annotations) {\n this._annotations = annotations === undefined ? Object.create(null) : annotations;\n this._counter = 0;\n this._size = 0;\n }\n ChangeAnnotations.prototype.all = function () {\n return this._annotations;\n };\n Object.defineProperty(ChangeAnnotations.prototype, \"size\", {\n get: function () {\n return this._size;\n },\n enumerable: false,\n configurable: true\n });\n ChangeAnnotations.prototype.manage = function (idOrAnnotation, annotation) {\n var id;\n if (ChangeAnnotationIdentifier.is(idOrAnnotation)) {\n id = idOrAnnotation;\n }\n else {\n id = this.nextId();\n annotation = idOrAnnotation;\n }\n if (this._annotations[id] !== undefined) {\n throw new Error(\"Id \" + id + \" is already in use.\");\n }\n if (annotation === undefined) {\n throw new Error(\"No annotation provided for id \" + id);\n }\n this._annotations[id] = annotation;\n this._size++;\n return id;\n };\n ChangeAnnotations.prototype.nextId = function () {\n this._counter++;\n return this._counter.toString();\n };\n return ChangeAnnotations;\n}());\n/**\n * A workspace change helps constructing changes to a workspace.\n */\nvar WorkspaceChange = /** @class */ (function () {\n function WorkspaceChange(workspaceEdit) {\n var _this = this;\n this._textEditChanges = Object.create(null);\n if (workspaceEdit !== undefined) {\n this._workspaceEdit = workspaceEdit;\n if (workspaceEdit.documentChanges) {\n this._changeAnnotations = new ChangeAnnotations(workspaceEdit.changeAnnotations);\n workspaceEdit.changeAnnotations = this._changeAnnotations.all();\n workspaceEdit.documentChanges.forEach(function (change) {\n if (TextDocumentEdit.is(change)) {\n var textEditChange = new TextEditChangeImpl(change.edits, _this._changeAnnotations);\n _this._textEditChanges[change.textDocument.uri] = textEditChange;\n }\n });\n }\n else if (workspaceEdit.changes) {\n Object.keys(workspaceEdit.changes).forEach(function (key) {\n var textEditChange = new TextEditChangeImpl(workspaceEdit.changes[key]);\n _this._textEditChanges[key] = textEditChange;\n });\n }\n }\n else {\n this._workspaceEdit = {};\n }\n }\n Object.defineProperty(WorkspaceChange.prototype, \"edit\", {\n /**\n * Returns the underlying [WorkspaceEdit](#WorkspaceEdit) literal\n * use to be returned from a workspace edit operation like rename.\n */\n get: function () {\n this.initDocumentChanges();\n if (this._changeAnnotations !== undefined) {\n if (this._changeAnnotations.size === 0) {\n this._workspaceEdit.changeAnnotations = undefined;\n }\n else {\n this._workspaceEdit.changeAnnotations = this._changeAnnotations.all();\n }\n }\n return this._workspaceEdit;\n },\n enumerable: false,\n configurable: true\n });\n WorkspaceChange.prototype.getTextEditChange = function (key) {\n if (OptionalVersionedTextDocumentIdentifier.is(key)) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n var textDocument = { uri: key.uri, version: key.version };\n var result = this._textEditChanges[textDocument.uri];\n if (!result) {\n var edits = [];\n var textDocumentEdit = {\n textDocument: textDocument,\n edits: edits\n };\n this._workspaceEdit.documentChanges.push(textDocumentEdit);\n result = new TextEditChangeImpl(edits, this._changeAnnotations);\n this._textEditChanges[textDocument.uri] = result;\n }\n return result;\n }\n else {\n this.initChanges();\n if (this._workspaceEdit.changes === undefined) {\n throw new Error('Workspace edit is not configured for normal text edit changes.');\n }\n var result = this._textEditChanges[key];\n if (!result) {\n var edits = [];\n this._workspaceEdit.changes[key] = edits;\n result = new TextEditChangeImpl(edits);\n this._textEditChanges[key] = result;\n }\n return result;\n }\n };\n WorkspaceChange.prototype.initDocumentChanges = function () {\n if (this._workspaceEdit.documentChanges === undefined && this._workspaceEdit.changes === undefined) {\n this._changeAnnotations = new ChangeAnnotations();\n this._workspaceEdit.documentChanges = [];\n this._workspaceEdit.changeAnnotations = this._changeAnnotations.all();\n }\n };\n WorkspaceChange.prototype.initChanges = function () {\n if (this._workspaceEdit.documentChanges === undefined && this._workspaceEdit.changes === undefined) {\n this._workspaceEdit.changes = Object.create(null);\n }\n };\n WorkspaceChange.prototype.createFile = function (uri, optionsOrAnnotation, options) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n var annotation;\n if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) {\n annotation = optionsOrAnnotation;\n }\n else {\n options = optionsOrAnnotation;\n }\n var operation;\n var id;\n if (annotation === undefined) {\n operation = CreateFile.create(uri, options);\n }\n else {\n id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation);\n operation = CreateFile.create(uri, options, id);\n }\n this._workspaceEdit.documentChanges.push(operation);\n if (id !== undefined) {\n return id;\n }\n };\n WorkspaceChange.prototype.renameFile = function (oldUri, newUri, optionsOrAnnotation, options) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n var annotation;\n if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) {\n annotation = optionsOrAnnotation;\n }\n else {\n options = optionsOrAnnotation;\n }\n var operation;\n var id;\n if (annotation === undefined) {\n operation = RenameFile.create(oldUri, newUri, options);\n }\n else {\n id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation);\n operation = RenameFile.create(oldUri, newUri, options, id);\n }\n this._workspaceEdit.documentChanges.push(operation);\n if (id !== undefined) {\n return id;\n }\n };\n WorkspaceChange.prototype.deleteFile = function (uri, optionsOrAnnotation, options) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n var annotation;\n if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) {\n annotation = optionsOrAnnotation;\n }\n else {\n options = optionsOrAnnotation;\n }\n var operation;\n var id;\n if (annotation === undefined) {\n operation = DeleteFile.create(uri, options);\n }\n else {\n id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation);\n operation = DeleteFile.create(uri, options, id);\n }\n this._workspaceEdit.documentChanges.push(operation);\n if (id !== undefined) {\n return id;\n }\n };\n return WorkspaceChange;\n}());\nexport { WorkspaceChange };\n/**\n * The TextDocumentIdentifier namespace provides helper functions to work with\n * [TextDocumentIdentifier](#TextDocumentIdentifier) literals.\n */\nexport var TextDocumentIdentifier;\n(function (TextDocumentIdentifier) {\n /**\n * Creates a new TextDocumentIdentifier literal.\n * @param uri The document's uri.\n */\n function create(uri) {\n return { uri: uri };\n }\n TextDocumentIdentifier.create = create;\n /**\n * Checks whether the given literal conforms to the [TextDocumentIdentifier](#TextDocumentIdentifier) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri);\n }\n TextDocumentIdentifier.is = is;\n})(TextDocumentIdentifier || (TextDocumentIdentifier = {}));\n/**\n * The VersionedTextDocumentIdentifier namespace provides helper functions to work with\n * [VersionedTextDocumentIdentifier](#VersionedTextDocumentIdentifier) literals.\n */\nexport var VersionedTextDocumentIdentifier;\n(function (VersionedTextDocumentIdentifier) {\n /**\n * Creates a new VersionedTextDocumentIdentifier literal.\n * @param uri The document's uri.\n * @param uri The document's text.\n */\n function create(uri, version) {\n return { uri: uri, version: version };\n }\n VersionedTextDocumentIdentifier.create = create;\n /**\n * Checks whether the given literal conforms to the [VersionedTextDocumentIdentifier](#VersionedTextDocumentIdentifier) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && Is.integer(candidate.version);\n }\n VersionedTextDocumentIdentifier.is = is;\n})(VersionedTextDocumentIdentifier || (VersionedTextDocumentIdentifier = {}));\n/**\n * The OptionalVersionedTextDocumentIdentifier namespace provides helper functions to work with\n * [OptionalVersionedTextDocumentIdentifier](#OptionalVersionedTextDocumentIdentifier) literals.\n */\nexport var OptionalVersionedTextDocumentIdentifier;\n(function (OptionalVersionedTextDocumentIdentifier) {\n /**\n * Creates a new OptionalVersionedTextDocumentIdentifier literal.\n * @param uri The document's uri.\n * @param uri The document's text.\n */\n function create(uri, version) {\n return { uri: uri, version: version };\n }\n OptionalVersionedTextDocumentIdentifier.create = create;\n /**\n * Checks whether the given literal conforms to the [OptionalVersionedTextDocumentIdentifier](#OptionalVersionedTextDocumentIdentifier) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && (candidate.version === null || Is.integer(candidate.version));\n }\n OptionalVersionedTextDocumentIdentifier.is = is;\n})(OptionalVersionedTextDocumentIdentifier || (OptionalVersionedTextDocumentIdentifier = {}));\n/**\n * The TextDocumentItem namespace provides helper functions to work with\n * [TextDocumentItem](#TextDocumentItem) literals.\n */\nexport var TextDocumentItem;\n(function (TextDocumentItem) {\n /**\n * Creates a new TextDocumentItem literal.\n * @param uri The document's uri.\n * @param languageId The document's language identifier.\n * @param version The document's version number.\n * @param text The document's text.\n */\n function create(uri, languageId, version, text) {\n return { uri: uri, languageId: languageId, version: version, text: text };\n }\n TextDocumentItem.create = create;\n /**\n * Checks whether the given literal conforms to the [TextDocumentItem](#TextDocumentItem) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && Is.string(candidate.languageId) && Is.integer(candidate.version) && Is.string(candidate.text);\n }\n TextDocumentItem.is = is;\n})(TextDocumentItem || (TextDocumentItem = {}));\n/**\n * Describes the content type that a client supports in various\n * result literals like `Hover`, `ParameterInfo` or `CompletionItem`.\n *\n * Please note that `MarkupKinds` must not start with a `$`. This kinds\n * are reserved for internal usage.\n */\nexport var MarkupKind;\n(function (MarkupKind) {\n /**\n * Plain text is supported as a content format\n */\n MarkupKind.PlainText = 'plaintext';\n /**\n * Markdown is supported as a content format\n */\n MarkupKind.Markdown = 'markdown';\n})(MarkupKind || (MarkupKind = {}));\n(function (MarkupKind) {\n /**\n * Checks whether the given value is a value of the [MarkupKind](#MarkupKind) type.\n */\n function is(value) {\n var candidate = value;\n return candidate === MarkupKind.PlainText || candidate === MarkupKind.Markdown;\n }\n MarkupKind.is = is;\n})(MarkupKind || (MarkupKind = {}));\nexport var MarkupContent;\n(function (MarkupContent) {\n /**\n * Checks whether the given value conforms to the [MarkupContent](#MarkupContent) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(value) && MarkupKind.is(candidate.kind) && Is.string(candidate.value);\n }\n MarkupContent.is = is;\n})(MarkupContent || (MarkupContent = {}));\n/**\n * The kind of a completion entry.\n */\nexport var CompletionItemKind;\n(function (CompletionItemKind) {\n CompletionItemKind.Text = 1;\n CompletionItemKind.Method = 2;\n CompletionItemKind.Function = 3;\n CompletionItemKind.Constructor = 4;\n CompletionItemKind.Field = 5;\n CompletionItemKind.Variable = 6;\n CompletionItemKind.Class = 7;\n CompletionItemKind.Interface = 8;\n CompletionItemKind.Module = 9;\n CompletionItemKind.Property = 10;\n CompletionItemKind.Unit = 11;\n CompletionItemKind.Value = 12;\n CompletionItemKind.Enum = 13;\n CompletionItemKind.Keyword = 14;\n CompletionItemKind.Snippet = 15;\n CompletionItemKind.Color = 16;\n CompletionItemKind.File = 17;\n CompletionItemKind.Reference = 18;\n CompletionItemKind.Folder = 19;\n CompletionItemKind.EnumMember = 20;\n CompletionItemKind.Constant = 21;\n CompletionItemKind.Struct = 22;\n CompletionItemKind.Event = 23;\n CompletionItemKind.Operator = 24;\n CompletionItemKind.TypeParameter = 25;\n})(CompletionItemKind || (CompletionItemKind = {}));\n/**\n * Defines whether the insert text in a completion item should be interpreted as\n * plain text or a snippet.\n */\nexport var InsertTextFormat;\n(function (InsertTextFormat) {\n /**\n * The primary text to be inserted is treated as a plain string.\n */\n InsertTextFormat.PlainText = 1;\n /**\n * The primary text to be inserted is treated as a snippet.\n *\n * A snippet can define tab stops and placeholders with `$1`, `$2`\n * and `${3:foo}`. `$0` defines the final tab stop, it defaults to\n * the end of the snippet. Placeholders with equal identifiers are linked,\n * that is typing in one will update others too.\n *\n * See also: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#snippet_syntax\n */\n InsertTextFormat.Snippet = 2;\n})(InsertTextFormat || (InsertTextFormat = {}));\n/**\n * Completion item tags are extra annotations that tweak the rendering of a completion\n * item.\n *\n * @since 3.15.0\n */\nexport var CompletionItemTag;\n(function (CompletionItemTag) {\n /**\n * Render a completion as obsolete, usually using a strike-out.\n */\n CompletionItemTag.Deprecated = 1;\n})(CompletionItemTag || (CompletionItemTag = {}));\n/**\n * The InsertReplaceEdit namespace provides functions to deal with insert / replace edits.\n *\n * @since 3.16.0\n */\nexport var InsertReplaceEdit;\n(function (InsertReplaceEdit) {\n /**\n * Creates a new insert / replace edit\n */\n function create(newText, insert, replace) {\n return { newText: newText, insert: insert, replace: replace };\n }\n InsertReplaceEdit.create = create;\n /**\n * Checks whether the given literal conforms to the [InsertReplaceEdit](#InsertReplaceEdit) interface.\n */\n function is(value) {\n var candidate = value;\n return candidate && Is.string(candidate.newText) && Range.is(candidate.insert) && Range.is(candidate.replace);\n }\n InsertReplaceEdit.is = is;\n})(InsertReplaceEdit || (InsertReplaceEdit = {}));\n/**\n * How whitespace and indentation is handled during completion\n * item insertion.\n *\n * @since 3.16.0\n */\nexport var InsertTextMode;\n(function (InsertTextMode) {\n /**\n * The insertion or replace strings is taken as it is. If the\n * value is multi line the lines below the cursor will be\n * inserted using the indentation defined in the string value.\n * The client will not apply any kind of adjustments to the\n * string.\n */\n InsertTextMode.asIs = 1;\n /**\n * The editor adjusts leading whitespace of new lines so that\n * they match the indentation up to the cursor of the line for\n * which the item is accepted.\n *\n * Consider a line like this: <2tabs><cursor><3tabs>foo. Accepting a\n * multi line completion item is indented using 2 tabs and all\n * following lines inserted will be indented using 2 tabs as well.\n */\n InsertTextMode.adjustIndentation = 2;\n})(InsertTextMode || (InsertTextMode = {}));\n/**\n * The CompletionItem namespace provides functions to deal with\n * completion items.\n */\nexport var CompletionItem;\n(function (CompletionItem) {\n /**\n * Create a completion item and seed it with a label.\n * @param label The completion item's label\n */\n function create(label) {\n return { label: label };\n }\n CompletionItem.create = create;\n})(CompletionItem || (CompletionItem = {}));\n/**\n * The CompletionList namespace provides functions to deal with\n * completion lists.\n */\nexport var CompletionList;\n(function (CompletionList) {\n /**\n * Creates a new completion list.\n *\n * @param items The completion items.\n * @param isIncomplete The list is not complete.\n */\n function create(items, isIncomplete) {\n return { items: items ? items : [], isIncomplete: !!isIncomplete };\n }\n CompletionList.create = create;\n})(CompletionList || (CompletionList = {}));\nexport var MarkedString;\n(function (MarkedString) {\n /**\n * Creates a marked string from plain text.\n *\n * @param plainText The plain text.\n */\n function fromPlainText(plainText) {\n return plainText.replace(/[\\\\`*_{}[\\]()#+\\-.!]/g, '\\\\$&'); // escape markdown syntax tokens: http://daringfireball.net/projects/markdown/syntax#backslash\n }\n MarkedString.fromPlainText = fromPlainText;\n /**\n * Checks whether the given value conforms to the [MarkedString](#MarkedString) type.\n */\n function is(value) {\n var candidate = value;\n return Is.string(candidate) || (Is.objectLiteral(candidate) && Is.string(candidate.language) && Is.string(candidate.value));\n }\n MarkedString.is = is;\n})(MarkedString || (MarkedString = {}));\nexport var Hover;\n(function (Hover) {\n /**\n * Checks whether the given value conforms to the [Hover](#Hover) interface.\n */\n function is(value) {\n var candidate = value;\n return !!candidate && Is.objectLiteral(candidate) && (MarkupContent.is(candidate.contents) ||\n MarkedString.is(candidate.contents) ||\n Is.typedArray(candidate.contents, MarkedString.is)) && (value.range === undefined || Range.is(value.range));\n }\n Hover.is = is;\n})(Hover || (Hover = {}));\n/**\n * The ParameterInformation namespace provides helper functions to work with\n * [ParameterInformation](#ParameterInformation) literals.\n */\nexport var ParameterInformation;\n(function (ParameterInformation) {\n /**\n * Creates a new parameter information literal.\n *\n * @param label A label string.\n * @param documentation A doc string.\n */\n function create(label, documentation) {\n return documentation ? { label: label, documentation: documentation } : { label: label };\n }\n ParameterInformation.create = create;\n})(ParameterInformation || (ParameterInformation = {}));\n/**\n * The SignatureInformation namespace provides helper functions to work with\n * [SignatureInformation](#SignatureInformation) literals.\n */\nexport var SignatureInformation;\n(function (SignatureInformation) {\n function create(label, documentation) {\n var parameters = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n parameters[_i - 2] = arguments[_i];\n }\n var result = { label: label };\n if (Is.defined(documentation)) {\n result.documentation = documentation;\n }\n if (Is.defined(parameters)) {\n result.parameters = parameters;\n }\n else {\n result.parameters = [];\n }\n return result;\n }\n SignatureInformation.create = create;\n})(SignatureInformation || (SignatureInformation = {}));\n/**\n * A document highlight kind.\n */\nexport var DocumentHighlightKind;\n(function (DocumentHighlightKind) {\n /**\n * A textual occurrence.\n */\n DocumentHighlightKind.Text = 1;\n /**\n * Read-access of a symbol, like reading a variable.\n */\n DocumentHighlightKind.Read = 2;\n /**\n * Write-access of a symbol, like writing to a variable.\n */\n DocumentHighlightKind.Write = 3;\n})(DocumentHighlightKind || (DocumentHighlightKind = {}));\n/**\n * DocumentHighlight namespace to provide helper functions to work with\n * [DocumentHighlight](#DocumentHighlight) literals.\n */\nexport var DocumentHighlight;\n(function (DocumentHighlight) {\n /**\n * Create a DocumentHighlight object.\n * @param range The range the highlight applies to.\n */\n function create(range, kind) {\n var result = { range: range };\n if (Is.number(kind)) {\n result.kind = kind;\n }\n return result;\n }\n DocumentHighlight.create = create;\n})(DocumentHighlight || (DocumentHighlight = {}));\n/**\n * A symbol kind.\n */\nexport var SymbolKind;\n(function (SymbolKind) {\n SymbolKind.File = 1;\n SymbolKind.Module = 2;\n SymbolKind.Namespace = 3;\n SymbolKind.Package = 4;\n SymbolKind.Class = 5;\n SymbolKind.Method = 6;\n SymbolKind.Property = 7;\n SymbolKind.Field = 8;\n SymbolKind.Constructor = 9;\n SymbolKind.Enum = 10;\n SymbolKind.Interface = 11;\n SymbolKind.Function = 12;\n SymbolKind.Variable = 13;\n SymbolKind.Constant = 14;\n SymbolKind.String = 15;\n SymbolKind.Number = 16;\n SymbolKind.Boolean = 17;\n SymbolKind.Array = 18;\n SymbolKind.Object = 19;\n SymbolKind.Key = 20;\n SymbolKind.Null = 21;\n SymbolKind.EnumMember = 22;\n SymbolKind.Struct = 23;\n SymbolKind.Event = 24;\n SymbolKind.Operator = 25;\n SymbolKind.TypeParameter = 26;\n})(SymbolKind || (SymbolKind = {}));\n/**\n * Symbol tags are extra annotations that tweak the rendering of a symbol.\n * @since 3.16\n */\nexport var SymbolTag;\n(function (SymbolTag) {\n /**\n * Render a symbol as obsolete, usually using a strike-out.\n */\n SymbolTag.Deprecated = 1;\n})(SymbolTag || (SymbolTag = {}));\nexport var SymbolInformation;\n(function (SymbolInformation) {\n /**\n * Creates a new symbol information literal.\n *\n * @param name The name of the symbol.\n * @param kind The kind of the symbol.\n * @param range The range of the location of the symbol.\n * @param uri The resource of the location of symbol, defaults to the current document.\n * @param containerName The name of the symbol containing the symbol.\n */\n function create(name, kind, range, uri, containerName) {\n var result = {\n name: name,\n kind: kind,\n location: { uri: uri, range: range }\n };\n if (containerName) {\n result.containerName = containerName;\n }\n return result;\n }\n SymbolInformation.create = create;\n})(SymbolInformation || (SymbolInformation = {}));\nexport var DocumentSymbol;\n(function (DocumentSymbol) {\n /**\n * Creates a new symbol information literal.\n *\n * @param name The name of the symbol.\n * @param detail The detail of the symbol.\n * @param kind The kind of the symbol.\n * @param range The range of the symbol.\n * @param selectionRange The selectionRange of the symbol.\n * @param children Children of the symbol.\n */\n function create(name, detail, kind, range, selectionRange, children) {\n var result = {\n name: name,\n detail: detail,\n kind: kind,\n range: range,\n selectionRange: selectionRange\n };\n if (children !== undefined) {\n result.children = children;\n }\n return result;\n }\n DocumentSymbol.create = create;\n /**\n * Checks whether the given literal conforms to the [DocumentSymbol](#DocumentSymbol) interface.\n */\n function is(value) {\n var candidate = value;\n return candidate &&\n Is.string(candidate.name) && Is.number(candidate.kind) &&\n Range.is(candidate.range) && Range.is(candidate.selectionRange) &&\n (candidate.detail === undefined || Is.string(candidate.detail)) &&\n (candidate.deprecated === undefined || Is.boolean(candidate.deprecated)) &&\n (candidate.children === undefined || Array.isArray(candidate.children)) &&\n (candidate.tags === undefined || Array.isArray(candidate.tags));\n }\n DocumentSymbol.is = is;\n})(DocumentSymbol || (DocumentSymbol = {}));\n/**\n * A set of predefined code action kinds\n */\nexport var CodeActionKind;\n(function (CodeActionKind) {\n /**\n * Empty kind.\n */\n CodeActionKind.Empty = '';\n /**\n * Base kind for quickfix actions: 'quickfix'\n */\n CodeActionKind.QuickFix = 'quickfix';\n /**\n * Base kind for refactoring actions: 'refactor'\n */\n CodeActionKind.Refactor = 'refactor';\n /**\n * Base kind for refactoring extraction actions: 'refactor.extract'\n *\n * Example extract actions:\n *\n * - Extract method\n * - Extract function\n * - Extract variable\n * - Extract interface from class\n * - ...\n */\n CodeActionKind.RefactorExtract = 'refactor.extract';\n /**\n * Base kind for refactoring inline actions: 'refactor.inline'\n *\n * Example inline actions:\n *\n * - Inline function\n * - Inline variable\n * - Inline constant\n * - ...\n */\n CodeActionKind.RefactorInline = 'refactor.inline';\n /**\n * Base kind for refactoring rewrite actions: 'refactor.rewrite'\n *\n * Example rewrite actions:\n *\n * - Convert JavaScript function to class\n * - Add or remove parameter\n * - Encapsulate field\n * - Make method static\n * - Move method to base class\n * - ...\n */\n CodeActionKind.RefactorRewrite = 'refactor.rewrite';\n /**\n * Base kind for source actions: `source`\n *\n * Source code actions apply to the entire file.\n */\n CodeActionKind.Source = 'source';\n /**\n * Base kind for an organize imports source action: `source.organizeImports`\n */\n CodeActionKind.SourceOrganizeImports = 'source.organizeImports';\n /**\n * Base kind for auto-fix source actions: `source.fixAll`.\n *\n * Fix all actions automatically fix errors that have a clear fix that do not require user input.\n * They should not suppress errors or perform unsafe fixes such as generating new types or classes.\n *\n * @since 3.15.0\n */\n CodeActionKind.SourceFixAll = 'source.fixAll';\n})(CodeActionKind || (CodeActionKind = {}));\n/**\n * The CodeActionContext namespace provides helper functions to work with\n * [CodeActionContext](#CodeActionContext) literals.\n */\nexport var CodeActionContext;\n(function (CodeActionContext) {\n /**\n * Creates a new CodeActionContext literal.\n */\n function create(diagnostics, only) {\n var result = { diagnostics: diagnostics };\n if (only !== undefined && only !== null) {\n result.only = only;\n }\n return result;\n }\n CodeActionContext.create = create;\n /**\n * Checks whether the given literal conforms to the [CodeActionContext](#CodeActionContext) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.typedArray(candidate.diagnostics, Diagnostic.is) && (candidate.only === undefined || Is.typedArray(candidate.only, Is.string));\n }\n CodeActionContext.is = is;\n})(CodeActionContext || (CodeActionContext = {}));\nexport var CodeAction;\n(function (CodeAction) {\n function create(title, kindOrCommandOrEdit, kind) {\n var result = { title: title };\n var checkKind = true;\n if (typeof kindOrCommandOrEdit === 'string') {\n checkKind = false;\n result.kind = kindOrCommandOrEdit;\n }\n else if (Command.is(kindOrCommandOrEdit)) {\n result.command = kindOrCommandOrEdit;\n }\n else {\n result.edit = kindOrCommandOrEdit;\n }\n if (checkKind && kind !== undefined) {\n result.kind = kind;\n }\n return result;\n }\n CodeAction.create = create;\n function is(value) {\n var candidate = value;\n return candidate && Is.string(candidate.title) &&\n (candidate.diagnostics === undefined || Is.typedArray(candidate.diagnostics, Diagnostic.is)) &&\n (candidate.kind === undefined || Is.string(candidate.kind)) &&\n (candidate.edit !== undefined || candidate.command !== undefined) &&\n (candidate.command === undefined || Command.is(candidate.command)) &&\n (candidate.isPreferred === undefined || Is.boolean(candidate.isPreferred)) &&\n (candidate.edit === undefined || WorkspaceEdit.is(candidate.edit));\n }\n CodeAction.is = is;\n})(CodeAction || (CodeAction = {}));\n/**\n * The CodeLens namespace provides helper functions to work with\n * [CodeLens](#CodeLens) literals.\n */\nexport var CodeLens;\n(function (CodeLens) {\n /**\n * Creates a new CodeLens literal.\n */\n function create(range, data) {\n var result = { range: range };\n if (Is.defined(data)) {\n result.data = data;\n }\n return result;\n }\n CodeLens.create = create;\n /**\n * Checks whether the given literal conforms to the [CodeLens](#CodeLens) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.command) || Command.is(candidate.command));\n }\n CodeLens.is = is;\n})(CodeLens || (CodeLens = {}));\n/**\n * The FormattingOptions namespace provides helper functions to work with\n * [FormattingOptions](#FormattingOptions) literals.\n */\nexport var FormattingOptions;\n(function (FormattingOptions) {\n /**\n * Creates a new FormattingOptions literal.\n */\n function create(tabSize, insertSpaces) {\n return { tabSize: tabSize, insertSpaces: insertSpaces };\n }\n FormattingOptions.create = create;\n /**\n * Checks whether the given literal conforms to the [FormattingOptions](#FormattingOptions) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.uinteger(candidate.tabSize) && Is.boolean(candidate.insertSpaces);\n }\n FormattingOptions.is = is;\n})(FormattingOptions || (FormattingOptions = {}));\n/**\n * The DocumentLink namespace provides helper functions to work with\n * [DocumentLink](#DocumentLink) literals.\n */\nexport var DocumentLink;\n(function (DocumentLink) {\n /**\n * Creates a new DocumentLink literal.\n */\n function create(range, target, data) {\n return { range: range, target: target, data: data };\n }\n DocumentLink.create = create;\n /**\n * Checks whether the given literal conforms to the [DocumentLink](#DocumentLink) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.target) || Is.string(candidate.target));\n }\n DocumentLink.is = is;\n})(DocumentLink || (DocumentLink = {}));\n/**\n * The SelectionRange namespace provides helper function to work with\n * SelectionRange literals.\n */\nexport var SelectionRange;\n(function (SelectionRange) {\n /**\n * Creates a new SelectionRange\n * @param range the range.\n * @param parent an optional parent.\n */\n function create(range, parent) {\n return { range: range, parent: parent };\n }\n SelectionRange.create = create;\n function is(value) {\n var candidate = value;\n return candidate !== undefined && Range.is(candidate.range) && (candidate.parent === undefined || SelectionRange.is(candidate.parent));\n }\n SelectionRange.is = is;\n})(SelectionRange || (SelectionRange = {}));\nexport var EOL = ['\\n', '\\r\\n', '\\r'];\n/**\n * @deprecated Use the text document from the new vscode-languageserver-textdocument package.\n */\nexport var TextDocument;\n(function (TextDocument) {\n /**\n * Creates a new ITextDocument literal from the given uri and content.\n * @param uri The document's uri.\n * @param languageId The document's language Id.\n * @param content The document's content.\n */\n function create(uri, languageId, version, content) {\n return new FullTextDocument(uri, languageId, version, content);\n }\n TextDocument.create = create;\n /**\n * Checks whether the given literal conforms to the [ITextDocument](#ITextDocument) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && (Is.undefined(candidate.languageId) || Is.string(candidate.languageId)) && Is.uinteger(candidate.lineCount)\n && Is.func(candidate.getText) && Is.func(candidate.positionAt) && Is.func(candidate.offsetAt) ? true : false;\n }\n TextDocument.is = is;\n function applyEdits(document, edits) {\n var text = document.getText();\n var sortedEdits = mergeSort(edits, function (a, b) {\n var diff = a.range.start.line - b.range.start.line;\n if (diff === 0) {\n return a.range.start.character - b.range.start.character;\n }\n return diff;\n });\n var lastModifiedOffset = text.length;\n for (var i = sortedEdits.length - 1; i >= 0; i--) {\n var e = sortedEdits[i];\n var startOffset = document.offsetAt(e.range.start);\n var endOffset = document.offsetAt(e.range.end);\n if (endOffset <= lastModifiedOffset) {\n text = text.substring(0, startOffset) + e.newText + text.substring(endOffset, text.length);\n }\n else {\n throw new Error('Overlapping edit');\n }\n lastModifiedOffset = startOffset;\n }\n return text;\n }\n TextDocument.applyEdits = applyEdits;\n function mergeSort(data, compare) {\n if (data.length <= 1) {\n // sorted\n return data;\n }\n var p = (data.length / 2) | 0;\n var left = data.slice(0, p);\n var right = data.slice(p);\n mergeSort(left, compare);\n mergeSort(right, compare);\n var leftIdx = 0;\n var rightIdx = 0;\n var i = 0;\n while (leftIdx < left.length && rightIdx < right.length) {\n var ret = compare(left[leftIdx], right[rightIdx]);\n if (ret <= 0) {\n // smaller_equal -> take left to preserve order\n data[i++] = left[leftIdx++];\n }\n else {\n // greater -> take right\n data[i++] = right[rightIdx++];\n }\n }\n while (leftIdx < left.length) {\n data[i++] = left[leftIdx++];\n }\n while (rightIdx < right.length) {\n data[i++] = right[rightIdx++];\n }\n return data;\n }\n})(TextDocument || (TextDocument = {}));\n/**\n * @deprecated Use the text document from the new vscode-languageserver-textdocument package.\n */\nvar FullTextDocument = /** @class */ (function () {\n function FullTextDocument(uri, languageId, version, content) {\n this._uri = uri;\n this._languageId = languageId;\n this._version = version;\n this._content = content;\n this._lineOffsets = undefined;\n }\n Object.defineProperty(FullTextDocument.prototype, \"uri\", {\n get: function () {\n return this._uri;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(FullTextDocument.prototype, \"languageId\", {\n get: function () {\n return this._languageId;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(FullTextDocument.prototype, \"version\", {\n get: function () {\n return this._version;\n },\n enumerable: false,\n configurable: true\n });\n FullTextDocument.prototype.getText = function (range) {\n if (range) {\n var start = this.offsetAt(range.start);\n var end = this.offsetAt(range.end);\n return this._content.substring(start, end);\n }\n return this._content;\n };\n FullTextDocument.prototype.update = function (event, version) {\n this._content = event.text;\n this._version = version;\n this._lineOffsets = undefined;\n };\n FullTextDocument.prototype.getLineOffsets = function () {\n if (this._lineOffsets === undefined) {\n var lineOffsets = [];\n var text = this._content;\n var isLineStart = true;\n for (var i = 0; i < text.length; i++) {\n if (isLineStart) {\n lineOffsets.push(i);\n isLineStart = false;\n }\n var ch = text.charAt(i);\n isLineStart = (ch === '\\r' || ch === '\\n');\n if (ch === '\\r' && i + 1 < text.length && text.charAt(i + 1) === '\\n') {\n i++;\n }\n }\n if (isLineStart && text.length > 0) {\n lineOffsets.push(text.length);\n }\n this._lineOffsets = lineOffsets;\n }\n return this._lineOffsets;\n };\n FullTextDocument.prototype.positionAt = function (offset) {\n offset = Math.max(Math.min(offset, this._content.length), 0);\n var lineOffsets = this.getLineOffsets();\n var low = 0, high = lineOffsets.length;\n if (high === 0) {\n return Position.create(0, offset);\n }\n while (low < high) {\n var mid = Math.floor((low + high) / 2);\n if (lineOffsets[mid] > offset) {\n high = mid;\n }\n else {\n low = mid + 1;\n }\n }\n // low is the least x for which the line offset is larger than the current offset\n // or array.length if no line offset is larger than the current offset\n var line = low - 1;\n return Position.create(line, offset - lineOffsets[line]);\n };\n FullTextDocument.prototype.offsetAt = function (position) {\n var lineOffsets = this.getLineOffsets();\n if (position.line >= lineOffsets.length) {\n return this._content.length;\n }\n else if (position.line < 0) {\n return 0;\n }\n var lineOffset = lineOffsets[position.line];\n var nextLineOffset = (position.line + 1 < lineOffsets.length) ? lineOffsets[position.line + 1] : this._content.length;\n return Math.max(Math.min(lineOffset + position.character, nextLineOffset), lineOffset);\n };\n Object.defineProperty(FullTextDocument.prototype, \"lineCount\", {\n get: function () {\n return this.getLineOffsets().length;\n },\n enumerable: false,\n configurable: true\n });\n return FullTextDocument;\n}());\nvar Is;\n(function (Is) {\n var toString = Object.prototype.toString;\n function defined(value) {\n return typeof value !== 'undefined';\n }\n Is.defined = defined;\n function undefined(value) {\n return typeof value === 'undefined';\n }\n Is.undefined = undefined;\n function boolean(value) {\n return value === true || value === false;\n }\n Is.boolean = boolean;\n function string(value) {\n return toString.call(value) === '[object String]';\n }\n Is.string = string;\n function number(value) {\n return toString.call(value) === '[object Number]';\n }\n Is.number = number;\n function numberRange(value, min, max) {\n return toString.call(value) === '[object Number]' && min <= value && value <= max;\n }\n Is.numberRange = numberRange;\n function integer(value) {\n return toString.call(value) === '[object Number]' && -2147483648 <= value && value <= 2147483647;\n }\n Is.integer = integer;\n function uinteger(value) {\n return toString.call(value) === '[object Number]' && 0 <= value && value <= 2147483647;\n }\n Is.uinteger = uinteger;\n function func(value) {\n return toString.call(value) === '[object Function]';\n }\n Is.func = func;\n function objectLiteral(value) {\n // Strictly speaking class instances pass this check as well. Since the LSP\n // doesn't use classes we ignore this for now. If we do we need to add something\n // like this: `Object.getPrototypeOf(Object.getPrototypeOf(x)) === null`\n return value !== null && typeof value === 'object';\n }\n Is.objectLiteral = objectLiteral;\n function typedArray(value, check) {\n return Array.isArray(value) && value.every(check);\n }\n Is.typedArray = typedArray;\n})(Is || (Is = {}));\n", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ProtocolNotificationType = exports.ProtocolNotificationType0 = exports.ProtocolRequestType = exports.ProtocolRequestType0 = exports.RegistrationType = void 0;\nconst vscode_jsonrpc_1 = require(\"vscode-jsonrpc\");\nclass RegistrationType {\n constructor(method) {\n this.method = method;\n }\n}\nexports.RegistrationType = RegistrationType;\nclass ProtocolRequestType0 extends vscode_jsonrpc_1.RequestType0 {\n constructor(method) {\n super(method);\n }\n}\nexports.ProtocolRequestType0 = ProtocolRequestType0;\nclass ProtocolRequestType extends vscode_jsonrpc_1.RequestType {\n constructor(method) {\n super(method, vscode_jsonrpc_1.ParameterStructures.byName);\n }\n}\nexports.ProtocolRequestType = ProtocolRequestType;\nclass ProtocolNotificationType0 extends vscode_jsonrpc_1.NotificationType0 {\n constructor(method) {\n super(method);\n }\n}\nexports.ProtocolNotificationType0 = ProtocolNotificationType0;\nclass ProtocolNotificationType extends vscode_jsonrpc_1.NotificationType {\n constructor(method) {\n super(method, vscode_jsonrpc_1.ParameterStructures.byName);\n }\n}\nexports.ProtocolNotificationType = ProtocolNotificationType;\n// let x: ProtocolNotificationType<number, { value: number}>;\n// let y: ProtocolNotificationType<string, { value: number}>;\n// x = y;\n//# sourceMappingURL=messages.js.map", "/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\n'use strict';\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.objectLiteral = exports.typedArray = exports.stringArray = exports.array = exports.func = exports.error = exports.number = exports.string = exports.boolean = void 0;\nfunction boolean(value) {\n return value === true || value === false;\n}\nexports.boolean = boolean;\nfunction string(value) {\n return typeof value === 'string' || value instanceof String;\n}\nexports.string = string;\nfunction number(value) {\n return typeof value === 'number' || value instanceof Number;\n}\nexports.number = number;\nfunction error(value) {\n return value instanceof Error;\n}\nexports.error = error;\nfunction func(value) {\n return typeof value === 'function';\n}\nexports.func = func;\nfunction array(value) {\n return Array.isArray(value);\n}\nexports.array = array;\nfunction stringArray(value) {\n return array(value) && value.every(elem => string(elem));\n}\nexports.stringArray = stringArray;\nfunction typedArray(value, check) {\n return Array.isArray(value) && value.every(check);\n}\nexports.typedArray = typedArray;\nfunction objectLiteral(value) {\n // Strictly speaking class instances pass this check as well. Since the LSP\n // doesn't use classes we ignore this for now. If we do we need to add something\n // like this: `Object.getPrototypeOf(Object.getPrototypeOf(x)) === null`\n return value !== null && typeof value === 'object';\n}\nexports.objectLiteral = objectLiteral;\n//# sourceMappingURL=is.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ImplementationRequest = void 0;\nconst messages_1 = require(\"./messages\");\n// @ts-ignore: to avoid inlining LocatioLink as dynamic import\nlet __noDynamicImport;\n/**\n * A request to resolve the implementation locations of a symbol at a given text\n * document position. The request's parameter is of type [TextDocumentPositioParams]\n * (#TextDocumentPositionParams) the response is of type [Definition](#Definition) or a\n * Thenable that resolves to such.\n */\nvar ImplementationRequest;\n(function (ImplementationRequest) {\n ImplementationRequest.method = 'textDocument/implementation';\n ImplementationRequest.type = new messages_1.ProtocolRequestType(ImplementationRequest.method);\n})(ImplementationRequest = exports.ImplementationRequest || (exports.ImplementationRequest = {}));\n//# sourceMappingURL=protocol.implementation.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TypeDefinitionRequest = void 0;\nconst messages_1 = require(\"./messages\");\n// @ts-ignore: to avoid inlining LocatioLink as dynamic import\nlet __noDynamicImport;\n/**\n * A request to resolve the type definition locations of a symbol at a given text\n * document position. The request's parameter is of type [TextDocumentPositioParams]\n * (#TextDocumentPositionParams) the response is of type [Definition](#Definition) or a\n * Thenable that resolves to such.\n */\nvar TypeDefinitionRequest;\n(function (TypeDefinitionRequest) {\n TypeDefinitionRequest.method = 'textDocument/typeDefinition';\n TypeDefinitionRequest.type = new messages_1.ProtocolRequestType(TypeDefinitionRequest.method);\n})(TypeDefinitionRequest = exports.TypeDefinitionRequest || (exports.TypeDefinitionRequest = {}));\n//# sourceMappingURL=protocol.typeDefinition.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DidChangeWorkspaceFoldersNotification = exports.WorkspaceFoldersRequest = void 0;\nconst messages_1 = require(\"./messages\");\n/**\n * The `workspace/workspaceFolders` is sent from the server to the client to fetch the open workspace folders.\n */\nvar WorkspaceFoldersRequest;\n(function (WorkspaceFoldersRequest) {\n WorkspaceFoldersRequest.type = new messages_1.ProtocolRequestType0('workspace/workspaceFolders');\n})(WorkspaceFoldersRequest = exports.WorkspaceFoldersRequest || (exports.WorkspaceFoldersRequest = {}));\n/**\n * The `workspace/didChangeWorkspaceFolders` notification is sent from the client to the server when the workspace\n * folder configuration changes.\n */\nvar DidChangeWorkspaceFoldersNotification;\n(function (DidChangeWorkspaceFoldersNotification) {\n DidChangeWorkspaceFoldersNotification.type = new messages_1.ProtocolNotificationType('workspace/didChangeWorkspaceFolders');\n})(DidChangeWorkspaceFoldersNotification = exports.DidChangeWorkspaceFoldersNotification || (exports.DidChangeWorkspaceFoldersNotification = {}));\n//# sourceMappingURL=protocol.workspaceFolders.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ConfigurationRequest = void 0;\nconst messages_1 = require(\"./messages\");\n/**\n * The 'workspace/configuration' request is sent from the server to the client to fetch a certain\n * configuration setting.\n *\n * This pull model replaces the old push model were the client signaled configuration change via an\n * event. If the server still needs to react to configuration changes (since the server caches the\n * result of `workspace/configuration` requests) the server should register for an empty configuration\n * change event and empty the cache if such an event is received.\n */\nvar ConfigurationRequest;\n(function (ConfigurationRequest) {\n ConfigurationRequest.type = new messages_1.ProtocolRequestType('workspace/configuration');\n})(ConfigurationRequest = exports.ConfigurationRequest || (exports.ConfigurationRequest = {}));\n//# sourceMappingURL=protocol.configuration.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ColorPresentationRequest = exports.DocumentColorRequest = void 0;\nconst messages_1 = require(\"./messages\");\n/**\n * A request to list all color symbols found in a given text document. The request's\n * parameter is of type [DocumentColorParams](#DocumentColorParams) the\n * response is of type [ColorInformation[]](#ColorInformation) or a Thenable\n * that resolves to such.\n */\nvar DocumentColorRequest;\n(function (DocumentColorRequest) {\n DocumentColorRequest.method = 'textDocument/documentColor';\n DocumentColorRequest.type = new messages_1.ProtocolRequestType(DocumentColorRequest.method);\n})(DocumentColorRequest = exports.DocumentColorRequest || (exports.DocumentColorRequest = {}));\n/**\n * A request to list all presentation for a color. The request's\n * parameter is of type [ColorPresentationParams](#ColorPresentationParams) the\n * response is of type [ColorInformation[]](#ColorInformation) or a Thenable\n * that resolves to such.\n */\nvar ColorPresentationRequest;\n(function (ColorPresentationRequest) {\n ColorPresentationRequest.type = new messages_1.ProtocolRequestType('textDocument/colorPresentation');\n})(ColorPresentationRequest = exports.ColorPresentationRequest || (exports.ColorPresentationRequest = {}));\n//# sourceMappingURL=protocol.colorProvider.js.map", "\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FoldingRangeRequest = exports.FoldingRangeKind = void 0;\nconst messages_1 = require(\"./messages\");\n/**\n * Enum of known range kinds\n */\nvar FoldingRangeKind;\n(function (FoldingRangeKind) {\n /**\n * Folding range for a comment\n */\n FoldingRangeKind[\"Comment\"] = \"comment\";\n /**\n * Folding range for a imports or includes\n */\n FoldingRangeKind[\"Imports\"] = \"imports\";\n /**\n * Folding range for a region (e.g. `#region`)\n */\n FoldingRangeKind[\"Region\"] = \"region\";\n})(FoldingRangeKind = exports.FoldingRangeKind || (exports.FoldingRangeKind = {}));\n/**\n * A request to provide folding ranges in a document. The request's\n * parameter is of type [FoldingRangeParams](#FoldingRangeParams), the\n * response is of type [FoldingRangeList](#FoldingRangeList) or a Thenable\n * that resolves to such.\n */\nvar FoldingRangeRequest;\n(function (FoldingRangeRequest) {\n FoldingRangeRequest.method = 'textDocument/foldingRange';\n FoldingRangeRequest.type = new messages_1.ProtocolRequestType(FoldingRangeRequest.method);\n})(FoldingRangeRequest = exports.FoldingRangeRequest || (exports.FoldingRangeRequest = {}));\n//# sourceMappingURL=protocol.foldingRange.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DeclarationRequest = void 0;\nconst messages_1 = require(\"./messages\");\n// @ts-ignore: to avoid inlining LocatioLink as dynamic import\nlet __noDynamicImport;\n/**\n * A request to resolve the type definition locations of a symbol at a given text\n * document position. The request's parameter is of type [TextDocumentPositioParams]\n * (#TextDocumentPositionParams) the response is of type [Declaration](#Declaration)\n * or a typed array of [DeclarationLink](#DeclarationLink) or a Thenable that resolves\n * to such.\n */\nvar DeclarationRequest;\n(function (DeclarationRequest) {\n DeclarationRequest.method = 'textDocument/declaration';\n DeclarationRequest.type = new messages_1.ProtocolRequestType(DeclarationRequest.method);\n})(DeclarationRequest = exports.DeclarationRequest || (exports.DeclarationRequest = {}));\n//# sourceMappingURL=protocol.declaration.js.map", "\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SelectionRangeRequest = void 0;\nconst messages_1 = require(\"./messages\");\n/**\n * A request to provide selection ranges in a document. The request's\n * parameter is of type [SelectionRangeParams](#SelectionRangeParams), the\n * response is of type [SelectionRange[]](#SelectionRange[]) or a Thenable\n * that resolves to such.\n */\nvar SelectionRangeRequest;\n(function (SelectionRangeRequest) {\n SelectionRangeRequest.method = 'textDocument/selectionRange';\n SelectionRangeRequest.type = new messages_1.ProtocolRequestType(SelectionRangeRequest.method);\n})(SelectionRangeRequest = exports.SelectionRangeRequest || (exports.SelectionRangeRequest = {}));\n//# sourceMappingURL=protocol.selectionRange.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.WorkDoneProgressCancelNotification = exports.WorkDoneProgressCreateRequest = exports.WorkDoneProgress = void 0;\nconst vscode_jsonrpc_1 = require(\"vscode-jsonrpc\");\nconst messages_1 = require(\"./messages\");\nvar WorkDoneProgress;\n(function (WorkDoneProgress) {\n WorkDoneProgress.type = new vscode_jsonrpc_1.ProgressType();\n function is(value) {\n return value === WorkDoneProgress.type;\n }\n WorkDoneProgress.is = is;\n})(WorkDoneProgress = exports.WorkDoneProgress || (exports.WorkDoneProgress = {}));\n/**\n * The `window/workDoneProgress/create` request is sent from the server to the client to initiate progress\n * reporting from the server.\n */\nvar WorkDoneProgressCreateRequest;\n(function (WorkDoneProgressCreateRequest) {\n WorkDoneProgressCreateRequest.type = new messages_1.ProtocolRequestType('window/workDoneProgress/create');\n})(WorkDoneProgressCreateRequest = exports.WorkDoneProgressCreateRequest || (exports.WorkDoneProgressCreateRequest = {}));\n/**\n * The `window/workDoneProgress/cancel` notification is sent from the client to the server to cancel a progress\n * initiated on the server side.\n */\nvar WorkDoneProgressCancelNotification;\n(function (WorkDoneProgressCancelNotification) {\n WorkDoneProgressCancelNotification.type = new messages_1.ProtocolNotificationType('window/workDoneProgress/cancel');\n})(WorkDoneProgressCancelNotification = exports.WorkDoneProgressCancelNotification || (exports.WorkDoneProgressCancelNotification = {}));\n//# sourceMappingURL=protocol.progress.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) TypeFox and others. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CallHierarchyOutgoingCallsRequest = exports.CallHierarchyIncomingCallsRequest = exports.CallHierarchyPrepareRequest = void 0;\nconst messages_1 = require(\"./messages\");\n/**\n * A request to result a `CallHierarchyItem` in a document at a given position.\n * Can be used as an input to a incoming or outgoing call hierarchy.\n *\n * @since 3.16.0\n */\nvar CallHierarchyPrepareRequest;\n(function (CallHierarchyPrepareRequest) {\n CallHierarchyPrepareRequest.method = 'textDocument/prepareCallHierarchy';\n CallHierarchyPrepareRequest.type = new messages_1.ProtocolRequestType(CallHierarchyPrepareRequest.method);\n})(CallHierarchyPrepareRequest = exports.CallHierarchyPrepareRequest || (exports.CallHierarchyPrepareRequest = {}));\n/**\n * A request to resolve the incoming calls for a given `CallHierarchyItem`.\n *\n * @since 3.16.0\n */\nvar CallHierarchyIncomingCallsRequest;\n(function (CallHierarchyIncomingCallsRequest) {\n CallHierarchyIncomingCallsRequest.method = 'callHierarchy/incomingCalls';\n CallHierarchyIncomingCallsRequest.type = new messages_1.ProtocolRequestType(CallHierarchyIncomingCallsRequest.method);\n})(CallHierarchyIncomingCallsRequest = exports.CallHierarchyIncomingCallsRequest || (exports.CallHierarchyIncomingCallsRequest = {}));\n/**\n * A request to resolve the outgoing calls for a given `CallHierarchyItem`.\n *\n * @since 3.16.0\n */\nvar CallHierarchyOutgoingCallsRequest;\n(function (CallHierarchyOutgoingCallsRequest) {\n CallHierarchyOutgoingCallsRequest.method = 'callHierarchy/outgoingCalls';\n CallHierarchyOutgoingCallsRequest.type = new messages_1.ProtocolRequestType(CallHierarchyOutgoingCallsRequest.method);\n})(CallHierarchyOutgoingCallsRequest = exports.CallHierarchyOutgoingCallsRequest || (exports.CallHierarchyOutgoingCallsRequest = {}));\n//# sourceMappingURL=protocol.callHierarchy.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SemanticTokensRefreshRequest = exports.SemanticTokensRangeRequest = exports.SemanticTokensDeltaRequest = exports.SemanticTokensRequest = exports.SemanticTokensRegistrationType = exports.TokenFormat = exports.SemanticTokens = exports.SemanticTokenModifiers = exports.SemanticTokenTypes = void 0;\nconst messages_1 = require(\"./messages\");\n/**\n * A set of predefined token types. This set is not fixed\n * an clients can specify additional token types via the\n * corresponding client capabilities.\n *\n * @since 3.16.0\n */\nvar SemanticTokenTypes;\n(function (SemanticTokenTypes) {\n SemanticTokenTypes[\"namespace\"] = \"namespace\";\n /**\n * Represents a generic type. Acts as a fallback for types which can't be mapped to\n * a specific type like class or enum.\n */\n SemanticTokenTypes[\"type\"] = \"type\";\n SemanticTokenTypes[\"class\"] = \"class\";\n SemanticTokenTypes[\"enum\"] = \"enum\";\n SemanticTokenTypes[\"interface\"] = \"interface\";\n SemanticTokenTypes[\"struct\"] = \"struct\";\n SemanticTokenTypes[\"typeParameter\"] = \"typeParameter\";\n SemanticTokenTypes[\"parameter\"] = \"parameter\";\n SemanticTokenTypes[\"variable\"] = \"variable\";\n SemanticTokenTypes[\"property\"] = \"property\";\n SemanticTokenTypes[\"enumMember\"] = \"enumMember\";\n SemanticTokenTypes[\"event\"] = \"event\";\n SemanticTokenTypes[\"function\"] = \"function\";\n SemanticTokenTypes[\"method\"] = \"method\";\n SemanticTokenTypes[\"macro\"] = \"macro\";\n SemanticTokenTypes[\"keyword\"] = \"keyword\";\n SemanticTokenTypes[\"modifier\"] = \"modifier\";\n SemanticTokenTypes[\"comment\"] = \"comment\";\n SemanticTokenTypes[\"string\"] = \"string\";\n SemanticTokenTypes[\"number\"] = \"number\";\n SemanticTokenTypes[\"regexp\"] = \"regexp\";\n SemanticTokenTypes[\"operator\"] = \"operator\";\n})(SemanticTokenTypes = exports.SemanticTokenTypes || (exports.SemanticTokenTypes = {}));\n/**\n * A set of predefined token modifiers. This set is not fixed\n * an clients can specify additional token types via the\n * corresponding client capabilities.\n *\n * @since 3.16.0\n */\nvar SemanticTokenModifiers;\n(function (SemanticTokenModifiers) {\n SemanticTokenModifiers[\"declaration\"] = \"declaration\";\n SemanticTokenModifiers[\"definition\"] = \"definition\";\n SemanticTokenModifiers[\"readonly\"] = \"readonly\";\n SemanticTokenModifiers[\"static\"] = \"static\";\n SemanticTokenModifiers[\"deprecated\"] = \"deprecated\";\n SemanticTokenModifiers[\"abstract\"] = \"abstract\";\n SemanticTokenModifiers[\"async\"] = \"async\";\n SemanticTokenModifiers[\"modification\"] = \"modification\";\n SemanticTokenModifiers[\"documentation\"] = \"documentation\";\n SemanticTokenModifiers[\"defaultLibrary\"] = \"defaultLibrary\";\n})(SemanticTokenModifiers = exports.SemanticTokenModifiers || (exports.SemanticTokenModifiers = {}));\n/**\n * @since 3.16.0\n */\nvar SemanticTokens;\n(function (SemanticTokens) {\n function is(value) {\n const candidate = value;\n return candidate !== undefined && (candidate.resultId === undefined || typeof candidate.resultId === 'string') &&\n Array.isArray(candidate.data) && (candidate.data.length === 0 || typeof candidate.data[0] === 'number');\n }\n SemanticTokens.is = is;\n})(SemanticTokens = exports.SemanticTokens || (exports.SemanticTokens = {}));\n//------- 'textDocument/semanticTokens' -----\nvar TokenFormat;\n(function (TokenFormat) {\n TokenFormat.Relative = 'relative';\n})(TokenFormat = exports.TokenFormat || (exports.TokenFormat = {}));\nvar SemanticTokensRegistrationType;\n(function (SemanticTokensRegistrationType) {\n SemanticTokensRegistrationType.method = 'textDocument/semanticTokens';\n SemanticTokensRegistrationType.type = new messages_1.RegistrationType(SemanticTokensRegistrationType.method);\n})(SemanticTokensRegistrationType = exports.SemanticTokensRegistrationType || (exports.SemanticTokensRegistrationType = {}));\n/**\n * @since 3.16.0\n */\nvar SemanticTokensRequest;\n(function (SemanticTokensRequest) {\n SemanticTokensRequest.method = 'textDocument/semanticTokens/full';\n SemanticTokensRequest.type = new messages_1.ProtocolRequestType(SemanticTokensRequest.method);\n})(SemanticTokensRequest = exports.SemanticTokensRequest || (exports.SemanticTokensRequest = {}));\n/**\n * @since 3.16.0\n */\nvar SemanticTokensDeltaRequest;\n(function (SemanticTokensDeltaRequest) {\n SemanticTokensDeltaRequest.method = 'textDocument/semanticTokens/full/delta';\n SemanticTokensDeltaRequest.type = new messages_1.ProtocolRequestType(SemanticTokensDeltaRequest.method);\n})(SemanticTokensDeltaRequest = exports.SemanticTokensDeltaRequest || (exports.SemanticTokensDeltaRequest = {}));\n/**\n * @since 3.16.0\n */\nvar SemanticTokensRangeRequest;\n(function (SemanticTokensRangeRequest) {\n SemanticTokensRangeRequest.method = 'textDocument/semanticTokens/range';\n SemanticTokensRangeRequest.type = new messages_1.ProtocolRequestType(SemanticTokensRangeRequest.method);\n})(SemanticTokensRangeRequest = exports.SemanticTokensRangeRequest || (exports.SemanticTokensRangeRequest = {}));\n/**\n * @since 3.16.0\n */\nvar SemanticTokensRefreshRequest;\n(function (SemanticTokensRefreshRequest) {\n SemanticTokensRefreshRequest.method = `workspace/semanticTokens/refresh`;\n SemanticTokensRefreshRequest.type = new messages_1.ProtocolRequestType0(SemanticTokensRefreshRequest.method);\n})(SemanticTokensRefreshRequest = exports.SemanticTokensRefreshRequest || (exports.SemanticTokensRefreshRequest = {}));\n//# sourceMappingURL=protocol.semanticTokens.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ShowDocumentRequest = void 0;\nconst messages_1 = require(\"./messages\");\n/**\n * A request to show a document. This request might open an\n * external program depending on the value of the URI to open.\n * For example a request to open `https://code.visualstudio.com/`\n * will very likely open the URI in a WEB browser.\n *\n * @since 3.16.0\n*/\nvar ShowDocumentRequest;\n(function (ShowDocumentRequest) {\n ShowDocumentRequest.method = 'window/showDocument';\n ShowDocumentRequest.type = new messages_1.ProtocolRequestType(ShowDocumentRequest.method);\n})(ShowDocumentRequest = exports.ShowDocumentRequest || (exports.ShowDocumentRequest = {}));\n//# sourceMappingURL=protocol.showDocument.js.map", "\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LinkedEditingRangeRequest = void 0;\nconst messages_1 = require(\"./messages\");\n/**\n * A request to provide ranges that can be edited together.\n *\n * @since 3.16.0\n */\nvar LinkedEditingRangeRequest;\n(function (LinkedEditingRangeRequest) {\n LinkedEditingRangeRequest.method = 'textDocument/linkedEditingRange';\n LinkedEditingRangeRequest.type = new messages_1.ProtocolRequestType(LinkedEditingRangeRequest.method);\n})(LinkedEditingRangeRequest = exports.LinkedEditingRangeRequest || (exports.LinkedEditingRangeRequest = {}));\n//# sourceMappingURL=protocol.linkedEditingRange.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.WillDeleteFilesRequest = exports.DidDeleteFilesNotification = exports.DidRenameFilesNotification = exports.WillRenameFilesRequest = exports.DidCreateFilesNotification = exports.WillCreateFilesRequest = exports.FileOperationPatternKind = void 0;\nconst messages_1 = require(\"./messages\");\n/**\n * A pattern kind describing if a glob pattern matches a file a folder or\n * both.\n *\n * @since 3.16.0\n */\nvar FileOperationPatternKind;\n(function (FileOperationPatternKind) {\n /**\n * The pattern matches a file only.\n */\n FileOperationPatternKind.file = 'file';\n /**\n * The pattern matches a folder only.\n */\n FileOperationPatternKind.folder = 'folder';\n})(FileOperationPatternKind = exports.FileOperationPatternKind || (exports.FileOperationPatternKind = {}));\n/**\n * The will create files request is sent from the client to the server before files are actually\n * created as long as the creation is triggered from within the client.\n *\n * @since 3.16.0\n */\nvar WillCreateFilesRequest;\n(function (WillCreateFilesRequest) {\n WillCreateFilesRequest.method = 'workspace/willCreateFiles';\n WillCreateFilesRequest.type = new messages_1.ProtocolRequestType(WillCreateFilesRequest.method);\n})(WillCreateFilesRequest = exports.WillCreateFilesRequest || (exports.WillCreateFilesRequest = {}));\n/**\n * The did create files notification is sent from the client to the server when\n * files were created from within the client.\n *\n * @since 3.16.0\n */\nvar DidCreateFilesNotification;\n(function (DidCreateFilesNotification) {\n DidCreateFilesNotification.method = 'workspace/didCreateFiles';\n DidCreateFilesNotification.type = new messages_1.ProtocolNotificationType(DidCreateFilesNotification.method);\n})(DidCreateFilesNotification = exports.DidCreateFilesNotification || (exports.DidCreateFilesNotification = {}));\n/**\n * The will rename files request is sent from the client to the server before files are actually\n * renamed as long as the rename is triggered from within the client.\n *\n * @since 3.16.0\n */\nvar WillRenameFilesRequest;\n(function (WillRenameFilesRequest) {\n WillRenameFilesRequest.method = 'workspace/willRenameFiles';\n WillRenameFilesRequest.type = new messages_1.ProtocolRequestType(WillRenameFilesRequest.method);\n})(WillRenameFilesRequest = exports.WillRenameFilesRequest || (exports.WillRenameFilesRequest = {}));\n/**\n * The did rename files notification is sent from the client to the server when\n * files were renamed from within the client.\n *\n * @since 3.16.0\n */\nvar DidRenameFilesNotification;\n(function (DidRenameFilesNotification) {\n DidRenameFilesNotification.method = 'workspace/didRenameFiles';\n DidRenameFilesNotification.type = new messages_1.ProtocolNotificationType(DidRenameFilesNotification.method);\n})(DidRenameFilesNotification = exports.DidRenameFilesNotification || (exports.DidRenameFilesNotification = {}));\n/**\n * The will delete files request is sent from the client to the server before files are actually\n * deleted as long as the deletion is triggered from within the client.\n *\n * @since 3.16.0\n */\nvar DidDeleteFilesNotification;\n(function (DidDeleteFilesNotification) {\n DidDeleteFilesNotification.method = 'workspace/didDeleteFiles';\n DidDeleteFilesNotification.type = new messages_1.ProtocolNotificationType(DidDeleteFilesNotification.method);\n})(DidDeleteFilesNotification = exports.DidDeleteFilesNotification || (exports.DidDeleteFilesNotification = {}));\n/**\n * The did delete files notification is sent from the client to the server when\n * files were deleted from within the client.\n *\n * @since 3.16.0\n */\nvar WillDeleteFilesRequest;\n(function (WillDeleteFilesRequest) {\n WillDeleteFilesRequest.method = 'workspace/willDeleteFiles';\n WillDeleteFilesRequest.type = new messages_1.ProtocolRequestType(WillDeleteFilesRequest.method);\n})(WillDeleteFilesRequest = exports.WillDeleteFilesRequest || (exports.WillDeleteFilesRequest = {}));\n//# sourceMappingURL=protocol.fileOperations.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MonikerRequest = exports.MonikerKind = exports.UniquenessLevel = void 0;\nconst messages_1 = require(\"./messages\");\n/**\n * Moniker uniqueness level to define scope of the moniker.\n *\n * @since 3.16.0\n */\nvar UniquenessLevel;\n(function (UniquenessLevel) {\n /**\n * The moniker is only unique inside a document\n */\n UniquenessLevel[\"document\"] = \"document\";\n /**\n * The moniker is unique inside a project for which a dump got created\n */\n UniquenessLevel[\"project\"] = \"project\";\n /**\n * The moniker is unique inside the group to which a project belongs\n */\n UniquenessLevel[\"group\"] = \"group\";\n /**\n * The moniker is unique inside the moniker scheme.\n */\n UniquenessLevel[\"scheme\"] = \"scheme\";\n /**\n * The moniker is globally unique\n */\n UniquenessLevel[\"global\"] = \"global\";\n})(UniquenessLevel = exports.UniquenessLevel || (exports.UniquenessLevel = {}));\n/**\n * The moniker kind.\n *\n * @since 3.16.0\n */\nvar MonikerKind;\n(function (MonikerKind) {\n /**\n * The moniker represent a symbol that is imported into a project\n */\n MonikerKind[\"import\"] = \"import\";\n /**\n * The moniker represents a symbol that is exported from a project\n */\n MonikerKind[\"export\"] = \"export\";\n /**\n * The moniker represents a symbol that is local to a project (e.g. a local\n * variable of a function, a class not visible outside the project, ...)\n */\n MonikerKind[\"local\"] = \"local\";\n})(MonikerKind = exports.MonikerKind || (exports.MonikerKind = {}));\n/**\n * A request to get the moniker of a symbol at a given text document position.\n * The request parameter is of type [TextDocumentPositionParams](#TextDocumentPositionParams).\n * The response is of type [Moniker[]](#Moniker[]) or `null`.\n */\nvar MonikerRequest;\n(function (MonikerRequest) {\n MonikerRequest.method = 'textDocument/moniker';\n MonikerRequest.type = new messages_1.ProtocolRequestType(MonikerRequest.method);\n})(MonikerRequest = exports.MonikerRequest || (exports.MonikerRequest = {}));\n//# sourceMappingURL=protocol.moniker.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DocumentLinkRequest = exports.CodeLensRefreshRequest = exports.CodeLensResolveRequest = exports.CodeLensRequest = exports.WorkspaceSymbolRequest = exports.CodeActionResolveRequest = exports.CodeActionRequest = exports.DocumentSymbolRequest = exports.DocumentHighlightRequest = exports.ReferencesRequest = exports.DefinitionRequest = exports.SignatureHelpRequest = exports.SignatureHelpTriggerKind = exports.HoverRequest = exports.CompletionResolveRequest = exports.CompletionRequest = exports.CompletionTriggerKind = exports.PublishDiagnosticsNotification = exports.WatchKind = exports.FileChangeType = exports.DidChangeWatchedFilesNotification = exports.WillSaveTextDocumentWaitUntilRequest = exports.WillSaveTextDocumentNotification = exports.TextDocumentSaveReason = exports.DidSaveTextDocumentNotification = exports.DidCloseTextDocumentNotification = exports.DidChangeTextDocumentNotification = exports.TextDocumentContentChangeEvent = exports.DidOpenTextDocumentNotification = exports.TextDocumentSyncKind = exports.TelemetryEventNotification = exports.LogMessageNotification = exports.ShowMessageRequest = exports.ShowMessageNotification = exports.MessageType = exports.DidChangeConfigurationNotification = exports.ExitNotification = exports.ShutdownRequest = exports.InitializedNotification = exports.InitializeError = exports.InitializeRequest = exports.WorkDoneProgressOptions = exports.TextDocumentRegistrationOptions = exports.StaticRegistrationOptions = exports.FailureHandlingKind = exports.ResourceOperationKind = exports.UnregistrationRequest = exports.RegistrationRequest = exports.DocumentSelector = exports.DocumentFilter = void 0;\nexports.MonikerRequest = exports.MonikerKind = exports.UniquenessLevel = exports.WillDeleteFilesRequest = exports.DidDeleteFilesNotification = exports.WillRenameFilesRequest = exports.DidRenameFilesNotification = exports.WillCreateFilesRequest = exports.DidCreateFilesNotification = exports.FileOperationPatternKind = exports.LinkedEditingRangeRequest = exports.ShowDocumentRequest = exports.SemanticTokensRegistrationType = exports.SemanticTokensRefreshRequest = exports.SemanticTokensRangeRequest = exports.SemanticTokensDeltaRequest = exports.SemanticTokensRequest = exports.TokenFormat = exports.SemanticTokens = exports.SemanticTokenModifiers = exports.SemanticTokenTypes = exports.CallHierarchyPrepareRequest = exports.CallHierarchyOutgoingCallsRequest = exports.CallHierarchyIncomingCallsRequest = exports.WorkDoneProgressCancelNotification = exports.WorkDoneProgressCreateRequest = exports.WorkDoneProgress = exports.SelectionRangeRequest = exports.DeclarationRequest = exports.FoldingRangeRequest = exports.ColorPresentationRequest = exports.DocumentColorRequest = exports.ConfigurationRequest = exports.DidChangeWorkspaceFoldersNotification = exports.WorkspaceFoldersRequest = exports.TypeDefinitionRequest = exports.ImplementationRequest = exports.ApplyWorkspaceEditRequest = exports.ExecuteCommandRequest = exports.PrepareRenameRequest = exports.RenameRequest = exports.PrepareSupportDefaultBehavior = exports.DocumentOnTypeFormattingRequest = exports.DocumentRangeFormattingRequest = exports.DocumentFormattingRequest = exports.DocumentLinkResolveRequest = void 0;\nconst Is = require(\"./utils/is\");\nconst messages_1 = require(\"./messages\");\nconst protocol_implementation_1 = require(\"./protocol.implementation\");\nObject.defineProperty(exports, \"ImplementationRequest\", { enumerable: true, get: function () { return protocol_implementation_1.ImplementationRequest; } });\nconst protocol_typeDefinition_1 = require(\"./protocol.typeDefinition\");\nObject.defineProperty(exports, \"TypeDefinitionRequest\", { enumerable: true, get: function () { return protocol_typeDefinition_1.TypeDefinitionRequest; } });\nconst protocol_workspaceFolders_1 = require(\"./protocol.workspaceFolders\");\nObject.defineProperty(exports, \"WorkspaceFoldersRequest\", { enumerable: true, get: function () { return protocol_workspaceFolders_1.WorkspaceFoldersRequest; } });\nObject.defineProperty(exports, \"DidChangeWorkspaceFoldersNotification\", { enumerable: true, get: function () { return protocol_workspaceFolders_1.DidChangeWorkspaceFoldersNotification; } });\nconst protocol_configuration_1 = require(\"./protocol.configuration\");\nObject.defineProperty(exports, \"ConfigurationRequest\", { enumerable: true, get: function () { return protocol_configuration_1.ConfigurationRequest; } });\nconst protocol_colorProvider_1 = require(\"./protocol.colorProvider\");\nObject.defineProperty(exports, \"DocumentColorRequest\", { enumerable: true, get: function () { return protocol_colorProvider_1.DocumentColorRequest; } });\nObject.defineProperty(exports, \"ColorPresentationRequest\", { enumerable: true, get: function () { return protocol_colorProvider_1.ColorPresentationRequest; } });\nconst protocol_foldingRange_1 = require(\"./protocol.foldingRange\");\nObject.defineProperty(exports, \"FoldingRangeRequest\", { enumerable: true, get: function () { return protocol_foldingRange_1.FoldingRangeRequest; } });\nconst protocol_declaration_1 = require(\"./protocol.declaration\");\nObject.defineProperty(exports, \"DeclarationRequest\", { enumerable: true, get: function () { return protocol_declaration_1.DeclarationRequest; } });\nconst protocol_selectionRange_1 = require(\"./protocol.selectionRange\");\nObject.defineProperty(exports, \"SelectionRangeRequest\", { enumerable: true, get: function () { return protocol_selectionRange_1.SelectionRangeRequest; } });\nconst protocol_progress_1 = require(\"./protocol.progress\");\nObject.defineProperty(exports, \"WorkDoneProgress\", { enumerable: true, get: function () { return protocol_progress_1.WorkDoneProgress; } });\nObject.defineProperty(exports, \"WorkDoneProgressCreateRequest\", { enumerable: true, get: function () { return protocol_progress_1.WorkDoneProgressCreateRequest; } });\nObject.defineProperty(exports, \"WorkDoneProgressCancelNotification\", { enumerable: true, get: function () { return protocol_progress_1.WorkDoneProgressCancelNotification; } });\nconst protocol_callHierarchy_1 = require(\"./protocol.callHierarchy\");\nObject.defineProperty(exports, \"CallHierarchyIncomingCallsRequest\", { enumerable: true, get: function () { return protocol_callHierarchy_1.CallHierarchyIncomingCallsRequest; } });\nObject.defineProperty(exports, \"CallHierarchyOutgoingCallsRequest\", { enumerable: true, get: function () { return protocol_callHierarchy_1.CallHierarchyOutgoingCallsRequest; } });\nObject.defineProperty(exports, \"CallHierarchyPrepareRequest\", { enumerable: true, get: function () { return protocol_callHierarchy_1.CallHierarchyPrepareRequest; } });\nconst protocol_semanticTokens_1 = require(\"./protocol.semanticTokens\");\nObject.defineProperty(exports, \"SemanticTokenTypes\", { enumerable: true, get: function () { return protocol_semanticTokens_1.SemanticTokenTypes; } });\nObject.defineProperty(exports, \"SemanticTokenModifiers\", { enumerable: true, get: function () { return protocol_semanticTokens_1.SemanticTokenModifiers; } });\nObject.defineProperty(exports, \"SemanticTokens\", { enumerable: true, get: function () { return protocol_semanticTokens_1.SemanticTokens; } });\nObject.defineProperty(exports, \"TokenFormat\", { enumerable: true, get: function () { return protocol_semanticTokens_1.TokenFormat; } });\nObject.defineProperty(exports, \"SemanticTokensRequest\", { enumerable: true, get: function () { return protocol_semanticTokens_1.SemanticTokensRequest; } });\nObject.defineProperty(exports, \"SemanticTokensDeltaRequest\", { enumerable: true, get: function () { return protocol_semanticTokens_1.SemanticTokensDeltaRequest; } });\nObject.defineProperty(exports, \"SemanticTokensRangeRequest\", { enumerable: true, get: function () { return protocol_semanticTokens_1.SemanticTokensRangeRequest; } });\nObject.defineProperty(exports, \"SemanticTokensRefreshRequest\", { enumerable: true, get: function () { return protocol_semanticTokens_1.SemanticTokensRefreshRequest; } });\nObject.defineProperty(exports, \"SemanticTokensRegistrationType\", { enumerable: true, get: function () { return protocol_semanticTokens_1.SemanticTokensRegistrationType; } });\nconst protocol_showDocument_1 = require(\"./protocol.showDocument\");\nObject.defineProperty(exports, \"ShowDocumentRequest\", { enumerable: true, get: function () { return protocol_showDocument_1.ShowDocumentRequest; } });\nconst protocol_linkedEditingRange_1 = require(\"./protocol.linkedEditingRange\");\nObject.defineProperty(exports, \"LinkedEditingRangeRequest\", { enumerable: true, get: function () { return protocol_linkedEditingRange_1.LinkedEditingRangeRequest; } });\nconst protocol_fileOperations_1 = require(\"./protocol.fileOperations\");\nObject.defineProperty(exports, \"FileOperationPatternKind\", { enumerable: true, get: function () { return protocol_fileOperations_1.FileOperationPatternKind; } });\nObject.defineProperty(exports, \"DidCreateFilesNotification\", { enumerable: true, get: function () { return protocol_fileOperations_1.DidCreateFilesNotification; } });\nObject.defineProperty(exports, \"WillCreateFilesRequest\", { enumerable: true, get: function () { return protocol_fileOperations_1.WillCreateFilesRequest; } });\nObject.defineProperty(exports, \"DidRenameFilesNotification\", { enumerable: true, get: function () { return protocol_fileOperations_1.DidRenameFilesNotification; } });\nObject.defineProperty(exports, \"WillRenameFilesRequest\", { enumerable: true, get: function () { return protocol_fileOperations_1.WillRenameFilesRequest; } });\nObject.defineProperty(exports, \"DidDeleteFilesNotification\", { enumerable: true, get: function () { return protocol_fileOperations_1.DidDeleteFilesNotification; } });\nObject.defineProperty(exports, \"WillDeleteFilesRequest\", { enumerable: true, get: function () { return protocol_fileOperations_1.WillDeleteFilesRequest; } });\nconst protocol_moniker_1 = require(\"./protocol.moniker\");\nObject.defineProperty(exports, \"UniquenessLevel\", { enumerable: true, get: function () { return protocol_moniker_1.UniquenessLevel; } });\nObject.defineProperty(exports, \"MonikerKind\", { enumerable: true, get: function () { return protocol_moniker_1.MonikerKind; } });\nObject.defineProperty(exports, \"MonikerRequest\", { enumerable: true, get: function () { return protocol_moniker_1.MonikerRequest; } });\n// @ts-ignore: to avoid inlining LocationLink as dynamic import\nlet __noDynamicImport;\n/**\n * The DocumentFilter namespace provides helper functions to work with\n * [DocumentFilter](#DocumentFilter) literals.\n */\nvar DocumentFilter;\n(function (DocumentFilter) {\n function is(value) {\n const candidate = value;\n return Is.string(candidate.language) || Is.string(candidate.scheme) || Is.string(candidate.pattern);\n }\n DocumentFilter.is = is;\n})(DocumentFilter = exports.DocumentFilter || (exports.DocumentFilter = {}));\n/**\n * The DocumentSelector namespace provides helper functions to work with\n * [DocumentSelector](#DocumentSelector)s.\n */\nvar DocumentSelector;\n(function (DocumentSelector) {\n function is(value) {\n if (!Array.isArray(value)) {\n return false;\n }\n for (let elem of value) {\n if (!Is.string(elem) && !DocumentFilter.is(elem)) {\n return false;\n }\n }\n return true;\n }\n DocumentSelector.is = is;\n})(DocumentSelector = exports.DocumentSelector || (exports.DocumentSelector = {}));\n/**\n * The `client/registerCapability` request is sent from the server to the client to register a new capability\n * handler on the client side.\n */\nvar RegistrationRequest;\n(function (RegistrationRequest) {\n RegistrationRequest.type = new messages_1.ProtocolRequestType('client/registerCapability');\n})(RegistrationRequest = exports.RegistrationRequest || (exports.RegistrationRequest = {}));\n/**\n * The `client/unregisterCapability` request is sent from the server to the client to unregister a previously registered capability\n * handler on the client side.\n */\nvar UnregistrationRequest;\n(function (UnregistrationRequest) {\n UnregistrationRequest.type = new messages_1.ProtocolRequestType('client/unregisterCapability');\n})(UnregistrationRequest = exports.UnregistrationRequest || (exports.UnregistrationRequest = {}));\nvar ResourceOperationKind;\n(function (ResourceOperationKind) {\n /**\n * Supports creating new files and folders.\n */\n ResourceOperationKind.Create = 'create';\n /**\n * Supports renaming existing files and folders.\n */\n ResourceOperationKind.Rename = 'rename';\n /**\n * Supports deleting existing files and folders.\n */\n ResourceOperationKind.Delete = 'delete';\n})(ResourceOperationKind = exports.ResourceOperationKind || (exports.ResourceOperationKind = {}));\nvar FailureHandlingKind;\n(function (FailureHandlingKind) {\n /**\n * Applying the workspace change is simply aborted if one of the changes provided\n * fails. All operations executed before the failing operation stay executed.\n */\n FailureHandlingKind.Abort = 'abort';\n /**\n * All operations are executed transactional. That means they either all\n * succeed or no changes at all are applied to the workspace.\n */\n FailureHandlingKind.Transactional = 'transactional';\n /**\n * If the workspace edit contains only textual file changes they are executed transactional.\n * If resource changes (create, rename or delete file) are part of the change the failure\n * handling strategy is abort.\n */\n FailureHandlingKind.TextOnlyTransactional = 'textOnlyTransactional';\n /**\n * The client tries to undo the operations already executed. But there is no\n * guarantee that this is succeeding.\n */\n FailureHandlingKind.Undo = 'undo';\n})(FailureHandlingKind = exports.FailureHandlingKind || (exports.FailureHandlingKind = {}));\n/**\n * The StaticRegistrationOptions namespace provides helper functions to work with\n * [StaticRegistrationOptions](#StaticRegistrationOptions) literals.\n */\nvar StaticRegistrationOptions;\n(function (StaticRegistrationOptions) {\n function hasId(value) {\n const candidate = value;\n return candidate && Is.string(candidate.id) && candidate.id.length > 0;\n }\n StaticRegistrationOptions.hasId = hasId;\n})(StaticRegistrationOptions = exports.StaticRegistrationOptions || (exports.StaticRegistrationOptions = {}));\n/**\n * The TextDocumentRegistrationOptions namespace provides helper functions to work with\n * [TextDocumentRegistrationOptions](#TextDocumentRegistrationOptions) literals.\n */\nvar TextDocumentRegistrationOptions;\n(function (TextDocumentRegistrationOptions) {\n function is(value) {\n const candidate = value;\n return candidate && (candidate.documentSelector === null || DocumentSelector.is(candidate.documentSelector));\n }\n TextDocumentRegistrationOptions.is = is;\n})(TextDocumentRegistrationOptions = exports.TextDocumentRegistrationOptions || (exports.TextDocumentRegistrationOptions = {}));\n/**\n * The WorkDoneProgressOptions namespace provides helper functions to work with\n * [WorkDoneProgressOptions](#WorkDoneProgressOptions) literals.\n */\nvar WorkDoneProgressOptions;\n(function (WorkDoneProgressOptions) {\n function is(value) {\n const candidate = value;\n return Is.objectLiteral(candidate) && (candidate.workDoneProgress === undefined || Is.boolean(candidate.workDoneProgress));\n }\n WorkDoneProgressOptions.is = is;\n function hasWorkDoneProgress(value) {\n const candidate = value;\n return candidate && Is.boolean(candidate.workDoneProgress);\n }\n WorkDoneProgressOptions.hasWorkDoneProgress = hasWorkDoneProgress;\n})(WorkDoneProgressOptions = exports.WorkDoneProgressOptions || (exports.WorkDoneProgressOptions = {}));\n/**\n * The initialize request is sent from the client to the server.\n * It is sent once as the request after starting up the server.\n * The requests parameter is of type [InitializeParams](#InitializeParams)\n * the response if of type [InitializeResult](#InitializeResult) of a Thenable that\n * resolves to such.\n */\nvar InitializeRequest;\n(function (InitializeRequest) {\n InitializeRequest.type = new messages_1.ProtocolRequestType('initialize');\n})(InitializeRequest = exports.InitializeRequest || (exports.InitializeRequest = {}));\n/**\n * Known error codes for an `InitializeError`;\n */\nvar InitializeError;\n(function (InitializeError) {\n /**\n * If the protocol version provided by the client can't be handled by the server.\n * @deprecated This initialize error got replaced by client capabilities. There is\n * no version handshake in version 3.0x\n */\n InitializeError.unknownProtocolVersion = 1;\n})(InitializeError = exports.InitializeError || (exports.InitializeError = {}));\n/**\n * The initialized notification is sent from the client to the\n * server after the client is fully initialized and the server\n * is allowed to send requests from the server to the client.\n */\nvar InitializedNotification;\n(function (InitializedNotification) {\n InitializedNotification.type = new messages_1.ProtocolNotificationType('initialized');\n})(InitializedNotification = exports.InitializedNotification || (exports.InitializedNotification = {}));\n//---- Shutdown Method ----\n/**\n * A shutdown request is sent from the client to the server.\n * It is sent once when the client decides to shutdown the\n * server. The only notification that is sent after a shutdown request\n * is the exit event.\n */\nvar ShutdownRequest;\n(function (ShutdownRequest) {\n ShutdownRequest.type = new messages_1.ProtocolRequestType0('shutdown');\n})(ShutdownRequest = exports.ShutdownRequest || (exports.ShutdownRequest = {}));\n//---- Exit Notification ----\n/**\n * The exit event is sent from the client to the server to\n * ask the server to exit its process.\n */\nvar ExitNotification;\n(function (ExitNotification) {\n ExitNotification.type = new messages_1.ProtocolNotificationType0('exit');\n})(ExitNotification = exports.ExitNotification || (exports.ExitNotification = {}));\n/**\n * The configuration change notification is sent from the client to the server\n * when the client's configuration has changed. The notification contains\n * the changed configuration as defined by the language client.\n */\nvar DidChangeConfigurationNotification;\n(function (DidChangeConfigurationNotification) {\n DidChangeConfigurationNotification.type = new messages_1.ProtocolNotificationType('workspace/didChangeConfiguration');\n})(DidChangeConfigurationNotification = exports.DidChangeConfigurationNotification || (exports.DidChangeConfigurationNotification = {}));\n//---- Message show and log notifications ----\n/**\n * The message type\n */\nvar MessageType;\n(function (MessageType) {\n /**\n * An error message.\n */\n MessageType.Error = 1;\n /**\n * A warning message.\n */\n MessageType.Warning = 2;\n /**\n * An information message.\n */\n MessageType.Info = 3;\n /**\n * A log message.\n */\n MessageType.Log = 4;\n})(MessageType = exports.MessageType || (exports.MessageType = {}));\n/**\n * The show message notification is sent from a server to a client to ask\n * the client to display a particular message in the user interface.\n */\nvar ShowMessageNotification;\n(function (ShowMessageNotification) {\n ShowMessageNotification.type = new messages_1.ProtocolNotificationType('window/showMessage');\n})(ShowMessageNotification = exports.ShowMessageNotification || (exports.ShowMessageNotification = {}));\n/**\n * The show message request is sent from the server to the client to show a message\n * and a set of options actions to the user.\n */\nvar ShowMessageRequest;\n(function (ShowMessageRequest) {\n ShowMessageRequest.type = new messages_1.ProtocolRequestType('window/showMessageRequest');\n})(ShowMessageRequest = exports.ShowMessageRequest || (exports.ShowMessageRequest = {}));\n/**\n * The log message notification is sent from the server to the client to ask\n * the client to log a particular message.\n */\nvar LogMessageNotification;\n(function (LogMessageNotification) {\n LogMessageNotification.type = new messages_1.ProtocolNotificationType('window/logMessage');\n})(LogMessageNotification = exports.LogMessageNotification || (exports.LogMessageNotification = {}));\n//---- Telemetry notification\n/**\n * The telemetry event notification is sent from the server to the client to ask\n * the client to log telemetry data.\n */\nvar TelemetryEventNotification;\n(function (TelemetryEventNotification) {\n TelemetryEventNotification.type = new messages_1.ProtocolNotificationType('telemetry/event');\n})(TelemetryEventNotification = exports.TelemetryEventNotification || (exports.TelemetryEventNotification = {}));\n/**\n * Defines how the host (editor) should sync\n * document changes to the language server.\n */\nvar TextDocumentSyncKind;\n(function (TextDocumentSyncKind) {\n /**\n * Documents should not be synced at all.\n */\n TextDocumentSyncKind.None = 0;\n /**\n * Documents are synced by always sending the full content\n * of the document.\n */\n TextDocumentSyncKind.Full = 1;\n /**\n * Documents are synced by sending the full content on open.\n * After that only incremental updates to the document are\n * send.\n */\n TextDocumentSyncKind.Incremental = 2;\n})(TextDocumentSyncKind = exports.TextDocumentSyncKind || (exports.TextDocumentSyncKind = {}));\n/**\n * The document open notification is sent from the client to the server to signal\n * newly opened text documents. The document's truth is now managed by the client\n * and the server must not try to read the document's truth using the document's\n * uri. Open in this sense means it is managed by the client. It doesn't necessarily\n * mean that its content is presented in an editor. An open notification must not\n * be sent more than once without a corresponding close notification send before.\n * This means open and close notification must be balanced and the max open count\n * is one.\n */\nvar DidOpenTextDocumentNotification;\n(function (DidOpenTextDocumentNotification) {\n DidOpenTextDocumentNotification.method = 'textDocument/didOpen';\n DidOpenTextDocumentNotification.type = new messages_1.ProtocolNotificationType(DidOpenTextDocumentNotification.method);\n})(DidOpenTextDocumentNotification = exports.DidOpenTextDocumentNotification || (exports.DidOpenTextDocumentNotification = {}));\nvar TextDocumentContentChangeEvent;\n(function (TextDocumentContentChangeEvent) {\n /**\n * Checks whether the information describes a delta event.\n */\n function isIncremental(event) {\n let candidate = event;\n return candidate !== undefined && candidate !== null &&\n typeof candidate.text === 'string' && candidate.range !== undefined &&\n (candidate.rangeLength === undefined || typeof candidate.rangeLength === 'number');\n }\n TextDocumentContentChangeEvent.isIncremental = isIncremental;\n /**\n * Checks whether the information describes a full replacement event.\n */\n function isFull(event) {\n let candidate = event;\n return candidate !== undefined && candidate !== null &&\n typeof candidate.text === 'string' && candidate.range === undefined && candidate.rangeLength === undefined;\n }\n TextDocumentContentChangeEvent.isFull = isFull;\n})(TextDocumentContentChangeEvent = exports.TextDocumentContentChangeEvent || (exports.TextDocumentContentChangeEvent = {}));\n/**\n * The document change notification is sent from the client to the server to signal\n * changes to a text document.\n */\nvar DidChangeTextDocumentNotification;\n(function (DidChangeTextDocumentNotification) {\n DidChangeTextDocumentNotification.method = 'textDocument/didChange';\n DidChangeTextDocumentNotification.type = new messages_1.ProtocolNotificationType(DidChangeTextDocumentNotification.method);\n})(DidChangeTextDocumentNotification = exports.DidChangeTextDocumentNotification || (exports.DidChangeTextDocumentNotification = {}));\n/**\n * The document close notification is sent from the client to the server when\n * the document got closed in the client. The document's truth now exists where\n * the document's uri points to (e.g. if the document's uri is a file uri the\n * truth now exists on disk). As with the open notification the close notification\n * is about managing the document's content. Receiving a close notification\n * doesn't mean that the document was open in an editor before. A close\n * notification requires a previous open notification to be sent.\n */\nvar DidCloseTextDocumentNotification;\n(function (DidCloseTextDocumentNotification) {\n DidCloseTextDocumentNotification.method = 'textDocument/didClose';\n DidCloseTextDocumentNotification.type = new messages_1.ProtocolNotificationType(DidCloseTextDocumentNotification.method);\n})(DidCloseTextDocumentNotification = exports.DidCloseTextDocumentNotification || (exports.DidCloseTextDocumentNotification = {}));\n/**\n * The document save notification is sent from the client to the server when\n * the document got saved in the client.\n */\nvar DidSaveTextDocumentNotification;\n(function (DidSaveTextDocumentNotification) {\n DidSaveTextDocumentNotification.method = 'textDocument/didSave';\n DidSaveTextDocumentNotification.type = new messages_1.ProtocolNotificationType(DidSaveTextDocumentNotification.method);\n})(DidSaveTextDocumentNotification = exports.DidSaveTextDocumentNotification || (exports.DidSaveTextDocumentNotification = {}));\n/**\n * Represents reasons why a text document is saved.\n */\nvar TextDocumentSaveReason;\n(function (TextDocumentSaveReason) {\n /**\n * Manually triggered, e.g. by the user pressing save, by starting debugging,\n * or by an API call.\n */\n TextDocumentSaveReason.Manual = 1;\n /**\n * Automatic after a delay.\n */\n TextDocumentSaveReason.AfterDelay = 2;\n /**\n * When the editor lost focus.\n */\n TextDocumentSaveReason.FocusOut = 3;\n})(TextDocumentSaveReason = exports.TextDocumentSaveReason || (exports.TextDocumentSaveReason = {}));\n/**\n * A document will save notification is sent from the client to the server before\n * the document is actually saved.\n */\nvar WillSaveTextDocumentNotification;\n(function (WillSaveTextDocumentNotification) {\n WillSaveTextDocumentNotification.method = 'textDocument/willSave';\n WillSaveTextDocumentNotification.type = new messages_1.ProtocolNotificationType(WillSaveTextDocumentNotification.method);\n})(WillSaveTextDocumentNotification = exports.WillSaveTextDocumentNotification || (exports.WillSaveTextDocumentNotification = {}));\n/**\n * A document will save request is sent from the client to the server before\n * the document is actually saved. The request can return an array of TextEdits\n * which will be applied to the text document before it is saved. Please note that\n * clients might drop results if computing the text edits took too long or if a\n * server constantly fails on this request. This is done to keep the save fast and\n * reliable.\n */\nvar WillSaveTextDocumentWaitUntilRequest;\n(function (WillSaveTextDocumentWaitUntilRequest) {\n WillSaveTextDocumentWaitUntilRequest.method = 'textDocument/willSaveWaitUntil';\n WillSaveTextDocumentWaitUntilRequest.type = new messages_1.ProtocolRequestType(WillSaveTextDocumentWaitUntilRequest.method);\n})(WillSaveTextDocumentWaitUntilRequest = exports.WillSaveTextDocumentWaitUntilRequest || (exports.WillSaveTextDocumentWaitUntilRequest = {}));\n/**\n * The watched files notification is sent from the client to the server when\n * the client detects changes to file watched by the language client.\n */\nvar DidChangeWatchedFilesNotification;\n(function (DidChangeWatchedFilesNotification) {\n DidChangeWatchedFilesNotification.type = new messages_1.ProtocolNotificationType('workspace/didChangeWatchedFiles');\n})(DidChangeWatchedFilesNotification = exports.DidChangeWatchedFilesNotification || (exports.DidChangeWatchedFilesNotification = {}));\n/**\n * The file event type\n */\nvar FileChangeType;\n(function (FileChangeType) {\n /**\n * The file got created.\n */\n FileChangeType.Created = 1;\n /**\n * The file got changed.\n */\n FileChangeType.Changed = 2;\n /**\n * The file got deleted.\n */\n FileChangeType.Deleted = 3;\n})(FileChangeType = exports.FileChangeType || (exports.FileChangeType = {}));\nvar WatchKind;\n(function (WatchKind) {\n /**\n * Interested in create events.\n */\n WatchKind.Create = 1;\n /**\n * Interested in change events\n */\n WatchKind.Change = 2;\n /**\n * Interested in delete events\n */\n WatchKind.Delete = 4;\n})(WatchKind = exports.WatchKind || (exports.WatchKind = {}));\n/**\n * Diagnostics notification are sent from the server to the client to signal\n * results of validation runs.\n */\nvar PublishDiagnosticsNotification;\n(function (PublishDiagnosticsNotification) {\n PublishDiagnosticsNotification.type = new messages_1.ProtocolNotificationType('textDocument/publishDiagnostics');\n})(PublishDiagnosticsNotification = exports.PublishDiagnosticsNotification || (exports.PublishDiagnosticsNotification = {}));\n/**\n * How a completion was triggered\n */\nvar CompletionTriggerKind;\n(function (CompletionTriggerKind) {\n /**\n * Completion was triggered by typing an identifier (24x7 code\n * complete), manual invocation (e.g Ctrl+Space) or via API.\n */\n CompletionTriggerKind.Invoked = 1;\n /**\n * Completion was triggered by a trigger character specified by\n * the `triggerCharacters` properties of the `CompletionRegistrationOptions`.\n */\n CompletionTriggerKind.TriggerCharacter = 2;\n /**\n * Completion was re-triggered as current completion list is incomplete\n */\n CompletionTriggerKind.TriggerForIncompleteCompletions = 3;\n})(CompletionTriggerKind = exports.CompletionTriggerKind || (exports.CompletionTriggerKind = {}));\n/**\n * Request to request completion at a given text document position. The request's\n * parameter is of type [TextDocumentPosition](#TextDocumentPosition) the response\n * is of type [CompletionItem[]](#CompletionItem) or [CompletionList](#CompletionList)\n * or a Thenable that resolves to such.\n *\n * The request can delay the computation of the [`detail`](#CompletionItem.detail)\n * and [`documentation`](#CompletionItem.documentation) properties to the `completionItem/resolve`\n * request. However, properties that are needed for the initial sorting and filtering, like `sortText`,\n * `filterText`, `insertText`, and `textEdit`, must not be changed during resolve.\n */\nvar CompletionRequest;\n(function (CompletionRequest) {\n CompletionRequest.method = 'textDocument/completion';\n CompletionRequest.type = new messages_1.ProtocolRequestType(CompletionRequest.method);\n})(CompletionRequest = exports.CompletionRequest || (exports.CompletionRequest = {}));\n/**\n * Request to resolve additional information for a given completion item.The request's\n * parameter is of type [CompletionItem](#CompletionItem) the response\n * is of type [CompletionItem](#CompletionItem) or a Thenable that resolves to such.\n */\nvar CompletionResolveRequest;\n(function (CompletionResolveRequest) {\n CompletionResolveRequest.method = 'completionItem/resolve';\n CompletionResolveRequest.type = new messages_1.ProtocolRequestType(CompletionResolveRequest.method);\n})(CompletionResolveRequest = exports.CompletionResolveRequest || (exports.CompletionResolveRequest = {}));\n/**\n * Request to request hover information at a given text document position. The request's\n * parameter is of type [TextDocumentPosition](#TextDocumentPosition) the response is of\n * type [Hover](#Hover) or a Thenable that resolves to such.\n */\nvar HoverRequest;\n(function (HoverRequest) {\n HoverRequest.method = 'textDocument/hover';\n HoverRequest.type = new messages_1.ProtocolRequestType(HoverRequest.method);\n})(HoverRequest = exports.HoverRequest || (exports.HoverRequest = {}));\n/**\n * How a signature help was triggered.\n *\n * @since 3.15.0\n */\nvar SignatureHelpTriggerKind;\n(function (SignatureHelpTriggerKind) {\n /**\n * Signature help was invoked manually by the user or by a command.\n */\n SignatureHelpTriggerKind.Invoked = 1;\n /**\n * Signature help was triggered by a trigger character.\n */\n SignatureHelpTriggerKind.TriggerCharacter = 2;\n /**\n * Signature help was triggered by the cursor moving or by the document content changing.\n */\n SignatureHelpTriggerKind.ContentChange = 3;\n})(SignatureHelpTriggerKind = exports.SignatureHelpTriggerKind || (exports.SignatureHelpTriggerKind = {}));\nvar SignatureHelpRequest;\n(function (SignatureHelpRequest) {\n SignatureHelpRequest.method = 'textDocument/signatureHelp';\n SignatureHelpRequest.type = new messages_1.ProtocolRequestType(SignatureHelpRequest.method);\n})(SignatureHelpRequest = exports.SignatureHelpRequest || (exports.SignatureHelpRequest = {}));\n/**\n * A request to resolve the definition location of a symbol at a given text\n * document position. The request's parameter is of type [TextDocumentPosition]\n * (#TextDocumentPosition) the response is of either type [Definition](#Definition)\n * or a typed array of [DefinitionLink](#DefinitionLink) or a Thenable that resolves\n * to such.\n */\nvar DefinitionRequest;\n(function (DefinitionRequest) {\n DefinitionRequest.method = 'textDocument/definition';\n DefinitionRequest.type = new messages_1.ProtocolRequestType(DefinitionRequest.method);\n})(DefinitionRequest = exports.DefinitionRequest || (exports.DefinitionRequest = {}));\n/**\n * A request to resolve project-wide references for the symbol denoted\n * by the given text document position. The request's parameter is of\n * type [ReferenceParams](#ReferenceParams) the response is of type\n * [Location[]](#Location) or a Thenable that resolves to such.\n */\nvar ReferencesRequest;\n(function (ReferencesRequest) {\n ReferencesRequest.method = 'textDocument/references';\n ReferencesRequest.type = new messages_1.ProtocolRequestType(ReferencesRequest.method);\n})(ReferencesRequest = exports.ReferencesRequest || (exports.ReferencesRequest = {}));\n/**\n * Request to resolve a [DocumentHighlight](#DocumentHighlight) for a given\n * text document position. The request's parameter is of type [TextDocumentPosition]\n * (#TextDocumentPosition) the request response is of type [DocumentHighlight[]]\n * (#DocumentHighlight) or a Thenable that resolves to such.\n */\nvar DocumentHighlightRequest;\n(function (DocumentHighlightRequest) {\n DocumentHighlightRequest.method = 'textDocument/documentHighlight';\n DocumentHighlightRequest.type = new messages_1.ProtocolRequestType(DocumentHighlightRequest.method);\n})(DocumentHighlightRequest = exports.DocumentHighlightRequest || (exports.DocumentHighlightRequest = {}));\n/**\n * A request to list all symbols found in a given text document. The request's\n * parameter is of type [TextDocumentIdentifier](#TextDocumentIdentifier) the\n * response is of type [SymbolInformation[]](#SymbolInformation) or a Thenable\n * that resolves to such.\n */\nvar DocumentSymbolRequest;\n(function (DocumentSymbolRequest) {\n DocumentSymbolRequest.method = 'textDocument/documentSymbol';\n DocumentSymbolRequest.type = new messages_1.ProtocolRequestType(DocumentSymbolRequest.method);\n})(DocumentSymbolRequest = exports.DocumentSymbolRequest || (exports.DocumentSymbolRequest = {}));\n/**\n * A request to provide commands for the given text document and range.\n */\nvar CodeActionRequest;\n(function (CodeActionRequest) {\n CodeActionRequest.method = 'textDocument/codeAction';\n CodeActionRequest.type = new messages_1.ProtocolRequestType(CodeActionRequest.method);\n})(CodeActionRequest = exports.CodeActionRequest || (exports.CodeActionRequest = {}));\n/**\n * Request to resolve additional information for a given code action.The request's\n * parameter is of type [CodeAction](#CodeAction) the response\n * is of type [CodeAction](#CodeAction) or a Thenable that resolves to such.\n */\nvar CodeActionResolveRequest;\n(function (CodeActionResolveRequest) {\n CodeActionResolveRequest.method = 'codeAction/resolve';\n CodeActionResolveRequest.type = new messages_1.ProtocolRequestType(CodeActionResolveRequest.method);\n})(CodeActionResolveRequest = exports.CodeActionResolveRequest || (exports.CodeActionResolveRequest = {}));\n/**\n * A request to list project-wide symbols matching the query string given\n * by the [WorkspaceSymbolParams](#WorkspaceSymbolParams). The response is\n * of type [SymbolInformation[]](#SymbolInformation) or a Thenable that\n * resolves to such.\n */\nvar WorkspaceSymbolRequest;\n(function (WorkspaceSymbolRequest) {\n WorkspaceSymbolRequest.method = 'workspace/symbol';\n WorkspaceSymbolRequest.type = new messages_1.ProtocolRequestType(WorkspaceSymbolRequest.method);\n})(WorkspaceSymbolRequest = exports.WorkspaceSymbolRequest || (exports.WorkspaceSymbolRequest = {}));\n/**\n * A request to provide code lens for the given text document.\n */\nvar CodeLensRequest;\n(function (CodeLensRequest) {\n CodeLensRequest.method = 'textDocument/codeLens';\n CodeLensRequest.type = new messages_1.ProtocolRequestType(CodeLensRequest.method);\n})(CodeLensRequest = exports.CodeLensRequest || (exports.CodeLensRequest = {}));\n/**\n * A request to resolve a command for a given code lens.\n */\nvar CodeLensResolveRequest;\n(function (CodeLensResolveRequest) {\n CodeLensResolveRequest.method = 'codeLens/resolve';\n CodeLensResolveRequest.type = new messages_1.ProtocolRequestType(CodeLensResolveRequest.method);\n})(CodeLensResolveRequest = exports.CodeLensResolveRequest || (exports.CodeLensResolveRequest = {}));\n/**\n * A request to refresh all code actions\n *\n * @since 3.16.0\n */\nvar CodeLensRefreshRequest;\n(function (CodeLensRefreshRequest) {\n CodeLensRefreshRequest.method = `workspace/codeLens/refresh`;\n CodeLensRefreshRequest.type = new messages_1.ProtocolRequestType0(CodeLensRefreshRequest.method);\n})(CodeLensRefreshRequest = exports.CodeLensRefreshRequest || (exports.CodeLensRefreshRequest = {}));\n/**\n * A request to provide document links\n */\nvar DocumentLinkRequest;\n(function (DocumentLinkRequest) {\n DocumentLinkRequest.method = 'textDocument/documentLink';\n DocumentLinkRequest.type = new messages_1.ProtocolRequestType(DocumentLinkRequest.method);\n})(DocumentLinkRequest = exports.DocumentLinkRequest || (exports.DocumentLinkRequest = {}));\n/**\n * Request to resolve additional information for a given document link. The request's\n * parameter is of type [DocumentLink](#DocumentLink) the response\n * is of type [DocumentLink](#DocumentLink) or a Thenable that resolves to such.\n */\nvar DocumentLinkResolveRequest;\n(function (DocumentLinkResolveRequest) {\n DocumentLinkResolveRequest.method = 'documentLink/resolve';\n DocumentLinkResolveRequest.type = new messages_1.ProtocolRequestType(DocumentLinkResolveRequest.method);\n})(DocumentLinkResolveRequest = exports.DocumentLinkResolveRequest || (exports.DocumentLinkResolveRequest = {}));\n/**\n * A request to to format a whole document.\n */\nvar DocumentFormattingRequest;\n(function (DocumentFormattingRequest) {\n DocumentFormattingRequest.method = 'textDocument/formatting';\n DocumentFormattingRequest.type = new messages_1.ProtocolRequestType(DocumentFormattingRequest.method);\n})(DocumentFormattingRequest = exports.DocumentFormattingRequest || (exports.DocumentFormattingRequest = {}));\n/**\n * A request to to format a range in a document.\n */\nvar DocumentRangeFormattingRequest;\n(function (DocumentRangeFormattingRequest) {\n DocumentRangeFormattingRequest.method = 'textDocument/rangeFormatting';\n DocumentRangeFormattingRequest.type = new messages_1.ProtocolRequestType(DocumentRangeFormattingRequest.method);\n})(DocumentRangeFormattingRequest = exports.DocumentRangeFormattingRequest || (exports.DocumentRangeFormattingRequest = {}));\n/**\n * A request to format a document on type.\n */\nvar DocumentOnTypeFormattingRequest;\n(function (DocumentOnTypeFormattingRequest) {\n DocumentOnTypeFormattingRequest.method = 'textDocument/onTypeFormatting';\n DocumentOnTypeFormattingRequest.type = new messages_1.ProtocolRequestType(DocumentOnTypeFormattingRequest.method);\n})(DocumentOnTypeFormattingRequest = exports.DocumentOnTypeFormattingRequest || (exports.DocumentOnTypeFormattingRequest = {}));\n//---- Rename ----------------------------------------------\nvar PrepareSupportDefaultBehavior;\n(function (PrepareSupportDefaultBehavior) {\n /**\n * The client's default behavior is to select the identifier\n * according the to language's syntax rule.\n */\n PrepareSupportDefaultBehavior.Identifier = 1;\n})(PrepareSupportDefaultBehavior = exports.PrepareSupportDefaultBehavior || (exports.PrepareSupportDefaultBehavior = {}));\n/**\n * A request to rename a symbol.\n */\nvar RenameRequest;\n(function (RenameRequest) {\n RenameRequest.method = 'textDocument/rename';\n RenameRequest.type = new messages_1.ProtocolRequestType(RenameRequest.method);\n})(RenameRequest = exports.RenameRequest || (exports.RenameRequest = {}));\n/**\n * A request to test and perform the setup necessary for a rename.\n *\n * @since 3.16 - support for default behavior\n */\nvar PrepareRenameRequest;\n(function (PrepareRenameRequest) {\n PrepareRenameRequest.method = 'textDocument/prepareRename';\n PrepareRenameRequest.type = new messages_1.ProtocolRequestType(PrepareRenameRequest.method);\n})(PrepareRenameRequest = exports.PrepareRenameRequest || (exports.PrepareRenameRequest = {}));\n/**\n * A request send from the client to the server to execute a command. The request might return\n * a workspace edit which the client will apply to the workspace.\n */\nvar ExecuteCommandRequest;\n(function (ExecuteCommandRequest) {\n ExecuteCommandRequest.type = new messages_1.ProtocolRequestType('workspace/executeCommand');\n})(ExecuteCommandRequest = exports.ExecuteCommandRequest || (exports.ExecuteCommandRequest = {}));\n/**\n * A request sent from the server to the client to modified certain resources.\n */\nvar ApplyWorkspaceEditRequest;\n(function (ApplyWorkspaceEditRequest) {\n ApplyWorkspaceEditRequest.type = new messages_1.ProtocolRequestType('workspace/applyEdit');\n})(ApplyWorkspaceEditRequest = exports.ApplyWorkspaceEditRequest || (exports.ApplyWorkspaceEditRequest = {}));\n//# sourceMappingURL=protocol.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createProtocolConnection = void 0;\nconst vscode_jsonrpc_1 = require(\"vscode-jsonrpc\");\nfunction createProtocolConnection(input, output, logger, options) {\n if (vscode_jsonrpc_1.ConnectionStrategy.is(options)) {\n options = { connectionStrategy: options };\n }\n return vscode_jsonrpc_1.createMessageConnection(input, output, logger, options);\n}\nexports.createProtocolConnection = createProtocolConnection;\n//# sourceMappingURL=connection.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LSPErrorCodes = exports.createProtocolConnection = void 0;\n__exportStar(require(\"vscode-jsonrpc\"), exports);\n__exportStar(require(\"vscode-languageserver-types\"), exports);\n__exportStar(require(\"./messages\"), exports);\n__exportStar(require(\"./protocol\"), exports);\nvar connection_1 = require(\"./connection\");\nObject.defineProperty(exports, \"createProtocolConnection\", { enumerable: true, get: function () { return connection_1.createProtocolConnection; } });\nvar LSPErrorCodes;\n(function (LSPErrorCodes) {\n /**\n * This is the start range of LSP reserved error codes.\n * It doesn't denote a real error code.\n *\n * @since 3.16.0\n */\n LSPErrorCodes.lspReservedErrorRangeStart = -32899;\n LSPErrorCodes.ContentModified = -32801;\n LSPErrorCodes.RequestCancelled = -32800;\n /**\n * This is the end range of LSP reserved error codes.\n * It doesn't denote a real error code.\n *\n * @since 3.16.0\n */\n LSPErrorCodes.lspReservedErrorRangeEnd = -32800;\n})(LSPErrorCodes = exports.LSPErrorCodes || (exports.LSPErrorCodes = {}));\n//# sourceMappingURL=api.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createProtocolConnection = void 0;\nconst node_1 = require(\"vscode-jsonrpc/node\");\n__exportStar(require(\"vscode-jsonrpc/node\"), exports);\n__exportStar(require(\"../common/api\"), exports);\nfunction createProtocolConnection(input, output, logger, options) {\n return node_1.createMessageConnection(input, output, logger, options);\n}\nexports.createProtocolConnection = createProtocolConnection;\n//# sourceMappingURL=main.js.map", "\"use strict\";\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.generateUuid = exports.parse = exports.isUUID = exports.v4 = exports.empty = void 0;\nclass ValueUUID {\n constructor(_value) {\n this._value = _value;\n // empty\n }\n asHex() {\n return this._value;\n }\n equals(other) {\n return this.asHex() === other.asHex();\n }\n}\nclass V4UUID extends ValueUUID {\n constructor() {\n super([\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n '-',\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n '-',\n '4',\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n '-',\n V4UUID._oneOf(V4UUID._timeHighBits),\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n '-',\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n V4UUID._randomHex(),\n ].join(''));\n }\n static _oneOf(array) {\n return array[Math.floor(array.length * Math.random())];\n }\n static _randomHex() {\n return V4UUID._oneOf(V4UUID._chars);\n }\n}\nV4UUID._chars = ['0', '1', '2', '3', '4', '5', '6', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];\nV4UUID._timeHighBits = ['8', '9', 'a', 'b'];\n/**\n * An empty UUID that contains only zeros.\n */\nexports.empty = new ValueUUID('00000000-0000-0000-0000-000000000000');\nfunction v4() {\n return new V4UUID();\n}\nexports.v4 = v4;\nconst _UUIDPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nfunction isUUID(value) {\n return _UUIDPattern.test(value);\n}\nexports.isUUID = isUUID;\n/**\n * Parses a UUID that is of the format xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.\n * @param value A uuid string.\n */\nfunction parse(value) {\n if (!isUUID(value)) {\n throw new Error('invalid uuid');\n }\n return new ValueUUID(value);\n}\nexports.parse = parse;\nfunction generateUuid() {\n return v4().asHex();\n}\nexports.generateUuid = generateUuid;\n//# sourceMappingURL=uuid.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.attachPartialResult = exports.ProgressFeature = exports.attachWorkDone = void 0;\nconst vscode_languageserver_protocol_1 = require(\"vscode-languageserver-protocol\");\nconst uuid_1 = require(\"./utils/uuid\");\nclass WorkDoneProgressReporterImpl {\n constructor(_connection, _token) {\n this._connection = _connection;\n this._token = _token;\n WorkDoneProgressReporterImpl.Instances.set(this._token, this);\n }\n begin(title, percentage, message, cancellable) {\n let param = {\n kind: 'begin',\n title,\n percentage,\n message,\n cancellable\n };\n this._connection.sendProgress(vscode_languageserver_protocol_1.WorkDoneProgress.type, this._token, param);\n }\n report(arg0, arg1) {\n let param = {\n kind: 'report'\n };\n if (typeof arg0 === 'number') {\n param.percentage = arg0;\n if (arg1 !== undefined) {\n param.message = arg1;\n }\n }\n else {\n param.message = arg0;\n }\n this._connection.sendProgress(vscode_languageserver_protocol_1.WorkDoneProgress.type, this._token, param);\n }\n done() {\n WorkDoneProgressReporterImpl.Instances.delete(this._token);\n this._connection.sendProgress(vscode_languageserver_protocol_1.WorkDoneProgress.type, this._token, { kind: 'end' });\n }\n}\nWorkDoneProgressReporterImpl.Instances = new Map();\nclass WorkDoneProgressServerReporterImpl extends WorkDoneProgressReporterImpl {\n constructor(connection, token) {\n super(connection, token);\n this._source = new vscode_languageserver_protocol_1.CancellationTokenSource();\n }\n get token() {\n return this._source.token;\n }\n done() {\n this._source.dispose();\n super.done();\n }\n cancel() {\n this._source.cancel();\n }\n}\nclass NullProgressReporter {\n constructor() {\n }\n begin() {\n }\n report() {\n }\n done() {\n }\n}\nclass NullProgressServerReporter extends NullProgressReporter {\n constructor() {\n super();\n this._source = new vscode_languageserver_protocol_1.CancellationTokenSource();\n }\n get token() {\n return this._source.token;\n }\n done() {\n this._source.dispose();\n }\n cancel() {\n this._source.cancel();\n }\n}\nfunction attachWorkDone(connection, params) {\n if (params === undefined || params.workDoneToken === undefined) {\n return new NullProgressReporter();\n }\n const token = params.workDoneToken;\n delete params.workDoneToken;\n return new WorkDoneProgressReporterImpl(connection, token);\n}\nexports.attachWorkDone = attachWorkDone;\nconst ProgressFeature = (Base) => {\n return class extends Base {\n constructor() {\n super();\n this._progressSupported = false;\n }\n initialize(capabilities) {\n var _a;\n if (((_a = capabilities === null || capabilities === void 0 ? void 0 : capabilities.window) === null || _a === void 0 ? void 0 : _a.workDoneProgress) === true) {\n this._progressSupported = true;\n this.connection.onNotification(vscode_languageserver_protocol_1.WorkDoneProgressCancelNotification.type, (params) => {\n let progress = WorkDoneProgressReporterImpl.Instances.get(params.token);\n if (progress instanceof WorkDoneProgressServerReporterImpl || progress instanceof NullProgressServerReporter) {\n progress.cancel();\n }\n });\n }\n }\n attachWorkDoneProgress(token) {\n if (token === undefined) {\n return new NullProgressReporter();\n }\n else {\n return new WorkDoneProgressReporterImpl(this.connection, token);\n }\n }\n createWorkDoneProgress() {\n if (this._progressSupported) {\n const token = uuid_1.generateUuid();\n return this.connection.sendRequest(vscode_languageserver_protocol_1.WorkDoneProgressCreateRequest.type, { token }).then(() => {\n const result = new WorkDoneProgressServerReporterImpl(this.connection, token);\n return result;\n });\n }\n else {\n return Promise.resolve(new NullProgressServerReporter());\n }\n }\n };\n};\nexports.ProgressFeature = ProgressFeature;\nvar ResultProgress;\n(function (ResultProgress) {\n ResultProgress.type = new vscode_languageserver_protocol_1.ProgressType();\n})(ResultProgress || (ResultProgress = {}));\nclass ResultProgressReporterImpl {\n constructor(_connection, _token) {\n this._connection = _connection;\n this._token = _token;\n }\n report(data) {\n this._connection.sendProgress(ResultProgress.type, this._token, data);\n }\n}\nfunction attachPartialResult(connection, params) {\n if (params === undefined || params.partialResultToken === undefined) {\n return undefined;\n }\n const token = params.partialResultToken;\n delete params.partialResultToken;\n return new ResultProgressReporterImpl(connection, token);\n}\nexports.attachPartialResult = attachPartialResult;\n//# sourceMappingURL=progress.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ConfigurationFeature = void 0;\nconst vscode_languageserver_protocol_1 = require(\"vscode-languageserver-protocol\");\nconst Is = require(\"./utils/is\");\nconst ConfigurationFeature = (Base) => {\n return class extends Base {\n getConfiguration(arg) {\n if (!arg) {\n return this._getConfiguration({});\n }\n else if (Is.string(arg)) {\n return this._getConfiguration({ section: arg });\n }\n else {\n return this._getConfiguration(arg);\n }\n }\n _getConfiguration(arg) {\n let params = {\n items: Array.isArray(arg) ? arg : [arg]\n };\n return this.connection.sendRequest(vscode_languageserver_protocol_1.ConfigurationRequest.type, params).then((result) => {\n return Array.isArray(arg) ? result : result[0];\n });\n }\n };\n};\nexports.ConfigurationFeature = ConfigurationFeature;\n//# sourceMappingURL=configuration.js.map", "/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\n'use strict';\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.WorkspaceFoldersFeature = void 0;\nconst vscode_languageserver_protocol_1 = require(\"vscode-languageserver-protocol\");\nconst WorkspaceFoldersFeature = (Base) => {\n return class extends Base {\n initialize(capabilities) {\n let workspaceCapabilities = capabilities.workspace;\n if (workspaceCapabilities && workspaceCapabilities.workspaceFolders) {\n this._onDidChangeWorkspaceFolders = new vscode_languageserver_protocol_1.Emitter();\n this.connection.onNotification(vscode_languageserver_protocol_1.DidChangeWorkspaceFoldersNotification.type, (params) => {\n this._onDidChangeWorkspaceFolders.fire(params.event);\n });\n }\n }\n getWorkspaceFolders() {\n return this.connection.sendRequest(vscode_languageserver_protocol_1.WorkspaceFoldersRequest.type);\n }\n get onDidChangeWorkspaceFolders() {\n if (!this._onDidChangeWorkspaceFolders) {\n throw new Error('Client doesn\\'t support sending workspace folder change events.');\n }\n if (!this._unregistration) {\n this._unregistration = this.connection.client.register(vscode_languageserver_protocol_1.DidChangeWorkspaceFoldersNotification.type);\n }\n return this._onDidChangeWorkspaceFolders.event;\n }\n };\n};\nexports.WorkspaceFoldersFeature = WorkspaceFoldersFeature;\n//# sourceMappingURL=workspaceFolders.js.map", "/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\n'use strict';\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CallHierarchyFeature = void 0;\nconst vscode_languageserver_protocol_1 = require(\"vscode-languageserver-protocol\");\nconst CallHierarchyFeature = (Base) => {\n return class extends Base {\n get callHierarchy() {\n return {\n onPrepare: (handler) => {\n this.connection.onRequest(vscode_languageserver_protocol_1.CallHierarchyPrepareRequest.type, (params, cancel) => {\n return handler(params, cancel, this.attachWorkDoneProgress(params), undefined);\n });\n },\n onIncomingCalls: (handler) => {\n const type = vscode_languageserver_protocol_1.CallHierarchyIncomingCallsRequest.type;\n this.connection.onRequest(type, (params, cancel) => {\n return handler(params, cancel, this.attachWorkDoneProgress(params), this.attachPartialResultProgress(type, params));\n });\n },\n onOutgoingCalls: (handler) => {\n const type = vscode_languageserver_protocol_1.CallHierarchyOutgoingCallsRequest.type;\n this.connection.onRequest(type, (params, cancel) => {\n return handler(params, cancel, this.attachWorkDoneProgress(params), this.attachPartialResultProgress(type, params));\n });\n }\n };\n }\n };\n};\nexports.CallHierarchyFeature = CallHierarchyFeature;\n//# sourceMappingURL=callHierarchy.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SemanticTokensBuilder = exports.SemanticTokensFeature = void 0;\nconst vscode_languageserver_protocol_1 = require(\"vscode-languageserver-protocol\");\nconst SemanticTokensFeature = (Base) => {\n return class extends Base {\n get semanticTokens() {\n return {\n on: (handler) => {\n const type = vscode_languageserver_protocol_1.SemanticTokensRequest.type;\n this.connection.onRequest(type, (params, cancel) => {\n return handler(params, cancel, this.attachWorkDoneProgress(params), this.attachPartialResultProgress(type, params));\n });\n },\n onDelta: (handler) => {\n const type = vscode_languageserver_protocol_1.SemanticTokensDeltaRequest.type;\n this.connection.onRequest(type, (params, cancel) => {\n return handler(params, cancel, this.attachWorkDoneProgress(params), this.attachPartialResultProgress(type, params));\n });\n },\n onRange: (handler) => {\n const type = vscode_languageserver_protocol_1.SemanticTokensRangeRequest.type;\n this.connection.onRequest(type, (params, cancel) => {\n return handler(params, cancel, this.attachWorkDoneProgress(params), this.attachPartialResultProgress(type, params));\n });\n }\n };\n }\n };\n};\nexports.SemanticTokensFeature = SemanticTokensFeature;\nclass SemanticTokensBuilder {\n constructor() {\n this._prevData = undefined;\n this.initialize();\n }\n initialize() {\n this._id = Date.now();\n this._prevLine = 0;\n this._prevChar = 0;\n this._data = [];\n this._dataLen = 0;\n }\n push(line, char, length, tokenType, tokenModifiers) {\n let pushLine = line;\n let pushChar = char;\n if (this._dataLen > 0) {\n pushLine -= this._prevLine;\n if (pushLine === 0) {\n pushChar -= this._prevChar;\n }\n }\n this._data[this._dataLen++] = pushLine;\n this._data[this._dataLen++] = pushChar;\n this._data[this._dataLen++] = length;\n this._data[this._dataLen++] = tokenType;\n this._data[this._dataLen++] = tokenModifiers;\n this._prevLine = line;\n this._prevChar = char;\n }\n get id() {\n return this._id.toString();\n }\n previousResult(id) {\n if (this.id === id) {\n this._prevData = this._data;\n }\n this.initialize();\n }\n build() {\n this._prevData = undefined;\n return {\n resultId: this.id,\n data: this._data\n };\n }\n canBuildEdits() {\n return this._prevData !== undefined;\n }\n buildEdits() {\n if (this._prevData !== undefined) {\n const prevDataLength = this._prevData.length;\n const dataLength = this._data.length;\n let startIndex = 0;\n while (startIndex < dataLength && startIndex < prevDataLength && this._prevData[startIndex] === this._data[startIndex]) {\n startIndex++;\n }\n if (startIndex < dataLength && startIndex < prevDataLength) {\n // Find end index\n let endIndex = 0;\n while (endIndex < dataLength && endIndex < prevDataLength && this._prevData[prevDataLength - 1 - endIndex] === this._data[dataLength - 1 - endIndex]) {\n endIndex++;\n }\n const newData = this._data.slice(startIndex, dataLength - endIndex);\n const result = {\n resultId: this.id,\n edits: [\n { start: startIndex, deleteCount: prevDataLength - endIndex - startIndex, data: newData }\n ]\n };\n return result;\n }\n else if (startIndex < dataLength) {\n return { resultId: this.id, edits: [\n { start: startIndex, deleteCount: 0, data: this._data.slice(startIndex) }\n ] };\n }\n else if (startIndex < prevDataLength) {\n return { resultId: this.id, edits: [\n { start: startIndex, deleteCount: prevDataLength - startIndex }\n ] };\n }\n else {\n return { resultId: this.id, edits: [] };\n }\n }\n else {\n return this.build();\n }\n }\n}\nexports.SemanticTokensBuilder = SemanticTokensBuilder;\n//# sourceMappingURL=semanticTokens.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ShowDocumentFeature = void 0;\nconst vscode_languageserver_protocol_1 = require(\"vscode-languageserver-protocol\");\nconst ShowDocumentFeature = (Base) => {\n return class extends Base {\n showDocument(params) {\n return this.connection.sendRequest(vscode_languageserver_protocol_1.ShowDocumentRequest.type, params);\n }\n };\n};\nexports.ShowDocumentFeature = ShowDocumentFeature;\n//# sourceMappingURL=showDocument.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FileOperationsFeature = void 0;\nconst vscode_languageserver_protocol_1 = require(\"vscode-languageserver-protocol\");\nconst FileOperationsFeature = (Base) => {\n return class extends Base {\n onDidCreateFiles(handler) {\n this.connection.onNotification(vscode_languageserver_protocol_1.DidCreateFilesNotification.type, (params) => {\n handler(params);\n });\n }\n onDidRenameFiles(handler) {\n this.connection.onNotification(vscode_languageserver_protocol_1.DidRenameFilesNotification.type, (params) => {\n handler(params);\n });\n }\n onDidDeleteFiles(handler) {\n this.connection.onNotification(vscode_languageserver_protocol_1.DidDeleteFilesNotification.type, (params) => {\n handler(params);\n });\n }\n onWillCreateFiles(handler) {\n return this.connection.onRequest(vscode_languageserver_protocol_1.WillCreateFilesRequest.type, (params, cancel) => {\n return handler(params, cancel);\n });\n }\n onWillRenameFiles(handler) {\n return this.connection.onRequest(vscode_languageserver_protocol_1.WillRenameFilesRequest.type, (params, cancel) => {\n return handler(params, cancel);\n });\n }\n onWillDeleteFiles(handler) {\n return this.connection.onRequest(vscode_languageserver_protocol_1.WillDeleteFilesRequest.type, (params, cancel) => {\n return handler(params, cancel);\n });\n }\n };\n};\nexports.FileOperationsFeature = FileOperationsFeature;\n//# sourceMappingURL=fileOperations.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LinkedEditingRangeFeature = void 0;\nconst vscode_languageserver_protocol_1 = require(\"vscode-languageserver-protocol\");\nconst LinkedEditingRangeFeature = (Base) => {\n return class extends Base {\n onLinkedEditingRange(handler) {\n this.connection.onRequest(vscode_languageserver_protocol_1.LinkedEditingRangeRequest.type, (params, cancel) => {\n return handler(params, cancel, this.attachWorkDoneProgress(params), undefined);\n });\n }\n };\n};\nexports.LinkedEditingRangeFeature = LinkedEditingRangeFeature;\n//# sourceMappingURL=linkedEditingRange.js.map", "/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\n'use strict';\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MonikerFeature = void 0;\nconst vscode_languageserver_protocol_1 = require(\"vscode-languageserver-protocol\");\nconst MonikerFeature = (Base) => {\n return class extends Base {\n get moniker() {\n return {\n on: (handler) => {\n const type = vscode_languageserver_protocol_1.MonikerRequest.type;\n this.connection.onRequest(type, (params, cancel) => {\n return handler(params, cancel, this.attachWorkDoneProgress(params), this.attachPartialResultProgress(type, params));\n });\n },\n };\n }\n };\n};\nexports.MonikerFeature = MonikerFeature;\n//# sourceMappingURL=moniker.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createConnection = exports.combineFeatures = exports.combineLanguagesFeatures = exports.combineWorkspaceFeatures = exports.combineWindowFeatures = exports.combineClientFeatures = exports.combineTracerFeatures = exports.combineTelemetryFeatures = exports.combineConsoleFeatures = exports._LanguagesImpl = exports.BulkUnregistration = exports.BulkRegistration = exports.ErrorMessageTracker = exports.TextDocuments = void 0;\nconst vscode_languageserver_protocol_1 = require(\"vscode-languageserver-protocol\");\nconst Is = require(\"./utils/is\");\nconst UUID = require(\"./utils/uuid\");\nconst progress_1 = require(\"./progress\");\nconst configuration_1 = require(\"./configuration\");\nconst workspaceFolders_1 = require(\"./workspaceFolders\");\nconst callHierarchy_1 = require(\"./callHierarchy\");\nconst semanticTokens_1 = require(\"./semanticTokens\");\nconst showDocument_1 = require(\"./showDocument\");\nconst fileOperations_1 = require(\"./fileOperations\");\nconst linkedEditingRange_1 = require(\"./linkedEditingRange\");\nconst moniker_1 = require(\"./moniker\");\nfunction null2Undefined(value) {\n if (value === null) {\n return undefined;\n }\n return value;\n}\n/**\n * A manager for simple text documents\n */\nclass TextDocuments {\n /**\n * Create a new text document manager.\n */\n constructor(configuration) {\n this._documents = Object.create(null);\n this._configuration = configuration;\n this._onDidChangeContent = new vscode_languageserver_protocol_1.Emitter();\n this._onDidOpen = new vscode_languageserver_protocol_1.Emitter();\n this._onDidClose = new vscode_languageserver_protocol_1.Emitter();\n this._onDidSave = new vscode_languageserver_protocol_1.Emitter();\n this._onWillSave = new vscode_languageserver_protocol_1.Emitter();\n }\n /**\n * An event that fires when a text document managed by this manager\n * has been opened or the content changes.\n */\n get onDidChangeContent() {\n return this._onDidChangeContent.event;\n }\n /**\n * An event that fires when a text document managed by this manager\n * has been opened.\n */\n get onDidOpen() {\n return this._onDidOpen.event;\n }\n /**\n * An event that fires when a text document managed by this manager\n * will be saved.\n */\n get onWillSave() {\n return this._onWillSave.event;\n }\n /**\n * Sets a handler that will be called if a participant wants to provide\n * edits during a text document save.\n */\n onWillSaveWaitUntil(handler) {\n this._willSaveWaitUntil = handler;\n }\n /**\n * An event that fires when a text document managed by this manager\n * has been saved.\n */\n get onDidSave() {\n return this._onDidSave.event;\n }\n /**\n * An event that fires when a text document managed by this manager\n * has been closed.\n */\n get onDidClose() {\n return this._onDidClose.event;\n }\n /**\n * Returns the document for the given URI. Returns undefined if\n * the document is not managed by this instance.\n *\n * @param uri The text document's URI to retrieve.\n * @return the text document or `undefined`.\n */\n get(uri) {\n return this._documents[uri];\n }\n /**\n * Returns all text documents managed by this instance.\n *\n * @return all text documents.\n */\n all() {\n return Object.keys(this._documents).map(key => this._documents[key]);\n }\n /**\n * Returns the URIs of all text documents managed by this instance.\n *\n * @return the URI's of all text documents.\n */\n keys() {\n return Object.keys(this._documents);\n }\n /**\n * Listens for `low level` notification on the given connection to\n * update the text documents managed by this instance.\n *\n * Please note that the connection only provides handlers not an event model. Therefore\n * listening on a connection will overwrite the following handlers on a connection:\n * `onDidOpenTextDocument`, `onDidChangeTextDocument`, `onDidCloseTextDocument`,\n * `onWillSaveTextDocument`, `onWillSaveTextDocumentWaitUntil` and `onDidSaveTextDocument`.\n *\n * Use the corresponding events on the TextDocuments instance instead.\n *\n * @param connection The connection to listen on.\n */\n listen(connection) {\n connection.__textDocumentSync = vscode_languageserver_protocol_1.TextDocumentSyncKind.Full;\n connection.onDidOpenTextDocument((event) => {\n let td = event.textDocument;\n let document = this._configuration.create(td.uri, td.languageId, td.version, td.text);\n this._documents[td.uri] = document;\n let toFire = Object.freeze({ document });\n this._onDidOpen.fire(toFire);\n this._onDidChangeContent.fire(toFire);\n });\n connection.onDidChangeTextDocument((event) => {\n let td = event.textDocument;\n let changes = event.contentChanges;\n if (changes.length === 0) {\n return;\n }\n let document = this._documents[td.uri];\n const { version } = td;\n if (version === null || version === undefined) {\n throw new Error(`Received document change event for ${td.uri} without valid version identifier`);\n }\n document = this._configuration.update(document, changes, version);\n this._documents[td.uri] = document;\n this._onDidChangeContent.fire(Object.freeze({ document }));\n });\n connection.onDidCloseTextDocument((event) => {\n let document = this._documents[event.textDocument.uri];\n if (document) {\n delete this._documents[event.textDocument.uri];\n this._onDidClose.fire(Object.freeze({ document }));\n }\n });\n connection.onWillSaveTextDocument((event) => {\n let document = this._documents[event.textDocument.uri];\n if (document) {\n this._onWillSave.fire(Object.freeze({ document, reason: event.reason }));\n }\n });\n connection.onWillSaveTextDocumentWaitUntil((event, token) => {\n let document = this._documents[event.textDocument.uri];\n if (document && this._willSaveWaitUntil) {\n return this._willSaveWaitUntil(Object.freeze({ document, reason: event.reason }), token);\n }\n else {\n return [];\n }\n });\n connection.onDidSaveTextDocument((event) => {\n let document = this._documents[event.textDocument.uri];\n if (document) {\n this._onDidSave.fire(Object.freeze({ document }));\n }\n });\n }\n}\nexports.TextDocuments = TextDocuments;\n/**\n * Helps tracking error message. Equal occurrences of the same\n * message are only stored once. This class is for example\n * useful if text documents are validated in a loop and equal\n * error message should be folded into one.\n */\nclass ErrorMessageTracker {\n constructor() {\n this._messages = Object.create(null);\n }\n /**\n * Add a message to the tracker.\n *\n * @param message The message to add.\n */\n add(message) {\n let count = this._messages[message];\n if (!count) {\n count = 0;\n }\n count++;\n this._messages[message] = count;\n }\n /**\n * Send all tracked messages to the connection's window.\n *\n * @param connection The connection established between client and server.\n */\n sendErrors(connection) {\n Object.keys(this._messages).forEach(message => {\n connection.window.showErrorMessage(message);\n });\n }\n}\nexports.ErrorMessageTracker = ErrorMessageTracker;\nclass RemoteConsoleImpl {\n constructor() {\n }\n rawAttach(connection) {\n this._rawConnection = connection;\n }\n attach(connection) {\n this._connection = connection;\n }\n get connection() {\n if (!this._connection) {\n throw new Error('Remote is not attached to a connection yet.');\n }\n return this._connection;\n }\n fillServerCapabilities(_capabilities) {\n }\n initialize(_capabilities) {\n }\n error(message) {\n this.send(vscode_languageserver_protocol_1.MessageType.Error, message);\n }\n warn(message) {\n this.send(vscode_languageserver_protocol_1.MessageType.Warning, message);\n }\n info(message) {\n this.send(vscode_languageserver_protocol_1.MessageType.Info, message);\n }\n log(message) {\n this.send(vscode_languageserver_protocol_1.MessageType.Log, message);\n }\n send(type, message) {\n if (this._rawConnection) {\n this._rawConnection.sendNotification(vscode_languageserver_protocol_1.LogMessageNotification.type, { type, message });\n }\n }\n}\nclass _RemoteWindowImpl {\n constructor() {\n }\n attach(connection) {\n this._connection = connection;\n }\n get connection() {\n if (!this._connection) {\n throw new Error('Remote is not attached to a connection yet.');\n }\n return this._connection;\n }\n initialize(_capabilities) {\n }\n fillServerCapabilities(_capabilities) {\n }\n showErrorMessage(message, ...actions) {\n let params = { type: vscode_languageserver_protocol_1.MessageType.Error, message, actions };\n return this.connection.sendRequest(vscode_languageserver_protocol_1.ShowMessageRequest.type, params).then(null2Undefined);\n }\n showWarningMessage(message, ...actions) {\n let params = { type: vscode_languageserver_protocol_1.MessageType.Warning, message, actions };\n return this.connection.sendRequest(vscode_languageserver_protocol_1.ShowMessageRequest.type, params).then(null2Undefined);\n }\n showInformationMessage(message, ...actions) {\n let params = { type: vscode_languageserver_protocol_1.MessageType.Info, message, actions };\n return this.connection.sendRequest(vscode_languageserver_protocol_1.ShowMessageRequest.type, params).then(null2Undefined);\n }\n}\nconst RemoteWindowImpl = showDocument_1.ShowDocumentFeature(progress_1.ProgressFeature(_RemoteWindowImpl));\nvar BulkRegistration;\n(function (BulkRegistration) {\n /**\n * Creates a new bulk registration.\n * @return an empty bulk registration.\n */\n function create() {\n return new BulkRegistrationImpl();\n }\n BulkRegistration.create = create;\n})(BulkRegistration = exports.BulkRegistration || (exports.BulkRegistration = {}));\nclass BulkRegistrationImpl {\n constructor() {\n this._registrations = [];\n this._registered = new Set();\n }\n add(type, registerOptions) {\n const method = Is.string(type) ? type : type.method;\n if (this._registered.has(method)) {\n throw new Error(`${method} is already added to this registration`);\n }\n const id = UUID.generateUuid();\n this._registrations.push({\n id: id,\n method: method,\n registerOptions: registerOptions || {}\n });\n this._registered.add(method);\n }\n asRegistrationParams() {\n return {\n registrations: this._registrations\n };\n }\n}\nvar BulkUnregistration;\n(function (BulkUnregistration) {\n function create() {\n return new BulkUnregistrationImpl(undefined, []);\n }\n BulkUnregistration.create = create;\n})(BulkUnregistration = exports.BulkUnregistration || (exports.BulkUnregistration = {}));\nclass BulkUnregistrationImpl {\n constructor(_connection, unregistrations) {\n this._connection = _connection;\n this._unregistrations = new Map();\n unregistrations.forEach(unregistration => {\n this._unregistrations.set(unregistration.method, unregistration);\n });\n }\n get isAttached() {\n return !!this._connection;\n }\n attach(connection) {\n this._connection = connection;\n }\n add(unregistration) {\n this._unregistrations.set(unregistration.method, unregistration);\n }\n dispose() {\n let unregistrations = [];\n for (let unregistration of this._unregistrations.values()) {\n unregistrations.push(unregistration);\n }\n let params = {\n unregisterations: unregistrations\n };\n this._connection.sendRequest(vscode_languageserver_protocol_1.UnregistrationRequest.type, params).then(undefined, (_error) => {\n this._connection.console.info(`Bulk unregistration failed.`);\n });\n }\n disposeSingle(arg) {\n const method = Is.string(arg) ? arg : arg.method;\n const unregistration = this._unregistrations.get(method);\n if (!unregistration) {\n return false;\n }\n let params = {\n unregisterations: [unregistration]\n };\n this._connection.sendRequest(vscode_languageserver_protocol_1.UnregistrationRequest.type, params).then(() => {\n this._unregistrations.delete(method);\n }, (_error) => {\n this._connection.console.info(`Un-registering request handler for ${unregistration.id} failed.`);\n });\n return true;\n }\n}\nclass RemoteClientImpl {\n attach(connection) {\n this._connection = connection;\n }\n get connection() {\n if (!this._connection) {\n throw new Error('Remote is not attached to a connection yet.');\n }\n return this._connection;\n }\n initialize(_capabilities) {\n }\n fillServerCapabilities(_capabilities) {\n }\n register(typeOrRegistrations, registerOptionsOrType, registerOptions) {\n if (typeOrRegistrations instanceof BulkRegistrationImpl) {\n return this.registerMany(typeOrRegistrations);\n }\n else if (typeOrRegistrations instanceof BulkUnregistrationImpl) {\n return this.registerSingle1(typeOrRegistrations, registerOptionsOrType, registerOptions);\n }\n else {\n return this.registerSingle2(typeOrRegistrations, registerOptionsOrType);\n }\n }\n registerSingle1(unregistration, type, registerOptions) {\n const method = Is.string(type) ? type : type.method;\n const id = UUID.generateUuid();\n let params = {\n registrations: [{ id, method, registerOptions: registerOptions || {} }]\n };\n if (!unregistration.isAttached) {\n unregistration.attach(this.connection);\n }\n return this.connection.sendRequest(vscode_languageserver_protocol_1.RegistrationRequest.type, params).then((_result) => {\n unregistration.add({ id: id, method: method });\n return unregistration;\n }, (_error) => {\n this.connection.console.info(`Registering request handler for ${method} failed.`);\n return Promise.reject(_error);\n });\n }\n registerSingle2(type, registerOptions) {\n const method = Is.string(type) ? type : type.method;\n const id = UUID.generateUuid();\n let params = {\n registrations: [{ id, method, registerOptions: registerOptions || {} }]\n };\n return this.connection.sendRequest(vscode_languageserver_protocol_1.RegistrationRequest.type, params).then((_result) => {\n return vscode_languageserver_protocol_1.Disposable.create(() => {\n this.unregisterSingle(id, method);\n });\n }, (_error) => {\n this.connection.console.info(`Registering request handler for ${method} failed.`);\n return Promise.reject(_error);\n });\n }\n unregisterSingle(id, method) {\n let params = {\n unregisterations: [{ id, method }]\n };\n return this.connection.sendRequest(vscode_languageserver_protocol_1.UnregistrationRequest.type, params).then(undefined, (_error) => {\n this.connection.console.info(`Un-registering request handler for ${id} failed.`);\n });\n }\n registerMany(registrations) {\n let params = registrations.asRegistrationParams();\n return this.connection.sendRequest(vscode_languageserver_protocol_1.RegistrationRequest.type, params).then(() => {\n return new BulkUnregistrationImpl(this._connection, params.registrations.map(registration => { return { id: registration.id, method: registration.method }; }));\n }, (_error) => {\n this.connection.console.info(`Bulk registration failed.`);\n return Promise.reject(_error);\n });\n }\n}\nclass _RemoteWorkspaceImpl {\n constructor() {\n }\n attach(connection) {\n this._connection = connection;\n }\n get connection() {\n if (!this._connection) {\n throw new Error('Remote is not attached to a connection yet.');\n }\n return this._connection;\n }\n initialize(_capabilities) {\n }\n fillServerCapabilities(_capabilities) {\n }\n applyEdit(paramOrEdit) {\n function isApplyWorkspaceEditParams(value) {\n return value && !!value.edit;\n }\n let params = isApplyWorkspaceEditParams(paramOrEdit) ? paramOrEdit : { edit: paramOrEdit };\n return this.connection.sendRequest(vscode_languageserver_protocol_1.ApplyWorkspaceEditRequest.type, params);\n }\n}\nconst RemoteWorkspaceImpl = fileOperations_1.FileOperationsFeature(workspaceFolders_1.WorkspaceFoldersFeature(configuration_1.ConfigurationFeature(_RemoteWorkspaceImpl)));\nclass TracerImpl {\n constructor() {\n this._trace = vscode_languageserver_protocol_1.Trace.Off;\n }\n attach(connection) {\n this._connection = connection;\n }\n get connection() {\n if (!this._connection) {\n throw new Error('Remote is not attached to a connection yet.');\n }\n return this._connection;\n }\n initialize(_capabilities) {\n }\n fillServerCapabilities(_capabilities) {\n }\n set trace(value) {\n this._trace = value;\n }\n log(message, verbose) {\n if (this._trace === vscode_languageserver_protocol_1.Trace.Off) {\n return;\n }\n this.connection.sendNotification(vscode_languageserver_protocol_1.LogTraceNotification.type, {\n message: message,\n verbose: this._trace === vscode_languageserver_protocol_1.Trace.Verbose ? verbose : undefined\n });\n }\n}\nclass TelemetryImpl {\n constructor() {\n }\n attach(connection) {\n this._connection = connection;\n }\n get connection() {\n if (!this._connection) {\n throw new Error('Remote is not attached to a connection yet.');\n }\n return this._connection;\n }\n initialize(_capabilities) {\n }\n fillServerCapabilities(_capabilities) {\n }\n logEvent(data) {\n this.connection.sendNotification(vscode_languageserver_protocol_1.TelemetryEventNotification.type, data);\n }\n}\nclass _LanguagesImpl {\n constructor() {\n }\n attach(connection) {\n this._connection = connection;\n }\n get connection() {\n if (!this._connection) {\n throw new Error('Remote is not attached to a connection yet.');\n }\n return this._connection;\n }\n initialize(_capabilities) {\n }\n fillServerCapabilities(_capabilities) {\n }\n attachWorkDoneProgress(params) {\n return progress_1.attachWorkDone(this.connection, params);\n }\n attachPartialResultProgress(_type, params) {\n return progress_1.attachPartialResult(this.connection, params);\n }\n}\nexports._LanguagesImpl = _LanguagesImpl;\nconst LanguagesImpl = moniker_1.MonikerFeature(linkedEditingRange_1.LinkedEditingRangeFeature(semanticTokens_1.SemanticTokensFeature(callHierarchy_1.CallHierarchyFeature(_LanguagesImpl))));\nfunction combineConsoleFeatures(one, two) {\n return function (Base) {\n return two(one(Base));\n };\n}\nexports.combineConsoleFeatures = combineConsoleFeatures;\nfunction combineTelemetryFeatures(one, two) {\n return function (Base) {\n return two(one(Base));\n };\n}\nexports.combineTelemetryFeatures = combineTelemetryFeatures;\nfunction combineTracerFeatures(one, two) {\n return function (Base) {\n return two(one(Base));\n };\n}\nexports.combineTracerFeatures = combineTracerFeatures;\nfunction combineClientFeatures(one, two) {\n return function (Base) {\n return two(one(Base));\n };\n}\nexports.combineClientFeatures = combineClientFeatures;\nfunction combineWindowFeatures(one, two) {\n return function (Base) {\n return two(one(Base));\n };\n}\nexports.combineWindowFeatures = combineWindowFeatures;\nfunction combineWorkspaceFeatures(one, two) {\n return function (Base) {\n return two(one(Base));\n };\n}\nexports.combineWorkspaceFeatures = combineWorkspaceFeatures;\nfunction combineLanguagesFeatures(one, two) {\n return function (Base) {\n return two(one(Base));\n };\n}\nexports.combineLanguagesFeatures = combineLanguagesFeatures;\nfunction combineFeatures(one, two) {\n function combine(one, two, func) {\n if (one && two) {\n return func(one, two);\n }\n else if (one) {\n return one;\n }\n else {\n return two;\n }\n }\n let result = {\n __brand: 'features',\n console: combine(one.console, two.console, combineConsoleFeatures),\n tracer: combine(one.tracer, two.tracer, combineTracerFeatures),\n telemetry: combine(one.telemetry, two.telemetry, combineTelemetryFeatures),\n client: combine(one.client, two.client, combineClientFeatures),\n window: combine(one.window, two.window, combineWindowFeatures),\n workspace: combine(one.workspace, two.workspace, combineWorkspaceFeatures)\n };\n return result;\n}\nexports.combineFeatures = combineFeatures;\nfunction createConnection(connectionFactory, watchDog, factories) {\n const logger = (factories && factories.console ? new (factories.console(RemoteConsoleImpl))() : new RemoteConsoleImpl());\n const connection = connectionFactory(logger);\n logger.rawAttach(connection);\n const tracer = (factories && factories.tracer ? new (factories.tracer(TracerImpl))() : new TracerImpl());\n const telemetry = (factories && factories.telemetry ? new (factories.telemetry(TelemetryImpl))() : new TelemetryImpl());\n const client = (factories && factories.client ? new (factories.client(RemoteClientImpl))() : new RemoteClientImpl());\n const remoteWindow = (factories && factories.window ? new (factories.window(RemoteWindowImpl))() : new RemoteWindowImpl());\n const workspace = (factories && factories.workspace ? new (factories.workspace(RemoteWorkspaceImpl))() : new RemoteWorkspaceImpl());\n const languages = (factories && factories.languages ? new (factories.languages(LanguagesImpl))() : new LanguagesImpl());\n const allRemotes = [logger, tracer, telemetry, client, remoteWindow, workspace, languages];\n function asPromise(value) {\n if (value instanceof Promise) {\n return value;\n }\n else if (Is.thenable(value)) {\n return new Promise((resolve, reject) => {\n value.then((resolved) => resolve(resolved), (error) => reject(error));\n });\n }\n else {\n return Promise.resolve(value);\n }\n }\n let shutdownHandler = undefined;\n let initializeHandler = undefined;\n let exitHandler = undefined;\n let protocolConnection = {\n listen: () => connection.listen(),\n sendRequest: (type, ...params) => connection.sendRequest(Is.string(type) ? type : type.method, ...params),\n onRequest: (type, handler) => connection.onRequest(type, handler),\n sendNotification: (type, param) => {\n const method = Is.string(type) ? type : type.method;\n if (arguments.length === 1) {\n connection.sendNotification(method);\n }\n else {\n connection.sendNotification(method, param);\n }\n },\n onNotification: (type, handler) => connection.onNotification(type, handler),\n onProgress: connection.onProgress,\n sendProgress: connection.sendProgress,\n onInitialize: (handler) => initializeHandler = handler,\n onInitialized: (handler) => connection.onNotification(vscode_languageserver_protocol_1.InitializedNotification.type, handler),\n onShutdown: (handler) => shutdownHandler = handler,\n onExit: (handler) => exitHandler = handler,\n get console() { return logger; },\n get telemetry() { return telemetry; },\n get tracer() { return tracer; },\n get client() { return client; },\n get window() { return remoteWindow; },\n get workspace() { return workspace; },\n get languages() { return languages; },\n onDidChangeConfiguration: (handler) => connection.onNotification(vscode_languageserver_protocol_1.DidChangeConfigurationNotification.type, handler),\n onDidChangeWatchedFiles: (handler) => connection.onNotification(vscode_languageserver_protocol_1.DidChangeWatchedFilesNotification.type, handler),\n __textDocumentSync: undefined,\n onDidOpenTextDocument: (handler) => connection.onNotification(vscode_languageserver_protocol_1.DidOpenTextDocumentNotification.type, handler),\n onDidChangeTextDocument: (handler) => connection.onNotification(vscode_languageserver_protocol_1.DidChangeTextDocumentNotification.type, handler),\n onDidCloseTextDocument: (handler) => connection.onNotification(vscode_languageserver_protocol_1.DidCloseTextDocumentNotification.type, handler),\n onWillSaveTextDocument: (handler) => connection.onNotification(vscode_languageserver_protocol_1.WillSaveTextDocumentNotification.type, handler),\n onWillSaveTextDocumentWaitUntil: (handler) => connection.onRequest(vscode_languageserver_protocol_1.WillSaveTextDocumentWaitUntilRequest.type, handler),\n onDidSaveTextDocument: (handler) => connection.onNotification(vscode_languageserver_protocol_1.DidSaveTextDocumentNotification.type, handler),\n sendDiagnostics: (params) => connection.sendNotification(vscode_languageserver_protocol_1.PublishDiagnosticsNotification.type, params),\n onHover: (handler) => connection.onRequest(vscode_languageserver_protocol_1.HoverRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), undefined);\n }),\n onCompletion: (handler) => connection.onRequest(vscode_languageserver_protocol_1.CompletionRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));\n }),\n onCompletionResolve: (handler) => connection.onRequest(vscode_languageserver_protocol_1.CompletionResolveRequest.type, handler),\n onSignatureHelp: (handler) => connection.onRequest(vscode_languageserver_protocol_1.SignatureHelpRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), undefined);\n }),\n onDeclaration: (handler) => connection.onRequest(vscode_languageserver_protocol_1.DeclarationRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));\n }),\n onDefinition: (handler) => connection.onRequest(vscode_languageserver_protocol_1.DefinitionRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));\n }),\n onTypeDefinition: (handler) => connection.onRequest(vscode_languageserver_protocol_1.TypeDefinitionRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));\n }),\n onImplementation: (handler) => connection.onRequest(vscode_languageserver_protocol_1.ImplementationRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));\n }),\n onReferences: (handler) => connection.onRequest(vscode_languageserver_protocol_1.ReferencesRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));\n }),\n onDocumentHighlight: (handler) => connection.onRequest(vscode_languageserver_protocol_1.DocumentHighlightRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));\n }),\n onDocumentSymbol: (handler) => connection.onRequest(vscode_languageserver_protocol_1.DocumentSymbolRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));\n }),\n onWorkspaceSymbol: (handler) => connection.onRequest(vscode_languageserver_protocol_1.WorkspaceSymbolRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));\n }),\n onCodeAction: (handler) => connection.onRequest(vscode_languageserver_protocol_1.CodeActionRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));\n }),\n onCodeActionResolve: (handler) => connection.onRequest(vscode_languageserver_protocol_1.CodeActionResolveRequest.type, (params, cancel) => {\n return handler(params, cancel);\n }),\n onCodeLens: (handler) => connection.onRequest(vscode_languageserver_protocol_1.CodeLensRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));\n }),\n onCodeLensResolve: (handler) => connection.onRequest(vscode_languageserver_protocol_1.CodeLensResolveRequest.type, (params, cancel) => {\n return handler(params, cancel);\n }),\n onDocumentFormatting: (handler) => connection.onRequest(vscode_languageserver_protocol_1.DocumentFormattingRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), undefined);\n }),\n onDocumentRangeFormatting: (handler) => connection.onRequest(vscode_languageserver_protocol_1.DocumentRangeFormattingRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), undefined);\n }),\n onDocumentOnTypeFormatting: (handler) => connection.onRequest(vscode_languageserver_protocol_1.DocumentOnTypeFormattingRequest.type, (params, cancel) => {\n return handler(params, cancel);\n }),\n onRenameRequest: (handler) => connection.onRequest(vscode_languageserver_protocol_1.RenameRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), undefined);\n }),\n onPrepareRename: (handler) => connection.onRequest(vscode_languageserver_protocol_1.PrepareRenameRequest.type, (params, cancel) => {\n return handler(params, cancel);\n }),\n onDocumentLinks: (handler) => connection.onRequest(vscode_languageserver_protocol_1.DocumentLinkRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));\n }),\n onDocumentLinkResolve: (handler) => connection.onRequest(vscode_languageserver_protocol_1.DocumentLinkResolveRequest.type, (params, cancel) => {\n return handler(params, cancel);\n }),\n onDocumentColor: (handler) => connection.onRequest(vscode_languageserver_protocol_1.DocumentColorRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));\n }),\n onColorPresentation: (handler) => connection.onRequest(vscode_languageserver_protocol_1.ColorPresentationRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));\n }),\n onFoldingRanges: (handler) => connection.onRequest(vscode_languageserver_protocol_1.FoldingRangeRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));\n }),\n onSelectionRanges: (handler) => connection.onRequest(vscode_languageserver_protocol_1.SelectionRangeRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));\n }),\n onExecuteCommand: (handler) => connection.onRequest(vscode_languageserver_protocol_1.ExecuteCommandRequest.type, (params, cancel) => {\n return handler(params, cancel, progress_1.attachWorkDone(connection, params), undefined);\n }),\n dispose: () => connection.dispose()\n };\n for (let remote of allRemotes) {\n remote.attach(protocolConnection);\n }\n connection.onRequest(vscode_languageserver_protocol_1.InitializeRequest.type, (params) => {\n watchDog.initialize(params);\n if (Is.string(params.trace)) {\n tracer.trace = vscode_languageserver_protocol_1.Trace.fromString(params.trace);\n }\n for (let remote of allRemotes) {\n remote.initialize(params.capabilities);\n }\n if (initializeHandler) {\n let result = initializeHandler(params, new vscode_languageserver_protocol_1.CancellationTokenSource().token, progress_1.attachWorkDone(connection, params), undefined);\n return asPromise(result).then((value) => {\n if (value instanceof vscode_languageserver_protocol_1.ResponseError) {\n return value;\n }\n let result = value;\n if (!result) {\n result = { capabilities: {} };\n }\n let capabilities = result.capabilities;\n if (!capabilities) {\n capabilities = {};\n result.capabilities = capabilities;\n }\n if (capabilities.textDocumentSync === undefined || capabilities.textDocumentSync === null) {\n capabilities.textDocumentSync = Is.number(protocolConnection.__textDocumentSync) ? protocolConnection.__textDocumentSync : vscode_languageserver_protocol_1.TextDocumentSyncKind.None;\n }\n else if (!Is.number(capabilities.textDocumentSync) && !Is.number(capabilities.textDocumentSync.change)) {\n capabilities.textDocumentSync.change = Is.number(protocolConnection.__textDocumentSync) ? protocolConnection.__textDocumentSync : vscode_languageserver_protocol_1.TextDocumentSyncKind.None;\n }\n for (let remote of allRemotes) {\n remote.fillServerCapabilities(capabilities);\n }\n return result;\n });\n }\n else {\n let result = { capabilities: { textDocumentSync: vscode_languageserver_protocol_1.TextDocumentSyncKind.None } };\n for (let remote of allRemotes) {\n remote.fillServerCapabilities(result.capabilities);\n }\n return result;\n }\n });\n connection.onRequest(vscode_languageserver_protocol_1.ShutdownRequest.type, () => {\n watchDog.shutdownReceived = true;\n if (shutdownHandler) {\n return shutdownHandler(new vscode_languageserver_protocol_1.CancellationTokenSource().token);\n }\n else {\n return undefined;\n }\n });\n connection.onNotification(vscode_languageserver_protocol_1.ExitNotification.type, () => {\n try {\n if (exitHandler) {\n exitHandler();\n }\n }\n finally {\n if (watchDog.shutdownReceived) {\n watchDog.exit(0);\n }\n else {\n watchDog.exit(1);\n }\n }\n });\n connection.onNotification(vscode_languageserver_protocol_1.SetTraceNotification.type, (params) => {\n tracer.trace = vscode_languageserver_protocol_1.Trace.fromString(params.value);\n });\n return protocolConnection;\n}\nexports.createConnection = createConnection;\n//# sourceMappingURL=server.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resolveModulePath = exports.FileSystem = exports.resolveGlobalYarnPath = exports.resolveGlobalNodePath = exports.resolve = exports.uriToFilePath = void 0;\nconst url = require(\"url\");\nconst path = require(\"path\");\nconst fs = require(\"fs\");\nconst child_process_1 = require(\"child_process\");\n/**\n * @deprecated Use the `vscode-uri` npm module which provides a more\n * complete implementation of handling VS Code URIs.\n */\nfunction uriToFilePath(uri) {\n let parsed = url.parse(uri);\n if (parsed.protocol !== 'file:' || !parsed.path) {\n return undefined;\n }\n let segments = parsed.path.split('/');\n for (var i = 0, len = segments.length; i < len; i++) {\n segments[i] = decodeURIComponent(segments[i]);\n }\n if (process.platform === 'win32' && segments.length > 1) {\n let first = segments[0];\n let second = segments[1];\n // Do we have a drive letter and we started with a / which is the\n // case if the first segement is empty (see split above)\n if (first.length === 0 && second.length > 1 && second[1] === ':') {\n // Remove first slash\n segments.shift();\n }\n }\n return path.normalize(segments.join('/'));\n}\nexports.uriToFilePath = uriToFilePath;\nfunction isWindows() {\n return process.platform === 'win32';\n}\nfunction resolve(moduleName, nodePath, cwd, tracer) {\n const nodePathKey = 'NODE_PATH';\n const app = [\n 'var p = process;',\n 'p.on(\\'message\\',function(m){',\n 'if(m.c===\\'e\\'){',\n 'p.exit(0);',\n '}',\n 'else if(m.c===\\'rs\\'){',\n 'try{',\n 'var r=require.resolve(m.a);',\n 'p.send({c:\\'r\\',s:true,r:r});',\n '}',\n 'catch(err){',\n 'p.send({c:\\'r\\',s:false});',\n '}',\n '}',\n '});'\n ].join('');\n return new Promise((resolve, reject) => {\n let env = process.env;\n let newEnv = Object.create(null);\n Object.keys(env).forEach(key => newEnv[key] = env[key]);\n if (nodePath && fs.existsSync(nodePath) /* see issue 545 */) {\n if (newEnv[nodePathKey]) {\n newEnv[nodePathKey] = nodePath + path.delimiter + newEnv[nodePathKey];\n }\n else {\n newEnv[nodePathKey] = nodePath;\n }\n if (tracer) {\n tracer(`NODE_PATH value is: ${newEnv[nodePathKey]}`);\n }\n }\n newEnv['ELECTRON_RUN_AS_NODE'] = '1';\n try {\n let cp = child_process_1.fork('', [], {\n cwd: cwd,\n env: newEnv,\n execArgv: ['-e', app]\n });\n if (cp.pid === void 0) {\n reject(new Error(`Starting process to resolve node module ${moduleName} failed`));\n return;\n }\n cp.on('error', (error) => {\n reject(error);\n });\n cp.on('message', (message) => {\n if (message.c === 'r') {\n cp.send({ c: 'e' });\n if (message.s) {\n resolve(message.r);\n }\n else {\n reject(new Error(`Failed to resolve module: ${moduleName}`));\n }\n }\n });\n let message = {\n c: 'rs',\n a: moduleName\n };\n cp.send(message);\n }\n catch (error) {\n reject(error);\n }\n });\n}\nexports.resolve = resolve;\n/**\n * Resolve the global npm package path.\n * @deprecated Since this depends on the used package manager and their version the best is that servers\n * implement this themselves since they know best what kind of package managers to support.\n * @param tracer the tracer to use\n */\nfunction resolveGlobalNodePath(tracer) {\n let npmCommand = 'npm';\n const env = Object.create(null);\n Object.keys(process.env).forEach(key => env[key] = process.env[key]);\n env['NO_UPDATE_NOTIFIER'] = 'true';\n const options = {\n encoding: 'utf8',\n env\n };\n if (isWindows()) {\n npmCommand = 'npm.cmd';\n options.shell = true;\n }\n let handler = () => { };\n try {\n process.on('SIGPIPE', handler);\n let stdout = child_process_1.spawnSync(npmCommand, ['config', 'get', 'prefix'], options).stdout;\n if (!stdout) {\n if (tracer) {\n tracer(`'npm config get prefix' didn't return a value.`);\n }\n return undefined;\n }\n let prefix = stdout.trim();\n if (tracer) {\n tracer(`'npm config get prefix' value is: ${prefix}`);\n }\n if (prefix.length > 0) {\n if (isWindows()) {\n return path.join(prefix, 'node_modules');\n }\n else {\n return path.join(prefix, 'lib', 'node_modules');\n }\n }\n return undefined;\n }\n catch (err) {\n return undefined;\n }\n finally {\n process.removeListener('SIGPIPE', handler);\n }\n}\nexports.resolveGlobalNodePath = resolveGlobalNodePath;\n/*\n * Resolve the global yarn pakage path.\n * @deprecated Since this depends on the used package manager and their version the best is that servers\n * implement this themselves since they know best what kind of package managers to support.\n * @param tracer the tracer to use\n */\nfunction resolveGlobalYarnPath(tracer) {\n let yarnCommand = 'yarn';\n let options = {\n encoding: 'utf8'\n };\n if (isWindows()) {\n yarnCommand = 'yarn.cmd';\n options.shell = true;\n }\n let handler = () => { };\n try {\n process.on('SIGPIPE', handler);\n let results = child_process_1.spawnSync(yarnCommand, ['global', 'dir', '--json'], options);\n let stdout = results.stdout;\n if (!stdout) {\n if (tracer) {\n tracer(`'yarn global dir' didn't return a value.`);\n if (results.stderr) {\n tracer(results.stderr);\n }\n }\n return undefined;\n }\n let lines = stdout.trim().split(/\\r?\\n/);\n for (let line of lines) {\n try {\n let yarn = JSON.parse(line);\n if (yarn.type === 'log') {\n return path.join(yarn.data, 'node_modules');\n }\n }\n catch (e) {\n // Do nothing. Ignore the line\n }\n }\n return undefined;\n }\n catch (err) {\n return undefined;\n }\n finally {\n process.removeListener('SIGPIPE', handler);\n }\n}\nexports.resolveGlobalYarnPath = resolveGlobalYarnPath;\nvar FileSystem;\n(function (FileSystem) {\n let _isCaseSensitive = undefined;\n function isCaseSensitive() {\n if (_isCaseSensitive !== void 0) {\n return _isCaseSensitive;\n }\n if (process.platform === 'win32') {\n _isCaseSensitive = false;\n }\n else {\n // convert current file name to upper case / lower case and check if file exists\n // (guards against cases when name is already all uppercase or lowercase)\n _isCaseSensitive = !fs.existsSync(__filename.toUpperCase()) || !fs.existsSync(__filename.toLowerCase());\n }\n return _isCaseSensitive;\n }\n FileSystem.isCaseSensitive = isCaseSensitive;\n function isParent(parent, child) {\n if (isCaseSensitive()) {\n return path.normalize(child).indexOf(path.normalize(parent)) === 0;\n }\n else {\n return path.normalize(child).toLowerCase().indexOf(path.normalize(parent).toLowerCase()) === 0;\n }\n }\n FileSystem.isParent = isParent;\n})(FileSystem = exports.FileSystem || (exports.FileSystem = {}));\nfunction resolveModulePath(workspaceRoot, moduleName, nodePath, tracer) {\n if (nodePath) {\n if (!path.isAbsolute(nodePath)) {\n nodePath = path.join(workspaceRoot, nodePath);\n }\n return resolve(moduleName, nodePath, nodePath, tracer).then((value) => {\n if (FileSystem.isParent(nodePath, value)) {\n return value;\n }\n else {\n return Promise.reject(new Error(`Failed to load ${moduleName} from node path location.`));\n }\n }).then(undefined, (_error) => {\n return resolve(moduleName, resolveGlobalNodePath(tracer), workspaceRoot, tracer);\n });\n }\n else {\n return resolve(moduleName, resolveGlobalNodePath(tracer), workspaceRoot, tracer);\n }\n}\nexports.resolveModulePath = resolveModulePath;\n//# sourceMappingURL=files.js.map", "/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ----------------------------------------------------------------------------------------- */\n'use strict';\n\nmodule.exports = require('./lib/node/main');", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ProposedFeatures = exports.SemanticTokensBuilder = void 0;\nconst semanticTokens_1 = require(\"./semanticTokens\");\nObject.defineProperty(exports, \"SemanticTokensBuilder\", { enumerable: true, get: function () { return semanticTokens_1.SemanticTokensBuilder; } });\n__exportStar(require(\"vscode-languageserver-protocol/\"), exports);\n__exportStar(require(\"./server\"), exports);\nvar ProposedFeatures;\n(function (ProposedFeatures) {\n ProposedFeatures.all = {\n __brand: 'features'\n };\n})(ProposedFeatures = exports.ProposedFeatures || (exports.ProposedFeatures = {}));\n//# sourceMappingURL=api.js.map", "\"use strict\";\n/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\n/// <reference path=\"../../typings/thenable.d.ts\" />\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createConnection = exports.Files = void 0;\nconst Is = require(\"../common/utils/is\");\nconst server_1 = require(\"../common/server\");\nconst fm = require(\"./files\");\nconst node_1 = require(\"vscode-languageserver-protocol/node\");\n__exportStar(require(\"vscode-languageserver-protocol/node\"), exports);\n__exportStar(require(\"../common/api\"), exports);\nvar Files;\n(function (Files) {\n Files.uriToFilePath = fm.uriToFilePath;\n Files.resolveGlobalNodePath = fm.resolveGlobalNodePath;\n Files.resolveGlobalYarnPath = fm.resolveGlobalYarnPath;\n Files.resolve = fm.resolve;\n Files.resolveModulePath = fm.resolveModulePath;\n})(Files = exports.Files || (exports.Files = {}));\nlet _protocolConnection;\nfunction endProtocolConnection() {\n if (_protocolConnection === undefined) {\n return;\n }\n try {\n _protocolConnection.end();\n }\n catch (_err) {\n // Ignore. The client process could have already\n // did and we can't send an end into the connection.\n }\n}\nlet _shutdownReceived = false;\nlet exitTimer = undefined;\nfunction setupExitTimer() {\n const argName = '--clientProcessId';\n function runTimer(value) {\n try {\n let processId = parseInt(value);\n if (!isNaN(processId)) {\n exitTimer = setInterval(() => {\n try {\n process.kill(processId, 0);\n }\n catch (ex) {\n // Parent process doesn't exist anymore. Exit the server.\n endProtocolConnection();\n process.exit(_shutdownReceived ? 0 : 1);\n }\n }, 3000);\n }\n }\n catch (e) {\n // Ignore errors;\n }\n }\n for (let i = 2; i < process.argv.length; i++) {\n let arg = process.argv[i];\n if (arg === argName && i + 1 < process.argv.length) {\n runTimer(process.argv[i + 1]);\n return;\n }\n else {\n let args = arg.split('=');\n if (args[0] === argName) {\n runTimer(args[1]);\n }\n }\n }\n}\nsetupExitTimer();\nconst watchDog = {\n initialize: (params) => {\n const processId = params.processId;\n if (Is.number(processId) && exitTimer === undefined) {\n // We received a parent process id. Set up a timer to periodically check\n // if the parent is still alive.\n setInterval(() => {\n try {\n process.kill(processId, 0);\n }\n catch (ex) {\n // Parent process doesn't exist anymore. Exit the server.\n process.exit(_shutdownReceived ? 0 : 1);\n }\n }, 3000);\n }\n },\n get shutdownReceived() {\n return _shutdownReceived;\n },\n set shutdownReceived(value) {\n _shutdownReceived = value;\n },\n exit: (code) => {\n endProtocolConnection();\n process.exit(code);\n }\n};\nfunction createConnection(arg1, arg2, arg3, arg4) {\n let factories;\n let input;\n let output;\n let options;\n if (arg1 !== void 0 && arg1.__brand === 'features') {\n factories = arg1;\n arg1 = arg2;\n arg2 = arg3;\n arg3 = arg4;\n }\n if (node_1.ConnectionStrategy.is(arg1) || node_1.ConnectionOptions.is(arg1)) {\n options = arg1;\n }\n else {\n input = arg1;\n output = arg2;\n options = arg3;\n }\n return _createConnection(input, output, options, factories);\n}\nexports.createConnection = createConnection;\nfunction _createConnection(input, output, options, factories) {\n if (!input && !output && process.argv.length > 2) {\n let port = void 0;\n let pipeName = void 0;\n let argv = process.argv.slice(2);\n for (let i = 0; i < argv.length; i++) {\n let arg = argv[i];\n if (arg === '--node-ipc') {\n input = new node_1.IPCMessageReader(process);\n output = new node_1.IPCMessageWriter(process);\n break;\n }\n else if (arg === '--stdio') {\n input = process.stdin;\n output = process.stdout;\n break;\n }\n else if (arg === '--socket') {\n port = parseInt(argv[i + 1]);\n break;\n }\n else if (arg === '--pipe') {\n pipeName = argv[i + 1];\n break;\n }\n else {\n var args = arg.split('=');\n if (args[0] === '--socket') {\n port = parseInt(args[1]);\n break;\n }\n else if (args[0] === '--pipe') {\n pipeName = args[1];\n break;\n }\n }\n }\n if (port) {\n let transport = node_1.createServerSocketTransport(port);\n input = transport[0];\n output = transport[1];\n }\n else if (pipeName) {\n let transport = node_1.createServerPipeTransport(pipeName);\n input = transport[0];\n output = transport[1];\n }\n }\n var commandLineMessage = 'Use arguments of createConnection or set command line parameters: \\'--node-ipc\\', \\'--stdio\\' or \\'--socket={number}\\'';\n if (!input) {\n throw new Error('Connection input stream is not set. ' + commandLineMessage);\n }\n if (!output) {\n throw new Error('Connection output stream is not set. ' + commandLineMessage);\n }\n // Backwards compatibility\n if (Is.func(input.read) && Is.func(input.on)) {\n let inputStream = input;\n inputStream.on('end', () => {\n endProtocolConnection();\n process.exit(_shutdownReceived ? 0 : 1);\n });\n inputStream.on('close', () => {\n endProtocolConnection();\n process.exit(_shutdownReceived ? 0 : 1);\n });\n }\n const connectionFactory = (logger) => {\n const result = node_1.createProtocolConnection(input, output, logger, options);\n return result;\n };\n return server_1.createConnection(connectionFactory, watchDog, factories);\n}\n//# sourceMappingURL=main.js.map", null, null, null, "/*jshint node:true */\n/*\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nfunction OutputLine(parent) {\n this.__parent = parent;\n this.__character_count = 0;\n // use indent_count as a marker for this.__lines that have preserved indentation\n this.__indent_count = -1;\n this.__alignment_count = 0;\n this.__wrap_point_index = 0;\n this.__wrap_point_character_count = 0;\n this.__wrap_point_indent_count = -1;\n this.__wrap_point_alignment_count = 0;\n\n this.__items = [];\n}\n\nOutputLine.prototype.clone_empty = function() {\n var line = new OutputLine(this.__parent);\n line.set_indent(this.__indent_count, this.__alignment_count);\n return line;\n};\n\nOutputLine.prototype.item = function(index) {\n if (index < 0) {\n return this.__items[this.__items.length + index];\n } else {\n return this.__items[index];\n }\n};\n\nOutputLine.prototype.has_match = function(pattern) {\n for (var lastCheckedOutput = this.__items.length - 1; lastCheckedOutput >= 0; lastCheckedOutput--) {\n if (this.__items[lastCheckedOutput].match(pattern)) {\n return true;\n }\n }\n return false;\n};\n\nOutputLine.prototype.set_indent = function(indent, alignment) {\n if (this.is_empty()) {\n this.__indent_count = indent || 0;\n this.__alignment_count = alignment || 0;\n this.__character_count = this.__parent.get_indent_size(this.__indent_count, this.__alignment_count);\n }\n};\n\nOutputLine.prototype._set_wrap_point = function() {\n if (this.__parent.wrap_line_length) {\n this.__wrap_point_index = this.__items.length;\n this.__wrap_point_character_count = this.__character_count;\n this.__wrap_point_indent_count = this.__parent.next_line.__indent_count;\n this.__wrap_point_alignment_count = this.__parent.next_line.__alignment_count;\n }\n};\n\nOutputLine.prototype._should_wrap = function() {\n return this.__wrap_point_index &&\n this.__character_count > this.__parent.wrap_line_length &&\n this.__wrap_point_character_count > this.__parent.next_line.__character_count;\n};\n\nOutputLine.prototype._allow_wrap = function() {\n if (this._should_wrap()) {\n this.__parent.add_new_line();\n var next = this.__parent.current_line;\n next.set_indent(this.__wrap_point_indent_count, this.__wrap_point_alignment_count);\n next.__items = this.__items.slice(this.__wrap_point_index);\n this.__items = this.__items.slice(0, this.__wrap_point_index);\n\n next.__character_count += this.__character_count - this.__wrap_point_character_count;\n this.__character_count = this.__wrap_point_character_count;\n\n if (next.__items[0] === \" \") {\n next.__items.splice(0, 1);\n next.__character_count -= 1;\n }\n return true;\n }\n return false;\n};\n\nOutputLine.prototype.is_empty = function() {\n return this.__items.length === 0;\n};\n\nOutputLine.prototype.last = function() {\n if (!this.is_empty()) {\n return this.__items[this.__items.length - 1];\n } else {\n return null;\n }\n};\n\nOutputLine.prototype.push = function(item) {\n this.__items.push(item);\n var last_newline_index = item.lastIndexOf('\\n');\n if (last_newline_index !== -1) {\n this.__character_count = item.length - last_newline_index;\n } else {\n this.__character_count += item.length;\n }\n};\n\nOutputLine.prototype.pop = function() {\n var item = null;\n if (!this.is_empty()) {\n item = this.__items.pop();\n this.__character_count -= item.length;\n }\n return item;\n};\n\n\nOutputLine.prototype._remove_indent = function() {\n if (this.__indent_count > 0) {\n this.__indent_count -= 1;\n this.__character_count -= this.__parent.indent_size;\n }\n};\n\nOutputLine.prototype._remove_wrap_indent = function() {\n if (this.__wrap_point_indent_count > 0) {\n this.__wrap_point_indent_count -= 1;\n }\n};\nOutputLine.prototype.trim = function() {\n while (this.last() === ' ') {\n this.__items.pop();\n this.__character_count -= 1;\n }\n};\n\nOutputLine.prototype.toString = function() {\n var result = '';\n if (this.is_empty()) {\n if (this.__parent.indent_empty_lines) {\n result = this.__parent.get_indent_string(this.__indent_count);\n }\n } else {\n result = this.__parent.get_indent_string(this.__indent_count, this.__alignment_count);\n result += this.__items.join('');\n }\n return result;\n};\n\nfunction IndentStringCache(options, baseIndentString) {\n this.__cache = [''];\n this.__indent_size = options.indent_size;\n this.__indent_string = options.indent_char;\n if (!options.indent_with_tabs) {\n this.__indent_string = new Array(options.indent_size + 1).join(options.indent_char);\n }\n\n // Set to null to continue support for auto detection of base indent\n baseIndentString = baseIndentString || '';\n if (options.indent_level > 0) {\n baseIndentString = new Array(options.indent_level + 1).join(this.__indent_string);\n }\n\n this.__base_string = baseIndentString;\n this.__base_string_length = baseIndentString.length;\n}\n\nIndentStringCache.prototype.get_indent_size = function(indent, column) {\n var result = this.__base_string_length;\n column = column || 0;\n if (indent < 0) {\n result = 0;\n }\n result += indent * this.__indent_size;\n result += column;\n return result;\n};\n\nIndentStringCache.prototype.get_indent_string = function(indent_level, column) {\n var result = this.__base_string;\n column = column || 0;\n if (indent_level < 0) {\n indent_level = 0;\n result = '';\n }\n column += indent_level * this.__indent_size;\n this.__ensure_cache(column);\n result += this.__cache[column];\n return result;\n};\n\nIndentStringCache.prototype.__ensure_cache = function(column) {\n while (column >= this.__cache.length) {\n this.__add_column();\n }\n};\n\nIndentStringCache.prototype.__add_column = function() {\n var column = this.__cache.length;\n var indent = 0;\n var result = '';\n if (this.__indent_size && column >= this.__indent_size) {\n indent = Math.floor(column / this.__indent_size);\n column -= indent * this.__indent_size;\n result = new Array(indent + 1).join(this.__indent_string);\n }\n if (column) {\n result += new Array(column + 1).join(' ');\n }\n\n this.__cache.push(result);\n};\n\nfunction Output(options, baseIndentString) {\n this.__indent_cache = new IndentStringCache(options, baseIndentString);\n this.raw = false;\n this._end_with_newline = options.end_with_newline;\n this.indent_size = options.indent_size;\n this.wrap_line_length = options.wrap_line_length;\n this.indent_empty_lines = options.indent_empty_lines;\n this.__lines = [];\n this.previous_line = null;\n this.current_line = null;\n this.next_line = new OutputLine(this);\n this.space_before_token = false;\n this.non_breaking_space = false;\n this.previous_token_wrapped = false;\n // initialize\n this.__add_outputline();\n}\n\nOutput.prototype.__add_outputline = function() {\n this.previous_line = this.current_line;\n this.current_line = this.next_line.clone_empty();\n this.__lines.push(this.current_line);\n};\n\nOutput.prototype.get_line_number = function() {\n return this.__lines.length;\n};\n\nOutput.prototype.get_indent_string = function(indent, column) {\n return this.__indent_cache.get_indent_string(indent, column);\n};\n\nOutput.prototype.get_indent_size = function(indent, column) {\n return this.__indent_cache.get_indent_size(indent, column);\n};\n\nOutput.prototype.is_empty = function() {\n return !this.previous_line && this.current_line.is_empty();\n};\n\nOutput.prototype.add_new_line = function(force_newline) {\n // never newline at the start of file\n // otherwise, newline only if we didn't just add one or we're forced\n if (this.is_empty() ||\n (!force_newline && this.just_added_newline())) {\n return false;\n }\n\n // if raw output is enabled, don't print additional newlines,\n // but still return True as though you had\n if (!this.raw) {\n this.__add_outputline();\n }\n return true;\n};\n\nOutput.prototype.get_code = function(eol) {\n this.trim(true);\n\n // handle some edge cases where the last tokens\n // has text that ends with newline(s)\n var last_item = this.current_line.pop();\n if (last_item) {\n if (last_item[last_item.length - 1] === '\\n') {\n last_item = last_item.replace(/\\n+$/g, '');\n }\n this.current_line.push(last_item);\n }\n\n if (this._end_with_newline) {\n this.__add_outputline();\n }\n\n var sweet_code = this.__lines.join('\\n');\n\n if (eol !== '\\n') {\n sweet_code = sweet_code.replace(/[\\n]/g, eol);\n }\n return sweet_code;\n};\n\nOutput.prototype.set_wrap_point = function() {\n this.current_line._set_wrap_point();\n};\n\nOutput.prototype.set_indent = function(indent, alignment) {\n indent = indent || 0;\n alignment = alignment || 0;\n\n // Next line stores alignment values\n this.next_line.set_indent(indent, alignment);\n\n // Never indent your first output indent at the start of the file\n if (this.__lines.length > 1) {\n this.current_line.set_indent(indent, alignment);\n return true;\n }\n\n this.current_line.set_indent();\n return false;\n};\n\nOutput.prototype.add_raw_token = function(token) {\n for (var x = 0; x < token.newlines; x++) {\n this.__add_outputline();\n }\n this.current_line.set_indent(-1);\n this.current_line.push(token.whitespace_before);\n this.current_line.push(token.text);\n this.space_before_token = false;\n this.non_breaking_space = false;\n this.previous_token_wrapped = false;\n};\n\nOutput.prototype.add_token = function(printable_token) {\n this.__add_space_before_token();\n this.current_line.push(printable_token);\n this.space_before_token = false;\n this.non_breaking_space = false;\n this.previous_token_wrapped = this.current_line._allow_wrap();\n};\n\nOutput.prototype.__add_space_before_token = function() {\n if (this.space_before_token && !this.just_added_newline()) {\n if (!this.non_breaking_space) {\n this.set_wrap_point();\n }\n this.current_line.push(' ');\n }\n};\n\nOutput.prototype.remove_indent = function(index) {\n var output_length = this.__lines.length;\n while (index < output_length) {\n this.__lines[index]._remove_indent();\n index++;\n }\n this.current_line._remove_wrap_indent();\n};\n\nOutput.prototype.trim = function(eat_newlines) {\n eat_newlines = (eat_newlines === undefined) ? false : eat_newlines;\n\n this.current_line.trim();\n\n while (eat_newlines && this.__lines.length > 1 &&\n this.current_line.is_empty()) {\n this.__lines.pop();\n this.current_line = this.__lines[this.__lines.length - 1];\n this.current_line.trim();\n }\n\n this.previous_line = this.__lines.length > 1 ?\n this.__lines[this.__lines.length - 2] : null;\n};\n\nOutput.prototype.just_added_newline = function() {\n return this.current_line.is_empty();\n};\n\nOutput.prototype.just_added_blankline = function() {\n return this.is_empty() ||\n (this.current_line.is_empty() && this.previous_line.is_empty());\n};\n\nOutput.prototype.ensure_empty_line_above = function(starts_with, ends_with) {\n var index = this.__lines.length - 2;\n while (index >= 0) {\n var potentialEmptyLine = this.__lines[index];\n if (potentialEmptyLine.is_empty()) {\n break;\n } else if (potentialEmptyLine.item(0).indexOf(starts_with) !== 0 &&\n potentialEmptyLine.item(-1) !== ends_with) {\n this.__lines.splice(index + 1, 0, new OutputLine(this));\n this.previous_line = this.__lines[this.__lines.length - 2];\n break;\n }\n index--;\n }\n};\n\nmodule.exports.Output = Output;\n", "/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nfunction Token(type, text, newlines, whitespace_before) {\n this.type = type;\n this.text = text;\n\n // comments_before are\n // comments that have a new line before them\n // and may or may not have a newline after\n // this is a set of comments before\n this.comments_before = null; /* inline comment*/\n\n\n // this.comments_after = new TokenStream(); // no new line before and newline after\n this.newlines = newlines || 0;\n this.whitespace_before = whitespace_before || '';\n this.parent = null;\n this.next = null;\n this.previous = null;\n this.opened = null;\n this.closed = null;\n this.directives = null;\n}\n\n\nmodule.exports.Token = Token;\n", "/* jshint node: true, curly: false */\n// Parts of this section of code is taken from acorn.\n//\n// Acorn was written by Marijn Haverbeke and released under an MIT\n// license. The Unicode regexps (for identifiers and whitespace) were\n// taken from [Esprima](http://esprima.org) by Ariya Hidayat.\n//\n// Git repositories for Acorn are available at\n//\n// http://marijnhaverbeke.nl/git/acorn\n// https://github.com/marijnh/acorn.git\n\n// ## Character categories\n\n\n'use strict';\n\n// acorn used char codes to squeeze the last bit of performance out\n// Beautifier is okay without that, so we're using regex\n// permit # (23), $ (36), and @ (64). @ is used in ES7 decorators.\n// 65 through 91 are uppercase letters.\n// permit _ (95).\n// 97 through 123 are lowercase letters.\nvar baseASCIIidentifierStartChars = \"\\\\x23\\\\x24\\\\x40\\\\x41-\\\\x5a\\\\x5f\\\\x61-\\\\x7a\";\n\n// inside an identifier @ is not allowed but 0-9 are.\nvar baseASCIIidentifierChars = \"\\\\x24\\\\x30-\\\\x39\\\\x41-\\\\x5a\\\\x5f\\\\x61-\\\\x7a\";\n\n// Big ugly regular expressions that match characters in the\n// whitespace, identifier, and identifier-start categories. These\n// are only applied when a character is found to actually have a\n// code point above 128.\nvar nonASCIIidentifierStartChars = \"\\\\xaa\\\\xb5\\\\xba\\\\xc0-\\\\xd6\\\\xd8-\\\\xf6\\\\xf8-\\\\u02c1\\\\u02c6-\\\\u02d1\\\\u02e0-\\\\u02e4\\\\u02ec\\\\u02ee\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037a-\\\\u037d\\\\u0386\\\\u0388-\\\\u038a\\\\u038c\\\\u038e-\\\\u03a1\\\\u03a3-\\\\u03f5\\\\u03f7-\\\\u0481\\\\u048a-\\\\u0527\\\\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\\\\u08a2-\\\\u08ac\\\\u0904-\\\\u0939\\\\u093d\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0977\\\\u0979-\\\\u097f\\\\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\\\\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-\\\\u0c33\\\\u0c35-\\\\u0c39\\\\u0c3d\\\\u0c58\\\\u0c59\\\\u0c60\\\\u0c61\\\\u0c85-\\\\u0c8c\\\\u0c8e-\\\\u0c90\\\\u0c92-\\\\u0ca8\\\\u0caa-\\\\u0cb3\\\\u0cb5-\\\\u0cb9\\\\u0cbd\\\\u0cde\\\\u0ce0\\\\u0ce1\\\\u0cf1\\\\u0cf2\\\\u0d05-\\\\u0d0c\\\\u0d0e-\\\\u0d10\\\\u0d12-\\\\u0d3a\\\\u0d3d\\\\u0d4e\\\\u0d60\\\\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-\\\\u13f4\\\\u1401-\\\\u166c\\\\u166f-\\\\u167f\\\\u1681-\\\\u169a\\\\u16a0-\\\\u16ea\\\\u16ee-\\\\u16f0\\\\u1700-\\\\u170c\\\\u170e-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176c\\\\u176e-\\\\u1770\\\\u1780-\\\\u17b3\\\\u17d7\\\\u17dc\\\\u1820-\\\\u1877\\\\u1880-\\\\u18a8\\\\u18aa\\\\u18b0-\\\\u18f5\\\\u1900-\\\\u191c\\\\u1950-\\\\u196d\\\\u1970-\\\\u1974\\\\u1980-\\\\u19ab\\\\u19c1-\\\\u19c7\\\\u1a00-\\\\u1a16\\\\u1a20-\\\\u1a54\\\\u1aa7\\\\u1b05-\\\\u1b33\\\\u1b45-\\\\u1b4b\\\\u1b83-\\\\u1ba0\\\\u1bae\\\\u1baf\\\\u1bba-\\\\u1be5\\\\u1c00-\\\\u1c23\\\\u1c4d-\\\\u1c4f\\\\u1c5a-\\\\u1c7d\\\\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-\\\\u9fcc\\\\ua000-\\\\ua48c\\\\ua4d0-\\\\ua4fd\\\\ua500-\\\\ua60c\\\\ua610-\\\\ua61f\\\\ua62a\\\\ua62b\\\\ua640-\\\\ua66e\\\\ua67f-\\\\ua697\\\\ua6a0-\\\\ua6ef\\\\ua717-\\\\ua71f\\\\ua722-\\\\ua788\\\\ua78b-\\\\ua78e\\\\ua790-\\\\ua793\\\\ua7a0-\\\\ua7aa\\\\ua7f8-\\\\ua801\\\\ua803-\\\\ua805\\\\ua807-\\\\ua80a\\\\ua80c-\\\\ua822\\\\ua840-\\\\ua873\\\\ua882-\\\\ua8b3\\\\ua8f2-\\\\ua8f7\\\\ua8fb\\\\ua90a-\\\\ua925\\\\ua930-\\\\ua946\\\\ua960-\\\\ua97c\\\\ua984-\\\\ua9b2\\\\ua9cf\\\\uaa00-\\\\uaa28\\\\uaa40-\\\\uaa42\\\\uaa44-\\\\uaa4b\\\\uaa60-\\\\uaa76\\\\uaa7a\\\\uaa80-\\\\uaaaf\\\\uaab1\\\\uaab5\\\\uaab6\\\\uaab9-\\\\uaabd\\\\uaac0\\\\uaac2\\\\uaadb-\\\\uaadd\\\\uaae0-\\\\uaaea\\\\uaaf2-\\\\uaaf4\\\\uab01-\\\\uab06\\\\uab09-\\\\uab0e\\\\uab11-\\\\uab16\\\\uab20-\\\\uab26\\\\uab28-\\\\uab2e\\\\uabc0-\\\\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\";\nvar nonASCIIidentifierChars = \"\\\\u0300-\\\\u036f\\\\u0483-\\\\u0487\\\\u0591-\\\\u05bd\\\\u05bf\\\\u05c1\\\\u05c2\\\\u05c4\\\\u05c5\\\\u05c7\\\\u0610-\\\\u061a\\\\u0620-\\\\u0649\\\\u0672-\\\\u06d3\\\\u06e7-\\\\u06e8\\\\u06fb-\\\\u06fc\\\\u0730-\\\\u074a\\\\u0800-\\\\u0814\\\\u081b-\\\\u0823\\\\u0825-\\\\u0827\\\\u0829-\\\\u082d\\\\u0840-\\\\u0857\\\\u08e4-\\\\u08fe\\\\u0900-\\\\u0903\\\\u093a-\\\\u093c\\\\u093e-\\\\u094f\\\\u0951-\\\\u0957\\\\u0962-\\\\u0963\\\\u0966-\\\\u096f\\\\u0981-\\\\u0983\\\\u09bc\\\\u09be-\\\\u09c4\\\\u09c7\\\\u09c8\\\\u09d7\\\\u09df-\\\\u09e0\\\\u0a01-\\\\u0a03\\\\u0a3c\\\\u0a3e-\\\\u0a42\\\\u0a47\\\\u0a48\\\\u0a4b-\\\\u0a4d\\\\u0a51\\\\u0a66-\\\\u0a71\\\\u0a75\\\\u0a81-\\\\u0a83\\\\u0abc\\\\u0abe-\\\\u0ac5\\\\u0ac7-\\\\u0ac9\\\\u0acb-\\\\u0acd\\\\u0ae2-\\\\u0ae3\\\\u0ae6-\\\\u0aef\\\\u0b01-\\\\u0b03\\\\u0b3c\\\\u0b3e-\\\\u0b44\\\\u0b47\\\\u0b48\\\\u0b4b-\\\\u0b4d\\\\u0b56\\\\u0b57\\\\u0b5f-\\\\u0b60\\\\u0b66-\\\\u0b6f\\\\u0b82\\\\u0bbe-\\\\u0bc2\\\\u0bc6-\\\\u0bc8\\\\u0bca-\\\\u0bcd\\\\u0bd7\\\\u0be6-\\\\u0bef\\\\u0c01-\\\\u0c03\\\\u0c46-\\\\u0c48\\\\u0c4a-\\\\u0c4d\\\\u0c55\\\\u0c56\\\\u0c62-\\\\u0c63\\\\u0c66-\\\\u0c6f\\\\u0c82\\\\u0c83\\\\u0cbc\\\\u0cbe-\\\\u0cc4\\\\u0cc6-\\\\u0cc8\\\\u0cca-\\\\u0ccd\\\\u0cd5\\\\u0cd6\\\\u0ce2-\\\\u0ce3\\\\u0ce6-\\\\u0cef\\\\u0d02\\\\u0d03\\\\u0d46-\\\\u0d48\\\\u0d57\\\\u0d62-\\\\u0d63\\\\u0d66-\\\\u0d6f\\\\u0d82\\\\u0d83\\\\u0dca\\\\u0dcf-\\\\u0dd4\\\\u0dd6\\\\u0dd8-\\\\u0ddf\\\\u0df2\\\\u0df3\\\\u0e34-\\\\u0e3a\\\\u0e40-\\\\u0e45\\\\u0e50-\\\\u0e59\\\\u0eb4-\\\\u0eb9\\\\u0ec8-\\\\u0ecd\\\\u0ed0-\\\\u0ed9\\\\u0f18\\\\u0f19\\\\u0f20-\\\\u0f29\\\\u0f35\\\\u0f37\\\\u0f39\\\\u0f41-\\\\u0f47\\\\u0f71-\\\\u0f84\\\\u0f86-\\\\u0f87\\\\u0f8d-\\\\u0f97\\\\u0f99-\\\\u0fbc\\\\u0fc6\\\\u1000-\\\\u1029\\\\u1040-\\\\u1049\\\\u1067-\\\\u106d\\\\u1071-\\\\u1074\\\\u1082-\\\\u108d\\\\u108f-\\\\u109d\\\\u135d-\\\\u135f\\\\u170e-\\\\u1710\\\\u1720-\\\\u1730\\\\u1740-\\\\u1750\\\\u1772\\\\u1773\\\\u1780-\\\\u17b2\\\\u17dd\\\\u17e0-\\\\u17e9\\\\u180b-\\\\u180d\\\\u1810-\\\\u1819\\\\u1920-\\\\u192b\\\\u1930-\\\\u193b\\\\u1951-\\\\u196d\\\\u19b0-\\\\u19c0\\\\u19c8-\\\\u19c9\\\\u19d0-\\\\u19d9\\\\u1a00-\\\\u1a15\\\\u1a20-\\\\u1a53\\\\u1a60-\\\\u1a7c\\\\u1a7f-\\\\u1a89\\\\u1a90-\\\\u1a99\\\\u1b46-\\\\u1b4b\\\\u1b50-\\\\u1b59\\\\u1b6b-\\\\u1b73\\\\u1bb0-\\\\u1bb9\\\\u1be6-\\\\u1bf3\\\\u1c00-\\\\u1c22\\\\u1c40-\\\\u1c49\\\\u1c5b-\\\\u1c7d\\\\u1cd0-\\\\u1cd2\\\\u1d00-\\\\u1dbe\\\\u1e01-\\\\u1f15\\\\u200c\\\\u200d\\\\u203f\\\\u2040\\\\u2054\\\\u20d0-\\\\u20dc\\\\u20e1\\\\u20e5-\\\\u20f0\\\\u2d81-\\\\u2d96\\\\u2de0-\\\\u2dff\\\\u3021-\\\\u3028\\\\u3099\\\\u309a\\\\ua640-\\\\ua66d\\\\ua674-\\\\ua67d\\\\ua69f\\\\ua6f0-\\\\ua6f1\\\\ua7f8-\\\\ua800\\\\ua806\\\\ua80b\\\\ua823-\\\\ua827\\\\ua880-\\\\ua881\\\\ua8b4-\\\\ua8c4\\\\ua8d0-\\\\ua8d9\\\\ua8f3-\\\\ua8f7\\\\ua900-\\\\ua909\\\\ua926-\\\\ua92d\\\\ua930-\\\\ua945\\\\ua980-\\\\ua983\\\\ua9b3-\\\\ua9c0\\\\uaa00-\\\\uaa27\\\\uaa40-\\\\uaa41\\\\uaa4c-\\\\uaa4d\\\\uaa50-\\\\uaa59\\\\uaa7b\\\\uaae0-\\\\uaae9\\\\uaaf2-\\\\uaaf3\\\\uabc0-\\\\uabe1\\\\uabec\\\\uabed\\\\uabf0-\\\\uabf9\\\\ufb20-\\\\ufb28\\\\ufe00-\\\\ufe0f\\\\ufe20-\\\\ufe26\\\\ufe33\\\\ufe34\\\\ufe4d-\\\\ufe4f\\\\uff10-\\\\uff19\\\\uff3f\";\n//var nonASCIIidentifierStart = new RegExp(\"[\" + nonASCIIidentifierStartChars + \"]\");\n//var nonASCIIidentifier = new RegExp(\"[\" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + \"]\");\n\nvar identifierStart = \"(?:\\\\\\\\u[0-9a-fA-F]{4}|[\" + baseASCIIidentifierStartChars + nonASCIIidentifierStartChars + \"])\";\nvar identifierChars = \"(?:\\\\\\\\u[0-9a-fA-F]{4}|[\" + baseASCIIidentifierChars + nonASCIIidentifierStartChars + nonASCIIidentifierChars + \"])*\";\n\nexports.identifier = new RegExp(identifierStart + identifierChars, 'g');\nexports.identifierStart = new RegExp(identifierStart);\nexports.identifierMatch = new RegExp(\"(?:\\\\\\\\u[0-9a-fA-F]{4}|[\" + baseASCIIidentifierChars + nonASCIIidentifierStartChars + nonASCIIidentifierChars + \"])+\");\n\nvar nonASCIIwhitespace = /[\\u1680\\u180e\\u2000-\\u200a\\u202f\\u205f\\u3000\\ufeff]/; // jshint ignore:line\n\n// Whether a single character denotes a newline.\n\nexports.newline = /[\\n\\r\\u2028\\u2029]/;\n\n// Matches a whole line break (where CRLF is considered a single\n// line break). Used to count lines.\n\n// in javascript, these two differ\n// in python they are the same, different methods are called on them\nexports.lineBreak = new RegExp('\\r\\n|' + exports.newline.source);\nexports.allLineBreaks = new RegExp(exports.lineBreak.source, 'g');\n", "/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nfunction Options(options, merge_child_field) {\n this.raw_options = _mergeOpts(options, merge_child_field);\n\n // Support passing the source text back with no change\n this.disabled = this._get_boolean('disabled');\n\n this.eol = this._get_characters('eol', 'auto');\n this.end_with_newline = this._get_boolean('end_with_newline');\n this.indent_size = this._get_number('indent_size', 4);\n this.indent_char = this._get_characters('indent_char', ' ');\n this.indent_level = this._get_number('indent_level');\n\n this.preserve_newlines = this._get_boolean('preserve_newlines', true);\n this.max_preserve_newlines = this._get_number('max_preserve_newlines', 32786);\n if (!this.preserve_newlines) {\n this.max_preserve_newlines = 0;\n }\n\n this.indent_with_tabs = this._get_boolean('indent_with_tabs', this.indent_char === '\\t');\n if (this.indent_with_tabs) {\n this.indent_char = '\\t';\n\n // indent_size behavior changed after 1.8.6\n // It used to be that indent_size would be\n // set to 1 for indent_with_tabs. That is no longer needed and\n // actually doesn't make sense - why not use spaces? Further,\n // that might produce unexpected behavior - tabs being used\n // for single-column alignment. So, when indent_with_tabs is true\n // and indent_size is 1, reset indent_size to 4.\n if (this.indent_size === 1) {\n this.indent_size = 4;\n }\n }\n\n // Backwards compat with 1.3.x\n this.wrap_line_length = this._get_number('wrap_line_length', this._get_number('max_char'));\n\n this.indent_empty_lines = this._get_boolean('indent_empty_lines');\n\n // valid templating languages ['django', 'erb', 'handlebars', 'php', 'smarty']\n // For now, 'auto' = all off for javascript, all on for html (and inline javascript).\n // other values ignored\n this.templating = this._get_selection_list('templating', ['auto', 'none', 'django', 'erb', 'handlebars', 'php', 'smarty'], ['auto']);\n}\n\nOptions.prototype._get_array = function(name, default_value) {\n var option_value = this.raw_options[name];\n var result = default_value || [];\n if (typeof option_value === 'object') {\n if (option_value !== null && typeof option_value.concat === 'function') {\n result = option_value.concat();\n }\n } else if (typeof option_value === 'string') {\n result = option_value.split(/[^a-zA-Z0-9_\\/\\-]+/);\n }\n return result;\n};\n\nOptions.prototype._get_boolean = function(name, default_value) {\n var option_value = this.raw_options[name];\n var result = option_value === undefined ? !!default_value : !!option_value;\n return result;\n};\n\nOptions.prototype._get_characters = function(name, default_value) {\n var option_value = this.raw_options[name];\n var result = default_value || '';\n if (typeof option_value === 'string') {\n result = option_value.replace(/\\\\r/, '\\r').replace(/\\\\n/, '\\n').replace(/\\\\t/, '\\t');\n }\n return result;\n};\n\nOptions.prototype._get_number = function(name, default_value) {\n var option_value = this.raw_options[name];\n default_value = parseInt(default_value, 10);\n if (isNaN(default_value)) {\n default_value = 0;\n }\n var result = parseInt(option_value, 10);\n if (isNaN(result)) {\n result = default_value;\n }\n return result;\n};\n\nOptions.prototype._get_selection = function(name, selection_list, default_value) {\n var result = this._get_selection_list(name, selection_list, default_value);\n if (result.length !== 1) {\n throw new Error(\n \"Invalid Option Value: The option '\" + name + \"' can only be one of the following values:\\n\" +\n selection_list + \"\\nYou passed in: '\" + this.raw_options[name] + \"'\");\n }\n\n return result[0];\n};\n\n\nOptions.prototype._get_selection_list = function(name, selection_list, default_value) {\n if (!selection_list || selection_list.length === 0) {\n throw new Error(\"Selection list cannot be empty.\");\n }\n\n default_value = default_value || [selection_list[0]];\n if (!this._is_valid_selection(default_value, selection_list)) {\n throw new Error(\"Invalid Default Value!\");\n }\n\n var result = this._get_array(name, default_value);\n if (!this._is_valid_selection(result, selection_list)) {\n throw new Error(\n \"Invalid Option Value: The option '\" + name + \"' can contain only the following values:\\n\" +\n selection_list + \"\\nYou passed in: '\" + this.raw_options[name] + \"'\");\n }\n\n return result;\n};\n\nOptions.prototype._is_valid_selection = function(result, selection_list) {\n return result.length && selection_list.length &&\n !result.some(function(item) { return selection_list.indexOf(item) === -1; });\n};\n\n\n// merges child options up with the parent options object\n// Example: obj = {a: 1, b: {a: 2}}\n// mergeOpts(obj, 'b')\n//\n// Returns: {a: 2}\nfunction _mergeOpts(allOptions, childFieldName) {\n var finalOpts = {};\n allOptions = _normalizeOpts(allOptions);\n var name;\n\n for (name in allOptions) {\n if (name !== childFieldName) {\n finalOpts[name] = allOptions[name];\n }\n }\n\n //merge in the per type settings for the childFieldName\n if (childFieldName && allOptions[childFieldName]) {\n for (name in allOptions[childFieldName]) {\n finalOpts[name] = allOptions[childFieldName][name];\n }\n }\n return finalOpts;\n}\n\nfunction _normalizeOpts(options) {\n var convertedOpts = {};\n var key;\n\n for (key in options) {\n var newKey = key.replace(/-/g, \"_\");\n convertedOpts[newKey] = options[key];\n }\n return convertedOpts;\n}\n\nmodule.exports.Options = Options;\nmodule.exports.normalizeOpts = _normalizeOpts;\nmodule.exports.mergeOpts = _mergeOpts;\n", "/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nvar BaseOptions = require('../core/options').Options;\n\nvar validPositionValues = ['before-newline', 'after-newline', 'preserve-newline'];\n\nfunction Options(options) {\n BaseOptions.call(this, options, 'js');\n\n // compatibility, re\n var raw_brace_style = this.raw_options.brace_style || null;\n if (raw_brace_style === \"expand-strict\") { //graceful handling of deprecated option\n this.raw_options.brace_style = \"expand\";\n } else if (raw_brace_style === \"collapse-preserve-inline\") { //graceful handling of deprecated option\n this.raw_options.brace_style = \"collapse,preserve-inline\";\n } else if (this.raw_options.braces_on_own_line !== undefined) { //graceful handling of deprecated option\n this.raw_options.brace_style = this.raw_options.braces_on_own_line ? \"expand\" : \"collapse\";\n // } else if (!raw_brace_style) { //Nothing exists to set it\n // raw_brace_style = \"collapse\";\n }\n\n //preserve-inline in delimited string will trigger brace_preserve_inline, everything\n //else is considered a brace_style and the last one only will have an effect\n\n var brace_style_split = this._get_selection_list('brace_style', ['collapse', 'expand', 'end-expand', 'none', 'preserve-inline']);\n\n this.brace_preserve_inline = false; //Defaults in case one or other was not specified in meta-option\n this.brace_style = \"collapse\";\n\n for (var bs = 0; bs < brace_style_split.length; bs++) {\n if (brace_style_split[bs] === \"preserve-inline\") {\n this.brace_preserve_inline = true;\n } else {\n this.brace_style = brace_style_split[bs];\n }\n }\n\n this.unindent_chained_methods = this._get_boolean('unindent_chained_methods');\n this.break_chained_methods = this._get_boolean('break_chained_methods');\n this.space_in_paren = this._get_boolean('space_in_paren');\n this.space_in_empty_paren = this._get_boolean('space_in_empty_paren');\n this.jslint_happy = this._get_boolean('jslint_happy');\n this.space_after_anon_function = this._get_boolean('space_after_anon_function');\n this.space_after_named_function = this._get_boolean('space_after_named_function');\n this.keep_array_indentation = this._get_boolean('keep_array_indentation');\n this.space_before_conditional = this._get_boolean('space_before_conditional', true);\n this.unescape_strings = this._get_boolean('unescape_strings');\n this.e4x = this._get_boolean('e4x');\n this.comma_first = this._get_boolean('comma_first');\n this.operator_position = this._get_selection('operator_position', validPositionValues);\n\n // For testing of beautify preserve:start directive\n this.test_output_raw = this._get_boolean('test_output_raw');\n\n // force this._options.space_after_anon_function to true if this._options.jslint_happy\n if (this.jslint_happy) {\n this.space_after_anon_function = true;\n }\n\n}\nOptions.prototype = new BaseOptions();\n\n\n\nmodule.exports.Options = Options;\n", "/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nvar regexp_has_sticky = RegExp.prototype.hasOwnProperty('sticky');\n\nfunction InputScanner(input_string) {\n this.__input = input_string || '';\n this.__input_length = this.__input.length;\n this.__position = 0;\n}\n\nInputScanner.prototype.restart = function() {\n this.__position = 0;\n};\n\nInputScanner.prototype.back = function() {\n if (this.__position > 0) {\n this.__position -= 1;\n }\n};\n\nInputScanner.prototype.hasNext = function() {\n return this.__position < this.__input_length;\n};\n\nInputScanner.prototype.next = function() {\n var val = null;\n if (this.hasNext()) {\n val = this.__input.charAt(this.__position);\n this.__position += 1;\n }\n return val;\n};\n\nInputScanner.prototype.peek = function(index) {\n var val = null;\n index = index || 0;\n index += this.__position;\n if (index >= 0 && index < this.__input_length) {\n val = this.__input.charAt(index);\n }\n return val;\n};\n\n// This is a JavaScript only helper function (not in python)\n// Javascript doesn't have a match method\n// and not all implementation support \"sticky\" flag.\n// If they do not support sticky then both this.match() and this.test() method\n// must get the match and check the index of the match.\n// If sticky is supported and set, this method will use it.\n// Otherwise it will check that global is set, and fall back to the slower method.\nInputScanner.prototype.__match = function(pattern, index) {\n pattern.lastIndex = index;\n var pattern_match = pattern.exec(this.__input);\n\n if (pattern_match && !(regexp_has_sticky && pattern.sticky)) {\n if (pattern_match.index !== index) {\n pattern_match = null;\n }\n }\n\n return pattern_match;\n};\n\nInputScanner.prototype.test = function(pattern, index) {\n index = index || 0;\n index += this.__position;\n\n if (index >= 0 && index < this.__input_length) {\n return !!this.__match(pattern, index);\n } else {\n return false;\n }\n};\n\nInputScanner.prototype.testChar = function(pattern, index) {\n // test one character regex match\n var val = this.peek(index);\n pattern.lastIndex = 0;\n return val !== null && pattern.test(val);\n};\n\nInputScanner.prototype.match = function(pattern) {\n var pattern_match = this.__match(pattern, this.__position);\n if (pattern_match) {\n this.__position += pattern_match[0].length;\n } else {\n pattern_match = null;\n }\n return pattern_match;\n};\n\nInputScanner.prototype.read = function(starting_pattern, until_pattern, until_after) {\n var val = '';\n var match;\n if (starting_pattern) {\n match = this.match(starting_pattern);\n if (match) {\n val += match[0];\n }\n }\n if (until_pattern && (match || !starting_pattern)) {\n val += this.readUntil(until_pattern, until_after);\n }\n return val;\n};\n\nInputScanner.prototype.readUntil = function(pattern, until_after) {\n var val = '';\n var match_index = this.__position;\n pattern.lastIndex = this.__position;\n var pattern_match = pattern.exec(this.__input);\n if (pattern_match) {\n match_index = pattern_match.index;\n if (until_after) {\n match_index += pattern_match[0].length;\n }\n } else {\n match_index = this.__input_length;\n }\n\n val = this.__input.substring(this.__position, match_index);\n this.__position = match_index;\n return val;\n};\n\nInputScanner.prototype.readUntilAfter = function(pattern) {\n return this.readUntil(pattern, true);\n};\n\nInputScanner.prototype.get_regexp = function(pattern, match_from) {\n var result = null;\n var flags = 'g';\n if (match_from && regexp_has_sticky) {\n flags = 'y';\n }\n // strings are converted to regexp\n if (typeof pattern === \"string\" && pattern !== '') {\n // result = new RegExp(pattern.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'), flags);\n result = new RegExp(pattern, flags);\n } else if (pattern) {\n result = new RegExp(pattern.source, flags);\n }\n return result;\n};\n\nInputScanner.prototype.get_literal_regexp = function(literal_string) {\n return RegExp(literal_string.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'));\n};\n\n/* css beautifier legacy helpers */\nInputScanner.prototype.peekUntilAfter = function(pattern) {\n var start = this.__position;\n var val = this.readUntilAfter(pattern);\n this.__position = start;\n return val;\n};\n\nInputScanner.prototype.lookBack = function(testVal) {\n var start = this.__position - 1;\n return start >= testVal.length && this.__input.substring(start - testVal.length, start)\n .toLowerCase() === testVal;\n};\n\nmodule.exports.InputScanner = InputScanner;\n", "/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nfunction TokenStream(parent_token) {\n // private\n this.__tokens = [];\n this.__tokens_length = this.__tokens.length;\n this.__position = 0;\n this.__parent_token = parent_token;\n}\n\nTokenStream.prototype.restart = function() {\n this.__position = 0;\n};\n\nTokenStream.prototype.isEmpty = function() {\n return this.__tokens_length === 0;\n};\n\nTokenStream.prototype.hasNext = function() {\n return this.__position < this.__tokens_length;\n};\n\nTokenStream.prototype.next = function() {\n var val = null;\n if (this.hasNext()) {\n val = this.__tokens[this.__position];\n this.__position += 1;\n }\n return val;\n};\n\nTokenStream.prototype.peek = function(index) {\n var val = null;\n index = index || 0;\n index += this.__position;\n if (index >= 0 && index < this.__tokens_length) {\n val = this.__tokens[index];\n }\n return val;\n};\n\nTokenStream.prototype.add = function(token) {\n if (this.__parent_token) {\n token.parent = this.__parent_token;\n }\n this.__tokens.push(token);\n this.__tokens_length += 1;\n};\n\nmodule.exports.TokenStream = TokenStream;\n", "/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nfunction Pattern(input_scanner, parent) {\n this._input = input_scanner;\n this._starting_pattern = null;\n this._match_pattern = null;\n this._until_pattern = null;\n this._until_after = false;\n\n if (parent) {\n this._starting_pattern = this._input.get_regexp(parent._starting_pattern, true);\n this._match_pattern = this._input.get_regexp(parent._match_pattern, true);\n this._until_pattern = this._input.get_regexp(parent._until_pattern);\n this._until_after = parent._until_after;\n }\n}\n\nPattern.prototype.read = function() {\n var result = this._input.read(this._starting_pattern);\n if (!this._starting_pattern || result) {\n result += this._input.read(this._match_pattern, this._until_pattern, this._until_after);\n }\n return result;\n};\n\nPattern.prototype.read_match = function() {\n return this._input.match(this._match_pattern);\n};\n\nPattern.prototype.until_after = function(pattern) {\n var result = this._create();\n result._until_after = true;\n result._until_pattern = this._input.get_regexp(pattern);\n result._update();\n return result;\n};\n\nPattern.prototype.until = function(pattern) {\n var result = this._create();\n result._until_after = false;\n result._until_pattern = this._input.get_regexp(pattern);\n result._update();\n return result;\n};\n\nPattern.prototype.starting_with = function(pattern) {\n var result = this._create();\n result._starting_pattern = this._input.get_regexp(pattern, true);\n result._update();\n return result;\n};\n\nPattern.prototype.matching = function(pattern) {\n var result = this._create();\n result._match_pattern = this._input.get_regexp(pattern, true);\n result._update();\n return result;\n};\n\nPattern.prototype._create = function() {\n return new Pattern(this._input, this);\n};\n\nPattern.prototype._update = function() {};\n\nmodule.exports.Pattern = Pattern;\n", "/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nvar Pattern = require('../core/pattern').Pattern;\n\nfunction WhitespacePattern(input_scanner, parent) {\n Pattern.call(this, input_scanner, parent);\n if (parent) {\n this._line_regexp = this._input.get_regexp(parent._line_regexp);\n } else {\n this.__set_whitespace_patterns('', '');\n }\n\n this.newline_count = 0;\n this.whitespace_before_token = '';\n}\nWhitespacePattern.prototype = new Pattern();\n\nWhitespacePattern.prototype.__set_whitespace_patterns = function(whitespace_chars, newline_chars) {\n whitespace_chars += '\\\\t ';\n newline_chars += '\\\\n\\\\r';\n\n this._match_pattern = this._input.get_regexp(\n '[' + whitespace_chars + newline_chars + ']+', true);\n this._newline_regexp = this._input.get_regexp(\n '\\\\r\\\\n|[' + newline_chars + ']');\n};\n\nWhitespacePattern.prototype.read = function() {\n this.newline_count = 0;\n this.whitespace_before_token = '';\n\n var resulting_string = this._input.read(this._match_pattern);\n if (resulting_string === ' ') {\n this.whitespace_before_token = ' ';\n } else if (resulting_string) {\n var matches = this.__split(this._newline_regexp, resulting_string);\n this.newline_count = matches.length - 1;\n this.whitespace_before_token = matches[this.newline_count];\n }\n\n return resulting_string;\n};\n\nWhitespacePattern.prototype.matching = function(whitespace_chars, newline_chars) {\n var result = this._create();\n result.__set_whitespace_patterns(whitespace_chars, newline_chars);\n result._update();\n return result;\n};\n\nWhitespacePattern.prototype._create = function() {\n return new WhitespacePattern(this._input, this);\n};\n\nWhitespacePattern.prototype.__split = function(regexp, input_string) {\n regexp.lastIndex = 0;\n var start_index = 0;\n var result = [];\n var next_match = regexp.exec(input_string);\n while (next_match) {\n result.push(input_string.substring(start_index, next_match.index));\n start_index = next_match.index + next_match[0].length;\n next_match = regexp.exec(input_string);\n }\n\n if (start_index < input_string.length) {\n result.push(input_string.substring(start_index, input_string.length));\n } else {\n result.push('');\n }\n\n return result;\n};\n\n\n\nmodule.exports.WhitespacePattern = WhitespacePattern;\n", "/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nvar InputScanner = require('../core/inputscanner').InputScanner;\nvar Token = require('../core/token').Token;\nvar TokenStream = require('../core/tokenstream').TokenStream;\nvar WhitespacePattern = require('./whitespacepattern').WhitespacePattern;\n\nvar TOKEN = {\n START: 'TK_START',\n RAW: 'TK_RAW',\n EOF: 'TK_EOF'\n};\n\nvar Tokenizer = function(input_string, options) {\n this._input = new InputScanner(input_string);\n this._options = options || {};\n this.__tokens = null;\n\n this._patterns = {};\n this._patterns.whitespace = new WhitespacePattern(this._input);\n};\n\nTokenizer.prototype.tokenize = function() {\n this._input.restart();\n this.__tokens = new TokenStream();\n\n this._reset();\n\n var current;\n var previous = new Token(TOKEN.START, '');\n var open_token = null;\n var open_stack = [];\n var comments = new TokenStream();\n\n while (previous.type !== TOKEN.EOF) {\n current = this._get_next_token(previous, open_token);\n while (this._is_comment(current)) {\n comments.add(current);\n current = this._get_next_token(previous, open_token);\n }\n\n if (!comments.isEmpty()) {\n current.comments_before = comments;\n comments = new TokenStream();\n }\n\n current.parent = open_token;\n\n if (this._is_opening(current)) {\n open_stack.push(open_token);\n open_token = current;\n } else if (open_token && this._is_closing(current, open_token)) {\n current.opened = open_token;\n open_token.closed = current;\n open_token = open_stack.pop();\n current.parent = open_token;\n }\n\n current.previous = previous;\n previous.next = current;\n\n this.__tokens.add(current);\n previous = current;\n }\n\n return this.__tokens;\n};\n\n\nTokenizer.prototype._is_first_token = function() {\n return this.__tokens.isEmpty();\n};\n\nTokenizer.prototype._reset = function() {};\n\nTokenizer.prototype._get_next_token = function(previous_token, open_token) { // jshint unused:false\n this._readWhitespace();\n var resulting_string = this._input.read(/.+/g);\n if (resulting_string) {\n return this._create_token(TOKEN.RAW, resulting_string);\n } else {\n return this._create_token(TOKEN.EOF, '');\n }\n};\n\nTokenizer.prototype._is_comment = function(current_token) { // jshint unused:false\n return false;\n};\n\nTokenizer.prototype._is_opening = function(current_token) { // jshint unused:false\n return false;\n};\n\nTokenizer.prototype._is_closing = function(current_token, open_token) { // jshint unused:false\n return false;\n};\n\nTokenizer.prototype._create_token = function(type, text) {\n var token = new Token(type, text,\n this._patterns.whitespace.newline_count,\n this._patterns.whitespace.whitespace_before_token);\n return token;\n};\n\nTokenizer.prototype._readWhitespace = function() {\n return this._patterns.whitespace.read();\n};\n\n\n\nmodule.exports.Tokenizer = Tokenizer;\nmodule.exports.TOKEN = TOKEN;\n", "/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nfunction Directives(start_block_pattern, end_block_pattern) {\n start_block_pattern = typeof start_block_pattern === 'string' ? start_block_pattern : start_block_pattern.source;\n end_block_pattern = typeof end_block_pattern === 'string' ? end_block_pattern : end_block_pattern.source;\n this.__directives_block_pattern = new RegExp(start_block_pattern + / beautify( \\w+[:]\\w+)+ /.source + end_block_pattern, 'g');\n this.__directive_pattern = / (\\w+)[:](\\w+)/g;\n\n this.__directives_end_ignore_pattern = new RegExp(start_block_pattern + /\\sbeautify\\signore:end\\s/.source + end_block_pattern, 'g');\n}\n\nDirectives.prototype.get_directives = function(text) {\n if (!text.match(this.__directives_block_pattern)) {\n return null;\n }\n\n var directives = {};\n this.__directive_pattern.lastIndex = 0;\n var directive_match = this.__directive_pattern.exec(text);\n\n while (directive_match) {\n directives[directive_match[1]] = directive_match[2];\n directive_match = this.__directive_pattern.exec(text);\n }\n\n return directives;\n};\n\nDirectives.prototype.readIgnored = function(input) {\n return input.readUntilAfter(this.__directives_end_ignore_pattern);\n};\n\n\nmodule.exports.Directives = Directives;\n", "/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nvar Pattern = require('./pattern').Pattern;\n\n\nvar template_names = {\n django: false,\n erb: false,\n handlebars: false,\n php: false,\n smarty: false\n};\n\n// This lets templates appear anywhere we would do a readUntil\n// The cost is higher but it is pay to play.\nfunction TemplatablePattern(input_scanner, parent) {\n Pattern.call(this, input_scanner, parent);\n this.__template_pattern = null;\n this._disabled = Object.assign({}, template_names);\n this._excluded = Object.assign({}, template_names);\n\n if (parent) {\n this.__template_pattern = this._input.get_regexp(parent.__template_pattern);\n this._excluded = Object.assign(this._excluded, parent._excluded);\n this._disabled = Object.assign(this._disabled, parent._disabled);\n }\n var pattern = new Pattern(input_scanner);\n this.__patterns = {\n handlebars_comment: pattern.starting_with(/{{!--/).until_after(/--}}/),\n handlebars_unescaped: pattern.starting_with(/{{{/).until_after(/}}}/),\n handlebars: pattern.starting_with(/{{/).until_after(/}}/),\n php: pattern.starting_with(/<\\?(?:[= ]|php)/).until_after(/\\?>/),\n erb: pattern.starting_with(/<%[^%]/).until_after(/[^%]%>/),\n // django coflicts with handlebars a bit.\n django: pattern.starting_with(/{%/).until_after(/%}/),\n django_value: pattern.starting_with(/{{/).until_after(/}}/),\n django_comment: pattern.starting_with(/{#/).until_after(/#}/),\n smarty: pattern.starting_with(/{(?=[^}{\\s\\n])/).until_after(/[^\\s\\n]}/),\n smarty_comment: pattern.starting_with(/{\\*/).until_after(/\\*}/),\n smarty_literal: pattern.starting_with(/{literal}/).until_after(/{\\/literal}/)\n };\n}\nTemplatablePattern.prototype = new Pattern();\n\nTemplatablePattern.prototype._create = function() {\n return new TemplatablePattern(this._input, this);\n};\n\nTemplatablePattern.prototype._update = function() {\n this.__set_templated_pattern();\n};\n\nTemplatablePattern.prototype.disable = function(language) {\n var result = this._create();\n result._disabled[language] = true;\n result._update();\n return result;\n};\n\nTemplatablePattern.prototype.read_options = function(options) {\n var result = this._create();\n for (var language in template_names) {\n result._disabled[language] = options.templating.indexOf(language) === -1;\n }\n result._update();\n return result;\n};\n\nTemplatablePattern.prototype.exclude = function(language) {\n var result = this._create();\n result._excluded[language] = true;\n result._update();\n return result;\n};\n\nTemplatablePattern.prototype.read = function() {\n var result = '';\n if (this._match_pattern) {\n result = this._input.read(this._starting_pattern);\n } else {\n result = this._input.read(this._starting_pattern, this.__template_pattern);\n }\n var next = this._read_template();\n while (next) {\n if (this._match_pattern) {\n next += this._input.read(this._match_pattern);\n } else {\n next += this._input.readUntil(this.__template_pattern);\n }\n result += next;\n next = this._read_template();\n }\n\n if (this._until_after) {\n result += this._input.readUntilAfter(this._until_pattern);\n }\n return result;\n};\n\nTemplatablePattern.prototype.__set_templated_pattern = function() {\n var items = [];\n\n if (!this._disabled.php) {\n items.push(this.__patterns.php._starting_pattern.source);\n }\n if (!this._disabled.handlebars) {\n items.push(this.__patterns.handlebars._starting_pattern.source);\n }\n if (!this._disabled.erb) {\n items.push(this.__patterns.erb._starting_pattern.source);\n }\n if (!this._disabled.django) {\n items.push(this.__patterns.django._starting_pattern.source);\n // The starting pattern for django is more complex because it has different\n // patterns for value, comment, and other sections\n items.push(this.__patterns.django_value._starting_pattern.source);\n items.push(this.__patterns.django_comment._starting_pattern.source);\n }\n if (!this._disabled.smarty) {\n items.push(this.__patterns.smarty._starting_pattern.source);\n }\n\n if (this._until_pattern) {\n items.push(this._until_pattern.source);\n }\n this.__template_pattern = this._input.get_regexp('(?:' + items.join('|') + ')');\n};\n\nTemplatablePattern.prototype._read_template = function() {\n var resulting_string = '';\n var c = this._input.peek();\n if (c === '<') {\n var peek1 = this._input.peek(1);\n //if we're in a comment, do something special\n // We treat all comments as literals, even more than preformatted tags\n // we just look for the appropriate close tag\n if (!this._disabled.php && !this._excluded.php && peek1 === '?') {\n resulting_string = resulting_string ||\n this.__patterns.php.read();\n }\n if (!this._disabled.erb && !this._excluded.erb && peek1 === '%') {\n resulting_string = resulting_string ||\n this.__patterns.erb.read();\n }\n } else if (c === '{') {\n if (!this._disabled.handlebars && !this._excluded.handlebars) {\n resulting_string = resulting_string ||\n this.__patterns.handlebars_comment.read();\n resulting_string = resulting_string ||\n this.__patterns.handlebars_unescaped.read();\n resulting_string = resulting_string ||\n this.__patterns.handlebars.read();\n }\n if (!this._disabled.django) {\n // django coflicts with handlebars a bit.\n if (!this._excluded.django && !this._excluded.handlebars) {\n resulting_string = resulting_string ||\n this.__patterns.django_value.read();\n }\n if (!this._excluded.django) {\n resulting_string = resulting_string ||\n this.__patterns.django_comment.read();\n resulting_string = resulting_string ||\n this.__patterns.django.read();\n }\n }\n if (!this._disabled.smarty) {\n // smarty cannot be enabled with django or handlebars enabled\n if (this._disabled.django && this._disabled.handlebars) {\n resulting_string = resulting_string ||\n this.__patterns.smarty_comment.read();\n resulting_string = resulting_string ||\n this.__patterns.smarty_literal.read();\n resulting_string = resulting_string ||\n this.__patterns.smarty.read();\n }\n }\n }\n return resulting_string;\n};\n\n\nmodule.exports.TemplatablePattern = TemplatablePattern;\n", "/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nvar InputScanner = require('../core/inputscanner').InputScanner;\nvar BaseTokenizer = require('../core/tokenizer').Tokenizer;\nvar BASETOKEN = require('../core/tokenizer').TOKEN;\nvar Directives = require('../core/directives').Directives;\nvar acorn = require('./acorn');\nvar Pattern = require('../core/pattern').Pattern;\nvar TemplatablePattern = require('../core/templatablepattern').TemplatablePattern;\n\n\nfunction in_array(what, arr) {\n return arr.indexOf(what) !== -1;\n}\n\n\nvar TOKEN = {\n START_EXPR: 'TK_START_EXPR',\n END_EXPR: 'TK_END_EXPR',\n START_BLOCK: 'TK_START_BLOCK',\n END_BLOCK: 'TK_END_BLOCK',\n WORD: 'TK_WORD',\n RESERVED: 'TK_RESERVED',\n SEMICOLON: 'TK_SEMICOLON',\n STRING: 'TK_STRING',\n EQUALS: 'TK_EQUALS',\n OPERATOR: 'TK_OPERATOR',\n COMMA: 'TK_COMMA',\n BLOCK_COMMENT: 'TK_BLOCK_COMMENT',\n COMMENT: 'TK_COMMENT',\n DOT: 'TK_DOT',\n UNKNOWN: 'TK_UNKNOWN',\n START: BASETOKEN.START,\n RAW: BASETOKEN.RAW,\n EOF: BASETOKEN.EOF\n};\n\n\nvar directives_core = new Directives(/\\/\\*/, /\\*\\//);\n\nvar number_pattern = /0[xX][0123456789abcdefABCDEF_]*n?|0[oO][01234567_]*n?|0[bB][01_]*n?|\\d[\\d_]*n|(?:\\.\\d[\\d_]*|\\d[\\d_]*\\.?[\\d_]*)(?:[eE][+-]?[\\d_]+)?/;\n\nvar digit = /[0-9]/;\n\n// Dot \".\" must be distinguished from \"...\" and decimal\nvar dot_pattern = /[^\\d\\.]/;\n\nvar positionable_operators = (\n \">>> === !== &&= ??= ||= \" +\n \"<< && >= ** != == <= >> || ?? |> \" +\n \"< / - + > : & % ? ^ | *\").split(' ');\n\n// IMPORTANT: this must be sorted longest to shortest or tokenizing many not work.\n// Also, you must update possitionable operators separately from punct\nvar punct =\n \">>>= \" +\n \"... >>= <<= === >>> !== **= &&= ??= ||= \" +\n \"=> ^= :: /= << <= == && -= >= >> != -- += ** || ?? ++ %= &= *= |= |> \" +\n \"= ! ? > < : / ^ - + * & % ~ |\";\n\npunct = punct.replace(/[-[\\]{}()*+?.,\\\\^$|#]/g, \"\\\\$&\");\n// ?. but not if followed by a number \npunct = '\\\\?\\\\.(?!\\\\d) ' + punct;\npunct = punct.replace(/ /g, '|');\n\nvar punct_pattern = new RegExp(punct);\n\n// words which should always start on new line.\nvar line_starters = 'continue,try,throw,return,var,let,const,if,switch,case,default,for,while,break,function,import,export'.split(',');\nvar reserved_words = line_starters.concat(['do', 'in', 'of', 'else', 'get', 'set', 'new', 'catch', 'finally', 'typeof', 'yield', 'async', 'await', 'from', 'as', 'class', 'extends']);\nvar reserved_word_pattern = new RegExp('^(?:' + reserved_words.join('|') + ')$');\n\n// var template_pattern = /(?:(?:<\\?php|<\\?=)[\\s\\S]*?\\?>)|(?:<%[\\s\\S]*?%>)/g;\n\nvar in_html_comment;\n\nvar Tokenizer = function(input_string, options) {\n BaseTokenizer.call(this, input_string, options);\n\n this._patterns.whitespace = this._patterns.whitespace.matching(\n /\\u00A0\\u1680\\u180e\\u2000-\\u200a\\u202f\\u205f\\u3000\\ufeff/.source,\n /\\u2028\\u2029/.source);\n\n var pattern_reader = new Pattern(this._input);\n var templatable = new TemplatablePattern(this._input)\n .read_options(this._options);\n\n this.__patterns = {\n template: templatable,\n identifier: templatable.starting_with(acorn.identifier).matching(acorn.identifierMatch),\n number: pattern_reader.matching(number_pattern),\n punct: pattern_reader.matching(punct_pattern),\n // comment ends just before nearest linefeed or end of file\n comment: pattern_reader.starting_with(/\\/\\//).until(/[\\n\\r\\u2028\\u2029]/),\n // /* ... */ comment ends with nearest */ or end of file\n block_comment: pattern_reader.starting_with(/\\/\\*/).until_after(/\\*\\//),\n html_comment_start: pattern_reader.matching(/<!--/),\n html_comment_end: pattern_reader.matching(/-->/),\n include: pattern_reader.starting_with(/#include/).until_after(acorn.lineBreak),\n shebang: pattern_reader.starting_with(/#!/).until_after(acorn.lineBreak),\n xml: pattern_reader.matching(/[\\s\\S]*?<(\\/?)([-a-zA-Z:0-9_.]+|{[^}]+?}|!\\[CDATA\\[[^\\]]*?\\]\\]|)(\\s*{[^}]+?}|\\s+[-a-zA-Z:0-9_.]+|\\s+[-a-zA-Z:0-9_.]+\\s*=\\s*('[^']*'|\"[^\"]*\"|{([^{}]|{[^}]+?})+?}))*\\s*(\\/?)\\s*>/),\n single_quote: templatable.until(/['\\\\\\n\\r\\u2028\\u2029]/),\n double_quote: templatable.until(/[\"\\\\\\n\\r\\u2028\\u2029]/),\n template_text: templatable.until(/[`\\\\$]/),\n template_expression: templatable.until(/[`}\\\\]/)\n };\n\n};\nTokenizer.prototype = new BaseTokenizer();\n\nTokenizer.prototype._is_comment = function(current_token) {\n return current_token.type === TOKEN.COMMENT || current_token.type === TOKEN.BLOCK_COMMENT || current_token.type === TOKEN.UNKNOWN;\n};\n\nTokenizer.prototype._is_opening = function(current_token) {\n return current_token.type === TOKEN.START_BLOCK || current_token.type === TOKEN.START_EXPR;\n};\n\nTokenizer.prototype._is_closing = function(current_token, open_token) {\n return (current_token.type === TOKEN.END_BLOCK || current_token.type === TOKEN.END_EXPR) &&\n (open_token && (\n (current_token.text === ']' && open_token.text === '[') ||\n (current_token.text === ')' && open_token.text === '(') ||\n (current_token.text === '}' && open_token.text === '{')));\n};\n\nTokenizer.prototype._reset = function() {\n in_html_comment = false;\n};\n\nTokenizer.prototype._get_next_token = function(previous_token, open_token) { // jshint unused:false\n var token = null;\n this._readWhitespace();\n var c = this._input.peek();\n\n if (c === null) {\n return this._create_token(TOKEN.EOF, '');\n }\n\n token = token || this._read_non_javascript(c);\n token = token || this._read_string(c);\n token = token || this._read_word(previous_token);\n token = token || this._read_singles(c);\n token = token || this._read_comment(c);\n token = token || this._read_regexp(c, previous_token);\n token = token || this._read_xml(c, previous_token);\n token = token || this._read_punctuation();\n token = token || this._create_token(TOKEN.UNKNOWN, this._input.next());\n\n return token;\n};\n\nTokenizer.prototype._read_word = function(previous_token) {\n var resulting_string;\n resulting_string = this.__patterns.identifier.read();\n if (resulting_string !== '') {\n resulting_string = resulting_string.replace(acorn.allLineBreaks, '\\n');\n if (!(previous_token.type === TOKEN.DOT ||\n (previous_token.type === TOKEN.RESERVED && (previous_token.text === 'set' || previous_token.text === 'get'))) &&\n reserved_word_pattern.test(resulting_string)) {\n if ((resulting_string === 'in' || resulting_string === 'of') &&\n (previous_token.type === TOKEN.WORD || previous_token.type === TOKEN.STRING)) { // hack for 'in' and 'of' operators\n return this._create_token(TOKEN.OPERATOR, resulting_string);\n }\n return this._create_token(TOKEN.RESERVED, resulting_string);\n }\n return this._create_token(TOKEN.WORD, resulting_string);\n }\n\n resulting_string = this.__patterns.number.read();\n if (resulting_string !== '') {\n return this._create_token(TOKEN.WORD, resulting_string);\n }\n};\n\nTokenizer.prototype._read_singles = function(c) {\n var token = null;\n if (c === '(' || c === '[') {\n token = this._create_token(TOKEN.START_EXPR, c);\n } else if (c === ')' || c === ']') {\n token = this._create_token(TOKEN.END_EXPR, c);\n } else if (c === '{') {\n token = this._create_token(TOKEN.START_BLOCK, c);\n } else if (c === '}') {\n token = this._create_token(TOKEN.END_BLOCK, c);\n } else if (c === ';') {\n token = this._create_token(TOKEN.SEMICOLON, c);\n } else if (c === '.' && dot_pattern.test(this._input.peek(1))) {\n token = this._create_token(TOKEN.DOT, c);\n } else if (c === ',') {\n token = this._create_token(TOKEN.COMMA, c);\n }\n\n if (token) {\n this._input.next();\n }\n return token;\n};\n\nTokenizer.prototype._read_punctuation = function() {\n var resulting_string = this.__patterns.punct.read();\n\n if (resulting_string !== '') {\n if (resulting_string === '=') {\n return this._create_token(TOKEN.EQUALS, resulting_string);\n } else if (resulting_string === '?.') {\n return this._create_token(TOKEN.DOT, resulting_string);\n } else {\n return this._create_token(TOKEN.OPERATOR, resulting_string);\n }\n }\n};\n\nTokenizer.prototype._read_non_javascript = function(c) {\n var resulting_string = '';\n\n if (c === '#') {\n if (this._is_first_token()) {\n resulting_string = this.__patterns.shebang.read();\n\n if (resulting_string) {\n return this._create_token(TOKEN.UNKNOWN, resulting_string.trim() + '\\n');\n }\n }\n\n // handles extendscript #includes\n resulting_string = this.__patterns.include.read();\n\n if (resulting_string) {\n return this._create_token(TOKEN.UNKNOWN, resulting_string.trim() + '\\n');\n }\n\n c = this._input.next();\n\n // Spidermonkey-specific sharp variables for circular references. Considered obsolete.\n var sharp = '#';\n if (this._input.hasNext() && this._input.testChar(digit)) {\n do {\n c = this._input.next();\n sharp += c;\n } while (this._input.hasNext() && c !== '#' && c !== '=');\n if (c === '#') {\n //\n } else if (this._input.peek() === '[' && this._input.peek(1) === ']') {\n sharp += '[]';\n this._input.next();\n this._input.next();\n } else if (this._input.peek() === '{' && this._input.peek(1) === '}') {\n sharp += '{}';\n this._input.next();\n this._input.next();\n }\n return this._create_token(TOKEN.WORD, sharp);\n }\n\n this._input.back();\n\n } else if (c === '<' && this._is_first_token()) {\n resulting_string = this.__patterns.html_comment_start.read();\n if (resulting_string) {\n while (this._input.hasNext() && !this._input.testChar(acorn.newline)) {\n resulting_string += this._input.next();\n }\n in_html_comment = true;\n return this._create_token(TOKEN.COMMENT, resulting_string);\n }\n } else if (in_html_comment && c === '-') {\n resulting_string = this.__patterns.html_comment_end.read();\n if (resulting_string) {\n in_html_comment = false;\n return this._create_token(TOKEN.COMMENT, resulting_string);\n }\n }\n\n return null;\n};\n\nTokenizer.prototype._read_comment = function(c) {\n var token = null;\n if (c === '/') {\n var comment = '';\n if (this._input.peek(1) === '*') {\n // peek for comment /* ... */\n comment = this.__patterns.block_comment.read();\n var directives = directives_core.get_directives(comment);\n if (directives && directives.ignore === 'start') {\n comment += directives_core.readIgnored(this._input);\n }\n comment = comment.replace(acorn.allLineBreaks, '\\n');\n token = this._create_token(TOKEN.BLOCK_COMMENT, comment);\n token.directives = directives;\n } else if (this._input.peek(1) === '/') {\n // peek for comment // ...\n comment = this.__patterns.comment.read();\n token = this._create_token(TOKEN.COMMENT, comment);\n }\n }\n return token;\n};\n\nTokenizer.prototype._read_string = function(c) {\n if (c === '`' || c === \"'\" || c === '\"') {\n var resulting_string = this._input.next();\n this.has_char_escapes = false;\n\n if (c === '`') {\n resulting_string += this._read_string_recursive('`', true, '${');\n } else {\n resulting_string += this._read_string_recursive(c);\n }\n\n if (this.has_char_escapes && this._options.unescape_strings) {\n resulting_string = unescape_string(resulting_string);\n }\n\n if (this._input.peek() === c) {\n resulting_string += this._input.next();\n }\n\n resulting_string = resulting_string.replace(acorn.allLineBreaks, '\\n');\n\n return this._create_token(TOKEN.STRING, resulting_string);\n }\n\n return null;\n};\n\nTokenizer.prototype._allow_regexp_or_xml = function(previous_token) {\n // regex and xml can only appear in specific locations during parsing\n return (previous_token.type === TOKEN.RESERVED && in_array(previous_token.text, ['return', 'case', 'throw', 'else', 'do', 'typeof', 'yield'])) ||\n (previous_token.type === TOKEN.END_EXPR && previous_token.text === ')' &&\n previous_token.opened.previous.type === TOKEN.RESERVED && in_array(previous_token.opened.previous.text, ['if', 'while', 'for'])) ||\n (in_array(previous_token.type, [TOKEN.COMMENT, TOKEN.START_EXPR, TOKEN.START_BLOCK, TOKEN.START,\n TOKEN.END_BLOCK, TOKEN.OPERATOR, TOKEN.EQUALS, TOKEN.EOF, TOKEN.SEMICOLON, TOKEN.COMMA\n ]));\n};\n\nTokenizer.prototype._read_regexp = function(c, previous_token) {\n\n if (c === '/' && this._allow_regexp_or_xml(previous_token)) {\n // handle regexp\n //\n var resulting_string = this._input.next();\n var esc = false;\n\n var in_char_class = false;\n while (this._input.hasNext() &&\n ((esc || in_char_class || this._input.peek() !== c) &&\n !this._input.testChar(acorn.newline))) {\n resulting_string += this._input.peek();\n if (!esc) {\n esc = this._input.peek() === '\\\\';\n if (this._input.peek() === '[') {\n in_char_class = true;\n } else if (this._input.peek() === ']') {\n in_char_class = false;\n }\n } else {\n esc = false;\n }\n this._input.next();\n }\n\n if (this._input.peek() === c) {\n resulting_string += this._input.next();\n\n // regexps may have modifiers /regexp/MOD , so fetch those, too\n // Only [gim] are valid, but if the user puts in garbage, do what we can to take it.\n resulting_string += this._input.read(acorn.identifier);\n }\n return this._create_token(TOKEN.STRING, resulting_string);\n }\n return null;\n};\n\nTokenizer.prototype._read_xml = function(c, previous_token) {\n\n if (this._options.e4x && c === \"<\" && this._allow_regexp_or_xml(previous_token)) {\n var xmlStr = '';\n var match = this.__patterns.xml.read_match();\n // handle e4x xml literals\n //\n if (match) {\n // Trim root tag to attempt to\n var rootTag = match[2].replace(/^{\\s+/, '{').replace(/\\s+}$/, '}');\n var isCurlyRoot = rootTag.indexOf('{') === 0;\n var depth = 0;\n while (match) {\n var isEndTag = !!match[1];\n var tagName = match[2];\n var isSingletonTag = (!!match[match.length - 1]) || (tagName.slice(0, 8) === \"![CDATA[\");\n if (!isSingletonTag &&\n (tagName === rootTag || (isCurlyRoot && tagName.replace(/^{\\s+/, '{').replace(/\\s+}$/, '}')))) {\n if (isEndTag) {\n --depth;\n } else {\n ++depth;\n }\n }\n xmlStr += match[0];\n if (depth <= 0) {\n break;\n }\n match = this.__patterns.xml.read_match();\n }\n // if we didn't close correctly, keep unformatted.\n if (!match) {\n xmlStr += this._input.match(/[\\s\\S]*/g)[0];\n }\n xmlStr = xmlStr.replace(acorn.allLineBreaks, '\\n');\n return this._create_token(TOKEN.STRING, xmlStr);\n }\n }\n\n return null;\n};\n\nfunction unescape_string(s) {\n // You think that a regex would work for this\n // return s.replace(/\\\\x([0-9a-f]{2})/gi, function(match, val) {\n // return String.fromCharCode(parseInt(val, 16));\n // })\n // However, dealing with '\\xff', '\\\\xff', '\\\\\\xff' makes this more fun.\n var out = '',\n escaped = 0;\n\n var input_scan = new InputScanner(s);\n var matched = null;\n\n while (input_scan.hasNext()) {\n // Keep any whitespace, non-slash characters\n // also keep slash pairs.\n matched = input_scan.match(/([\\s]|[^\\\\]|\\\\\\\\)+/g);\n\n if (matched) {\n out += matched[0];\n }\n\n if (input_scan.peek() === '\\\\') {\n input_scan.next();\n if (input_scan.peek() === 'x') {\n matched = input_scan.match(/x([0-9A-Fa-f]{2})/g);\n } else if (input_scan.peek() === 'u') {\n matched = input_scan.match(/u([0-9A-Fa-f]{4})/g);\n } else {\n out += '\\\\';\n if (input_scan.hasNext()) {\n out += input_scan.next();\n }\n continue;\n }\n\n // If there's some error decoding, return the original string\n if (!matched) {\n return s;\n }\n\n escaped = parseInt(matched[1], 16);\n\n if (escaped > 0x7e && escaped <= 0xff && matched[0].indexOf('x') === 0) {\n // we bail out on \\x7f..\\xff,\n // leaving whole string escaped,\n // as it's probably completely binary\n return s;\n } else if (escaped >= 0x00 && escaped < 0x20) {\n // leave 0x00...0x1f escaped\n out += '\\\\' + matched[0];\n continue;\n } else if (escaped === 0x22 || escaped === 0x27 || escaped === 0x5c) {\n // single-quote, apostrophe, backslash - escape these\n out += '\\\\' + String.fromCharCode(escaped);\n } else {\n out += String.fromCharCode(escaped);\n }\n }\n }\n\n return out;\n}\n\n// handle string\n//\nTokenizer.prototype._read_string_recursive = function(delimiter, allow_unescaped_newlines, start_sub) {\n var current_char;\n var pattern;\n if (delimiter === '\\'') {\n pattern = this.__patterns.single_quote;\n } else if (delimiter === '\"') {\n pattern = this.__patterns.double_quote;\n } else if (delimiter === '`') {\n pattern = this.__patterns.template_text;\n } else if (delimiter === '}') {\n pattern = this.__patterns.template_expression;\n }\n\n var resulting_string = pattern.read();\n var next = '';\n while (this._input.hasNext()) {\n next = this._input.next();\n if (next === delimiter ||\n (!allow_unescaped_newlines && acorn.newline.test(next))) {\n this._input.back();\n break;\n } else if (next === '\\\\' && this._input.hasNext()) {\n current_char = this._input.peek();\n\n if (current_char === 'x' || current_char === 'u') {\n this.has_char_escapes = true;\n } else if (current_char === '\\r' && this._input.peek(1) === '\\n') {\n this._input.next();\n }\n next += this._input.next();\n } else if (start_sub) {\n if (start_sub === '${' && next === '$' && this._input.peek() === '{') {\n next += this._input.next();\n }\n\n if (start_sub === next) {\n if (delimiter === '`') {\n next += this._read_string_recursive('}', allow_unescaped_newlines, '`');\n } else {\n next += this._read_string_recursive('`', allow_unescaped_newlines, '${');\n }\n if (this._input.hasNext()) {\n next += this._input.next();\n }\n }\n }\n next += pattern.read();\n resulting_string += next;\n }\n\n return resulting_string;\n};\n\nmodule.exports.Tokenizer = Tokenizer;\nmodule.exports.TOKEN = TOKEN;\nmodule.exports.positionable_operators = positionable_operators.slice();\nmodule.exports.line_starters = line_starters.slice();\n", "/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nvar Output = require('../core/output').Output;\nvar Token = require('../core/token').Token;\nvar acorn = require('./acorn');\nvar Options = require('./options').Options;\nvar Tokenizer = require('./tokenizer').Tokenizer;\nvar line_starters = require('./tokenizer').line_starters;\nvar positionable_operators = require('./tokenizer').positionable_operators;\nvar TOKEN = require('./tokenizer').TOKEN;\n\n\nfunction in_array(what, arr) {\n return arr.indexOf(what) !== -1;\n}\n\nfunction ltrim(s) {\n return s.replace(/^\\s+/g, '');\n}\n\nfunction generateMapFromStrings(list) {\n var result = {};\n for (var x = 0; x < list.length; x++) {\n // make the mapped names underscored instead of dash\n result[list[x].replace(/-/g, '_')] = list[x];\n }\n return result;\n}\n\nfunction reserved_word(token, word) {\n return token && token.type === TOKEN.RESERVED && token.text === word;\n}\n\nfunction reserved_array(token, words) {\n return token && token.type === TOKEN.RESERVED && in_array(token.text, words);\n}\n// Unsure of what they mean, but they work. Worth cleaning up in future.\nvar special_words = ['case', 'return', 'do', 'if', 'throw', 'else', 'await', 'break', 'continue', 'async'];\n\nvar validPositionValues = ['before-newline', 'after-newline', 'preserve-newline'];\n\n// Generate map from array\nvar OPERATOR_POSITION = generateMapFromStrings(validPositionValues);\n\nvar OPERATOR_POSITION_BEFORE_OR_PRESERVE = [OPERATOR_POSITION.before_newline, OPERATOR_POSITION.preserve_newline];\n\nvar MODE = {\n BlockStatement: 'BlockStatement', // 'BLOCK'\n Statement: 'Statement', // 'STATEMENT'\n ObjectLiteral: 'ObjectLiteral', // 'OBJECT',\n ArrayLiteral: 'ArrayLiteral', //'[EXPRESSION]',\n ForInitializer: 'ForInitializer', //'(FOR-EXPRESSION)',\n Conditional: 'Conditional', //'(COND-EXPRESSION)',\n Expression: 'Expression' //'(EXPRESSION)'\n};\n\nfunction remove_redundant_indentation(output, frame) {\n // This implementation is effective but has some issues:\n // - can cause line wrap to happen too soon due to indent removal\n // after wrap points are calculated\n // These issues are minor compared to ugly indentation.\n\n if (frame.multiline_frame ||\n frame.mode === MODE.ForInitializer ||\n frame.mode === MODE.Conditional) {\n return;\n }\n\n // remove one indent from each line inside this section\n output.remove_indent(frame.start_line_index);\n}\n\n// we could use just string.split, but\n// IE doesn't like returning empty strings\nfunction split_linebreaks(s) {\n //return s.split(/\\x0d\\x0a|\\x0a/);\n\n s = s.replace(acorn.allLineBreaks, '\\n');\n var out = [],\n idx = s.indexOf(\"\\n\");\n while (idx !== -1) {\n out.push(s.substring(0, idx));\n s = s.substring(idx + 1);\n idx = s.indexOf(\"\\n\");\n }\n if (s.length) {\n out.push(s);\n }\n return out;\n}\n\nfunction is_array(mode) {\n return mode === MODE.ArrayLiteral;\n}\n\nfunction is_expression(mode) {\n return in_array(mode, [MODE.Expression, MODE.ForInitializer, MODE.Conditional]);\n}\n\nfunction all_lines_start_with(lines, c) {\n for (var i = 0; i < lines.length; i++) {\n var line = lines[i].trim();\n if (line.charAt(0) !== c) {\n return false;\n }\n }\n return true;\n}\n\nfunction each_line_matches_indent(lines, indent) {\n var i = 0,\n len = lines.length,\n line;\n for (; i < len; i++) {\n line = lines[i];\n // allow empty lines to pass through\n if (line && line.indexOf(indent) !== 0) {\n return false;\n }\n }\n return true;\n}\n\n\nfunction Beautifier(source_text, options) {\n options = options || {};\n this._source_text = source_text || '';\n\n this._output = null;\n this._tokens = null;\n this._last_last_text = null;\n this._flags = null;\n this._previous_flags = null;\n\n this._flag_store = null;\n this._options = new Options(options);\n}\n\nBeautifier.prototype.create_flags = function(flags_base, mode) {\n var next_indent_level = 0;\n if (flags_base) {\n next_indent_level = flags_base.indentation_level;\n if (!this._output.just_added_newline() &&\n flags_base.line_indent_level > next_indent_level) {\n next_indent_level = flags_base.line_indent_level;\n }\n }\n\n var next_flags = {\n mode: mode,\n parent: flags_base,\n last_token: flags_base ? flags_base.last_token : new Token(TOKEN.START_BLOCK, ''), // last token text\n last_word: flags_base ? flags_base.last_word : '', // last TOKEN.WORD passed\n declaration_statement: false,\n declaration_assignment: false,\n multiline_frame: false,\n inline_frame: false,\n if_block: false,\n else_block: false,\n class_start_block: false, // class A { INSIDE HERE } or class B extends C { INSIDE HERE }\n do_block: false,\n do_while: false,\n import_block: false,\n in_case_statement: false, // switch(..){ INSIDE HERE }\n in_case: false, // we're on the exact line with \"case 0:\"\n case_body: false, // the indented case-action block\n case_block: false, // the indented case-action block is wrapped with {}\n indentation_level: next_indent_level,\n alignment: 0,\n line_indent_level: flags_base ? flags_base.line_indent_level : next_indent_level,\n start_line_index: this._output.get_line_number(),\n ternary_depth: 0\n };\n return next_flags;\n};\n\nBeautifier.prototype._reset = function(source_text) {\n var baseIndentString = source_text.match(/^[\\t ]*/)[0];\n\n this._last_last_text = ''; // pre-last token text\n this._output = new Output(this._options, baseIndentString);\n\n // If testing the ignore directive, start with output disable set to true\n this._output.raw = this._options.test_output_raw;\n\n\n // Stack of parsing/formatting states, including MODE.\n // We tokenize, parse, and output in an almost purely a forward-only stream of token input\n // and formatted output. This makes the beautifier less accurate than full parsers\n // but also far more tolerant of syntax errors.\n //\n // For example, the default mode is MODE.BlockStatement. If we see a '{' we push a new frame of type\n // MODE.BlockStatement on the the stack, even though it could be object literal. If we later\n // encounter a \":\", we'll switch to to MODE.ObjectLiteral. If we then see a \";\",\n // most full parsers would die, but the beautifier gracefully falls back to\n // MODE.BlockStatement and continues on.\n this._flag_store = [];\n this.set_mode(MODE.BlockStatement);\n var tokenizer = new Tokenizer(source_text, this._options);\n this._tokens = tokenizer.tokenize();\n return source_text;\n};\n\nBeautifier.prototype.beautify = function() {\n // if disabled, return the input unchanged.\n if (this._options.disabled) {\n return this._source_text;\n }\n\n var sweet_code;\n var source_text = this._reset(this._source_text);\n\n var eol = this._options.eol;\n if (this._options.eol === 'auto') {\n eol = '\\n';\n if (source_text && acorn.lineBreak.test(source_text || '')) {\n eol = source_text.match(acorn.lineBreak)[0];\n }\n }\n\n var current_token = this._tokens.next();\n while (current_token) {\n this.handle_token(current_token);\n\n this._last_last_text = this._flags.last_token.text;\n this._flags.last_token = current_token;\n\n current_token = this._tokens.next();\n }\n\n sweet_code = this._output.get_code(eol);\n\n return sweet_code;\n};\n\nBeautifier.prototype.handle_token = function(current_token, preserve_statement_flags) {\n if (current_token.type === TOKEN.START_EXPR) {\n this.handle_start_expr(current_token);\n } else if (current_token.type === TOKEN.END_EXPR) {\n this.handle_end_expr(current_token);\n } else if (current_token.type === TOKEN.START_BLOCK) {\n this.handle_start_block(current_token);\n } else if (current_token.type === TOKEN.END_BLOCK) {\n this.handle_end_block(current_token);\n } else if (current_token.type === TOKEN.WORD) {\n this.handle_word(current_token);\n } else if (current_token.type === TOKEN.RESERVED) {\n this.handle_word(current_token);\n } else if (current_token.type === TOKEN.SEMICOLON) {\n this.handle_semicolon(current_token);\n } else if (current_token.type === TOKEN.STRING) {\n this.handle_string(current_token);\n } else if (current_token.type === TOKEN.EQUALS) {\n this.handle_equals(current_token);\n } else if (current_token.type === TOKEN.OPERATOR) {\n this.handle_operator(current_token);\n } else if (current_token.type === TOKEN.COMMA) {\n this.handle_comma(current_token);\n } else if (current_token.type === TOKEN.BLOCK_COMMENT) {\n this.handle_block_comment(current_token, preserve_statement_flags);\n } else if (current_token.type === TOKEN.COMMENT) {\n this.handle_comment(current_token, preserve_statement_flags);\n } else if (current_token.type === TOKEN.DOT) {\n this.handle_dot(current_token);\n } else if (current_token.type === TOKEN.EOF) {\n this.handle_eof(current_token);\n } else if (current_token.type === TOKEN.UNKNOWN) {\n this.handle_unknown(current_token, preserve_statement_flags);\n } else {\n this.handle_unknown(current_token, preserve_statement_flags);\n }\n};\n\nBeautifier.prototype.handle_whitespace_and_comments = function(current_token, preserve_statement_flags) {\n var newlines = current_token.newlines;\n var keep_whitespace = this._options.keep_array_indentation && is_array(this._flags.mode);\n\n if (current_token.comments_before) {\n var comment_token = current_token.comments_before.next();\n while (comment_token) {\n // The cleanest handling of inline comments is to treat them as though they aren't there.\n // Just continue formatting and the behavior should be logical.\n // Also ignore unknown tokens. Again, this should result in better behavior.\n this.handle_whitespace_and_comments(comment_token, preserve_statement_flags);\n this.handle_token(comment_token, preserve_statement_flags);\n comment_token = current_token.comments_before.next();\n }\n }\n\n if (keep_whitespace) {\n for (var i = 0; i < newlines; i += 1) {\n this.print_newline(i > 0, preserve_statement_flags);\n }\n } else {\n if (this._options.max_preserve_newlines && newlines > this._options.max_preserve_newlines) {\n newlines = this._options.max_preserve_newlines;\n }\n\n if (this._options.preserve_newlines) {\n if (newlines > 1) {\n this.print_newline(false, preserve_statement_flags);\n for (var j = 1; j < newlines; j += 1) {\n this.print_newline(true, preserve_statement_flags);\n }\n }\n }\n }\n\n};\n\nvar newline_restricted_tokens = ['async', 'break', 'continue', 'return', 'throw', 'yield'];\n\nBeautifier.prototype.allow_wrap_or_preserved_newline = function(current_token, force_linewrap) {\n force_linewrap = (force_linewrap === undefined) ? false : force_linewrap;\n\n // Never wrap the first token on a line\n if (this._output.just_added_newline()) {\n return;\n }\n\n var shouldPreserveOrForce = (this._options.preserve_newlines && current_token.newlines) || force_linewrap;\n var operatorLogicApplies = in_array(this._flags.last_token.text, positionable_operators) ||\n in_array(current_token.text, positionable_operators);\n\n if (operatorLogicApplies) {\n var shouldPrintOperatorNewline = (\n in_array(this._flags.last_token.text, positionable_operators) &&\n in_array(this._options.operator_position, OPERATOR_POSITION_BEFORE_OR_PRESERVE)\n ) ||\n in_array(current_token.text, positionable_operators);\n shouldPreserveOrForce = shouldPreserveOrForce && shouldPrintOperatorNewline;\n }\n\n if (shouldPreserveOrForce) {\n this.print_newline(false, true);\n } else if (this._options.wrap_line_length) {\n if (reserved_array(this._flags.last_token, newline_restricted_tokens)) {\n // These tokens should never have a newline inserted\n // between them and the following expression.\n return;\n }\n this._output.set_wrap_point();\n }\n};\n\nBeautifier.prototype.print_newline = function(force_newline, preserve_statement_flags) {\n if (!preserve_statement_flags) {\n if (this._flags.last_token.text !== ';' && this._flags.last_token.text !== ',' && this._flags.last_token.text !== '=' && (this._flags.last_token.type !== TOKEN.OPERATOR || this._flags.last_token.text === '--' || this._flags.last_token.text === '++')) {\n var next_token = this._tokens.peek();\n while (this._flags.mode === MODE.Statement &&\n !(this._flags.if_block && reserved_word(next_token, 'else')) &&\n !this._flags.do_block) {\n this.restore_mode();\n }\n }\n }\n\n if (this._output.add_new_line(force_newline)) {\n this._flags.multiline_frame = true;\n }\n};\n\nBeautifier.prototype.print_token_line_indentation = function(current_token) {\n if (this._output.just_added_newline()) {\n if (this._options.keep_array_indentation &&\n current_token.newlines &&\n (current_token.text === '[' || is_array(this._flags.mode))) {\n this._output.current_line.set_indent(-1);\n this._output.current_line.push(current_token.whitespace_before);\n this._output.space_before_token = false;\n } else if (this._output.set_indent(this._flags.indentation_level, this._flags.alignment)) {\n this._flags.line_indent_level = this._flags.indentation_level;\n }\n }\n};\n\nBeautifier.prototype.print_token = function(current_token) {\n if (this._output.raw) {\n this._output.add_raw_token(current_token);\n return;\n }\n\n if (this._options.comma_first && current_token.previous && current_token.previous.type === TOKEN.COMMA &&\n this._output.just_added_newline()) {\n if (this._output.previous_line.last() === ',') {\n var popped = this._output.previous_line.pop();\n // if the comma was already at the start of the line,\n // pull back onto that line and reprint the indentation\n if (this._output.previous_line.is_empty()) {\n this._output.previous_line.push(popped);\n this._output.trim(true);\n this._output.current_line.pop();\n this._output.trim();\n }\n\n // add the comma in front of the next token\n this.print_token_line_indentation(current_token);\n this._output.add_token(',');\n this._output.space_before_token = true;\n }\n }\n\n this.print_token_line_indentation(current_token);\n this._output.non_breaking_space = true;\n this._output.add_token(current_token.text);\n if (this._output.previous_token_wrapped) {\n this._flags.multiline_frame = true;\n }\n};\n\nBeautifier.prototype.indent = function() {\n this._flags.indentation_level += 1;\n this._output.set_indent(this._flags.indentation_level, this._flags.alignment);\n};\n\nBeautifier.prototype.deindent = function() {\n if (this._flags.indentation_level > 0 &&\n ((!this._flags.parent) || this._flags.indentation_level > this._flags.parent.indentation_level)) {\n this._flags.indentation_level -= 1;\n this._output.set_indent(this._flags.indentation_level, this._flags.alignment);\n }\n};\n\nBeautifier.prototype.set_mode = function(mode) {\n if (this._flags) {\n this._flag_store.push(this._flags);\n this._previous_flags = this._flags;\n } else {\n this._previous_flags = this.create_flags(null, mode);\n }\n\n this._flags = this.create_flags(this._previous_flags, mode);\n this._output.set_indent(this._flags.indentation_level, this._flags.alignment);\n};\n\n\nBeautifier.prototype.restore_mode = function() {\n if (this._flag_store.length > 0) {\n this._previous_flags = this._flags;\n this._flags = this._flag_store.pop();\n if (this._previous_flags.mode === MODE.Statement) {\n remove_redundant_indentation(this._output, this._previous_flags);\n }\n this._output.set_indent(this._flags.indentation_level, this._flags.alignment);\n }\n};\n\nBeautifier.prototype.start_of_object_property = function() {\n return this._flags.parent.mode === MODE.ObjectLiteral && this._flags.mode === MODE.Statement && (\n (this._flags.last_token.text === ':' && this._flags.ternary_depth === 0) || (reserved_array(this._flags.last_token, ['get', 'set'])));\n};\n\nBeautifier.prototype.start_of_statement = function(current_token) {\n var start = false;\n start = start || reserved_array(this._flags.last_token, ['var', 'let', 'const']) && current_token.type === TOKEN.WORD;\n start = start || reserved_word(this._flags.last_token, 'do');\n start = start || (!(this._flags.parent.mode === MODE.ObjectLiteral && this._flags.mode === MODE.Statement)) && reserved_array(this._flags.last_token, newline_restricted_tokens) && !current_token.newlines;\n start = start || reserved_word(this._flags.last_token, 'else') &&\n !(reserved_word(current_token, 'if') && !current_token.comments_before);\n start = start || (this._flags.last_token.type === TOKEN.END_EXPR && (this._previous_flags.mode === MODE.ForInitializer || this._previous_flags.mode === MODE.Conditional));\n start = start || (this._flags.last_token.type === TOKEN.WORD && this._flags.mode === MODE.BlockStatement &&\n !this._flags.in_case &&\n !(current_token.text === '--' || current_token.text === '++') &&\n this._last_last_text !== 'function' &&\n current_token.type !== TOKEN.WORD && current_token.type !== TOKEN.RESERVED);\n start = start || (this._flags.mode === MODE.ObjectLiteral && (\n (this._flags.last_token.text === ':' && this._flags.ternary_depth === 0) || reserved_array(this._flags.last_token, ['get', 'set'])));\n\n if (start) {\n this.set_mode(MODE.Statement);\n this.indent();\n\n this.handle_whitespace_and_comments(current_token, true);\n\n // Issue #276:\n // If starting a new statement with [if, for, while, do], push to a new line.\n // if (a) if (b) if(c) d(); else e(); else f();\n if (!this.start_of_object_property()) {\n this.allow_wrap_or_preserved_newline(current_token,\n reserved_array(current_token, ['do', 'for', 'if', 'while']));\n }\n return true;\n }\n return false;\n};\n\nBeautifier.prototype.handle_start_expr = function(current_token) {\n // The conditional starts the statement if appropriate.\n if (!this.start_of_statement(current_token)) {\n this.handle_whitespace_and_comments(current_token);\n }\n\n var next_mode = MODE.Expression;\n if (current_token.text === '[') {\n\n if (this._flags.last_token.type === TOKEN.WORD || this._flags.last_token.text === ')') {\n // this is array index specifier, break immediately\n // a[x], fn()[x]\n if (reserved_array(this._flags.last_token, line_starters)) {\n this._output.space_before_token = true;\n }\n this.print_token(current_token);\n this.set_mode(next_mode);\n this.indent();\n if (this._options.space_in_paren) {\n this._output.space_before_token = true;\n }\n return;\n }\n\n next_mode = MODE.ArrayLiteral;\n if (is_array(this._flags.mode)) {\n if (this._flags.last_token.text === '[' ||\n (this._flags.last_token.text === ',' && (this._last_last_text === ']' || this._last_last_text === '}'))) {\n // ], [ goes to new line\n // }, [ goes to new line\n if (!this._options.keep_array_indentation) {\n this.print_newline();\n }\n }\n }\n\n if (!in_array(this._flags.last_token.type, [TOKEN.START_EXPR, TOKEN.END_EXPR, TOKEN.WORD, TOKEN.OPERATOR, TOKEN.DOT])) {\n this._output.space_before_token = true;\n }\n } else {\n if (this._flags.last_token.type === TOKEN.RESERVED) {\n if (this._flags.last_token.text === 'for') {\n this._output.space_before_token = this._options.space_before_conditional;\n next_mode = MODE.ForInitializer;\n } else if (in_array(this._flags.last_token.text, ['if', 'while', 'switch'])) {\n this._output.space_before_token = this._options.space_before_conditional;\n next_mode = MODE.Conditional;\n } else if (in_array(this._flags.last_word, ['await', 'async'])) {\n // Should be a space between await and an IIFE, or async and an arrow function\n this._output.space_before_token = true;\n } else if (this._flags.last_token.text === 'import' && current_token.whitespace_before === '') {\n this._output.space_before_token = false;\n } else if (in_array(this._flags.last_token.text, line_starters) || this._flags.last_token.text === 'catch') {\n this._output.space_before_token = true;\n }\n } else if (this._flags.last_token.type === TOKEN.EQUALS || this._flags.last_token.type === TOKEN.OPERATOR) {\n // Support of this kind of newline preservation.\n // a = (b &&\n // (c || d));\n if (!this.start_of_object_property()) {\n this.allow_wrap_or_preserved_newline(current_token);\n }\n } else if (this._flags.last_token.type === TOKEN.WORD) {\n this._output.space_before_token = false;\n\n // function name() vs function name ()\n // function* name() vs function* name ()\n // async name() vs async name ()\n // In ES6, you can also define the method properties of an object\n // var obj = {a: function() {}}\n // It can be abbreviated\n // var obj = {a() {}}\n // var obj = { a() {}} vs var obj = { a () {}}\n // var obj = { * a() {}} vs var obj = { * a () {}}\n var peek_back_two = this._tokens.peek(-3);\n if (this._options.space_after_named_function && peek_back_two) {\n // peek starts at next character so -1 is current token\n var peek_back_three = this._tokens.peek(-4);\n if (reserved_array(peek_back_two, ['async', 'function']) ||\n (peek_back_two.text === '*' && reserved_array(peek_back_three, ['async', 'function']))) {\n this._output.space_before_token = true;\n } else if (this._flags.mode === MODE.ObjectLiteral) {\n if ((peek_back_two.text === '{' || peek_back_two.text === ',') ||\n (peek_back_two.text === '*' && (peek_back_three.text === '{' || peek_back_three.text === ','))) {\n this._output.space_before_token = true;\n }\n } else if (this._flags.parent && this._flags.parent.class_start_block) {\n this._output.space_before_token = true;\n }\n }\n } else {\n // Support preserving wrapped arrow function expressions\n // a.b('c',\n // () => d.e\n // )\n this.allow_wrap_or_preserved_newline(current_token);\n }\n\n // function() vs function ()\n // yield*() vs yield* ()\n // function*() vs function* ()\n if ((this._flags.last_token.type === TOKEN.RESERVED && (this._flags.last_word === 'function' || this._flags.last_word === 'typeof')) ||\n (this._flags.last_token.text === '*' &&\n (in_array(this._last_last_text, ['function', 'yield']) ||\n (this._flags.mode === MODE.ObjectLiteral && in_array(this._last_last_text, ['{', ',']))))) {\n this._output.space_before_token = this._options.space_after_anon_function;\n }\n }\n\n if (this._flags.last_token.text === ';' || this._flags.last_token.type === TOKEN.START_BLOCK) {\n this.print_newline();\n } else if (this._flags.last_token.type === TOKEN.END_EXPR || this._flags.last_token.type === TOKEN.START_EXPR || this._flags.last_token.type === TOKEN.END_BLOCK || this._flags.last_token.text === '.' || this._flags.last_token.type === TOKEN.COMMA) {\n // do nothing on (( and )( and ][ and ]( and .(\n // TODO: Consider whether forcing this is required. Review failing tests when removed.\n this.allow_wrap_or_preserved_newline(current_token, current_token.newlines);\n }\n\n this.print_token(current_token);\n this.set_mode(next_mode);\n if (this._options.space_in_paren) {\n this._output.space_before_token = true;\n }\n\n // In all cases, if we newline while inside an expression it should be indented.\n this.indent();\n};\n\nBeautifier.prototype.handle_end_expr = function(current_token) {\n // statements inside expressions are not valid syntax, but...\n // statements must all be closed when their container closes\n while (this._flags.mode === MODE.Statement) {\n this.restore_mode();\n }\n\n this.handle_whitespace_and_comments(current_token);\n\n if (this._flags.multiline_frame) {\n this.allow_wrap_or_preserved_newline(current_token,\n current_token.text === ']' && is_array(this._flags.mode) && !this._options.keep_array_indentation);\n }\n\n if (this._options.space_in_paren) {\n if (this._flags.last_token.type === TOKEN.START_EXPR && !this._options.space_in_empty_paren) {\n // () [] no inner space in empty parens like these, ever, ref #320\n this._output.trim();\n this._output.space_before_token = false;\n } else {\n this._output.space_before_token = true;\n }\n }\n this.deindent();\n this.print_token(current_token);\n this.restore_mode();\n\n remove_redundant_indentation(this._output, this._previous_flags);\n\n // do {} while () // no statement required after\n if (this._flags.do_while && this._previous_flags.mode === MODE.Conditional) {\n this._previous_flags.mode = MODE.Expression;\n this._flags.do_block = false;\n this._flags.do_while = false;\n\n }\n};\n\nBeautifier.prototype.handle_start_block = function(current_token) {\n this.handle_whitespace_and_comments(current_token);\n\n // Check if this is should be treated as a ObjectLiteral\n var next_token = this._tokens.peek();\n var second_token = this._tokens.peek(1);\n if (this._flags.last_word === 'switch' && this._flags.last_token.type === TOKEN.END_EXPR) {\n this.set_mode(MODE.BlockStatement);\n this._flags.in_case_statement = true;\n } else if (this._flags.case_body) {\n this.set_mode(MODE.BlockStatement);\n } else if (second_token && (\n (in_array(second_token.text, [':', ',']) && in_array(next_token.type, [TOKEN.STRING, TOKEN.WORD, TOKEN.RESERVED])) ||\n (in_array(next_token.text, ['get', 'set', '...']) && in_array(second_token.type, [TOKEN.WORD, TOKEN.RESERVED]))\n )) {\n // We don't support TypeScript,but we didn't break it for a very long time.\n // We'll try to keep not breaking it.\n if (in_array(this._last_last_text, ['class', 'interface']) && !in_array(second_token.text, [':', ','])) {\n this.set_mode(MODE.BlockStatement);\n } else {\n this.set_mode(MODE.ObjectLiteral);\n }\n } else if (this._flags.last_token.type === TOKEN.OPERATOR && this._flags.last_token.text === '=>') {\n // arrow function: (param1, paramN) => { statements }\n this.set_mode(MODE.BlockStatement);\n } else if (in_array(this._flags.last_token.type, [TOKEN.EQUALS, TOKEN.START_EXPR, TOKEN.COMMA, TOKEN.OPERATOR]) ||\n reserved_array(this._flags.last_token, ['return', 'throw', 'import', 'default'])\n ) {\n // Detecting shorthand function syntax is difficult by scanning forward,\n // so check the surrounding context.\n // If the block is being returned, imported, export default, passed as arg,\n // assigned with = or assigned in a nested object, treat as an ObjectLiteral.\n this.set_mode(MODE.ObjectLiteral);\n } else {\n this.set_mode(MODE.BlockStatement);\n }\n\n if (this._flags.last_token) {\n if (reserved_array(this._flags.last_token.previous, ['class', 'extends'])) {\n this._flags.class_start_block = true;\n }\n }\n\n var empty_braces = !next_token.comments_before && next_token.text === '}';\n var empty_anonymous_function = empty_braces && this._flags.last_word === 'function' &&\n this._flags.last_token.type === TOKEN.END_EXPR;\n\n if (this._options.brace_preserve_inline) // check for inline, set inline_frame if so\n {\n // search forward for a newline wanted inside this block\n var index = 0;\n var check_token = null;\n this._flags.inline_frame = true;\n do {\n index += 1;\n check_token = this._tokens.peek(index - 1);\n if (check_token.newlines) {\n this._flags.inline_frame = false;\n break;\n }\n } while (check_token.type !== TOKEN.EOF &&\n !(check_token.type === TOKEN.END_BLOCK && check_token.opened === current_token));\n }\n\n if ((this._options.brace_style === \"expand\" ||\n (this._options.brace_style === \"none\" && current_token.newlines)) &&\n !this._flags.inline_frame) {\n if (this._flags.last_token.type !== TOKEN.OPERATOR &&\n (empty_anonymous_function ||\n this._flags.last_token.type === TOKEN.EQUALS ||\n (reserved_array(this._flags.last_token, special_words) && this._flags.last_token.text !== 'else'))) {\n this._output.space_before_token = true;\n } else {\n this.print_newline(false, true);\n }\n } else { // collapse || inline_frame\n if (is_array(this._previous_flags.mode) && (this._flags.last_token.type === TOKEN.START_EXPR || this._flags.last_token.type === TOKEN.COMMA)) {\n if (this._flags.last_token.type === TOKEN.COMMA || this._options.space_in_paren) {\n this._output.space_before_token = true;\n }\n\n if (this._flags.last_token.type === TOKEN.COMMA || (this._flags.last_token.type === TOKEN.START_EXPR && this._flags.inline_frame)) {\n this.allow_wrap_or_preserved_newline(current_token);\n this._previous_flags.multiline_frame = this._previous_flags.multiline_frame || this._flags.multiline_frame;\n this._flags.multiline_frame = false;\n }\n }\n if (this._flags.last_token.type !== TOKEN.OPERATOR && this._flags.last_token.type !== TOKEN.START_EXPR) {\n if (this._flags.last_token.type === TOKEN.START_BLOCK && !this._flags.inline_frame) {\n this.print_newline();\n } else {\n this._output.space_before_token = true;\n }\n }\n }\n this.print_token(current_token);\n this.indent();\n\n // Except for specific cases, open braces are followed by a new line.\n if (!empty_braces && !(this._options.brace_preserve_inline && this._flags.inline_frame)) {\n this.print_newline();\n }\n};\n\nBeautifier.prototype.handle_end_block = function(current_token) {\n // statements must all be closed when their container closes\n this.handle_whitespace_and_comments(current_token);\n\n while (this._flags.mode === MODE.Statement) {\n this.restore_mode();\n }\n\n var empty_braces = this._flags.last_token.type === TOKEN.START_BLOCK;\n\n if (this._flags.inline_frame && !empty_braces) { // try inline_frame (only set if this._options.braces-preserve-inline) first\n this._output.space_before_token = true;\n } else if (this._options.brace_style === \"expand\") {\n if (!empty_braces) {\n this.print_newline();\n }\n } else {\n // skip {}\n if (!empty_braces) {\n if (is_array(this._flags.mode) && this._options.keep_array_indentation) {\n // we REALLY need a newline here, but newliner would skip that\n this._options.keep_array_indentation = false;\n this.print_newline();\n this._options.keep_array_indentation = true;\n\n } else {\n this.print_newline();\n }\n }\n }\n this.restore_mode();\n this.print_token(current_token);\n};\n\nBeautifier.prototype.handle_word = function(current_token) {\n if (current_token.type === TOKEN.RESERVED) {\n if (in_array(current_token.text, ['set', 'get']) && this._flags.mode !== MODE.ObjectLiteral) {\n current_token.type = TOKEN.WORD;\n } else if (current_token.text === 'import' && in_array(this._tokens.peek().text, ['(', '.'])) {\n current_token.type = TOKEN.WORD;\n } else if (in_array(current_token.text, ['as', 'from']) && !this._flags.import_block) {\n current_token.type = TOKEN.WORD;\n } else if (this._flags.mode === MODE.ObjectLiteral) {\n var next_token = this._tokens.peek();\n if (next_token.text === ':') {\n current_token.type = TOKEN.WORD;\n }\n }\n }\n\n if (this.start_of_statement(current_token)) {\n // The conditional starts the statement if appropriate.\n if (reserved_array(this._flags.last_token, ['var', 'let', 'const']) && current_token.type === TOKEN.WORD) {\n this._flags.declaration_statement = true;\n }\n } else if (current_token.newlines && !is_expression(this._flags.mode) &&\n (this._flags.last_token.type !== TOKEN.OPERATOR || (this._flags.last_token.text === '--' || this._flags.last_token.text === '++')) &&\n this._flags.last_token.type !== TOKEN.EQUALS &&\n (this._options.preserve_newlines || !reserved_array(this._flags.last_token, ['var', 'let', 'const', 'set', 'get']))) {\n this.handle_whitespace_and_comments(current_token);\n this.print_newline();\n } else {\n this.handle_whitespace_and_comments(current_token);\n }\n\n if (this._flags.do_block && !this._flags.do_while) {\n if (reserved_word(current_token, 'while')) {\n // do {} ## while ()\n this._output.space_before_token = true;\n this.print_token(current_token);\n this._output.space_before_token = true;\n this._flags.do_while = true;\n return;\n } else {\n // do {} should always have while as the next word.\n // if we don't see the expected while, recover\n this.print_newline();\n this._flags.do_block = false;\n }\n }\n\n // if may be followed by else, or not\n // Bare/inline ifs are tricky\n // Need to unwind the modes correctly: if (a) if (b) c(); else d(); else e();\n if (this._flags.if_block) {\n if (!this._flags.else_block && reserved_word(current_token, 'else')) {\n this._flags.else_block = true;\n } else {\n while (this._flags.mode === MODE.Statement) {\n this.restore_mode();\n }\n this._flags.if_block = false;\n this._flags.else_block = false;\n }\n }\n\n if (this._flags.in_case_statement && reserved_array(current_token, ['case', 'default'])) {\n this.print_newline();\n if (!this._flags.case_block && (this._flags.case_body || this._options.jslint_happy)) {\n // switch cases following one another\n this.deindent();\n }\n this._flags.case_body = false;\n\n this.print_token(current_token);\n this._flags.in_case = true;\n return;\n }\n\n if (this._flags.last_token.type === TOKEN.COMMA || this._flags.last_token.type === TOKEN.START_EXPR || this._flags.last_token.type === TOKEN.EQUALS || this._flags.last_token.type === TOKEN.OPERATOR) {\n if (!this.start_of_object_property()) {\n this.allow_wrap_or_preserved_newline(current_token);\n }\n }\n\n if (reserved_word(current_token, 'function')) {\n if (in_array(this._flags.last_token.text, ['}', ';']) ||\n (this._output.just_added_newline() && !(in_array(this._flags.last_token.text, ['(', '[', '{', ':', '=', ',']) || this._flags.last_token.type === TOKEN.OPERATOR))) {\n // make sure there is a nice clean space of at least one blank line\n // before a new function definition\n if (!this._output.just_added_blankline() && !current_token.comments_before) {\n this.print_newline();\n this.print_newline(true);\n }\n }\n if (this._flags.last_token.type === TOKEN.RESERVED || this._flags.last_token.type === TOKEN.WORD) {\n if (reserved_array(this._flags.last_token, ['get', 'set', 'new', 'export']) ||\n reserved_array(this._flags.last_token, newline_restricted_tokens)) {\n this._output.space_before_token = true;\n } else if (reserved_word(this._flags.last_token, 'default') && this._last_last_text === 'export') {\n this._output.space_before_token = true;\n } else if (this._flags.last_token.text === 'declare') {\n // accomodates Typescript declare function formatting\n this._output.space_before_token = true;\n } else {\n this.print_newline();\n }\n } else if (this._flags.last_token.type === TOKEN.OPERATOR || this._flags.last_token.text === '=') {\n // foo = function\n this._output.space_before_token = true;\n } else if (!this._flags.multiline_frame && (is_expression(this._flags.mode) || is_array(this._flags.mode))) {\n // (function\n } else {\n this.print_newline();\n }\n\n this.print_token(current_token);\n this._flags.last_word = current_token.text;\n return;\n }\n\n var prefix = 'NONE';\n\n if (this._flags.last_token.type === TOKEN.END_BLOCK) {\n\n if (this._previous_flags.inline_frame) {\n prefix = 'SPACE';\n } else if (!reserved_array(current_token, ['else', 'catch', 'finally', 'from'])) {\n prefix = 'NEWLINE';\n } else {\n if (this._options.brace_style === \"expand\" ||\n this._options.brace_style === \"end-expand\" ||\n (this._options.brace_style === \"none\" && current_token.newlines)) {\n prefix = 'NEWLINE';\n } else {\n prefix = 'SPACE';\n this._output.space_before_token = true;\n }\n }\n } else if (this._flags.last_token.type === TOKEN.SEMICOLON && this._flags.mode === MODE.BlockStatement) {\n // TODO: Should this be for STATEMENT as well?\n prefix = 'NEWLINE';\n } else if (this._flags.last_token.type === TOKEN.SEMICOLON && is_expression(this._flags.mode)) {\n prefix = 'SPACE';\n } else if (this._flags.last_token.type === TOKEN.STRING) {\n prefix = 'NEWLINE';\n } else if (this._flags.last_token.type === TOKEN.RESERVED || this._flags.last_token.type === TOKEN.WORD ||\n (this._flags.last_token.text === '*' &&\n (in_array(this._last_last_text, ['function', 'yield']) ||\n (this._flags.mode === MODE.ObjectLiteral && in_array(this._last_last_text, ['{', ',']))))) {\n prefix = 'SPACE';\n } else if (this._flags.last_token.type === TOKEN.START_BLOCK) {\n if (this._flags.inline_frame) {\n prefix = 'SPACE';\n } else {\n prefix = 'NEWLINE';\n }\n } else if (this._flags.last_token.type === TOKEN.END_EXPR) {\n this._output.space_before_token = true;\n prefix = 'NEWLINE';\n }\n\n if (reserved_array(current_token, line_starters) && this._flags.last_token.text !== ')') {\n if (this._flags.inline_frame || this._flags.last_token.text === 'else' || this._flags.last_token.text === 'export') {\n prefix = 'SPACE';\n } else {\n prefix = 'NEWLINE';\n }\n\n }\n\n if (reserved_array(current_token, ['else', 'catch', 'finally'])) {\n if ((!(this._flags.last_token.type === TOKEN.END_BLOCK && this._previous_flags.mode === MODE.BlockStatement) ||\n this._options.brace_style === \"expand\" ||\n this._options.brace_style === \"end-expand\" ||\n (this._options.brace_style === \"none\" && current_token.newlines)) &&\n !this._flags.inline_frame) {\n this.print_newline();\n } else {\n this._output.trim(true);\n var line = this._output.current_line;\n // If we trimmed and there's something other than a close block before us\n // put a newline back in. Handles '} // comment' scenario.\n if (line.last() !== '}') {\n this.print_newline();\n }\n this._output.space_before_token = true;\n }\n } else if (prefix === 'NEWLINE') {\n if (reserved_array(this._flags.last_token, special_words)) {\n // no newline between 'return nnn'\n this._output.space_before_token = true;\n } else if (this._flags.last_token.text === 'declare' && reserved_array(current_token, ['var', 'let', 'const'])) {\n // accomodates Typescript declare formatting\n this._output.space_before_token = true;\n } else if (this._flags.last_token.type !== TOKEN.END_EXPR) {\n if ((this._flags.last_token.type !== TOKEN.START_EXPR || !reserved_array(current_token, ['var', 'let', 'const'])) && this._flags.last_token.text !== ':') {\n // no need to force newline on 'var': for (var x = 0...)\n if (reserved_word(current_token, 'if') && reserved_word(current_token.previous, 'else')) {\n // no newline for } else if {\n this._output.space_before_token = true;\n } else {\n this.print_newline();\n }\n }\n } else if (reserved_array(current_token, line_starters) && this._flags.last_token.text !== ')') {\n this.print_newline();\n }\n } else if (this._flags.multiline_frame && is_array(this._flags.mode) && this._flags.last_token.text === ',' && this._last_last_text === '}') {\n this.print_newline(); // }, in lists get a newline treatment\n } else if (prefix === 'SPACE') {\n this._output.space_before_token = true;\n }\n if (current_token.previous && (current_token.previous.type === TOKEN.WORD || current_token.previous.type === TOKEN.RESERVED)) {\n this._output.space_before_token = true;\n }\n this.print_token(current_token);\n this._flags.last_word = current_token.text;\n\n if (current_token.type === TOKEN.RESERVED) {\n if (current_token.text === 'do') {\n this._flags.do_block = true;\n } else if (current_token.text === 'if') {\n this._flags.if_block = true;\n } else if (current_token.text === 'import') {\n this._flags.import_block = true;\n } else if (this._flags.import_block && reserved_word(current_token, 'from')) {\n this._flags.import_block = false;\n }\n }\n};\n\nBeautifier.prototype.handle_semicolon = function(current_token) {\n if (this.start_of_statement(current_token)) {\n // The conditional starts the statement if appropriate.\n // Semicolon can be the start (and end) of a statement\n this._output.space_before_token = false;\n } else {\n this.handle_whitespace_and_comments(current_token);\n }\n\n var next_token = this._tokens.peek();\n while (this._flags.mode === MODE.Statement &&\n !(this._flags.if_block && reserved_word(next_token, 'else')) &&\n !this._flags.do_block) {\n this.restore_mode();\n }\n\n // hacky but effective for the moment\n if (this._flags.import_block) {\n this._flags.import_block = false;\n }\n this.print_token(current_token);\n};\n\nBeautifier.prototype.handle_string = function(current_token) {\n if (current_token.text.startsWith(\"`\") && current_token.newlines === 0 && current_token.whitespace_before === '' && (current_token.previous.text === ')' || this._flags.last_token.type === TOKEN.WORD)) {\n //Conditional for detectign backtick strings\n } else if (this.start_of_statement(current_token)) {\n // The conditional starts the statement if appropriate.\n // One difference - strings want at least a space before\n this._output.space_before_token = true;\n } else {\n this.handle_whitespace_and_comments(current_token);\n if (this._flags.last_token.type === TOKEN.RESERVED || this._flags.last_token.type === TOKEN.WORD || this._flags.inline_frame) {\n this._output.space_before_token = true;\n } else if (this._flags.last_token.type === TOKEN.COMMA || this._flags.last_token.type === TOKEN.START_EXPR || this._flags.last_token.type === TOKEN.EQUALS || this._flags.last_token.type === TOKEN.OPERATOR) {\n if (!this.start_of_object_property()) {\n this.allow_wrap_or_preserved_newline(current_token);\n }\n } else if ((current_token.text.startsWith(\"`\") && this._flags.last_token.type === TOKEN.END_EXPR && (current_token.previous.text === ']' || current_token.previous.text === ')') && current_token.newlines === 0)) {\n this._output.space_before_token = true;\n } else {\n this.print_newline();\n }\n }\n this.print_token(current_token);\n};\n\nBeautifier.prototype.handle_equals = function(current_token) {\n if (this.start_of_statement(current_token)) {\n // The conditional starts the statement if appropriate.\n } else {\n this.handle_whitespace_and_comments(current_token);\n }\n\n if (this._flags.declaration_statement) {\n // just got an '=' in a var-line, different formatting/line-breaking, etc will now be done\n this._flags.declaration_assignment = true;\n }\n this._output.space_before_token = true;\n this.print_token(current_token);\n this._output.space_before_token = true;\n};\n\nBeautifier.prototype.handle_comma = function(current_token) {\n this.handle_whitespace_and_comments(current_token, true);\n\n this.print_token(current_token);\n this._output.space_before_token = true;\n if (this._flags.declaration_statement) {\n if (is_expression(this._flags.parent.mode)) {\n // do not break on comma, for(var a = 1, b = 2)\n this._flags.declaration_assignment = false;\n }\n\n if (this._flags.declaration_assignment) {\n this._flags.declaration_assignment = false;\n this.print_newline(false, true);\n } else if (this._options.comma_first) {\n // for comma-first, we want to allow a newline before the comma\n // to turn into a newline after the comma, which we will fixup later\n this.allow_wrap_or_preserved_newline(current_token);\n }\n } else if (this._flags.mode === MODE.ObjectLiteral ||\n (this._flags.mode === MODE.Statement && this._flags.parent.mode === MODE.ObjectLiteral)) {\n if (this._flags.mode === MODE.Statement) {\n this.restore_mode();\n }\n\n if (!this._flags.inline_frame) {\n this.print_newline();\n }\n } else if (this._options.comma_first) {\n // EXPR or DO_BLOCK\n // for comma-first, we want to allow a newline before the comma\n // to turn into a newline after the comma, which we will fixup later\n this.allow_wrap_or_preserved_newline(current_token);\n }\n};\n\nBeautifier.prototype.handle_operator = function(current_token) {\n var isGeneratorAsterisk = current_token.text === '*' &&\n (reserved_array(this._flags.last_token, ['function', 'yield']) ||\n (in_array(this._flags.last_token.type, [TOKEN.START_BLOCK, TOKEN.COMMA, TOKEN.END_BLOCK, TOKEN.SEMICOLON]))\n );\n var isUnary = in_array(current_token.text, ['-', '+']) && (\n in_array(this._flags.last_token.type, [TOKEN.START_BLOCK, TOKEN.START_EXPR, TOKEN.EQUALS, TOKEN.OPERATOR]) ||\n in_array(this._flags.last_token.text, line_starters) ||\n this._flags.last_token.text === ','\n );\n\n if (this.start_of_statement(current_token)) {\n // The conditional starts the statement if appropriate.\n } else {\n var preserve_statement_flags = !isGeneratorAsterisk;\n this.handle_whitespace_and_comments(current_token, preserve_statement_flags);\n }\n\n // hack for actionscript's import .*;\n if (current_token.text === '*' && this._flags.last_token.type === TOKEN.DOT) {\n this.print_token(current_token);\n return;\n }\n\n if (current_token.text === '::') {\n // no spaces around exotic namespacing syntax operator\n this.print_token(current_token);\n return;\n }\n\n // Allow line wrapping between operators when operator_position is\n // set to before or preserve\n if (this._flags.last_token.type === TOKEN.OPERATOR && in_array(this._options.operator_position, OPERATOR_POSITION_BEFORE_OR_PRESERVE)) {\n this.allow_wrap_or_preserved_newline(current_token);\n }\n\n if (current_token.text === ':' && this._flags.in_case) {\n this.print_token(current_token);\n\n this._flags.in_case = false;\n this._flags.case_body = true;\n if (this._tokens.peek().type !== TOKEN.START_BLOCK) {\n this.indent();\n this.print_newline();\n this._flags.case_block = false;\n } else {\n this._flags.case_block = true;\n this._output.space_before_token = true;\n }\n return;\n }\n\n var space_before = true;\n var space_after = true;\n var in_ternary = false;\n if (current_token.text === ':') {\n if (this._flags.ternary_depth === 0) {\n // Colon is invalid javascript outside of ternary and object, but do our best to guess what was meant.\n space_before = false;\n } else {\n this._flags.ternary_depth -= 1;\n in_ternary = true;\n }\n } else if (current_token.text === '?') {\n this._flags.ternary_depth += 1;\n }\n\n // let's handle the operator_position option prior to any conflicting logic\n if (!isUnary && !isGeneratorAsterisk && this._options.preserve_newlines && in_array(current_token.text, positionable_operators)) {\n var isColon = current_token.text === ':';\n var isTernaryColon = (isColon && in_ternary);\n var isOtherColon = (isColon && !in_ternary);\n\n switch (this._options.operator_position) {\n case OPERATOR_POSITION.before_newline:\n // if the current token is : and it's not a ternary statement then we set space_before to false\n this._output.space_before_token = !isOtherColon;\n\n this.print_token(current_token);\n\n if (!isColon || isTernaryColon) {\n this.allow_wrap_or_preserved_newline(current_token);\n }\n\n this._output.space_before_token = true;\n return;\n\n case OPERATOR_POSITION.after_newline:\n // if the current token is anything but colon, or (via deduction) it's a colon and in a ternary statement,\n // then print a newline.\n\n this._output.space_before_token = true;\n\n if (!isColon || isTernaryColon) {\n if (this._tokens.peek().newlines) {\n this.print_newline(false, true);\n } else {\n this.allow_wrap_or_preserved_newline(current_token);\n }\n } else {\n this._output.space_before_token = false;\n }\n\n this.print_token(current_token);\n\n this._output.space_before_token = true;\n return;\n\n case OPERATOR_POSITION.preserve_newline:\n if (!isOtherColon) {\n this.allow_wrap_or_preserved_newline(current_token);\n }\n\n // if we just added a newline, or the current token is : and it's not a ternary statement,\n // then we set space_before to false\n space_before = !(this._output.just_added_newline() || isOtherColon);\n\n this._output.space_before_token = space_before;\n this.print_token(current_token);\n this._output.space_before_token = true;\n return;\n }\n }\n\n if (isGeneratorAsterisk) {\n this.allow_wrap_or_preserved_newline(current_token);\n space_before = false;\n var next_token = this._tokens.peek();\n space_after = next_token && in_array(next_token.type, [TOKEN.WORD, TOKEN.RESERVED]);\n } else if (current_token.text === '...') {\n this.allow_wrap_or_preserved_newline(current_token);\n space_before = this._flags.last_token.type === TOKEN.START_BLOCK;\n space_after = false;\n } else if (in_array(current_token.text, ['--', '++', '!', '~']) || isUnary) {\n // unary operators (and binary +/- pretending to be unary) special cases\n if (this._flags.last_token.type === TOKEN.COMMA || this._flags.last_token.type === TOKEN.START_EXPR) {\n this.allow_wrap_or_preserved_newline(current_token);\n }\n\n space_before = false;\n space_after = false;\n\n // http://www.ecma-international.org/ecma-262/5.1/#sec-7.9.1\n // if there is a newline between -- or ++ and anything else we should preserve it.\n if (current_token.newlines && (current_token.text === '--' || current_token.text === '++' || current_token.text === '~')) {\n var new_line_needed = reserved_array(this._flags.last_token, special_words) && current_token.newlines;\n if (new_line_needed && (this._previous_flags.if_block || this._previous_flags.else_block)) {\n this.restore_mode();\n }\n this.print_newline(new_line_needed, true);\n }\n\n if (this._flags.last_token.text === ';' && is_expression(this._flags.mode)) {\n // for (;; ++i)\n // ^^^\n space_before = true;\n }\n\n if (this._flags.last_token.type === TOKEN.RESERVED) {\n space_before = true;\n } else if (this._flags.last_token.type === TOKEN.END_EXPR) {\n space_before = !(this._flags.last_token.text === ']' && (current_token.text === '--' || current_token.text === '++'));\n } else if (this._flags.last_token.type === TOKEN.OPERATOR) {\n // a++ + ++b;\n // a - -b\n space_before = in_array(current_token.text, ['--', '-', '++', '+']) && in_array(this._flags.last_token.text, ['--', '-', '++', '+']);\n // + and - are not unary when preceeded by -- or ++ operator\n // a-- + b\n // a * +b\n // a - -b\n if (in_array(current_token.text, ['+', '-']) && in_array(this._flags.last_token.text, ['--', '++'])) {\n space_after = true;\n }\n }\n\n\n if (((this._flags.mode === MODE.BlockStatement && !this._flags.inline_frame) || this._flags.mode === MODE.Statement) &&\n (this._flags.last_token.text === '{' || this._flags.last_token.text === ';')) {\n // { foo; --i }\n // foo(); --bar;\n this.print_newline();\n }\n }\n\n this._output.space_before_token = this._output.space_before_token || space_before;\n this.print_token(current_token);\n this._output.space_before_token = space_after;\n};\n\nBeautifier.prototype.handle_block_comment = function(current_token, preserve_statement_flags) {\n if (this._output.raw) {\n this._output.add_raw_token(current_token);\n if (current_token.directives && current_token.directives.preserve === 'end') {\n // If we're testing the raw output behavior, do not allow a directive to turn it off.\n this._output.raw = this._options.test_output_raw;\n }\n return;\n }\n\n if (current_token.directives) {\n this.print_newline(false, preserve_statement_flags);\n this.print_token(current_token);\n if (current_token.directives.preserve === 'start') {\n this._output.raw = true;\n }\n this.print_newline(false, true);\n return;\n }\n\n // inline block\n if (!acorn.newline.test(current_token.text) && !current_token.newlines) {\n this._output.space_before_token = true;\n this.print_token(current_token);\n this._output.space_before_token = true;\n return;\n } else {\n this.print_block_commment(current_token, preserve_statement_flags);\n }\n};\n\nBeautifier.prototype.print_block_commment = function(current_token, preserve_statement_flags) {\n var lines = split_linebreaks(current_token.text);\n var j; // iterator for this case\n var javadoc = false;\n var starless = false;\n var lastIndent = current_token.whitespace_before;\n var lastIndentLength = lastIndent.length;\n\n // block comment starts with a new line\n this.print_newline(false, preserve_statement_flags);\n\n // first line always indented\n this.print_token_line_indentation(current_token);\n this._output.add_token(lines[0]);\n this.print_newline(false, preserve_statement_flags);\n\n\n if (lines.length > 1) {\n lines = lines.slice(1);\n javadoc = all_lines_start_with(lines, '*');\n starless = each_line_matches_indent(lines, lastIndent);\n\n if (javadoc) {\n this._flags.alignment = 1;\n }\n\n for (j = 0; j < lines.length; j++) {\n if (javadoc) {\n // javadoc: reformat and re-indent\n this.print_token_line_indentation(current_token);\n this._output.add_token(ltrim(lines[j]));\n } else if (starless && lines[j]) {\n // starless: re-indent non-empty content, avoiding trim\n this.print_token_line_indentation(current_token);\n this._output.add_token(lines[j].substring(lastIndentLength));\n } else {\n // normal comments output raw\n this._output.current_line.set_indent(-1);\n this._output.add_token(lines[j]);\n }\n\n // for comments on their own line or more than one line, make sure there's a new line after\n this.print_newline(false, preserve_statement_flags);\n }\n\n this._flags.alignment = 0;\n }\n};\n\n\nBeautifier.prototype.handle_comment = function(current_token, preserve_statement_flags) {\n if (current_token.newlines) {\n this.print_newline(false, preserve_statement_flags);\n } else {\n this._output.trim(true);\n }\n\n this._output.space_before_token = true;\n this.print_token(current_token);\n this.print_newline(false, preserve_statement_flags);\n};\n\nBeautifier.prototype.handle_dot = function(current_token) {\n if (this.start_of_statement(current_token)) {\n // The conditional starts the statement if appropriate.\n } else {\n this.handle_whitespace_and_comments(current_token, true);\n }\n\n if (this._flags.last_token.text.match('^[0-9]+$')) {\n this._output.space_before_token = true;\n }\n\n if (reserved_array(this._flags.last_token, special_words)) {\n this._output.space_before_token = false;\n } else {\n // allow preserved newlines before dots in general\n // force newlines on dots after close paren when break_chained - for bar().baz()\n this.allow_wrap_or_preserved_newline(current_token,\n this._flags.last_token.text === ')' && this._options.break_chained_methods);\n }\n\n // Only unindent chained method dot if this dot starts a new line.\n // Otherwise the automatic extra indentation removal will handle the over indent\n if (this._options.unindent_chained_methods && this._output.just_added_newline()) {\n this.deindent();\n }\n\n this.print_token(current_token);\n};\n\nBeautifier.prototype.handle_unknown = function(current_token, preserve_statement_flags) {\n this.print_token(current_token);\n\n if (current_token.text[current_token.text.length - 1] === '\\n') {\n this.print_newline(false, preserve_statement_flags);\n }\n};\n\nBeautifier.prototype.handle_eof = function(current_token) {\n // Unwind any open statements\n while (this._flags.mode === MODE.Statement) {\n this.restore_mode();\n }\n this.handle_whitespace_and_comments(current_token);\n};\n\nmodule.exports.Beautifier = Beautifier;\n", "/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nvar Beautifier = require('./beautifier').Beautifier,\n Options = require('./options').Options;\n\nfunction js_beautify(js_source_text, options) {\n var beautifier = new Beautifier(js_source_text, options);\n return beautifier.beautify();\n}\n\nmodule.exports = js_beautify;\nmodule.exports.defaultOptions = function() {\n return new Options();\n};\n", "/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nvar BaseOptions = require('../core/options').Options;\n\nfunction Options(options) {\n BaseOptions.call(this, options, 'css');\n\n this.selector_separator_newline = this._get_boolean('selector_separator_newline', true);\n this.newline_between_rules = this._get_boolean('newline_between_rules', true);\n var space_around_selector_separator = this._get_boolean('space_around_selector_separator');\n this.space_around_combinator = this._get_boolean('space_around_combinator') || space_around_selector_separator;\n\n var brace_style_split = this._get_selection_list('brace_style', ['collapse', 'expand', 'end-expand', 'none', 'preserve-inline']);\n this.brace_style = 'collapse';\n for (var bs = 0; bs < brace_style_split.length; bs++) {\n if (brace_style_split[bs] !== 'expand') {\n // default to collapse, as only collapse|expand is implemented for now\n this.brace_style = 'collapse';\n } else {\n this.brace_style = brace_style_split[bs];\n }\n }\n}\nOptions.prototype = new BaseOptions();\n\n\n\nmodule.exports.Options = Options;\n", "/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nvar Options = require('./options').Options;\nvar Output = require('../core/output').Output;\nvar InputScanner = require('../core/inputscanner').InputScanner;\nvar Directives = require('../core/directives').Directives;\n\nvar directives_core = new Directives(/\\/\\*/, /\\*\\//);\n\nvar lineBreak = /\\r\\n|[\\r\\n]/;\nvar allLineBreaks = /\\r\\n|[\\r\\n]/g;\n\n// tokenizer\nvar whitespaceChar = /\\s/;\nvar whitespacePattern = /(?:\\s|\\n)+/g;\nvar block_comment_pattern = /\\/\\*(?:[\\s\\S]*?)((?:\\*\\/)|$)/g;\nvar comment_pattern = /\\/\\/(?:[^\\n\\r\\u2028\\u2029]*)/g;\n\nfunction Beautifier(source_text, options) {\n this._source_text = source_text || '';\n // Allow the setting of language/file-type specific options\n // with inheritance of overall settings\n this._options = new Options(options);\n this._ch = null;\n this._input = null;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/At-rule\n this.NESTED_AT_RULE = {\n \"@page\": true,\n \"@font-face\": true,\n \"@keyframes\": true,\n // also in CONDITIONAL_GROUP_RULE below\n \"@media\": true,\n \"@supports\": true,\n \"@document\": true\n };\n this.CONDITIONAL_GROUP_RULE = {\n \"@media\": true,\n \"@supports\": true,\n \"@document\": true\n };\n this.NON_SEMICOLON_NEWLINE_PROPERTY = [\n \"grid-template-areas\",\n \"grid-template\"\n ];\n\n}\n\nBeautifier.prototype.eatString = function(endChars) {\n var result = '';\n this._ch = this._input.next();\n while (this._ch) {\n result += this._ch;\n if (this._ch === \"\\\\\") {\n result += this._input.next();\n } else if (endChars.indexOf(this._ch) !== -1 || this._ch === \"\\n\") {\n break;\n }\n this._ch = this._input.next();\n }\n return result;\n};\n\n// Skips any white space in the source text from the current position.\n// When allowAtLeastOneNewLine is true, will output new lines for each\n// newline character found; if the user has preserve_newlines off, only\n// the first newline will be output\nBeautifier.prototype.eatWhitespace = function(allowAtLeastOneNewLine) {\n var result = whitespaceChar.test(this._input.peek());\n var newline_count = 0;\n while (whitespaceChar.test(this._input.peek())) {\n this._ch = this._input.next();\n if (allowAtLeastOneNewLine && this._ch === '\\n') {\n if (newline_count === 0 || newline_count < this._options.max_preserve_newlines) {\n newline_count++;\n this._output.add_new_line(true);\n }\n }\n }\n return result;\n};\n\n// Nested pseudo-class if we are insideRule\n// and the next special character found opens\n// a new block\nBeautifier.prototype.foundNestedPseudoClass = function() {\n var openParen = 0;\n var i = 1;\n var ch = this._input.peek(i);\n while (ch) {\n if (ch === \"{\") {\n return true;\n } else if (ch === '(') {\n // pseudoclasses can contain ()\n openParen += 1;\n } else if (ch === ')') {\n if (openParen === 0) {\n return false;\n }\n openParen -= 1;\n } else if (ch === \";\" || ch === \"}\") {\n return false;\n }\n i++;\n ch = this._input.peek(i);\n }\n return false;\n};\n\nBeautifier.prototype.print_string = function(output_string) {\n this._output.set_indent(this._indentLevel);\n this._output.non_breaking_space = true;\n this._output.add_token(output_string);\n};\n\nBeautifier.prototype.preserveSingleSpace = function(isAfterSpace) {\n if (isAfterSpace) {\n this._output.space_before_token = true;\n }\n};\n\nBeautifier.prototype.indent = function() {\n this._indentLevel++;\n};\n\nBeautifier.prototype.outdent = function() {\n if (this._indentLevel > 0) {\n this._indentLevel--;\n }\n};\n\n/*_____________________--------------------_____________________*/\n\nBeautifier.prototype.beautify = function() {\n if (this._options.disabled) {\n return this._source_text;\n }\n\n var source_text = this._source_text;\n var eol = this._options.eol;\n if (eol === 'auto') {\n eol = '\\n';\n if (source_text && lineBreak.test(source_text || '')) {\n eol = source_text.match(lineBreak)[0];\n }\n }\n\n\n // HACK: newline parsing inconsistent. This brute force normalizes the this._input.\n source_text = source_text.replace(allLineBreaks, '\\n');\n\n // reset\n var baseIndentString = source_text.match(/^[\\t ]*/)[0];\n\n this._output = new Output(this._options, baseIndentString);\n this._input = new InputScanner(source_text);\n this._indentLevel = 0;\n this._nestedLevel = 0;\n\n this._ch = null;\n var parenLevel = 0;\n\n var insideRule = false;\n // This is the value side of a property value pair (blue in the following ex)\n // label { content: blue }\n var insidePropertyValue = false;\n var enteringConditionalGroup = false;\n var insideAtExtend = false;\n var insideAtImport = false;\n var insideScssMap = false;\n var topCharacter = this._ch;\n var insideNonSemiColonValues = false;\n var whitespace;\n var isAfterSpace;\n var previous_ch;\n\n while (true) {\n whitespace = this._input.read(whitespacePattern);\n isAfterSpace = whitespace !== '';\n previous_ch = topCharacter;\n this._ch = this._input.next();\n if (this._ch === '\\\\' && this._input.hasNext()) {\n this._ch += this._input.next();\n }\n topCharacter = this._ch;\n\n if (!this._ch) {\n break;\n } else if (this._ch === '/' && this._input.peek() === '*') {\n // /* css comment */\n // Always start block comments on a new line.\n // This handles scenarios where a block comment immediately\n // follows a property definition on the same line or where\n // minified code is being beautified.\n this._output.add_new_line();\n this._input.back();\n\n var comment = this._input.read(block_comment_pattern);\n\n // Handle ignore directive\n var directives = directives_core.get_directives(comment);\n if (directives && directives.ignore === 'start') {\n comment += directives_core.readIgnored(this._input);\n }\n\n this.print_string(comment);\n\n // Ensures any new lines following the comment are preserved\n this.eatWhitespace(true);\n\n // Block comments are followed by a new line so they don't\n // share a line with other properties\n this._output.add_new_line();\n } else if (this._ch === '/' && this._input.peek() === '/') {\n // // single line comment\n // Preserves the space before a comment\n // on the same line as a rule\n this._output.space_before_token = true;\n this._input.back();\n this.print_string(this._input.read(comment_pattern));\n\n // Ensures any new lines following the comment are preserved\n this.eatWhitespace(true);\n } else if (this._ch === '@' || this._ch === '$') {\n this.preserveSingleSpace(isAfterSpace);\n\n // deal with less propery mixins @{...}\n if (this._input.peek() === '{') {\n this.print_string(this._ch + this.eatString('}'));\n } else {\n this.print_string(this._ch);\n\n // strip trailing space, if present, for hash property checks\n var variableOrRule = this._input.peekUntilAfter(/[: ,;{}()[\\]\\/='\"]/g);\n\n if (variableOrRule.match(/[ :]$/)) {\n // we have a variable or pseudo-class, add it and insert one space before continuing\n variableOrRule = this.eatString(\": \").replace(/\\s$/, '');\n this.print_string(variableOrRule);\n this._output.space_before_token = true;\n }\n\n variableOrRule = variableOrRule.replace(/\\s$/, '');\n\n if (variableOrRule === 'extend') {\n insideAtExtend = true;\n } else if (variableOrRule === 'import') {\n insideAtImport = true;\n }\n\n // might be a nesting at-rule\n if (variableOrRule in this.NESTED_AT_RULE) {\n this._nestedLevel += 1;\n if (variableOrRule in this.CONDITIONAL_GROUP_RULE) {\n enteringConditionalGroup = true;\n }\n // might be less variable\n } else if (!insideRule && parenLevel === 0 && variableOrRule.indexOf(':') !== -1) {\n insidePropertyValue = true;\n this.indent();\n }\n }\n } else if (this._ch === '#' && this._input.peek() === '{') {\n this.preserveSingleSpace(isAfterSpace);\n this.print_string(this._ch + this.eatString('}'));\n } else if (this._ch === '{') {\n if (insidePropertyValue) {\n insidePropertyValue = false;\n this.outdent();\n }\n\n // when entering conditional groups, only rulesets are allowed\n if (enteringConditionalGroup) {\n enteringConditionalGroup = false;\n insideRule = (this._indentLevel >= this._nestedLevel);\n } else {\n // otherwise, declarations are also allowed\n insideRule = (this._indentLevel >= this._nestedLevel - 1);\n }\n if (this._options.newline_between_rules && insideRule) {\n if (this._output.previous_line && this._output.previous_line.item(-1) !== '{') {\n this._output.ensure_empty_line_above('/', ',');\n }\n }\n\n this._output.space_before_token = true;\n\n // The difference in print_string and indent order is necessary to indent the '{' correctly\n if (this._options.brace_style === 'expand') {\n this._output.add_new_line();\n this.print_string(this._ch);\n this.indent();\n this._output.set_indent(this._indentLevel);\n } else {\n // inside mixin and first param is object\n if (previous_ch === '(') {\n this._output.space_before_token = false;\n } else if (previous_ch !== ',') {\n this.indent();\n }\n this.print_string(this._ch);\n }\n\n this.eatWhitespace(true);\n this._output.add_new_line();\n } else if (this._ch === '}') {\n this.outdent();\n this._output.add_new_line();\n if (previous_ch === '{') {\n this._output.trim(true);\n }\n insideAtImport = false;\n insideAtExtend = false;\n if (insidePropertyValue) {\n this.outdent();\n insidePropertyValue = false;\n }\n this.print_string(this._ch);\n insideRule = false;\n if (this._nestedLevel) {\n this._nestedLevel--;\n }\n\n this.eatWhitespace(true);\n this._output.add_new_line();\n\n if (this._options.newline_between_rules && !this._output.just_added_blankline()) {\n if (this._input.peek() !== '}') {\n this._output.add_new_line(true);\n }\n }\n if (this._input.peek() === ')') {\n this._output.trim(true);\n if (this._options.brace_style === \"expand\") {\n this._output.add_new_line(true);\n }\n }\n } else if (this._ch === \":\") {\n\n for (var i = 0; i < this.NON_SEMICOLON_NEWLINE_PROPERTY.length; i++) {\n if (this._input.lookBack(this.NON_SEMICOLON_NEWLINE_PROPERTY[i])) {\n insideNonSemiColonValues = true;\n break;\n }\n }\n\n if ((insideRule || enteringConditionalGroup) && !(this._input.lookBack(\"&\") || this.foundNestedPseudoClass()) && !this._input.lookBack(\"(\") && !insideAtExtend && parenLevel === 0) {\n // 'property: value' delimiter\n // which could be in a conditional group query\n this.print_string(':');\n if (!insidePropertyValue) {\n insidePropertyValue = true;\n this._output.space_before_token = true;\n this.eatWhitespace(true);\n this.indent();\n }\n } else {\n // sass/less parent reference don't use a space\n // sass nested pseudo-class don't use a space\n\n // preserve space before pseudoclasses/pseudoelements, as it means \"in any child\"\n if (this._input.lookBack(\" \")) {\n this._output.space_before_token = true;\n }\n if (this._input.peek() === \":\") {\n // pseudo-element\n this._ch = this._input.next();\n this.print_string(\"::\");\n } else {\n // pseudo-class\n this.print_string(':');\n }\n }\n } else if (this._ch === '\"' || this._ch === '\\'') {\n var preserveQuoteSpace = previous_ch === '\"' || previous_ch === '\\'';\n this.preserveSingleSpace(preserveQuoteSpace || isAfterSpace);\n this.print_string(this._ch + this.eatString(this._ch));\n this.eatWhitespace(true);\n } else if (this._ch === ';') {\n insideNonSemiColonValues = false;\n if (parenLevel === 0) {\n if (insidePropertyValue) {\n this.outdent();\n insidePropertyValue = false;\n }\n insideAtExtend = false;\n insideAtImport = false;\n this.print_string(this._ch);\n this.eatWhitespace(true);\n\n // This maintains single line comments on the same\n // line. Block comments are also affected, but\n // a new line is always output before one inside\n // that section\n if (this._input.peek() !== '/') {\n this._output.add_new_line();\n }\n } else {\n this.print_string(this._ch);\n this.eatWhitespace(true);\n this._output.space_before_token = true;\n }\n } else if (this._ch === '(') { // may be a url\n if (this._input.lookBack(\"url\")) {\n this.print_string(this._ch);\n this.eatWhitespace();\n parenLevel++;\n this.indent();\n this._ch = this._input.next();\n if (this._ch === ')' || this._ch === '\"' || this._ch === '\\'') {\n this._input.back();\n } else if (this._ch) {\n this.print_string(this._ch + this.eatString(')'));\n if (parenLevel) {\n parenLevel--;\n this.outdent();\n }\n }\n } else {\n var space_needed = false;\n if (this._input.lookBack(\"with\")) {\n // look back is not an accurate solution, we need tokens to confirm without whitespaces\n space_needed = true;\n }\n this.preserveSingleSpace(isAfterSpace || space_needed);\n this.print_string(this._ch);\n\n // handle scss/sass map\n if (insidePropertyValue && previous_ch === \"$\" && this._options.selector_separator_newline) {\n this._output.add_new_line();\n insideScssMap = true;\n } else {\n this.eatWhitespace();\n parenLevel++;\n this.indent();\n }\n }\n } else if (this._ch === ')') {\n if (parenLevel) {\n parenLevel--;\n this.outdent();\n }\n if (insideScssMap && this._input.peek() === \";\" && this._options.selector_separator_newline) {\n insideScssMap = false;\n this.outdent();\n this._output.add_new_line();\n }\n this.print_string(this._ch);\n } else if (this._ch === ',') {\n this.print_string(this._ch);\n this.eatWhitespace(true);\n if (this._options.selector_separator_newline && (!insidePropertyValue || insideScssMap) && parenLevel === 0 && !insideAtImport && !insideAtExtend) {\n this._output.add_new_line();\n } else {\n this._output.space_before_token = true;\n }\n } else if ((this._ch === '>' || this._ch === '+' || this._ch === '~') && !insidePropertyValue && parenLevel === 0) {\n //handle combinator spacing\n if (this._options.space_around_combinator) {\n this._output.space_before_token = true;\n this.print_string(this._ch);\n this._output.space_before_token = true;\n } else {\n this.print_string(this._ch);\n this.eatWhitespace();\n // squash extra whitespace\n if (this._ch && whitespaceChar.test(this._ch)) {\n this._ch = '';\n }\n }\n } else if (this._ch === ']') {\n this.print_string(this._ch);\n } else if (this._ch === '[') {\n this.preserveSingleSpace(isAfterSpace);\n this.print_string(this._ch);\n } else if (this._ch === '=') { // no whitespace before or after\n this.eatWhitespace();\n this.print_string('=');\n if (whitespaceChar.test(this._ch)) {\n this._ch = '';\n }\n } else if (this._ch === '!' && !this._input.lookBack(\"\\\\\")) { // !important\n this._output.space_before_token = true;\n this.print_string(this._ch);\n } else {\n var preserveAfterSpace = previous_ch === '\"' || previous_ch === '\\'';\n this.preserveSingleSpace(preserveAfterSpace || isAfterSpace);\n this.print_string(this._ch);\n\n if (!this._output.just_added_newline() && this._input.peek() === '\\n' && insideNonSemiColonValues) {\n this._output.add_new_line();\n }\n }\n }\n\n var sweetCode = this._output.get_code(eol);\n\n return sweetCode;\n};\n\nmodule.exports.Beautifier = Beautifier;\n", "/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nvar Beautifier = require('./beautifier').Beautifier,\n Options = require('./options').Options;\n\nfunction css_beautify(source_text, options) {\n var beautifier = new Beautifier(source_text, options);\n return beautifier.beautify();\n}\n\nmodule.exports = css_beautify;\nmodule.exports.defaultOptions = function() {\n return new Options();\n};\n", "/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nvar BaseOptions = require('../core/options').Options;\n\nfunction Options(options) {\n BaseOptions.call(this, options, 'html');\n if (this.templating.length === 1 && this.templating[0] === 'auto') {\n this.templating = ['django', 'erb', 'handlebars', 'php'];\n }\n\n this.indent_inner_html = this._get_boolean('indent_inner_html');\n this.indent_body_inner_html = this._get_boolean('indent_body_inner_html', true);\n this.indent_head_inner_html = this._get_boolean('indent_head_inner_html', true);\n\n this.indent_handlebars = this._get_boolean('indent_handlebars', true);\n this.wrap_attributes = this._get_selection('wrap_attributes',\n ['auto', 'force', 'force-aligned', 'force-expand-multiline', 'aligned-multiple', 'preserve', 'preserve-aligned']);\n this.wrap_attributes_indent_size = this._get_number('wrap_attributes_indent_size', this.indent_size);\n this.extra_liners = this._get_array('extra_liners', ['head', 'body', '/html']);\n\n // Block vs inline elements\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Inline_elements\n // https://www.w3.org/TR/html5/dom.html#phrasing-content\n this.inline = this._get_array('inline', [\n 'a', 'abbr', 'area', 'audio', 'b', 'bdi', 'bdo', 'br', 'button', 'canvas', 'cite',\n 'code', 'data', 'datalist', 'del', 'dfn', 'em', 'embed', 'i', 'iframe', 'img',\n 'input', 'ins', 'kbd', 'keygen', 'label', 'map', 'mark', 'math', 'meter', 'noscript',\n 'object', 'output', 'progress', 'q', 'ruby', 's', 'samp', /* 'script', */ 'select', 'small',\n 'span', 'strong', 'sub', 'sup', 'svg', 'template', 'textarea', 'time', 'u', 'var',\n 'video', 'wbr', 'text',\n // obsolete inline tags\n 'acronym', 'big', 'strike', 'tt'\n ]);\n this.void_elements = this._get_array('void_elements', [\n // HTLM void elements - aka self-closing tags - aka singletons\n // https://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen',\n 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr',\n // NOTE: Optional tags are too complex for a simple list\n // they are hard coded in _do_optional_end_element\n\n // Doctype and xml elements\n '!doctype', '?xml',\n\n // obsolete tags\n // basefont: https://www.computerhope.com/jargon/h/html-basefont-tag.htm\n // isndex: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/isindex\n 'basefont', 'isindex'\n ]);\n this.unformatted = this._get_array('unformatted', []);\n this.content_unformatted = this._get_array('content_unformatted', [\n 'pre', 'textarea'\n ]);\n this.unformatted_content_delimiter = this._get_characters('unformatted_content_delimiter');\n this.indent_scripts = this._get_selection('indent_scripts', ['normal', 'keep', 'separate']);\n\n}\nOptions.prototype = new BaseOptions();\n\n\n\nmodule.exports.Options = Options;\n", "/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nvar BaseTokenizer = require('../core/tokenizer').Tokenizer;\nvar BASETOKEN = require('../core/tokenizer').TOKEN;\nvar Directives = require('../core/directives').Directives;\nvar TemplatablePattern = require('../core/templatablepattern').TemplatablePattern;\nvar Pattern = require('../core/pattern').Pattern;\n\nvar TOKEN = {\n TAG_OPEN: 'TK_TAG_OPEN',\n TAG_CLOSE: 'TK_TAG_CLOSE',\n ATTRIBUTE: 'TK_ATTRIBUTE',\n EQUALS: 'TK_EQUALS',\n VALUE: 'TK_VALUE',\n COMMENT: 'TK_COMMENT',\n TEXT: 'TK_TEXT',\n UNKNOWN: 'TK_UNKNOWN',\n START: BASETOKEN.START,\n RAW: BASETOKEN.RAW,\n EOF: BASETOKEN.EOF\n};\n\nvar directives_core = new Directives(/<\\!--/, /-->/);\n\nvar Tokenizer = function(input_string, options) {\n BaseTokenizer.call(this, input_string, options);\n this._current_tag_name = '';\n\n // Words end at whitespace or when a tag starts\n // if we are indenting handlebars, they are considered tags\n var templatable_reader = new TemplatablePattern(this._input).read_options(this._options);\n var pattern_reader = new Pattern(this._input);\n\n this.__patterns = {\n word: templatable_reader.until(/[\\n\\r\\t <]/),\n single_quote: templatable_reader.until_after(/'/),\n double_quote: templatable_reader.until_after(/\"/),\n attribute: templatable_reader.until(/[\\n\\r\\t =>]|\\/>/),\n element_name: templatable_reader.until(/[\\n\\r\\t >\\/]/),\n\n handlebars_comment: pattern_reader.starting_with(/{{!--/).until_after(/--}}/),\n handlebars: pattern_reader.starting_with(/{{/).until_after(/}}/),\n handlebars_open: pattern_reader.until(/[\\n\\r\\t }]/),\n handlebars_raw_close: pattern_reader.until(/}}/),\n comment: pattern_reader.starting_with(/<!--/).until_after(/-->/),\n cdata: pattern_reader.starting_with(/<!\\[CDATA\\[/).until_after(/]]>/),\n // https://en.wikipedia.org/wiki/Conditional_comment\n conditional_comment: pattern_reader.starting_with(/<!\\[/).until_after(/]>/),\n processing: pattern_reader.starting_with(/<\\?/).until_after(/\\?>/)\n };\n\n if (this._options.indent_handlebars) {\n this.__patterns.word = this.__patterns.word.exclude('handlebars');\n }\n\n this._unformatted_content_delimiter = null;\n\n if (this._options.unformatted_content_delimiter) {\n var literal_regexp = this._input.get_literal_regexp(this._options.unformatted_content_delimiter);\n this.__patterns.unformatted_content_delimiter =\n pattern_reader.matching(literal_regexp)\n .until_after(literal_regexp);\n }\n};\nTokenizer.prototype = new BaseTokenizer();\n\nTokenizer.prototype._is_comment = function(current_token) { // jshint unused:false\n return false; //current_token.type === TOKEN.COMMENT || current_token.type === TOKEN.UNKNOWN;\n};\n\nTokenizer.prototype._is_opening = function(current_token) {\n return current_token.type === TOKEN.TAG_OPEN;\n};\n\nTokenizer.prototype._is_closing = function(current_token, open_token) {\n return current_token.type === TOKEN.TAG_CLOSE &&\n (open_token && (\n ((current_token.text === '>' || current_token.text === '/>') && open_token.text[0] === '<') ||\n (current_token.text === '}}' && open_token.text[0] === '{' && open_token.text[1] === '{')));\n};\n\nTokenizer.prototype._reset = function() {\n this._current_tag_name = '';\n};\n\nTokenizer.prototype._get_next_token = function(previous_token, open_token) { // jshint unused:false\n var token = null;\n this._readWhitespace();\n var c = this._input.peek();\n\n if (c === null) {\n return this._create_token(TOKEN.EOF, '');\n }\n\n token = token || this._read_open_handlebars(c, open_token);\n token = token || this._read_attribute(c, previous_token, open_token);\n token = token || this._read_close(c, open_token);\n token = token || this._read_raw_content(c, previous_token, open_token);\n token = token || this._read_content_word(c);\n token = token || this._read_comment_or_cdata(c);\n token = token || this._read_processing(c);\n token = token || this._read_open(c, open_token);\n token = token || this._create_token(TOKEN.UNKNOWN, this._input.next());\n\n return token;\n};\n\nTokenizer.prototype._read_comment_or_cdata = function(c) { // jshint unused:false\n var token = null;\n var resulting_string = null;\n var directives = null;\n\n if (c === '<') {\n var peek1 = this._input.peek(1);\n // We treat all comments as literals, even more than preformatted tags\n // we only look for the appropriate closing marker\n if (peek1 === '!') {\n resulting_string = this.__patterns.comment.read();\n\n // only process directive on html comments\n if (resulting_string) {\n directives = directives_core.get_directives(resulting_string);\n if (directives && directives.ignore === 'start') {\n resulting_string += directives_core.readIgnored(this._input);\n }\n } else {\n resulting_string = this.__patterns.cdata.read();\n }\n }\n\n if (resulting_string) {\n token = this._create_token(TOKEN.COMMENT, resulting_string);\n token.directives = directives;\n }\n }\n\n return token;\n};\n\nTokenizer.prototype._read_processing = function(c) { // jshint unused:false\n var token = null;\n var resulting_string = null;\n var directives = null;\n\n if (c === '<') {\n var peek1 = this._input.peek(1);\n if (peek1 === '!' || peek1 === '?') {\n resulting_string = this.__patterns.conditional_comment.read();\n resulting_string = resulting_string || this.__patterns.processing.read();\n }\n\n if (resulting_string) {\n token = this._create_token(TOKEN.COMMENT, resulting_string);\n token.directives = directives;\n }\n }\n\n return token;\n};\n\nTokenizer.prototype._read_open = function(c, open_token) {\n var resulting_string = null;\n var token = null;\n if (!open_token) {\n if (c === '<') {\n\n resulting_string = this._input.next();\n if (this._input.peek() === '/') {\n resulting_string += this._input.next();\n }\n resulting_string += this.__patterns.element_name.read();\n token = this._create_token(TOKEN.TAG_OPEN, resulting_string);\n }\n }\n return token;\n};\n\nTokenizer.prototype._read_open_handlebars = function(c, open_token) {\n var resulting_string = null;\n var token = null;\n if (!open_token) {\n if (this._options.indent_handlebars && c === '{' && this._input.peek(1) === '{') {\n if (this._input.peek(2) === '!') {\n resulting_string = this.__patterns.handlebars_comment.read();\n resulting_string = resulting_string || this.__patterns.handlebars.read();\n token = this._create_token(TOKEN.COMMENT, resulting_string);\n } else {\n resulting_string = this.__patterns.handlebars_open.read();\n token = this._create_token(TOKEN.TAG_OPEN, resulting_string);\n }\n }\n }\n return token;\n};\n\n\nTokenizer.prototype._read_close = function(c, open_token) {\n var resulting_string = null;\n var token = null;\n if (open_token) {\n if (open_token.text[0] === '<' && (c === '>' || (c === '/' && this._input.peek(1) === '>'))) {\n resulting_string = this._input.next();\n if (c === '/') { // for close tag \"/>\"\n resulting_string += this._input.next();\n }\n token = this._create_token(TOKEN.TAG_CLOSE, resulting_string);\n } else if (open_token.text[0] === '{' && c === '}' && this._input.peek(1) === '}') {\n this._input.next();\n this._input.next();\n token = this._create_token(TOKEN.TAG_CLOSE, '}}');\n }\n }\n\n return token;\n};\n\nTokenizer.prototype._read_attribute = function(c, previous_token, open_token) {\n var token = null;\n var resulting_string = '';\n if (open_token && open_token.text[0] === '<') {\n\n if (c === '=') {\n token = this._create_token(TOKEN.EQUALS, this._input.next());\n } else if (c === '\"' || c === \"'\") {\n var content = this._input.next();\n if (c === '\"') {\n content += this.__patterns.double_quote.read();\n } else {\n content += this.__patterns.single_quote.read();\n }\n token = this._create_token(TOKEN.VALUE, content);\n } else {\n resulting_string = this.__patterns.attribute.read();\n\n if (resulting_string) {\n if (previous_token.type === TOKEN.EQUALS) {\n token = this._create_token(TOKEN.VALUE, resulting_string);\n } else {\n token = this._create_token(TOKEN.ATTRIBUTE, resulting_string);\n }\n }\n }\n }\n return token;\n};\n\nTokenizer.prototype._is_content_unformatted = function(tag_name) {\n // void_elements have no content and so cannot have unformatted content\n // script and style tags should always be read as unformatted content\n // finally content_unformatted and unformatted element contents are unformatted\n return this._options.void_elements.indexOf(tag_name) === -1 &&\n (this._options.content_unformatted.indexOf(tag_name) !== -1 ||\n this._options.unformatted.indexOf(tag_name) !== -1);\n};\n\n\nTokenizer.prototype._read_raw_content = function(c, previous_token, open_token) { // jshint unused:false\n var resulting_string = '';\n if (open_token && open_token.text[0] === '{') {\n resulting_string = this.__patterns.handlebars_raw_close.read();\n } else if (previous_token.type === TOKEN.TAG_CLOSE &&\n previous_token.opened.text[0] === '<' && previous_token.text[0] !== '/') {\n // ^^ empty tag has no content \n var tag_name = previous_token.opened.text.substr(1).toLowerCase();\n if (tag_name === 'script' || tag_name === 'style') {\n // Script and style tags are allowed to have comments wrapping their content\n // or just have regular content.\n var token = this._read_comment_or_cdata(c);\n if (token) {\n token.type = TOKEN.TEXT;\n return token;\n }\n resulting_string = this._input.readUntil(new RegExp('</' + tag_name + '[\\\\n\\\\r\\\\t ]*?>', 'ig'));\n } else if (this._is_content_unformatted(tag_name)) {\n\n resulting_string = this._input.readUntil(new RegExp('</' + tag_name + '[\\\\n\\\\r\\\\t ]*?>', 'ig'));\n }\n }\n\n if (resulting_string) {\n return this._create_token(TOKEN.TEXT, resulting_string);\n }\n\n return null;\n};\n\nTokenizer.prototype._read_content_word = function(c) {\n var resulting_string = '';\n if (this._options.unformatted_content_delimiter) {\n if (c === this._options.unformatted_content_delimiter[0]) {\n resulting_string = this.__patterns.unformatted_content_delimiter.read();\n }\n }\n\n if (!resulting_string) {\n resulting_string = this.__patterns.word.read();\n }\n if (resulting_string) {\n return this._create_token(TOKEN.TEXT, resulting_string);\n }\n};\n\nmodule.exports.Tokenizer = Tokenizer;\nmodule.exports.TOKEN = TOKEN;\n", "/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nvar Options = require('../html/options').Options;\nvar Output = require('../core/output').Output;\nvar Tokenizer = require('../html/tokenizer').Tokenizer;\nvar TOKEN = require('../html/tokenizer').TOKEN;\n\nvar lineBreak = /\\r\\n|[\\r\\n]/;\nvar allLineBreaks = /\\r\\n|[\\r\\n]/g;\n\nvar Printer = function(options, base_indent_string) { //handles input/output and some other printing functions\n\n this.indent_level = 0;\n this.alignment_size = 0;\n this.max_preserve_newlines = options.max_preserve_newlines;\n this.preserve_newlines = options.preserve_newlines;\n\n this._output = new Output(options, base_indent_string);\n\n};\n\nPrinter.prototype.current_line_has_match = function(pattern) {\n return this._output.current_line.has_match(pattern);\n};\n\nPrinter.prototype.set_space_before_token = function(value, non_breaking) {\n this._output.space_before_token = value;\n this._output.non_breaking_space = non_breaking;\n};\n\nPrinter.prototype.set_wrap_point = function() {\n this._output.set_indent(this.indent_level, this.alignment_size);\n this._output.set_wrap_point();\n};\n\n\nPrinter.prototype.add_raw_token = function(token) {\n this._output.add_raw_token(token);\n};\n\nPrinter.prototype.print_preserved_newlines = function(raw_token) {\n var newlines = 0;\n if (raw_token.type !== TOKEN.TEXT && raw_token.previous.type !== TOKEN.TEXT) {\n newlines = raw_token.newlines ? 1 : 0;\n }\n\n if (this.preserve_newlines) {\n newlines = raw_token.newlines < this.max_preserve_newlines + 1 ? raw_token.newlines : this.max_preserve_newlines + 1;\n }\n for (var n = 0; n < newlines; n++) {\n this.print_newline(n > 0);\n }\n\n return newlines !== 0;\n};\n\nPrinter.prototype.traverse_whitespace = function(raw_token) {\n if (raw_token.whitespace_before || raw_token.newlines) {\n if (!this.print_preserved_newlines(raw_token)) {\n this._output.space_before_token = true;\n }\n return true;\n }\n return false;\n};\n\nPrinter.prototype.previous_token_wrapped = function() {\n return this._output.previous_token_wrapped;\n};\n\nPrinter.prototype.print_newline = function(force) {\n this._output.add_new_line(force);\n};\n\nPrinter.prototype.print_token = function(token) {\n if (token.text) {\n this._output.set_indent(this.indent_level, this.alignment_size);\n this._output.add_token(token.text);\n }\n};\n\nPrinter.prototype.indent = function() {\n this.indent_level++;\n};\n\nPrinter.prototype.get_full_indent = function(level) {\n level = this.indent_level + (level || 0);\n if (level < 1) {\n return '';\n }\n\n return this._output.get_indent_string(level);\n};\n\nvar get_type_attribute = function(start_token) {\n var result = null;\n var raw_token = start_token.next;\n\n // Search attributes for a type attribute\n while (raw_token.type !== TOKEN.EOF && start_token.closed !== raw_token) {\n if (raw_token.type === TOKEN.ATTRIBUTE && raw_token.text === 'type') {\n if (raw_token.next && raw_token.next.type === TOKEN.EQUALS &&\n raw_token.next.next && raw_token.next.next.type === TOKEN.VALUE) {\n result = raw_token.next.next.text;\n }\n break;\n }\n raw_token = raw_token.next;\n }\n\n return result;\n};\n\nvar get_custom_beautifier_name = function(tag_check, raw_token) {\n var typeAttribute = null;\n var result = null;\n\n if (!raw_token.closed) {\n return null;\n }\n\n if (tag_check === 'script') {\n typeAttribute = 'text/javascript';\n } else if (tag_check === 'style') {\n typeAttribute = 'text/css';\n }\n\n typeAttribute = get_type_attribute(raw_token) || typeAttribute;\n\n // For script and style tags that have a type attribute, only enable custom beautifiers for matching values\n // For those without a type attribute use default;\n if (typeAttribute.search('text/css') > -1) {\n result = 'css';\n } else if (typeAttribute.search(/module|((text|application|dojo)\\/(x-)?(javascript|ecmascript|jscript|livescript|(ld\\+)?json|method|aspect))/) > -1) {\n result = 'javascript';\n } else if (typeAttribute.search(/(text|application|dojo)\\/(x-)?(html)/) > -1) {\n result = 'html';\n } else if (typeAttribute.search(/test\\/null/) > -1) {\n // Test only mime-type for testing the beautifier when null is passed as beautifing function\n result = 'null';\n }\n\n return result;\n};\n\nfunction in_array(what, arr) {\n return arr.indexOf(what) !== -1;\n}\n\nfunction TagFrame(parent, parser_token, indent_level) {\n this.parent = parent || null;\n this.tag = parser_token ? parser_token.tag_name : '';\n this.indent_level = indent_level || 0;\n this.parser_token = parser_token || null;\n}\n\nfunction TagStack(printer) {\n this._printer = printer;\n this._current_frame = null;\n}\n\nTagStack.prototype.get_parser_token = function() {\n return this._current_frame ? this._current_frame.parser_token : null;\n};\n\nTagStack.prototype.record_tag = function(parser_token) { //function to record a tag and its parent in this.tags Object\n var new_frame = new TagFrame(this._current_frame, parser_token, this._printer.indent_level);\n this._current_frame = new_frame;\n};\n\nTagStack.prototype._try_pop_frame = function(frame) { //function to retrieve the opening tag to the corresponding closer\n var parser_token = null;\n\n if (frame) {\n parser_token = frame.parser_token;\n this._printer.indent_level = frame.indent_level;\n this._current_frame = frame.parent;\n }\n\n return parser_token;\n};\n\nTagStack.prototype._get_frame = function(tag_list, stop_list) { //function to retrieve the opening tag to the corresponding closer\n var frame = this._current_frame;\n\n while (frame) { //till we reach '' (the initial value);\n if (tag_list.indexOf(frame.tag) !== -1) { //if this is it use it\n break;\n } else if (stop_list && stop_list.indexOf(frame.tag) !== -1) {\n frame = null;\n break;\n }\n frame = frame.parent;\n }\n\n return frame;\n};\n\nTagStack.prototype.try_pop = function(tag, stop_list) { //function to retrieve the opening tag to the corresponding closer\n var frame = this._get_frame([tag], stop_list);\n return this._try_pop_frame(frame);\n};\n\nTagStack.prototype.indent_to_tag = function(tag_list) {\n var frame = this._get_frame(tag_list);\n if (frame) {\n this._printer.indent_level = frame.indent_level;\n }\n};\n\nfunction Beautifier(source_text, options, js_beautify, css_beautify) {\n //Wrapper function to invoke all the necessary constructors and deal with the output.\n this._source_text = source_text || '';\n options = options || {};\n this._js_beautify = js_beautify;\n this._css_beautify = css_beautify;\n this._tag_stack = null;\n\n // Allow the setting of language/file-type specific options\n // with inheritance of overall settings\n var optionHtml = new Options(options, 'html');\n\n this._options = optionHtml;\n\n this._is_wrap_attributes_force = this._options.wrap_attributes.substr(0, 'force'.length) === 'force';\n this._is_wrap_attributes_force_expand_multiline = (this._options.wrap_attributes === 'force-expand-multiline');\n this._is_wrap_attributes_force_aligned = (this._options.wrap_attributes === 'force-aligned');\n this._is_wrap_attributes_aligned_multiple = (this._options.wrap_attributes === 'aligned-multiple');\n this._is_wrap_attributes_preserve = this._options.wrap_attributes.substr(0, 'preserve'.length) === 'preserve';\n this._is_wrap_attributes_preserve_aligned = (this._options.wrap_attributes === 'preserve-aligned');\n}\n\nBeautifier.prototype.beautify = function() {\n\n // if disabled, return the input unchanged.\n if (this._options.disabled) {\n return this._source_text;\n }\n\n var source_text = this._source_text;\n var eol = this._options.eol;\n if (this._options.eol === 'auto') {\n eol = '\\n';\n if (source_text && lineBreak.test(source_text)) {\n eol = source_text.match(lineBreak)[0];\n }\n }\n\n // HACK: newline parsing inconsistent. This brute force normalizes the input.\n source_text = source_text.replace(allLineBreaks, '\\n');\n\n var baseIndentString = source_text.match(/^[\\t ]*/)[0];\n\n var last_token = {\n text: '',\n type: ''\n };\n\n var last_tag_token = new TagOpenParserToken();\n\n var printer = new Printer(this._options, baseIndentString);\n var tokens = new Tokenizer(source_text, this._options).tokenize();\n\n this._tag_stack = new TagStack(printer);\n\n var parser_token = null;\n var raw_token = tokens.next();\n while (raw_token.type !== TOKEN.EOF) {\n\n if (raw_token.type === TOKEN.TAG_OPEN || raw_token.type === TOKEN.COMMENT) {\n parser_token = this._handle_tag_open(printer, raw_token, last_tag_token, last_token);\n last_tag_token = parser_token;\n } else if ((raw_token.type === TOKEN.ATTRIBUTE || raw_token.type === TOKEN.EQUALS || raw_token.type === TOKEN.VALUE) ||\n (raw_token.type === TOKEN.TEXT && !last_tag_token.tag_complete)) {\n parser_token = this._handle_inside_tag(printer, raw_token, last_tag_token, tokens);\n } else if (raw_token.type === TOKEN.TAG_CLOSE) {\n parser_token = this._handle_tag_close(printer, raw_token, last_tag_token);\n } else if (raw_token.type === TOKEN.TEXT) {\n parser_token = this._handle_text(printer, raw_token, last_tag_token);\n } else {\n // This should never happen, but if it does. Print the raw token\n printer.add_raw_token(raw_token);\n }\n\n last_token = parser_token;\n\n raw_token = tokens.next();\n }\n var sweet_code = printer._output.get_code(eol);\n\n return sweet_code;\n};\n\nBeautifier.prototype._handle_tag_close = function(printer, raw_token, last_tag_token) {\n var parser_token = {\n text: raw_token.text,\n type: raw_token.type\n };\n printer.alignment_size = 0;\n last_tag_token.tag_complete = true;\n\n printer.set_space_before_token(raw_token.newlines || raw_token.whitespace_before !== '', true);\n if (last_tag_token.is_unformatted) {\n printer.add_raw_token(raw_token);\n } else {\n if (last_tag_token.tag_start_char === '<') {\n printer.set_space_before_token(raw_token.text[0] === '/', true); // space before />, no space before >\n if (this._is_wrap_attributes_force_expand_multiline && last_tag_token.has_wrapped_attrs) {\n printer.print_newline(false);\n }\n }\n printer.print_token(raw_token);\n\n }\n\n if (last_tag_token.indent_content &&\n !(last_tag_token.is_unformatted || last_tag_token.is_content_unformatted)) {\n printer.indent();\n\n // only indent once per opened tag\n last_tag_token.indent_content = false;\n }\n\n if (!last_tag_token.is_inline_element &&\n !(last_tag_token.is_unformatted || last_tag_token.is_content_unformatted)) {\n printer.set_wrap_point();\n }\n\n return parser_token;\n};\n\nBeautifier.prototype._handle_inside_tag = function(printer, raw_token, last_tag_token, tokens) {\n var wrapped = last_tag_token.has_wrapped_attrs;\n var parser_token = {\n text: raw_token.text,\n type: raw_token.type\n };\n\n printer.set_space_before_token(raw_token.newlines || raw_token.whitespace_before !== '', true);\n if (last_tag_token.is_unformatted) {\n printer.add_raw_token(raw_token);\n } else if (last_tag_token.tag_start_char === '{' && raw_token.type === TOKEN.TEXT) {\n // For the insides of handlebars allow newlines or a single space between open and contents\n if (printer.print_preserved_newlines(raw_token)) {\n raw_token.newlines = 0;\n printer.add_raw_token(raw_token);\n } else {\n printer.print_token(raw_token);\n }\n } else {\n if (raw_token.type === TOKEN.ATTRIBUTE) {\n printer.set_space_before_token(true);\n last_tag_token.attr_count += 1;\n } else if (raw_token.type === TOKEN.EQUALS) { //no space before =\n printer.set_space_before_token(false);\n } else if (raw_token.type === TOKEN.VALUE && raw_token.previous.type === TOKEN.EQUALS) { //no space before value\n printer.set_space_before_token(false);\n }\n\n if (raw_token.type === TOKEN.ATTRIBUTE && last_tag_token.tag_start_char === '<') {\n if (this._is_wrap_attributes_preserve || this._is_wrap_attributes_preserve_aligned) {\n printer.traverse_whitespace(raw_token);\n wrapped = wrapped || raw_token.newlines !== 0;\n }\n\n\n if (this._is_wrap_attributes_force) {\n var force_attr_wrap = last_tag_token.attr_count > 1;\n if (this._is_wrap_attributes_force_expand_multiline && last_tag_token.attr_count === 1) {\n var is_only_attribute = true;\n var peek_index = 0;\n var peek_token;\n do {\n peek_token = tokens.peek(peek_index);\n if (peek_token.type === TOKEN.ATTRIBUTE) {\n is_only_attribute = false;\n break;\n }\n peek_index += 1;\n } while (peek_index < 4 && peek_token.type !== TOKEN.EOF && peek_token.type !== TOKEN.TAG_CLOSE);\n\n force_attr_wrap = !is_only_attribute;\n }\n\n if (force_attr_wrap) {\n printer.print_newline(false);\n wrapped = true;\n }\n }\n }\n printer.print_token(raw_token);\n wrapped = wrapped || printer.previous_token_wrapped();\n last_tag_token.has_wrapped_attrs = wrapped;\n }\n return parser_token;\n};\n\nBeautifier.prototype._handle_text = function(printer, raw_token, last_tag_token) {\n var parser_token = {\n text: raw_token.text,\n type: 'TK_CONTENT'\n };\n if (last_tag_token.custom_beautifier_name) { //check if we need to format javascript\n this._print_custom_beatifier_text(printer, raw_token, last_tag_token);\n } else if (last_tag_token.is_unformatted || last_tag_token.is_content_unformatted) {\n printer.add_raw_token(raw_token);\n } else {\n printer.traverse_whitespace(raw_token);\n printer.print_token(raw_token);\n }\n return parser_token;\n};\n\nBeautifier.prototype._print_custom_beatifier_text = function(printer, raw_token, last_tag_token) {\n var local = this;\n if (raw_token.text !== '') {\n\n var text = raw_token.text,\n _beautifier,\n script_indent_level = 1,\n pre = '',\n post = '';\n if (last_tag_token.custom_beautifier_name === 'javascript' && typeof this._js_beautify === 'function') {\n _beautifier = this._js_beautify;\n } else if (last_tag_token.custom_beautifier_name === 'css' && typeof this._css_beautify === 'function') {\n _beautifier = this._css_beautify;\n } else if (last_tag_token.custom_beautifier_name === 'html') {\n _beautifier = function(html_source, options) {\n var beautifier = new Beautifier(html_source, options, local._js_beautify, local._css_beautify);\n return beautifier.beautify();\n };\n }\n\n if (this._options.indent_scripts === \"keep\") {\n script_indent_level = 0;\n } else if (this._options.indent_scripts === \"separate\") {\n script_indent_level = -printer.indent_level;\n }\n\n var indentation = printer.get_full_indent(script_indent_level);\n\n // if there is at least one empty line at the end of this text, strip it\n // we'll be adding one back after the text but before the containing tag.\n text = text.replace(/\\n[ \\t]*$/, '');\n\n // Handle the case where content is wrapped in a comment or cdata.\n if (last_tag_token.custom_beautifier_name !== 'html' &&\n text[0] === '<' && text.match(/^(<!--|<!\\[CDATA\\[)/)) {\n var matched = /^(<!--[^\\n]*|<!\\[CDATA\\[)(\\n?)([ \\t\\n]*)([\\s\\S]*)(-->|]]>)$/.exec(text);\n\n // if we start to wrap but don't finish, print raw\n if (!matched) {\n printer.add_raw_token(raw_token);\n return;\n }\n\n pre = indentation + matched[1] + '\\n';\n text = matched[4];\n if (matched[5]) {\n post = indentation + matched[5];\n }\n\n // if there is at least one empty line at the end of this text, strip it\n // we'll be adding one back after the text but before the containing tag.\n text = text.replace(/\\n[ \\t]*$/, '');\n\n if (matched[2] || matched[3].indexOf('\\n') !== -1) {\n // if the first line of the non-comment text has spaces\n // use that as the basis for indenting in null case.\n matched = matched[3].match(/[ \\t]+$/);\n if (matched) {\n raw_token.whitespace_before = matched[0];\n }\n }\n }\n\n if (text) {\n if (_beautifier) {\n\n // call the Beautifier if avaliable\n var Child_options = function() {\n this.eol = '\\n';\n };\n Child_options.prototype = this._options.raw_options;\n var child_options = new Child_options();\n text = _beautifier(indentation + text, child_options);\n } else {\n // simply indent the string otherwise\n var white = raw_token.whitespace_before;\n if (white) {\n text = text.replace(new RegExp('\\n(' + white + ')?', 'g'), '\\n');\n }\n\n text = indentation + text.replace(/\\n/g, '\\n' + indentation);\n }\n }\n\n if (pre) {\n if (!text) {\n text = pre + post;\n } else {\n text = pre + text + '\\n' + post;\n }\n }\n\n printer.print_newline(false);\n if (text) {\n raw_token.text = text;\n raw_token.whitespace_before = '';\n raw_token.newlines = 0;\n printer.add_raw_token(raw_token);\n printer.print_newline(true);\n }\n }\n};\n\nBeautifier.prototype._handle_tag_open = function(printer, raw_token, last_tag_token, last_token) {\n var parser_token = this._get_tag_open_token(raw_token);\n\n if ((last_tag_token.is_unformatted || last_tag_token.is_content_unformatted) &&\n !last_tag_token.is_empty_element &&\n raw_token.type === TOKEN.TAG_OPEN && raw_token.text.indexOf('</') === 0) {\n // End element tags for unformatted or content_unformatted elements\n // are printed raw to keep any newlines inside them exactly the same.\n printer.add_raw_token(raw_token);\n parser_token.start_tag_token = this._tag_stack.try_pop(parser_token.tag_name);\n } else {\n printer.traverse_whitespace(raw_token);\n this._set_tag_position(printer, raw_token, parser_token, last_tag_token, last_token);\n if (!parser_token.is_inline_element) {\n printer.set_wrap_point();\n }\n printer.print_token(raw_token);\n }\n\n //indent attributes an auto, forced, aligned or forced-align line-wrap\n if (this._is_wrap_attributes_force_aligned || this._is_wrap_attributes_aligned_multiple || this._is_wrap_attributes_preserve_aligned) {\n parser_token.alignment_size = raw_token.text.length + 1;\n }\n\n if (!parser_token.tag_complete && !parser_token.is_unformatted) {\n printer.alignment_size = parser_token.alignment_size;\n }\n\n return parser_token;\n};\n\nvar TagOpenParserToken = function(parent, raw_token) {\n this.parent = parent || null;\n this.text = '';\n this.type = 'TK_TAG_OPEN';\n this.tag_name = '';\n this.is_inline_element = false;\n this.is_unformatted = false;\n this.is_content_unformatted = false;\n this.is_empty_element = false;\n this.is_start_tag = false;\n this.is_end_tag = false;\n this.indent_content = false;\n this.multiline_content = false;\n this.custom_beautifier_name = null;\n this.start_tag_token = null;\n this.attr_count = 0;\n this.has_wrapped_attrs = false;\n this.alignment_size = 0;\n this.tag_complete = false;\n this.tag_start_char = '';\n this.tag_check = '';\n\n if (!raw_token) {\n this.tag_complete = true;\n } else {\n var tag_check_match;\n\n this.tag_start_char = raw_token.text[0];\n this.text = raw_token.text;\n\n if (this.tag_start_char === '<') {\n tag_check_match = raw_token.text.match(/^<([^\\s>]*)/);\n this.tag_check = tag_check_match ? tag_check_match[1] : '';\n } else {\n tag_check_match = raw_token.text.match(/^{{~?(?:[\\^]|#\\*?)?([^\\s}]+)/);\n this.tag_check = tag_check_match ? tag_check_match[1] : '';\n\n // handle \"{{#> myPartial}}\" or \"{{~#> myPartial}}\"\n if ((raw_token.text.startsWith('{{#>') || raw_token.text.startsWith('{{~#>')) && this.tag_check[0] === '>') {\n if (this.tag_check === '>' && raw_token.next !== null) {\n this.tag_check = raw_token.next.text.split(' ')[0];\n } else {\n this.tag_check = raw_token.text.split('>')[1];\n }\n }\n }\n\n this.tag_check = this.tag_check.toLowerCase();\n\n if (raw_token.type === TOKEN.COMMENT) {\n this.tag_complete = true;\n }\n\n this.is_start_tag = this.tag_check.charAt(0) !== '/';\n this.tag_name = !this.is_start_tag ? this.tag_check.substr(1) : this.tag_check;\n this.is_end_tag = !this.is_start_tag ||\n (raw_token.closed && raw_token.closed.text === '/>');\n\n // if whitespace handler ~ included (i.e. {{~#if true}}), handlebars tags start at pos 3 not pos 2\n var handlebar_starts = 2;\n if (this.tag_start_char === '{' && this.text.length >= 3) {\n if (this.text.charAt(2) === '~') {\n handlebar_starts = 3;\n }\n }\n\n // handlebars tags that don't start with # or ^ are single_tags, and so also start and end.\n this.is_end_tag = this.is_end_tag ||\n (this.tag_start_char === '{' && (this.text.length < 3 || (/[^#\\^]/.test(this.text.charAt(handlebar_starts)))));\n }\n};\n\nBeautifier.prototype._get_tag_open_token = function(raw_token) { //function to get a full tag and parse its type\n var parser_token = new TagOpenParserToken(this._tag_stack.get_parser_token(), raw_token);\n\n parser_token.alignment_size = this._options.wrap_attributes_indent_size;\n\n parser_token.is_end_tag = parser_token.is_end_tag ||\n in_array(parser_token.tag_check, this._options.void_elements);\n\n parser_token.is_empty_element = parser_token.tag_complete ||\n (parser_token.is_start_tag && parser_token.is_end_tag);\n\n parser_token.is_unformatted = !parser_token.tag_complete && in_array(parser_token.tag_check, this._options.unformatted);\n parser_token.is_content_unformatted = !parser_token.is_empty_element && in_array(parser_token.tag_check, this._options.content_unformatted);\n parser_token.is_inline_element = in_array(parser_token.tag_name, this._options.inline) || parser_token.tag_name.includes(\"-\") || parser_token.tag_start_char === '{';\n\n return parser_token;\n};\n\nBeautifier.prototype._set_tag_position = function(printer, raw_token, parser_token, last_tag_token, last_token) {\n\n if (!parser_token.is_empty_element) {\n if (parser_token.is_end_tag) { //this tag is a double tag so check for tag-ending\n parser_token.start_tag_token = this._tag_stack.try_pop(parser_token.tag_name); //remove it and all ancestors\n } else { // it's a start-tag\n // check if this tag is starting an element that has optional end element\n // and do an ending needed\n if (this._do_optional_end_element(parser_token)) {\n if (!parser_token.is_inline_element) {\n printer.print_newline(false);\n }\n }\n\n this._tag_stack.record_tag(parser_token); //push it on the tag stack\n\n if ((parser_token.tag_name === 'script' || parser_token.tag_name === 'style') &&\n !(parser_token.is_unformatted || parser_token.is_content_unformatted)) {\n parser_token.custom_beautifier_name = get_custom_beautifier_name(parser_token.tag_check, raw_token);\n }\n }\n }\n\n if (in_array(parser_token.tag_check, this._options.extra_liners)) { //check if this double needs an extra line\n printer.print_newline(false);\n if (!printer._output.just_added_blankline()) {\n printer.print_newline(true);\n }\n }\n\n if (parser_token.is_empty_element) { //if this tag name is a single tag type (either in the list or has a closing /)\n\n // if you hit an else case, reset the indent level if you are inside an:\n // 'if', 'unless', or 'each' block.\n if (parser_token.tag_start_char === '{' && parser_token.tag_check === 'else') {\n this._tag_stack.indent_to_tag(['if', 'unless', 'each']);\n parser_token.indent_content = true;\n // Don't add a newline if opening {{#if}} tag is on the current line\n var foundIfOnCurrentLine = printer.current_line_has_match(/{{#if/);\n if (!foundIfOnCurrentLine) {\n printer.print_newline(false);\n }\n }\n\n // Don't add a newline before elements that should remain where they are.\n if (parser_token.tag_name === '!--' && last_token.type === TOKEN.TAG_CLOSE &&\n last_tag_token.is_end_tag && parser_token.text.indexOf('\\n') === -1) {\n //Do nothing. Leave comments on same line.\n } else {\n if (!(parser_token.is_inline_element || parser_token.is_unformatted)) {\n printer.print_newline(false);\n }\n this._calcluate_parent_multiline(printer, parser_token);\n }\n } else if (parser_token.is_end_tag) { //this tag is a double tag so check for tag-ending\n var do_end_expand = false;\n\n // deciding whether a block is multiline should not be this hard\n do_end_expand = parser_token.start_tag_token && parser_token.start_tag_token.multiline_content;\n do_end_expand = do_end_expand || (!parser_token.is_inline_element &&\n !(last_tag_token.is_inline_element || last_tag_token.is_unformatted) &&\n !(last_token.type === TOKEN.TAG_CLOSE && parser_token.start_tag_token === last_tag_token) &&\n last_token.type !== 'TK_CONTENT'\n );\n\n if (parser_token.is_content_unformatted || parser_token.is_unformatted) {\n do_end_expand = false;\n }\n\n if (do_end_expand) {\n printer.print_newline(false);\n }\n } else { // it's a start-tag\n parser_token.indent_content = !parser_token.custom_beautifier_name;\n\n if (parser_token.tag_start_char === '<') {\n if (parser_token.tag_name === 'html') {\n parser_token.indent_content = this._options.indent_inner_html;\n } else if (parser_token.tag_name === 'head') {\n parser_token.indent_content = this._options.indent_head_inner_html;\n } else if (parser_token.tag_name === 'body') {\n parser_token.indent_content = this._options.indent_body_inner_html;\n }\n }\n\n if (!(parser_token.is_inline_element || parser_token.is_unformatted) &&\n (last_token.type !== 'TK_CONTENT' || parser_token.is_content_unformatted)) {\n printer.print_newline(false);\n }\n\n this._calcluate_parent_multiline(printer, parser_token);\n }\n};\n\nBeautifier.prototype._calcluate_parent_multiline = function(printer, parser_token) {\n if (parser_token.parent && printer._output.just_added_newline() &&\n !((parser_token.is_inline_element || parser_token.is_unformatted) && parser_token.parent.is_inline_element)) {\n parser_token.parent.multiline_content = true;\n }\n};\n\n//To be used for <p> tag special case:\nvar p_closers = ['address', 'article', 'aside', 'blockquote', 'details', 'div', 'dl', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'hr', 'main', 'nav', 'ol', 'p', 'pre', 'section', 'table', 'ul'];\nvar p_parent_excludes = ['a', 'audio', 'del', 'ins', 'map', 'noscript', 'video'];\n\nBeautifier.prototype._do_optional_end_element = function(parser_token) {\n var result = null;\n // NOTE: cases of \"if there is no more content in the parent element\"\n // are handled automatically by the beautifier.\n // It assumes parent or ancestor close tag closes all children.\n // https://www.w3.org/TR/html5/syntax.html#optional-tags\n if (parser_token.is_empty_element || !parser_token.is_start_tag || !parser_token.parent) {\n return;\n\n }\n\n if (parser_token.tag_name === 'body') {\n // A head element\u2019s end tag may be omitted if the head element is not immediately followed by a space character or a comment.\n result = result || this._tag_stack.try_pop('head');\n\n //} else if (parser_token.tag_name === 'body') {\n // DONE: A body element\u2019s end tag may be omitted if the body element is not immediately followed by a comment.\n\n } else if (parser_token.tag_name === 'li') {\n // An li element\u2019s end tag may be omitted if the li element is immediately followed by another li element or if there is no more content in the parent element.\n result = result || this._tag_stack.try_pop('li', ['ol', 'ul']);\n\n } else if (parser_token.tag_name === 'dd' || parser_token.tag_name === 'dt') {\n // A dd element\u2019s end tag may be omitted if the dd element is immediately followed by another dd element or a dt element, or if there is no more content in the parent element.\n // A dt element\u2019s end tag may be omitted if the dt element is immediately followed by another dt element or a dd element.\n result = result || this._tag_stack.try_pop('dt', ['dl']);\n result = result || this._tag_stack.try_pop('dd', ['dl']);\n\n\n } else if (parser_token.parent.tag_name === 'p' && p_closers.indexOf(parser_token.tag_name) !== -1) {\n // IMPORTANT: this else-if works because p_closers has no overlap with any other element we look for in this method\n // check for the parent element is an HTML element that is not an <a>, <audio>, <del>, <ins>, <map>, <noscript>, or <video> element, or an autonomous custom element.\n // To do this right, this needs to be coded as an inclusion of the inverse of the exclusion above.\n // But to start with (if we ignore \"autonomous custom elements\") the exclusion would be fine.\n var p_parent = parser_token.parent.parent;\n if (!p_parent || p_parent_excludes.indexOf(p_parent.tag_name) === -1) {\n result = result || this._tag_stack.try_pop('p');\n }\n } else if (parser_token.tag_name === 'rp' || parser_token.tag_name === 'rt') {\n // An rt element\u2019s end tag may be omitted if the rt element is immediately followed by an rt or rp element, or if there is no more content in the parent element.\n // An rp element\u2019s end tag may be omitted if the rp element is immediately followed by an rt or rp element, or if there is no more content in the parent element.\n result = result || this._tag_stack.try_pop('rt', ['ruby', 'rtc']);\n result = result || this._tag_stack.try_pop('rp', ['ruby', 'rtc']);\n\n } else if (parser_token.tag_name === 'optgroup') {\n // An optgroup element\u2019s end tag may be omitted if the optgroup element is immediately followed by another optgroup element, or if there is no more content in the parent element.\n // An option element\u2019s end tag may be omitted if the option element is immediately followed by another option element, or if it is immediately followed by an optgroup element, or if there is no more content in the parent element.\n result = result || this._tag_stack.try_pop('optgroup', ['select']);\n //result = result || this._tag_stack.try_pop('option', ['select']);\n\n } else if (parser_token.tag_name === 'option') {\n // An option element\u2019s end tag may be omitted if the option element is immediately followed by another option element, or if it is immediately followed by an optgroup element, or if there is no more content in the parent element.\n result = result || this._tag_stack.try_pop('option', ['select', 'datalist', 'optgroup']);\n\n } else if (parser_token.tag_name === 'colgroup') {\n // DONE: A colgroup element\u2019s end tag may be omitted if the colgroup element is not immediately followed by a space character or a comment.\n // A caption element's end tag may be ommitted if a colgroup, thead, tfoot, tbody, or tr element is started.\n result = result || this._tag_stack.try_pop('caption', ['table']);\n\n } else if (parser_token.tag_name === 'thead') {\n // A colgroup element's end tag may be ommitted if a thead, tfoot, tbody, or tr element is started.\n // A caption element's end tag may be ommitted if a colgroup, thead, tfoot, tbody, or tr element is started.\n result = result || this._tag_stack.try_pop('caption', ['table']);\n result = result || this._tag_stack.try_pop('colgroup', ['table']);\n\n //} else if (parser_token.tag_name === 'caption') {\n // DONE: A caption element\u2019s end tag may be omitted if the caption element is not immediately followed by a space character or a comment.\n\n } else if (parser_token.tag_name === 'tbody' || parser_token.tag_name === 'tfoot') {\n // A thead element\u2019s end tag may be omitted if the thead element is immediately followed by a tbody or tfoot element.\n // A tbody element\u2019s end tag may be omitted if the tbody element is immediately followed by a tbody or tfoot element, or if there is no more content in the parent element.\n // A colgroup element's end tag may be ommitted if a thead, tfoot, tbody, or tr element is started.\n // A caption element's end tag may be ommitted if a colgroup, thead, tfoot, tbody, or tr element is started.\n result = result || this._tag_stack.try_pop('caption', ['table']);\n result = result || this._tag_stack.try_pop('colgroup', ['table']);\n result = result || this._tag_stack.try_pop('thead', ['table']);\n result = result || this._tag_stack.try_pop('tbody', ['table']);\n\n //} else if (parser_token.tag_name === 'tfoot') {\n // DONE: A tfoot element\u2019s end tag may be omitted if there is no more content in the parent element.\n\n } else if (parser_token.tag_name === 'tr') {\n // A tr element\u2019s end tag may be omitted if the tr element is immediately followed by another tr element, or if there is no more content in the parent element.\n // A colgroup element's end tag may be ommitted if a thead, tfoot, tbody, or tr element is started.\n // A caption element's end tag may be ommitted if a colgroup, thead, tfoot, tbody, or tr element is started.\n result = result || this._tag_stack.try_pop('caption', ['table']);\n result = result || this._tag_stack.try_pop('colgroup', ['table']);\n result = result || this._tag_stack.try_pop('tr', ['table', 'thead', 'tbody', 'tfoot']);\n\n } else if (parser_token.tag_name === 'th' || parser_token.tag_name === 'td') {\n // A td element\u2019s end tag may be omitted if the td element is immediately followed by a td or th element, or if there is no more content in the parent element.\n // A th element\u2019s end tag may be omitted if the th element is immediately followed by a td or th element, or if there is no more content in the parent element.\n result = result || this._tag_stack.try_pop('td', ['table', 'thead', 'tbody', 'tfoot', 'tr']);\n result = result || this._tag_stack.try_pop('th', ['table', 'thead', 'tbody', 'tfoot', 'tr']);\n }\n\n // Start element omission not handled currently\n // A head element\u2019s start tag may be omitted if the element is empty, or if the first thing inside the head element is an element.\n // A tbody element\u2019s start tag may be omitted if the first thing inside the tbody element is a tr element, and if the element is not immediately preceded by a tbody, thead, or tfoot element whose end tag has been omitted. (It can\u2019t be omitted if the element is empty.)\n // A colgroup element\u2019s start tag may be omitted if the first thing inside the colgroup element is a col element, and if the element is not immediately preceded by another colgroup element whose end tag has been omitted. (It can\u2019t be omitted if the element is empty.)\n\n // Fix up the parent of the parser token\n parser_token.parent = this._tag_stack.get_parser_token();\n\n return result;\n};\n\nmodule.exports.Beautifier = Beautifier;\n", "/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nvar Beautifier = require('./beautifier').Beautifier,\n Options = require('./options').Options;\n\nfunction style_html(html_source, options, js_beautify, css_beautify) {\n var beautifier = new Beautifier(html_source, options, js_beautify, css_beautify);\n return beautifier.beautify();\n}\n\nmodule.exports = style_html;\nmodule.exports.defaultOptions = function() {\n return new Options();\n};\n", "/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n'use strict';\n\nvar js_beautify = require('./javascript/index');\nvar css_beautify = require('./css/index');\nvar html_beautify = require('./html/index');\n\nfunction style_html(html_source, options, js, css) {\n js = js || js_beautify;\n css = css || css_beautify;\n return html_beautify(html_source, options, js, css);\n}\nstyle_html.defaultOptions = html_beautify.defaultOptions;\n\nmodule.exports.js = js_beautify;\nmodule.exports.css = css_beautify;\nmodule.exports.html = style_html;\n", "/*jshint node:true */\n/* globals define */\n/*\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n*/\n\n'use strict';\n\n/**\nThe following batches are equivalent:\n\nvar beautify_js = require('js-beautify');\nvar beautify_js = require('js-beautify').js;\nvar beautify_js = require('js-beautify').js_beautify;\n\nvar beautify_css = require('js-beautify').css;\nvar beautify_css = require('js-beautify').css_beautify;\n\nvar beautify_html = require('js-beautify').html;\nvar beautify_html = require('js-beautify').html_beautify;\n\nAll methods returned accept two arguments, the source string and an options object.\n**/\n\nfunction get_beautify(js_beautify, css_beautify, html_beautify) {\n // the default is js\n var beautify = function(src, config) {\n return js_beautify.js_beautify(src, config);\n };\n\n // short aliases\n beautify.js = js_beautify.js_beautify;\n beautify.css = css_beautify.css_beautify;\n beautify.html = html_beautify.html_beautify;\n\n // legacy aliases\n beautify.js_beautify = js_beautify.js_beautify;\n beautify.css_beautify = css_beautify.css_beautify;\n beautify.html_beautify = html_beautify.html_beautify;\n\n return beautify;\n}\n\nif (typeof define === \"function\" && define.amd) {\n // Add support for AMD ( https://github.com/amdjs/amdjs-api/wiki/AMD#defineamd-property- )\n define([\n \"./lib/beautify\",\n \"./lib/beautify-css\",\n \"./lib/beautify-html\"\n ], function(js_beautify, css_beautify, html_beautify) {\n return get_beautify(js_beautify, css_beautify, html_beautify);\n });\n} else {\n (function(mod) {\n var beautifier = require('./src/index');\n beautifier.js_beautify = beautifier.js;\n beautifier.css_beautify = beautifier.css;\n beautifier.html_beautify = beautifier.html;\n\n mod.exports = get_beautify(beautifier, beautifier, beautifier);\n\n })(module);\n}", "'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n/**\n * @typedef {import('./index.js').VisitorKeys} VisitorKeys\n */\n\n/**\n * @type {VisitorKeys}\n */\nconst KEYS = {\n AssignmentExpression: [\n \"left\",\n \"right\"\n ],\n AssignmentPattern: [\n \"left\",\n \"right\"\n ],\n ArrayExpression: [\n \"elements\"\n ],\n ArrayPattern: [\n \"elements\"\n ],\n ArrowFunctionExpression: [\n \"params\",\n \"body\"\n ],\n AwaitExpression: [\n \"argument\"\n ],\n BlockStatement: [\n \"body\"\n ],\n BinaryExpression: [\n \"left\",\n \"right\"\n ],\n BreakStatement: [\n \"label\"\n ],\n CallExpression: [\n \"callee\",\n \"arguments\"\n ],\n CatchClause: [\n \"param\",\n \"body\"\n ],\n ChainExpression: [\n \"expression\"\n ],\n ClassBody: [\n \"body\"\n ],\n ClassDeclaration: [\n \"id\",\n \"superClass\",\n \"body\"\n ],\n ClassExpression: [\n \"id\",\n \"superClass\",\n \"body\"\n ],\n ConditionalExpression: [\n \"test\",\n \"consequent\",\n \"alternate\"\n ],\n ContinueStatement: [\n \"label\"\n ],\n DebuggerStatement: [],\n DoWhileStatement: [\n \"body\",\n \"test\"\n ],\n EmptyStatement: [],\n ExportAllDeclaration: [\n \"exported\",\n \"source\"\n ],\n ExportDefaultDeclaration: [\n \"declaration\"\n ],\n ExportNamedDeclaration: [\n \"declaration\",\n \"specifiers\",\n \"source\"\n ],\n ExportSpecifier: [\n \"exported\",\n \"local\"\n ],\n ExpressionStatement: [\n \"expression\"\n ],\n ExperimentalRestProperty: [\n \"argument\"\n ],\n ExperimentalSpreadProperty: [\n \"argument\"\n ],\n ForStatement: [\n \"init\",\n \"test\",\n \"update\",\n \"body\"\n ],\n ForInStatement: [\n \"left\",\n \"right\",\n \"body\"\n ],\n ForOfStatement: [\n \"left\",\n \"right\",\n \"body\"\n ],\n FunctionDeclaration: [\n \"id\",\n \"params\",\n \"body\"\n ],\n FunctionExpression: [\n \"id\",\n \"params\",\n \"body\"\n ],\n Identifier: [],\n IfStatement: [\n \"test\",\n \"consequent\",\n \"alternate\"\n ],\n ImportDeclaration: [\n \"specifiers\",\n \"source\"\n ],\n ImportDefaultSpecifier: [\n \"local\"\n ],\n ImportExpression: [\n \"source\"\n ],\n ImportNamespaceSpecifier: [\n \"local\"\n ],\n ImportSpecifier: [\n \"imported\",\n \"local\"\n ],\n JSXAttribute: [\n \"name\",\n \"value\"\n ],\n JSXClosingElement: [\n \"name\"\n ],\n JSXElement: [\n \"openingElement\",\n \"children\",\n \"closingElement\"\n ],\n JSXEmptyExpression: [],\n JSXExpressionContainer: [\n \"expression\"\n ],\n JSXIdentifier: [],\n JSXMemberExpression: [\n \"object\",\n \"property\"\n ],\n JSXNamespacedName: [\n \"namespace\",\n \"name\"\n ],\n JSXOpeningElement: [\n \"name\",\n \"attributes\"\n ],\n JSXSpreadAttribute: [\n \"argument\"\n ],\n JSXText: [],\n JSXFragment: [\n \"openingFragment\",\n \"children\",\n \"closingFragment\"\n ],\n JSXClosingFragment: [],\n JSXOpeningFragment: [],\n Literal: [],\n LabeledStatement: [\n \"label\",\n \"body\"\n ],\n LogicalExpression: [\n \"left\",\n \"right\"\n ],\n MemberExpression: [\n \"object\",\n \"property\"\n ],\n MetaProperty: [\n \"meta\",\n \"property\"\n ],\n MethodDefinition: [\n \"key\",\n \"value\"\n ],\n NewExpression: [\n \"callee\",\n \"arguments\"\n ],\n ObjectExpression: [\n \"properties\"\n ],\n ObjectPattern: [\n \"properties\"\n ],\n PrivateIdentifier: [],\n Program: [\n \"body\"\n ],\n Property: [\n \"key\",\n \"value\"\n ],\n PropertyDefinition: [\n \"key\",\n \"value\"\n ],\n RestElement: [\n \"argument\"\n ],\n ReturnStatement: [\n \"argument\"\n ],\n SequenceExpression: [\n \"expressions\"\n ],\n SpreadElement: [\n \"argument\"\n ],\n StaticBlock: [\n \"body\"\n ],\n Super: [],\n SwitchStatement: [\n \"discriminant\",\n \"cases\"\n ],\n SwitchCase: [\n \"test\",\n \"consequent\"\n ],\n TaggedTemplateExpression: [\n \"tag\",\n \"quasi\"\n ],\n TemplateElement: [],\n TemplateLiteral: [\n \"quasis\",\n \"expressions\"\n ],\n ThisExpression: [],\n ThrowStatement: [\n \"argument\"\n ],\n TryStatement: [\n \"block\",\n \"handler\",\n \"finalizer\"\n ],\n UnaryExpression: [\n \"argument\"\n ],\n UpdateExpression: [\n \"argument\"\n ],\n VariableDeclaration: [\n \"declarations\"\n ],\n VariableDeclarator: [\n \"id\",\n \"init\"\n ],\n WhileStatement: [\n \"test\",\n \"body\"\n ],\n WithStatement: [\n \"object\",\n \"body\"\n ],\n YieldExpression: [\n \"argument\"\n ]\n};\n\n// Types.\nconst NODE_TYPES = Object.keys(KEYS);\n\n// Freeze the keys.\nfor (const type of NODE_TYPES) {\n Object.freeze(KEYS[type]);\n}\nObject.freeze(KEYS);\n\n/**\n * @author Toru Nagashima <https://github.com/mysticatea>\n * See LICENSE file in root directory for full license.\n */\n\n/**\n * @typedef {{ readonly [type: string]: ReadonlyArray<string> }} VisitorKeys\n */\n\n// List to ignore keys.\nconst KEY_BLACKLIST = new Set([\n \"parent\",\n \"leadingComments\",\n \"trailingComments\"\n]);\n\n/**\n * Check whether a given key should be used or not.\n * @param {string} key The key to check.\n * @returns {boolean} `true` if the key should be used.\n */\nfunction filterKey(key) {\n return !KEY_BLACKLIST.has(key) && key[0] !== \"_\";\n}\n\n/**\n * Get visitor keys of a given node.\n * @param {object} node The AST node to get keys.\n * @returns {readonly string[]} Visitor keys of the node.\n */\nfunction getKeys(node) {\n return Object.keys(node).filter(filterKey);\n}\n\n// Disable valid-jsdoc rule because it reports syntax error on the type of @returns.\n// eslint-disable-next-line valid-jsdoc\n/**\n * Make the union set with `KEYS` and given keys.\n * @param {VisitorKeys} additionalKeys The additional keys.\n * @returns {VisitorKeys} The union set.\n */\nfunction unionWith(additionalKeys) {\n const retv = /** @type {{\n [type: string]: ReadonlyArray<string>\n }} */ (Object.assign({}, KEYS));\n\n for (const type of Object.keys(additionalKeys)) {\n if (Object.prototype.hasOwnProperty.call(retv, type)) {\n const keys = new Set(additionalKeys[type]);\n\n for (const key of retv[type]) {\n keys.add(key);\n }\n\n retv[type] = Object.freeze(Array.from(keys));\n } else {\n retv[type] = Object.freeze(Array.from(additionalKeys[type]));\n }\n }\n\n return Object.freeze(retv);\n}\n\nexports.KEYS = KEYS;\nexports.getKeys = getKeys;\nexports.unionWith = unionWith;\n//# sourceMappingURL=eslint-visitor-keys.cjs.map\n", "/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n", "var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n", "var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n", "var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n", "/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n", "var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n", "/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n", "var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n", "var isSymbol = require('./isSymbol');\n\n/** Used as references for the maximum length and index of an array. */\nvar MAX_ARRAY_LENGTH = 4294967295,\n MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeFloor = Math.floor,\n nativeMin = Math.min;\n\n/**\n * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n * which invokes `iteratee` for `value` and each element of `array` to compute\n * their sort ranking. The iteratee is invoked with one argument; (value).\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} iteratee The iteratee invoked per element.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\nfunction baseSortedIndexBy(array, value, iteratee, retHighest) {\n var low = 0,\n high = array == null ? 0 : array.length;\n if (high === 0) {\n return 0;\n }\n\n value = iteratee(value);\n var valIsNaN = value !== value,\n valIsNull = value === null,\n valIsSymbol = isSymbol(value),\n valIsUndefined = value === undefined;\n\n while (low < high) {\n var mid = nativeFloor((low + high) / 2),\n computed = iteratee(array[mid]),\n othIsDefined = computed !== undefined,\n othIsNull = computed === null,\n othIsReflexive = computed === computed,\n othIsSymbol = isSymbol(computed);\n\n if (valIsNaN) {\n var setLow = retHighest || othIsReflexive;\n } else if (valIsUndefined) {\n setLow = othIsReflexive && (retHighest || othIsDefined);\n } else if (valIsNull) {\n setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n } else if (valIsSymbol) {\n setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n } else if (othIsNull || othIsSymbol) {\n setLow = false;\n } else {\n setLow = retHighest ? (computed <= value) : (computed < value);\n }\n if (setLow) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return nativeMin(high, MAX_ARRAY_INDEX);\n}\n\nmodule.exports = baseSortedIndexBy;\n", "/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n", "var baseSortedIndexBy = require('./_baseSortedIndexBy'),\n identity = require('./identity'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for the maximum length and index of an array. */\nvar MAX_ARRAY_LENGTH = 4294967295,\n HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n/**\n * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n * performs a binary search of `array` to determine the index at which `value`\n * should be inserted into `array` in order to maintain its sort order.\n *\n * @private\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {boolean} [retHighest] Specify returning the highest qualified index.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n */\nfunction baseSortedIndex(array, value, retHighest) {\n var low = 0,\n high = array == null ? low : array.length;\n\n if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n while (low < high) {\n var mid = (low + high) >>> 1,\n computed = array[mid];\n\n if (computed !== null && !isSymbol(computed) &&\n (retHighest ? (computed <= value) : (computed < value))) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n return high;\n }\n return baseSortedIndexBy(array, value, identity, retHighest);\n}\n\nmodule.exports = baseSortedIndex;\n", "var baseSortedIndex = require('./_baseSortedIndex');\n\n/**\n * This method is like `_.sortedIndex` except that it returns the highest\n * index at which `value` should be inserted into `array` in order to\n * maintain its sort order.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n * // => 4\n */\nfunction sortedLastIndex(array, value) {\n return baseSortedIndex(array, value, true);\n}\n\nmodule.exports = sortedLastIndex;\n", "/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n}\n\nmodule.exports = last;\n", "/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = baseFindIndex;\n", "/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n", "/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n", "var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n", "var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n", "var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n", "var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n", "var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n", "var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n", "var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nmodule.exports = stackClear;\n", "/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;\n", "/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n", "/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n", "/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n", "var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n", "var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n", "var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n", "/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n", "var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n", "/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n", "var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n", "var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n", "var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n", "var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n", "/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n", "var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n", "var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n", "var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n", "var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n", "var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n", "/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n", "var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n", "var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n", "var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n", "var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n", "var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n", "var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n", "var ListCache = require('./_ListCache'),\n Map = require('./_Map'),\n MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;\n", "var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n", "/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nmodule.exports = setCacheAdd;\n", "/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n", "var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n", "/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arraySome;\n", "/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n", "var SetCache = require('./_SetCache'),\n arraySome = require('./_arraySome'),\n cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Check that cyclic values are equal.\n var arrStacked = stack.get(array);\n var othStacked = stack.get(other);\n if (arrStacked && othStacked) {\n return arrStacked == other && othStacked == array;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalArrays;\n", "var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n", "/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nmodule.exports = mapToArray;\n", "/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n", "var Symbol = require('./_Symbol'),\n Uint8Array = require('./_Uint8Array'),\n eq = require('./eq'),\n equalArrays = require('./_equalArrays'),\n mapToArray = require('./_mapToArray'),\n setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nmodule.exports = equalByTag;\n", "/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n", "/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n", "var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n", "/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n", "/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;\n", "var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nmodule.exports = getSymbols;\n", "/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n", "var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n", "var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n", "/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n", "var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n", "/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n", "/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n", "var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n", "/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n", "var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n", "var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n", "var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n", "/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n", "/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n", "var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n", "var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n", "var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n", "var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n", "var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n", "var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Check that cyclic values are equal.\n var objStacked = stack.get(object);\n var othStacked = stack.get(other);\n if (objStacked && othStacked) {\n return objStacked == other && othStacked == object;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalObjects;\n", "var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n", "var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n", "var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n", "var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n", "var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n", "var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n", "var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n", "var Stack = require('./_Stack'),\n baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nmodule.exports = baseIsMatch;\n", "var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n", "var isStrictComparable = require('./_isStrictComparable'),\n keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nmodule.exports = getMatchData;\n", "/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n", "var baseIsMatch = require('./_baseIsMatch'),\n getMatchData = require('./_getMatchData'),\n matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nmodule.exports = baseMatches;\n", "var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n", "var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n", "var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n", "var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n", "/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n", "var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n", "var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n", "var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n", "var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n", "var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n", "var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n", "/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n", "var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n", "var baseHasIn = require('./_baseHasIn'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n", "var baseIsEqual = require('./_baseIsEqual'),\n get = require('./get'),\n hasIn = require('./hasIn'),\n isKey = require('./_isKey'),\n isStrictComparable = require('./_isStrictComparable'),\n matchesStrictComparable = require('./_matchesStrictComparable'),\n toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n", "/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n", "var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n", "var baseProperty = require('./_baseProperty'),\n basePropertyDeep = require('./_basePropertyDeep'),\n isKey = require('./_isKey'),\n toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n", "var baseMatches = require('./_baseMatches'),\n baseMatchesProperty = require('./_baseMatchesProperty'),\n identity = require('./identity'),\n isArray = require('./isArray'),\n property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nmodule.exports = baseIteratee;\n", "/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n", "var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n", "var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n", "var toNumber = require('./toNumber');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n", "var toFinite = require('./toFinite');\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nmodule.exports = toInteger;\n", "var baseFindIndex = require('./_baseFindIndex'),\n baseIteratee = require('./_baseIteratee'),\n toInteger = require('./toInteger');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * This method is like `_.findIndex` except that it iterates over elements\n * of `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=array.length-1] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n * // => 2\n *\n * // The `_.matches` iteratee shorthand.\n * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n * // => 0\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findLastIndex(users, ['active', false]);\n * // => 2\n *\n * // The `_.property` iteratee shorthand.\n * _.findLastIndex(users, 'active');\n * // => 0\n */\nfunction findLastIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = length - 1;\n if (fromIndex !== undefined) {\n index = toInteger(fromIndex);\n index = fromIndex < 0\n ? nativeMax(length + index, 0)\n : nativeMin(index, length - 1);\n }\n return baseFindIndex(array, baseIteratee(predicate, 3), index, true);\n}\n\nmodule.exports = findLastIndex;\n", "/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n", "\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tlet i;\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n\t\tconst len = split.length;\n\n\t\tfor (i = 0; i < len; i++) {\n\t\t\tif (!split[i]) {\n\t\t\t\t// ignore empty strings\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tnamespaces = split[i].replace(/\\*/g, '.*?');\n\n\t\t\tif (namespaces[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(new RegExp('^' + namespaces.slice(1) + '$'));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(new RegExp('^' + namespaces + '$'));\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names.map(toNamespace),\n\t\t\t...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tif (name[name.length - 1] === '*') {\n\t\t\treturn true;\n\t\t}\n\n\t\tlet i;\n\t\tlet len;\n\n\t\tfor (i = 0, len = createDebug.skips.length; i < len; i++) {\n\t\t\tif (createDebug.skips[i].test(name)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, len = createDebug.names.length; i < len; i++) {\n\t\t\tif (createDebug.names[i].test(name)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Convert regexp to namespace\n\t*\n\t* @param {RegExp} regxep\n\t* @return {String} namespace\n\t* @api private\n\t*/\n\tfunction toNamespace(regexp) {\n\t\treturn regexp.toString()\n\t\t\t.substring(2, regexp.toString().length - 2)\n\t\t\t.replace(/\\.\\*\\?$/, '*');\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n", "/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug');\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n", "'use strict';\n\nmodule.exports = (flag, argv = process.argv) => {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n};\n", "'use strict';\nconst os = require('os');\nconst tty = require('tty');\nconst hasFlag = require('has-flag');\n\nconst {env} = process;\n\nlet forceColor;\nif (hasFlag('no-color') ||\n\thasFlag('no-colors') ||\n\thasFlag('color=false') ||\n\thasFlag('color=never')) {\n\tforceColor = 0;\n} else if (hasFlag('color') ||\n\thasFlag('colors') ||\n\thasFlag('color=true') ||\n\thasFlag('color=always')) {\n\tforceColor = 1;\n}\n\nif ('FORCE_COLOR' in env) {\n\tif (env.FORCE_COLOR === 'true') {\n\t\tforceColor = 1;\n\t} else if (env.FORCE_COLOR === 'false') {\n\t\tforceColor = 0;\n\t} else {\n\t\tforceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3\n\t};\n}\n\nfunction supportsColor(haveStream, streamIsTTY) {\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (hasFlag('color=16m') ||\n\t\thasFlag('color=full') ||\n\t\thasFlag('color=truecolor')) {\n\t\treturn 3;\n\t}\n\n\tif (hasFlag('color=256')) {\n\t\treturn 2;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10 &&\n\t\t\tNumber(osRelease[2]) >= 10586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif ('GITHUB_ACTIONS' in env) {\n\t\treturn 1;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app':\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\tcase 'Apple_Terminal':\n\t\t\t\treturn 2;\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nfunction getSupportLevel(stream) {\n\tconst level = supportsColor(stream, stream && stream.isTTY);\n\treturn translateLevel(level);\n}\n\nmodule.exports = {\n\tsupportsColor: getSupportLevel,\n\tstdout: translateLevel(supportsColor(true, tty.isatty(1))),\n\tstderr: translateLevel(supportsColor(true, tty.isatty(2)))\n};\n", "/**\n * Module dependencies.\n */\n\nconst tty = require('tty');\nconst util = require('util');\n\n/**\n * This is the Node.js implementation of `debug()`.\n */\n\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.destroy = util.deprecate(\n\t() => {},\n\t'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'\n);\n\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\ntry {\n\t// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)\n\t// eslint-disable-next-line import/no-extraneous-dependencies\n\tconst supportsColor = require('supports-color');\n\n\tif (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {\n\t\texports.colors = [\n\t\t\t20,\n\t\t\t21,\n\t\t\t26,\n\t\t\t27,\n\t\t\t32,\n\t\t\t33,\n\t\t\t38,\n\t\t\t39,\n\t\t\t40,\n\t\t\t41,\n\t\t\t42,\n\t\t\t43,\n\t\t\t44,\n\t\t\t45,\n\t\t\t56,\n\t\t\t57,\n\t\t\t62,\n\t\t\t63,\n\t\t\t68,\n\t\t\t69,\n\t\t\t74,\n\t\t\t75,\n\t\t\t76,\n\t\t\t77,\n\t\t\t78,\n\t\t\t79,\n\t\t\t80,\n\t\t\t81,\n\t\t\t92,\n\t\t\t93,\n\t\t\t98,\n\t\t\t99,\n\t\t\t112,\n\t\t\t113,\n\t\t\t128,\n\t\t\t129,\n\t\t\t134,\n\t\t\t135,\n\t\t\t148,\n\t\t\t149,\n\t\t\t160,\n\t\t\t161,\n\t\t\t162,\n\t\t\t163,\n\t\t\t164,\n\t\t\t165,\n\t\t\t166,\n\t\t\t167,\n\t\t\t168,\n\t\t\t169,\n\t\t\t170,\n\t\t\t171,\n\t\t\t172,\n\t\t\t173,\n\t\t\t178,\n\t\t\t179,\n\t\t\t184,\n\t\t\t185,\n\t\t\t196,\n\t\t\t197,\n\t\t\t198,\n\t\t\t199,\n\t\t\t200,\n\t\t\t201,\n\t\t\t202,\n\t\t\t203,\n\t\t\t204,\n\t\t\t205,\n\t\t\t206,\n\t\t\t207,\n\t\t\t208,\n\t\t\t209,\n\t\t\t214,\n\t\t\t215,\n\t\t\t220,\n\t\t\t221\n\t\t];\n\t}\n} catch (error) {\n\t// Swallow - we only care if `supports-color` is available; it doesn't have to be.\n}\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(key => {\n\treturn /^debug_/i.test(key);\n}).reduce((obj, key) => {\n\t// Camel-case\n\tconst prop = key\n\t\t.substring(6)\n\t\t.toLowerCase()\n\t\t.replace(/_([a-z])/g, (_, k) => {\n\t\t\treturn k.toUpperCase();\n\t\t});\n\n\t// Coerce string value into JS value\n\tlet val = process.env[key];\n\tif (/^(yes|on|true|enabled)$/i.test(val)) {\n\t\tval = true;\n\t} else if (/^(no|off|false|disabled)$/i.test(val)) {\n\t\tval = false;\n\t} else if (val === 'null') {\n\t\tval = null;\n\t} else {\n\t\tval = Number(val);\n\t}\n\n\tobj[prop] = val;\n\treturn obj;\n}, {});\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n\treturn 'colors' in exports.inspectOpts ?\n\t\tBoolean(exports.inspectOpts.colors) :\n\t\ttty.isatty(process.stderr.fd);\n}\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\tconst {namespace: name, useColors} = this;\n\n\tif (useColors) {\n\t\tconst c = this.color;\n\t\tconst colorCode = '\\u001B[3' + (c < 8 ? c : '8;5;' + c);\n\t\tconst prefix = ` ${colorCode};1m${name} \\u001B[0m`;\n\n\t\targs[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n\t\targs.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\\u001B[0m');\n\t} else {\n\t\targs[0] = getDate() + name + ' ' + args[0];\n\t}\n}\n\nfunction getDate() {\n\tif (exports.inspectOpts.hideDate) {\n\t\treturn '';\n\t}\n\treturn new Date().toISOString() + ' ';\n}\n\n/**\n * Invokes `util.format()` with the specified arguments and writes to stderr.\n */\n\nfunction log(...args) {\n\treturn process.stderr.write(util.format(...args) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\tif (namespaces) {\n\t\tprocess.env.DEBUG = namespaces;\n\t} else {\n\t\t// If you set a process.env field to null or undefined, it gets cast to the\n\t\t// string 'null' or 'undefined'. Just delete instead.\n\t\tdelete process.env.DEBUG;\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n\treturn process.env.DEBUG;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init(debug) {\n\tdebug.inspectOpts = {};\n\n\tconst keys = Object.keys(exports.inspectOpts);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tdebug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nformatters.o = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts)\n\t\t.split('\\n')\n\t\t.map(str => str.trim())\n\t\t.join(' ');\n};\n\n/**\n * Map %O to `util.inspect()`, allowing multiple lines if needed.\n */\n\nformatters.O = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts);\n};\n", "/**\n * Detect Electron renderer / nwjs process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {\n\tmodule.exports = require('./browser.js');\n} else {\n\tmodule.exports = require('./node.js');\n}\n", "/**\n * Gets the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias first\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the first element of `array`.\n * @example\n *\n * _.head([1, 2, 3]);\n * // => 1\n *\n * _.head([]);\n * // => undefined\n */\nfunction head(array) {\n return (array && array.length) ? array[0] : undefined;\n}\n\nmodule.exports = head;\n", "module.exports = require('./head');\n", "var baseIteratee = require('./_baseIteratee'),\n baseSortedIndexBy = require('./_baseSortedIndexBy');\n\n/**\n * This method is like `_.sortedIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n * // => 0\n */\nfunction sortedIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, baseIteratee(iteratee, 2));\n}\n\nmodule.exports = sortedIndexBy;\n", "/*\n Copyright (C) 2012-2013 Yusuke Suzuki <utatane.tea@gmail.com>\n Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n/*jslint vars:false, bitwise:true*/\n/*jshint indent:4*/\n/*global exports:true*/\n(function clone(exports) {\n 'use strict';\n\n var Syntax,\n VisitorOption,\n VisitorKeys,\n BREAK,\n SKIP,\n REMOVE;\n\n function deepCopy(obj) {\n var ret = {}, key, val;\n for (key in obj) {\n if (obj.hasOwnProperty(key)) {\n val = obj[key];\n if (typeof val === 'object' && val !== null) {\n ret[key] = deepCopy(val);\n } else {\n ret[key] = val;\n }\n }\n }\n return ret;\n }\n\n // based on LLVM libc++ upper_bound / lower_bound\n // MIT License\n\n function upperBound(array, func) {\n var diff, len, i, current;\n\n len = array.length;\n i = 0;\n\n while (len) {\n diff = len >>> 1;\n current = i + diff;\n if (func(array[current])) {\n len = diff;\n } else {\n i = current + 1;\n len -= diff + 1;\n }\n }\n return i;\n }\n\n Syntax = {\n AssignmentExpression: 'AssignmentExpression',\n AssignmentPattern: 'AssignmentPattern',\n ArrayExpression: 'ArrayExpression',\n ArrayPattern: 'ArrayPattern',\n ArrowFunctionExpression: 'ArrowFunctionExpression',\n AwaitExpression: 'AwaitExpression', // CAUTION: It's deferred to ES7.\n BlockStatement: 'BlockStatement',\n BinaryExpression: 'BinaryExpression',\n BreakStatement: 'BreakStatement',\n CallExpression: 'CallExpression',\n CatchClause: 'CatchClause',\n ChainExpression: 'ChainExpression',\n ClassBody: 'ClassBody',\n ClassDeclaration: 'ClassDeclaration',\n ClassExpression: 'ClassExpression',\n ComprehensionBlock: 'ComprehensionBlock', // CAUTION: It's deferred to ES7.\n ComprehensionExpression: 'ComprehensionExpression', // CAUTION: It's deferred to ES7.\n ConditionalExpression: 'ConditionalExpression',\n ContinueStatement: 'ContinueStatement',\n DebuggerStatement: 'DebuggerStatement',\n DirectiveStatement: 'DirectiveStatement',\n DoWhileStatement: 'DoWhileStatement',\n EmptyStatement: 'EmptyStatement',\n ExportAllDeclaration: 'ExportAllDeclaration',\n ExportDefaultDeclaration: 'ExportDefaultDeclaration',\n ExportNamedDeclaration: 'ExportNamedDeclaration',\n ExportSpecifier: 'ExportSpecifier',\n ExpressionStatement: 'ExpressionStatement',\n ForStatement: 'ForStatement',\n ForInStatement: 'ForInStatement',\n ForOfStatement: 'ForOfStatement',\n FunctionDeclaration: 'FunctionDeclaration',\n FunctionExpression: 'FunctionExpression',\n GeneratorExpression: 'GeneratorExpression', // CAUTION: It's deferred to ES7.\n Identifier: 'Identifier',\n IfStatement: 'IfStatement',\n ImportExpression: 'ImportExpression',\n ImportDeclaration: 'ImportDeclaration',\n ImportDefaultSpecifier: 'ImportDefaultSpecifier',\n ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',\n ImportSpecifier: 'ImportSpecifier',\n Literal: 'Literal',\n LabeledStatement: 'LabeledStatement',\n LogicalExpression: 'LogicalExpression',\n MemberExpression: 'MemberExpression',\n MetaProperty: 'MetaProperty',\n MethodDefinition: 'MethodDefinition',\n ModuleSpecifier: 'ModuleSpecifier',\n NewExpression: 'NewExpression',\n ObjectExpression: 'ObjectExpression',\n ObjectPattern: 'ObjectPattern',\n PrivateIdentifier: 'PrivateIdentifier',\n Program: 'Program',\n Property: 'Property',\n PropertyDefinition: 'PropertyDefinition',\n RestElement: 'RestElement',\n ReturnStatement: 'ReturnStatement',\n SequenceExpression: 'SequenceExpression',\n SpreadElement: 'SpreadElement',\n Super: 'Super',\n SwitchStatement: 'SwitchStatement',\n SwitchCase: 'SwitchCase',\n TaggedTemplateExpression: 'TaggedTemplateExpression',\n TemplateElement: 'TemplateElement',\n TemplateLiteral: 'TemplateLiteral',\n ThisExpression: 'ThisExpression',\n ThrowStatement: 'ThrowStatement',\n TryStatement: 'TryStatement',\n UnaryExpression: 'UnaryExpression',\n UpdateExpression: 'UpdateExpression',\n VariableDeclaration: 'VariableDeclaration',\n VariableDeclarator: 'VariableDeclarator',\n WhileStatement: 'WhileStatement',\n WithStatement: 'WithStatement',\n YieldExpression: 'YieldExpression'\n };\n\n VisitorKeys = {\n AssignmentExpression: ['left', 'right'],\n AssignmentPattern: ['left', 'right'],\n ArrayExpression: ['elements'],\n ArrayPattern: ['elements'],\n ArrowFunctionExpression: ['params', 'body'],\n AwaitExpression: ['argument'], // CAUTION: It's deferred to ES7.\n BlockStatement: ['body'],\n BinaryExpression: ['left', 'right'],\n BreakStatement: ['label'],\n CallExpression: ['callee', 'arguments'],\n CatchClause: ['param', 'body'],\n ChainExpression: ['expression'],\n ClassBody: ['body'],\n ClassDeclaration: ['id', 'superClass', 'body'],\n ClassExpression: ['id', 'superClass', 'body'],\n ComprehensionBlock: ['left', 'right'], // CAUTION: It's deferred to ES7.\n ComprehensionExpression: ['blocks', 'filter', 'body'], // CAUTION: It's deferred to ES7.\n ConditionalExpression: ['test', 'consequent', 'alternate'],\n ContinueStatement: ['label'],\n DebuggerStatement: [],\n DirectiveStatement: [],\n DoWhileStatement: ['body', 'test'],\n EmptyStatement: [],\n ExportAllDeclaration: ['source'],\n ExportDefaultDeclaration: ['declaration'],\n ExportNamedDeclaration: ['declaration', 'specifiers', 'source'],\n ExportSpecifier: ['exported', 'local'],\n ExpressionStatement: ['expression'],\n ForStatement: ['init', 'test', 'update', 'body'],\n ForInStatement: ['left', 'right', 'body'],\n ForOfStatement: ['left', 'right', 'body'],\n FunctionDeclaration: ['id', 'params', 'body'],\n FunctionExpression: ['id', 'params', 'body'],\n GeneratorExpression: ['blocks', 'filter', 'body'], // CAUTION: It's deferred to ES7.\n Identifier: [],\n IfStatement: ['test', 'consequent', 'alternate'],\n ImportExpression: ['source'],\n ImportDeclaration: ['specifiers', 'source'],\n ImportDefaultSpecifier: ['local'],\n ImportNamespaceSpecifier: ['local'],\n ImportSpecifier: ['imported', 'local'],\n Literal: [],\n LabeledStatement: ['label', 'body'],\n LogicalExpression: ['left', 'right'],\n MemberExpression: ['object', 'property'],\n MetaProperty: ['meta', 'property'],\n MethodDefinition: ['key', 'value'],\n ModuleSpecifier: [],\n NewExpression: ['callee', 'arguments'],\n ObjectExpression: ['properties'],\n ObjectPattern: ['properties'],\n PrivateIdentifier: [],\n Program: ['body'],\n Property: ['key', 'value'],\n PropertyDefinition: ['key', 'value'],\n RestElement: [ 'argument' ],\n ReturnStatement: ['argument'],\n SequenceExpression: ['expressions'],\n SpreadElement: ['argument'],\n Super: [],\n SwitchStatement: ['discriminant', 'cases'],\n SwitchCase: ['test', 'consequent'],\n TaggedTemplateExpression: ['tag', 'quasi'],\n TemplateElement: [],\n TemplateLiteral: ['quasis', 'expressions'],\n ThisExpression: [],\n ThrowStatement: ['argument'],\n TryStatement: ['block', 'handler', 'finalizer'],\n UnaryExpression: ['argument'],\n UpdateExpression: ['argument'],\n VariableDeclaration: ['declarations'],\n VariableDeclarator: ['id', 'init'],\n WhileStatement: ['test', 'body'],\n WithStatement: ['object', 'body'],\n YieldExpression: ['argument']\n };\n\n // unique id\n BREAK = {};\n SKIP = {};\n REMOVE = {};\n\n VisitorOption = {\n Break: BREAK,\n Skip: SKIP,\n Remove: REMOVE\n };\n\n function Reference(parent, key) {\n this.parent = parent;\n this.key = key;\n }\n\n Reference.prototype.replace = function replace(node) {\n this.parent[this.key] = node;\n };\n\n Reference.prototype.remove = function remove() {\n if (Array.isArray(this.parent)) {\n this.parent.splice(this.key, 1);\n return true;\n } else {\n this.replace(null);\n return false;\n }\n };\n\n function Element(node, path, wrap, ref) {\n this.node = node;\n this.path = path;\n this.wrap = wrap;\n this.ref = ref;\n }\n\n function Controller() { }\n\n // API:\n // return property path array from root to current node\n Controller.prototype.path = function path() {\n var i, iz, j, jz, result, element;\n\n function addToPath(result, path) {\n if (Array.isArray(path)) {\n for (j = 0, jz = path.length; j < jz; ++j) {\n result.push(path[j]);\n }\n } else {\n result.push(path);\n }\n }\n\n // root node\n if (!this.__current.path) {\n return null;\n }\n\n // first node is sentinel, second node is root element\n result = [];\n for (i = 2, iz = this.__leavelist.length; i < iz; ++i) {\n element = this.__leavelist[i];\n addToPath(result, element.path);\n }\n addToPath(result, this.__current.path);\n return result;\n };\n\n // API:\n // return type of current node\n Controller.prototype.type = function () {\n var node = this.current();\n return node.type || this.__current.wrap;\n };\n\n // API:\n // return array of parent elements\n Controller.prototype.parents = function parents() {\n var i, iz, result;\n\n // first node is sentinel\n result = [];\n for (i = 1, iz = this.__leavelist.length; i < iz; ++i) {\n result.push(this.__leavelist[i].node);\n }\n\n return result;\n };\n\n // API:\n // return current node\n Controller.prototype.current = function current() {\n return this.__current.node;\n };\n\n Controller.prototype.__execute = function __execute(callback, element) {\n var previous, result;\n\n result = undefined;\n\n previous = this.__current;\n this.__current = element;\n this.__state = null;\n if (callback) {\n result = callback.call(this, element.node, this.__leavelist[this.__leavelist.length - 1].node);\n }\n this.__current = previous;\n\n return result;\n };\n\n // API:\n // notify control skip / break\n Controller.prototype.notify = function notify(flag) {\n this.__state = flag;\n };\n\n // API:\n // skip child nodes of current node\n Controller.prototype.skip = function () {\n this.notify(SKIP);\n };\n\n // API:\n // break traversals\n Controller.prototype['break'] = function () {\n this.notify(BREAK);\n };\n\n // API:\n // remove node\n Controller.prototype.remove = function () {\n this.notify(REMOVE);\n };\n\n Controller.prototype.__initialize = function(root, visitor) {\n this.visitor = visitor;\n this.root = root;\n this.__worklist = [];\n this.__leavelist = [];\n this.__current = null;\n this.__state = null;\n this.__fallback = null;\n if (visitor.fallback === 'iteration') {\n this.__fallback = Object.keys;\n } else if (typeof visitor.fallback === 'function') {\n this.__fallback = visitor.fallback;\n }\n\n this.__keys = VisitorKeys;\n if (visitor.keys) {\n this.__keys = Object.assign(Object.create(this.__keys), visitor.keys);\n }\n };\n\n function isNode(node) {\n if (node == null) {\n return false;\n }\n return typeof node === 'object' && typeof node.type === 'string';\n }\n\n function isProperty(nodeType, key) {\n return (nodeType === Syntax.ObjectExpression || nodeType === Syntax.ObjectPattern) && 'properties' === key;\n }\n \n function candidateExistsInLeaveList(leavelist, candidate) {\n for (var i = leavelist.length - 1; i >= 0; --i) {\n if (leavelist[i].node === candidate) {\n return true;\n }\n }\n return false;\n }\n\n Controller.prototype.traverse = function traverse(root, visitor) {\n var worklist,\n leavelist,\n element,\n node,\n nodeType,\n ret,\n key,\n current,\n current2,\n candidates,\n candidate,\n sentinel;\n\n this.__initialize(root, visitor);\n\n sentinel = {};\n\n // reference\n worklist = this.__worklist;\n leavelist = this.__leavelist;\n\n // initialize\n worklist.push(new Element(root, null, null, null));\n leavelist.push(new Element(null, null, null, null));\n\n while (worklist.length) {\n element = worklist.pop();\n\n if (element === sentinel) {\n element = leavelist.pop();\n\n ret = this.__execute(visitor.leave, element);\n\n if (this.__state === BREAK || ret === BREAK) {\n return;\n }\n continue;\n }\n\n if (element.node) {\n\n ret = this.__execute(visitor.enter, element);\n\n if (this.__state === BREAK || ret === BREAK) {\n return;\n }\n\n worklist.push(sentinel);\n leavelist.push(element);\n\n if (this.__state === SKIP || ret === SKIP) {\n continue;\n }\n\n node = element.node;\n nodeType = node.type || element.wrap;\n candidates = this.__keys[nodeType];\n if (!candidates) {\n if (this.__fallback) {\n candidates = this.__fallback(node);\n } else {\n throw new Error('Unknown node type ' + nodeType + '.');\n }\n }\n\n current = candidates.length;\n while ((current -= 1) >= 0) {\n key = candidates[current];\n candidate = node[key];\n if (!candidate) {\n continue;\n }\n\n if (Array.isArray(candidate)) {\n current2 = candidate.length;\n while ((current2 -= 1) >= 0) {\n if (!candidate[current2]) {\n continue;\n }\n\n if (candidateExistsInLeaveList(leavelist, candidate[current2])) {\n continue;\n }\n\n if (isProperty(nodeType, candidates[current])) {\n element = new Element(candidate[current2], [key, current2], 'Property', null);\n } else if (isNode(candidate[current2])) {\n element = new Element(candidate[current2], [key, current2], null, null);\n } else {\n continue;\n }\n worklist.push(element);\n }\n } else if (isNode(candidate)) {\n if (candidateExistsInLeaveList(leavelist, candidate)) {\n continue;\n }\n\n worklist.push(new Element(candidate, key, null, null));\n }\n }\n }\n }\n };\n\n Controller.prototype.replace = function replace(root, visitor) {\n var worklist,\n leavelist,\n node,\n nodeType,\n target,\n element,\n current,\n current2,\n candidates,\n candidate,\n sentinel,\n outer,\n key;\n\n function removeElem(element) {\n var i,\n key,\n nextElem,\n parent;\n\n if (element.ref.remove()) {\n // When the reference is an element of an array.\n key = element.ref.key;\n parent = element.ref.parent;\n\n // If removed from array, then decrease following items' keys.\n i = worklist.length;\n while (i--) {\n nextElem = worklist[i];\n if (nextElem.ref && nextElem.ref.parent === parent) {\n if (nextElem.ref.key < key) {\n break;\n }\n --nextElem.ref.key;\n }\n }\n }\n }\n\n this.__initialize(root, visitor);\n\n sentinel = {};\n\n // reference\n worklist = this.__worklist;\n leavelist = this.__leavelist;\n\n // initialize\n outer = {\n root: root\n };\n element = new Element(root, null, null, new Reference(outer, 'root'));\n worklist.push(element);\n leavelist.push(element);\n\n while (worklist.length) {\n element = worklist.pop();\n\n if (element === sentinel) {\n element = leavelist.pop();\n\n target = this.__execute(visitor.leave, element);\n\n // node may be replaced with null,\n // so distinguish between undefined and null in this place\n if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {\n // replace\n element.ref.replace(target);\n }\n\n if (this.__state === REMOVE || target === REMOVE) {\n removeElem(element);\n }\n\n if (this.__state === BREAK || target === BREAK) {\n return outer.root;\n }\n continue;\n }\n\n target = this.__execute(visitor.enter, element);\n\n // node may be replaced with null,\n // so distinguish between undefined and null in this place\n if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {\n // replace\n element.ref.replace(target);\n element.node = target;\n }\n\n if (this.__state === REMOVE || target === REMOVE) {\n removeElem(element);\n element.node = null;\n }\n\n if (this.__state === BREAK || target === BREAK) {\n return outer.root;\n }\n\n // node may be null\n node = element.node;\n if (!node) {\n continue;\n }\n\n worklist.push(sentinel);\n leavelist.push(element);\n\n if (this.__state === SKIP || target === SKIP) {\n continue;\n }\n\n nodeType = node.type || element.wrap;\n candidates = this.__keys[nodeType];\n if (!candidates) {\n if (this.__fallback) {\n candidates = this.__fallback(node);\n } else {\n throw new Error('Unknown node type ' + nodeType + '.');\n }\n }\n\n current = candidates.length;\n while ((current -= 1) >= 0) {\n key = candidates[current];\n candidate = node[key];\n if (!candidate) {\n continue;\n }\n\n if (Array.isArray(candidate)) {\n current2 = candidate.length;\n while ((current2 -= 1) >= 0) {\n if (!candidate[current2]) {\n continue;\n }\n if (isProperty(nodeType, candidates[current])) {\n element = new Element(candidate[current2], [key, current2], 'Property', new Reference(candidate, current2));\n } else if (isNode(candidate[current2])) {\n element = new Element(candidate[current2], [key, current2], null, new Reference(candidate, current2));\n } else {\n continue;\n }\n worklist.push(element);\n }\n } else if (isNode(candidate)) {\n worklist.push(new Element(candidate, key, null, new Reference(node, key)));\n }\n }\n }\n\n return outer.root;\n };\n\n function traverse(root, visitor) {\n var controller = new Controller();\n return controller.traverse(root, visitor);\n }\n\n function replace(root, visitor) {\n var controller = new Controller();\n return controller.replace(root, visitor);\n }\n\n function extendCommentRange(comment, tokens) {\n var target;\n\n target = upperBound(tokens, function search(token) {\n return token.range[0] > comment.range[0];\n });\n\n comment.extendedRange = [comment.range[0], comment.range[1]];\n\n if (target !== tokens.length) {\n comment.extendedRange[1] = tokens[target].range[0];\n }\n\n target -= 1;\n if (target >= 0) {\n comment.extendedRange[0] = tokens[target].range[1];\n }\n\n return comment;\n }\n\n function attachComments(tree, providedComments, tokens) {\n // At first, we should calculate extended comment ranges.\n var comments = [], comment, len, i, cursor;\n\n if (!tree.range) {\n throw new Error('attachComments needs range information');\n }\n\n // tokens array is empty, we attach comments to tree as 'leadingComments'\n if (!tokens.length) {\n if (providedComments.length) {\n for (i = 0, len = providedComments.length; i < len; i += 1) {\n comment = deepCopy(providedComments[i]);\n comment.extendedRange = [0, tree.range[0]];\n comments.push(comment);\n }\n tree.leadingComments = comments;\n }\n return tree;\n }\n\n for (i = 0, len = providedComments.length; i < len; i += 1) {\n comments.push(extendCommentRange(deepCopy(providedComments[i]), tokens));\n }\n\n // This is based on John Freeman's implementation.\n cursor = 0;\n traverse(tree, {\n enter: function (node) {\n var comment;\n\n while (cursor < comments.length) {\n comment = comments[cursor];\n if (comment.extendedRange[1] > node.range[0]) {\n break;\n }\n\n if (comment.extendedRange[1] === node.range[0]) {\n if (!node.leadingComments) {\n node.leadingComments = [];\n }\n node.leadingComments.push(comment);\n comments.splice(cursor, 1);\n } else {\n cursor += 1;\n }\n }\n\n // already out of owned node\n if (cursor === comments.length) {\n return VisitorOption.Break;\n }\n\n if (comments[cursor].extendedRange[0] > node.range[1]) {\n return VisitorOption.Skip;\n }\n }\n });\n\n cursor = 0;\n traverse(tree, {\n leave: function (node) {\n var comment;\n\n while (cursor < comments.length) {\n comment = comments[cursor];\n if (node.range[1] < comment.extendedRange[0]) {\n break;\n }\n\n if (node.range[1] === comment.extendedRange[0]) {\n if (!node.trailingComments) {\n node.trailingComments = [];\n }\n node.trailingComments.push(comment);\n comments.splice(cursor, 1);\n } else {\n cursor += 1;\n }\n }\n\n // already out of owned node\n if (cursor === comments.length) {\n return VisitorOption.Break;\n }\n\n if (comments[cursor].extendedRange[0] > node.range[1]) {\n return VisitorOption.Skip;\n }\n }\n });\n\n return tree;\n }\n\n exports.Syntax = Syntax;\n exports.traverse = traverse;\n exports.replace = replace;\n exports.attachComments = attachComments;\n exports.VisitorKeys = VisitorKeys;\n exports.VisitorOption = VisitorOption;\n exports.Controller = Controller;\n exports.cloneEnvironment = function () { return clone({}); };\n\n return exports;\n}(exports));\n/* vim: set sw=4 ts=4 et tw=80 : */\n", "{\n \"name\": \"esrecurse\",\n \"description\": \"ECMAScript AST recursive visitor\",\n \"homepage\": \"https://github.com/estools/esrecurse\",\n \"main\": \"esrecurse.js\",\n \"version\": \"4.3.0\",\n \"engines\": {\n \"node\": \">=4.0\"\n },\n \"maintainers\": [\n {\n \"name\": \"Yusuke Suzuki\",\n \"email\": \"utatane.tea@gmail.com\",\n \"web\": \"https://github.com/Constellation\"\n }\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/estools/esrecurse.git\"\n },\n \"dependencies\": {\n \"estraverse\": \"^5.2.0\"\n },\n \"devDependencies\": {\n \"babel-cli\": \"^6.24.1\",\n \"babel-eslint\": \"^7.2.3\",\n \"babel-preset-es2015\": \"^6.24.1\",\n \"babel-register\": \"^6.24.1\",\n \"chai\": \"^4.0.2\",\n \"esprima\": \"^4.0.0\",\n \"gulp\": \"^3.9.0\",\n \"gulp-bump\": \"^2.7.0\",\n \"gulp-eslint\": \"^4.0.0\",\n \"gulp-filter\": \"^5.0.0\",\n \"gulp-git\": \"^2.4.1\",\n \"gulp-mocha\": \"^4.3.1\",\n \"gulp-tag-version\": \"^1.2.1\",\n \"jsdoc\": \"^3.3.0-alpha10\",\n \"minimist\": \"^1.1.0\"\n },\n \"license\": \"BSD-2-Clause\",\n \"scripts\": {\n \"test\": \"gulp travis\",\n \"unit-test\": \"gulp test\",\n \"lint\": \"gulp lint\"\n },\n \"babel\": {\n \"presets\": [\n \"es2015\"\n ]\n }\n}\n", "/*\n Copyright (C) 2014 Yusuke Suzuki <utatane.tea@gmail.com>\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n(function () {\n 'use strict';\n\n var estraverse = require('estraverse');\n\n function isNode(node) {\n if (node == null) {\n return false;\n }\n return typeof node === 'object' && typeof node.type === 'string';\n }\n\n function isProperty(nodeType, key) {\n return (nodeType === estraverse.Syntax.ObjectExpression || nodeType === estraverse.Syntax.ObjectPattern) && key === 'properties';\n }\n\n function Visitor(visitor, options) {\n options = options || {};\n\n this.__visitor = visitor || this;\n this.__childVisitorKeys = options.childVisitorKeys\n ? Object.assign({}, estraverse.VisitorKeys, options.childVisitorKeys)\n : estraverse.VisitorKeys;\n if (options.fallback === 'iteration') {\n this.__fallback = Object.keys;\n } else if (typeof options.fallback === 'function') {\n this.__fallback = options.fallback;\n }\n }\n\n /* Default method for visiting children.\n * When you need to call default visiting operation inside custom visiting\n * operation, you can use it with `this.visitChildren(node)`.\n */\n Visitor.prototype.visitChildren = function (node) {\n var type, children, i, iz, j, jz, child;\n\n if (node == null) {\n return;\n }\n\n type = node.type || estraverse.Syntax.Property;\n\n children = this.__childVisitorKeys[type];\n if (!children) {\n if (this.__fallback) {\n children = this.__fallback(node);\n } else {\n throw new Error('Unknown node type ' + type + '.');\n }\n }\n\n for (i = 0, iz = children.length; i < iz; ++i) {\n child = node[children[i]];\n if (child) {\n if (Array.isArray(child)) {\n for (j = 0, jz = child.length; j < jz; ++j) {\n if (child[j]) {\n if (isNode(child[j]) || isProperty(type, children[i])) {\n this.visit(child[j]);\n }\n }\n }\n } else if (isNode(child)) {\n this.visit(child);\n }\n }\n }\n };\n\n /* Dispatching node. */\n Visitor.prototype.visit = function (node) {\n var type;\n\n if (node == null) {\n return;\n }\n\n type = node.type || estraverse.Syntax.Property;\n if (this.__visitor[type]) {\n this.__visitor[type].call(this, node);\n return;\n }\n this.visitChildren(node);\n };\n\n exports.version = require('./package.json').version;\n exports.Visitor = Visitor;\n exports.visit = function (node, visitor, options) {\n var v = new Visitor(visitor, options);\n v.visit(node);\n };\n}());\n/* vim: set sw=4 ts=4 et tw=80 : */\n", "'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar assert = require('assert');\nvar estraverse = require('estraverse');\nvar esrecurse = require('esrecurse');\n\nfunction _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }\n\nvar assert__default = /*#__PURE__*/_interopDefaultLegacy(assert);\nvar estraverse__default = /*#__PURE__*/_interopDefaultLegacy(estraverse);\nvar esrecurse__default = /*#__PURE__*/_interopDefaultLegacy(esrecurse);\n\n/*\n Copyright (C) 2015 Yusuke Suzuki <utatane.tea@gmail.com>\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\nconst READ = 0x1;\nconst WRITE = 0x2;\nconst RW = READ | WRITE;\n\n/**\n * A Reference represents a single occurrence of an identifier in code.\n * @constructor Reference\n */\nclass Reference {\n constructor(ident, scope, flag, writeExpr, maybeImplicitGlobal, partial, init) {\n\n /**\n * Identifier syntax node.\n * @member {espreeIdentifier} Reference#identifier\n */\n this.identifier = ident;\n\n /**\n * Reference to the enclosing Scope.\n * @member {Scope} Reference#from\n */\n this.from = scope;\n\n /**\n * Whether the reference comes from a dynamic scope (such as 'eval',\n * 'with', etc.), and may be trapped by dynamic scopes.\n * @member {boolean} Reference#tainted\n */\n this.tainted = false;\n\n /**\n * The variable this reference is resolved with.\n * @member {Variable} Reference#resolved\n */\n this.resolved = null;\n\n /**\n * The read-write mode of the reference. (Value is one of {@link\n * Reference.READ}, {@link Reference.RW}, {@link Reference.WRITE}).\n * @member {number} Reference#flag\n * @private\n */\n this.flag = flag;\n if (this.isWrite()) {\n\n /**\n * If reference is writeable, this is the tree being written to it.\n * @member {espreeNode} Reference#writeExpr\n */\n this.writeExpr = writeExpr;\n\n /**\n * Whether the Reference might refer to a partial value of writeExpr.\n * @member {boolean} Reference#partial\n */\n this.partial = partial;\n\n /**\n * Whether the Reference is to write of initialization.\n * @member {boolean} Reference#init\n */\n this.init = init;\n }\n this.__maybeImplicitGlobal = maybeImplicitGlobal;\n }\n\n /**\n * Whether the reference is static.\n * @function Reference#isStatic\n * @returns {boolean} static\n */\n isStatic() {\n return !this.tainted && this.resolved && this.resolved.scope.isStatic();\n }\n\n /**\n * Whether the reference is writeable.\n * @function Reference#isWrite\n * @returns {boolean} write\n */\n isWrite() {\n return !!(this.flag & Reference.WRITE);\n }\n\n /**\n * Whether the reference is readable.\n * @function Reference#isRead\n * @returns {boolean} read\n */\n isRead() {\n return !!(this.flag & Reference.READ);\n }\n\n /**\n * Whether the reference is read-only.\n * @function Reference#isReadOnly\n * @returns {boolean} read only\n */\n isReadOnly() {\n return this.flag === Reference.READ;\n }\n\n /**\n * Whether the reference is write-only.\n * @function Reference#isWriteOnly\n * @returns {boolean} write only\n */\n isWriteOnly() {\n return this.flag === Reference.WRITE;\n }\n\n /**\n * Whether the reference is read-write.\n * @function Reference#isReadWrite\n * @returns {boolean} read write\n */\n isReadWrite() {\n return this.flag === Reference.RW;\n }\n}\n\n/**\n * @constant Reference.READ\n * @private\n */\nReference.READ = READ;\n\n/**\n * @constant Reference.WRITE\n * @private\n */\nReference.WRITE = WRITE;\n\n/**\n * @constant Reference.RW\n * @private\n */\nReference.RW = RW;\n\n/* vim: set sw=4 ts=4 et tw=80 : */\n\n/*\n Copyright (C) 2015 Yusuke Suzuki <utatane.tea@gmail.com>\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/**\n * A Variable represents a locally scoped identifier. These include arguments to\n * functions.\n * @constructor Variable\n */\nclass Variable {\n constructor(name, scope) {\n\n /**\n * The variable name, as given in the source code.\n * @member {string} Variable#name\n */\n this.name = name;\n\n /**\n * List of defining occurrences of this variable (like in 'var ...'\n * statements or as parameter), as AST nodes.\n * @member {espree.Identifier[]} Variable#identifiers\n */\n this.identifiers = [];\n\n /**\n * List of {@link Reference|references} of this variable (excluding parameter entries)\n * in its defining scope and all nested scopes. For defining\n * occurrences only see {@link Variable#defs}.\n * @member {Reference[]} Variable#references\n */\n this.references = [];\n\n /**\n * List of defining occurrences of this variable (like in 'var ...'\n * statements or as parameter), as custom objects.\n * @member {Definition[]} Variable#defs\n */\n this.defs = [];\n\n this.tainted = false;\n\n /**\n * Whether this is a stack variable.\n * @member {boolean} Variable#stack\n */\n this.stack = true;\n\n /**\n * Reference to the enclosing Scope.\n * @member {Scope} Variable#scope\n */\n this.scope = scope;\n }\n}\n\nVariable.CatchClause = \"CatchClause\";\nVariable.Parameter = \"Parameter\";\nVariable.FunctionName = \"FunctionName\";\nVariable.ClassName = \"ClassName\";\nVariable.Variable = \"Variable\";\nVariable.ImportBinding = \"ImportBinding\";\nVariable.ImplicitGlobalVariable = \"ImplicitGlobalVariable\";\n\n/* vim: set sw=4 ts=4 et tw=80 : */\n\n/*\n Copyright (C) 2015 Yusuke Suzuki <utatane.tea@gmail.com>\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/**\n * @constructor Definition\n */\nclass Definition {\n constructor(type, name, node, parent, index, kind) {\n\n /**\n * @member {string} Definition#type - type of the occurrence (e.g. \"Parameter\", \"Variable\", ...).\n */\n this.type = type;\n\n /**\n * @member {espree.Identifier} Definition#name - the identifier AST node of the occurrence.\n */\n this.name = name;\n\n /**\n * @member {espree.Node} Definition#node - the enclosing node of the identifier.\n */\n this.node = node;\n\n /**\n * @member {espree.Node?} Definition#parent - the enclosing statement node of the identifier.\n */\n this.parent = parent;\n\n /**\n * @member {number?} Definition#index - the index in the declaration statement.\n */\n this.index = index;\n\n /**\n * @member {string?} Definition#kind - the kind of the declaration statement.\n */\n this.kind = kind;\n }\n}\n\n/**\n * @constructor ParameterDefinition\n */\nclass ParameterDefinition extends Definition {\n constructor(name, node, index, rest) {\n super(Variable.Parameter, name, node, null, index, null);\n\n /**\n * Whether the parameter definition is a part of a rest parameter.\n * @member {boolean} ParameterDefinition#rest\n */\n this.rest = rest;\n }\n}\n\n/* vim: set sw=4 ts=4 et tw=80 : */\n\n/*\n Copyright (C) 2015 Yusuke Suzuki <utatane.tea@gmail.com>\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\nconst { Syntax: Syntax$2 } = estraverse__default[\"default\"];\n\n/**\n * Test if scope is struct\n * @param {Scope} scope scope\n * @param {Block} block block\n * @param {boolean} isMethodDefinition is method definition\n * @param {boolean} useDirective use directive\n * @returns {boolean} is strict scope\n */\nfunction isStrictScope(scope, block, isMethodDefinition, useDirective) {\n let body;\n\n // When upper scope is exists and strict, inner scope is also strict.\n if (scope.upper && scope.upper.isStrict) {\n return true;\n }\n\n if (isMethodDefinition) {\n return true;\n }\n\n if (scope.type === \"class\" || scope.type === \"module\") {\n return true;\n }\n\n if (scope.type === \"block\" || scope.type === \"switch\") {\n return false;\n }\n\n if (scope.type === \"function\") {\n if (block.type === Syntax$2.ArrowFunctionExpression && block.body.type !== Syntax$2.BlockStatement) {\n return false;\n }\n\n if (block.type === Syntax$2.Program) {\n body = block;\n } else {\n body = block.body;\n }\n\n if (!body) {\n return false;\n }\n } else if (scope.type === \"global\") {\n body = block;\n } else {\n return false;\n }\n\n // Search 'use strict' directive.\n if (useDirective) {\n for (let i = 0, iz = body.body.length; i < iz; ++i) {\n const stmt = body.body[i];\n\n if (stmt.type !== Syntax$2.DirectiveStatement) {\n break;\n }\n if (stmt.raw === \"\\\"use strict\\\"\" || stmt.raw === \"'use strict'\") {\n return true;\n }\n }\n } else {\n for (let i = 0, iz = body.body.length; i < iz; ++i) {\n const stmt = body.body[i];\n\n if (stmt.type !== Syntax$2.ExpressionStatement) {\n break;\n }\n const expr = stmt.expression;\n\n if (expr.type !== Syntax$2.Literal || typeof expr.value !== \"string\") {\n break;\n }\n if (expr.raw !== null && expr.raw !== undefined) {\n if (expr.raw === \"\\\"use strict\\\"\" || expr.raw === \"'use strict'\") {\n return true;\n }\n } else {\n if (expr.value === \"use strict\") {\n return true;\n }\n }\n }\n }\n return false;\n}\n\n/**\n * Register scope\n * @param {ScopeManager} scopeManager scope manager\n * @param {Scope} scope scope\n * @returns {void}\n */\nfunction registerScope(scopeManager, scope) {\n scopeManager.scopes.push(scope);\n\n const scopes = scopeManager.__nodeToScope.get(scope.block);\n\n if (scopes) {\n scopes.push(scope);\n } else {\n scopeManager.__nodeToScope.set(scope.block, [scope]);\n }\n}\n\n/**\n * Should be statically\n * @param {Object} def def\n * @returns {boolean} should be statically\n */\nfunction shouldBeStatically(def) {\n return (\n (def.type === Variable.ClassName) ||\n (def.type === Variable.Variable && def.parent.kind !== \"var\")\n );\n}\n\n/**\n * @constructor Scope\n */\nclass Scope {\n constructor(scopeManager, type, upperScope, block, isMethodDefinition) {\n\n /**\n * One of \"global\", \"module\", \"function\", \"function-expression-name\", \"block\", \"switch\", \"catch\", \"with\", \"for\",\n * \"class\", \"class-field-initializer\", \"class-static-block\".\n * @member {string} Scope#type\n */\n this.type = type;\n\n /**\n * The scoped {@link Variable}s of this scope, as <code>{ Variable.name\n * : Variable }</code>.\n * @member {Map} Scope#set\n */\n this.set = new Map();\n\n /**\n * The tainted variables of this scope, as <code>{ Variable.name :\n * boolean }</code>.\n * @member {Map} Scope#taints */\n this.taints = new Map();\n\n /**\n * Generally, through the lexical scoping of JS you can always know\n * which variable an identifier in the source code refers to. There are\n * a few exceptions to this rule. With 'global' and 'with' scopes you\n * can only decide at runtime which variable a reference refers to.\n * Moreover, if 'eval()' is used in a scope, it might introduce new\n * bindings in this or its parent scopes.\n * All those scopes are considered 'dynamic'.\n * @member {boolean} Scope#dynamic\n */\n this.dynamic = this.type === \"global\" || this.type === \"with\";\n\n /**\n * A reference to the scope-defining syntax node.\n * @member {espree.Node} Scope#block\n */\n this.block = block;\n\n /**\n * The {@link Reference|references} that are not resolved with this scope.\n * @member {Reference[]} Scope#through\n */\n this.through = [];\n\n /**\n * The scoped {@link Variable}s of this scope. In the case of a\n * 'function' scope this includes the automatic argument <em>arguments</em> as\n * its first element, as well as all further formal arguments.\n * @member {Variable[]} Scope#variables\n */\n this.variables = [];\n\n /**\n * Any variable {@link Reference|reference} found in this scope. This\n * includes occurrences of local variables as well as variables from\n * parent scopes (including the global scope). For local variables\n * this also includes defining occurrences (like in a 'var' statement).\n * In a 'function' scope this does not include the occurrences of the\n * formal parameter in the parameter list.\n * @member {Reference[]} Scope#references\n */\n this.references = [];\n\n /**\n * For 'global' and 'function' scopes, this is a self-reference. For\n * other scope types this is the <em>variableScope</em> value of the\n * parent scope.\n * @member {Scope} Scope#variableScope\n */\n this.variableScope =\n this.type === \"global\" ||\n this.type === \"module\" ||\n this.type === \"function\" ||\n this.type === \"class-field-initializer\" ||\n this.type === \"class-static-block\"\n ? this\n : upperScope.variableScope;\n\n /**\n * Whether this scope is created by a FunctionExpression.\n * @member {boolean} Scope#functionExpressionScope\n */\n this.functionExpressionScope = false;\n\n /**\n * Whether this is a scope that contains an 'eval()' invocation.\n * @member {boolean} Scope#directCallToEvalScope\n */\n this.directCallToEvalScope = false;\n\n /**\n * @member {boolean} Scope#thisFound\n */\n this.thisFound = false;\n\n this.__left = [];\n\n /**\n * Reference to the parent {@link Scope|scope}.\n * @member {Scope} Scope#upper\n */\n this.upper = upperScope;\n\n /**\n * Whether 'use strict' is in effect in this scope.\n * @member {boolean} Scope#isStrict\n */\n this.isStrict = scopeManager.isStrictModeSupported()\n ? isStrictScope(this, block, isMethodDefinition, scopeManager.__useDirective())\n : false;\n\n /**\n * List of nested {@link Scope}s.\n * @member {Scope[]} Scope#childScopes\n */\n this.childScopes = [];\n if (this.upper) {\n this.upper.childScopes.push(this);\n }\n\n this.__declaredVariables = scopeManager.__declaredVariables;\n\n registerScope(scopeManager, this);\n }\n\n __shouldStaticallyClose(scopeManager) {\n return (!this.dynamic || scopeManager.__isOptimistic());\n }\n\n __shouldStaticallyCloseForGlobal(ref) {\n\n // On global scope, let/const/class declarations should be resolved statically.\n const name = ref.identifier.name;\n\n if (!this.set.has(name)) {\n return false;\n }\n\n const variable = this.set.get(name);\n const defs = variable.defs;\n\n return defs.length > 0 && defs.every(shouldBeStatically);\n }\n\n __staticCloseRef(ref) {\n if (!this.__resolve(ref)) {\n this.__delegateToUpperScope(ref);\n }\n }\n\n __dynamicCloseRef(ref) {\n\n // notify all names are through to global\n let current = this;\n\n do {\n current.through.push(ref);\n current = current.upper;\n } while (current);\n }\n\n __globalCloseRef(ref) {\n\n // let/const/class declarations should be resolved statically.\n // others should be resolved dynamically.\n if (this.__shouldStaticallyCloseForGlobal(ref)) {\n this.__staticCloseRef(ref);\n } else {\n this.__dynamicCloseRef(ref);\n }\n }\n\n __close(scopeManager) {\n let closeRef;\n\n if (this.__shouldStaticallyClose(scopeManager)) {\n closeRef = this.__staticCloseRef;\n } else if (this.type !== \"global\") {\n closeRef = this.__dynamicCloseRef;\n } else {\n closeRef = this.__globalCloseRef;\n }\n\n // Try Resolving all references in this scope.\n for (let i = 0, iz = this.__left.length; i < iz; ++i) {\n const ref = this.__left[i];\n\n closeRef.call(this, ref);\n }\n this.__left = null;\n\n return this.upper;\n }\n\n // To override by function scopes.\n // References in default parameters isn't resolved to variables which are in their function body.\n __isValidResolution(ref, variable) { // eslint-disable-line class-methods-use-this, no-unused-vars\n return true;\n }\n\n __resolve(ref) {\n const name = ref.identifier.name;\n\n if (!this.set.has(name)) {\n return false;\n }\n const variable = this.set.get(name);\n\n if (!this.__isValidResolution(ref, variable)) {\n return false;\n }\n variable.references.push(ref);\n variable.stack = variable.stack && ref.from.variableScope === this.variableScope;\n if (ref.tainted) {\n variable.tainted = true;\n this.taints.set(variable.name, true);\n }\n ref.resolved = variable;\n\n return true;\n }\n\n __delegateToUpperScope(ref) {\n if (this.upper) {\n this.upper.__left.push(ref);\n }\n this.through.push(ref);\n }\n\n __addDeclaredVariablesOfNode(variable, node) {\n if (node === null || node === undefined) {\n return;\n }\n\n let variables = this.__declaredVariables.get(node);\n\n if (variables === null || variables === undefined) {\n variables = [];\n this.__declaredVariables.set(node, variables);\n }\n if (variables.indexOf(variable) === -1) {\n variables.push(variable);\n }\n }\n\n __defineGeneric(name, set, variables, node, def) {\n let variable;\n\n variable = set.get(name);\n if (!variable) {\n variable = new Variable(name, this);\n set.set(name, variable);\n variables.push(variable);\n }\n\n if (def) {\n variable.defs.push(def);\n this.__addDeclaredVariablesOfNode(variable, def.node);\n this.__addDeclaredVariablesOfNode(variable, def.parent);\n }\n if (node) {\n variable.identifiers.push(node);\n }\n }\n\n __define(node, def) {\n if (node && node.type === Syntax$2.Identifier) {\n this.__defineGeneric(\n node.name,\n this.set,\n this.variables,\n node,\n def\n );\n }\n }\n\n __referencing(node, assign, writeExpr, maybeImplicitGlobal, partial, init) {\n\n // because Array element may be null\n if (!node || node.type !== Syntax$2.Identifier) {\n return;\n }\n\n // Specially handle like `this`.\n if (node.name === \"super\") {\n return;\n }\n\n const ref = new Reference(node, this, assign || Reference.READ, writeExpr, maybeImplicitGlobal, !!partial, !!init);\n\n this.references.push(ref);\n this.__left.push(ref);\n }\n\n __detectEval() {\n let current = this;\n\n this.directCallToEvalScope = true;\n do {\n current.dynamic = true;\n current = current.upper;\n } while (current);\n }\n\n __detectThis() {\n this.thisFound = true;\n }\n\n __isClosed() {\n return this.__left === null;\n }\n\n /**\n * returns resolved {Reference}\n * @function Scope#resolve\n * @param {Espree.Identifier} ident identifier to be resolved.\n * @returns {Reference} reference\n */\n resolve(ident) {\n let ref, i, iz;\n\n assert__default[\"default\"](this.__isClosed(), \"Scope should be closed.\");\n assert__default[\"default\"](ident.type === Syntax$2.Identifier, \"Target should be identifier.\");\n for (i = 0, iz = this.references.length; i < iz; ++i) {\n ref = this.references[i];\n if (ref.identifier === ident) {\n return ref;\n }\n }\n return null;\n }\n\n /**\n * returns this scope is static\n * @function Scope#isStatic\n * @returns {boolean} static\n */\n isStatic() {\n return !this.dynamic;\n }\n\n /**\n * returns this scope has materialized arguments\n * @function Scope#isArgumentsMaterialized\n * @returns {boolean} arguemnts materialized\n */\n isArgumentsMaterialized() { // eslint-disable-line class-methods-use-this\n return true;\n }\n\n /**\n * returns this scope has materialized `this` reference\n * @function Scope#isThisMaterialized\n * @returns {boolean} this materialized\n */\n isThisMaterialized() { // eslint-disable-line class-methods-use-this\n return true;\n }\n\n isUsedName(name) {\n if (this.set.has(name)) {\n return true;\n }\n for (let i = 0, iz = this.through.length; i < iz; ++i) {\n if (this.through[i].identifier.name === name) {\n return true;\n }\n }\n return false;\n }\n}\n\nclass GlobalScope extends Scope {\n constructor(scopeManager, block) {\n super(scopeManager, \"global\", null, block, false);\n this.implicit = {\n set: new Map(),\n variables: [],\n\n /**\n * List of {@link Reference}s that are left to be resolved (i.e. which\n * need to be linked to the variable they refer to).\n * @member {Reference[]} Scope#implicit#left\n */\n left: []\n };\n }\n\n __close(scopeManager) {\n const implicit = [];\n\n for (let i = 0, iz = this.__left.length; i < iz; ++i) {\n const ref = this.__left[i];\n\n if (ref.__maybeImplicitGlobal && !this.set.has(ref.identifier.name)) {\n implicit.push(ref.__maybeImplicitGlobal);\n }\n }\n\n // create an implicit global variable from assignment expression\n for (let i = 0, iz = implicit.length; i < iz; ++i) {\n const info = implicit[i];\n\n this.__defineImplicit(info.pattern,\n new Definition(\n Variable.ImplicitGlobalVariable,\n info.pattern,\n info.node,\n null,\n null,\n null\n ));\n\n }\n\n this.implicit.left = this.__left;\n\n return super.__close(scopeManager);\n }\n\n __defineImplicit(node, def) {\n if (node && node.type === Syntax$2.Identifier) {\n this.__defineGeneric(\n node.name,\n this.implicit.set,\n this.implicit.variables,\n node,\n def\n );\n }\n }\n}\n\nclass ModuleScope extends Scope {\n constructor(scopeManager, upperScope, block) {\n super(scopeManager, \"module\", upperScope, block, false);\n }\n}\n\nclass FunctionExpressionNameScope extends Scope {\n constructor(scopeManager, upperScope, block) {\n super(scopeManager, \"function-expression-name\", upperScope, block, false);\n this.__define(block.id,\n new Definition(\n Variable.FunctionName,\n block.id,\n block,\n null,\n null,\n null\n ));\n this.functionExpressionScope = true;\n }\n}\n\nclass CatchScope extends Scope {\n constructor(scopeManager, upperScope, block) {\n super(scopeManager, \"catch\", upperScope, block, false);\n }\n}\n\nclass WithScope extends Scope {\n constructor(scopeManager, upperScope, block) {\n super(scopeManager, \"with\", upperScope, block, false);\n }\n\n __close(scopeManager) {\n if (this.__shouldStaticallyClose(scopeManager)) {\n return super.__close(scopeManager);\n }\n\n for (let i = 0, iz = this.__left.length; i < iz; ++i) {\n const ref = this.__left[i];\n\n ref.tainted = true;\n this.__delegateToUpperScope(ref);\n }\n this.__left = null;\n\n return this.upper;\n }\n}\n\nclass BlockScope extends Scope {\n constructor(scopeManager, upperScope, block) {\n super(scopeManager, \"block\", upperScope, block, false);\n }\n}\n\nclass SwitchScope extends Scope {\n constructor(scopeManager, upperScope, block) {\n super(scopeManager, \"switch\", upperScope, block, false);\n }\n}\n\nclass FunctionScope extends Scope {\n constructor(scopeManager, upperScope, block, isMethodDefinition) {\n super(scopeManager, \"function\", upperScope, block, isMethodDefinition);\n\n // section 9.2.13, FunctionDeclarationInstantiation.\n // NOTE Arrow functions never have an arguments objects.\n if (this.block.type !== Syntax$2.ArrowFunctionExpression) {\n this.__defineArguments();\n }\n }\n\n isArgumentsMaterialized() {\n\n // TODO(Constellation)\n // We can more aggressive on this condition like this.\n //\n // function t() {\n // // arguments of t is always hidden.\n // function arguments() {\n // }\n // }\n if (this.block.type === Syntax$2.ArrowFunctionExpression) {\n return false;\n }\n\n if (!this.isStatic()) {\n return true;\n }\n\n const variable = this.set.get(\"arguments\");\n\n assert__default[\"default\"](variable, \"Always have arguments variable.\");\n return variable.tainted || variable.references.length !== 0;\n }\n\n isThisMaterialized() {\n if (!this.isStatic()) {\n return true;\n }\n return this.thisFound;\n }\n\n __defineArguments() {\n this.__defineGeneric(\n \"arguments\",\n this.set,\n this.variables,\n null,\n null\n );\n this.taints.set(\"arguments\", true);\n }\n\n // References in default parameters isn't resolved to variables which are in their function body.\n // const x = 1\n // function f(a = x) { // This `x` is resolved to the `x` in the outer scope.\n // const x = 2\n // console.log(a)\n // }\n __isValidResolution(ref, variable) {\n\n // If `options.nodejsScope` is true, `this.block` becomes a Program node.\n if (this.block.type === \"Program\") {\n return true;\n }\n\n const bodyStart = this.block.body.range[0];\n\n // It's invalid resolution in the following case:\n return !(\n variable.scope === this &&\n ref.identifier.range[0] < bodyStart && // the reference is in the parameter part.\n variable.defs.every(d => d.name.range[0] >= bodyStart) // the variable is in the body.\n );\n }\n}\n\nclass ForScope extends Scope {\n constructor(scopeManager, upperScope, block) {\n super(scopeManager, \"for\", upperScope, block, false);\n }\n}\n\nclass ClassScope extends Scope {\n constructor(scopeManager, upperScope, block) {\n super(scopeManager, \"class\", upperScope, block, false);\n }\n}\n\nclass ClassFieldInitializerScope extends Scope {\n constructor(scopeManager, upperScope, block) {\n super(scopeManager, \"class-field-initializer\", upperScope, block, true);\n }\n}\n\nclass ClassStaticBlockScope extends Scope {\n constructor(scopeManager, upperScope, block) {\n super(scopeManager, \"class-static-block\", upperScope, block, true);\n }\n}\n\n/* vim: set sw=4 ts=4 et tw=80 : */\n\n/*\n Copyright (C) 2015 Yusuke Suzuki <utatane.tea@gmail.com>\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/**\n * @constructor ScopeManager\n */\nclass ScopeManager {\n constructor(options) {\n this.scopes = [];\n this.globalScope = null;\n this.__nodeToScope = new WeakMap();\n this.__currentScope = null;\n this.__options = options;\n this.__declaredVariables = new WeakMap();\n }\n\n __useDirective() {\n return this.__options.directive;\n }\n\n __isOptimistic() {\n return this.__options.optimistic;\n }\n\n __ignoreEval() {\n return this.__options.ignoreEval;\n }\n\n __isNodejsScope() {\n return this.__options.nodejsScope || this.__options.sourceType === \"commonjs\";\n }\n\n isModule() {\n return this.__options.sourceType === \"module\";\n }\n\n isImpliedStrict() {\n return this.__options.impliedStrict;\n }\n\n isStrictModeSupported() {\n return this.__options.ecmaVersion >= 5;\n }\n\n // Returns appropriate scope for this node.\n __get(node) {\n return this.__nodeToScope.get(node);\n }\n\n /**\n * Get variables that are declared by the node.\n *\n * \"are declared by the node\" means the node is same as `Variable.defs[].node` or `Variable.defs[].parent`.\n * If the node declares nothing, this method returns an empty array.\n * CAUTION: This API is experimental. See https://github.com/estools/escope/pull/69 for more details.\n * @param {Espree.Node} node a node to get.\n * @returns {Variable[]} variables that declared by the node.\n */\n getDeclaredVariables(node) {\n return this.__declaredVariables.get(node) || [];\n }\n\n /**\n * acquire scope from node.\n * @function ScopeManager#acquire\n * @param {Espree.Node} node node for the acquired scope.\n * @param {?boolean} [inner=false] look up the most inner scope, default value is false.\n * @returns {Scope?} Scope from node\n */\n acquire(node, inner) {\n\n /**\n * predicate\n * @param {Scope} testScope scope to test\n * @returns {boolean} predicate\n */\n function predicate(testScope) {\n if (testScope.type === \"function\" && testScope.functionExpressionScope) {\n return false;\n }\n return true;\n }\n\n const scopes = this.__get(node);\n\n if (!scopes || scopes.length === 0) {\n return null;\n }\n\n // Heuristic selection from all scopes.\n // If you would like to get all scopes, please use ScopeManager#acquireAll.\n if (scopes.length === 1) {\n return scopes[0];\n }\n\n if (inner) {\n for (let i = scopes.length - 1; i >= 0; --i) {\n const scope = scopes[i];\n\n if (predicate(scope)) {\n return scope;\n }\n }\n } else {\n for (let i = 0, iz = scopes.length; i < iz; ++i) {\n const scope = scopes[i];\n\n if (predicate(scope)) {\n return scope;\n }\n }\n }\n\n return null;\n }\n\n /**\n * acquire all scopes from node.\n * @function ScopeManager#acquireAll\n * @param {Espree.Node} node node for the acquired scope.\n * @returns {Scopes?} Scope array\n */\n acquireAll(node) {\n return this.__get(node);\n }\n\n /**\n * release the node.\n * @function ScopeManager#release\n * @param {Espree.Node} node releasing node.\n * @param {?boolean} [inner=false] look up the most inner scope, default value is false.\n * @returns {Scope?} upper scope for the node.\n */\n release(node, inner) {\n const scopes = this.__get(node);\n\n if (scopes && scopes.length) {\n const scope = scopes[0].upper;\n\n if (!scope) {\n return null;\n }\n return this.acquire(scope.block, inner);\n }\n return null;\n }\n\n attach() { } // eslint-disable-line class-methods-use-this\n\n detach() { } // eslint-disable-line class-methods-use-this\n\n __nestScope(scope) {\n if (scope instanceof GlobalScope) {\n assert__default[\"default\"](this.__currentScope === null);\n this.globalScope = scope;\n }\n this.__currentScope = scope;\n return scope;\n }\n\n __nestGlobalScope(node) {\n return this.__nestScope(new GlobalScope(this, node));\n }\n\n __nestBlockScope(node) {\n return this.__nestScope(new BlockScope(this, this.__currentScope, node));\n }\n\n __nestFunctionScope(node, isMethodDefinition) {\n return this.__nestScope(new FunctionScope(this, this.__currentScope, node, isMethodDefinition));\n }\n\n __nestForScope(node) {\n return this.__nestScope(new ForScope(this, this.__currentScope, node));\n }\n\n __nestCatchScope(node) {\n return this.__nestScope(new CatchScope(this, this.__currentScope, node));\n }\n\n __nestWithScope(node) {\n return this.__nestScope(new WithScope(this, this.__currentScope, node));\n }\n\n __nestClassScope(node) {\n return this.__nestScope(new ClassScope(this, this.__currentScope, node));\n }\n\n __nestClassFieldInitializerScope(node) {\n return this.__nestScope(new ClassFieldInitializerScope(this, this.__currentScope, node));\n }\n\n __nestClassStaticBlockScope(node) {\n return this.__nestScope(new ClassStaticBlockScope(this, this.__currentScope, node));\n }\n\n __nestSwitchScope(node) {\n return this.__nestScope(new SwitchScope(this, this.__currentScope, node));\n }\n\n __nestModuleScope(node) {\n return this.__nestScope(new ModuleScope(this, this.__currentScope, node));\n }\n\n __nestFunctionExpressionNameScope(node) {\n return this.__nestScope(new FunctionExpressionNameScope(this, this.__currentScope, node));\n }\n\n __isES6() {\n return this.__options.ecmaVersion >= 6;\n }\n}\n\n/* vim: set sw=4 ts=4 et tw=80 : */\n\n/*\n Copyright (C) 2015 Yusuke Suzuki <utatane.tea@gmail.com>\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\nconst { Syntax: Syntax$1 } = estraverse__default[\"default\"];\n\n/**\n * Get last array element\n * @param {Array} xs array\n * @returns {any} Last elment\n */\nfunction getLast(xs) {\n return xs[xs.length - 1] || null;\n}\n\nclass PatternVisitor extends esrecurse__default[\"default\"].Visitor {\n static isPattern(node) {\n const nodeType = node.type;\n\n return (\n nodeType === Syntax$1.Identifier ||\n nodeType === Syntax$1.ObjectPattern ||\n nodeType === Syntax$1.ArrayPattern ||\n nodeType === Syntax$1.SpreadElement ||\n nodeType === Syntax$1.RestElement ||\n nodeType === Syntax$1.AssignmentPattern\n );\n }\n\n constructor(options, rootPattern, callback) {\n super(null, options);\n this.rootPattern = rootPattern;\n this.callback = callback;\n this.assignments = [];\n this.rightHandNodes = [];\n this.restElements = [];\n }\n\n Identifier(pattern) {\n const lastRestElement = getLast(this.restElements);\n\n this.callback(pattern, {\n topLevel: pattern === this.rootPattern,\n rest: lastRestElement !== null && lastRestElement !== undefined && lastRestElement.argument === pattern,\n assignments: this.assignments\n });\n }\n\n Property(property) {\n\n // Computed property's key is a right hand node.\n if (property.computed) {\n this.rightHandNodes.push(property.key);\n }\n\n // If it's shorthand, its key is same as its value.\n // If it's shorthand and has its default value, its key is same as its value.left (the value is AssignmentPattern).\n // If it's not shorthand, the name of new variable is its value's.\n this.visit(property.value);\n }\n\n ArrayPattern(pattern) {\n for (let i = 0, iz = pattern.elements.length; i < iz; ++i) {\n const element = pattern.elements[i];\n\n this.visit(element);\n }\n }\n\n AssignmentPattern(pattern) {\n this.assignments.push(pattern);\n this.visit(pattern.left);\n this.rightHandNodes.push(pattern.right);\n this.assignments.pop();\n }\n\n RestElement(pattern) {\n this.restElements.push(pattern);\n this.visit(pattern.argument);\n this.restElements.pop();\n }\n\n MemberExpression(node) {\n\n // Computed property's key is a right hand node.\n if (node.computed) {\n this.rightHandNodes.push(node.property);\n }\n\n // the object is only read, write to its property.\n this.rightHandNodes.push(node.object);\n }\n\n //\n // ForInStatement.left and AssignmentExpression.left are LeftHandSideExpression.\n // By spec, LeftHandSideExpression is Pattern or MemberExpression.\n // (see also: https://github.com/estree/estree/pull/20#issuecomment-74584758)\n // But espree 2.0 parses to ArrayExpression, ObjectExpression, etc...\n //\n\n SpreadElement(node) {\n this.visit(node.argument);\n }\n\n ArrayExpression(node) {\n node.elements.forEach(this.visit, this);\n }\n\n AssignmentExpression(node) {\n this.assignments.push(node);\n this.visit(node.left);\n this.rightHandNodes.push(node.right);\n this.assignments.pop();\n }\n\n CallExpression(node) {\n\n // arguments are right hand nodes.\n node.arguments.forEach(a => {\n this.rightHandNodes.push(a);\n });\n this.visit(node.callee);\n }\n}\n\n/* vim: set sw=4 ts=4 et tw=80 : */\n\n/*\n Copyright (C) 2015 Yusuke Suzuki <utatane.tea@gmail.com>\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\nconst { Syntax } = estraverse__default[\"default\"];\n\n/**\n * Traverse identifier in pattern\n * @param {Object} options options\n * @param {pattern} rootPattern root pattern\n * @param {Refencer} referencer referencer\n * @param {callback} callback callback\n * @returns {void}\n */\nfunction traverseIdentifierInPattern(options, rootPattern, referencer, callback) {\n\n // Call the callback at left hand identifier nodes, and Collect right hand nodes.\n const visitor = new PatternVisitor(options, rootPattern, callback);\n\n visitor.visit(rootPattern);\n\n // Process the right hand nodes recursively.\n if (referencer !== null && referencer !== undefined) {\n visitor.rightHandNodes.forEach(referencer.visit, referencer);\n }\n}\n\n// Importing ImportDeclaration.\n// http://people.mozilla.org/~jorendorff/es6-draft.html#sec-moduledeclarationinstantiation\n// https://github.com/estree/estree/blob/master/es6.md#importdeclaration\n// FIXME: Now, we don't create module environment, because the context is\n// implementation dependent.\n\nclass Importer extends esrecurse__default[\"default\"].Visitor {\n constructor(declaration, referencer) {\n super(null, referencer.options);\n this.declaration = declaration;\n this.referencer = referencer;\n }\n\n visitImport(id, specifier) {\n this.referencer.visitPattern(id, pattern => {\n this.referencer.currentScope().__define(pattern,\n new Definition(\n Variable.ImportBinding,\n pattern,\n specifier,\n this.declaration,\n null,\n null\n ));\n });\n }\n\n ImportNamespaceSpecifier(node) {\n const local = (node.local || node.id);\n\n if (local) {\n this.visitImport(local, node);\n }\n }\n\n ImportDefaultSpecifier(node) {\n const local = (node.local || node.id);\n\n this.visitImport(local, node);\n }\n\n ImportSpecifier(node) {\n const local = (node.local || node.id);\n\n if (node.name) {\n this.visitImport(node.name, node);\n } else {\n this.visitImport(local, node);\n }\n }\n}\n\n// Referencing variables and creating bindings.\nclass Referencer extends esrecurse__default[\"default\"].Visitor {\n constructor(options, scopeManager) {\n super(null, options);\n this.options = options;\n this.scopeManager = scopeManager;\n this.parent = null;\n this.isInnerMethodDefinition = false;\n }\n\n currentScope() {\n return this.scopeManager.__currentScope;\n }\n\n close(node) {\n while (this.currentScope() && node === this.currentScope().block) {\n this.scopeManager.__currentScope = this.currentScope().__close(this.scopeManager);\n }\n }\n\n pushInnerMethodDefinition(isInnerMethodDefinition) {\n const previous = this.isInnerMethodDefinition;\n\n this.isInnerMethodDefinition = isInnerMethodDefinition;\n return previous;\n }\n\n popInnerMethodDefinition(isInnerMethodDefinition) {\n this.isInnerMethodDefinition = isInnerMethodDefinition;\n }\n\n referencingDefaultValue(pattern, assignments, maybeImplicitGlobal, init) {\n const scope = this.currentScope();\n\n assignments.forEach(assignment => {\n scope.__referencing(\n pattern,\n Reference.WRITE,\n assignment.right,\n maybeImplicitGlobal,\n pattern !== assignment.left,\n init\n );\n });\n }\n\n visitPattern(node, options, callback) {\n let visitPatternOptions = options;\n let visitPatternCallback = callback;\n\n if (typeof options === \"function\") {\n visitPatternCallback = options;\n visitPatternOptions = { processRightHandNodes: false };\n }\n\n traverseIdentifierInPattern(\n this.options,\n node,\n visitPatternOptions.processRightHandNodes ? this : null,\n visitPatternCallback\n );\n }\n\n visitFunction(node) {\n let i, iz;\n\n // FunctionDeclaration name is defined in upper scope\n // NOTE: Not referring variableScope. It is intended.\n // Since\n // in ES5, FunctionDeclaration should be in FunctionBody.\n // in ES6, FunctionDeclaration should be block scoped.\n\n if (node.type === Syntax.FunctionDeclaration) {\n\n // id is defined in upper scope\n this.currentScope().__define(node.id,\n new Definition(\n Variable.FunctionName,\n node.id,\n node,\n null,\n null,\n null\n ));\n }\n\n // FunctionExpression with name creates its special scope;\n // FunctionExpressionNameScope.\n if (node.type === Syntax.FunctionExpression && node.id) {\n this.scopeManager.__nestFunctionExpressionNameScope(node);\n }\n\n // Consider this function is in the MethodDefinition.\n this.scopeManager.__nestFunctionScope(node, this.isInnerMethodDefinition);\n\n const that = this;\n\n /**\n * Visit pattern callback\n * @param {pattern} pattern pattern\n * @param {Object} info info\n * @returns {void}\n */\n function visitPatternCallback(pattern, info) {\n that.currentScope().__define(pattern,\n new ParameterDefinition(\n pattern,\n node,\n i,\n info.rest\n ));\n\n that.referencingDefaultValue(pattern, info.assignments, null, true);\n }\n\n // Process parameter declarations.\n for (i = 0, iz = node.params.length; i < iz; ++i) {\n this.visitPattern(node.params[i], { processRightHandNodes: true }, visitPatternCallback);\n }\n\n // if there's a rest argument, add that\n if (node.rest) {\n this.visitPattern({\n type: \"RestElement\",\n argument: node.rest\n }, pattern => {\n this.currentScope().__define(pattern,\n new ParameterDefinition(\n pattern,\n node,\n node.params.length,\n true\n ));\n });\n }\n\n // In TypeScript there are a number of function-like constructs which have no body,\n // so check it exists before traversing\n if (node.body) {\n\n // Skip BlockStatement to prevent creating BlockStatement scope.\n if (node.body.type === Syntax.BlockStatement) {\n this.visitChildren(node.body);\n } else {\n this.visit(node.body);\n }\n }\n\n this.close(node);\n }\n\n visitClass(node) {\n if (node.type === Syntax.ClassDeclaration) {\n this.currentScope().__define(node.id,\n new Definition(\n Variable.ClassName,\n node.id,\n node,\n null,\n null,\n null\n ));\n }\n\n this.visit(node.superClass);\n\n this.scopeManager.__nestClassScope(node);\n\n if (node.id) {\n this.currentScope().__define(node.id,\n new Definition(\n Variable.ClassName,\n node.id,\n node\n ));\n }\n this.visit(node.body);\n\n this.close(node);\n }\n\n visitProperty(node) {\n let previous;\n\n if (node.computed) {\n this.visit(node.key);\n }\n\n const isMethodDefinition = node.type === Syntax.MethodDefinition;\n\n if (isMethodDefinition) {\n previous = this.pushInnerMethodDefinition(true);\n }\n this.visit(node.value);\n if (isMethodDefinition) {\n this.popInnerMethodDefinition(previous);\n }\n }\n\n visitForIn(node) {\n if (node.left.type === Syntax.VariableDeclaration && node.left.kind !== \"var\") {\n this.scopeManager.__nestForScope(node);\n }\n\n if (node.left.type === Syntax.VariableDeclaration) {\n this.visit(node.left);\n this.visitPattern(node.left.declarations[0].id, pattern => {\n this.currentScope().__referencing(pattern, Reference.WRITE, node.right, null, true, true);\n });\n } else {\n this.visitPattern(node.left, { processRightHandNodes: true }, (pattern, info) => {\n let maybeImplicitGlobal = null;\n\n if (!this.currentScope().isStrict) {\n maybeImplicitGlobal = {\n pattern,\n node\n };\n }\n this.referencingDefaultValue(pattern, info.assignments, maybeImplicitGlobal, false);\n this.currentScope().__referencing(pattern, Reference.WRITE, node.right, maybeImplicitGlobal, true, false);\n });\n }\n this.visit(node.right);\n this.visit(node.body);\n\n this.close(node);\n }\n\n visitVariableDeclaration(variableTargetScope, type, node, index) {\n\n const decl = node.declarations[index];\n const init = decl.init;\n\n this.visitPattern(decl.id, { processRightHandNodes: true }, (pattern, info) => {\n variableTargetScope.__define(\n pattern,\n new Definition(\n type,\n pattern,\n decl,\n node,\n index,\n node.kind\n )\n );\n\n this.referencingDefaultValue(pattern, info.assignments, null, true);\n if (init) {\n this.currentScope().__referencing(pattern, Reference.WRITE, init, null, !info.topLevel, true);\n }\n });\n }\n\n AssignmentExpression(node) {\n if (PatternVisitor.isPattern(node.left)) {\n if (node.operator === \"=\") {\n this.visitPattern(node.left, { processRightHandNodes: true }, (pattern, info) => {\n let maybeImplicitGlobal = null;\n\n if (!this.currentScope().isStrict) {\n maybeImplicitGlobal = {\n pattern,\n node\n };\n }\n this.referencingDefaultValue(pattern, info.assignments, maybeImplicitGlobal, false);\n this.currentScope().__referencing(pattern, Reference.WRITE, node.right, maybeImplicitGlobal, !info.topLevel, false);\n });\n } else {\n this.currentScope().__referencing(node.left, Reference.RW, node.right);\n }\n } else {\n this.visit(node.left);\n }\n this.visit(node.right);\n }\n\n CatchClause(node) {\n this.scopeManager.__nestCatchScope(node);\n\n this.visitPattern(node.param, { processRightHandNodes: true }, (pattern, info) => {\n this.currentScope().__define(pattern,\n new Definition(\n Variable.CatchClause,\n node.param,\n node,\n null,\n null,\n null\n ));\n this.referencingDefaultValue(pattern, info.assignments, null, true);\n });\n this.visit(node.body);\n\n this.close(node);\n }\n\n Program(node) {\n this.scopeManager.__nestGlobalScope(node);\n\n if (this.scopeManager.__isNodejsScope()) {\n\n // Force strictness of GlobalScope to false when using node.js scope.\n this.currentScope().isStrict = false;\n this.scopeManager.__nestFunctionScope(node, false);\n }\n\n if (this.scopeManager.__isES6() && this.scopeManager.isModule()) {\n this.scopeManager.__nestModuleScope(node);\n }\n\n if (this.scopeManager.isStrictModeSupported() && this.scopeManager.isImpliedStrict()) {\n this.currentScope().isStrict = true;\n }\n\n this.visitChildren(node);\n this.close(node);\n }\n\n Identifier(node) {\n this.currentScope().__referencing(node);\n }\n\n // eslint-disable-next-line class-methods-use-this\n PrivateIdentifier() {\n\n // Do nothing.\n }\n\n UpdateExpression(node) {\n if (PatternVisitor.isPattern(node.argument)) {\n this.currentScope().__referencing(node.argument, Reference.RW, null);\n } else {\n this.visitChildren(node);\n }\n }\n\n MemberExpression(node) {\n this.visit(node.object);\n if (node.computed) {\n this.visit(node.property);\n }\n }\n\n Property(node) {\n this.visitProperty(node);\n }\n\n PropertyDefinition(node) {\n const { computed, key, value } = node;\n\n if (computed) {\n this.visit(key);\n }\n if (value) {\n this.scopeManager.__nestClassFieldInitializerScope(value);\n this.visit(value);\n this.close(value);\n }\n }\n\n StaticBlock(node) {\n this.scopeManager.__nestClassStaticBlockScope(node);\n\n this.visitChildren(node);\n\n this.close(node);\n }\n\n MethodDefinition(node) {\n this.visitProperty(node);\n }\n\n BreakStatement() {} // eslint-disable-line class-methods-use-this\n\n ContinueStatement() {} // eslint-disable-line class-methods-use-this\n\n LabeledStatement(node) {\n this.visit(node.body);\n }\n\n ForStatement(node) {\n\n // Create ForStatement declaration.\n // NOTE: In ES6, ForStatement dynamically generates\n // per iteration environment. However, escope is\n // a static analyzer, we only generate one scope for ForStatement.\n if (node.init && node.init.type === Syntax.VariableDeclaration && node.init.kind !== \"var\") {\n this.scopeManager.__nestForScope(node);\n }\n\n this.visitChildren(node);\n\n this.close(node);\n }\n\n ClassExpression(node) {\n this.visitClass(node);\n }\n\n ClassDeclaration(node) {\n this.visitClass(node);\n }\n\n CallExpression(node) {\n\n // Check this is direct call to eval\n if (!this.scopeManager.__ignoreEval() && node.callee.type === Syntax.Identifier && node.callee.name === \"eval\") {\n\n // NOTE: This should be `variableScope`. Since direct eval call always creates Lexical environment and\n // let / const should be enclosed into it. Only VariableDeclaration affects on the caller's environment.\n this.currentScope().variableScope.__detectEval();\n }\n this.visitChildren(node);\n }\n\n BlockStatement(node) {\n if (this.scopeManager.__isES6()) {\n this.scopeManager.__nestBlockScope(node);\n }\n\n this.visitChildren(node);\n\n this.close(node);\n }\n\n ThisExpression() {\n this.currentScope().variableScope.__detectThis();\n }\n\n WithStatement(node) {\n this.visit(node.object);\n\n // Then nest scope for WithStatement.\n this.scopeManager.__nestWithScope(node);\n\n this.visit(node.body);\n\n this.close(node);\n }\n\n VariableDeclaration(node) {\n const variableTargetScope = (node.kind === \"var\") ? this.currentScope().variableScope : this.currentScope();\n\n for (let i = 0, iz = node.declarations.length; i < iz; ++i) {\n const decl = node.declarations[i];\n\n this.visitVariableDeclaration(variableTargetScope, Variable.Variable, node, i);\n if (decl.init) {\n this.visit(decl.init);\n }\n }\n }\n\n // sec 13.11.8\n SwitchStatement(node) {\n this.visit(node.discriminant);\n\n if (this.scopeManager.__isES6()) {\n this.scopeManager.__nestSwitchScope(node);\n }\n\n for (let i = 0, iz = node.cases.length; i < iz; ++i) {\n this.visit(node.cases[i]);\n }\n\n this.close(node);\n }\n\n FunctionDeclaration(node) {\n this.visitFunction(node);\n }\n\n FunctionExpression(node) {\n this.visitFunction(node);\n }\n\n ForOfStatement(node) {\n this.visitForIn(node);\n }\n\n ForInStatement(node) {\n this.visitForIn(node);\n }\n\n ArrowFunctionExpression(node) {\n this.visitFunction(node);\n }\n\n ImportDeclaration(node) {\n assert__default[\"default\"](this.scopeManager.__isES6() && this.scopeManager.isModule(), \"ImportDeclaration should appear when the mode is ES6 and in the module context.\");\n\n const importer = new Importer(node, this);\n\n importer.visit(node);\n }\n\n visitExportDeclaration(node) {\n if (node.source) {\n return;\n }\n if (node.declaration) {\n this.visit(node.declaration);\n return;\n }\n\n this.visitChildren(node);\n }\n\n // TODO: ExportDeclaration doesn't exist. for bc?\n ExportDeclaration(node) {\n this.visitExportDeclaration(node);\n }\n\n ExportAllDeclaration(node) {\n this.visitExportDeclaration(node);\n }\n\n ExportDefaultDeclaration(node) {\n this.visitExportDeclaration(node);\n }\n\n ExportNamedDeclaration(node) {\n this.visitExportDeclaration(node);\n }\n\n ExportSpecifier(node) {\n\n // TODO: `node.id` doesn't exist. for bc?\n const local = (node.id || node.local);\n\n this.visit(local);\n }\n\n MetaProperty() { // eslint-disable-line class-methods-use-this\n\n // do nothing.\n }\n}\n\n/* vim: set sw=4 ts=4 et tw=80 : */\n\nconst version = \"7.1.1\";\n\n/*\n Copyright (C) 2012-2014 Yusuke Suzuki <utatane.tea@gmail.com>\n Copyright (C) 2013 Alex Seville <hi@alexanderseville.com>\n Copyright (C) 2014 Thiago de Arruda <tpadilha84@gmail.com>\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/**\n * Set the default options\n * @returns {Object} options\n */\nfunction defaultOptions() {\n return {\n optimistic: false,\n directive: false,\n nodejsScope: false,\n impliedStrict: false,\n sourceType: \"script\", // one of ['script', 'module', 'commonjs']\n ecmaVersion: 5,\n childVisitorKeys: null,\n fallback: \"iteration\"\n };\n}\n\n/**\n * Preform deep update on option object\n * @param {Object} target Options\n * @param {Object} override Updates\n * @returns {Object} Updated options\n */\nfunction updateDeeply(target, override) {\n\n /**\n * Is hash object\n * @param {Object} value Test value\n * @returns {boolean} Result\n */\n function isHashObject(value) {\n return typeof value === \"object\" && value instanceof Object && !(value instanceof Array) && !(value instanceof RegExp);\n }\n\n for (const key in override) {\n if (Object.prototype.hasOwnProperty.call(override, key)) {\n const val = override[key];\n\n if (isHashObject(val)) {\n if (isHashObject(target[key])) {\n updateDeeply(target[key], val);\n } else {\n target[key] = updateDeeply({}, val);\n }\n } else {\n target[key] = val;\n }\n }\n }\n return target;\n}\n\n/**\n * Main interface function. Takes an Espree syntax tree and returns the\n * analyzed scopes.\n * @function analyze\n * @param {espree.Tree} tree Abstract Syntax Tree\n * @param {Object} providedOptions Options that tailor the scope analysis\n * @param {boolean} [providedOptions.optimistic=false] the optimistic flag\n * @param {boolean} [providedOptions.directive=false] the directive flag\n * @param {boolean} [providedOptions.ignoreEval=false] whether to check 'eval()' calls\n * @param {boolean} [providedOptions.nodejsScope=false] whether the whole\n * script is executed under node.js environment. When enabled, escope adds\n * a function scope immediately following the global scope.\n * @param {boolean} [providedOptions.impliedStrict=false] implied strict mode\n * (if ecmaVersion >= 5).\n * @param {string} [providedOptions.sourceType='script'] the source type of the script. one of 'script', 'module', and 'commonjs'\n * @param {number} [providedOptions.ecmaVersion=5] which ECMAScript version is considered\n * @param {Object} [providedOptions.childVisitorKeys=null] Additional known visitor keys. See [esrecurse](https://github.com/estools/esrecurse)'s the `childVisitorKeys` option.\n * @param {string} [providedOptions.fallback='iteration'] A kind of the fallback in order to encounter with unknown node. See [esrecurse](https://github.com/estools/esrecurse)'s the `fallback` option.\n * @returns {ScopeManager} ScopeManager\n */\nfunction analyze(tree, providedOptions) {\n const options = updateDeeply(defaultOptions(), providedOptions);\n const scopeManager = new ScopeManager(options);\n const referencer = new Referencer(options, scopeManager);\n\n referencer.visit(tree);\n\n assert__default[\"default\"](scopeManager.__currentScope === null, \"currentScope should be null.\");\n\n return scopeManager;\n}\n\n/* vim: set sw=4 ts=4 et tw=80 : */\n\nexports.Definition = Definition;\nexports.PatternVisitor = PatternVisitor;\nexports.Reference = Reference;\nexports.Referencer = Referencer;\nexports.Scope = Scope;\nexports.ScopeManager = ScopeManager;\nexports.Variable = Variable;\nexports.analyze = analyze;\nexports.version = version;\n//# sourceMappingURL=eslint-scope.cjs.map\n", "// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\nmodule.exports = {\n SEMVER_SPEC_VERSION,\n MAX_LENGTH,\n MAX_SAFE_INTEGER,\n MAX_SAFE_COMPONENT_LENGTH,\n}\n", "const debug = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {}\n\nmodule.exports = debug\n", "const { MAX_SAFE_COMPONENT_LENGTH } = require('./constants')\nconst debug = require('./debug')\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst src = exports.src = []\nconst t = exports.t = {}\nlet R = 0\n\nconst createToken = (name, value, isGlobal) => {\n const index = R++\n debug(name, index, value)\n t[name] = index\n src[index] = value\n re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '[0-9]+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', '\\\\d*[a-zA-Z-][a-zA-Z0-9-]*')\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER]\n}|${src[t.NONNUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE]\n}|${src[t.NONNUMERICIDENTIFIER]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+')\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:${src[t.PRERELEASE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:${src[t.PRERELEASELOOSE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCE', `${'(^|[^\\\\d])' +\n '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAIN]})` +\n `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n", "// parse out just the options we care about so we always get a consistent\n// obj with keys in a consistent order.\nconst opts = ['includePrerelease', 'loose', 'rtl']\nconst parseOptions = options =>\n !options ? {}\n : typeof options !== 'object' ? { loose: true }\n : opts.filter(k => options[k]).reduce((o, k) => {\n o[k] = true\n return o\n }, {})\nmodule.exports = parseOptions\n", "const numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n const anum = numeric.test(a)\n const bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n compareIdentifiers,\n rcompareIdentifiers,\n}\n", "const debug = require('../internal/debug')\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')\nconst { re, t } = require('../internal/re')\n\nconst parseOptions = require('../internal/parse-options')\nconst { compareIdentifiers } = require('../internal/identifiers')\nclass SemVer {\n constructor (version, options) {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n )\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease\n\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer(other, this.options)\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n return (\n compareIdentifiers(this.major, other.major) ||\n compareIdentifiers(this.minor, other.minor) ||\n compareIdentifiers(this.patch, other.patch)\n )\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0\n do {\n const a = this.prerelease[i]\n const b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n let i = 0\n do {\n const a = this.build[i]\n const b = other.build[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier) {\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier)\n this.inc('pre', identifier)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier)\n }\n this.inc('pre', identifier)\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre':\n if (this.prerelease.length === 0) {\n this.prerelease = [0]\n } else {\n let i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n this.prerelease.push(0)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = [identifier, 0]\n }\n } else {\n this.prerelease = [identifier, 0]\n }\n }\n break\n\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.format()\n this.raw = this.version\n return this\n }\n}\n\nmodule.exports = SemVer\n", "const { MAX_LENGTH } = require('../internal/constants')\nconst { re, t } = require('../internal/re')\nconst SemVer = require('../classes/semver')\n\nconst parseOptions = require('../internal/parse-options')\nconst parse = (version, options) => {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n if (version.length > MAX_LENGTH) {\n return null\n }\n\n const r = options.loose ? re[t.LOOSE] : re[t.FULL]\n if (!r.test(version)) {\n return null\n }\n\n try {\n return new SemVer(version, options)\n } catch (er) {\n return null\n }\n}\n\nmodule.exports = parse\n", "const parse = require('./parse')\nconst valid = (version, options) => {\n const v = parse(version, options)\n return v ? v.version : null\n}\nmodule.exports = valid\n", "const parse = require('./parse')\nconst clean = (version, options) => {\n const s = parse(version.trim().replace(/^[=v]+/, ''), options)\n return s ? s.version : null\n}\nmodule.exports = clean\n", "const SemVer = require('../classes/semver')\n\nconst inc = (version, release, options, identifier) => {\n if (typeof (options) === 'string') {\n identifier = options\n options = undefined\n }\n\n try {\n return new SemVer(\n version instanceof SemVer ? version.version : version,\n options\n ).inc(release, identifier).version\n } catch (er) {\n return null\n }\n}\nmodule.exports = inc\n", "const SemVer = require('../classes/semver')\nconst compare = (a, b, loose) =>\n new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n", "const compare = require('./compare')\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n", "const parse = require('./parse')\nconst eq = require('./eq')\n\nconst diff = (version1, version2) => {\n if (eq(version1, version2)) {\n return null\n } else {\n const v1 = parse(version1)\n const v2 = parse(version2)\n const hasPre = v1.prerelease.length || v2.prerelease.length\n const prefix = hasPre ? 'pre' : ''\n const defaultResult = hasPre ? 'prerelease' : ''\n for (const key in v1) {\n if (key === 'major' || key === 'minor' || key === 'patch') {\n if (v1[key] !== v2[key]) {\n return prefix + key\n }\n }\n }\n return defaultResult // may be undefined\n }\n}\nmodule.exports = diff\n", "const SemVer = require('../classes/semver')\nconst major = (a, loose) => new SemVer(a, loose).major\nmodule.exports = major\n", "const SemVer = require('../classes/semver')\nconst minor = (a, loose) => new SemVer(a, loose).minor\nmodule.exports = minor\n", "const SemVer = require('../classes/semver')\nconst patch = (a, loose) => new SemVer(a, loose).patch\nmodule.exports = patch\n", "const parse = require('./parse')\nconst prerelease = (version, options) => {\n const parsed = parse(version, options)\n return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n}\nmodule.exports = prerelease\n", "const compare = require('./compare')\nconst rcompare = (a, b, loose) => compare(b, a, loose)\nmodule.exports = rcompare\n", "const compare = require('./compare')\nconst compareLoose = (a, b) => compare(a, b, true)\nmodule.exports = compareLoose\n", "const SemVer = require('../classes/semver')\nconst compareBuild = (a, b, loose) => {\n const versionA = new SemVer(a, loose)\n const versionB = new SemVer(b, loose)\n return versionA.compare(versionB) || versionA.compareBuild(versionB)\n}\nmodule.exports = compareBuild\n", "const compareBuild = require('./compare-build')\nconst sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))\nmodule.exports = sort\n", "const compareBuild = require('./compare-build')\nconst rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))\nmodule.exports = rsort\n", "const compare = require('./compare')\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n", "const compare = require('./compare')\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n", "const compare = require('./compare')\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n", "const compare = require('./compare')\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n", "const compare = require('./compare')\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n", "const eq = require('./eq')\nconst neq = require('./neq')\nconst gt = require('./gt')\nconst gte = require('./gte')\nconst lt = require('./lt')\nconst lte = require('./lte')\n\nconst cmp = (a, op, b, loose) => {\n switch (op) {\n case '===':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a === b\n\n case '!==':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a !== b\n\n case '':\n case '=':\n case '==':\n return eq(a, b, loose)\n\n case '!=':\n return neq(a, b, loose)\n\n case '>':\n return gt(a, b, loose)\n\n case '>=':\n return gte(a, b, loose)\n\n case '<':\n return lt(a, b, loose)\n\n case '<=':\n return lte(a, b, loose)\n\n default:\n throw new TypeError(`Invalid operator: ${op}`)\n }\n}\nmodule.exports = cmp\n", "const SemVer = require('../classes/semver')\nconst parse = require('./parse')\nconst { re, t } = require('../internal/re')\n\nconst coerce = (version, options) => {\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version === 'number') {\n version = String(version)\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n options = options || {}\n\n let match = null\n if (!options.rtl) {\n match = version.match(re[t.COERCE])\n } else {\n // Find the right-most coercible string that does not share\n // a terminus with a more left-ward coercible string.\n // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n //\n // Walk through the string checking with a /g regexp\n // Manually set the index so as to pick up overlapping matches.\n // Stop when we get a match that ends at the string end, since no\n // coercible string can be more right-ward without the same terminus.\n let next\n while ((next = re[t.COERCERTL].exec(version)) &&\n (!match || match.index + match[0].length !== version.length)\n ) {\n if (!match ||\n next.index + next[0].length !== match.index + match[0].length) {\n match = next\n }\n re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length\n }\n // leave it in a clean state\n re[t.COERCERTL].lastIndex = -1\n }\n\n if (match === null) {\n return null\n }\n\n return parse(`${match[2]}.${match[3] || '0'}.${match[4] || '0'}`, options)\n}\nmodule.exports = coerce\n", "'use strict'\nmodule.exports = function (Yallist) {\n Yallist.prototype[Symbol.iterator] = function* () {\n for (let walker = this.head; walker; walker = walker.next) {\n yield walker.value\n }\n }\n}\n", "'use strict'\nmodule.exports = Yallist\n\nYallist.Node = Node\nYallist.create = Yallist\n\nfunction Yallist (list) {\n var self = this\n if (!(self instanceof Yallist)) {\n self = new Yallist()\n }\n\n self.tail = null\n self.head = null\n self.length = 0\n\n if (list && typeof list.forEach === 'function') {\n list.forEach(function (item) {\n self.push(item)\n })\n } else if (arguments.length > 0) {\n for (var i = 0, l = arguments.length; i < l; i++) {\n self.push(arguments[i])\n }\n }\n\n return self\n}\n\nYallist.prototype.removeNode = function (node) {\n if (node.list !== this) {\n throw new Error('removing node which does not belong to this list')\n }\n\n var next = node.next\n var prev = node.prev\n\n if (next) {\n next.prev = prev\n }\n\n if (prev) {\n prev.next = next\n }\n\n if (node === this.head) {\n this.head = next\n }\n if (node === this.tail) {\n this.tail = prev\n }\n\n node.list.length--\n node.next = null\n node.prev = null\n node.list = null\n\n return next\n}\n\nYallist.prototype.unshiftNode = function (node) {\n if (node === this.head) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n var head = this.head\n node.list = this\n node.next = head\n if (head) {\n head.prev = node\n }\n\n this.head = node\n if (!this.tail) {\n this.tail = node\n }\n this.length++\n}\n\nYallist.prototype.pushNode = function (node) {\n if (node === this.tail) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n var tail = this.tail\n node.list = this\n node.prev = tail\n if (tail) {\n tail.next = node\n }\n\n this.tail = node\n if (!this.head) {\n this.head = node\n }\n this.length++\n}\n\nYallist.prototype.push = function () {\n for (var i = 0, l = arguments.length; i < l; i++) {\n push(this, arguments[i])\n }\n return this.length\n}\n\nYallist.prototype.unshift = function () {\n for (var i = 0, l = arguments.length; i < l; i++) {\n unshift(this, arguments[i])\n }\n return this.length\n}\n\nYallist.prototype.pop = function () {\n if (!this.tail) {\n return undefined\n }\n\n var res = this.tail.value\n this.tail = this.tail.prev\n if (this.tail) {\n this.tail.next = null\n } else {\n this.head = null\n }\n this.length--\n return res\n}\n\nYallist.prototype.shift = function () {\n if (!this.head) {\n return undefined\n }\n\n var res = this.head.value\n this.head = this.head.next\n if (this.head) {\n this.head.prev = null\n } else {\n this.tail = null\n }\n this.length--\n return res\n}\n\nYallist.prototype.forEach = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = this.head, i = 0; walker !== null; i++) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.next\n }\n}\n\nYallist.prototype.forEachReverse = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.prev\n }\n}\n\nYallist.prototype.get = function (n) {\n for (var i = 0, walker = this.head; walker !== null && i < n; i++) {\n // abort out of the list early if we hit a cycle\n walker = walker.next\n }\n if (i === n && walker !== null) {\n return walker.value\n }\n}\n\nYallist.prototype.getReverse = function (n) {\n for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {\n // abort out of the list early if we hit a cycle\n walker = walker.prev\n }\n if (i === n && walker !== null) {\n return walker.value\n }\n}\n\nYallist.prototype.map = function (fn, thisp) {\n thisp = thisp || this\n var res = new Yallist()\n for (var walker = this.head; walker !== null;) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.next\n }\n return res\n}\n\nYallist.prototype.mapReverse = function (fn, thisp) {\n thisp = thisp || this\n var res = new Yallist()\n for (var walker = this.tail; walker !== null;) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.prev\n }\n return res\n}\n\nYallist.prototype.reduce = function (fn, initial) {\n var acc\n var walker = this.head\n if (arguments.length > 1) {\n acc = initial\n } else if (this.head) {\n walker = this.head.next\n acc = this.head.value\n } else {\n throw new TypeError('Reduce of empty list with no initial value')\n }\n\n for (var i = 0; walker !== null; i++) {\n acc = fn(acc, walker.value, i)\n walker = walker.next\n }\n\n return acc\n}\n\nYallist.prototype.reduceReverse = function (fn, initial) {\n var acc\n var walker = this.tail\n if (arguments.length > 1) {\n acc = initial\n } else if (this.tail) {\n walker = this.tail.prev\n acc = this.tail.value\n } else {\n throw new TypeError('Reduce of empty list with no initial value')\n }\n\n for (var i = this.length - 1; walker !== null; i--) {\n acc = fn(acc, walker.value, i)\n walker = walker.prev\n }\n\n return acc\n}\n\nYallist.prototype.toArray = function () {\n var arr = new Array(this.length)\n for (var i = 0, walker = this.head; walker !== null; i++) {\n arr[i] = walker.value\n walker = walker.next\n }\n return arr\n}\n\nYallist.prototype.toArrayReverse = function () {\n var arr = new Array(this.length)\n for (var i = 0, walker = this.tail; walker !== null; i++) {\n arr[i] = walker.value\n walker = walker.prev\n }\n return arr\n}\n\nYallist.prototype.slice = function (from, to) {\n to = to || this.length\n if (to < 0) {\n to += this.length\n }\n from = from || 0\n if (from < 0) {\n from += this.length\n }\n var ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n for (var i = 0, walker = this.head; walker !== null && i < from; i++) {\n walker = walker.next\n }\n for (; walker !== null && i < to; i++, walker = walker.next) {\n ret.push(walker.value)\n }\n return ret\n}\n\nYallist.prototype.sliceReverse = function (from, to) {\n to = to || this.length\n if (to < 0) {\n to += this.length\n }\n from = from || 0\n if (from < 0) {\n from += this.length\n }\n var ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {\n walker = walker.prev\n }\n for (; walker !== null && i > from; i--, walker = walker.prev) {\n ret.push(walker.value)\n }\n return ret\n}\n\nYallist.prototype.splice = function (start, deleteCount, ...nodes) {\n if (start > this.length) {\n start = this.length - 1\n }\n if (start < 0) {\n start = this.length + start;\n }\n\n for (var i = 0, walker = this.head; walker !== null && i < start; i++) {\n walker = walker.next\n }\n\n var ret = []\n for (var i = 0; walker && i < deleteCount; i++) {\n ret.push(walker.value)\n walker = this.removeNode(walker)\n }\n if (walker === null) {\n walker = this.tail\n }\n\n if (walker !== this.head && walker !== this.tail) {\n walker = walker.prev\n }\n\n for (var i = 0; i < nodes.length; i++) {\n walker = insert(this, walker, nodes[i])\n }\n return ret;\n}\n\nYallist.prototype.reverse = function () {\n var head = this.head\n var tail = this.tail\n for (var walker = head; walker !== null; walker = walker.prev) {\n var p = walker.prev\n walker.prev = walker.next\n walker.next = p\n }\n this.head = tail\n this.tail = head\n return this\n}\n\nfunction insert (self, node, value) {\n var inserted = node === self.head ?\n new Node(value, null, node, self) :\n new Node(value, node, node.next, self)\n\n if (inserted.next === null) {\n self.tail = inserted\n }\n if (inserted.prev === null) {\n self.head = inserted\n }\n\n self.length++\n\n return inserted\n}\n\nfunction push (self, item) {\n self.tail = new Node(item, self.tail, null, self)\n if (!self.head) {\n self.head = self.tail\n }\n self.length++\n}\n\nfunction unshift (self, item) {\n self.head = new Node(item, null, self.head, self)\n if (!self.tail) {\n self.tail = self.head\n }\n self.length++\n}\n\nfunction Node (value, prev, next, list) {\n if (!(this instanceof Node)) {\n return new Node(value, prev, next, list)\n }\n\n this.list = list\n this.value = value\n\n if (prev) {\n prev.next = this\n this.prev = prev\n } else {\n this.prev = null\n }\n\n if (next) {\n next.prev = this\n this.next = next\n } else {\n this.next = null\n }\n}\n\ntry {\n // add if support for Symbol.iterator is present\n require('./iterator.js')(Yallist)\n} catch (er) {}\n", "'use strict'\n\n// A linked list to keep track of recently-used-ness\nconst Yallist = require('yallist')\n\nconst MAX = Symbol('max')\nconst LENGTH = Symbol('length')\nconst LENGTH_CALCULATOR = Symbol('lengthCalculator')\nconst ALLOW_STALE = Symbol('allowStale')\nconst MAX_AGE = Symbol('maxAge')\nconst DISPOSE = Symbol('dispose')\nconst NO_DISPOSE_ON_SET = Symbol('noDisposeOnSet')\nconst LRU_LIST = Symbol('lruList')\nconst CACHE = Symbol('cache')\nconst UPDATE_AGE_ON_GET = Symbol('updateAgeOnGet')\n\nconst naiveLength = () => 1\n\n// lruList is a yallist where the head is the youngest\n// item, and the tail is the oldest. the list contains the Hit\n// objects as the entries.\n// Each Hit object has a reference to its Yallist.Node. This\n// never changes.\n//\n// cache is a Map (or PseudoMap) that matches the keys to\n// the Yallist.Node object.\nclass LRUCache {\n constructor (options) {\n if (typeof options === 'number')\n options = { max: options }\n\n if (!options)\n options = {}\n\n if (options.max && (typeof options.max !== 'number' || options.max < 0))\n throw new TypeError('max must be a non-negative number')\n // Kind of weird to have a default max of Infinity, but oh well.\n const max = this[MAX] = options.max || Infinity\n\n const lc = options.length || naiveLength\n this[LENGTH_CALCULATOR] = (typeof lc !== 'function') ? naiveLength : lc\n this[ALLOW_STALE] = options.stale || false\n if (options.maxAge && typeof options.maxAge !== 'number')\n throw new TypeError('maxAge must be a number')\n this[MAX_AGE] = options.maxAge || 0\n this[DISPOSE] = options.dispose\n this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false\n this[UPDATE_AGE_ON_GET] = options.updateAgeOnGet || false\n this.reset()\n }\n\n // resize the cache when the max changes.\n set max (mL) {\n if (typeof mL !== 'number' || mL < 0)\n throw new TypeError('max must be a non-negative number')\n\n this[MAX] = mL || Infinity\n trim(this)\n }\n get max () {\n return this[MAX]\n }\n\n set allowStale (allowStale) {\n this[ALLOW_STALE] = !!allowStale\n }\n get allowStale () {\n return this[ALLOW_STALE]\n }\n\n set maxAge (mA) {\n if (typeof mA !== 'number')\n throw new TypeError('maxAge must be a non-negative number')\n\n this[MAX_AGE] = mA\n trim(this)\n }\n get maxAge () {\n return this[MAX_AGE]\n }\n\n // resize the cache when the lengthCalculator changes.\n set lengthCalculator (lC) {\n if (typeof lC !== 'function')\n lC = naiveLength\n\n if (lC !== this[LENGTH_CALCULATOR]) {\n this[LENGTH_CALCULATOR] = lC\n this[LENGTH] = 0\n this[LRU_LIST].forEach(hit => {\n hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key)\n this[LENGTH] += hit.length\n })\n }\n trim(this)\n }\n get lengthCalculator () { return this[LENGTH_CALCULATOR] }\n\n get length () { return this[LENGTH] }\n get itemCount () { return this[LRU_LIST].length }\n\n rforEach (fn, thisp) {\n thisp = thisp || this\n for (let walker = this[LRU_LIST].tail; walker !== null;) {\n const prev = walker.prev\n forEachStep(this, fn, walker, thisp)\n walker = prev\n }\n }\n\n forEach (fn, thisp) {\n thisp = thisp || this\n for (let walker = this[LRU_LIST].head; walker !== null;) {\n const next = walker.next\n forEachStep(this, fn, walker, thisp)\n walker = next\n }\n }\n\n keys () {\n return this[LRU_LIST].toArray().map(k => k.key)\n }\n\n values () {\n return this[LRU_LIST].toArray().map(k => k.value)\n }\n\n reset () {\n if (this[DISPOSE] &&\n this[LRU_LIST] &&\n this[LRU_LIST].length) {\n this[LRU_LIST].forEach(hit => this[DISPOSE](hit.key, hit.value))\n }\n\n this[CACHE] = new Map() // hash of items by key\n this[LRU_LIST] = new Yallist() // list of items in order of use recency\n this[LENGTH] = 0 // length of items in the list\n }\n\n dump () {\n return this[LRU_LIST].map(hit =>\n isStale(this, hit) ? false : {\n k: hit.key,\n v: hit.value,\n e: hit.now + (hit.maxAge || 0)\n }).toArray().filter(h => h)\n }\n\n dumpLru () {\n return this[LRU_LIST]\n }\n\n set (key, value, maxAge) {\n maxAge = maxAge || this[MAX_AGE]\n\n if (maxAge && typeof maxAge !== 'number')\n throw new TypeError('maxAge must be a number')\n\n const now = maxAge ? Date.now() : 0\n const len = this[LENGTH_CALCULATOR](value, key)\n\n if (this[CACHE].has(key)) {\n if (len > this[MAX]) {\n del(this, this[CACHE].get(key))\n return false\n }\n\n const node = this[CACHE].get(key)\n const item = node.value\n\n // dispose of the old one before overwriting\n // split out into 2 ifs for better coverage tracking\n if (this[DISPOSE]) {\n if (!this[NO_DISPOSE_ON_SET])\n this[DISPOSE](key, item.value)\n }\n\n item.now = now\n item.maxAge = maxAge\n item.value = value\n this[LENGTH] += len - item.length\n item.length = len\n this.get(key)\n trim(this)\n return true\n }\n\n const hit = new Entry(key, value, len, now, maxAge)\n\n // oversized objects fall out of cache automatically.\n if (hit.length > this[MAX]) {\n if (this[DISPOSE])\n this[DISPOSE](key, value)\n\n return false\n }\n\n this[LENGTH] += hit.length\n this[LRU_LIST].unshift(hit)\n this[CACHE].set(key, this[LRU_LIST].head)\n trim(this)\n return true\n }\n\n has (key) {\n if (!this[CACHE].has(key)) return false\n const hit = this[CACHE].get(key).value\n return !isStale(this, hit)\n }\n\n get (key) {\n return get(this, key, true)\n }\n\n peek (key) {\n return get(this, key, false)\n }\n\n pop () {\n const node = this[LRU_LIST].tail\n if (!node)\n return null\n\n del(this, node)\n return node.value\n }\n\n del (key) {\n del(this, this[CACHE].get(key))\n }\n\n load (arr) {\n // reset the cache\n this.reset()\n\n const now = Date.now()\n // A previous serialized cache has the most recent items first\n for (let l = arr.length - 1; l >= 0; l--) {\n const hit = arr[l]\n const expiresAt = hit.e || 0\n if (expiresAt === 0)\n // the item was created without expiration in a non aged cache\n this.set(hit.k, hit.v)\n else {\n const maxAge = expiresAt - now\n // dont add already expired items\n if (maxAge > 0) {\n this.set(hit.k, hit.v, maxAge)\n }\n }\n }\n }\n\n prune () {\n this[CACHE].forEach((value, key) => get(this, key, false))\n }\n}\n\nconst get = (self, key, doUse) => {\n const node = self[CACHE].get(key)\n if (node) {\n const hit = node.value\n if (isStale(self, hit)) {\n del(self, node)\n if (!self[ALLOW_STALE])\n return undefined\n } else {\n if (doUse) {\n if (self[UPDATE_AGE_ON_GET])\n node.value.now = Date.now()\n self[LRU_LIST].unshiftNode(node)\n }\n }\n return hit.value\n }\n}\n\nconst isStale = (self, hit) => {\n if (!hit || (!hit.maxAge && !self[MAX_AGE]))\n return false\n\n const diff = Date.now() - hit.now\n return hit.maxAge ? diff > hit.maxAge\n : self[MAX_AGE] && (diff > self[MAX_AGE])\n}\n\nconst trim = self => {\n if (self[LENGTH] > self[MAX]) {\n for (let walker = self[LRU_LIST].tail;\n self[LENGTH] > self[MAX] && walker !== null;) {\n // We know that we're about to delete this one, and also\n // what the next least recently used key will be, so just\n // go ahead and set it now.\n const prev = walker.prev\n del(self, walker)\n walker = prev\n }\n }\n}\n\nconst del = (self, node) => {\n if (node) {\n const hit = node.value\n if (self[DISPOSE])\n self[DISPOSE](hit.key, hit.value)\n\n self[LENGTH] -= hit.length\n self[CACHE].delete(hit.key)\n self[LRU_LIST].removeNode(node)\n }\n}\n\nclass Entry {\n constructor (key, value, length, now, maxAge) {\n this.key = key\n this.value = value\n this.length = length\n this.now = now\n this.maxAge = maxAge || 0\n }\n}\n\nconst forEachStep = (self, fn, node, thisp) => {\n let hit = node.value\n if (isStale(self, hit)) {\n del(self, node)\n if (!self[ALLOW_STALE])\n hit = undefined\n }\n if (hit)\n fn.call(thisp, hit.value, hit.key, self)\n}\n\nmodule.exports = LRUCache\n", "// hoisted class for cyclic dependency\nclass Range {\n constructor (range, options) {\n options = parseOptions(options)\n\n if (range instanceof Range) {\n if (\n range.loose === !!options.loose &&\n range.includePrerelease === !!options.includePrerelease\n ) {\n return range\n } else {\n return new Range(range.raw, options)\n }\n }\n\n if (range instanceof Comparator) {\n // just put it in the set and return\n this.raw = range.value\n this.set = [[range]]\n this.format()\n return this\n }\n\n this.options = options\n this.loose = !!options.loose\n this.includePrerelease = !!options.includePrerelease\n\n // First, split based on boolean or ||\n this.raw = range\n this.set = range\n .split('||')\n // map the range to a 2d array of comparators\n .map(r => this.parseRange(r.trim()))\n // throw out any comparator lists that are empty\n // this generally means that it was not a valid range, which is allowed\n // in loose mode, but will still throw if the WHOLE range is invalid.\n .filter(c => c.length)\n\n if (!this.set.length) {\n throw new TypeError(`Invalid SemVer Range: ${range}`)\n }\n\n // if we have any that are not the null set, throw out null sets.\n if (this.set.length > 1) {\n // keep the first one, in case they're all null sets\n const first = this.set[0]\n this.set = this.set.filter(c => !isNullSet(c[0]))\n if (this.set.length === 0) {\n this.set = [first]\n } else if (this.set.length > 1) {\n // if we have any that are *, then the range is just *\n for (const c of this.set) {\n if (c.length === 1 && isAny(c[0])) {\n this.set = [c]\n break\n }\n }\n }\n }\n\n this.format()\n }\n\n format () {\n this.range = this.set\n .map((comps) => {\n return comps.join(' ').trim()\n })\n .join('||')\n .trim()\n return this.range\n }\n\n toString () {\n return this.range\n }\n\n parseRange (range) {\n range = range.trim()\n\n // memoize range parsing for performance.\n // this is a very hot path, and fully deterministic.\n const memoOpts = Object.keys(this.options).join(',')\n const memoKey = `parseRange:${memoOpts}:${range}`\n const cached = cache.get(memoKey)\n if (cached) {\n return cached\n }\n\n const loose = this.options.loose\n // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]\n range = range.replace(hr, hyphenReplace(this.options.includePrerelease))\n debug('hyphen replace', range)\n // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)\n debug('comparator trim', range)\n\n // `~ 1.2.3` => `~1.2.3`\n range = range.replace(re[t.TILDETRIM], tildeTrimReplace)\n\n // `^ 1.2.3` => `^1.2.3`\n range = range.replace(re[t.CARETTRIM], caretTrimReplace)\n\n // normalize spaces\n range = range.split(/\\s+/).join(' ')\n\n // At this point, the range is completely trimmed and\n // ready to be split into comparators.\n\n let rangeList = range\n .split(' ')\n .map(comp => parseComparator(comp, this.options))\n .join(' ')\n .split(/\\s+/)\n // >=0.0.0 is equivalent to *\n .map(comp => replaceGTE0(comp, this.options))\n\n if (loose) {\n // in loose mode, throw out any that are not valid comparators\n rangeList = rangeList.filter(comp => {\n debug('loose invalid filter', comp, this.options)\n return !!comp.match(re[t.COMPARATORLOOSE])\n })\n }\n debug('range list', rangeList)\n\n // if any comparators are the null set, then replace with JUST null set\n // if more than one comparator, remove any * comparators\n // also, don't include the same comparator more than once\n const rangeMap = new Map()\n const comparators = rangeList.map(comp => new Comparator(comp, this.options))\n for (const comp of comparators) {\n if (isNullSet(comp)) {\n return [comp]\n }\n rangeMap.set(comp.value, comp)\n }\n if (rangeMap.size > 1 && rangeMap.has('')) {\n rangeMap.delete('')\n }\n\n const result = [...rangeMap.values()]\n cache.set(memoKey, result)\n return result\n }\n\n intersects (range, options) {\n if (!(range instanceof Range)) {\n throw new TypeError('a Range is required')\n }\n\n return this.set.some((thisComparators) => {\n return (\n isSatisfiable(thisComparators, options) &&\n range.set.some((rangeComparators) => {\n return (\n isSatisfiable(rangeComparators, options) &&\n thisComparators.every((thisComparator) => {\n return rangeComparators.every((rangeComparator) => {\n return thisComparator.intersects(rangeComparator, options)\n })\n })\n )\n })\n )\n })\n }\n\n // if ANY of the sets match ALL of its comparators, then pass\n test (version) {\n if (!version) {\n return false\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n for (let i = 0; i < this.set.length; i++) {\n if (testSet(this.set[i], version, this.options)) {\n return true\n }\n }\n return false\n }\n}\nmodule.exports = Range\n\nconst LRU = require('lru-cache')\nconst cache = new LRU({ max: 1000 })\n\nconst parseOptions = require('../internal/parse-options')\nconst Comparator = require('./comparator')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst {\n re,\n t,\n comparatorTrimReplace,\n tildeTrimReplace,\n caretTrimReplace,\n} = require('../internal/re')\n\nconst isNullSet = c => c.value === '<0.0.0-0'\nconst isAny = c => c.value === ''\n\n// take a set of comparators and determine whether there\n// exists a version which can satisfy it\nconst isSatisfiable = (comparators, options) => {\n let result = true\n const remainingComparators = comparators.slice()\n let testComparator = remainingComparators.pop()\n\n while (result && remainingComparators.length) {\n result = remainingComparators.every((otherComparator) => {\n return testComparator.intersects(otherComparator, options)\n })\n\n testComparator = remainingComparators.pop()\n }\n\n return result\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nconst parseComparator = (comp, options) => {\n debug('comp', comp, options)\n comp = replaceCarets(comp, options)\n debug('caret', comp)\n comp = replaceTildes(comp, options)\n debug('tildes', comp)\n comp = replaceXRanges(comp, options)\n debug('xrange', comp)\n comp = replaceStars(comp, options)\n debug('stars', comp)\n return comp\n}\n\nconst isX = id => !id || id.toLowerCase() === 'x' || id === '*'\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0\n// ~0.0.1 --> >=0.0.1 <0.1.0-0\nconst replaceTildes = (comp, options) =>\n comp.trim().split(/\\s+/).map((c) => {\n return replaceTilde(c, options)\n }).join(' ')\n\nconst replaceTilde = (comp, options) => {\n const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('tilde', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0 <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n // ~1.2 == >=1.2.0 <1.3.0-0\n ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`\n } else if (pr) {\n debug('replaceTilde pr', pr)\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n } else {\n // ~1.2.3 == >=1.2.3 <1.3.0-0\n ret = `>=${M}.${m}.${p\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('tilde return', ret)\n return ret\n })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0\n// ^1.2.3 --> >=1.2.3 <2.0.0-0\n// ^1.2.0 --> >=1.2.0 <2.0.0-0\n// ^0.0.1 --> >=0.0.1 <0.0.2-0\n// ^0.1.0 --> >=0.1.0 <0.2.0-0\nconst replaceCarets = (comp, options) =>\n comp.trim().split(/\\s+/).map((c) => {\n return replaceCaret(c, options)\n }).join(' ')\n\nconst replaceCaret = (comp, options) => {\n debug('caret', comp, options)\n const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]\n const z = options.includePrerelease ? '-0' : ''\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('caret', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n if (M === '0') {\n ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`\n } else {\n ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`\n }\n } else if (pr) {\n debug('replaceCaret pr', pr)\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${+M + 1}.0.0-0`\n }\n } else {\n debug('no pr')\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p\n } <${+M + 1}.0.0-0`\n }\n }\n\n debug('caret return', ret)\n return ret\n })\n}\n\nconst replaceXRanges = (comp, options) => {\n debug('replaceXRanges', comp, options)\n return comp.split(/\\s+/).map((c) => {\n return replaceXRange(c, options)\n }).join(' ')\n}\n\nconst replaceXRange = (comp, options) => {\n comp = comp.trim()\n const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]\n return comp.replace(r, (ret, gtlt, M, m, p, pr) => {\n debug('xRange', comp, ret, gtlt, M, m, p, pr)\n const xM = isX(M)\n const xm = xM || isX(m)\n const xp = xm || isX(p)\n const anyX = xp\n\n if (gtlt === '=' && anyX) {\n gtlt = ''\n }\n\n // if we're including prereleases in the match, then we need\n // to fix this to -0, the lowest possible prerelease value\n pr = options.includePrerelease ? '-0' : ''\n\n if (xM) {\n if (gtlt === '>' || gtlt === '<') {\n // nothing is allowed\n ret = '<0.0.0-0'\n } else {\n // nothing is forbidden\n ret = '*'\n }\n } else if (gtlt && anyX) {\n // we know patch is an x, because we have any x at all.\n // replace X with 0\n if (xm) {\n m = 0\n }\n p = 0\n\n if (gtlt === '>') {\n // >1 => >=2.0.0\n // >1.2 => >=1.3.0\n gtlt = '>='\n if (xm) {\n M = +M + 1\n m = 0\n p = 0\n } else {\n m = +m + 1\n p = 0\n }\n } else if (gtlt === '<=') {\n // <=0.7.x is actually <0.8.0, since any 0.7.x should\n // pass. Similarly, <=7.x is actually <8.0.0, etc.\n gtlt = '<'\n if (xm) {\n M = +M + 1\n } else {\n m = +m + 1\n }\n }\n\n if (gtlt === '<') {\n pr = '-0'\n }\n\n ret = `${gtlt + M}.${m}.${p}${pr}`\n } else if (xm) {\n ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`\n } else if (xp) {\n ret = `>=${M}.${m}.0${pr\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('xRange return', ret)\n\n return ret\n })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nconst replaceStars = (comp, options) => {\n debug('replaceStars', comp, options)\n // Looseness is ignored here. star is always as loose as it gets!\n return comp.trim().replace(re[t.STAR], '')\n}\n\nconst replaceGTE0 = (comp, options) => {\n debug('replaceGTE0', comp, options)\n return comp.trim()\n .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')\n}\n\n// This function is passed to string.replace(re[t.HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0-0\nconst hyphenReplace = incPr => ($0,\n from, fM, fm, fp, fpr, fb,\n to, tM, tm, tp, tpr, tb) => {\n if (isX(fM)) {\n from = ''\n } else if (isX(fm)) {\n from = `>=${fM}.0.0${incPr ? '-0' : ''}`\n } else if (isX(fp)) {\n from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`\n } else if (fpr) {\n from = `>=${from}`\n } else {\n from = `>=${from}${incPr ? '-0' : ''}`\n }\n\n if (isX(tM)) {\n to = ''\n } else if (isX(tm)) {\n to = `<${+tM + 1}.0.0-0`\n } else if (isX(tp)) {\n to = `<${tM}.${+tm + 1}.0-0`\n } else if (tpr) {\n to = `<=${tM}.${tm}.${tp}-${tpr}`\n } else if (incPr) {\n to = `<${tM}.${tm}.${+tp + 1}-0`\n } else {\n to = `<=${to}`\n }\n\n return (`${from} ${to}`).trim()\n}\n\nconst testSet = (set, version, options) => {\n for (let i = 0; i < set.length; i++) {\n if (!set[i].test(version)) {\n return false\n }\n }\n\n if (version.prerelease.length && !options.includePrerelease) {\n // Find the set of versions that are allowed to have prereleases\n // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n // That should allow `1.2.3-pr.2` to pass.\n // However, `1.2.4-alpha.notready` should NOT be allowed,\n // even though it's within the range set by the comparators.\n for (let i = 0; i < set.length; i++) {\n debug(set[i].semver)\n if (set[i].semver === Comparator.ANY) {\n continue\n }\n\n if (set[i].semver.prerelease.length > 0) {\n const allowed = set[i].semver\n if (allowed.major === version.major &&\n allowed.minor === version.minor &&\n allowed.patch === version.patch) {\n return true\n }\n }\n }\n\n // Version has a -pre, but it's not one of the ones we like.\n return false\n }\n\n return true\n}\n", "const ANY = Symbol('SemVer ANY')\n// hoisted class for cyclic dependency\nclass Comparator {\n static get ANY () {\n return ANY\n }\n\n constructor (comp, options) {\n options = parseOptions(options)\n\n if (comp instanceof Comparator) {\n if (comp.loose === !!options.loose) {\n return comp\n } else {\n comp = comp.value\n }\n }\n\n debug('comparator', comp, options)\n this.options = options\n this.loose = !!options.loose\n this.parse(comp)\n\n if (this.semver === ANY) {\n this.value = ''\n } else {\n this.value = this.operator + this.semver.version\n }\n\n debug('comp', this)\n }\n\n parse (comp) {\n const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n const m = comp.match(r)\n\n if (!m) {\n throw new TypeError(`Invalid comparator: ${comp}`)\n }\n\n this.operator = m[1] !== undefined ? m[1] : ''\n if (this.operator === '=') {\n this.operator = ''\n }\n\n // if it literally is just '>' or '' then allow anything.\n if (!m[2]) {\n this.semver = ANY\n } else {\n this.semver = new SemVer(m[2], this.options.loose)\n }\n }\n\n toString () {\n return this.value\n }\n\n test (version) {\n debug('Comparator.test', version, this.options.loose)\n\n if (this.semver === ANY || version === ANY) {\n return true\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n return cmp(version, this.operator, this.semver, this.options)\n }\n\n intersects (comp, options) {\n if (!(comp instanceof Comparator)) {\n throw new TypeError('a Comparator is required')\n }\n\n if (!options || typeof options !== 'object') {\n options = {\n loose: !!options,\n includePrerelease: false,\n }\n }\n\n if (this.operator === '') {\n if (this.value === '') {\n return true\n }\n return new Range(comp.value, options).test(this.value)\n } else if (comp.operator === '') {\n if (comp.value === '') {\n return true\n }\n return new Range(this.value, options).test(comp.semver)\n }\n\n const sameDirectionIncreasing =\n (this.operator === '>=' || this.operator === '>') &&\n (comp.operator === '>=' || comp.operator === '>')\n const sameDirectionDecreasing =\n (this.operator === '<=' || this.operator === '<') &&\n (comp.operator === '<=' || comp.operator === '<')\n const sameSemVer = this.semver.version === comp.semver.version\n const differentDirectionsInclusive =\n (this.operator === '>=' || this.operator === '<=') &&\n (comp.operator === '>=' || comp.operator === '<=')\n const oppositeDirectionsLessThan =\n cmp(this.semver, '<', comp.semver, options) &&\n (this.operator === '>=' || this.operator === '>') &&\n (comp.operator === '<=' || comp.operator === '<')\n const oppositeDirectionsGreaterThan =\n cmp(this.semver, '>', comp.semver, options) &&\n (this.operator === '<=' || this.operator === '<') &&\n (comp.operator === '>=' || comp.operator === '>')\n\n return (\n sameDirectionIncreasing ||\n sameDirectionDecreasing ||\n (sameSemVer && differentDirectionsInclusive) ||\n oppositeDirectionsLessThan ||\n oppositeDirectionsGreaterThan\n )\n }\n}\n\nmodule.exports = Comparator\n\nconst parseOptions = require('../internal/parse-options')\nconst { re, t } = require('../internal/re')\nconst cmp = require('../functions/cmp')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst Range = require('./range')\n", "const Range = require('../classes/range')\nconst satisfies = (version, range, options) => {\n try {\n range = new Range(range, options)\n } catch (er) {\n return false\n }\n return range.test(version)\n}\nmodule.exports = satisfies\n", "const Range = require('../classes/range')\n\n// Mostly just for testing and legacy API reasons\nconst toComparators = (range, options) =>\n new Range(range, options).set\n .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))\n\nmodule.exports = toComparators\n", "const SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\n\nconst maxSatisfying = (versions, range, options) => {\n let max = null\n let maxSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!max || maxSV.compare(v) === -1) {\n // compare(max, v, true)\n max = v\n maxSV = new SemVer(max, options)\n }\n }\n })\n return max\n}\nmodule.exports = maxSatisfying\n", "const SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst minSatisfying = (versions, range, options) => {\n let min = null\n let minSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!min || minSV.compare(v) === 1) {\n // compare(min, v, true)\n min = v\n minSV = new SemVer(min, options)\n }\n }\n })\n return min\n}\nmodule.exports = minSatisfying\n", "const SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst gt = require('../functions/gt')\n\nconst minVersion = (range, loose) => {\n range = new Range(range, loose)\n\n let minver = new SemVer('0.0.0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = new SemVer('0.0.0-0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = null\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let setMin = null\n comparators.forEach((comparator) => {\n // Clone to avoid manipulating the comparator's semver object.\n const compver = new SemVer(comparator.semver.version)\n switch (comparator.operator) {\n case '>':\n if (compver.prerelease.length === 0) {\n compver.patch++\n } else {\n compver.prerelease.push(0)\n }\n compver.raw = compver.format()\n /* fallthrough */\n case '':\n case '>=':\n if (!setMin || gt(compver, setMin)) {\n setMin = compver\n }\n break\n case '<':\n case '<=':\n /* Ignore maximum versions */\n break\n /* istanbul ignore next */\n default:\n throw new Error(`Unexpected operation: ${comparator.operator}`)\n }\n })\n if (setMin && (!minver || gt(minver, setMin))) {\n minver = setMin\n }\n }\n\n if (minver && range.test(minver)) {\n return minver\n }\n\n return null\n}\nmodule.exports = minVersion\n", "const Range = require('../classes/range')\nconst validRange = (range, options) => {\n try {\n // Return '*' instead of '' so that truthiness works.\n // This will throw if it's invalid anyway\n return new Range(range, options).range || '*'\n } catch (er) {\n return null\n }\n}\nmodule.exports = validRange\n", "const SemVer = require('../classes/semver')\nconst Comparator = require('../classes/comparator')\nconst { ANY } = Comparator\nconst Range = require('../classes/range')\nconst satisfies = require('../functions/satisfies')\nconst gt = require('../functions/gt')\nconst lt = require('../functions/lt')\nconst lte = require('../functions/lte')\nconst gte = require('../functions/gte')\n\nconst outside = (version, range, hilo, options) => {\n version = new SemVer(version, options)\n range = new Range(range, options)\n\n let gtfn, ltefn, ltfn, comp, ecomp\n switch (hilo) {\n case '>':\n gtfn = gt\n ltefn = lte\n ltfn = lt\n comp = '>'\n ecomp = '>='\n break\n case '<':\n gtfn = lt\n ltefn = gte\n ltfn = gt\n comp = '<'\n ecomp = '<='\n break\n default:\n throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n }\n\n // If it satisfies the range it is not outside\n if (satisfies(version, range, options)) {\n return false\n }\n\n // From now on, variable terms are as if we're in \"gtr\" mode.\n // but note that everything is flipped for the \"ltr\" function.\n\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let high = null\n let low = null\n\n comparators.forEach((comparator) => {\n if (comparator.semver === ANY) {\n comparator = new Comparator('>=0.0.0')\n }\n high = high || comparator\n low = low || comparator\n if (gtfn(comparator.semver, high.semver, options)) {\n high = comparator\n } else if (ltfn(comparator.semver, low.semver, options)) {\n low = comparator\n }\n })\n\n // If the edge version comparator has a operator then our version\n // isn't outside it\n if (high.operator === comp || high.operator === ecomp) {\n return false\n }\n\n // If the lowest version comparator has an operator and our version\n // is less than it then it isn't higher than the range\n if ((!low.operator || low.operator === comp) &&\n ltefn(version, low.semver)) {\n return false\n } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n return false\n }\n }\n return true\n}\n\nmodule.exports = outside\n", "// Determine if version is greater than all the versions possible in the range.\nconst outside = require('./outside')\nconst gtr = (version, range, options) => outside(version, range, '>', options)\nmodule.exports = gtr\n", "const outside = require('./outside')\n// Determine if version is less than all the versions possible in the range\nconst ltr = (version, range, options) => outside(version, range, '<', options)\nmodule.exports = ltr\n", "const Range = require('../classes/range')\nconst intersects = (r1, r2, options) => {\n r1 = new Range(r1, options)\n r2 = new Range(r2, options)\n return r1.intersects(r2)\n}\nmodule.exports = intersects\n", "// given a set of versions and a range, create a \"simplified\" range\n// that includes the same versions that the original range does\n// If the original range is shorter than the simplified one, return that.\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\nmodule.exports = (versions, range, options) => {\n const set = []\n let first = null\n let prev = null\n const v = versions.sort((a, b) => compare(a, b, options))\n for (const version of v) {\n const included = satisfies(version, range, options)\n if (included) {\n prev = version\n if (!first) {\n first = version\n }\n } else {\n if (prev) {\n set.push([first, prev])\n }\n prev = null\n first = null\n }\n }\n if (first) {\n set.push([first, null])\n }\n\n const ranges = []\n for (const [min, max] of set) {\n if (min === max) {\n ranges.push(min)\n } else if (!max && min === v[0]) {\n ranges.push('*')\n } else if (!max) {\n ranges.push(`>=${min}`)\n } else if (min === v[0]) {\n ranges.push(`<=${max}`)\n } else {\n ranges.push(`${min} - ${max}`)\n }\n }\n const simplified = ranges.join(' || ')\n const original = typeof range.raw === 'string' ? range.raw : String(range)\n return simplified.length < original.length ? simplified : range\n}\n", "const Range = require('../classes/range.js')\nconst Comparator = require('../classes/comparator.js')\nconst { ANY } = Comparator\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\n\n// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:\n// - Every simple range `r1, r2, ...` is a null set, OR\n// - Every simple range `r1, r2, ...` which is not a null set is a subset of\n// some `R1, R2, ...`\n//\n// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:\n// - If c is only the ANY comparator\n// - If C is only the ANY comparator, return true\n// - Else if in prerelease mode, return false\n// - else replace c with `[>=0.0.0]`\n// - If C is only the ANY comparator\n// - if in prerelease mode, return true\n// - else replace C with `[>=0.0.0]`\n// - Let EQ be the set of = comparators in c\n// - If EQ is more than one, return true (null set)\n// - Let GT be the highest > or >= comparator in c\n// - Let LT be the lowest < or <= comparator in c\n// - If GT and LT, and GT.semver > LT.semver, return true (null set)\n// - If any C is a = range, and GT or LT are set, return false\n// - If EQ\n// - If GT, and EQ does not satisfy GT, return true (null set)\n// - If LT, and EQ does not satisfy LT, return true (null set)\n// - If EQ satisfies every C, return true\n// - Else return false\n// - If GT\n// - If GT.semver is lower than any > or >= comp in C, return false\n// - If GT is >=, and GT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the GT.semver tuple, return false\n// - If LT\n// - If LT.semver is greater than any < or <= comp in C, return false\n// - If LT is <=, and LT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the LT.semver tuple, return false\n// - Else return true\n\nconst subset = (sub, dom, options = {}) => {\n if (sub === dom) {\n return true\n }\n\n sub = new Range(sub, options)\n dom = new Range(dom, options)\n let sawNonNull = false\n\n OUTER: for (const simpleSub of sub.set) {\n for (const simpleDom of dom.set) {\n const isSub = simpleSubset(simpleSub, simpleDom, options)\n sawNonNull = sawNonNull || isSub !== null\n if (isSub) {\n continue OUTER\n }\n }\n // the null set is a subset of everything, but null simple ranges in\n // a complex range should be ignored. so if we saw a non-null range,\n // then we know this isn't a subset, but if EVERY simple range was null,\n // then it is a subset.\n if (sawNonNull) {\n return false\n }\n }\n return true\n}\n\nconst simpleSubset = (sub, dom, options) => {\n if (sub === dom) {\n return true\n }\n\n if (sub.length === 1 && sub[0].semver === ANY) {\n if (dom.length === 1 && dom[0].semver === ANY) {\n return true\n } else if (options.includePrerelease) {\n sub = [new Comparator('>=0.0.0-0')]\n } else {\n sub = [new Comparator('>=0.0.0')]\n }\n }\n\n if (dom.length === 1 && dom[0].semver === ANY) {\n if (options.includePrerelease) {\n return true\n } else {\n dom = [new Comparator('>=0.0.0')]\n }\n }\n\n const eqSet = new Set()\n let gt, lt\n for (const c of sub) {\n if (c.operator === '>' || c.operator === '>=') {\n gt = higherGT(gt, c, options)\n } else if (c.operator === '<' || c.operator === '<=') {\n lt = lowerLT(lt, c, options)\n } else {\n eqSet.add(c.semver)\n }\n }\n\n if (eqSet.size > 1) {\n return null\n }\n\n let gtltComp\n if (gt && lt) {\n gtltComp = compare(gt.semver, lt.semver, options)\n if (gtltComp > 0) {\n return null\n } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {\n return null\n }\n }\n\n // will iterate one or zero times\n for (const eq of eqSet) {\n if (gt && !satisfies(eq, String(gt), options)) {\n return null\n }\n\n if (lt && !satisfies(eq, String(lt), options)) {\n return null\n }\n\n for (const c of dom) {\n if (!satisfies(eq, String(c), options)) {\n return false\n }\n }\n\n return true\n }\n\n let higher, lower\n let hasDomLT, hasDomGT\n // if the subset has a prerelease, we need a comparator in the superset\n // with the same tuple and a prerelease, or it's not a subset\n let needDomLTPre = lt &&\n !options.includePrerelease &&\n lt.semver.prerelease.length ? lt.semver : false\n let needDomGTPre = gt &&\n !options.includePrerelease &&\n gt.semver.prerelease.length ? gt.semver : false\n // exception: <1.2.3-0 is the same as <1.2.3\n if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&\n lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {\n needDomLTPre = false\n }\n\n for (const c of dom) {\n hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='\n hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='\n if (gt) {\n if (needDomGTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomGTPre.major &&\n c.semver.minor === needDomGTPre.minor &&\n c.semver.patch === needDomGTPre.patch) {\n needDomGTPre = false\n }\n }\n if (c.operator === '>' || c.operator === '>=') {\n higher = higherGT(gt, c, options)\n if (higher === c && higher !== gt) {\n return false\n }\n } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {\n return false\n }\n }\n if (lt) {\n if (needDomLTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomLTPre.major &&\n c.semver.minor === needDomLTPre.minor &&\n c.semver.patch === needDomLTPre.patch) {\n needDomLTPre = false\n }\n }\n if (c.operator === '<' || c.operator === '<=') {\n lower = lowerLT(lt, c, options)\n if (lower === c && lower !== lt) {\n return false\n }\n } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {\n return false\n }\n }\n if (!c.operator && (lt || gt) && gtltComp !== 0) {\n return false\n }\n }\n\n // if there was a < or >, and nothing in the dom, then must be false\n // UNLESS it was limited by another range in the other direction.\n // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0\n if (gt && hasDomLT && !lt && gtltComp !== 0) {\n return false\n }\n\n if (lt && hasDomGT && !gt && gtltComp !== 0) {\n return false\n }\n\n // we needed a prerelease range in a specific tuple, but didn't get one\n // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0,\n // because it includes prereleases in the 1.2.3 tuple\n if (needDomGTPre || needDomLTPre) {\n return false\n }\n\n return true\n}\n\n// >=1.2.3 is lower than >1.2.3\nconst higherGT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp > 0 ? a\n : comp < 0 ? b\n : b.operator === '>' && a.operator === '>=' ? b\n : a\n}\n\n// <=1.2.3 is higher than <1.2.3\nconst lowerLT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp < 0 ? a\n : comp > 0 ? b\n : b.operator === '<' && a.operator === '<=' ? b\n : a\n}\n\nmodule.exports = subset\n", "// just pre-load all the stuff that index.js lazily exports\nconst internalRe = require('./internal/re')\nconst constants = require('./internal/constants')\nconst SemVer = require('./classes/semver')\nconst identifiers = require('./internal/identifiers')\nconst parse = require('./functions/parse')\nconst valid = require('./functions/valid')\nconst clean = require('./functions/clean')\nconst inc = require('./functions/inc')\nconst diff = require('./functions/diff')\nconst major = require('./functions/major')\nconst minor = require('./functions/minor')\nconst patch = require('./functions/patch')\nconst prerelease = require('./functions/prerelease')\nconst compare = require('./functions/compare')\nconst rcompare = require('./functions/rcompare')\nconst compareLoose = require('./functions/compare-loose')\nconst compareBuild = require('./functions/compare-build')\nconst sort = require('./functions/sort')\nconst rsort = require('./functions/rsort')\nconst gt = require('./functions/gt')\nconst lt = require('./functions/lt')\nconst eq = require('./functions/eq')\nconst neq = require('./functions/neq')\nconst gte = require('./functions/gte')\nconst lte = require('./functions/lte')\nconst cmp = require('./functions/cmp')\nconst coerce = require('./functions/coerce')\nconst Comparator = require('./classes/comparator')\nconst Range = require('./classes/range')\nconst satisfies = require('./functions/satisfies')\nconst toComparators = require('./ranges/to-comparators')\nconst maxSatisfying = require('./ranges/max-satisfying')\nconst minSatisfying = require('./ranges/min-satisfying')\nconst minVersion = require('./ranges/min-version')\nconst validRange = require('./ranges/valid')\nconst outside = require('./ranges/outside')\nconst gtr = require('./ranges/gtr')\nconst ltr = require('./ranges/ltr')\nconst intersects = require('./ranges/intersects')\nconst simplifyRange = require('./ranges/simplify')\nconst subset = require('./ranges/subset')\nmodule.exports = {\n parse,\n valid,\n clean,\n inc,\n diff,\n major,\n minor,\n patch,\n prerelease,\n compare,\n rcompare,\n compareLoose,\n compareBuild,\n sort,\n rsort,\n gt,\n lt,\n eq,\n neq,\n gte,\n lte,\n cmp,\n coerce,\n Comparator,\n Range,\n satisfies,\n toComparators,\n maxSatisfying,\n minSatisfying,\n minVersion,\n validRange,\n outside,\n gtr,\n ltr,\n intersects,\n simplifyRange,\n subset,\n SemVer,\n re: internalRe.re,\n src: internalRe.src,\n tokens: internalRe.t,\n SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,\n compareIdentifiers: identifiers.compareIdentifiers,\n rcompareIdentifiers: identifiers.rcompareIdentifiers,\n}\n", "(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.acorn = {}));\n})(this, (function (exports) { 'use strict';\n\n // This file was generated. Do not modify manually!\n var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 154, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 161, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 19306, 9, 87, 9, 39, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4706, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 262, 6, 10, 9, 357, 0, 62, 13, 1495, 6, 110, 6, 6, 9, 4759, 9, 787719, 239];\n\n // This file was generated. Do not modify manually!\n var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 85, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 190, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1070, 4050, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 46, 2, 18, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 482, 44, 11, 6, 17, 0, 322, 29, 19, 43, 1269, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4152, 8, 221, 3, 5761, 15, 7472, 3104, 541, 1507, 4938];\n\n // This file was generated. Do not modify manually!\n var nonASCIIidentifierChars = \"\\u200c\\u200d\\xb7\\u0300-\\u036f\\u0387\\u0483-\\u0487\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u0669\\u0670\\u06d6-\\u06dc\\u06df-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u06f0-\\u06f9\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07c0-\\u07c9\\u07eb-\\u07f3\\u07fd\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0859-\\u085b\\u0898-\\u089f\\u08ca-\\u08e1\\u08e3-\\u0903\\u093a-\\u093c\\u093e-\\u094f\\u0951-\\u0957\\u0962\\u0963\\u0966-\\u096f\\u0981-\\u0983\\u09bc\\u09be-\\u09c4\\u09c7\\u09c8\\u09cb-\\u09cd\\u09d7\\u09e2\\u09e3\\u09e6-\\u09ef\\u09fe\\u0a01-\\u0a03\\u0a3c\\u0a3e-\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a66-\\u0a71\\u0a75\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0ae2\\u0ae3\\u0ae6-\\u0aef\\u0afa-\\u0aff\\u0b01-\\u0b03\\u0b3c\\u0b3e-\\u0b44\\u0b47\\u0b48\\u0b4b-\\u0b4d\\u0b55-\\u0b57\\u0b62\\u0b63\\u0b66-\\u0b6f\\u0b82\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\\u0be6-\\u0bef\\u0c00-\\u0c04\\u0c3c\\u0c3e-\\u0c44\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0c66-\\u0c6f\\u0c81-\\u0c83\\u0cbc\\u0cbe-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0ce6-\\u0cef\\u0d00-\\u0d03\\u0d3b\\u0d3c\\u0d3e-\\u0d44\\u0d46-\\u0d48\\u0d4a-\\u0d4d\\u0d57\\u0d62\\u0d63\\u0d66-\\u0d6f\\u0d81-\\u0d83\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0de6-\\u0def\\u0df2\\u0df3\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0e50-\\u0e59\\u0eb1\\u0eb4-\\u0ebc\\u0ec8-\\u0ecd\\u0ed0-\\u0ed9\\u0f18\\u0f19\\u0f20-\\u0f29\\u0f35\\u0f37\\u0f39\\u0f3e\\u0f3f\\u0f71-\\u0f84\\u0f86\\u0f87\\u0f8d-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102b-\\u103e\\u1040-\\u1049\\u1056-\\u1059\\u105e-\\u1060\\u1062-\\u1064\\u1067-\\u106d\\u1071-\\u1074\\u1082-\\u108d\\u108f-\\u109d\\u135d-\\u135f\\u1369-\\u1371\\u1712-\\u1715\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b4-\\u17d3\\u17dd\\u17e0-\\u17e9\\u180b-\\u180d\\u180f-\\u1819\\u18a9\\u1920-\\u192b\\u1930-\\u193b\\u1946-\\u194f\\u19d0-\\u19da\\u1a17-\\u1a1b\\u1a55-\\u1a5e\\u1a60-\\u1a7c\\u1a7f-\\u1a89\\u1a90-\\u1a99\\u1ab0-\\u1abd\\u1abf-\\u1ace\\u1b00-\\u1b04\\u1b34-\\u1b44\\u1b50-\\u1b59\\u1b6b-\\u1b73\\u1b80-\\u1b82\\u1ba1-\\u1bad\\u1bb0-\\u1bb9\\u1be6-\\u1bf3\\u1c24-\\u1c37\\u1c40-\\u1c49\\u1c50-\\u1c59\\u1cd0-\\u1cd2\\u1cd4-\\u1ce8\\u1ced\\u1cf4\\u1cf7-\\u1cf9\\u1dc0-\\u1dff\\u203f\\u2040\\u2054\\u20d0-\\u20dc\\u20e1\\u20e5-\\u20f0\\u2cef-\\u2cf1\\u2d7f\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua620-\\ua629\\ua66f\\ua674-\\ua67d\\ua69e\\ua69f\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua823-\\ua827\\ua82c\\ua880\\ua881\\ua8b4-\\ua8c5\\ua8d0-\\ua8d9\\ua8e0-\\ua8f1\\ua8ff-\\ua909\\ua926-\\ua92d\\ua947-\\ua953\\ua980-\\ua983\\ua9b3-\\ua9c0\\ua9d0-\\ua9d9\\ua9e5\\ua9f0-\\ua9f9\\uaa29-\\uaa36\\uaa43\\uaa4c\\uaa4d\\uaa50-\\uaa59\\uaa7b-\\uaa7d\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uaaeb-\\uaaef\\uaaf5\\uaaf6\\uabe3-\\uabea\\uabec\\uabed\\uabf0-\\uabf9\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe2f\\ufe33\\ufe34\\ufe4d-\\ufe4f\\uff10-\\uff19\\uff3f\";\n\n // This file was generated. Do not modify manually!\n var nonASCIIidentifierStartChars = \"\\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\\u0560-\\u0588\\u05d0-\\u05ea\\u05ef-\\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\\u0860-\\u086a\\u0870-\\u0887\\u0889-\\u088e\\u08a0-\\u08c9\\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\\u09fc\\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\\u0c5d\\u0c60\\u0c61\\u0c80\\u0c85-\\u0c8c\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbd\\u0cdd\\u0cde\\u0ce0\\u0ce1\\u0cf1\\u0cf2\\u0d04-\\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\\u0e86-\\u0e8a\\u0e8c-\\u0ea3\\u0ea5\\u0ea7-\\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-\\u1711\\u171f-\\u1731\\u1740-\\u1751\\u1760-\\u176c\\u176e-\\u1770\\u1780-\\u17b3\\u17d7\\u17dc\\u1820-\\u1878\\u1880-\\u18a8\\u18aa\\u18b0-\\u18f5\\u1900-\\u191e\\u1950-\\u196d\\u1970-\\u1974\\u1980-\\u19ab\\u19b0-\\u19c9\\u1a00-\\u1a16\\u1a20-\\u1a54\\u1aa7\\u1b05-\\u1b33\\u1b45-\\u1b4c\\u1b83-\\u1ba0\\u1bae\\u1baf\\u1bba-\\u1be5\\u1c00-\\u1c23\\u1c4d-\\u1c4f\\u1c5a-\\u1c7d\\u1c80-\\u1c88\\u1c90-\\u1cba\\u1cbd-\\u1cbf\\u1ce9-\\u1cec\\u1cee-\\u1cf3\\u1cf5\\u1cf6\\u1cfa\\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-\\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-\\u312f\\u3131-\\u318e\\u31a0-\\u31bf\\u31f0-\\u31ff\\u3400-\\u4dbf\\u4e00-\\ua48c\\ua4d0-\\ua4fd\\ua500-\\ua60c\\ua610-\\ua61f\\ua62a\\ua62b\\ua640-\\ua66e\\ua67f-\\ua69d\\ua6a0-\\ua6ef\\ua717-\\ua71f\\ua722-\\ua788\\ua78b-\\ua7ca\\ua7d0\\ua7d1\\ua7d3\\ua7d5-\\ua7d9\\ua7f2-\\ua801\\ua803-\\ua805\\ua807-\\ua80a\\ua80c-\\ua822\\ua840-\\ua873\\ua882-\\ua8b3\\ua8f2-\\ua8f7\\ua8fb\\ua8fd\\ua8fe\\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-\\uab69\\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\";\n\n // These are a run-length and offset encoded representation of the\n\n // Reserved word lists for various dialects of the language\n\n var reservedWords = {\n 3: \"abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile\",\n 5: \"class enum extends super const export import\",\n 6: \"enum\",\n strict: \"implements interface let package private protected public static yield\",\n strictBind: \"eval arguments\"\n };\n\n // And the keywords\n\n var ecma5AndLessKeywords = \"break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this\";\n\n var keywords$1 = {\n 5: ecma5AndLessKeywords,\n \"5module\": ecma5AndLessKeywords + \" export import\",\n 6: ecma5AndLessKeywords + \" const class extends export import super\"\n };\n\n var keywordRelationalOperator = /^in(stanceof)?$/;\n\n // ## Character categories\n\n var nonASCIIidentifierStart = new RegExp(\"[\" + nonASCIIidentifierStartChars + \"]\");\n var nonASCIIidentifier = new RegExp(\"[\" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + \"]\");\n\n // This has a complexity linear to the value of the code. The\n // assumption is that looking up astral identifier characters is\n // rare.\n function isInAstralSet(code, set) {\n var pos = 0x10000;\n for (var i = 0; i < set.length; i += 2) {\n pos += set[i];\n if (pos > code) { return false }\n pos += set[i + 1];\n if (pos >= code) { return true }\n }\n }\n\n // Test whether a given character code starts an identifier.\n\n function isIdentifierStart(code, astral) {\n if (code < 65) { return code === 36 }\n if (code < 91) { return true }\n if (code < 97) { return code === 95 }\n if (code < 123) { return true }\n if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)) }\n if (astral === false) { return false }\n return isInAstralSet(code, astralIdentifierStartCodes)\n }\n\n // Test whether a given character is part of an identifier.\n\n function isIdentifierChar(code, astral) {\n if (code < 48) { return code === 36 }\n if (code < 58) { return true }\n if (code < 65) { return false }\n if (code < 91) { return true }\n if (code < 97) { return code === 95 }\n if (code < 123) { return true }\n if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)) }\n if (astral === false) { return false }\n return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes)\n }\n\n // ## Token types\n\n // The assignment of fine-grained, information-carrying type objects\n // allows the tokenizer to store the information it has about a\n // token in a way that is very cheap for the parser to look up.\n\n // All token type variables start with an underscore, to make them\n // easy to recognize.\n\n // The `beforeExpr` property is used to disambiguate between regular\n // expressions and divisions. It is set on all token types that can\n // be followed by an expression (thus, a slash after them would be a\n // regular expression).\n //\n // The `startsExpr` property is used to check if the token ends a\n // `yield` expression. It is set on all token types that either can\n // directly start an expression (like a quotation mark) or can\n // continue an expression (like the body of a string).\n //\n // `isLoop` marks a keyword as starting a loop, which is important\n // to know when parsing a label, in order to allow or disallow\n // continue jumps to that label.\n\n var TokenType = function TokenType(label, conf) {\n if ( conf === void 0 ) conf = {};\n\n this.label = label;\n this.keyword = conf.keyword;\n this.beforeExpr = !!conf.beforeExpr;\n this.startsExpr = !!conf.startsExpr;\n this.isLoop = !!conf.isLoop;\n this.isAssign = !!conf.isAssign;\n this.prefix = !!conf.prefix;\n this.postfix = !!conf.postfix;\n this.binop = conf.binop || null;\n this.updateContext = null;\n };\n\n function binop(name, prec) {\n return new TokenType(name, {beforeExpr: true, binop: prec})\n }\n var beforeExpr = {beforeExpr: true}, startsExpr = {startsExpr: true};\n\n // Map keyword names to token types.\n\n var keywords = {};\n\n // Succinct definitions of keyword token types\n function kw(name, options) {\n if ( options === void 0 ) options = {};\n\n options.keyword = name;\n return keywords[name] = new TokenType(name, options)\n }\n\n var types$1 = {\n num: new TokenType(\"num\", startsExpr),\n regexp: new TokenType(\"regexp\", startsExpr),\n string: new TokenType(\"string\", startsExpr),\n name: new TokenType(\"name\", startsExpr),\n privateId: new TokenType(\"privateId\", startsExpr),\n eof: new TokenType(\"eof\"),\n\n // Punctuation token types.\n bracketL: new TokenType(\"[\", {beforeExpr: true, startsExpr: true}),\n bracketR: new TokenType(\"]\"),\n braceL: new TokenType(\"{\", {beforeExpr: true, startsExpr: true}),\n braceR: new TokenType(\"}\"),\n parenL: new TokenType(\"(\", {beforeExpr: true, startsExpr: true}),\n parenR: new TokenType(\")\"),\n comma: new TokenType(\",\", beforeExpr),\n semi: new TokenType(\";\", beforeExpr),\n colon: new TokenType(\":\", beforeExpr),\n dot: new TokenType(\".\"),\n question: new TokenType(\"?\", beforeExpr),\n questionDot: new TokenType(\"?.\"),\n arrow: new TokenType(\"=>\", beforeExpr),\n template: new TokenType(\"template\"),\n invalidTemplate: new TokenType(\"invalidTemplate\"),\n ellipsis: new TokenType(\"...\", beforeExpr),\n backQuote: new TokenType(\"`\", startsExpr),\n dollarBraceL: new TokenType(\"${\", {beforeExpr: true, startsExpr: true}),\n\n // Operators. These carry several kinds of properties to help the\n // parser use them properly (the presence of these properties is\n // what categorizes them as operators).\n //\n // `binop`, when present, specifies that this operator is a binary\n // operator, and will refer to its precedence.\n //\n // `prefix` and `postfix` mark the operator as a prefix or postfix\n // unary operator.\n //\n // `isAssign` marks all of `=`, `+=`, `-=` etcetera, which act as\n // binary operators with a very low precedence, that should result\n // in AssignmentExpression nodes.\n\n eq: new TokenType(\"=\", {beforeExpr: true, isAssign: true}),\n assign: new TokenType(\"_=\", {beforeExpr: true, isAssign: true}),\n incDec: new TokenType(\"++/--\", {prefix: true, postfix: true, startsExpr: true}),\n prefix: new TokenType(\"!/~\", {beforeExpr: true, prefix: true, startsExpr: true}),\n logicalOR: binop(\"||\", 1),\n logicalAND: binop(\"&&\", 2),\n bitwiseOR: binop(\"|\", 3),\n bitwiseXOR: binop(\"^\", 4),\n bitwiseAND: binop(\"&\", 5),\n equality: binop(\"==/!=/===/!==\", 6),\n relational: binop(\"</>/<=/>=\", 7),\n bitShift: binop(\"<</>>/>>>\", 8),\n plusMin: new TokenType(\"+/-\", {beforeExpr: true, binop: 9, prefix: true, startsExpr: true}),\n modulo: binop(\"%\", 10),\n star: binop(\"*\", 10),\n slash: binop(\"/\", 10),\n starstar: new TokenType(\"**\", {beforeExpr: true}),\n coalesce: binop(\"??\", 1),\n\n // Keyword token types.\n _break: kw(\"break\"),\n _case: kw(\"case\", beforeExpr),\n _catch: kw(\"catch\"),\n _continue: kw(\"continue\"),\n _debugger: kw(\"debugger\"),\n _default: kw(\"default\", beforeExpr),\n _do: kw(\"do\", {isLoop: true, beforeExpr: true}),\n _else: kw(\"else\", beforeExpr),\n _finally: kw(\"finally\"),\n _for: kw(\"for\", {isLoop: true}),\n _function: kw(\"function\", startsExpr),\n _if: kw(\"if\"),\n _return: kw(\"return\", beforeExpr),\n _switch: kw(\"switch\"),\n _throw: kw(\"throw\", beforeExpr),\n _try: kw(\"try\"),\n _var: kw(\"var\"),\n _const: kw(\"const\"),\n _while: kw(\"while\", {isLoop: true}),\n _with: kw(\"with\"),\n _new: kw(\"new\", {beforeExpr: true, startsExpr: true}),\n _this: kw(\"this\", startsExpr),\n _super: kw(\"super\", startsExpr),\n _class: kw(\"class\", startsExpr),\n _extends: kw(\"extends\", beforeExpr),\n _export: kw(\"export\"),\n _import: kw(\"import\", startsExpr),\n _null: kw(\"null\", startsExpr),\n _true: kw(\"true\", startsExpr),\n _false: kw(\"false\", startsExpr),\n _in: kw(\"in\", {beforeExpr: true, binop: 7}),\n _instanceof: kw(\"instanceof\", {beforeExpr: true, binop: 7}),\n _typeof: kw(\"typeof\", {beforeExpr: true, prefix: true, startsExpr: true}),\n _void: kw(\"void\", {beforeExpr: true, prefix: true, startsExpr: true}),\n _delete: kw(\"delete\", {beforeExpr: true, prefix: true, startsExpr: true})\n };\n\n // Matches a whole line break (where CRLF is considered a single\n // line break). Used to count lines.\n\n var lineBreak = /\\r\\n?|\\n|\\u2028|\\u2029/;\n var lineBreakG = new RegExp(lineBreak.source, \"g\");\n\n function isNewLine(code) {\n return code === 10 || code === 13 || code === 0x2028 || code === 0x2029\n }\n\n function nextLineBreak(code, from, end) {\n if ( end === void 0 ) end = code.length;\n\n for (var i = from; i < end; i++) {\n var next = code.charCodeAt(i);\n if (isNewLine(next))\n { return i < end - 1 && next === 13 && code.charCodeAt(i + 1) === 10 ? i + 2 : i + 1 }\n }\n return -1\n }\n\n var nonASCIIwhitespace = /[\\u1680\\u2000-\\u200a\\u202f\\u205f\\u3000\\ufeff]/;\n\n var skipWhiteSpace = /(?:\\s|\\/\\/.*|\\/\\*[^]*?\\*\\/)*/g;\n\n var ref = Object.prototype;\n var hasOwnProperty = ref.hasOwnProperty;\n var toString = ref.toString;\n\n var hasOwn = Object.hasOwn || (function (obj, propName) { return (\n hasOwnProperty.call(obj, propName)\n ); });\n\n var isArray = Array.isArray || (function (obj) { return (\n toString.call(obj) === \"[object Array]\"\n ); });\n\n function wordsRegexp(words) {\n return new RegExp(\"^(?:\" + words.replace(/ /g, \"|\") + \")$\")\n }\n\n function codePointToString(code) {\n // UTF-16 Decoding\n if (code <= 0xFFFF) { return String.fromCharCode(code) }\n code -= 0x10000;\n return String.fromCharCode((code >> 10) + 0xD800, (code & 1023) + 0xDC00)\n }\n\n var loneSurrogate = /(?:[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])/;\n\n // These are used when `options.locations` is on, for the\n // `startLoc` and `endLoc` properties.\n\n var Position = function Position(line, col) {\n this.line = line;\n this.column = col;\n };\n\n Position.prototype.offset = function offset (n) {\n return new Position(this.line, this.column + n)\n };\n\n var SourceLocation = function SourceLocation(p, start, end) {\n this.start = start;\n this.end = end;\n if (p.sourceFile !== null) { this.source = p.sourceFile; }\n };\n\n // The `getLineInfo` function is mostly useful when the\n // `locations` option is off (for performance reasons) and you\n // want to find the line/column position for a given character\n // offset. `input` should be the code string that the offset refers\n // into.\n\n function getLineInfo(input, offset) {\n for (var line = 1, cur = 0;;) {\n var nextBreak = nextLineBreak(input, cur, offset);\n if (nextBreak < 0) { return new Position(line, offset - cur) }\n ++line;\n cur = nextBreak;\n }\n }\n\n // A second argument must be given to configure the parser process.\n // These options are recognized (only `ecmaVersion` is required):\n\n var defaultOptions = {\n // `ecmaVersion` indicates the ECMAScript version to parse. Must be\n // either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10\n // (2019), 11 (2020), 12 (2021), 13 (2022), 14 (2023), or `\"latest\"`\n // (the latest version the library supports). This influences\n // support for strict mode, the set of reserved words, and support\n // for new syntax features.\n ecmaVersion: null,\n // `sourceType` indicates the mode the code should be parsed in.\n // Can be either `\"script\"` or `\"module\"`. This influences global\n // strict mode and parsing of `import` and `export` declarations.\n sourceType: \"script\",\n // `onInsertedSemicolon` can be a callback that will be called\n // when a semicolon is automatically inserted. It will be passed\n // the position of the comma as an offset, and if `locations` is\n // enabled, it is given the location as a `{line, column}` object\n // as second argument.\n onInsertedSemicolon: null,\n // `onTrailingComma` is similar to `onInsertedSemicolon`, but for\n // trailing commas.\n onTrailingComma: null,\n // By default, reserved words are only enforced if ecmaVersion >= 5.\n // Set `allowReserved` to a boolean value to explicitly turn this on\n // an off. When this option has the value \"never\", reserved words\n // and keywords can also not be used as property names.\n allowReserved: null,\n // When enabled, a return at the top level is not considered an\n // error.\n allowReturnOutsideFunction: false,\n // When enabled, import/export statements are not constrained to\n // appearing at the top of the program, and an import.meta expression\n // in a script isn't considered an error.\n allowImportExportEverywhere: false,\n // By default, await identifiers are allowed to appear at the top-level scope only if ecmaVersion >= 2022.\n // When enabled, await identifiers are allowed to appear at the top-level scope,\n // but they are still not allowed in non-async functions.\n allowAwaitOutsideFunction: null,\n // When enabled, super identifiers are not constrained to\n // appearing in methods and do not raise an error when they appear elsewhere.\n allowSuperOutsideMethod: null,\n // When enabled, hashbang directive in the beginning of file is\n // allowed and treated as a line comment. Enabled by default when\n // `ecmaVersion` >= 2023.\n allowHashBang: false,\n // When `locations` is on, `loc` properties holding objects with\n // `start` and `end` properties in `{line, column}` form (with\n // line being 1-based and column 0-based) will be attached to the\n // nodes.\n locations: false,\n // A function can be passed as `onToken` option, which will\n // cause Acorn to call that function with object in the same\n // format as tokens returned from `tokenizer().getToken()`. Note\n // that you are not allowed to call the parser from the\n // callback\u2014that will corrupt its internal state.\n onToken: null,\n // A function can be passed as `onComment` option, which will\n // cause Acorn to call that function with `(block, text, start,\n // end)` parameters whenever a comment is skipped. `block` is a\n // boolean indicating whether this is a block (`/* */`) comment,\n // `text` is the content of the comment, and `start` and `end` are\n // character offsets that denote the start and end of the comment.\n // When the `locations` option is on, two more parameters are\n // passed, the full `{line, column}` locations of the start and\n // end of the comments. Note that you are not allowed to call the\n // parser from the callback\u2014that will corrupt its internal state.\n onComment: null,\n // Nodes have their start and end characters offsets recorded in\n // `start` and `end` properties (directly on the node, rather than\n // the `loc` object, which holds line/column data. To also add a\n // [semi-standardized][range] `range` property holding a `[start,\n // end]` array with the same numbers, set the `ranges` option to\n // `true`.\n //\n // [range]: https://bugzilla.mozilla.org/show_bug.cgi?id=745678\n ranges: false,\n // It is possible to parse multiple files into a single AST by\n // passing the tree produced by parsing the first file as\n // `program` option in subsequent parses. This will add the\n // toplevel forms of the parsed file to the `Program` (top) node\n // of an existing parse tree.\n program: null,\n // When `locations` is on, you can pass this to record the source\n // file in every node's `loc` object.\n sourceFile: null,\n // This value, if given, is stored in every node, whether\n // `locations` is on or off.\n directSourceFile: null,\n // When enabled, parenthesized expressions are represented by\n // (non-standard) ParenthesizedExpression nodes\n preserveParens: false\n };\n\n // Interpret and default an options object\n\n var warnedAboutEcmaVersion = false;\n\n function getOptions(opts) {\n var options = {};\n\n for (var opt in defaultOptions)\n { options[opt] = opts && hasOwn(opts, opt) ? opts[opt] : defaultOptions[opt]; }\n\n if (options.ecmaVersion === \"latest\") {\n options.ecmaVersion = 1e8;\n } else if (options.ecmaVersion == null) {\n if (!warnedAboutEcmaVersion && typeof console === \"object\" && console.warn) {\n warnedAboutEcmaVersion = true;\n console.warn(\"Since Acorn 8.0.0, options.ecmaVersion is required.\\nDefaulting to 2020, but this will stop working in the future.\");\n }\n options.ecmaVersion = 11;\n } else if (options.ecmaVersion >= 2015) {\n options.ecmaVersion -= 2009;\n }\n\n if (options.allowReserved == null)\n { options.allowReserved = options.ecmaVersion < 5; }\n\n if (opts.allowHashBang == null)\n { options.allowHashBang = options.ecmaVersion >= 14; }\n\n if (isArray(options.onToken)) {\n var tokens = options.onToken;\n options.onToken = function (token) { return tokens.push(token); };\n }\n if (isArray(options.onComment))\n { options.onComment = pushComment(options, options.onComment); }\n\n return options\n }\n\n function pushComment(options, array) {\n return function(block, text, start, end, startLoc, endLoc) {\n var comment = {\n type: block ? \"Block\" : \"Line\",\n value: text,\n start: start,\n end: end\n };\n if (options.locations)\n { comment.loc = new SourceLocation(this, startLoc, endLoc); }\n if (options.ranges)\n { comment.range = [start, end]; }\n array.push(comment);\n }\n }\n\n // Each scope gets a bitset that may contain these flags\n var\n SCOPE_TOP = 1,\n SCOPE_FUNCTION = 2,\n SCOPE_ASYNC = 4,\n SCOPE_GENERATOR = 8,\n SCOPE_ARROW = 16,\n SCOPE_SIMPLE_CATCH = 32,\n SCOPE_SUPER = 64,\n SCOPE_DIRECT_SUPER = 128,\n SCOPE_CLASS_STATIC_BLOCK = 256,\n SCOPE_VAR = SCOPE_TOP | SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK;\n\n function functionFlags(async, generator) {\n return SCOPE_FUNCTION | (async ? SCOPE_ASYNC : 0) | (generator ? SCOPE_GENERATOR : 0)\n }\n\n // Used in checkLVal* and declareName to determine the type of a binding\n var\n BIND_NONE = 0, // Not a binding\n BIND_VAR = 1, // Var-style binding\n BIND_LEXICAL = 2, // Let- or const-style binding\n BIND_FUNCTION = 3, // Function declaration\n BIND_SIMPLE_CATCH = 4, // Simple (identifier pattern) catch binding\n BIND_OUTSIDE = 5; // Special case for function names as bound inside the function\n\n var Parser = function Parser(options, input, startPos) {\n this.options = options = getOptions(options);\n this.sourceFile = options.sourceFile;\n this.keywords = wordsRegexp(keywords$1[options.ecmaVersion >= 6 ? 6 : options.sourceType === \"module\" ? \"5module\" : 5]);\n var reserved = \"\";\n if (options.allowReserved !== true) {\n reserved = reservedWords[options.ecmaVersion >= 6 ? 6 : options.ecmaVersion === 5 ? 5 : 3];\n if (options.sourceType === \"module\") { reserved += \" await\"; }\n }\n this.reservedWords = wordsRegexp(reserved);\n var reservedStrict = (reserved ? reserved + \" \" : \"\") + reservedWords.strict;\n this.reservedWordsStrict = wordsRegexp(reservedStrict);\n this.reservedWordsStrictBind = wordsRegexp(reservedStrict + \" \" + reservedWords.strictBind);\n this.input = String(input);\n\n // Used to signal to callers of `readWord1` whether the word\n // contained any escape sequences. This is needed because words with\n // escape sequences must not be interpreted as keywords.\n this.containsEsc = false;\n\n // Set up token state\n\n // The current position of the tokenizer in the input.\n if (startPos) {\n this.pos = startPos;\n this.lineStart = this.input.lastIndexOf(\"\\n\", startPos - 1) + 1;\n this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length;\n } else {\n this.pos = this.lineStart = 0;\n this.curLine = 1;\n }\n\n // Properties of the current token:\n // Its type\n this.type = types$1.eof;\n // For tokens that include more information than their type, the value\n this.value = null;\n // Its start and end offset\n this.start = this.end = this.pos;\n // And, if locations are used, the {line, column} object\n // corresponding to those offsets\n this.startLoc = this.endLoc = this.curPosition();\n\n // Position information for the previous token\n this.lastTokEndLoc = this.lastTokStartLoc = null;\n this.lastTokStart = this.lastTokEnd = this.pos;\n\n // The context stack is used to superficially track syntactic\n // context to predict whether a regular expression is allowed in a\n // given position.\n this.context = this.initialContext();\n this.exprAllowed = true;\n\n // Figure out if it's a module code.\n this.inModule = options.sourceType === \"module\";\n this.strict = this.inModule || this.strictDirective(this.pos);\n\n // Used to signify the start of a potential arrow function\n this.potentialArrowAt = -1;\n this.potentialArrowInForAwait = false;\n\n // Positions to delayed-check that yield/await does not exist in default parameters.\n this.yieldPos = this.awaitPos = this.awaitIdentPos = 0;\n // Labels in scope.\n this.labels = [];\n // Thus-far undefined exports.\n this.undefinedExports = Object.create(null);\n\n // If enabled, skip leading hashbang line.\n if (this.pos === 0 && options.allowHashBang && this.input.slice(0, 2) === \"#!\")\n { this.skipLineComment(2); }\n\n // Scope tracking for duplicate variable names (see scope.js)\n this.scopeStack = [];\n this.enterScope(SCOPE_TOP);\n\n // For RegExp validation\n this.regexpState = null;\n\n // The stack of private names.\n // Each element has two properties: 'declared' and 'used'.\n // When it exited from the outermost class definition, all used private names must be declared.\n this.privateNameStack = [];\n };\n\n var prototypeAccessors = { inFunction: { configurable: true },inGenerator: { configurable: true },inAsync: { configurable: true },canAwait: { configurable: true },allowSuper: { configurable: true },allowDirectSuper: { configurable: true },treatFunctionsAsVar: { configurable: true },allowNewDotTarget: { configurable: true },inClassStaticBlock: { configurable: true } };\n\n Parser.prototype.parse = function parse () {\n var node = this.options.program || this.startNode();\n this.nextToken();\n return this.parseTopLevel(node)\n };\n\n prototypeAccessors.inFunction.get = function () { return (this.currentVarScope().flags & SCOPE_FUNCTION) > 0 };\n\n prototypeAccessors.inGenerator.get = function () { return (this.currentVarScope().flags & SCOPE_GENERATOR) > 0 && !this.currentVarScope().inClassFieldInit };\n\n prototypeAccessors.inAsync.get = function () { return (this.currentVarScope().flags & SCOPE_ASYNC) > 0 && !this.currentVarScope().inClassFieldInit };\n\n prototypeAccessors.canAwait.get = function () {\n for (var i = this.scopeStack.length - 1; i >= 0; i--) {\n var scope = this.scopeStack[i];\n if (scope.inClassFieldInit || scope.flags & SCOPE_CLASS_STATIC_BLOCK) { return false }\n if (scope.flags & SCOPE_FUNCTION) { return (scope.flags & SCOPE_ASYNC) > 0 }\n }\n return (this.inModule && this.options.ecmaVersion >= 13) || this.options.allowAwaitOutsideFunction\n };\n\n prototypeAccessors.allowSuper.get = function () {\n var ref = this.currentThisScope();\n var flags = ref.flags;\n var inClassFieldInit = ref.inClassFieldInit;\n return (flags & SCOPE_SUPER) > 0 || inClassFieldInit || this.options.allowSuperOutsideMethod\n };\n\n prototypeAccessors.allowDirectSuper.get = function () { return (this.currentThisScope().flags & SCOPE_DIRECT_SUPER) > 0 };\n\n prototypeAccessors.treatFunctionsAsVar.get = function () { return this.treatFunctionsAsVarInScope(this.currentScope()) };\n\n prototypeAccessors.allowNewDotTarget.get = function () {\n var ref = this.currentThisScope();\n var flags = ref.flags;\n var inClassFieldInit = ref.inClassFieldInit;\n return (flags & (SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK)) > 0 || inClassFieldInit\n };\n\n prototypeAccessors.inClassStaticBlock.get = function () {\n return (this.currentVarScope().flags & SCOPE_CLASS_STATIC_BLOCK) > 0\n };\n\n Parser.extend = function extend () {\n var plugins = [], len = arguments.length;\n while ( len-- ) plugins[ len ] = arguments[ len ];\n\n var cls = this;\n for (var i = 0; i < plugins.length; i++) { cls = plugins[i](cls); }\n return cls\n };\n\n Parser.parse = function parse (input, options) {\n return new this(options, input).parse()\n };\n\n Parser.parseExpressionAt = function parseExpressionAt (input, pos, options) {\n var parser = new this(options, input, pos);\n parser.nextToken();\n return parser.parseExpression()\n };\n\n Parser.tokenizer = function tokenizer (input, options) {\n return new this(options, input)\n };\n\n Object.defineProperties( Parser.prototype, prototypeAccessors );\n\n var pp$9 = Parser.prototype;\n\n // ## Parser utilities\n\n var literal = /^(?:'((?:\\\\.|[^'\\\\])*?)'|\"((?:\\\\.|[^\"\\\\])*?)\")/;\n pp$9.strictDirective = function(start) {\n if (this.options.ecmaVersion < 5) { return false }\n for (;;) {\n // Try to find string literal.\n skipWhiteSpace.lastIndex = start;\n start += skipWhiteSpace.exec(this.input)[0].length;\n var match = literal.exec(this.input.slice(start));\n if (!match) { return false }\n if ((match[1] || match[2]) === \"use strict\") {\n skipWhiteSpace.lastIndex = start + match[0].length;\n var spaceAfter = skipWhiteSpace.exec(this.input), end = spaceAfter.index + spaceAfter[0].length;\n var next = this.input.charAt(end);\n return next === \";\" || next === \"}\" ||\n (lineBreak.test(spaceAfter[0]) &&\n !(/[(`.[+\\-/*%<>=,?^&]/.test(next) || next === \"!\" && this.input.charAt(end + 1) === \"=\"))\n }\n start += match[0].length;\n\n // Skip semicolon, if any.\n skipWhiteSpace.lastIndex = start;\n start += skipWhiteSpace.exec(this.input)[0].length;\n if (this.input[start] === \";\")\n { start++; }\n }\n };\n\n // Predicate that tests whether the next token is of the given\n // type, and if yes, consumes it as a side effect.\n\n pp$9.eat = function(type) {\n if (this.type === type) {\n this.next();\n return true\n } else {\n return false\n }\n };\n\n // Tests whether parsed token is a contextual keyword.\n\n pp$9.isContextual = function(name) {\n return this.type === types$1.name && this.value === name && !this.containsEsc\n };\n\n // Consumes contextual keyword if possible.\n\n pp$9.eatContextual = function(name) {\n if (!this.isContextual(name)) { return false }\n this.next();\n return true\n };\n\n // Asserts that following token is given contextual keyword.\n\n pp$9.expectContextual = function(name) {\n if (!this.eatContextual(name)) { this.unexpected(); }\n };\n\n // Test whether a semicolon can be inserted at the current position.\n\n pp$9.canInsertSemicolon = function() {\n return this.type === types$1.eof ||\n this.type === types$1.braceR ||\n lineBreak.test(this.input.slice(this.lastTokEnd, this.start))\n };\n\n pp$9.insertSemicolon = function() {\n if (this.canInsertSemicolon()) {\n if (this.options.onInsertedSemicolon)\n { this.options.onInsertedSemicolon(this.lastTokEnd, this.lastTokEndLoc); }\n return true\n }\n };\n\n // Consume a semicolon, or, failing that, see if we are allowed to\n // pretend that there is a semicolon at this position.\n\n pp$9.semicolon = function() {\n if (!this.eat(types$1.semi) && !this.insertSemicolon()) { this.unexpected(); }\n };\n\n pp$9.afterTrailingComma = function(tokType, notNext) {\n if (this.type === tokType) {\n if (this.options.onTrailingComma)\n { this.options.onTrailingComma(this.lastTokStart, this.lastTokStartLoc); }\n if (!notNext)\n { this.next(); }\n return true\n }\n };\n\n // Expect a token of a given type. If found, consume it, otherwise,\n // raise an unexpected token error.\n\n pp$9.expect = function(type) {\n this.eat(type) || this.unexpected();\n };\n\n // Raise an unexpected token error.\n\n pp$9.unexpected = function(pos) {\n this.raise(pos != null ? pos : this.start, \"Unexpected token\");\n };\n\n var DestructuringErrors = function DestructuringErrors() {\n this.shorthandAssign =\n this.trailingComma =\n this.parenthesizedAssign =\n this.parenthesizedBind =\n this.doubleProto =\n -1;\n };\n\n pp$9.checkPatternErrors = function(refDestructuringErrors, isAssign) {\n if (!refDestructuringErrors) { return }\n if (refDestructuringErrors.trailingComma > -1)\n { this.raiseRecoverable(refDestructuringErrors.trailingComma, \"Comma is not permitted after the rest element\"); }\n var parens = isAssign ? refDestructuringErrors.parenthesizedAssign : refDestructuringErrors.parenthesizedBind;\n if (parens > -1) { this.raiseRecoverable(parens, isAssign ? \"Assigning to rvalue\" : \"Parenthesized pattern\"); }\n };\n\n pp$9.checkExpressionErrors = function(refDestructuringErrors, andThrow) {\n if (!refDestructuringErrors) { return false }\n var shorthandAssign = refDestructuringErrors.shorthandAssign;\n var doubleProto = refDestructuringErrors.doubleProto;\n if (!andThrow) { return shorthandAssign >= 0 || doubleProto >= 0 }\n if (shorthandAssign >= 0)\n { this.raise(shorthandAssign, \"Shorthand property assignments are valid only in destructuring patterns\"); }\n if (doubleProto >= 0)\n { this.raiseRecoverable(doubleProto, \"Redefinition of __proto__ property\"); }\n };\n\n pp$9.checkYieldAwaitInDefaultParams = function() {\n if (this.yieldPos && (!this.awaitPos || this.yieldPos < this.awaitPos))\n { this.raise(this.yieldPos, \"Yield expression cannot be a default value\"); }\n if (this.awaitPos)\n { this.raise(this.awaitPos, \"Await expression cannot be a default value\"); }\n };\n\n pp$9.isSimpleAssignTarget = function(expr) {\n if (expr.type === \"ParenthesizedExpression\")\n { return this.isSimpleAssignTarget(expr.expression) }\n return expr.type === \"Identifier\" || expr.type === \"MemberExpression\"\n };\n\n var pp$8 = Parser.prototype;\n\n // ### Statement parsing\n\n // Parse a program. Initializes the parser, reads any number of\n // statements, and wraps them in a Program node. Optionally takes a\n // `program` argument. If present, the statements will be appended\n // to its body instead of creating a new node.\n\n pp$8.parseTopLevel = function(node) {\n var exports = Object.create(null);\n if (!node.body) { node.body = []; }\n while (this.type !== types$1.eof) {\n var stmt = this.parseStatement(null, true, exports);\n node.body.push(stmt);\n }\n if (this.inModule)\n { for (var i = 0, list = Object.keys(this.undefinedExports); i < list.length; i += 1)\n {\n var name = list[i];\n\n this.raiseRecoverable(this.undefinedExports[name].start, (\"Export '\" + name + \"' is not defined\"));\n } }\n this.adaptDirectivePrologue(node.body);\n this.next();\n node.sourceType = this.options.sourceType;\n return this.finishNode(node, \"Program\")\n };\n\n var loopLabel = {kind: \"loop\"}, switchLabel = {kind: \"switch\"};\n\n pp$8.isLet = function(context) {\n if (this.options.ecmaVersion < 6 || !this.isContextual(\"let\")) { return false }\n skipWhiteSpace.lastIndex = this.pos;\n var skip = skipWhiteSpace.exec(this.input);\n var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next);\n // For ambiguous cases, determine if a LexicalDeclaration (or only a\n // Statement) is allowed here. If context is not empty then only a Statement\n // is allowed. However, `let [` is an explicit negative lookahead for\n // ExpressionStatement, so special-case it first.\n if (nextCh === 91 || nextCh === 92 || nextCh > 0xd7ff && nextCh < 0xdc00) { return true } // '[', '/', astral\n if (context) { return false }\n\n if (nextCh === 123) { return true } // '{'\n if (isIdentifierStart(nextCh, true)) {\n var pos = next + 1;\n while (isIdentifierChar(nextCh = this.input.charCodeAt(pos), true)) { ++pos; }\n if (nextCh === 92 || nextCh > 0xd7ff && nextCh < 0xdc00) { return true }\n var ident = this.input.slice(next, pos);\n if (!keywordRelationalOperator.test(ident)) { return true }\n }\n return false\n };\n\n // check 'async [no LineTerminator here] function'\n // - 'async /*foo*/ function' is OK.\n // - 'async /*\\n*/ function' is invalid.\n pp$8.isAsyncFunction = function() {\n if (this.options.ecmaVersion < 8 || !this.isContextual(\"async\"))\n { return false }\n\n skipWhiteSpace.lastIndex = this.pos;\n var skip = skipWhiteSpace.exec(this.input);\n var next = this.pos + skip[0].length, after;\n return !lineBreak.test(this.input.slice(this.pos, next)) &&\n this.input.slice(next, next + 8) === \"function\" &&\n (next + 8 === this.input.length ||\n !(isIdentifierChar(after = this.input.charCodeAt(next + 8)) || after > 0xd7ff && after < 0xdc00))\n };\n\n // Parse a single statement.\n //\n // If expecting a statement and finding a slash operator, parse a\n // regular expression literal. This is to handle cases like\n // `if (foo) /blah/.exec(foo)`, where looking at the previous token\n // does not help.\n\n pp$8.parseStatement = function(context, topLevel, exports) {\n var starttype = this.type, node = this.startNode(), kind;\n\n if (this.isLet(context)) {\n starttype = types$1._var;\n kind = \"let\";\n }\n\n // Most types of statements are recognized by the keyword they\n // start with. Many are trivial to parse, some require a bit of\n // complexity.\n\n switch (starttype) {\n case types$1._break: case types$1._continue: return this.parseBreakContinueStatement(node, starttype.keyword)\n case types$1._debugger: return this.parseDebuggerStatement(node)\n case types$1._do: return this.parseDoStatement(node)\n case types$1._for: return this.parseForStatement(node)\n case types$1._function:\n // Function as sole body of either an if statement or a labeled statement\n // works, but not when it is part of a labeled statement that is the sole\n // body of an if statement.\n if ((context && (this.strict || context !== \"if\" && context !== \"label\")) && this.options.ecmaVersion >= 6) { this.unexpected(); }\n return this.parseFunctionStatement(node, false, !context)\n case types$1._class:\n if (context) { this.unexpected(); }\n return this.parseClass(node, true)\n case types$1._if: return this.parseIfStatement(node)\n case types$1._return: return this.parseReturnStatement(node)\n case types$1._switch: return this.parseSwitchStatement(node)\n case types$1._throw: return this.parseThrowStatement(node)\n case types$1._try: return this.parseTryStatement(node)\n case types$1._const: case types$1._var:\n kind = kind || this.value;\n if (context && kind !== \"var\") { this.unexpected(); }\n return this.parseVarStatement(node, kind)\n case types$1._while: return this.parseWhileStatement(node)\n case types$1._with: return this.parseWithStatement(node)\n case types$1.braceL: return this.parseBlock(true, node)\n case types$1.semi: return this.parseEmptyStatement(node)\n case types$1._export:\n case types$1._import:\n if (this.options.ecmaVersion > 10 && starttype === types$1._import) {\n skipWhiteSpace.lastIndex = this.pos;\n var skip = skipWhiteSpace.exec(this.input);\n var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next);\n if (nextCh === 40 || nextCh === 46) // '(' or '.'\n { return this.parseExpressionStatement(node, this.parseExpression()) }\n }\n\n if (!this.options.allowImportExportEverywhere) {\n if (!topLevel)\n { this.raise(this.start, \"'import' and 'export' may only appear at the top level\"); }\n if (!this.inModule)\n { this.raise(this.start, \"'import' and 'export' may appear only with 'sourceType: module'\"); }\n }\n return starttype === types$1._import ? this.parseImport(node) : this.parseExport(node, exports)\n\n // If the statement does not start with a statement keyword or a\n // brace, it's an ExpressionStatement or LabeledStatement. We\n // simply start parsing an expression, and afterwards, if the\n // next token is a colon and the expression was a simple\n // Identifier node, we switch to interpreting it as a label.\n default:\n if (this.isAsyncFunction()) {\n if (context) { this.unexpected(); }\n this.next();\n return this.parseFunctionStatement(node, true, !context)\n }\n\n var maybeName = this.value, expr = this.parseExpression();\n if (starttype === types$1.name && expr.type === \"Identifier\" && this.eat(types$1.colon))\n { return this.parseLabeledStatement(node, maybeName, expr, context) }\n else { return this.parseExpressionStatement(node, expr) }\n }\n };\n\n pp$8.parseBreakContinueStatement = function(node, keyword) {\n var isBreak = keyword === \"break\";\n this.next();\n if (this.eat(types$1.semi) || this.insertSemicolon()) { node.label = null; }\n else if (this.type !== types$1.name) { this.unexpected(); }\n else {\n node.label = this.parseIdent();\n this.semicolon();\n }\n\n // Verify that there is an actual destination to break or\n // continue to.\n var i = 0;\n for (; i < this.labels.length; ++i) {\n var lab = this.labels[i];\n if (node.label == null || lab.name === node.label.name) {\n if (lab.kind != null && (isBreak || lab.kind === \"loop\")) { break }\n if (node.label && isBreak) { break }\n }\n }\n if (i === this.labels.length) { this.raise(node.start, \"Unsyntactic \" + keyword); }\n return this.finishNode(node, isBreak ? \"BreakStatement\" : \"ContinueStatement\")\n };\n\n pp$8.parseDebuggerStatement = function(node) {\n this.next();\n this.semicolon();\n return this.finishNode(node, \"DebuggerStatement\")\n };\n\n pp$8.parseDoStatement = function(node) {\n this.next();\n this.labels.push(loopLabel);\n node.body = this.parseStatement(\"do\");\n this.labels.pop();\n this.expect(types$1._while);\n node.test = this.parseParenExpression();\n if (this.options.ecmaVersion >= 6)\n { this.eat(types$1.semi); }\n else\n { this.semicolon(); }\n return this.finishNode(node, \"DoWhileStatement\")\n };\n\n // Disambiguating between a `for` and a `for`/`in` or `for`/`of`\n // loop is non-trivial. Basically, we have to parse the init `var`\n // statement or expression, disallowing the `in` operator (see\n // the second parameter to `parseExpression`), and then check\n // whether the next token is `in` or `of`. When there is no init\n // part (semicolon immediately after the opening parenthesis), it\n // is a regular `for` loop.\n\n pp$8.parseForStatement = function(node) {\n this.next();\n var awaitAt = (this.options.ecmaVersion >= 9 && this.canAwait && this.eatContextual(\"await\")) ? this.lastTokStart : -1;\n this.labels.push(loopLabel);\n this.enterScope(0);\n this.expect(types$1.parenL);\n if (this.type === types$1.semi) {\n if (awaitAt > -1) { this.unexpected(awaitAt); }\n return this.parseFor(node, null)\n }\n var isLet = this.isLet();\n if (this.type === types$1._var || this.type === types$1._const || isLet) {\n var init$1 = this.startNode(), kind = isLet ? \"let\" : this.value;\n this.next();\n this.parseVar(init$1, true, kind);\n this.finishNode(init$1, \"VariableDeclaration\");\n if ((this.type === types$1._in || (this.options.ecmaVersion >= 6 && this.isContextual(\"of\"))) && init$1.declarations.length === 1) {\n if (this.options.ecmaVersion >= 9) {\n if (this.type === types$1._in) {\n if (awaitAt > -1) { this.unexpected(awaitAt); }\n } else { node.await = awaitAt > -1; }\n }\n return this.parseForIn(node, init$1)\n }\n if (awaitAt > -1) { this.unexpected(awaitAt); }\n return this.parseFor(node, init$1)\n }\n var startsWithLet = this.isContextual(\"let\"), isForOf = false;\n var refDestructuringErrors = new DestructuringErrors;\n var init = this.parseExpression(awaitAt > -1 ? \"await\" : true, refDestructuringErrors);\n if (this.type === types$1._in || (isForOf = this.options.ecmaVersion >= 6 && this.isContextual(\"of\"))) {\n if (this.options.ecmaVersion >= 9) {\n if (this.type === types$1._in) {\n if (awaitAt > -1) { this.unexpected(awaitAt); }\n } else { node.await = awaitAt > -1; }\n }\n if (startsWithLet && isForOf) { this.raise(init.start, \"The left-hand side of a for-of loop may not start with 'let'.\"); }\n this.toAssignable(init, false, refDestructuringErrors);\n this.checkLValPattern(init);\n return this.parseForIn(node, init)\n } else {\n this.checkExpressionErrors(refDestructuringErrors, true);\n }\n if (awaitAt > -1) { this.unexpected(awaitAt); }\n return this.parseFor(node, init)\n };\n\n pp$8.parseFunctionStatement = function(node, isAsync, declarationPosition) {\n this.next();\n return this.parseFunction(node, FUNC_STATEMENT | (declarationPosition ? 0 : FUNC_HANGING_STATEMENT), false, isAsync)\n };\n\n pp$8.parseIfStatement = function(node) {\n this.next();\n node.test = this.parseParenExpression();\n // allow function declarations in branches, but only in non-strict mode\n node.consequent = this.parseStatement(\"if\");\n node.alternate = this.eat(types$1._else) ? this.parseStatement(\"if\") : null;\n return this.finishNode(node, \"IfStatement\")\n };\n\n pp$8.parseReturnStatement = function(node) {\n if (!this.inFunction && !this.options.allowReturnOutsideFunction)\n { this.raise(this.start, \"'return' outside of function\"); }\n this.next();\n\n // In `return` (and `break`/`continue`), the keywords with\n // optional arguments, we eagerly look for a semicolon or the\n // possibility to insert one.\n\n if (this.eat(types$1.semi) || this.insertSemicolon()) { node.argument = null; }\n else { node.argument = this.parseExpression(); this.semicolon(); }\n return this.finishNode(node, \"ReturnStatement\")\n };\n\n pp$8.parseSwitchStatement = function(node) {\n this.next();\n node.discriminant = this.parseParenExpression();\n node.cases = [];\n this.expect(types$1.braceL);\n this.labels.push(switchLabel);\n this.enterScope(0);\n\n // Statements under must be grouped (by label) in SwitchCase\n // nodes. `cur` is used to keep the node that we are currently\n // adding statements to.\n\n var cur;\n for (var sawDefault = false; this.type !== types$1.braceR;) {\n if (this.type === types$1._case || this.type === types$1._default) {\n var isCase = this.type === types$1._case;\n if (cur) { this.finishNode(cur, \"SwitchCase\"); }\n node.cases.push(cur = this.startNode());\n cur.consequent = [];\n this.next();\n if (isCase) {\n cur.test = this.parseExpression();\n } else {\n if (sawDefault) { this.raiseRecoverable(this.lastTokStart, \"Multiple default clauses\"); }\n sawDefault = true;\n cur.test = null;\n }\n this.expect(types$1.colon);\n } else {\n if (!cur) { this.unexpected(); }\n cur.consequent.push(this.parseStatement(null));\n }\n }\n this.exitScope();\n if (cur) { this.finishNode(cur, \"SwitchCase\"); }\n this.next(); // Closing brace\n this.labels.pop();\n return this.finishNode(node, \"SwitchStatement\")\n };\n\n pp$8.parseThrowStatement = function(node) {\n this.next();\n if (lineBreak.test(this.input.slice(this.lastTokEnd, this.start)))\n { this.raise(this.lastTokEnd, \"Illegal newline after throw\"); }\n node.argument = this.parseExpression();\n this.semicolon();\n return this.finishNode(node, \"ThrowStatement\")\n };\n\n // Reused empty array added for node fields that are always empty.\n\n var empty$1 = [];\n\n pp$8.parseTryStatement = function(node) {\n this.next();\n node.block = this.parseBlock();\n node.handler = null;\n if (this.type === types$1._catch) {\n var clause = this.startNode();\n this.next();\n if (this.eat(types$1.parenL)) {\n clause.param = this.parseBindingAtom();\n var simple = clause.param.type === \"Identifier\";\n this.enterScope(simple ? SCOPE_SIMPLE_CATCH : 0);\n this.checkLValPattern(clause.param, simple ? BIND_SIMPLE_CATCH : BIND_LEXICAL);\n this.expect(types$1.parenR);\n } else {\n if (this.options.ecmaVersion < 10) { this.unexpected(); }\n clause.param = null;\n this.enterScope(0);\n }\n clause.body = this.parseBlock(false);\n this.exitScope();\n node.handler = this.finishNode(clause, \"CatchClause\");\n }\n node.finalizer = this.eat(types$1._finally) ? this.parseBlock() : null;\n if (!node.handler && !node.finalizer)\n { this.raise(node.start, \"Missing catch or finally clause\"); }\n return this.finishNode(node, \"TryStatement\")\n };\n\n pp$8.parseVarStatement = function(node, kind) {\n this.next();\n this.parseVar(node, false, kind);\n this.semicolon();\n return this.finishNode(node, \"VariableDeclaration\")\n };\n\n pp$8.parseWhileStatement = function(node) {\n this.next();\n node.test = this.parseParenExpression();\n this.labels.push(loopLabel);\n node.body = this.parseStatement(\"while\");\n this.labels.pop();\n return this.finishNode(node, \"WhileStatement\")\n };\n\n pp$8.parseWithStatement = function(node) {\n if (this.strict) { this.raise(this.start, \"'with' in strict mode\"); }\n this.next();\n node.object = this.parseParenExpression();\n node.body = this.parseStatement(\"with\");\n return this.finishNode(node, \"WithStatement\")\n };\n\n pp$8.parseEmptyStatement = function(node) {\n this.next();\n return this.finishNode(node, \"EmptyStatement\")\n };\n\n pp$8.parseLabeledStatement = function(node, maybeName, expr, context) {\n for (var i$1 = 0, list = this.labels; i$1 < list.length; i$1 += 1)\n {\n var label = list[i$1];\n\n if (label.name === maybeName)\n { this.raise(expr.start, \"Label '\" + maybeName + \"' is already declared\");\n } }\n var kind = this.type.isLoop ? \"loop\" : this.type === types$1._switch ? \"switch\" : null;\n for (var i = this.labels.length - 1; i >= 0; i--) {\n var label$1 = this.labels[i];\n if (label$1.statementStart === node.start) {\n // Update information about previous labels on this node\n label$1.statementStart = this.start;\n label$1.kind = kind;\n } else { break }\n }\n this.labels.push({name: maybeName, kind: kind, statementStart: this.start});\n node.body = this.parseStatement(context ? context.indexOf(\"label\") === -1 ? context + \"label\" : context : \"label\");\n this.labels.pop();\n node.label = expr;\n return this.finishNode(node, \"LabeledStatement\")\n };\n\n pp$8.parseExpressionStatement = function(node, expr) {\n node.expression = expr;\n this.semicolon();\n return this.finishNode(node, \"ExpressionStatement\")\n };\n\n // Parse a semicolon-enclosed block of statements, handling `\"use\n // strict\"` declarations when `allowStrict` is true (used for\n // function bodies).\n\n pp$8.parseBlock = function(createNewLexicalScope, node, exitStrict) {\n if ( createNewLexicalScope === void 0 ) createNewLexicalScope = true;\n if ( node === void 0 ) node = this.startNode();\n\n node.body = [];\n this.expect(types$1.braceL);\n if (createNewLexicalScope) { this.enterScope(0); }\n while (this.type !== types$1.braceR) {\n var stmt = this.parseStatement(null);\n node.body.push(stmt);\n }\n if (exitStrict) { this.strict = false; }\n this.next();\n if (createNewLexicalScope) { this.exitScope(); }\n return this.finishNode(node, \"BlockStatement\")\n };\n\n // Parse a regular `for` loop. The disambiguation code in\n // `parseStatement` will already have parsed the init statement or\n // expression.\n\n pp$8.parseFor = function(node, init) {\n node.init = init;\n this.expect(types$1.semi);\n node.test = this.type === types$1.semi ? null : this.parseExpression();\n this.expect(types$1.semi);\n node.update = this.type === types$1.parenR ? null : this.parseExpression();\n this.expect(types$1.parenR);\n node.body = this.parseStatement(\"for\");\n this.exitScope();\n this.labels.pop();\n return this.finishNode(node, \"ForStatement\")\n };\n\n // Parse a `for`/`in` and `for`/`of` loop, which are almost\n // same from parser's perspective.\n\n pp$8.parseForIn = function(node, init) {\n var isForIn = this.type === types$1._in;\n this.next();\n\n if (\n init.type === \"VariableDeclaration\" &&\n init.declarations[0].init != null &&\n (\n !isForIn ||\n this.options.ecmaVersion < 8 ||\n this.strict ||\n init.kind !== \"var\" ||\n init.declarations[0].id.type !== \"Identifier\"\n )\n ) {\n this.raise(\n init.start,\n ((isForIn ? \"for-in\" : \"for-of\") + \" loop variable declaration may not have an initializer\")\n );\n }\n node.left = init;\n node.right = isForIn ? this.parseExpression() : this.parseMaybeAssign();\n this.expect(types$1.parenR);\n node.body = this.parseStatement(\"for\");\n this.exitScope();\n this.labels.pop();\n return this.finishNode(node, isForIn ? \"ForInStatement\" : \"ForOfStatement\")\n };\n\n // Parse a list of variable declarations.\n\n pp$8.parseVar = function(node, isFor, kind) {\n node.declarations = [];\n node.kind = kind;\n for (;;) {\n var decl = this.startNode();\n this.parseVarId(decl, kind);\n if (this.eat(types$1.eq)) {\n decl.init = this.parseMaybeAssign(isFor);\n } else if (kind === \"const\" && !(this.type === types$1._in || (this.options.ecmaVersion >= 6 && this.isContextual(\"of\")))) {\n this.unexpected();\n } else if (decl.id.type !== \"Identifier\" && !(isFor && (this.type === types$1._in || this.isContextual(\"of\")))) {\n this.raise(this.lastTokEnd, \"Complex binding patterns require an initialization value\");\n } else {\n decl.init = null;\n }\n node.declarations.push(this.finishNode(decl, \"VariableDeclarator\"));\n if (!this.eat(types$1.comma)) { break }\n }\n return node\n };\n\n pp$8.parseVarId = function(decl, kind) {\n decl.id = this.parseBindingAtom();\n this.checkLValPattern(decl.id, kind === \"var\" ? BIND_VAR : BIND_LEXICAL, false);\n };\n\n var FUNC_STATEMENT = 1, FUNC_HANGING_STATEMENT = 2, FUNC_NULLABLE_ID = 4;\n\n // Parse a function declaration or literal (depending on the\n // `statement & FUNC_STATEMENT`).\n\n // Remove `allowExpressionBody` for 7.0.0, as it is only called with false\n pp$8.parseFunction = function(node, statement, allowExpressionBody, isAsync, forInit) {\n this.initFunction(node);\n if (this.options.ecmaVersion >= 9 || this.options.ecmaVersion >= 6 && !isAsync) {\n if (this.type === types$1.star && (statement & FUNC_HANGING_STATEMENT))\n { this.unexpected(); }\n node.generator = this.eat(types$1.star);\n }\n if (this.options.ecmaVersion >= 8)\n { node.async = !!isAsync; }\n\n if (statement & FUNC_STATEMENT) {\n node.id = (statement & FUNC_NULLABLE_ID) && this.type !== types$1.name ? null : this.parseIdent();\n if (node.id && !(statement & FUNC_HANGING_STATEMENT))\n // If it is a regular function declaration in sloppy mode, then it is\n // subject to Annex B semantics (BIND_FUNCTION). Otherwise, the binding\n // mode depends on properties of the current scope (see\n // treatFunctionsAsVar).\n { this.checkLValSimple(node.id, (this.strict || node.generator || node.async) ? this.treatFunctionsAsVar ? BIND_VAR : BIND_LEXICAL : BIND_FUNCTION); }\n }\n\n var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;\n this.yieldPos = 0;\n this.awaitPos = 0;\n this.awaitIdentPos = 0;\n this.enterScope(functionFlags(node.async, node.generator));\n\n if (!(statement & FUNC_STATEMENT))\n { node.id = this.type === types$1.name ? this.parseIdent() : null; }\n\n this.parseFunctionParams(node);\n this.parseFunctionBody(node, allowExpressionBody, false, forInit);\n\n this.yieldPos = oldYieldPos;\n this.awaitPos = oldAwaitPos;\n this.awaitIdentPos = oldAwaitIdentPos;\n return this.finishNode(node, (statement & FUNC_STATEMENT) ? \"FunctionDeclaration\" : \"FunctionExpression\")\n };\n\n pp$8.parseFunctionParams = function(node) {\n this.expect(types$1.parenL);\n node.params = this.parseBindingList(types$1.parenR, false, this.options.ecmaVersion >= 8);\n this.checkYieldAwaitInDefaultParams();\n };\n\n // Parse a class declaration or literal (depending on the\n // `isStatement` parameter).\n\n pp$8.parseClass = function(node, isStatement) {\n this.next();\n\n // ecma-262 14.6 Class Definitions\n // A class definition is always strict mode code.\n var oldStrict = this.strict;\n this.strict = true;\n\n this.parseClassId(node, isStatement);\n this.parseClassSuper(node);\n var privateNameMap = this.enterClassBody();\n var classBody = this.startNode();\n var hadConstructor = false;\n classBody.body = [];\n this.expect(types$1.braceL);\n while (this.type !== types$1.braceR) {\n var element = this.parseClassElement(node.superClass !== null);\n if (element) {\n classBody.body.push(element);\n if (element.type === \"MethodDefinition\" && element.kind === \"constructor\") {\n if (hadConstructor) { this.raise(element.start, \"Duplicate constructor in the same class\"); }\n hadConstructor = true;\n } else if (element.key && element.key.type === \"PrivateIdentifier\" && isPrivateNameConflicted(privateNameMap, element)) {\n this.raiseRecoverable(element.key.start, (\"Identifier '#\" + (element.key.name) + \"' has already been declared\"));\n }\n }\n }\n this.strict = oldStrict;\n this.next();\n node.body = this.finishNode(classBody, \"ClassBody\");\n this.exitClassBody();\n return this.finishNode(node, isStatement ? \"ClassDeclaration\" : \"ClassExpression\")\n };\n\n pp$8.parseClassElement = function(constructorAllowsSuper) {\n if (this.eat(types$1.semi)) { return null }\n\n var ecmaVersion = this.options.ecmaVersion;\n var node = this.startNode();\n var keyName = \"\";\n var isGenerator = false;\n var isAsync = false;\n var kind = \"method\";\n var isStatic = false;\n\n if (this.eatContextual(\"static\")) {\n // Parse static init block\n if (ecmaVersion >= 13 && this.eat(types$1.braceL)) {\n this.parseClassStaticBlock(node);\n return node\n }\n if (this.isClassElementNameStart() || this.type === types$1.star) {\n isStatic = true;\n } else {\n keyName = \"static\";\n }\n }\n node.static = isStatic;\n if (!keyName && ecmaVersion >= 8 && this.eatContextual(\"async\")) {\n if ((this.isClassElementNameStart() || this.type === types$1.star) && !this.canInsertSemicolon()) {\n isAsync = true;\n } else {\n keyName = \"async\";\n }\n }\n if (!keyName && (ecmaVersion >= 9 || !isAsync) && this.eat(types$1.star)) {\n isGenerator = true;\n }\n if (!keyName && !isAsync && !isGenerator) {\n var lastValue = this.value;\n if (this.eatContextual(\"get\") || this.eatContextual(\"set\")) {\n if (this.isClassElementNameStart()) {\n kind = lastValue;\n } else {\n keyName = lastValue;\n }\n }\n }\n\n // Parse element name\n if (keyName) {\n // 'async', 'get', 'set', or 'static' were not a keyword contextually.\n // The last token is any of those. Make it the element name.\n node.computed = false;\n node.key = this.startNodeAt(this.lastTokStart, this.lastTokStartLoc);\n node.key.name = keyName;\n this.finishNode(node.key, \"Identifier\");\n } else {\n this.parseClassElementName(node);\n }\n\n // Parse element value\n if (ecmaVersion < 13 || this.type === types$1.parenL || kind !== \"method\" || isGenerator || isAsync) {\n var isConstructor = !node.static && checkKeyName(node, \"constructor\");\n var allowsDirectSuper = isConstructor && constructorAllowsSuper;\n // Couldn't move this check into the 'parseClassMethod' method for backward compatibility.\n if (isConstructor && kind !== \"method\") { this.raise(node.key.start, \"Constructor can't have get/set modifier\"); }\n node.kind = isConstructor ? \"constructor\" : kind;\n this.parseClassMethod(node, isGenerator, isAsync, allowsDirectSuper);\n } else {\n this.parseClassField(node);\n }\n\n return node\n };\n\n pp$8.isClassElementNameStart = function() {\n return (\n this.type === types$1.name ||\n this.type === types$1.privateId ||\n this.type === types$1.num ||\n this.type === types$1.string ||\n this.type === types$1.bracketL ||\n this.type.keyword\n )\n };\n\n pp$8.parseClassElementName = function(element) {\n if (this.type === types$1.privateId) {\n if (this.value === \"constructor\") {\n this.raise(this.start, \"Classes can't have an element named '#constructor'\");\n }\n element.computed = false;\n element.key = this.parsePrivateIdent();\n } else {\n this.parsePropertyName(element);\n }\n };\n\n pp$8.parseClassMethod = function(method, isGenerator, isAsync, allowsDirectSuper) {\n // Check key and flags\n var key = method.key;\n if (method.kind === \"constructor\") {\n if (isGenerator) { this.raise(key.start, \"Constructor can't be a generator\"); }\n if (isAsync) { this.raise(key.start, \"Constructor can't be an async method\"); }\n } else if (method.static && checkKeyName(method, \"prototype\")) {\n this.raise(key.start, \"Classes may not have a static property named prototype\");\n }\n\n // Parse value\n var value = method.value = this.parseMethod(isGenerator, isAsync, allowsDirectSuper);\n\n // Check value\n if (method.kind === \"get\" && value.params.length !== 0)\n { this.raiseRecoverable(value.start, \"getter should have no params\"); }\n if (method.kind === \"set\" && value.params.length !== 1)\n { this.raiseRecoverable(value.start, \"setter should have exactly one param\"); }\n if (method.kind === \"set\" && value.params[0].type === \"RestElement\")\n { this.raiseRecoverable(value.params[0].start, \"Setter cannot use rest params\"); }\n\n return this.finishNode(method, \"MethodDefinition\")\n };\n\n pp$8.parseClassField = function(field) {\n if (checkKeyName(field, \"constructor\")) {\n this.raise(field.key.start, \"Classes can't have a field named 'constructor'\");\n } else if (field.static && checkKeyName(field, \"prototype\")) {\n this.raise(field.key.start, \"Classes can't have a static field named 'prototype'\");\n }\n\n if (this.eat(types$1.eq)) {\n // To raise SyntaxError if 'arguments' exists in the initializer.\n var scope = this.currentThisScope();\n var inClassFieldInit = scope.inClassFieldInit;\n scope.inClassFieldInit = true;\n field.value = this.parseMaybeAssign();\n scope.inClassFieldInit = inClassFieldInit;\n } else {\n field.value = null;\n }\n this.semicolon();\n\n return this.finishNode(field, \"PropertyDefinition\")\n };\n\n pp$8.parseClassStaticBlock = function(node) {\n node.body = [];\n\n var oldLabels = this.labels;\n this.labels = [];\n this.enterScope(SCOPE_CLASS_STATIC_BLOCK | SCOPE_SUPER);\n while (this.type !== types$1.braceR) {\n var stmt = this.parseStatement(null);\n node.body.push(stmt);\n }\n this.next();\n this.exitScope();\n this.labels = oldLabels;\n\n return this.finishNode(node, \"StaticBlock\")\n };\n\n pp$8.parseClassId = function(node, isStatement) {\n if (this.type === types$1.name) {\n node.id = this.parseIdent();\n if (isStatement)\n { this.checkLValSimple(node.id, BIND_LEXICAL, false); }\n } else {\n if (isStatement === true)\n { this.unexpected(); }\n node.id = null;\n }\n };\n\n pp$8.parseClassSuper = function(node) {\n node.superClass = this.eat(types$1._extends) ? this.parseExprSubscripts(false) : null;\n };\n\n pp$8.enterClassBody = function() {\n var element = {declared: Object.create(null), used: []};\n this.privateNameStack.push(element);\n return element.declared\n };\n\n pp$8.exitClassBody = function() {\n var ref = this.privateNameStack.pop();\n var declared = ref.declared;\n var used = ref.used;\n var len = this.privateNameStack.length;\n var parent = len === 0 ? null : this.privateNameStack[len - 1];\n for (var i = 0; i < used.length; ++i) {\n var id = used[i];\n if (!hasOwn(declared, id.name)) {\n if (parent) {\n parent.used.push(id);\n } else {\n this.raiseRecoverable(id.start, (\"Private field '#\" + (id.name) + \"' must be declared in an enclosing class\"));\n }\n }\n }\n };\n\n function isPrivateNameConflicted(privateNameMap, element) {\n var name = element.key.name;\n var curr = privateNameMap[name];\n\n var next = \"true\";\n if (element.type === \"MethodDefinition\" && (element.kind === \"get\" || element.kind === \"set\")) {\n next = (element.static ? \"s\" : \"i\") + element.kind;\n }\n\n // `class { get #a(){}; static set #a(_){} }` is also conflict.\n if (\n curr === \"iget\" && next === \"iset\" ||\n curr === \"iset\" && next === \"iget\" ||\n curr === \"sget\" && next === \"sset\" ||\n curr === \"sset\" && next === \"sget\"\n ) {\n privateNameMap[name] = \"true\";\n return false\n } else if (!curr) {\n privateNameMap[name] = next;\n return false\n } else {\n return true\n }\n }\n\n function checkKeyName(node, name) {\n var computed = node.computed;\n var key = node.key;\n return !computed && (\n key.type === \"Identifier\" && key.name === name ||\n key.type === \"Literal\" && key.value === name\n )\n }\n\n // Parses module export declaration.\n\n pp$8.parseExport = function(node, exports) {\n this.next();\n // export * from '...'\n if (this.eat(types$1.star)) {\n if (this.options.ecmaVersion >= 11) {\n if (this.eatContextual(\"as\")) {\n node.exported = this.parseModuleExportName();\n this.checkExport(exports, node.exported, this.lastTokStart);\n } else {\n node.exported = null;\n }\n }\n this.expectContextual(\"from\");\n if (this.type !== types$1.string) { this.unexpected(); }\n node.source = this.parseExprAtom();\n this.semicolon();\n return this.finishNode(node, \"ExportAllDeclaration\")\n }\n if (this.eat(types$1._default)) { // export default ...\n this.checkExport(exports, \"default\", this.lastTokStart);\n var isAsync;\n if (this.type === types$1._function || (isAsync = this.isAsyncFunction())) {\n var fNode = this.startNode();\n this.next();\n if (isAsync) { this.next(); }\n node.declaration = this.parseFunction(fNode, FUNC_STATEMENT | FUNC_NULLABLE_ID, false, isAsync);\n } else if (this.type === types$1._class) {\n var cNode = this.startNode();\n node.declaration = this.parseClass(cNode, \"nullableID\");\n } else {\n node.declaration = this.parseMaybeAssign();\n this.semicolon();\n }\n return this.finishNode(node, \"ExportDefaultDeclaration\")\n }\n // export var|const|let|function|class ...\n if (this.shouldParseExportStatement()) {\n node.declaration = this.parseStatement(null);\n if (node.declaration.type === \"VariableDeclaration\")\n { this.checkVariableExport(exports, node.declaration.declarations); }\n else\n { this.checkExport(exports, node.declaration.id, node.declaration.id.start); }\n node.specifiers = [];\n node.source = null;\n } else { // export { x, y as z } [from '...']\n node.declaration = null;\n node.specifiers = this.parseExportSpecifiers(exports);\n if (this.eatContextual(\"from\")) {\n if (this.type !== types$1.string) { this.unexpected(); }\n node.source = this.parseExprAtom();\n } else {\n for (var i = 0, list = node.specifiers; i < list.length; i += 1) {\n // check for keywords used as local names\n var spec = list[i];\n\n this.checkUnreserved(spec.local);\n // check if export is defined\n this.checkLocalExport(spec.local);\n\n if (spec.local.type === \"Literal\") {\n this.raise(spec.local.start, \"A string literal cannot be used as an exported binding without `from`.\");\n }\n }\n\n node.source = null;\n }\n this.semicolon();\n }\n return this.finishNode(node, \"ExportNamedDeclaration\")\n };\n\n pp$8.checkExport = function(exports, name, pos) {\n if (!exports) { return }\n if (typeof name !== \"string\")\n { name = name.type === \"Identifier\" ? name.name : name.value; }\n if (hasOwn(exports, name))\n { this.raiseRecoverable(pos, \"Duplicate export '\" + name + \"'\"); }\n exports[name] = true;\n };\n\n pp$8.checkPatternExport = function(exports, pat) {\n var type = pat.type;\n if (type === \"Identifier\")\n { this.checkExport(exports, pat, pat.start); }\n else if (type === \"ObjectPattern\")\n { for (var i = 0, list = pat.properties; i < list.length; i += 1)\n {\n var prop = list[i];\n\n this.checkPatternExport(exports, prop);\n } }\n else if (type === \"ArrayPattern\")\n { for (var i$1 = 0, list$1 = pat.elements; i$1 < list$1.length; i$1 += 1) {\n var elt = list$1[i$1];\n\n if (elt) { this.checkPatternExport(exports, elt); }\n } }\n else if (type === \"Property\")\n { this.checkPatternExport(exports, pat.value); }\n else if (type === \"AssignmentPattern\")\n { this.checkPatternExport(exports, pat.left); }\n else if (type === \"RestElement\")\n { this.checkPatternExport(exports, pat.argument); }\n else if (type === \"ParenthesizedExpression\")\n { this.checkPatternExport(exports, pat.expression); }\n };\n\n pp$8.checkVariableExport = function(exports, decls) {\n if (!exports) { return }\n for (var i = 0, list = decls; i < list.length; i += 1)\n {\n var decl = list[i];\n\n this.checkPatternExport(exports, decl.id);\n }\n };\n\n pp$8.shouldParseExportStatement = function() {\n return this.type.keyword === \"var\" ||\n this.type.keyword === \"const\" ||\n this.type.keyword === \"class\" ||\n this.type.keyword === \"function\" ||\n this.isLet() ||\n this.isAsyncFunction()\n };\n\n // Parses a comma-separated list of module exports.\n\n pp$8.parseExportSpecifiers = function(exports) {\n var nodes = [], first = true;\n // export { x, y as z } [from '...']\n this.expect(types$1.braceL);\n while (!this.eat(types$1.braceR)) {\n if (!first) {\n this.expect(types$1.comma);\n if (this.afterTrailingComma(types$1.braceR)) { break }\n } else { first = false; }\n\n var node = this.startNode();\n node.local = this.parseModuleExportName();\n node.exported = this.eatContextual(\"as\") ? this.parseModuleExportName() : node.local;\n this.checkExport(\n exports,\n node.exported,\n node.exported.start\n );\n nodes.push(this.finishNode(node, \"ExportSpecifier\"));\n }\n return nodes\n };\n\n // Parses import declaration.\n\n pp$8.parseImport = function(node) {\n this.next();\n // import '...'\n if (this.type === types$1.string) {\n node.specifiers = empty$1;\n node.source = this.parseExprAtom();\n } else {\n node.specifiers = this.parseImportSpecifiers();\n this.expectContextual(\"from\");\n node.source = this.type === types$1.string ? this.parseExprAtom() : this.unexpected();\n }\n this.semicolon();\n return this.finishNode(node, \"ImportDeclaration\")\n };\n\n // Parses a comma-separated list of module imports.\n\n pp$8.parseImportSpecifiers = function() {\n var nodes = [], first = true;\n if (this.type === types$1.name) {\n // import defaultObj, { x, y as z } from '...'\n var node = this.startNode();\n node.local = this.parseIdent();\n this.checkLValSimple(node.local, BIND_LEXICAL);\n nodes.push(this.finishNode(node, \"ImportDefaultSpecifier\"));\n if (!this.eat(types$1.comma)) { return nodes }\n }\n if (this.type === types$1.star) {\n var node$1 = this.startNode();\n this.next();\n this.expectContextual(\"as\");\n node$1.local = this.parseIdent();\n this.checkLValSimple(node$1.local, BIND_LEXICAL);\n nodes.push(this.finishNode(node$1, \"ImportNamespaceSpecifier\"));\n return nodes\n }\n this.expect(types$1.braceL);\n while (!this.eat(types$1.braceR)) {\n if (!first) {\n this.expect(types$1.comma);\n if (this.afterTrailingComma(types$1.braceR)) { break }\n } else { first = false; }\n\n var node$2 = this.startNode();\n node$2.imported = this.parseModuleExportName();\n if (this.eatContextual(\"as\")) {\n node$2.local = this.parseIdent();\n } else {\n this.checkUnreserved(node$2.imported);\n node$2.local = node$2.imported;\n }\n this.checkLValSimple(node$2.local, BIND_LEXICAL);\n nodes.push(this.finishNode(node$2, \"ImportSpecifier\"));\n }\n return nodes\n };\n\n pp$8.parseModuleExportName = function() {\n if (this.options.ecmaVersion >= 13 && this.type === types$1.string) {\n var stringLiteral = this.parseLiteral(this.value);\n if (loneSurrogate.test(stringLiteral.value)) {\n this.raise(stringLiteral.start, \"An export name cannot include a lone surrogate.\");\n }\n return stringLiteral\n }\n return this.parseIdent(true)\n };\n\n // Set `ExpressionStatement#directive` property for directive prologues.\n pp$8.adaptDirectivePrologue = function(statements) {\n for (var i = 0; i < statements.length && this.isDirectiveCandidate(statements[i]); ++i) {\n statements[i].directive = statements[i].expression.raw.slice(1, -1);\n }\n };\n pp$8.isDirectiveCandidate = function(statement) {\n return (\n this.options.ecmaVersion >= 5 &&\n statement.type === \"ExpressionStatement\" &&\n statement.expression.type === \"Literal\" &&\n typeof statement.expression.value === \"string\" &&\n // Reject parenthesized strings.\n (this.input[statement.start] === \"\\\"\" || this.input[statement.start] === \"'\")\n )\n };\n\n var pp$7 = Parser.prototype;\n\n // Convert existing expression atom to assignable pattern\n // if possible.\n\n pp$7.toAssignable = function(node, isBinding, refDestructuringErrors) {\n if (this.options.ecmaVersion >= 6 && node) {\n switch (node.type) {\n case \"Identifier\":\n if (this.inAsync && node.name === \"await\")\n { this.raise(node.start, \"Cannot use 'await' as identifier inside an async function\"); }\n break\n\n case \"ObjectPattern\":\n case \"ArrayPattern\":\n case \"AssignmentPattern\":\n case \"RestElement\":\n break\n\n case \"ObjectExpression\":\n node.type = \"ObjectPattern\";\n if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); }\n for (var i = 0, list = node.properties; i < list.length; i += 1) {\n var prop = list[i];\n\n this.toAssignable(prop, isBinding);\n // Early error:\n // AssignmentRestProperty[Yield, Await] :\n // `...` DestructuringAssignmentTarget[Yield, Await]\n //\n // It is a Syntax Error if |DestructuringAssignmentTarget| is an |ArrayLiteral| or an |ObjectLiteral|.\n if (\n prop.type === \"RestElement\" &&\n (prop.argument.type === \"ArrayPattern\" || prop.argument.type === \"ObjectPattern\")\n ) {\n this.raise(prop.argument.start, \"Unexpected token\");\n }\n }\n break\n\n case \"Property\":\n // AssignmentProperty has type === \"Property\"\n if (node.kind !== \"init\") { this.raise(node.key.start, \"Object pattern can't contain getter or setter\"); }\n this.toAssignable(node.value, isBinding);\n break\n\n case \"ArrayExpression\":\n node.type = \"ArrayPattern\";\n if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); }\n this.toAssignableList(node.elements, isBinding);\n break\n\n case \"SpreadElement\":\n node.type = \"RestElement\";\n this.toAssignable(node.argument, isBinding);\n if (node.argument.type === \"AssignmentPattern\")\n { this.raise(node.argument.start, \"Rest elements cannot have a default value\"); }\n break\n\n case \"AssignmentExpression\":\n if (node.operator !== \"=\") { this.raise(node.left.end, \"Only '=' operator can be used for specifying default value.\"); }\n node.type = \"AssignmentPattern\";\n delete node.operator;\n this.toAssignable(node.left, isBinding);\n break\n\n case \"ParenthesizedExpression\":\n this.toAssignable(node.expression, isBinding, refDestructuringErrors);\n break\n\n case \"ChainExpression\":\n this.raiseRecoverable(node.start, \"Optional chaining cannot appear in left-hand side\");\n break\n\n case \"MemberExpression\":\n if (!isBinding) { break }\n\n default:\n this.raise(node.start, \"Assigning to rvalue\");\n }\n } else if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); }\n return node\n };\n\n // Convert list of expression atoms to binding list.\n\n pp$7.toAssignableList = function(exprList, isBinding) {\n var end = exprList.length;\n for (var i = 0; i < end; i++) {\n var elt = exprList[i];\n if (elt) { this.toAssignable(elt, isBinding); }\n }\n if (end) {\n var last = exprList[end - 1];\n if (this.options.ecmaVersion === 6 && isBinding && last && last.type === \"RestElement\" && last.argument.type !== \"Identifier\")\n { this.unexpected(last.argument.start); }\n }\n return exprList\n };\n\n // Parses spread element.\n\n pp$7.parseSpread = function(refDestructuringErrors) {\n var node = this.startNode();\n this.next();\n node.argument = this.parseMaybeAssign(false, refDestructuringErrors);\n return this.finishNode(node, \"SpreadElement\")\n };\n\n pp$7.parseRestBinding = function() {\n var node = this.startNode();\n this.next();\n\n // RestElement inside of a function parameter must be an identifier\n if (this.options.ecmaVersion === 6 && this.type !== types$1.name)\n { this.unexpected(); }\n\n node.argument = this.parseBindingAtom();\n\n return this.finishNode(node, \"RestElement\")\n };\n\n // Parses lvalue (assignable) atom.\n\n pp$7.parseBindingAtom = function() {\n if (this.options.ecmaVersion >= 6) {\n switch (this.type) {\n case types$1.bracketL:\n var node = this.startNode();\n this.next();\n node.elements = this.parseBindingList(types$1.bracketR, true, true);\n return this.finishNode(node, \"ArrayPattern\")\n\n case types$1.braceL:\n return this.parseObj(true)\n }\n }\n return this.parseIdent()\n };\n\n pp$7.parseBindingList = function(close, allowEmpty, allowTrailingComma) {\n var elts = [], first = true;\n while (!this.eat(close)) {\n if (first) { first = false; }\n else { this.expect(types$1.comma); }\n if (allowEmpty && this.type === types$1.comma) {\n elts.push(null);\n } else if (allowTrailingComma && this.afterTrailingComma(close)) {\n break\n } else if (this.type === types$1.ellipsis) {\n var rest = this.parseRestBinding();\n this.parseBindingListItem(rest);\n elts.push(rest);\n if (this.type === types$1.comma) { this.raise(this.start, \"Comma is not permitted after the rest element\"); }\n this.expect(close);\n break\n } else {\n var elem = this.parseMaybeDefault(this.start, this.startLoc);\n this.parseBindingListItem(elem);\n elts.push(elem);\n }\n }\n return elts\n };\n\n pp$7.parseBindingListItem = function(param) {\n return param\n };\n\n // Parses assignment pattern around given atom if possible.\n\n pp$7.parseMaybeDefault = function(startPos, startLoc, left) {\n left = left || this.parseBindingAtom();\n if (this.options.ecmaVersion < 6 || !this.eat(types$1.eq)) { return left }\n var node = this.startNodeAt(startPos, startLoc);\n node.left = left;\n node.right = this.parseMaybeAssign();\n return this.finishNode(node, \"AssignmentPattern\")\n };\n\n // The following three functions all verify that a node is an lvalue \u2014\n // something that can be bound, or assigned to. In order to do so, they perform\n // a variety of checks:\n //\n // - Check that none of the bound/assigned-to identifiers are reserved words.\n // - Record name declarations for bindings in the appropriate scope.\n // - Check duplicate argument names, if checkClashes is set.\n //\n // If a complex binding pattern is encountered (e.g., object and array\n // destructuring), the entire pattern is recursively checked.\n //\n // There are three versions of checkLVal*() appropriate for different\n // circumstances:\n //\n // - checkLValSimple() shall be used if the syntactic construct supports\n // nothing other than identifiers and member expressions. Parenthesized\n // expressions are also correctly handled. This is generally appropriate for\n // constructs for which the spec says\n //\n // > It is a Syntax Error if AssignmentTargetType of [the production] is not\n // > simple.\n //\n // It is also appropriate for checking if an identifier is valid and not\n // defined elsewhere, like import declarations or function/class identifiers.\n //\n // Examples where this is used include:\n // a += \u2026;\n // import a from '\u2026';\n // where a is the node to be checked.\n //\n // - checkLValPattern() shall be used if the syntactic construct supports\n // anything checkLValSimple() supports, as well as object and array\n // destructuring patterns. This is generally appropriate for constructs for\n // which the spec says\n //\n // > It is a Syntax Error if [the production] is neither an ObjectLiteral nor\n // > an ArrayLiteral and AssignmentTargetType of [the production] is not\n // > simple.\n //\n // Examples where this is used include:\n // (a = \u2026);\n // const a = \u2026;\n // try { \u2026 } catch (a) { \u2026 }\n // where a is the node to be checked.\n //\n // - checkLValInnerPattern() shall be used if the syntactic construct supports\n // anything checkLValPattern() supports, as well as default assignment\n // patterns, rest elements, and other constructs that may appear within an\n // object or array destructuring pattern.\n //\n // As a special case, function parameters also use checkLValInnerPattern(),\n // as they also support defaults and rest constructs.\n //\n // These functions deliberately support both assignment and binding constructs,\n // as the logic for both is exceedingly similar. If the node is the target of\n // an assignment, then bindingType should be set to BIND_NONE. Otherwise, it\n // should be set to the appropriate BIND_* constant, like BIND_VAR or\n // BIND_LEXICAL.\n //\n // If the function is called with a non-BIND_NONE bindingType, then\n // additionally a checkClashes object may be specified to allow checking for\n // duplicate argument names. checkClashes is ignored if the provided construct\n // is an assignment (i.e., bindingType is BIND_NONE).\n\n pp$7.checkLValSimple = function(expr, bindingType, checkClashes) {\n if ( bindingType === void 0 ) bindingType = BIND_NONE;\n\n var isBind = bindingType !== BIND_NONE;\n\n switch (expr.type) {\n case \"Identifier\":\n if (this.strict && this.reservedWordsStrictBind.test(expr.name))\n { this.raiseRecoverable(expr.start, (isBind ? \"Binding \" : \"Assigning to \") + expr.name + \" in strict mode\"); }\n if (isBind) {\n if (bindingType === BIND_LEXICAL && expr.name === \"let\")\n { this.raiseRecoverable(expr.start, \"let is disallowed as a lexically bound name\"); }\n if (checkClashes) {\n if (hasOwn(checkClashes, expr.name))\n { this.raiseRecoverable(expr.start, \"Argument name clash\"); }\n checkClashes[expr.name] = true;\n }\n if (bindingType !== BIND_OUTSIDE) { this.declareName(expr.name, bindingType, expr.start); }\n }\n break\n\n case \"ChainExpression\":\n this.raiseRecoverable(expr.start, \"Optional chaining cannot appear in left-hand side\");\n break\n\n case \"MemberExpression\":\n if (isBind) { this.raiseRecoverable(expr.start, \"Binding member expression\"); }\n break\n\n case \"ParenthesizedExpression\":\n if (isBind) { this.raiseRecoverable(expr.start, \"Binding parenthesized expression\"); }\n return this.checkLValSimple(expr.expression, bindingType, checkClashes)\n\n default:\n this.raise(expr.start, (isBind ? \"Binding\" : \"Assigning to\") + \" rvalue\");\n }\n };\n\n pp$7.checkLValPattern = function(expr, bindingType, checkClashes) {\n if ( bindingType === void 0 ) bindingType = BIND_NONE;\n\n switch (expr.type) {\n case \"ObjectPattern\":\n for (var i = 0, list = expr.properties; i < list.length; i += 1) {\n var prop = list[i];\n\n this.checkLValInnerPattern(prop, bindingType, checkClashes);\n }\n break\n\n case \"ArrayPattern\":\n for (var i$1 = 0, list$1 = expr.elements; i$1 < list$1.length; i$1 += 1) {\n var elem = list$1[i$1];\n\n if (elem) { this.checkLValInnerPattern(elem, bindingType, checkClashes); }\n }\n break\n\n default:\n this.checkLValSimple(expr, bindingType, checkClashes);\n }\n };\n\n pp$7.checkLValInnerPattern = function(expr, bindingType, checkClashes) {\n if ( bindingType === void 0 ) bindingType = BIND_NONE;\n\n switch (expr.type) {\n case \"Property\":\n // AssignmentProperty has type === \"Property\"\n this.checkLValInnerPattern(expr.value, bindingType, checkClashes);\n break\n\n case \"AssignmentPattern\":\n this.checkLValPattern(expr.left, bindingType, checkClashes);\n break\n\n case \"RestElement\":\n this.checkLValPattern(expr.argument, bindingType, checkClashes);\n break\n\n default:\n this.checkLValPattern(expr, bindingType, checkClashes);\n }\n };\n\n // The algorithm used to determine whether a regexp can appear at a\n\n var TokContext = function TokContext(token, isExpr, preserveSpace, override, generator) {\n this.token = token;\n this.isExpr = !!isExpr;\n this.preserveSpace = !!preserveSpace;\n this.override = override;\n this.generator = !!generator;\n };\n\n var types = {\n b_stat: new TokContext(\"{\", false),\n b_expr: new TokContext(\"{\", true),\n b_tmpl: new TokContext(\"${\", false),\n p_stat: new TokContext(\"(\", false),\n p_expr: new TokContext(\"(\", true),\n q_tmpl: new TokContext(\"`\", true, true, function (p) { return p.tryReadTemplateToken(); }),\n f_stat: new TokContext(\"function\", false),\n f_expr: new TokContext(\"function\", true),\n f_expr_gen: new TokContext(\"function\", true, false, null, true),\n f_gen: new TokContext(\"function\", false, false, null, true)\n };\n\n var pp$6 = Parser.prototype;\n\n pp$6.initialContext = function() {\n return [types.b_stat]\n };\n\n pp$6.curContext = function() {\n return this.context[this.context.length - 1]\n };\n\n pp$6.braceIsBlock = function(prevType) {\n var parent = this.curContext();\n if (parent === types.f_expr || parent === types.f_stat)\n { return true }\n if (prevType === types$1.colon && (parent === types.b_stat || parent === types.b_expr))\n { return !parent.isExpr }\n\n // The check for `tt.name && exprAllowed` detects whether we are\n // after a `yield` or `of` construct. See the `updateContext` for\n // `tt.name`.\n if (prevType === types$1._return || prevType === types$1.name && this.exprAllowed)\n { return lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) }\n if (prevType === types$1._else || prevType === types$1.semi || prevType === types$1.eof || prevType === types$1.parenR || prevType === types$1.arrow)\n { return true }\n if (prevType === types$1.braceL)\n { return parent === types.b_stat }\n if (prevType === types$1._var || prevType === types$1._const || prevType === types$1.name)\n { return false }\n return !this.exprAllowed\n };\n\n pp$6.inGeneratorContext = function() {\n for (var i = this.context.length - 1; i >= 1; i--) {\n var context = this.context[i];\n if (context.token === \"function\")\n { return context.generator }\n }\n return false\n };\n\n pp$6.updateContext = function(prevType) {\n var update, type = this.type;\n if (type.keyword && prevType === types$1.dot)\n { this.exprAllowed = false; }\n else if (update = type.updateContext)\n { update.call(this, prevType); }\n else\n { this.exprAllowed = type.beforeExpr; }\n };\n\n // Used to handle egde cases when token context could not be inferred correctly during tokenization phase\n\n pp$6.overrideContext = function(tokenCtx) {\n if (this.curContext() !== tokenCtx) {\n this.context[this.context.length - 1] = tokenCtx;\n }\n };\n\n // Token-specific context update code\n\n types$1.parenR.updateContext = types$1.braceR.updateContext = function() {\n if (this.context.length === 1) {\n this.exprAllowed = true;\n return\n }\n var out = this.context.pop();\n if (out === types.b_stat && this.curContext().token === \"function\") {\n out = this.context.pop();\n }\n this.exprAllowed = !out.isExpr;\n };\n\n types$1.braceL.updateContext = function(prevType) {\n this.context.push(this.braceIsBlock(prevType) ? types.b_stat : types.b_expr);\n this.exprAllowed = true;\n };\n\n types$1.dollarBraceL.updateContext = function() {\n this.context.push(types.b_tmpl);\n this.exprAllowed = true;\n };\n\n types$1.parenL.updateContext = function(prevType) {\n var statementParens = prevType === types$1._if || prevType === types$1._for || prevType === types$1._with || prevType === types$1._while;\n this.context.push(statementParens ? types.p_stat : types.p_expr);\n this.exprAllowed = true;\n };\n\n types$1.incDec.updateContext = function() {\n // tokExprAllowed stays unchanged\n };\n\n types$1._function.updateContext = types$1._class.updateContext = function(prevType) {\n if (prevType.beforeExpr && prevType !== types$1._else &&\n !(prevType === types$1.semi && this.curContext() !== types.p_stat) &&\n !(prevType === types$1._return && lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) &&\n !((prevType === types$1.colon || prevType === types$1.braceL) && this.curContext() === types.b_stat))\n { this.context.push(types.f_expr); }\n else\n { this.context.push(types.f_stat); }\n this.exprAllowed = false;\n };\n\n types$1.backQuote.updateContext = function() {\n if (this.curContext() === types.q_tmpl)\n { this.context.pop(); }\n else\n { this.context.push(types.q_tmpl); }\n this.exprAllowed = false;\n };\n\n types$1.star.updateContext = function(prevType) {\n if (prevType === types$1._function) {\n var index = this.context.length - 1;\n if (this.context[index] === types.f_expr)\n { this.context[index] = types.f_expr_gen; }\n else\n { this.context[index] = types.f_gen; }\n }\n this.exprAllowed = true;\n };\n\n types$1.name.updateContext = function(prevType) {\n var allowed = false;\n if (this.options.ecmaVersion >= 6 && prevType !== types$1.dot) {\n if (this.value === \"of\" && !this.exprAllowed ||\n this.value === \"yield\" && this.inGeneratorContext())\n { allowed = true; }\n }\n this.exprAllowed = allowed;\n };\n\n // A recursive descent parser operates by defining functions for all\n\n var pp$5 = Parser.prototype;\n\n // Check if property name clashes with already added.\n // Object/class getters and setters are not allowed to clash \u2014\n // either with each other or with an init property \u2014 and in\n // strict mode, init properties are also not allowed to be repeated.\n\n pp$5.checkPropClash = function(prop, propHash, refDestructuringErrors) {\n if (this.options.ecmaVersion >= 9 && prop.type === \"SpreadElement\")\n { return }\n if (this.options.ecmaVersion >= 6 && (prop.computed || prop.method || prop.shorthand))\n { return }\n var key = prop.key;\n var name;\n switch (key.type) {\n case \"Identifier\": name = key.name; break\n case \"Literal\": name = String(key.value); break\n default: return\n }\n var kind = prop.kind;\n if (this.options.ecmaVersion >= 6) {\n if (name === \"__proto__\" && kind === \"init\") {\n if (propHash.proto) {\n if (refDestructuringErrors) {\n if (refDestructuringErrors.doubleProto < 0) {\n refDestructuringErrors.doubleProto = key.start;\n }\n } else {\n this.raiseRecoverable(key.start, \"Redefinition of __proto__ property\");\n }\n }\n propHash.proto = true;\n }\n return\n }\n name = \"$\" + name;\n var other = propHash[name];\n if (other) {\n var redefinition;\n if (kind === \"init\") {\n redefinition = this.strict && other.init || other.get || other.set;\n } else {\n redefinition = other.init || other[kind];\n }\n if (redefinition)\n { this.raiseRecoverable(key.start, \"Redefinition of property\"); }\n } else {\n other = propHash[name] = {\n init: false,\n get: false,\n set: false\n };\n }\n other[kind] = true;\n };\n\n // ### Expression parsing\n\n // These nest, from the most general expression type at the top to\n // 'atomic', nondivisible expression types at the bottom. Most of\n // the functions will simply let the function(s) below them parse,\n // and, *if* the syntactic construct they handle is present, wrap\n // the AST node that the inner parser gave them in another node.\n\n // Parse a full expression. The optional arguments are used to\n // forbid the `in` operator (in for loops initalization expressions)\n // and provide reference for storing '=' operator inside shorthand\n // property assignment in contexts where both object expression\n // and object pattern might appear (so it's possible to raise\n // delayed syntax error at correct position).\n\n pp$5.parseExpression = function(forInit, refDestructuringErrors) {\n var startPos = this.start, startLoc = this.startLoc;\n var expr = this.parseMaybeAssign(forInit, refDestructuringErrors);\n if (this.type === types$1.comma) {\n var node = this.startNodeAt(startPos, startLoc);\n node.expressions = [expr];\n while (this.eat(types$1.comma)) { node.expressions.push(this.parseMaybeAssign(forInit, refDestructuringErrors)); }\n return this.finishNode(node, \"SequenceExpression\")\n }\n return expr\n };\n\n // Parse an assignment expression. This includes applications of\n // operators like `+=`.\n\n pp$5.parseMaybeAssign = function(forInit, refDestructuringErrors, afterLeftParse) {\n if (this.isContextual(\"yield\")) {\n if (this.inGenerator) { return this.parseYield(forInit) }\n // The tokenizer will assume an expression is allowed after\n // `yield`, but this isn't that kind of yield\n else { this.exprAllowed = false; }\n }\n\n var ownDestructuringErrors = false, oldParenAssign = -1, oldTrailingComma = -1, oldDoubleProto = -1;\n if (refDestructuringErrors) {\n oldParenAssign = refDestructuringErrors.parenthesizedAssign;\n oldTrailingComma = refDestructuringErrors.trailingComma;\n oldDoubleProto = refDestructuringErrors.doubleProto;\n refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = -1;\n } else {\n refDestructuringErrors = new DestructuringErrors;\n ownDestructuringErrors = true;\n }\n\n var startPos = this.start, startLoc = this.startLoc;\n if (this.type === types$1.parenL || this.type === types$1.name) {\n this.potentialArrowAt = this.start;\n this.potentialArrowInForAwait = forInit === \"await\";\n }\n var left = this.parseMaybeConditional(forInit, refDestructuringErrors);\n if (afterLeftParse) { left = afterLeftParse.call(this, left, startPos, startLoc); }\n if (this.type.isAssign) {\n var node = this.startNodeAt(startPos, startLoc);\n node.operator = this.value;\n if (this.type === types$1.eq)\n { left = this.toAssignable(left, false, refDestructuringErrors); }\n if (!ownDestructuringErrors) {\n refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = refDestructuringErrors.doubleProto = -1;\n }\n if (refDestructuringErrors.shorthandAssign >= left.start)\n { refDestructuringErrors.shorthandAssign = -1; } // reset because shorthand default was used correctly\n if (this.type === types$1.eq)\n { this.checkLValPattern(left); }\n else\n { this.checkLValSimple(left); }\n node.left = left;\n this.next();\n node.right = this.parseMaybeAssign(forInit);\n if (oldDoubleProto > -1) { refDestructuringErrors.doubleProto = oldDoubleProto; }\n return this.finishNode(node, \"AssignmentExpression\")\n } else {\n if (ownDestructuringErrors) { this.checkExpressionErrors(refDestructuringErrors, true); }\n }\n if (oldParenAssign > -1) { refDestructuringErrors.parenthesizedAssign = oldParenAssign; }\n if (oldTrailingComma > -1) { refDestructuringErrors.trailingComma = oldTrailingComma; }\n return left\n };\n\n // Parse a ternary conditional (`?:`) operator.\n\n pp$5.parseMaybeConditional = function(forInit, refDestructuringErrors) {\n var startPos = this.start, startLoc = this.startLoc;\n var expr = this.parseExprOps(forInit, refDestructuringErrors);\n if (this.checkExpressionErrors(refDestructuringErrors)) { return expr }\n if (this.eat(types$1.question)) {\n var node = this.startNodeAt(startPos, startLoc);\n node.test = expr;\n node.consequent = this.parseMaybeAssign();\n this.expect(types$1.colon);\n node.alternate = this.parseMaybeAssign(forInit);\n return this.finishNode(node, \"ConditionalExpression\")\n }\n return expr\n };\n\n // Start the precedence parser.\n\n pp$5.parseExprOps = function(forInit, refDestructuringErrors) {\n var startPos = this.start, startLoc = this.startLoc;\n var expr = this.parseMaybeUnary(refDestructuringErrors, false, false, forInit);\n if (this.checkExpressionErrors(refDestructuringErrors)) { return expr }\n return expr.start === startPos && expr.type === \"ArrowFunctionExpression\" ? expr : this.parseExprOp(expr, startPos, startLoc, -1, forInit)\n };\n\n // Parse binary operators with the operator precedence parsing\n // algorithm. `left` is the left-hand side of the operator.\n // `minPrec` provides context that allows the function to stop and\n // defer further parser to one of its callers when it encounters an\n // operator that has a lower precedence than the set it is parsing.\n\n pp$5.parseExprOp = function(left, leftStartPos, leftStartLoc, minPrec, forInit) {\n var prec = this.type.binop;\n if (prec != null && (!forInit || this.type !== types$1._in)) {\n if (prec > minPrec) {\n var logical = this.type === types$1.logicalOR || this.type === types$1.logicalAND;\n var coalesce = this.type === types$1.coalesce;\n if (coalesce) {\n // Handle the precedence of `tt.coalesce` as equal to the range of logical expressions.\n // In other words, `node.right` shouldn't contain logical expressions in order to check the mixed error.\n prec = types$1.logicalAND.binop;\n }\n var op = this.value;\n this.next();\n var startPos = this.start, startLoc = this.startLoc;\n var right = this.parseExprOp(this.parseMaybeUnary(null, false, false, forInit), startPos, startLoc, prec, forInit);\n var node = this.buildBinary(leftStartPos, leftStartLoc, left, right, op, logical || coalesce);\n if ((logical && this.type === types$1.coalesce) || (coalesce && (this.type === types$1.logicalOR || this.type === types$1.logicalAND))) {\n this.raiseRecoverable(this.start, \"Logical expressions and coalesce expressions cannot be mixed. Wrap either by parentheses\");\n }\n return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, forInit)\n }\n }\n return left\n };\n\n pp$5.buildBinary = function(startPos, startLoc, left, right, op, logical) {\n if (right.type === \"PrivateIdentifier\") { this.raise(right.start, \"Private identifier can only be left side of binary expression\"); }\n var node = this.startNodeAt(startPos, startLoc);\n node.left = left;\n node.operator = op;\n node.right = right;\n return this.finishNode(node, logical ? \"LogicalExpression\" : \"BinaryExpression\")\n };\n\n // Parse unary operators, both prefix and postfix.\n\n pp$5.parseMaybeUnary = function(refDestructuringErrors, sawUnary, incDec, forInit) {\n var startPos = this.start, startLoc = this.startLoc, expr;\n if (this.isContextual(\"await\") && this.canAwait) {\n expr = this.parseAwait(forInit);\n sawUnary = true;\n } else if (this.type.prefix) {\n var node = this.startNode(), update = this.type === types$1.incDec;\n node.operator = this.value;\n node.prefix = true;\n this.next();\n node.argument = this.parseMaybeUnary(null, true, update, forInit);\n this.checkExpressionErrors(refDestructuringErrors, true);\n if (update) { this.checkLValSimple(node.argument); }\n else if (this.strict && node.operator === \"delete\" &&\n node.argument.type === \"Identifier\")\n { this.raiseRecoverable(node.start, \"Deleting local variable in strict mode\"); }\n else if (node.operator === \"delete\" && isPrivateFieldAccess(node.argument))\n { this.raiseRecoverable(node.start, \"Private fields can not be deleted\"); }\n else { sawUnary = true; }\n expr = this.finishNode(node, update ? \"UpdateExpression\" : \"UnaryExpression\");\n } else if (!sawUnary && this.type === types$1.privateId) {\n if (forInit || this.privateNameStack.length === 0) { this.unexpected(); }\n expr = this.parsePrivateIdent();\n // only could be private fields in 'in', such as #x in obj\n if (this.type !== types$1._in) { this.unexpected(); }\n } else {\n expr = this.parseExprSubscripts(refDestructuringErrors, forInit);\n if (this.checkExpressionErrors(refDestructuringErrors)) { return expr }\n while (this.type.postfix && !this.canInsertSemicolon()) {\n var node$1 = this.startNodeAt(startPos, startLoc);\n node$1.operator = this.value;\n node$1.prefix = false;\n node$1.argument = expr;\n this.checkLValSimple(expr);\n this.next();\n expr = this.finishNode(node$1, \"UpdateExpression\");\n }\n }\n\n if (!incDec && this.eat(types$1.starstar)) {\n if (sawUnary)\n { this.unexpected(this.lastTokStart); }\n else\n { return this.buildBinary(startPos, startLoc, expr, this.parseMaybeUnary(null, false, false, forInit), \"**\", false) }\n } else {\n return expr\n }\n };\n\n function isPrivateFieldAccess(node) {\n return (\n node.type === \"MemberExpression\" && node.property.type === \"PrivateIdentifier\" ||\n node.type === \"ChainExpression\" && isPrivateFieldAccess(node.expression)\n )\n }\n\n // Parse call, dot, and `[]`-subscript expressions.\n\n pp$5.parseExprSubscripts = function(refDestructuringErrors, forInit) {\n var startPos = this.start, startLoc = this.startLoc;\n var expr = this.parseExprAtom(refDestructuringErrors, forInit);\n if (expr.type === \"ArrowFunctionExpression\" && this.input.slice(this.lastTokStart, this.lastTokEnd) !== \")\")\n { return expr }\n var result = this.parseSubscripts(expr, startPos, startLoc, false, forInit);\n if (refDestructuringErrors && result.type === \"MemberExpression\") {\n if (refDestructuringErrors.parenthesizedAssign >= result.start) { refDestructuringErrors.parenthesizedAssign = -1; }\n if (refDestructuringErrors.parenthesizedBind >= result.start) { refDestructuringErrors.parenthesizedBind = -1; }\n if (refDestructuringErrors.trailingComma >= result.start) { refDestructuringErrors.trailingComma = -1; }\n }\n return result\n };\n\n pp$5.parseSubscripts = function(base, startPos, startLoc, noCalls, forInit) {\n var maybeAsyncArrow = this.options.ecmaVersion >= 8 && base.type === \"Identifier\" && base.name === \"async\" &&\n this.lastTokEnd === base.end && !this.canInsertSemicolon() && base.end - base.start === 5 &&\n this.potentialArrowAt === base.start;\n var optionalChained = false;\n\n while (true) {\n var element = this.parseSubscript(base, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained, forInit);\n\n if (element.optional) { optionalChained = true; }\n if (element === base || element.type === \"ArrowFunctionExpression\") {\n if (optionalChained) {\n var chainNode = this.startNodeAt(startPos, startLoc);\n chainNode.expression = element;\n element = this.finishNode(chainNode, \"ChainExpression\");\n }\n return element\n }\n\n base = element;\n }\n };\n\n pp$5.parseSubscript = function(base, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained, forInit) {\n var optionalSupported = this.options.ecmaVersion >= 11;\n var optional = optionalSupported && this.eat(types$1.questionDot);\n if (noCalls && optional) { this.raise(this.lastTokStart, \"Optional chaining cannot appear in the callee of new expressions\"); }\n\n var computed = this.eat(types$1.bracketL);\n if (computed || (optional && this.type !== types$1.parenL && this.type !== types$1.backQuote) || this.eat(types$1.dot)) {\n var node = this.startNodeAt(startPos, startLoc);\n node.object = base;\n if (computed) {\n node.property = this.parseExpression();\n this.expect(types$1.bracketR);\n } else if (this.type === types$1.privateId && base.type !== \"Super\") {\n node.property = this.parsePrivateIdent();\n } else {\n node.property = this.parseIdent(this.options.allowReserved !== \"never\");\n }\n node.computed = !!computed;\n if (optionalSupported) {\n node.optional = optional;\n }\n base = this.finishNode(node, \"MemberExpression\");\n } else if (!noCalls && this.eat(types$1.parenL)) {\n var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;\n this.yieldPos = 0;\n this.awaitPos = 0;\n this.awaitIdentPos = 0;\n var exprList = this.parseExprList(types$1.parenR, this.options.ecmaVersion >= 8, false, refDestructuringErrors);\n if (maybeAsyncArrow && !optional && !this.canInsertSemicolon() && this.eat(types$1.arrow)) {\n this.checkPatternErrors(refDestructuringErrors, false);\n this.checkYieldAwaitInDefaultParams();\n if (this.awaitIdentPos > 0)\n { this.raise(this.awaitIdentPos, \"Cannot use 'await' as identifier inside an async function\"); }\n this.yieldPos = oldYieldPos;\n this.awaitPos = oldAwaitPos;\n this.awaitIdentPos = oldAwaitIdentPos;\n return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, true, forInit)\n }\n this.checkExpressionErrors(refDestructuringErrors, true);\n this.yieldPos = oldYieldPos || this.yieldPos;\n this.awaitPos = oldAwaitPos || this.awaitPos;\n this.awaitIdentPos = oldAwaitIdentPos || this.awaitIdentPos;\n var node$1 = this.startNodeAt(startPos, startLoc);\n node$1.callee = base;\n node$1.arguments = exprList;\n if (optionalSupported) {\n node$1.optional = optional;\n }\n base = this.finishNode(node$1, \"CallExpression\");\n } else if (this.type === types$1.backQuote) {\n if (optional || optionalChained) {\n this.raise(this.start, \"Optional chaining cannot appear in the tag of tagged template expressions\");\n }\n var node$2 = this.startNodeAt(startPos, startLoc);\n node$2.tag = base;\n node$2.quasi = this.parseTemplate({isTagged: true});\n base = this.finishNode(node$2, \"TaggedTemplateExpression\");\n }\n return base\n };\n\n // Parse an atomic expression \u2014 either a single token that is an\n // expression, an expression started by a keyword like `function` or\n // `new`, or an expression wrapped in punctuation like `()`, `[]`,\n // or `{}`.\n\n pp$5.parseExprAtom = function(refDestructuringErrors, forInit) {\n // If a division operator appears in an expression position, the\n // tokenizer got confused, and we force it to read a regexp instead.\n if (this.type === types$1.slash) { this.readRegexp(); }\n\n var node, canBeArrow = this.potentialArrowAt === this.start;\n switch (this.type) {\n case types$1._super:\n if (!this.allowSuper)\n { this.raise(this.start, \"'super' keyword outside a method\"); }\n node = this.startNode();\n this.next();\n if (this.type === types$1.parenL && !this.allowDirectSuper)\n { this.raise(node.start, \"super() call outside constructor of a subclass\"); }\n // The `super` keyword can appear at below:\n // SuperProperty:\n // super [ Expression ]\n // super . IdentifierName\n // SuperCall:\n // super ( Arguments )\n if (this.type !== types$1.dot && this.type !== types$1.bracketL && this.type !== types$1.parenL)\n { this.unexpected(); }\n return this.finishNode(node, \"Super\")\n\n case types$1._this:\n node = this.startNode();\n this.next();\n return this.finishNode(node, \"ThisExpression\")\n\n case types$1.name:\n var startPos = this.start, startLoc = this.startLoc, containsEsc = this.containsEsc;\n var id = this.parseIdent(false);\n if (this.options.ecmaVersion >= 8 && !containsEsc && id.name === \"async\" && !this.canInsertSemicolon() && this.eat(types$1._function)) {\n this.overrideContext(types.f_expr);\n return this.parseFunction(this.startNodeAt(startPos, startLoc), 0, false, true, forInit)\n }\n if (canBeArrow && !this.canInsertSemicolon()) {\n if (this.eat(types$1.arrow))\n { return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], false, forInit) }\n if (this.options.ecmaVersion >= 8 && id.name === \"async\" && this.type === types$1.name && !containsEsc &&\n (!this.potentialArrowInForAwait || this.value !== \"of\" || this.containsEsc)) {\n id = this.parseIdent(false);\n if (this.canInsertSemicolon() || !this.eat(types$1.arrow))\n { this.unexpected(); }\n return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], true, forInit)\n }\n }\n return id\n\n case types$1.regexp:\n var value = this.value;\n node = this.parseLiteral(value.value);\n node.regex = {pattern: value.pattern, flags: value.flags};\n return node\n\n case types$1.num: case types$1.string:\n return this.parseLiteral(this.value)\n\n case types$1._null: case types$1._true: case types$1._false:\n node = this.startNode();\n node.value = this.type === types$1._null ? null : this.type === types$1._true;\n node.raw = this.type.keyword;\n this.next();\n return this.finishNode(node, \"Literal\")\n\n case types$1.parenL:\n var start = this.start, expr = this.parseParenAndDistinguishExpression(canBeArrow, forInit);\n if (refDestructuringErrors) {\n if (refDestructuringErrors.parenthesizedAssign < 0 && !this.isSimpleAssignTarget(expr))\n { refDestructuringErrors.parenthesizedAssign = start; }\n if (refDestructuringErrors.parenthesizedBind < 0)\n { refDestructuringErrors.parenthesizedBind = start; }\n }\n return expr\n\n case types$1.bracketL:\n node = this.startNode();\n this.next();\n node.elements = this.parseExprList(types$1.bracketR, true, true, refDestructuringErrors);\n return this.finishNode(node, \"ArrayExpression\")\n\n case types$1.braceL:\n this.overrideContext(types.b_expr);\n return this.parseObj(false, refDestructuringErrors)\n\n case types$1._function:\n node = this.startNode();\n this.next();\n return this.parseFunction(node, 0)\n\n case types$1._class:\n return this.parseClass(this.startNode(), false)\n\n case types$1._new:\n return this.parseNew()\n\n case types$1.backQuote:\n return this.parseTemplate()\n\n case types$1._import:\n if (this.options.ecmaVersion >= 11) {\n return this.parseExprImport()\n } else {\n return this.unexpected()\n }\n\n default:\n this.unexpected();\n }\n };\n\n pp$5.parseExprImport = function() {\n var node = this.startNode();\n\n // Consume `import` as an identifier for `import.meta`.\n // Because `this.parseIdent(true)` doesn't check escape sequences, it needs the check of `this.containsEsc`.\n if (this.containsEsc) { this.raiseRecoverable(this.start, \"Escape sequence in keyword import\"); }\n var meta = this.parseIdent(true);\n\n switch (this.type) {\n case types$1.parenL:\n return this.parseDynamicImport(node)\n case types$1.dot:\n node.meta = meta;\n return this.parseImportMeta(node)\n default:\n this.unexpected();\n }\n };\n\n pp$5.parseDynamicImport = function(node) {\n this.next(); // skip `(`\n\n // Parse node.source.\n node.source = this.parseMaybeAssign();\n\n // Verify ending.\n if (!this.eat(types$1.parenR)) {\n var errorPos = this.start;\n if (this.eat(types$1.comma) && this.eat(types$1.parenR)) {\n this.raiseRecoverable(errorPos, \"Trailing comma is not allowed in import()\");\n } else {\n this.unexpected(errorPos);\n }\n }\n\n return this.finishNode(node, \"ImportExpression\")\n };\n\n pp$5.parseImportMeta = function(node) {\n this.next(); // skip `.`\n\n var containsEsc = this.containsEsc;\n node.property = this.parseIdent(true);\n\n if (node.property.name !== \"meta\")\n { this.raiseRecoverable(node.property.start, \"The only valid meta property for import is 'import.meta'\"); }\n if (containsEsc)\n { this.raiseRecoverable(node.start, \"'import.meta' must not contain escaped characters\"); }\n if (this.options.sourceType !== \"module\" && !this.options.allowImportExportEverywhere)\n { this.raiseRecoverable(node.start, \"Cannot use 'import.meta' outside a module\"); }\n\n return this.finishNode(node, \"MetaProperty\")\n };\n\n pp$5.parseLiteral = function(value) {\n var node = this.startNode();\n node.value = value;\n node.raw = this.input.slice(this.start, this.end);\n if (node.raw.charCodeAt(node.raw.length - 1) === 110) { node.bigint = node.raw.slice(0, -1).replace(/_/g, \"\"); }\n this.next();\n return this.finishNode(node, \"Literal\")\n };\n\n pp$5.parseParenExpression = function() {\n this.expect(types$1.parenL);\n var val = this.parseExpression();\n this.expect(types$1.parenR);\n return val\n };\n\n pp$5.parseParenAndDistinguishExpression = function(canBeArrow, forInit) {\n var startPos = this.start, startLoc = this.startLoc, val, allowTrailingComma = this.options.ecmaVersion >= 8;\n if (this.options.ecmaVersion >= 6) {\n this.next();\n\n var innerStartPos = this.start, innerStartLoc = this.startLoc;\n var exprList = [], first = true, lastIsComma = false;\n var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, spreadStart;\n this.yieldPos = 0;\n this.awaitPos = 0;\n // Do not save awaitIdentPos to allow checking awaits nested in parameters\n while (this.type !== types$1.parenR) {\n first ? first = false : this.expect(types$1.comma);\n if (allowTrailingComma && this.afterTrailingComma(types$1.parenR, true)) {\n lastIsComma = true;\n break\n } else if (this.type === types$1.ellipsis) {\n spreadStart = this.start;\n exprList.push(this.parseParenItem(this.parseRestBinding()));\n if (this.type === types$1.comma) { this.raise(this.start, \"Comma is not permitted after the rest element\"); }\n break\n } else {\n exprList.push(this.parseMaybeAssign(false, refDestructuringErrors, this.parseParenItem));\n }\n }\n var innerEndPos = this.lastTokEnd, innerEndLoc = this.lastTokEndLoc;\n this.expect(types$1.parenR);\n\n if (canBeArrow && !this.canInsertSemicolon() && this.eat(types$1.arrow)) {\n this.checkPatternErrors(refDestructuringErrors, false);\n this.checkYieldAwaitInDefaultParams();\n this.yieldPos = oldYieldPos;\n this.awaitPos = oldAwaitPos;\n return this.parseParenArrowList(startPos, startLoc, exprList, forInit)\n }\n\n if (!exprList.length || lastIsComma) { this.unexpected(this.lastTokStart); }\n if (spreadStart) { this.unexpected(spreadStart); }\n this.checkExpressionErrors(refDestructuringErrors, true);\n this.yieldPos = oldYieldPos || this.yieldPos;\n this.awaitPos = oldAwaitPos || this.awaitPos;\n\n if (exprList.length > 1) {\n val = this.startNodeAt(innerStartPos, innerStartLoc);\n val.expressions = exprList;\n this.finishNodeAt(val, \"SequenceExpression\", innerEndPos, innerEndLoc);\n } else {\n val = exprList[0];\n }\n } else {\n val = this.parseParenExpression();\n }\n\n if (this.options.preserveParens) {\n var par = this.startNodeAt(startPos, startLoc);\n par.expression = val;\n return this.finishNode(par, \"ParenthesizedExpression\")\n } else {\n return val\n }\n };\n\n pp$5.parseParenItem = function(item) {\n return item\n };\n\n pp$5.parseParenArrowList = function(startPos, startLoc, exprList, forInit) {\n return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, false, forInit)\n };\n\n // New's precedence is slightly tricky. It must allow its argument to\n // be a `[]` or dot subscript expression, but not a call \u2014 at least,\n // not without wrapping it in parentheses. Thus, it uses the noCalls\n // argument to parseSubscripts to prevent it from consuming the\n // argument list.\n\n var empty = [];\n\n pp$5.parseNew = function() {\n if (this.containsEsc) { this.raiseRecoverable(this.start, \"Escape sequence in keyword new\"); }\n var node = this.startNode();\n var meta = this.parseIdent(true);\n if (this.options.ecmaVersion >= 6 && this.eat(types$1.dot)) {\n node.meta = meta;\n var containsEsc = this.containsEsc;\n node.property = this.parseIdent(true);\n if (node.property.name !== \"target\")\n { this.raiseRecoverable(node.property.start, \"The only valid meta property for new is 'new.target'\"); }\n if (containsEsc)\n { this.raiseRecoverable(node.start, \"'new.target' must not contain escaped characters\"); }\n if (!this.allowNewDotTarget)\n { this.raiseRecoverable(node.start, \"'new.target' can only be used in functions and class static block\"); }\n return this.finishNode(node, \"MetaProperty\")\n }\n var startPos = this.start, startLoc = this.startLoc, isImport = this.type === types$1._import;\n node.callee = this.parseSubscripts(this.parseExprAtom(), startPos, startLoc, true, false);\n if (isImport && node.callee.type === \"ImportExpression\") {\n this.raise(startPos, \"Cannot use new with import()\");\n }\n if (this.eat(types$1.parenL)) { node.arguments = this.parseExprList(types$1.parenR, this.options.ecmaVersion >= 8, false); }\n else { node.arguments = empty; }\n return this.finishNode(node, \"NewExpression\")\n };\n\n // Parse template expression.\n\n pp$5.parseTemplateElement = function(ref) {\n var isTagged = ref.isTagged;\n\n var elem = this.startNode();\n if (this.type === types$1.invalidTemplate) {\n if (!isTagged) {\n this.raiseRecoverable(this.start, \"Bad escape sequence in untagged template literal\");\n }\n elem.value = {\n raw: this.value,\n cooked: null\n };\n } else {\n elem.value = {\n raw: this.input.slice(this.start, this.end).replace(/\\r\\n?/g, \"\\n\"),\n cooked: this.value\n };\n }\n this.next();\n elem.tail = this.type === types$1.backQuote;\n return this.finishNode(elem, \"TemplateElement\")\n };\n\n pp$5.parseTemplate = function(ref) {\n if ( ref === void 0 ) ref = {};\n var isTagged = ref.isTagged; if ( isTagged === void 0 ) isTagged = false;\n\n var node = this.startNode();\n this.next();\n node.expressions = [];\n var curElt = this.parseTemplateElement({isTagged: isTagged});\n node.quasis = [curElt];\n while (!curElt.tail) {\n if (this.type === types$1.eof) { this.raise(this.pos, \"Unterminated template literal\"); }\n this.expect(types$1.dollarBraceL);\n node.expressions.push(this.parseExpression());\n this.expect(types$1.braceR);\n node.quasis.push(curElt = this.parseTemplateElement({isTagged: isTagged}));\n }\n this.next();\n return this.finishNode(node, \"TemplateLiteral\")\n };\n\n pp$5.isAsyncProp = function(prop) {\n return !prop.computed && prop.key.type === \"Identifier\" && prop.key.name === \"async\" &&\n (this.type === types$1.name || this.type === types$1.num || this.type === types$1.string || this.type === types$1.bracketL || this.type.keyword || (this.options.ecmaVersion >= 9 && this.type === types$1.star)) &&\n !lineBreak.test(this.input.slice(this.lastTokEnd, this.start))\n };\n\n // Parse an object literal or binding pattern.\n\n pp$5.parseObj = function(isPattern, refDestructuringErrors) {\n var node = this.startNode(), first = true, propHash = {};\n node.properties = [];\n this.next();\n while (!this.eat(types$1.braceR)) {\n if (!first) {\n this.expect(types$1.comma);\n if (this.options.ecmaVersion >= 5 && this.afterTrailingComma(types$1.braceR)) { break }\n } else { first = false; }\n\n var prop = this.parseProperty(isPattern, refDestructuringErrors);\n if (!isPattern) { this.checkPropClash(prop, propHash, refDestructuringErrors); }\n node.properties.push(prop);\n }\n return this.finishNode(node, isPattern ? \"ObjectPattern\" : \"ObjectExpression\")\n };\n\n pp$5.parseProperty = function(isPattern, refDestructuringErrors) {\n var prop = this.startNode(), isGenerator, isAsync, startPos, startLoc;\n if (this.options.ecmaVersion >= 9 && this.eat(types$1.ellipsis)) {\n if (isPattern) {\n prop.argument = this.parseIdent(false);\n if (this.type === types$1.comma) {\n this.raise(this.start, \"Comma is not permitted after the rest element\");\n }\n return this.finishNode(prop, \"RestElement\")\n }\n // Parse argument.\n prop.argument = this.parseMaybeAssign(false, refDestructuringErrors);\n // To disallow trailing comma via `this.toAssignable()`.\n if (this.type === types$1.comma && refDestructuringErrors && refDestructuringErrors.trailingComma < 0) {\n refDestructuringErrors.trailingComma = this.start;\n }\n // Finish\n return this.finishNode(prop, \"SpreadElement\")\n }\n if (this.options.ecmaVersion >= 6) {\n prop.method = false;\n prop.shorthand = false;\n if (isPattern || refDestructuringErrors) {\n startPos = this.start;\n startLoc = this.startLoc;\n }\n if (!isPattern)\n { isGenerator = this.eat(types$1.star); }\n }\n var containsEsc = this.containsEsc;\n this.parsePropertyName(prop);\n if (!isPattern && !containsEsc && this.options.ecmaVersion >= 8 && !isGenerator && this.isAsyncProp(prop)) {\n isAsync = true;\n isGenerator = this.options.ecmaVersion >= 9 && this.eat(types$1.star);\n this.parsePropertyName(prop, refDestructuringErrors);\n } else {\n isAsync = false;\n }\n this.parsePropertyValue(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc);\n return this.finishNode(prop, \"Property\")\n };\n\n pp$5.parsePropertyValue = function(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc) {\n if ((isGenerator || isAsync) && this.type === types$1.colon)\n { this.unexpected(); }\n\n if (this.eat(types$1.colon)) {\n prop.value = isPattern ? this.parseMaybeDefault(this.start, this.startLoc) : this.parseMaybeAssign(false, refDestructuringErrors);\n prop.kind = \"init\";\n } else if (this.options.ecmaVersion >= 6 && this.type === types$1.parenL) {\n if (isPattern) { this.unexpected(); }\n prop.kind = \"init\";\n prop.method = true;\n prop.value = this.parseMethod(isGenerator, isAsync);\n } else if (!isPattern && !containsEsc &&\n this.options.ecmaVersion >= 5 && !prop.computed && prop.key.type === \"Identifier\" &&\n (prop.key.name === \"get\" || prop.key.name === \"set\") &&\n (this.type !== types$1.comma && this.type !== types$1.braceR && this.type !== types$1.eq)) {\n if (isGenerator || isAsync) { this.unexpected(); }\n prop.kind = prop.key.name;\n this.parsePropertyName(prop);\n prop.value = this.parseMethod(false);\n var paramCount = prop.kind === \"get\" ? 0 : 1;\n if (prop.value.params.length !== paramCount) {\n var start = prop.value.start;\n if (prop.kind === \"get\")\n { this.raiseRecoverable(start, \"getter should have no params\"); }\n else\n { this.raiseRecoverable(start, \"setter should have exactly one param\"); }\n } else {\n if (prop.kind === \"set\" && prop.value.params[0].type === \"RestElement\")\n { this.raiseRecoverable(prop.value.params[0].start, \"Setter cannot use rest params\"); }\n }\n } else if (this.options.ecmaVersion >= 6 && !prop.computed && prop.key.type === \"Identifier\") {\n if (isGenerator || isAsync) { this.unexpected(); }\n this.checkUnreserved(prop.key);\n if (prop.key.name === \"await\" && !this.awaitIdentPos)\n { this.awaitIdentPos = startPos; }\n prop.kind = \"init\";\n if (isPattern) {\n prop.value = this.parseMaybeDefault(startPos, startLoc, this.copyNode(prop.key));\n } else if (this.type === types$1.eq && refDestructuringErrors) {\n if (refDestructuringErrors.shorthandAssign < 0)\n { refDestructuringErrors.shorthandAssign = this.start; }\n prop.value = this.parseMaybeDefault(startPos, startLoc, this.copyNode(prop.key));\n } else {\n prop.value = this.copyNode(prop.key);\n }\n prop.shorthand = true;\n } else { this.unexpected(); }\n };\n\n pp$5.parsePropertyName = function(prop) {\n if (this.options.ecmaVersion >= 6) {\n if (this.eat(types$1.bracketL)) {\n prop.computed = true;\n prop.key = this.parseMaybeAssign();\n this.expect(types$1.bracketR);\n return prop.key\n } else {\n prop.computed = false;\n }\n }\n return prop.key = this.type === types$1.num || this.type === types$1.string ? this.parseExprAtom() : this.parseIdent(this.options.allowReserved !== \"never\")\n };\n\n // Initialize empty function node.\n\n pp$5.initFunction = function(node) {\n node.id = null;\n if (this.options.ecmaVersion >= 6) { node.generator = node.expression = false; }\n if (this.options.ecmaVersion >= 8) { node.async = false; }\n };\n\n // Parse object or class method.\n\n pp$5.parseMethod = function(isGenerator, isAsync, allowDirectSuper) {\n var node = this.startNode(), oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;\n\n this.initFunction(node);\n if (this.options.ecmaVersion >= 6)\n { node.generator = isGenerator; }\n if (this.options.ecmaVersion >= 8)\n { node.async = !!isAsync; }\n\n this.yieldPos = 0;\n this.awaitPos = 0;\n this.awaitIdentPos = 0;\n this.enterScope(functionFlags(isAsync, node.generator) | SCOPE_SUPER | (allowDirectSuper ? SCOPE_DIRECT_SUPER : 0));\n\n this.expect(types$1.parenL);\n node.params = this.parseBindingList(types$1.parenR, false, this.options.ecmaVersion >= 8);\n this.checkYieldAwaitInDefaultParams();\n this.parseFunctionBody(node, false, true, false);\n\n this.yieldPos = oldYieldPos;\n this.awaitPos = oldAwaitPos;\n this.awaitIdentPos = oldAwaitIdentPos;\n return this.finishNode(node, \"FunctionExpression\")\n };\n\n // Parse arrow function expression with given parameters.\n\n pp$5.parseArrowExpression = function(node, params, isAsync, forInit) {\n var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;\n\n this.enterScope(functionFlags(isAsync, false) | SCOPE_ARROW);\n this.initFunction(node);\n if (this.options.ecmaVersion >= 8) { node.async = !!isAsync; }\n\n this.yieldPos = 0;\n this.awaitPos = 0;\n this.awaitIdentPos = 0;\n\n node.params = this.toAssignableList(params, true);\n this.parseFunctionBody(node, true, false, forInit);\n\n this.yieldPos = oldYieldPos;\n this.awaitPos = oldAwaitPos;\n this.awaitIdentPos = oldAwaitIdentPos;\n return this.finishNode(node, \"ArrowFunctionExpression\")\n };\n\n // Parse function body and check parameters.\n\n pp$5.parseFunctionBody = function(node, isArrowFunction, isMethod, forInit) {\n var isExpression = isArrowFunction && this.type !== types$1.braceL;\n var oldStrict = this.strict, useStrict = false;\n\n if (isExpression) {\n node.body = this.parseMaybeAssign(forInit);\n node.expression = true;\n this.checkParams(node, false);\n } else {\n var nonSimple = this.options.ecmaVersion >= 7 && !this.isSimpleParamList(node.params);\n if (!oldStrict || nonSimple) {\n useStrict = this.strictDirective(this.end);\n // If this is a strict mode function, verify that argument names\n // are not repeated, and it does not try to bind the words `eval`\n // or `arguments`.\n if (useStrict && nonSimple)\n { this.raiseRecoverable(node.start, \"Illegal 'use strict' directive in function with non-simple parameter list\"); }\n }\n // Start a new scope with regard to labels and the `inFunction`\n // flag (restore them to their old value afterwards).\n var oldLabels = this.labels;\n this.labels = [];\n if (useStrict) { this.strict = true; }\n\n // Add the params to varDeclaredNames to ensure that an error is thrown\n // if a let/const declaration in the function clashes with one of the params.\n this.checkParams(node, !oldStrict && !useStrict && !isArrowFunction && !isMethod && this.isSimpleParamList(node.params));\n // Ensure the function name isn't a forbidden identifier in strict mode, e.g. 'eval'\n if (this.strict && node.id) { this.checkLValSimple(node.id, BIND_OUTSIDE); }\n node.body = this.parseBlock(false, undefined, useStrict && !oldStrict);\n node.expression = false;\n this.adaptDirectivePrologue(node.body.body);\n this.labels = oldLabels;\n }\n this.exitScope();\n };\n\n pp$5.isSimpleParamList = function(params) {\n for (var i = 0, list = params; i < list.length; i += 1)\n {\n var param = list[i];\n\n if (param.type !== \"Identifier\") { return false\n } }\n return true\n };\n\n // Checks function params for various disallowed patterns such as using \"eval\"\n // or \"arguments\" and duplicate parameters.\n\n pp$5.checkParams = function(node, allowDuplicates) {\n var nameHash = Object.create(null);\n for (var i = 0, list = node.params; i < list.length; i += 1)\n {\n var param = list[i];\n\n this.checkLValInnerPattern(param, BIND_VAR, allowDuplicates ? null : nameHash);\n }\n };\n\n // Parses a comma-separated list of expressions, and returns them as\n // an array. `close` is the token type that ends the list, and\n // `allowEmpty` can be turned on to allow subsequent commas with\n // nothing in between them to be parsed as `null` (which is needed\n // for array literals).\n\n pp$5.parseExprList = function(close, allowTrailingComma, allowEmpty, refDestructuringErrors) {\n var elts = [], first = true;\n while (!this.eat(close)) {\n if (!first) {\n this.expect(types$1.comma);\n if (allowTrailingComma && this.afterTrailingComma(close)) { break }\n } else { first = false; }\n\n var elt = (void 0);\n if (allowEmpty && this.type === types$1.comma)\n { elt = null; }\n else if (this.type === types$1.ellipsis) {\n elt = this.parseSpread(refDestructuringErrors);\n if (refDestructuringErrors && this.type === types$1.comma && refDestructuringErrors.trailingComma < 0)\n { refDestructuringErrors.trailingComma = this.start; }\n } else {\n elt = this.parseMaybeAssign(false, refDestructuringErrors);\n }\n elts.push(elt);\n }\n return elts\n };\n\n pp$5.checkUnreserved = function(ref) {\n var start = ref.start;\n var end = ref.end;\n var name = ref.name;\n\n if (this.inGenerator && name === \"yield\")\n { this.raiseRecoverable(start, \"Cannot use 'yield' as identifier inside a generator\"); }\n if (this.inAsync && name === \"await\")\n { this.raiseRecoverable(start, \"Cannot use 'await' as identifier inside an async function\"); }\n if (this.currentThisScope().inClassFieldInit && name === \"arguments\")\n { this.raiseRecoverable(start, \"Cannot use 'arguments' in class field initializer\"); }\n if (this.inClassStaticBlock && (name === \"arguments\" || name === \"await\"))\n { this.raise(start, (\"Cannot use \" + name + \" in class static initialization block\")); }\n if (this.keywords.test(name))\n { this.raise(start, (\"Unexpected keyword '\" + name + \"'\")); }\n if (this.options.ecmaVersion < 6 &&\n this.input.slice(start, end).indexOf(\"\\\\\") !== -1) { return }\n var re = this.strict ? this.reservedWordsStrict : this.reservedWords;\n if (re.test(name)) {\n if (!this.inAsync && name === \"await\")\n { this.raiseRecoverable(start, \"Cannot use keyword 'await' outside an async function\"); }\n this.raiseRecoverable(start, (\"The keyword '\" + name + \"' is reserved\"));\n }\n };\n\n // Parse the next token as an identifier. If `liberal` is true (used\n // when parsing properties), it will also convert keywords into\n // identifiers.\n\n pp$5.parseIdent = function(liberal, isBinding) {\n var node = this.startNode();\n if (this.type === types$1.name) {\n node.name = this.value;\n } else if (this.type.keyword) {\n node.name = this.type.keyword;\n\n // To fix https://github.com/acornjs/acorn/issues/575\n // `class` and `function` keywords push new context into this.context.\n // But there is no chance to pop the context if the keyword is consumed as an identifier such as a property name.\n // If the previous token is a dot, this does not apply because the context-managing code already ignored the keyword\n if ((node.name === \"class\" || node.name === \"function\") &&\n (this.lastTokEnd !== this.lastTokStart + 1 || this.input.charCodeAt(this.lastTokStart) !== 46)) {\n this.context.pop();\n }\n } else {\n this.unexpected();\n }\n this.next(!!liberal);\n this.finishNode(node, \"Identifier\");\n if (!liberal) {\n this.checkUnreserved(node);\n if (node.name === \"await\" && !this.awaitIdentPos)\n { this.awaitIdentPos = node.start; }\n }\n return node\n };\n\n pp$5.parsePrivateIdent = function() {\n var node = this.startNode();\n if (this.type === types$1.privateId) {\n node.name = this.value;\n } else {\n this.unexpected();\n }\n this.next();\n this.finishNode(node, \"PrivateIdentifier\");\n\n // For validating existence\n if (this.privateNameStack.length === 0) {\n this.raise(node.start, (\"Private field '#\" + (node.name) + \"' must be declared in an enclosing class\"));\n } else {\n this.privateNameStack[this.privateNameStack.length - 1].used.push(node);\n }\n\n return node\n };\n\n // Parses yield expression inside generator.\n\n pp$5.parseYield = function(forInit) {\n if (!this.yieldPos) { this.yieldPos = this.start; }\n\n var node = this.startNode();\n this.next();\n if (this.type === types$1.semi || this.canInsertSemicolon() || (this.type !== types$1.star && !this.type.startsExpr)) {\n node.delegate = false;\n node.argument = null;\n } else {\n node.delegate = this.eat(types$1.star);\n node.argument = this.parseMaybeAssign(forInit);\n }\n return this.finishNode(node, \"YieldExpression\")\n };\n\n pp$5.parseAwait = function(forInit) {\n if (!this.awaitPos) { this.awaitPos = this.start; }\n\n var node = this.startNode();\n this.next();\n node.argument = this.parseMaybeUnary(null, true, false, forInit);\n return this.finishNode(node, \"AwaitExpression\")\n };\n\n var pp$4 = Parser.prototype;\n\n // This function is used to raise exceptions on parse errors. It\n // takes an offset integer (into the current `input`) to indicate\n // the location of the error, attaches the position to the end\n // of the error message, and then raises a `SyntaxError` with that\n // message.\n\n pp$4.raise = function(pos, message) {\n var loc = getLineInfo(this.input, pos);\n message += \" (\" + loc.line + \":\" + loc.column + \")\";\n var err = new SyntaxError(message);\n err.pos = pos; err.loc = loc; err.raisedAt = this.pos;\n throw err\n };\n\n pp$4.raiseRecoverable = pp$4.raise;\n\n pp$4.curPosition = function() {\n if (this.options.locations) {\n return new Position(this.curLine, this.pos - this.lineStart)\n }\n };\n\n var pp$3 = Parser.prototype;\n\n var Scope = function Scope(flags) {\n this.flags = flags;\n // A list of var-declared names in the current lexical scope\n this.var = [];\n // A list of lexically-declared names in the current lexical scope\n this.lexical = [];\n // A list of lexically-declared FunctionDeclaration names in the current lexical scope\n this.functions = [];\n // A switch to disallow the identifier reference 'arguments'\n this.inClassFieldInit = false;\n };\n\n // The functions in this module keep track of declared variables in the current scope in order to detect duplicate variable names.\n\n pp$3.enterScope = function(flags) {\n this.scopeStack.push(new Scope(flags));\n };\n\n pp$3.exitScope = function() {\n this.scopeStack.pop();\n };\n\n // The spec says:\n // > At the top level of a function, or script, function declarations are\n // > treated like var declarations rather than like lexical declarations.\n pp$3.treatFunctionsAsVarInScope = function(scope) {\n return (scope.flags & SCOPE_FUNCTION) || !this.inModule && (scope.flags & SCOPE_TOP)\n };\n\n pp$3.declareName = function(name, bindingType, pos) {\n var redeclared = false;\n if (bindingType === BIND_LEXICAL) {\n var scope = this.currentScope();\n redeclared = scope.lexical.indexOf(name) > -1 || scope.functions.indexOf(name) > -1 || scope.var.indexOf(name) > -1;\n scope.lexical.push(name);\n if (this.inModule && (scope.flags & SCOPE_TOP))\n { delete this.undefinedExports[name]; }\n } else if (bindingType === BIND_SIMPLE_CATCH) {\n var scope$1 = this.currentScope();\n scope$1.lexical.push(name);\n } else if (bindingType === BIND_FUNCTION) {\n var scope$2 = this.currentScope();\n if (this.treatFunctionsAsVar)\n { redeclared = scope$2.lexical.indexOf(name) > -1; }\n else\n { redeclared = scope$2.lexical.indexOf(name) > -1 || scope$2.var.indexOf(name) > -1; }\n scope$2.functions.push(name);\n } else {\n for (var i = this.scopeStack.length - 1; i >= 0; --i) {\n var scope$3 = this.scopeStack[i];\n if (scope$3.lexical.indexOf(name) > -1 && !((scope$3.flags & SCOPE_SIMPLE_CATCH) && scope$3.lexical[0] === name) ||\n !this.treatFunctionsAsVarInScope(scope$3) && scope$3.functions.indexOf(name) > -1) {\n redeclared = true;\n break\n }\n scope$3.var.push(name);\n if (this.inModule && (scope$3.flags & SCOPE_TOP))\n { delete this.undefinedExports[name]; }\n if (scope$3.flags & SCOPE_VAR) { break }\n }\n }\n if (redeclared) { this.raiseRecoverable(pos, (\"Identifier '\" + name + \"' has already been declared\")); }\n };\n\n pp$3.checkLocalExport = function(id) {\n // scope.functions must be empty as Module code is always strict.\n if (this.scopeStack[0].lexical.indexOf(id.name) === -1 &&\n this.scopeStack[0].var.indexOf(id.name) === -1) {\n this.undefinedExports[id.name] = id;\n }\n };\n\n pp$3.currentScope = function() {\n return this.scopeStack[this.scopeStack.length - 1]\n };\n\n pp$3.currentVarScope = function() {\n for (var i = this.scopeStack.length - 1;; i--) {\n var scope = this.scopeStack[i];\n if (scope.flags & SCOPE_VAR) { return scope }\n }\n };\n\n // Could be useful for `this`, `new.target`, `super()`, `super.property`, and `super[property]`.\n pp$3.currentThisScope = function() {\n for (var i = this.scopeStack.length - 1;; i--) {\n var scope = this.scopeStack[i];\n if (scope.flags & SCOPE_VAR && !(scope.flags & SCOPE_ARROW)) { return scope }\n }\n };\n\n var Node = function Node(parser, pos, loc) {\n this.type = \"\";\n this.start = pos;\n this.end = 0;\n if (parser.options.locations)\n { this.loc = new SourceLocation(parser, loc); }\n if (parser.options.directSourceFile)\n { this.sourceFile = parser.options.directSourceFile; }\n if (parser.options.ranges)\n { this.range = [pos, 0]; }\n };\n\n // Start an AST node, attaching a start offset.\n\n var pp$2 = Parser.prototype;\n\n pp$2.startNode = function() {\n return new Node(this, this.start, this.startLoc)\n };\n\n pp$2.startNodeAt = function(pos, loc) {\n return new Node(this, pos, loc)\n };\n\n // Finish an AST node, adding `type` and `end` properties.\n\n function finishNodeAt(node, type, pos, loc) {\n node.type = type;\n node.end = pos;\n if (this.options.locations)\n { node.loc.end = loc; }\n if (this.options.ranges)\n { node.range[1] = pos; }\n return node\n }\n\n pp$2.finishNode = function(node, type) {\n return finishNodeAt.call(this, node, type, this.lastTokEnd, this.lastTokEndLoc)\n };\n\n // Finish node at given position\n\n pp$2.finishNodeAt = function(node, type, pos, loc) {\n return finishNodeAt.call(this, node, type, pos, loc)\n };\n\n pp$2.copyNode = function(node) {\n var newNode = new Node(this, node.start, this.startLoc);\n for (var prop in node) { newNode[prop] = node[prop]; }\n return newNode\n };\n\n // This file contains Unicode properties extracted from the ECMAScript\n // specification. The lists are extracted like so:\n // $$('#table-binary-unicode-properties > figure > table > tbody > tr > td:nth-child(1) code').map(el => el.innerText)\n\n // #table-binary-unicode-properties\n var ecma9BinaryProperties = \"ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS\";\n var ecma10BinaryProperties = ecma9BinaryProperties + \" Extended_Pictographic\";\n var ecma11BinaryProperties = ecma10BinaryProperties;\n var ecma12BinaryProperties = ecma11BinaryProperties + \" EBase EComp EMod EPres ExtPict\";\n var ecma13BinaryProperties = ecma12BinaryProperties;\n var unicodeBinaryProperties = {\n 9: ecma9BinaryProperties,\n 10: ecma10BinaryProperties,\n 11: ecma11BinaryProperties,\n 12: ecma12BinaryProperties,\n 13: ecma13BinaryProperties\n };\n\n // #table-unicode-general-category-values\n var unicodeGeneralCategoryValues = \"Cased_Letter LC Close_Punctuation Pe Connector_Punctuation Pc Control Cc cntrl Currency_Symbol Sc Dash_Punctuation Pd Decimal_Number Nd digit Enclosing_Mark Me Final_Punctuation Pf Format Cf Initial_Punctuation Pi Letter L Letter_Number Nl Line_Separator Zl Lowercase_Letter Ll Mark M Combining_Mark Math_Symbol Sm Modifier_Letter Lm Modifier_Symbol Sk Nonspacing_Mark Mn Number N Open_Punctuation Ps Other C Other_Letter Lo Other_Number No Other_Punctuation Po Other_Symbol So Paragraph_Separator Zp Private_Use Co Punctuation P punct Separator Z Space_Separator Zs Spacing_Mark Mc Surrogate Cs Symbol S Titlecase_Letter Lt Unassigned Cn Uppercase_Letter Lu\";\n\n // #table-unicode-script-values\n var ecma9ScriptValues = \"Adlam Adlm Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb\";\n var ecma10ScriptValues = ecma9ScriptValues + \" Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd\";\n var ecma11ScriptValues = ecma10ScriptValues + \" Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho\";\n var ecma12ScriptValues = ecma11ScriptValues + \" Chorasmian Chrs Diak Dives_Akuru Khitan_Small_Script Kits Yezi Yezidi\";\n var ecma13ScriptValues = ecma12ScriptValues + \" Cypro_Minoan Cpmn Old_Uyghur Ougr Tangsa Tnsa Toto Vithkuqi Vith\";\n var unicodeScriptValues = {\n 9: ecma9ScriptValues,\n 10: ecma10ScriptValues,\n 11: ecma11ScriptValues,\n 12: ecma12ScriptValues,\n 13: ecma13ScriptValues\n };\n\n var data = {};\n function buildUnicodeData(ecmaVersion) {\n var d = data[ecmaVersion] = {\n binary: wordsRegexp(unicodeBinaryProperties[ecmaVersion] + \" \" + unicodeGeneralCategoryValues),\n nonBinary: {\n General_Category: wordsRegexp(unicodeGeneralCategoryValues),\n Script: wordsRegexp(unicodeScriptValues[ecmaVersion])\n }\n };\n d.nonBinary.Script_Extensions = d.nonBinary.Script;\n\n d.nonBinary.gc = d.nonBinary.General_Category;\n d.nonBinary.sc = d.nonBinary.Script;\n d.nonBinary.scx = d.nonBinary.Script_Extensions;\n }\n\n for (var i = 0, list = [9, 10, 11, 12, 13]; i < list.length; i += 1) {\n var ecmaVersion = list[i];\n\n buildUnicodeData(ecmaVersion);\n }\n\n var pp$1 = Parser.prototype;\n\n var RegExpValidationState = function RegExpValidationState(parser) {\n this.parser = parser;\n this.validFlags = \"gim\" + (parser.options.ecmaVersion >= 6 ? \"uy\" : \"\") + (parser.options.ecmaVersion >= 9 ? \"s\" : \"\") + (parser.options.ecmaVersion >= 13 ? \"d\" : \"\");\n this.unicodeProperties = data[parser.options.ecmaVersion >= 13 ? 13 : parser.options.ecmaVersion];\n this.source = \"\";\n this.flags = \"\";\n this.start = 0;\n this.switchU = false;\n this.switchN = false;\n this.pos = 0;\n this.lastIntValue = 0;\n this.lastStringValue = \"\";\n this.lastAssertionIsQuantifiable = false;\n this.numCapturingParens = 0;\n this.maxBackReference = 0;\n this.groupNames = [];\n this.backReferenceNames = [];\n };\n\n RegExpValidationState.prototype.reset = function reset (start, pattern, flags) {\n var unicode = flags.indexOf(\"u\") !== -1;\n this.start = start | 0;\n this.source = pattern + \"\";\n this.flags = flags;\n this.switchU = unicode && this.parser.options.ecmaVersion >= 6;\n this.switchN = unicode && this.parser.options.ecmaVersion >= 9;\n };\n\n RegExpValidationState.prototype.raise = function raise (message) {\n this.parser.raiseRecoverable(this.start, (\"Invalid regular expression: /\" + (this.source) + \"/: \" + message));\n };\n\n // If u flag is given, this returns the code point at the index (it combines a surrogate pair).\n // Otherwise, this returns the code unit of the index (can be a part of a surrogate pair).\n RegExpValidationState.prototype.at = function at (i, forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n var s = this.source;\n var l = s.length;\n if (i >= l) {\n return -1\n }\n var c = s.charCodeAt(i);\n if (!(forceU || this.switchU) || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l) {\n return c\n }\n var next = s.charCodeAt(i + 1);\n return next >= 0xDC00 && next <= 0xDFFF ? (c << 10) + next - 0x35FDC00 : c\n };\n\n RegExpValidationState.prototype.nextIndex = function nextIndex (i, forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n var s = this.source;\n var l = s.length;\n if (i >= l) {\n return l\n }\n var c = s.charCodeAt(i), next;\n if (!(forceU || this.switchU) || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l ||\n (next = s.charCodeAt(i + 1)) < 0xDC00 || next > 0xDFFF) {\n return i + 1\n }\n return i + 2\n };\n\n RegExpValidationState.prototype.current = function current (forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n return this.at(this.pos, forceU)\n };\n\n RegExpValidationState.prototype.lookahead = function lookahead (forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n return this.at(this.nextIndex(this.pos, forceU), forceU)\n };\n\n RegExpValidationState.prototype.advance = function advance (forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n this.pos = this.nextIndex(this.pos, forceU);\n };\n\n RegExpValidationState.prototype.eat = function eat (ch, forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n if (this.current(forceU) === ch) {\n this.advance(forceU);\n return true\n }\n return false\n };\n\n /**\n * Validate the flags part of a given RegExpLiteral.\n *\n * @param {RegExpValidationState} state The state to validate RegExp.\n * @returns {void}\n */\n pp$1.validateRegExpFlags = function(state) {\n var validFlags = state.validFlags;\n var flags = state.flags;\n\n for (var i = 0; i < flags.length; i++) {\n var flag = flags.charAt(i);\n if (validFlags.indexOf(flag) === -1) {\n this.raise(state.start, \"Invalid regular expression flag\");\n }\n if (flags.indexOf(flag, i + 1) > -1) {\n this.raise(state.start, \"Duplicate regular expression flag\");\n }\n }\n };\n\n /**\n * Validate the pattern part of a given RegExpLiteral.\n *\n * @param {RegExpValidationState} state The state to validate RegExp.\n * @returns {void}\n */\n pp$1.validateRegExpPattern = function(state) {\n this.regexp_pattern(state);\n\n // The goal symbol for the parse is |Pattern[~U, ~N]|. If the result of\n // parsing contains a |GroupName|, reparse with the goal symbol\n // |Pattern[~U, +N]| and use this result instead. Throw a *SyntaxError*\n // exception if _P_ did not conform to the grammar, if any elements of _P_\n // were not matched by the parse, or if any Early Error conditions exist.\n if (!state.switchN && this.options.ecmaVersion >= 9 && state.groupNames.length > 0) {\n state.switchN = true;\n this.regexp_pattern(state);\n }\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-Pattern\n pp$1.regexp_pattern = function(state) {\n state.pos = 0;\n state.lastIntValue = 0;\n state.lastStringValue = \"\";\n state.lastAssertionIsQuantifiable = false;\n state.numCapturingParens = 0;\n state.maxBackReference = 0;\n state.groupNames.length = 0;\n state.backReferenceNames.length = 0;\n\n this.regexp_disjunction(state);\n\n if (state.pos !== state.source.length) {\n // Make the same messages as V8.\n if (state.eat(0x29 /* ) */)) {\n state.raise(\"Unmatched ')'\");\n }\n if (state.eat(0x5D /* ] */) || state.eat(0x7D /* } */)) {\n state.raise(\"Lone quantifier brackets\");\n }\n }\n if (state.maxBackReference > state.numCapturingParens) {\n state.raise(\"Invalid escape\");\n }\n for (var i = 0, list = state.backReferenceNames; i < list.length; i += 1) {\n var name = list[i];\n\n if (state.groupNames.indexOf(name) === -1) {\n state.raise(\"Invalid named capture referenced\");\n }\n }\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-Disjunction\n pp$1.regexp_disjunction = function(state) {\n this.regexp_alternative(state);\n while (state.eat(0x7C /* | */)) {\n this.regexp_alternative(state);\n }\n\n // Make the same message as V8.\n if (this.regexp_eatQuantifier(state, true)) {\n state.raise(\"Nothing to repeat\");\n }\n if (state.eat(0x7B /* { */)) {\n state.raise(\"Lone quantifier brackets\");\n }\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-Alternative\n pp$1.regexp_alternative = function(state) {\n while (state.pos < state.source.length && this.regexp_eatTerm(state))\n { }\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Term\n pp$1.regexp_eatTerm = function(state) {\n if (this.regexp_eatAssertion(state)) {\n // Handle `QuantifiableAssertion Quantifier` alternative.\n // `state.lastAssertionIsQuantifiable` is true if the last eaten Assertion\n // is a QuantifiableAssertion.\n if (state.lastAssertionIsQuantifiable && this.regexp_eatQuantifier(state)) {\n // Make the same message as V8.\n if (state.switchU) {\n state.raise(\"Invalid quantifier\");\n }\n }\n return true\n }\n\n if (state.switchU ? this.regexp_eatAtom(state) : this.regexp_eatExtendedAtom(state)) {\n this.regexp_eatQuantifier(state);\n return true\n }\n\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Assertion\n pp$1.regexp_eatAssertion = function(state) {\n var start = state.pos;\n state.lastAssertionIsQuantifiable = false;\n\n // ^, $\n if (state.eat(0x5E /* ^ */) || state.eat(0x24 /* $ */)) {\n return true\n }\n\n // \\b \\B\n if (state.eat(0x5C /* \\ */)) {\n if (state.eat(0x42 /* B */) || state.eat(0x62 /* b */)) {\n return true\n }\n state.pos = start;\n }\n\n // Lookahead / Lookbehind\n if (state.eat(0x28 /* ( */) && state.eat(0x3F /* ? */)) {\n var lookbehind = false;\n if (this.options.ecmaVersion >= 9) {\n lookbehind = state.eat(0x3C /* < */);\n }\n if (state.eat(0x3D /* = */) || state.eat(0x21 /* ! */)) {\n this.regexp_disjunction(state);\n if (!state.eat(0x29 /* ) */)) {\n state.raise(\"Unterminated group\");\n }\n state.lastAssertionIsQuantifiable = !lookbehind;\n return true\n }\n }\n\n state.pos = start;\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-Quantifier\n pp$1.regexp_eatQuantifier = function(state, noError) {\n if ( noError === void 0 ) noError = false;\n\n if (this.regexp_eatQuantifierPrefix(state, noError)) {\n state.eat(0x3F /* ? */);\n return true\n }\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-QuantifierPrefix\n pp$1.regexp_eatQuantifierPrefix = function(state, noError) {\n return (\n state.eat(0x2A /* * */) ||\n state.eat(0x2B /* + */) ||\n state.eat(0x3F /* ? */) ||\n this.regexp_eatBracedQuantifier(state, noError)\n )\n };\n pp$1.regexp_eatBracedQuantifier = function(state, noError) {\n var start = state.pos;\n if (state.eat(0x7B /* { */)) {\n var min = 0, max = -1;\n if (this.regexp_eatDecimalDigits(state)) {\n min = state.lastIntValue;\n if (state.eat(0x2C /* , */) && this.regexp_eatDecimalDigits(state)) {\n max = state.lastIntValue;\n }\n if (state.eat(0x7D /* } */)) {\n // SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-term\n if (max !== -1 && max < min && !noError) {\n state.raise(\"numbers out of order in {} quantifier\");\n }\n return true\n }\n }\n if (state.switchU && !noError) {\n state.raise(\"Incomplete quantifier\");\n }\n state.pos = start;\n }\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-Atom\n pp$1.regexp_eatAtom = function(state) {\n return (\n this.regexp_eatPatternCharacters(state) ||\n state.eat(0x2E /* . */) ||\n this.regexp_eatReverseSolidusAtomEscape(state) ||\n this.regexp_eatCharacterClass(state) ||\n this.regexp_eatUncapturingGroup(state) ||\n this.regexp_eatCapturingGroup(state)\n )\n };\n pp$1.regexp_eatReverseSolidusAtomEscape = function(state) {\n var start = state.pos;\n if (state.eat(0x5C /* \\ */)) {\n if (this.regexp_eatAtomEscape(state)) {\n return true\n }\n state.pos = start;\n }\n return false\n };\n pp$1.regexp_eatUncapturingGroup = function(state) {\n var start = state.pos;\n if (state.eat(0x28 /* ( */)) {\n if (state.eat(0x3F /* ? */) && state.eat(0x3A /* : */)) {\n this.regexp_disjunction(state);\n if (state.eat(0x29 /* ) */)) {\n return true\n }\n state.raise(\"Unterminated group\");\n }\n state.pos = start;\n }\n return false\n };\n pp$1.regexp_eatCapturingGroup = function(state) {\n if (state.eat(0x28 /* ( */)) {\n if (this.options.ecmaVersion >= 9) {\n this.regexp_groupSpecifier(state);\n } else if (state.current() === 0x3F /* ? */) {\n state.raise(\"Invalid group\");\n }\n this.regexp_disjunction(state);\n if (state.eat(0x29 /* ) */)) {\n state.numCapturingParens += 1;\n return true\n }\n state.raise(\"Unterminated group\");\n }\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedAtom\n pp$1.regexp_eatExtendedAtom = function(state) {\n return (\n state.eat(0x2E /* . */) ||\n this.regexp_eatReverseSolidusAtomEscape(state) ||\n this.regexp_eatCharacterClass(state) ||\n this.regexp_eatUncapturingGroup(state) ||\n this.regexp_eatCapturingGroup(state) ||\n this.regexp_eatInvalidBracedQuantifier(state) ||\n this.regexp_eatExtendedPatternCharacter(state)\n )\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-InvalidBracedQuantifier\n pp$1.regexp_eatInvalidBracedQuantifier = function(state) {\n if (this.regexp_eatBracedQuantifier(state, true)) {\n state.raise(\"Nothing to repeat\");\n }\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-SyntaxCharacter\n pp$1.regexp_eatSyntaxCharacter = function(state) {\n var ch = state.current();\n if (isSyntaxCharacter(ch)) {\n state.lastIntValue = ch;\n state.advance();\n return true\n }\n return false\n };\n function isSyntaxCharacter(ch) {\n return (\n ch === 0x24 /* $ */ ||\n ch >= 0x28 /* ( */ && ch <= 0x2B /* + */ ||\n ch === 0x2E /* . */ ||\n ch === 0x3F /* ? */ ||\n ch >= 0x5B /* [ */ && ch <= 0x5E /* ^ */ ||\n ch >= 0x7B /* { */ && ch <= 0x7D /* } */\n )\n }\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-PatternCharacter\n // But eat eager.\n pp$1.regexp_eatPatternCharacters = function(state) {\n var start = state.pos;\n var ch = 0;\n while ((ch = state.current()) !== -1 && !isSyntaxCharacter(ch)) {\n state.advance();\n }\n return state.pos !== start\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedPatternCharacter\n pp$1.regexp_eatExtendedPatternCharacter = function(state) {\n var ch = state.current();\n if (\n ch !== -1 &&\n ch !== 0x24 /* $ */ &&\n !(ch >= 0x28 /* ( */ && ch <= 0x2B /* + */) &&\n ch !== 0x2E /* . */ &&\n ch !== 0x3F /* ? */ &&\n ch !== 0x5B /* [ */ &&\n ch !== 0x5E /* ^ */ &&\n ch !== 0x7C /* | */\n ) {\n state.advance();\n return true\n }\n return false\n };\n\n // GroupSpecifier ::\n // [empty]\n // `?` GroupName\n pp$1.regexp_groupSpecifier = function(state) {\n if (state.eat(0x3F /* ? */)) {\n if (this.regexp_eatGroupName(state)) {\n if (state.groupNames.indexOf(state.lastStringValue) !== -1) {\n state.raise(\"Duplicate capture group name\");\n }\n state.groupNames.push(state.lastStringValue);\n return\n }\n state.raise(\"Invalid group\");\n }\n };\n\n // GroupName ::\n // `<` RegExpIdentifierName `>`\n // Note: this updates `state.lastStringValue` property with the eaten name.\n pp$1.regexp_eatGroupName = function(state) {\n state.lastStringValue = \"\";\n if (state.eat(0x3C /* < */)) {\n if (this.regexp_eatRegExpIdentifierName(state) && state.eat(0x3E /* > */)) {\n return true\n }\n state.raise(\"Invalid capture group name\");\n }\n return false\n };\n\n // RegExpIdentifierName ::\n // RegExpIdentifierStart\n // RegExpIdentifierName RegExpIdentifierPart\n // Note: this updates `state.lastStringValue` property with the eaten name.\n pp$1.regexp_eatRegExpIdentifierName = function(state) {\n state.lastStringValue = \"\";\n if (this.regexp_eatRegExpIdentifierStart(state)) {\n state.lastStringValue += codePointToString(state.lastIntValue);\n while (this.regexp_eatRegExpIdentifierPart(state)) {\n state.lastStringValue += codePointToString(state.lastIntValue);\n }\n return true\n }\n return false\n };\n\n // RegExpIdentifierStart ::\n // UnicodeIDStart\n // `$`\n // `_`\n // `\\` RegExpUnicodeEscapeSequence[+U]\n pp$1.regexp_eatRegExpIdentifierStart = function(state) {\n var start = state.pos;\n var forceU = this.options.ecmaVersion >= 11;\n var ch = state.current(forceU);\n state.advance(forceU);\n\n if (ch === 0x5C /* \\ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state, forceU)) {\n ch = state.lastIntValue;\n }\n if (isRegExpIdentifierStart(ch)) {\n state.lastIntValue = ch;\n return true\n }\n\n state.pos = start;\n return false\n };\n function isRegExpIdentifierStart(ch) {\n return isIdentifierStart(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */\n }\n\n // RegExpIdentifierPart ::\n // UnicodeIDContinue\n // `$`\n // `_`\n // `\\` RegExpUnicodeEscapeSequence[+U]\n // <ZWNJ>\n // <ZWJ>\n pp$1.regexp_eatRegExpIdentifierPart = function(state) {\n var start = state.pos;\n var forceU = this.options.ecmaVersion >= 11;\n var ch = state.current(forceU);\n state.advance(forceU);\n\n if (ch === 0x5C /* \\ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state, forceU)) {\n ch = state.lastIntValue;\n }\n if (isRegExpIdentifierPart(ch)) {\n state.lastIntValue = ch;\n return true\n }\n\n state.pos = start;\n return false\n };\n function isRegExpIdentifierPart(ch) {\n return isIdentifierChar(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */ || ch === 0x200C /* <ZWNJ> */ || ch === 0x200D /* <ZWJ> */\n }\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-AtomEscape\n pp$1.regexp_eatAtomEscape = function(state) {\n if (\n this.regexp_eatBackReference(state) ||\n this.regexp_eatCharacterClassEscape(state) ||\n this.regexp_eatCharacterEscape(state) ||\n (state.switchN && this.regexp_eatKGroupName(state))\n ) {\n return true\n }\n if (state.switchU) {\n // Make the same message as V8.\n if (state.current() === 0x63 /* c */) {\n state.raise(\"Invalid unicode escape\");\n }\n state.raise(\"Invalid escape\");\n }\n return false\n };\n pp$1.regexp_eatBackReference = function(state) {\n var start = state.pos;\n if (this.regexp_eatDecimalEscape(state)) {\n var n = state.lastIntValue;\n if (state.switchU) {\n // For SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-atomescape\n if (n > state.maxBackReference) {\n state.maxBackReference = n;\n }\n return true\n }\n if (n <= state.numCapturingParens) {\n return true\n }\n state.pos = start;\n }\n return false\n };\n pp$1.regexp_eatKGroupName = function(state) {\n if (state.eat(0x6B /* k */)) {\n if (this.regexp_eatGroupName(state)) {\n state.backReferenceNames.push(state.lastStringValue);\n return true\n }\n state.raise(\"Invalid named reference\");\n }\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-CharacterEscape\n pp$1.regexp_eatCharacterEscape = function(state) {\n return (\n this.regexp_eatControlEscape(state) ||\n this.regexp_eatCControlLetter(state) ||\n this.regexp_eatZero(state) ||\n this.regexp_eatHexEscapeSequence(state) ||\n this.regexp_eatRegExpUnicodeEscapeSequence(state, false) ||\n (!state.switchU && this.regexp_eatLegacyOctalEscapeSequence(state)) ||\n this.regexp_eatIdentityEscape(state)\n )\n };\n pp$1.regexp_eatCControlLetter = function(state) {\n var start = state.pos;\n if (state.eat(0x63 /* c */)) {\n if (this.regexp_eatControlLetter(state)) {\n return true\n }\n state.pos = start;\n }\n return false\n };\n pp$1.regexp_eatZero = function(state) {\n if (state.current() === 0x30 /* 0 */ && !isDecimalDigit(state.lookahead())) {\n state.lastIntValue = 0;\n state.advance();\n return true\n }\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-ControlEscape\n pp$1.regexp_eatControlEscape = function(state) {\n var ch = state.current();\n if (ch === 0x74 /* t */) {\n state.lastIntValue = 0x09; /* \\t */\n state.advance();\n return true\n }\n if (ch === 0x6E /* n */) {\n state.lastIntValue = 0x0A; /* \\n */\n state.advance();\n return true\n }\n if (ch === 0x76 /* v */) {\n state.lastIntValue = 0x0B; /* \\v */\n state.advance();\n return true\n }\n if (ch === 0x66 /* f */) {\n state.lastIntValue = 0x0C; /* \\f */\n state.advance();\n return true\n }\n if (ch === 0x72 /* r */) {\n state.lastIntValue = 0x0D; /* \\r */\n state.advance();\n return true\n }\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-ControlLetter\n pp$1.regexp_eatControlLetter = function(state) {\n var ch = state.current();\n if (isControlLetter(ch)) {\n state.lastIntValue = ch % 0x20;\n state.advance();\n return true\n }\n return false\n };\n function isControlLetter(ch) {\n return (\n (ch >= 0x41 /* A */ && ch <= 0x5A /* Z */) ||\n (ch >= 0x61 /* a */ && ch <= 0x7A /* z */)\n )\n }\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-RegExpUnicodeEscapeSequence\n pp$1.regexp_eatRegExpUnicodeEscapeSequence = function(state, forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n var start = state.pos;\n var switchU = forceU || state.switchU;\n\n if (state.eat(0x75 /* u */)) {\n if (this.regexp_eatFixedHexDigits(state, 4)) {\n var lead = state.lastIntValue;\n if (switchU && lead >= 0xD800 && lead <= 0xDBFF) {\n var leadSurrogateEnd = state.pos;\n if (state.eat(0x5C /* \\ */) && state.eat(0x75 /* u */) && this.regexp_eatFixedHexDigits(state, 4)) {\n var trail = state.lastIntValue;\n if (trail >= 0xDC00 && trail <= 0xDFFF) {\n state.lastIntValue = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;\n return true\n }\n }\n state.pos = leadSurrogateEnd;\n state.lastIntValue = lead;\n }\n return true\n }\n if (\n switchU &&\n state.eat(0x7B /* { */) &&\n this.regexp_eatHexDigits(state) &&\n state.eat(0x7D /* } */) &&\n isValidUnicode(state.lastIntValue)\n ) {\n return true\n }\n if (switchU) {\n state.raise(\"Invalid unicode escape\");\n }\n state.pos = start;\n }\n\n return false\n };\n function isValidUnicode(ch) {\n return ch >= 0 && ch <= 0x10FFFF\n }\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-IdentityEscape\n pp$1.regexp_eatIdentityEscape = function(state) {\n if (state.switchU) {\n if (this.regexp_eatSyntaxCharacter(state)) {\n return true\n }\n if (state.eat(0x2F /* / */)) {\n state.lastIntValue = 0x2F; /* / */\n return true\n }\n return false\n }\n\n var ch = state.current();\n if (ch !== 0x63 /* c */ && (!state.switchN || ch !== 0x6B /* k */)) {\n state.lastIntValue = ch;\n state.advance();\n return true\n }\n\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalEscape\n pp$1.regexp_eatDecimalEscape = function(state) {\n state.lastIntValue = 0;\n var ch = state.current();\n if (ch >= 0x31 /* 1 */ && ch <= 0x39 /* 9 */) {\n do {\n state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */);\n state.advance();\n } while ((ch = state.current()) >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */)\n return true\n }\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClassEscape\n pp$1.regexp_eatCharacterClassEscape = function(state) {\n var ch = state.current();\n\n if (isCharacterClassEscape(ch)) {\n state.lastIntValue = -1;\n state.advance();\n return true\n }\n\n if (\n state.switchU &&\n this.options.ecmaVersion >= 9 &&\n (ch === 0x50 /* P */ || ch === 0x70 /* p */)\n ) {\n state.lastIntValue = -1;\n state.advance();\n if (\n state.eat(0x7B /* { */) &&\n this.regexp_eatUnicodePropertyValueExpression(state) &&\n state.eat(0x7D /* } */)\n ) {\n return true\n }\n state.raise(\"Invalid property name\");\n }\n\n return false\n };\n function isCharacterClassEscape(ch) {\n return (\n ch === 0x64 /* d */ ||\n ch === 0x44 /* D */ ||\n ch === 0x73 /* s */ ||\n ch === 0x53 /* S */ ||\n ch === 0x77 /* w */ ||\n ch === 0x57 /* W */\n )\n }\n\n // UnicodePropertyValueExpression ::\n // UnicodePropertyName `=` UnicodePropertyValue\n // LoneUnicodePropertyNameOrValue\n pp$1.regexp_eatUnicodePropertyValueExpression = function(state) {\n var start = state.pos;\n\n // UnicodePropertyName `=` UnicodePropertyValue\n if (this.regexp_eatUnicodePropertyName(state) && state.eat(0x3D /* = */)) {\n var name = state.lastStringValue;\n if (this.regexp_eatUnicodePropertyValue(state)) {\n var value = state.lastStringValue;\n this.regexp_validateUnicodePropertyNameAndValue(state, name, value);\n return true\n }\n }\n state.pos = start;\n\n // LoneUnicodePropertyNameOrValue\n if (this.regexp_eatLoneUnicodePropertyNameOrValue(state)) {\n var nameOrValue = state.lastStringValue;\n this.regexp_validateUnicodePropertyNameOrValue(state, nameOrValue);\n return true\n }\n return false\n };\n pp$1.regexp_validateUnicodePropertyNameAndValue = function(state, name, value) {\n if (!hasOwn(state.unicodeProperties.nonBinary, name))\n { state.raise(\"Invalid property name\"); }\n if (!state.unicodeProperties.nonBinary[name].test(value))\n { state.raise(\"Invalid property value\"); }\n };\n pp$1.regexp_validateUnicodePropertyNameOrValue = function(state, nameOrValue) {\n if (!state.unicodeProperties.binary.test(nameOrValue))\n { state.raise(\"Invalid property name\"); }\n };\n\n // UnicodePropertyName ::\n // UnicodePropertyNameCharacters\n pp$1.regexp_eatUnicodePropertyName = function(state) {\n var ch = 0;\n state.lastStringValue = \"\";\n while (isUnicodePropertyNameCharacter(ch = state.current())) {\n state.lastStringValue += codePointToString(ch);\n state.advance();\n }\n return state.lastStringValue !== \"\"\n };\n function isUnicodePropertyNameCharacter(ch) {\n return isControlLetter(ch) || ch === 0x5F /* _ */\n }\n\n // UnicodePropertyValue ::\n // UnicodePropertyValueCharacters\n pp$1.regexp_eatUnicodePropertyValue = function(state) {\n var ch = 0;\n state.lastStringValue = \"\";\n while (isUnicodePropertyValueCharacter(ch = state.current())) {\n state.lastStringValue += codePointToString(ch);\n state.advance();\n }\n return state.lastStringValue !== \"\"\n };\n function isUnicodePropertyValueCharacter(ch) {\n return isUnicodePropertyNameCharacter(ch) || isDecimalDigit(ch)\n }\n\n // LoneUnicodePropertyNameOrValue ::\n // UnicodePropertyValueCharacters\n pp$1.regexp_eatLoneUnicodePropertyNameOrValue = function(state) {\n return this.regexp_eatUnicodePropertyValue(state)\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClass\n pp$1.regexp_eatCharacterClass = function(state) {\n if (state.eat(0x5B /* [ */)) {\n state.eat(0x5E /* ^ */);\n this.regexp_classRanges(state);\n if (state.eat(0x5D /* ] */)) {\n return true\n }\n // Unreachable since it threw \"unterminated regular expression\" error before.\n state.raise(\"Unterminated character class\");\n }\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-ClassRanges\n // https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRanges\n // https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRangesNoDash\n pp$1.regexp_classRanges = function(state) {\n while (this.regexp_eatClassAtom(state)) {\n var left = state.lastIntValue;\n if (state.eat(0x2D /* - */) && this.regexp_eatClassAtom(state)) {\n var right = state.lastIntValue;\n if (state.switchU && (left === -1 || right === -1)) {\n state.raise(\"Invalid character class\");\n }\n if (left !== -1 && right !== -1 && left > right) {\n state.raise(\"Range out of order in character class\");\n }\n }\n }\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtom\n // https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtomNoDash\n pp$1.regexp_eatClassAtom = function(state) {\n var start = state.pos;\n\n if (state.eat(0x5C /* \\ */)) {\n if (this.regexp_eatClassEscape(state)) {\n return true\n }\n if (state.switchU) {\n // Make the same message as V8.\n var ch$1 = state.current();\n if (ch$1 === 0x63 /* c */ || isOctalDigit(ch$1)) {\n state.raise(\"Invalid class escape\");\n }\n state.raise(\"Invalid escape\");\n }\n state.pos = start;\n }\n\n var ch = state.current();\n if (ch !== 0x5D /* ] */) {\n state.lastIntValue = ch;\n state.advance();\n return true\n }\n\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassEscape\n pp$1.regexp_eatClassEscape = function(state) {\n var start = state.pos;\n\n if (state.eat(0x62 /* b */)) {\n state.lastIntValue = 0x08; /* <BS> */\n return true\n }\n\n if (state.switchU && state.eat(0x2D /* - */)) {\n state.lastIntValue = 0x2D; /* - */\n return true\n }\n\n if (!state.switchU && state.eat(0x63 /* c */)) {\n if (this.regexp_eatClassControlLetter(state)) {\n return true\n }\n state.pos = start;\n }\n\n return (\n this.regexp_eatCharacterClassEscape(state) ||\n this.regexp_eatCharacterEscape(state)\n )\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassControlLetter\n pp$1.regexp_eatClassControlLetter = function(state) {\n var ch = state.current();\n if (isDecimalDigit(ch) || ch === 0x5F /* _ */) {\n state.lastIntValue = ch % 0x20;\n state.advance();\n return true\n }\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence\n pp$1.regexp_eatHexEscapeSequence = function(state) {\n var start = state.pos;\n if (state.eat(0x78 /* x */)) {\n if (this.regexp_eatFixedHexDigits(state, 2)) {\n return true\n }\n if (state.switchU) {\n state.raise(\"Invalid escape\");\n }\n state.pos = start;\n }\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalDigits\n pp$1.regexp_eatDecimalDigits = function(state) {\n var start = state.pos;\n var ch = 0;\n state.lastIntValue = 0;\n while (isDecimalDigit(ch = state.current())) {\n state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */);\n state.advance();\n }\n return state.pos !== start\n };\n function isDecimalDigit(ch) {\n return ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */\n }\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigits\n pp$1.regexp_eatHexDigits = function(state) {\n var start = state.pos;\n var ch = 0;\n state.lastIntValue = 0;\n while (isHexDigit(ch = state.current())) {\n state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch);\n state.advance();\n }\n return state.pos !== start\n };\n function isHexDigit(ch) {\n return (\n (ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */) ||\n (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) ||\n (ch >= 0x61 /* a */ && ch <= 0x66 /* f */)\n )\n }\n function hexToInt(ch) {\n if (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) {\n return 10 + (ch - 0x41 /* A */)\n }\n if (ch >= 0x61 /* a */ && ch <= 0x66 /* f */) {\n return 10 + (ch - 0x61 /* a */)\n }\n return ch - 0x30 /* 0 */\n }\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-LegacyOctalEscapeSequence\n // Allows only 0-377(octal) i.e. 0-255(decimal).\n pp$1.regexp_eatLegacyOctalEscapeSequence = function(state) {\n if (this.regexp_eatOctalDigit(state)) {\n var n1 = state.lastIntValue;\n if (this.regexp_eatOctalDigit(state)) {\n var n2 = state.lastIntValue;\n if (n1 <= 3 && this.regexp_eatOctalDigit(state)) {\n state.lastIntValue = n1 * 64 + n2 * 8 + state.lastIntValue;\n } else {\n state.lastIntValue = n1 * 8 + n2;\n }\n } else {\n state.lastIntValue = n1;\n }\n return true\n }\n return false\n };\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-OctalDigit\n pp$1.regexp_eatOctalDigit = function(state) {\n var ch = state.current();\n if (isOctalDigit(ch)) {\n state.lastIntValue = ch - 0x30; /* 0 */\n state.advance();\n return true\n }\n state.lastIntValue = 0;\n return false\n };\n function isOctalDigit(ch) {\n return ch >= 0x30 /* 0 */ && ch <= 0x37 /* 7 */\n }\n\n // https://www.ecma-international.org/ecma-262/8.0/#prod-Hex4Digits\n // https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigit\n // And HexDigit HexDigit in https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence\n pp$1.regexp_eatFixedHexDigits = function(state, length) {\n var start = state.pos;\n state.lastIntValue = 0;\n for (var i = 0; i < length; ++i) {\n var ch = state.current();\n if (!isHexDigit(ch)) {\n state.pos = start;\n return false\n }\n state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch);\n state.advance();\n }\n return true\n };\n\n // Object type used to represent tokens. Note that normally, tokens\n // simply exist as properties on the parser object. This is only\n // used for the onToken callback and the external tokenizer.\n\n var Token = function Token(p) {\n this.type = p.type;\n this.value = p.value;\n this.start = p.start;\n this.end = p.end;\n if (p.options.locations)\n { this.loc = new SourceLocation(p, p.startLoc, p.endLoc); }\n if (p.options.ranges)\n { this.range = [p.start, p.end]; }\n };\n\n // ## Tokenizer\n\n var pp = Parser.prototype;\n\n // Move to the next token\n\n pp.next = function(ignoreEscapeSequenceInKeyword) {\n if (!ignoreEscapeSequenceInKeyword && this.type.keyword && this.containsEsc)\n { this.raiseRecoverable(this.start, \"Escape sequence in keyword \" + this.type.keyword); }\n if (this.options.onToken)\n { this.options.onToken(new Token(this)); }\n\n this.lastTokEnd = this.end;\n this.lastTokStart = this.start;\n this.lastTokEndLoc = this.endLoc;\n this.lastTokStartLoc = this.startLoc;\n this.nextToken();\n };\n\n pp.getToken = function() {\n this.next();\n return new Token(this)\n };\n\n // If we're in an ES6 environment, make parsers iterable\n if (typeof Symbol !== \"undefined\")\n { pp[Symbol.iterator] = function() {\n var this$1$1 = this;\n\n return {\n next: function () {\n var token = this$1$1.getToken();\n return {\n done: token.type === types$1.eof,\n value: token\n }\n }\n }\n }; }\n\n // Toggle strict mode. Re-reads the next number or string to please\n // pedantic tests (`\"use strict\"; 010;` should fail).\n\n // Read a single token, updating the parser object's token-related\n // properties.\n\n pp.nextToken = function() {\n var curContext = this.curContext();\n if (!curContext || !curContext.preserveSpace) { this.skipSpace(); }\n\n this.start = this.pos;\n if (this.options.locations) { this.startLoc = this.curPosition(); }\n if (this.pos >= this.input.length) { return this.finishToken(types$1.eof) }\n\n if (curContext.override) { return curContext.override(this) }\n else { this.readToken(this.fullCharCodeAtPos()); }\n };\n\n pp.readToken = function(code) {\n // Identifier or keyword. '\\uXXXX' sequences are allowed in\n // identifiers, so '\\' also dispatches to that.\n if (isIdentifierStart(code, this.options.ecmaVersion >= 6) || code === 92 /* '\\' */)\n { return this.readWord() }\n\n return this.getTokenFromCode(code)\n };\n\n pp.fullCharCodeAtPos = function() {\n var code = this.input.charCodeAt(this.pos);\n if (code <= 0xd7ff || code >= 0xdc00) { return code }\n var next = this.input.charCodeAt(this.pos + 1);\n return next <= 0xdbff || next >= 0xe000 ? code : (code << 10) + next - 0x35fdc00\n };\n\n pp.skipBlockComment = function() {\n var startLoc = this.options.onComment && this.curPosition();\n var start = this.pos, end = this.input.indexOf(\"*/\", this.pos += 2);\n if (end === -1) { this.raise(this.pos - 2, \"Unterminated comment\"); }\n this.pos = end + 2;\n if (this.options.locations) {\n for (var nextBreak = (void 0), pos = start; (nextBreak = nextLineBreak(this.input, pos, this.pos)) > -1;) {\n ++this.curLine;\n pos = this.lineStart = nextBreak;\n }\n }\n if (this.options.onComment)\n { this.options.onComment(true, this.input.slice(start + 2, end), start, this.pos,\n startLoc, this.curPosition()); }\n };\n\n pp.skipLineComment = function(startSkip) {\n var start = this.pos;\n var startLoc = this.options.onComment && this.curPosition();\n var ch = this.input.charCodeAt(this.pos += startSkip);\n while (this.pos < this.input.length && !isNewLine(ch)) {\n ch = this.input.charCodeAt(++this.pos);\n }\n if (this.options.onComment)\n { this.options.onComment(false, this.input.slice(start + startSkip, this.pos), start, this.pos,\n startLoc, this.curPosition()); }\n };\n\n // Called at the start of the parse and after every token. Skips\n // whitespace and comments, and.\n\n pp.skipSpace = function() {\n loop: while (this.pos < this.input.length) {\n var ch = this.input.charCodeAt(this.pos);\n switch (ch) {\n case 32: case 160: // ' '\n ++this.pos;\n break\n case 13:\n if (this.input.charCodeAt(this.pos + 1) === 10) {\n ++this.pos;\n }\n case 10: case 8232: case 8233:\n ++this.pos;\n if (this.options.locations) {\n ++this.curLine;\n this.lineStart = this.pos;\n }\n break\n case 47: // '/'\n switch (this.input.charCodeAt(this.pos + 1)) {\n case 42: // '*'\n this.skipBlockComment();\n break\n case 47:\n this.skipLineComment(2);\n break\n default:\n break loop\n }\n break\n default:\n if (ch > 8 && ch < 14 || ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) {\n ++this.pos;\n } else {\n break loop\n }\n }\n }\n };\n\n // Called at the end of every token. Sets `end`, `val`, and\n // maintains `context` and `exprAllowed`, and skips the space after\n // the token, so that the next one's `start` will point at the\n // right position.\n\n pp.finishToken = function(type, val) {\n this.end = this.pos;\n if (this.options.locations) { this.endLoc = this.curPosition(); }\n var prevType = this.type;\n this.type = type;\n this.value = val;\n\n this.updateContext(prevType);\n };\n\n // ### Token reading\n\n // This is the function that is called to fetch the next token. It\n // is somewhat obscure, because it works in character codes rather\n // than characters, and because operator parsing has been inlined\n // into it.\n //\n // All in the name of speed.\n //\n pp.readToken_dot = function() {\n var next = this.input.charCodeAt(this.pos + 1);\n if (next >= 48 && next <= 57) { return this.readNumber(true) }\n var next2 = this.input.charCodeAt(this.pos + 2);\n if (this.options.ecmaVersion >= 6 && next === 46 && next2 === 46) { // 46 = dot '.'\n this.pos += 3;\n return this.finishToken(types$1.ellipsis)\n } else {\n ++this.pos;\n return this.finishToken(types$1.dot)\n }\n };\n\n pp.readToken_slash = function() { // '/'\n var next = this.input.charCodeAt(this.pos + 1);\n if (this.exprAllowed) { ++this.pos; return this.readRegexp() }\n if (next === 61) { return this.finishOp(types$1.assign, 2) }\n return this.finishOp(types$1.slash, 1)\n };\n\n pp.readToken_mult_modulo_exp = function(code) { // '%*'\n var next = this.input.charCodeAt(this.pos + 1);\n var size = 1;\n var tokentype = code === 42 ? types$1.star : types$1.modulo;\n\n // exponentiation operator ** and **=\n if (this.options.ecmaVersion >= 7 && code === 42 && next === 42) {\n ++size;\n tokentype = types$1.starstar;\n next = this.input.charCodeAt(this.pos + 2);\n }\n\n if (next === 61) { return this.finishOp(types$1.assign, size + 1) }\n return this.finishOp(tokentype, size)\n };\n\n pp.readToken_pipe_amp = function(code) { // '|&'\n var next = this.input.charCodeAt(this.pos + 1);\n if (next === code) {\n if (this.options.ecmaVersion >= 12) {\n var next2 = this.input.charCodeAt(this.pos + 2);\n if (next2 === 61) { return this.finishOp(types$1.assign, 3) }\n }\n return this.finishOp(code === 124 ? types$1.logicalOR : types$1.logicalAND, 2)\n }\n if (next === 61) { return this.finishOp(types$1.assign, 2) }\n return this.finishOp(code === 124 ? types$1.bitwiseOR : types$1.bitwiseAND, 1)\n };\n\n pp.readToken_caret = function() { // '^'\n var next = this.input.charCodeAt(this.pos + 1);\n if (next === 61) { return this.finishOp(types$1.assign, 2) }\n return this.finishOp(types$1.bitwiseXOR, 1)\n };\n\n pp.readToken_plus_min = function(code) { // '+-'\n var next = this.input.charCodeAt(this.pos + 1);\n if (next === code) {\n if (next === 45 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 62 &&\n (this.lastTokEnd === 0 || lineBreak.test(this.input.slice(this.lastTokEnd, this.pos)))) {\n // A `-->` line comment\n this.skipLineComment(3);\n this.skipSpace();\n return this.nextToken()\n }\n return this.finishOp(types$1.incDec, 2)\n }\n if (next === 61) { return this.finishOp(types$1.assign, 2) }\n return this.finishOp(types$1.plusMin, 1)\n };\n\n pp.readToken_lt_gt = function(code) { // '<>'\n var next = this.input.charCodeAt(this.pos + 1);\n var size = 1;\n if (next === code) {\n size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2;\n if (this.input.charCodeAt(this.pos + size) === 61) { return this.finishOp(types$1.assign, size + 1) }\n return this.finishOp(types$1.bitShift, size)\n }\n if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 &&\n this.input.charCodeAt(this.pos + 3) === 45) {\n // `<!--`, an XML-style comment that should be interpreted as a line comment\n this.skipLineComment(4);\n this.skipSpace();\n return this.nextToken()\n }\n if (next === 61) { size = 2; }\n return this.finishOp(types$1.relational, size)\n };\n\n pp.readToken_eq_excl = function(code) { // '=!'\n var next = this.input.charCodeAt(this.pos + 1);\n if (next === 61) { return this.finishOp(types$1.equality, this.input.charCodeAt(this.pos + 2) === 61 ? 3 : 2) }\n if (code === 61 && next === 62 && this.options.ecmaVersion >= 6) { // '=>'\n this.pos += 2;\n return this.finishToken(types$1.arrow)\n }\n return this.finishOp(code === 61 ? types$1.eq : types$1.prefix, 1)\n };\n\n pp.readToken_question = function() { // '?'\n var ecmaVersion = this.options.ecmaVersion;\n if (ecmaVersion >= 11) {\n var next = this.input.charCodeAt(this.pos + 1);\n if (next === 46) {\n var next2 = this.input.charCodeAt(this.pos + 2);\n if (next2 < 48 || next2 > 57) { return this.finishOp(types$1.questionDot, 2) }\n }\n if (next === 63) {\n if (ecmaVersion >= 12) {\n var next2$1 = this.input.charCodeAt(this.pos + 2);\n if (next2$1 === 61) { return this.finishOp(types$1.assign, 3) }\n }\n return this.finishOp(types$1.coalesce, 2)\n }\n }\n return this.finishOp(types$1.question, 1)\n };\n\n pp.readToken_numberSign = function() { // '#'\n var ecmaVersion = this.options.ecmaVersion;\n var code = 35; // '#'\n if (ecmaVersion >= 13) {\n ++this.pos;\n code = this.fullCharCodeAtPos();\n if (isIdentifierStart(code, true) || code === 92 /* '\\' */) {\n return this.finishToken(types$1.privateId, this.readWord1())\n }\n }\n\n this.raise(this.pos, \"Unexpected character '\" + codePointToString(code) + \"'\");\n };\n\n pp.getTokenFromCode = function(code) {\n switch (code) {\n // The interpretation of a dot depends on whether it is followed\n // by a digit or another two dots.\n case 46: // '.'\n return this.readToken_dot()\n\n // Punctuation tokens.\n case 40: ++this.pos; return this.finishToken(types$1.parenL)\n case 41: ++this.pos; return this.finishToken(types$1.parenR)\n case 59: ++this.pos; return this.finishToken(types$1.semi)\n case 44: ++this.pos; return this.finishToken(types$1.comma)\n case 91: ++this.pos; return this.finishToken(types$1.bracketL)\n case 93: ++this.pos; return this.finishToken(types$1.bracketR)\n case 123: ++this.pos; return this.finishToken(types$1.braceL)\n case 125: ++this.pos; return this.finishToken(types$1.braceR)\n case 58: ++this.pos; return this.finishToken(types$1.colon)\n\n case 96: // '`'\n if (this.options.ecmaVersion < 6) { break }\n ++this.pos;\n return this.finishToken(types$1.backQuote)\n\n case 48: // '0'\n var next = this.input.charCodeAt(this.pos + 1);\n if (next === 120 || next === 88) { return this.readRadixNumber(16) } // '0x', '0X' - hex number\n if (this.options.ecmaVersion >= 6) {\n if (next === 111 || next === 79) { return this.readRadixNumber(8) } // '0o', '0O' - octal number\n if (next === 98 || next === 66) { return this.readRadixNumber(2) } // '0b', '0B' - binary number\n }\n\n // Anything else beginning with a digit is an integer, octal\n // number, or float.\n case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: // 1-9\n return this.readNumber(false)\n\n // Quotes produce strings.\n case 34: case 39: // '\"', \"'\"\n return this.readString(code)\n\n // Operators are parsed inline in tiny state machines. '=' (61) is\n // often referred to. `finishOp` simply skips the amount of\n // characters it is given as second argument, and returns a token\n // of the type given by its first argument.\n case 47: // '/'\n return this.readToken_slash()\n\n case 37: case 42: // '%*'\n return this.readToken_mult_modulo_exp(code)\n\n case 124: case 38: // '|&'\n return this.readToken_pipe_amp(code)\n\n case 94: // '^'\n return this.readToken_caret()\n\n case 43: case 45: // '+-'\n return this.readToken_plus_min(code)\n\n case 60: case 62: // '<>'\n return this.readToken_lt_gt(code)\n\n case 61: case 33: // '=!'\n return this.readToken_eq_excl(code)\n\n case 63: // '?'\n return this.readToken_question()\n\n case 126: // '~'\n return this.finishOp(types$1.prefix, 1)\n\n case 35: // '#'\n return this.readToken_numberSign()\n }\n\n this.raise(this.pos, \"Unexpected character '\" + codePointToString(code) + \"'\");\n };\n\n pp.finishOp = function(type, size) {\n var str = this.input.slice(this.pos, this.pos + size);\n this.pos += size;\n return this.finishToken(type, str)\n };\n\n pp.readRegexp = function() {\n var escaped, inClass, start = this.pos;\n for (;;) {\n if (this.pos >= this.input.length) { this.raise(start, \"Unterminated regular expression\"); }\n var ch = this.input.charAt(this.pos);\n if (lineBreak.test(ch)) { this.raise(start, \"Unterminated regular expression\"); }\n if (!escaped) {\n if (ch === \"[\") { inClass = true; }\n else if (ch === \"]\" && inClass) { inClass = false; }\n else if (ch === \"/\" && !inClass) { break }\n escaped = ch === \"\\\\\";\n } else { escaped = false; }\n ++this.pos;\n }\n var pattern = this.input.slice(start, this.pos);\n ++this.pos;\n var flagsStart = this.pos;\n var flags = this.readWord1();\n if (this.containsEsc) { this.unexpected(flagsStart); }\n\n // Validate pattern\n var state = this.regexpState || (this.regexpState = new RegExpValidationState(this));\n state.reset(start, pattern, flags);\n this.validateRegExpFlags(state);\n this.validateRegExpPattern(state);\n\n // Create Literal#value property value.\n var value = null;\n try {\n value = new RegExp(pattern, flags);\n } catch (e) {\n // ESTree requires null if it failed to instantiate RegExp object.\n // https://github.com/estree/estree/blob/a27003adf4fd7bfad44de9cef372a2eacd527b1c/es5.md#regexpliteral\n }\n\n return this.finishToken(types$1.regexp, {pattern: pattern, flags: flags, value: value})\n };\n\n // Read an integer in the given radix. Return null if zero digits\n // were read, the integer value otherwise. When `len` is given, this\n // will return `null` unless the integer has exactly `len` digits.\n\n pp.readInt = function(radix, len, maybeLegacyOctalNumericLiteral) {\n // `len` is used for character escape sequences. In that case, disallow separators.\n var allowSeparators = this.options.ecmaVersion >= 12 && len === undefined;\n\n // `maybeLegacyOctalNumericLiteral` is true if it doesn't have prefix (0x,0o,0b)\n // and isn't fraction part nor exponent part. In that case, if the first digit\n // is zero then disallow separators.\n var isLegacyOctalNumericLiteral = maybeLegacyOctalNumericLiteral && this.input.charCodeAt(this.pos) === 48;\n\n var start = this.pos, total = 0, lastCode = 0;\n for (var i = 0, e = len == null ? Infinity : len; i < e; ++i, ++this.pos) {\n var code = this.input.charCodeAt(this.pos), val = (void 0);\n\n if (allowSeparators && code === 95) {\n if (isLegacyOctalNumericLiteral) { this.raiseRecoverable(this.pos, \"Numeric separator is not allowed in legacy octal numeric literals\"); }\n if (lastCode === 95) { this.raiseRecoverable(this.pos, \"Numeric separator must be exactly one underscore\"); }\n if (i === 0) { this.raiseRecoverable(this.pos, \"Numeric separator is not allowed at the first of digits\"); }\n lastCode = code;\n continue\n }\n\n if (code >= 97) { val = code - 97 + 10; } // a\n else if (code >= 65) { val = code - 65 + 10; } // A\n else if (code >= 48 && code <= 57) { val = code - 48; } // 0-9\n else { val = Infinity; }\n if (val >= radix) { break }\n lastCode = code;\n total = total * radix + val;\n }\n\n if (allowSeparators && lastCode === 95) { this.raiseRecoverable(this.pos - 1, \"Numeric separator is not allowed at the last of digits\"); }\n if (this.pos === start || len != null && this.pos - start !== len) { return null }\n\n return total\n };\n\n function stringToNumber(str, isLegacyOctalNumericLiteral) {\n if (isLegacyOctalNumericLiteral) {\n return parseInt(str, 8)\n }\n\n // `parseFloat(value)` stops parsing at the first numeric separator then returns a wrong value.\n return parseFloat(str.replace(/_/g, \"\"))\n }\n\n function stringToBigInt(str) {\n if (typeof BigInt !== \"function\") {\n return null\n }\n\n // `BigInt(value)` throws syntax error if the string contains numeric separators.\n return BigInt(str.replace(/_/g, \"\"))\n }\n\n pp.readRadixNumber = function(radix) {\n var start = this.pos;\n this.pos += 2; // 0x\n var val = this.readInt(radix);\n if (val == null) { this.raise(this.start + 2, \"Expected number in radix \" + radix); }\n if (this.options.ecmaVersion >= 11 && this.input.charCodeAt(this.pos) === 110) {\n val = stringToBigInt(this.input.slice(start, this.pos));\n ++this.pos;\n } else if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, \"Identifier directly after number\"); }\n return this.finishToken(types$1.num, val)\n };\n\n // Read an integer, octal integer, or floating-point number.\n\n pp.readNumber = function(startsWithDot) {\n var start = this.pos;\n if (!startsWithDot && this.readInt(10, undefined, true) === null) { this.raise(start, \"Invalid number\"); }\n var octal = this.pos - start >= 2 && this.input.charCodeAt(start) === 48;\n if (octal && this.strict) { this.raise(start, \"Invalid number\"); }\n var next = this.input.charCodeAt(this.pos);\n if (!octal && !startsWithDot && this.options.ecmaVersion >= 11 && next === 110) {\n var val$1 = stringToBigInt(this.input.slice(start, this.pos));\n ++this.pos;\n if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, \"Identifier directly after number\"); }\n return this.finishToken(types$1.num, val$1)\n }\n if (octal && /[89]/.test(this.input.slice(start, this.pos))) { octal = false; }\n if (next === 46 && !octal) { // '.'\n ++this.pos;\n this.readInt(10);\n next = this.input.charCodeAt(this.pos);\n }\n if ((next === 69 || next === 101) && !octal) { // 'eE'\n next = this.input.charCodeAt(++this.pos);\n if (next === 43 || next === 45) { ++this.pos; } // '+-'\n if (this.readInt(10) === null) { this.raise(start, \"Invalid number\"); }\n }\n if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, \"Identifier directly after number\"); }\n\n var val = stringToNumber(this.input.slice(start, this.pos), octal);\n return this.finishToken(types$1.num, val)\n };\n\n // Read a string value, interpreting backslash-escapes.\n\n pp.readCodePoint = function() {\n var ch = this.input.charCodeAt(this.pos), code;\n\n if (ch === 123) { // '{'\n if (this.options.ecmaVersion < 6) { this.unexpected(); }\n var codePos = ++this.pos;\n code = this.readHexChar(this.input.indexOf(\"}\", this.pos) - this.pos);\n ++this.pos;\n if (code > 0x10FFFF) { this.invalidStringToken(codePos, \"Code point out of bounds\"); }\n } else {\n code = this.readHexChar(4);\n }\n return code\n };\n\n pp.readString = function(quote) {\n var out = \"\", chunkStart = ++this.pos;\n for (;;) {\n if (this.pos >= this.input.length) { this.raise(this.start, \"Unterminated string constant\"); }\n var ch = this.input.charCodeAt(this.pos);\n if (ch === quote) { break }\n if (ch === 92) { // '\\'\n out += this.input.slice(chunkStart, this.pos);\n out += this.readEscapedChar(false);\n chunkStart = this.pos;\n } else if (ch === 0x2028 || ch === 0x2029) {\n if (this.options.ecmaVersion < 10) { this.raise(this.start, \"Unterminated string constant\"); }\n ++this.pos;\n if (this.options.locations) {\n this.curLine++;\n this.lineStart = this.pos;\n }\n } else {\n if (isNewLine(ch)) { this.raise(this.start, \"Unterminated string constant\"); }\n ++this.pos;\n }\n }\n out += this.input.slice(chunkStart, this.pos++);\n return this.finishToken(types$1.string, out)\n };\n\n // Reads template string tokens.\n\n var INVALID_TEMPLATE_ESCAPE_ERROR = {};\n\n pp.tryReadTemplateToken = function() {\n this.inTemplateElement = true;\n try {\n this.readTmplToken();\n } catch (err) {\n if (err === INVALID_TEMPLATE_ESCAPE_ERROR) {\n this.readInvalidTemplateToken();\n } else {\n throw err\n }\n }\n\n this.inTemplateElement = false;\n };\n\n pp.invalidStringToken = function(position, message) {\n if (this.inTemplateElement && this.options.ecmaVersion >= 9) {\n throw INVALID_TEMPLATE_ESCAPE_ERROR\n } else {\n this.raise(position, message);\n }\n };\n\n pp.readTmplToken = function() {\n var out = \"\", chunkStart = this.pos;\n for (;;) {\n if (this.pos >= this.input.length) { this.raise(this.start, \"Unterminated template\"); }\n var ch = this.input.charCodeAt(this.pos);\n if (ch === 96 || ch === 36 && this.input.charCodeAt(this.pos + 1) === 123) { // '`', '${'\n if (this.pos === this.start && (this.type === types$1.template || this.type === types$1.invalidTemplate)) {\n if (ch === 36) {\n this.pos += 2;\n return this.finishToken(types$1.dollarBraceL)\n } else {\n ++this.pos;\n return this.finishToken(types$1.backQuote)\n }\n }\n out += this.input.slice(chunkStart, this.pos);\n return this.finishToken(types$1.template, out)\n }\n if (ch === 92) { // '\\'\n out += this.input.slice(chunkStart, this.pos);\n out += this.readEscapedChar(true);\n chunkStart = this.pos;\n } else if (isNewLine(ch)) {\n out += this.input.slice(chunkStart, this.pos);\n ++this.pos;\n switch (ch) {\n case 13:\n if (this.input.charCodeAt(this.pos) === 10) { ++this.pos; }\n case 10:\n out += \"\\n\";\n break\n default:\n out += String.fromCharCode(ch);\n break\n }\n if (this.options.locations) {\n ++this.curLine;\n this.lineStart = this.pos;\n }\n chunkStart = this.pos;\n } else {\n ++this.pos;\n }\n }\n };\n\n // Reads a template token to search for the end, without validating any escape sequences\n pp.readInvalidTemplateToken = function() {\n for (; this.pos < this.input.length; this.pos++) {\n switch (this.input[this.pos]) {\n case \"\\\\\":\n ++this.pos;\n break\n\n case \"$\":\n if (this.input[this.pos + 1] !== \"{\") {\n break\n }\n\n // falls through\n case \"`\":\n return this.finishToken(types$1.invalidTemplate, this.input.slice(this.start, this.pos))\n\n // no default\n }\n }\n this.raise(this.start, \"Unterminated template\");\n };\n\n // Used to read escaped characters\n\n pp.readEscapedChar = function(inTemplate) {\n var ch = this.input.charCodeAt(++this.pos);\n ++this.pos;\n switch (ch) {\n case 110: return \"\\n\" // 'n' -> '\\n'\n case 114: return \"\\r\" // 'r' -> '\\r'\n case 120: return String.fromCharCode(this.readHexChar(2)) // 'x'\n case 117: return codePointToString(this.readCodePoint()) // 'u'\n case 116: return \"\\t\" // 't' -> '\\t'\n case 98: return \"\\b\" // 'b' -> '\\b'\n case 118: return \"\\u000b\" // 'v' -> '\\u000b'\n case 102: return \"\\f\" // 'f' -> '\\f'\n case 13: if (this.input.charCodeAt(this.pos) === 10) { ++this.pos; } // '\\r\\n'\n case 10: // ' \\n'\n if (this.options.locations) { this.lineStart = this.pos; ++this.curLine; }\n return \"\"\n case 56:\n case 57:\n if (this.strict) {\n this.invalidStringToken(\n this.pos - 1,\n \"Invalid escape sequence\"\n );\n }\n if (inTemplate) {\n var codePos = this.pos - 1;\n\n this.invalidStringToken(\n codePos,\n \"Invalid escape sequence in template string\"\n );\n\n return null\n }\n default:\n if (ch >= 48 && ch <= 55) {\n var octalStr = this.input.substr(this.pos - 1, 3).match(/^[0-7]+/)[0];\n var octal = parseInt(octalStr, 8);\n if (octal > 255) {\n octalStr = octalStr.slice(0, -1);\n octal = parseInt(octalStr, 8);\n }\n this.pos += octalStr.length - 1;\n ch = this.input.charCodeAt(this.pos);\n if ((octalStr !== \"0\" || ch === 56 || ch === 57) && (this.strict || inTemplate)) {\n this.invalidStringToken(\n this.pos - 1 - octalStr.length,\n inTemplate\n ? \"Octal literal in template string\"\n : \"Octal literal in strict mode\"\n );\n }\n return String.fromCharCode(octal)\n }\n if (isNewLine(ch)) {\n // Unicode new line characters after \\ get removed from output in both\n // template literals and strings\n return \"\"\n }\n return String.fromCharCode(ch)\n }\n };\n\n // Used to read character escape sequences ('\\x', '\\u', '\\U').\n\n pp.readHexChar = function(len) {\n var codePos = this.pos;\n var n = this.readInt(16, len);\n if (n === null) { this.invalidStringToken(codePos, \"Bad character escape sequence\"); }\n return n\n };\n\n // Read an identifier, and return it as a string. Sets `this.containsEsc`\n // to whether the word contained a '\\u' escape.\n //\n // Incrementally adds only escaped chars, adding other chunks as-is\n // as a micro-optimization.\n\n pp.readWord1 = function() {\n this.containsEsc = false;\n var word = \"\", first = true, chunkStart = this.pos;\n var astral = this.options.ecmaVersion >= 6;\n while (this.pos < this.input.length) {\n var ch = this.fullCharCodeAtPos();\n if (isIdentifierChar(ch, astral)) {\n this.pos += ch <= 0xffff ? 1 : 2;\n } else if (ch === 92) { // \"\\\"\n this.containsEsc = true;\n word += this.input.slice(chunkStart, this.pos);\n var escStart = this.pos;\n if (this.input.charCodeAt(++this.pos) !== 117) // \"u\"\n { this.invalidStringToken(this.pos, \"Expecting Unicode escape sequence \\\\uXXXX\"); }\n ++this.pos;\n var esc = this.readCodePoint();\n if (!(first ? isIdentifierStart : isIdentifierChar)(esc, astral))\n { this.invalidStringToken(escStart, \"Invalid Unicode escape\"); }\n word += codePointToString(esc);\n chunkStart = this.pos;\n } else {\n break\n }\n first = false;\n }\n return word + this.input.slice(chunkStart, this.pos)\n };\n\n // Read an identifier or keyword token. Will check for reserved\n // words when necessary.\n\n pp.readWord = function() {\n var word = this.readWord1();\n var type = types$1.name;\n if (this.keywords.test(word)) {\n type = keywords[word];\n }\n return this.finishToken(type, word)\n };\n\n // Acorn is a tiny, fast JavaScript parser written in JavaScript.\n\n var version = \"8.8.1\";\n\n Parser.acorn = {\n Parser: Parser,\n version: version,\n defaultOptions: defaultOptions,\n Position: Position,\n SourceLocation: SourceLocation,\n getLineInfo: getLineInfo,\n Node: Node,\n TokenType: TokenType,\n tokTypes: types$1,\n keywordTypes: keywords,\n TokContext: TokContext,\n tokContexts: types,\n isIdentifierChar: isIdentifierChar,\n isIdentifierStart: isIdentifierStart,\n Token: Token,\n isNewLine: isNewLine,\n lineBreak: lineBreak,\n lineBreakG: lineBreakG,\n nonASCIIwhitespace: nonASCIIwhitespace\n };\n\n // The main exported interface (under `self.acorn` when in the\n // browser) is a `parse` function that takes a code string and\n // returns an abstract syntax tree as specified by [Mozilla parser\n // API][api].\n //\n // [api]: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API\n\n function parse(input, options) {\n return Parser.parse(input, options)\n }\n\n // This function tries to parse a single expression at a given\n // offset in a string. Useful for parsing mixed-language formats\n // that embed JavaScript expressions.\n\n function parseExpressionAt(input, pos, options) {\n return Parser.parseExpressionAt(input, pos, options)\n }\n\n // Acorn is organized as a tokenizer and a recursive-descent parser.\n // The `tokenizer` export provides an interface to the tokenizer.\n\n function tokenizer(input, options) {\n return Parser.tokenizer(input, options)\n }\n\n exports.Node = Node;\n exports.Parser = Parser;\n exports.Position = Position;\n exports.SourceLocation = SourceLocation;\n exports.TokContext = TokContext;\n exports.Token = Token;\n exports.TokenType = TokenType;\n exports.defaultOptions = defaultOptions;\n exports.getLineInfo = getLineInfo;\n exports.isIdentifierChar = isIdentifierChar;\n exports.isIdentifierStart = isIdentifierStart;\n exports.isNewLine = isNewLine;\n exports.keywordTypes = keywords;\n exports.lineBreak = lineBreak;\n exports.lineBreakG = lineBreakG;\n exports.nonASCIIwhitespace = nonASCIIwhitespace;\n exports.parse = parse;\n exports.parseExpressionAt = parseExpressionAt;\n exports.tokContexts = types;\n exports.tokTypes = types$1;\n exports.tokenizer = tokenizer;\n exports.version = version;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n", "module.exports = {\n quot: '\\u0022',\n amp: '&',\n apos: '\\u0027',\n lt: '<',\n gt: '>',\n nbsp: '\\u00A0',\n iexcl: '\\u00A1',\n cent: '\\u00A2',\n pound: '\\u00A3',\n curren: '\\u00A4',\n yen: '\\u00A5',\n brvbar: '\\u00A6',\n sect: '\\u00A7',\n uml: '\\u00A8',\n copy: '\\u00A9',\n ordf: '\\u00AA',\n laquo: '\\u00AB',\n not: '\\u00AC',\n shy: '\\u00AD',\n reg: '\\u00AE',\n macr: '\\u00AF',\n deg: '\\u00B0',\n plusmn: '\\u00B1',\n sup2: '\\u00B2',\n sup3: '\\u00B3',\n acute: '\\u00B4',\n micro: '\\u00B5',\n para: '\\u00B6',\n middot: '\\u00B7',\n cedil: '\\u00B8',\n sup1: '\\u00B9',\n ordm: '\\u00BA',\n raquo: '\\u00BB',\n frac14: '\\u00BC',\n frac12: '\\u00BD',\n frac34: '\\u00BE',\n iquest: '\\u00BF',\n Agrave: '\\u00C0',\n Aacute: '\\u00C1',\n Acirc: '\\u00C2',\n Atilde: '\\u00C3',\n Auml: '\\u00C4',\n Aring: '\\u00C5',\n AElig: '\\u00C6',\n Ccedil: '\\u00C7',\n Egrave: '\\u00C8',\n Eacute: '\\u00C9',\n Ecirc: '\\u00CA',\n Euml: '\\u00CB',\n Igrave: '\\u00CC',\n Iacute: '\\u00CD',\n Icirc: '\\u00CE',\n Iuml: '\\u00CF',\n ETH: '\\u00D0',\n Ntilde: '\\u00D1',\n Ograve: '\\u00D2',\n Oacute: '\\u00D3',\n Ocirc: '\\u00D4',\n Otilde: '\\u00D5',\n Ouml: '\\u00D6',\n times: '\\u00D7',\n Oslash: '\\u00D8',\n Ugrave: '\\u00D9',\n Uacute: '\\u00DA',\n Ucirc: '\\u00DB',\n Uuml: '\\u00DC',\n Yacute: '\\u00DD',\n THORN: '\\u00DE',\n szlig: '\\u00DF',\n agrave: '\\u00E0',\n aacute: '\\u00E1',\n acirc: '\\u00E2',\n atilde: '\\u00E3',\n auml: '\\u00E4',\n aring: '\\u00E5',\n aelig: '\\u00E6',\n ccedil: '\\u00E7',\n egrave: '\\u00E8',\n eacute: '\\u00E9',\n ecirc: '\\u00EA',\n euml: '\\u00EB',\n igrave: '\\u00EC',\n iacute: '\\u00ED',\n icirc: '\\u00EE',\n iuml: '\\u00EF',\n eth: '\\u00F0',\n ntilde: '\\u00F1',\n ograve: '\\u00F2',\n oacute: '\\u00F3',\n ocirc: '\\u00F4',\n otilde: '\\u00F5',\n ouml: '\\u00F6',\n divide: '\\u00F7',\n oslash: '\\u00F8',\n ugrave: '\\u00F9',\n uacute: '\\u00FA',\n ucirc: '\\u00FB',\n uuml: '\\u00FC',\n yacute: '\\u00FD',\n thorn: '\\u00FE',\n yuml: '\\u00FF',\n OElig: '\\u0152',\n oelig: '\\u0153',\n Scaron: '\\u0160',\n scaron: '\\u0161',\n Yuml: '\\u0178',\n fnof: '\\u0192',\n circ: '\\u02C6',\n tilde: '\\u02DC',\n Alpha: '\\u0391',\n Beta: '\\u0392',\n Gamma: '\\u0393',\n Delta: '\\u0394',\n Epsilon: '\\u0395',\n Zeta: '\\u0396',\n Eta: '\\u0397',\n Theta: '\\u0398',\n Iota: '\\u0399',\n Kappa: '\\u039A',\n Lambda: '\\u039B',\n Mu: '\\u039C',\n Nu: '\\u039D',\n Xi: '\\u039E',\n Omicron: '\\u039F',\n Pi: '\\u03A0',\n Rho: '\\u03A1',\n Sigma: '\\u03A3',\n Tau: '\\u03A4',\n Upsilon: '\\u03A5',\n Phi: '\\u03A6',\n Chi: '\\u03A7',\n Psi: '\\u03A8',\n Omega: '\\u03A9',\n alpha: '\\u03B1',\n beta: '\\u03B2',\n gamma: '\\u03B3',\n delta: '\\u03B4',\n epsilon: '\\u03B5',\n zeta: '\\u03B6',\n eta: '\\u03B7',\n theta: '\\u03B8',\n iota: '\\u03B9',\n kappa: '\\u03BA',\n lambda: '\\u03BB',\n mu: '\\u03BC',\n nu: '\\u03BD',\n xi: '\\u03BE',\n omicron: '\\u03BF',\n pi: '\\u03C0',\n rho: '\\u03C1',\n sigmaf: '\\u03C2',\n sigma: '\\u03C3',\n tau: '\\u03C4',\n upsilon: '\\u03C5',\n phi: '\\u03C6',\n chi: '\\u03C7',\n psi: '\\u03C8',\n omega: '\\u03C9',\n thetasym: '\\u03D1',\n upsih: '\\u03D2',\n piv: '\\u03D6',\n ensp: '\\u2002',\n emsp: '\\u2003',\n thinsp: '\\u2009',\n zwnj: '\\u200C',\n zwj: '\\u200D',\n lrm: '\\u200E',\n rlm: '\\u200F',\n ndash: '\\u2013',\n mdash: '\\u2014',\n lsquo: '\\u2018',\n rsquo: '\\u2019',\n sbquo: '\\u201A',\n ldquo: '\\u201C',\n rdquo: '\\u201D',\n bdquo: '\\u201E',\n dagger: '\\u2020',\n Dagger: '\\u2021',\n bull: '\\u2022',\n hellip: '\\u2026',\n permil: '\\u2030',\n prime: '\\u2032',\n Prime: '\\u2033',\n lsaquo: '\\u2039',\n rsaquo: '\\u203A',\n oline: '\\u203E',\n frasl: '\\u2044',\n euro: '\\u20AC',\n image: '\\u2111',\n weierp: '\\u2118',\n real: '\\u211C',\n trade: '\\u2122',\n alefsym: '\\u2135',\n larr: '\\u2190',\n uarr: '\\u2191',\n rarr: '\\u2192',\n darr: '\\u2193',\n harr: '\\u2194',\n crarr: '\\u21B5',\n lArr: '\\u21D0',\n uArr: '\\u21D1',\n rArr: '\\u21D2',\n dArr: '\\u21D3',\n hArr: '\\u21D4',\n forall: '\\u2200',\n part: '\\u2202',\n exist: '\\u2203',\n empty: '\\u2205',\n nabla: '\\u2207',\n isin: '\\u2208',\n notin: '\\u2209',\n ni: '\\u220B',\n prod: '\\u220F',\n sum: '\\u2211',\n minus: '\\u2212',\n lowast: '\\u2217',\n radic: '\\u221A',\n prop: '\\u221D',\n infin: '\\u221E',\n ang: '\\u2220',\n and: '\\u2227',\n or: '\\u2228',\n cap: '\\u2229',\n cup: '\\u222A',\n 'int': '\\u222B',\n there4: '\\u2234',\n sim: '\\u223C',\n cong: '\\u2245',\n asymp: '\\u2248',\n ne: '\\u2260',\n equiv: '\\u2261',\n le: '\\u2264',\n ge: '\\u2265',\n sub: '\\u2282',\n sup: '\\u2283',\n nsub: '\\u2284',\n sube: '\\u2286',\n supe: '\\u2287',\n oplus: '\\u2295',\n otimes: '\\u2297',\n perp: '\\u22A5',\n sdot: '\\u22C5',\n lceil: '\\u2308',\n rceil: '\\u2309',\n lfloor: '\\u230A',\n rfloor: '\\u230B',\n lang: '\\u2329',\n rang: '\\u232A',\n loz: '\\u25CA',\n spades: '\\u2660',\n clubs: '\\u2663',\n hearts: '\\u2665',\n diams: '\\u2666'\n};\n", "'use strict';\n\nconst XHTMLEntities = require('./xhtml');\n\nconst hexNumber = /^[\\da-fA-F]+$/;\nconst decimalNumber = /^\\d+$/;\n\n// The map to `acorn-jsx` tokens from `acorn` namespace objects.\nconst acornJsxMap = new WeakMap();\n\n// Get the original tokens for the given `acorn` namespace object.\nfunction getJsxTokens(acorn) {\n acorn = acorn.Parser.acorn || acorn;\n let acornJsx = acornJsxMap.get(acorn);\n if (!acornJsx) {\n const tt = acorn.tokTypes;\n const TokContext = acorn.TokContext;\n const TokenType = acorn.TokenType;\n const tc_oTag = new TokContext('<tag', false);\n const tc_cTag = new TokContext('</tag', false);\n const tc_expr = new TokContext('<tag>...</tag>', true, true);\n const tokContexts = {\n tc_oTag: tc_oTag,\n tc_cTag: tc_cTag,\n tc_expr: tc_expr\n };\n const tokTypes = {\n jsxName: new TokenType('jsxName'),\n jsxText: new TokenType('jsxText', {beforeExpr: true}),\n jsxTagStart: new TokenType('jsxTagStart', {startsExpr: true}),\n jsxTagEnd: new TokenType('jsxTagEnd')\n };\n\n tokTypes.jsxTagStart.updateContext = function() {\n this.context.push(tc_expr); // treat as beginning of JSX expression\n this.context.push(tc_oTag); // start opening tag context\n this.exprAllowed = false;\n };\n tokTypes.jsxTagEnd.updateContext = function(prevType) {\n let out = this.context.pop();\n if (out === tc_oTag && prevType === tt.slash || out === tc_cTag) {\n this.context.pop();\n this.exprAllowed = this.curContext() === tc_expr;\n } else {\n this.exprAllowed = true;\n }\n };\n\n acornJsx = { tokContexts: tokContexts, tokTypes: tokTypes };\n acornJsxMap.set(acorn, acornJsx);\n }\n\n return acornJsx;\n}\n\n// Transforms JSX element name to string.\n\nfunction getQualifiedJSXName(object) {\n if (!object)\n return object;\n\n if (object.type === 'JSXIdentifier')\n return object.name;\n\n if (object.type === 'JSXNamespacedName')\n return object.namespace.name + ':' + object.name.name;\n\n if (object.type === 'JSXMemberExpression')\n return getQualifiedJSXName(object.object) + '.' +\n getQualifiedJSXName(object.property);\n}\n\nmodule.exports = function(options) {\n options = options || {};\n return function(Parser) {\n return plugin({\n allowNamespaces: options.allowNamespaces !== false,\n allowNamespacedObjects: !!options.allowNamespacedObjects\n }, Parser);\n };\n};\n\n// This is `tokTypes` of the peer dep.\n// This can be different instances from the actual `tokTypes` this plugin uses.\nObject.defineProperty(module.exports, \"tokTypes\", {\n get: function get_tokTypes() {\n return getJsxTokens(require(\"acorn\")).tokTypes;\n },\n configurable: true,\n enumerable: true\n});\n\nfunction plugin(options, Parser) {\n const acorn = Parser.acorn || require(\"acorn\");\n const acornJsx = getJsxTokens(acorn);\n const tt = acorn.tokTypes;\n const tok = acornJsx.tokTypes;\n const tokContexts = acorn.tokContexts;\n const tc_oTag = acornJsx.tokContexts.tc_oTag;\n const tc_cTag = acornJsx.tokContexts.tc_cTag;\n const tc_expr = acornJsx.tokContexts.tc_expr;\n const isNewLine = acorn.isNewLine;\n const isIdentifierStart = acorn.isIdentifierStart;\n const isIdentifierChar = acorn.isIdentifierChar;\n\n return class extends Parser {\n // Expose actual `tokTypes` and `tokContexts` to other plugins.\n static get acornJsx() {\n return acornJsx;\n }\n\n // Reads inline JSX contents token.\n jsx_readToken() {\n let out = '', chunkStart = this.pos;\n for (;;) {\n if (this.pos >= this.input.length)\n this.raise(this.start, 'Unterminated JSX contents');\n let ch = this.input.charCodeAt(this.pos);\n\n switch (ch) {\n case 60: // '<'\n case 123: // '{'\n if (this.pos === this.start) {\n if (ch === 60 && this.exprAllowed) {\n ++this.pos;\n return this.finishToken(tok.jsxTagStart);\n }\n return this.getTokenFromCode(ch);\n }\n out += this.input.slice(chunkStart, this.pos);\n return this.finishToken(tok.jsxText, out);\n\n case 38: // '&'\n out += this.input.slice(chunkStart, this.pos);\n out += this.jsx_readEntity();\n chunkStart = this.pos;\n break;\n\n case 62: // '>'\n case 125: // '}'\n this.raise(\n this.pos,\n \"Unexpected token `\" + this.input[this.pos] + \"`. Did you mean `\" +\n (ch === 62 ? \">\" : \"}\") + \"` or \" + \"`{\\\"\" + this.input[this.pos] + \"\\\"}\" + \"`?\"\n );\n\n default:\n if (isNewLine(ch)) {\n out += this.input.slice(chunkStart, this.pos);\n out += this.jsx_readNewLine(true);\n chunkStart = this.pos;\n } else {\n ++this.pos;\n }\n }\n }\n }\n\n jsx_readNewLine(normalizeCRLF) {\n let ch = this.input.charCodeAt(this.pos);\n let out;\n ++this.pos;\n if (ch === 13 && this.input.charCodeAt(this.pos) === 10) {\n ++this.pos;\n out = normalizeCRLF ? '\\n' : '\\r\\n';\n } else {\n out = String.fromCharCode(ch);\n }\n if (this.options.locations) {\n ++this.curLine;\n this.lineStart = this.pos;\n }\n\n return out;\n }\n\n jsx_readString(quote) {\n let out = '', chunkStart = ++this.pos;\n for (;;) {\n if (this.pos >= this.input.length)\n this.raise(this.start, 'Unterminated string constant');\n let ch = this.input.charCodeAt(this.pos);\n if (ch === quote) break;\n if (ch === 38) { // '&'\n out += this.input.slice(chunkStart, this.pos);\n out += this.jsx_readEntity();\n chunkStart = this.pos;\n } else if (isNewLine(ch)) {\n out += this.input.slice(chunkStart, this.pos);\n out += this.jsx_readNewLine(false);\n chunkStart = this.pos;\n } else {\n ++this.pos;\n }\n }\n out += this.input.slice(chunkStart, this.pos++);\n return this.finishToken(tt.string, out);\n }\n\n jsx_readEntity() {\n let str = '', count = 0, entity;\n let ch = this.input[this.pos];\n if (ch !== '&')\n this.raise(this.pos, 'Entity must start with an ampersand');\n let startPos = ++this.pos;\n while (this.pos < this.input.length && count++ < 10) {\n ch = this.input[this.pos++];\n if (ch === ';') {\n if (str[0] === '#') {\n if (str[1] === 'x') {\n str = str.substr(2);\n if (hexNumber.test(str))\n entity = String.fromCharCode(parseInt(str, 16));\n } else {\n str = str.substr(1);\n if (decimalNumber.test(str))\n entity = String.fromCharCode(parseInt(str, 10));\n }\n } else {\n entity = XHTMLEntities[str];\n }\n break;\n }\n str += ch;\n }\n if (!entity) {\n this.pos = startPos;\n return '&';\n }\n return entity;\n }\n\n // Read a JSX identifier (valid tag or attribute name).\n //\n // Optimized version since JSX identifiers can't contain\n // escape characters and so can be read as single slice.\n // Also assumes that first character was already checked\n // by isIdentifierStart in readToken.\n\n jsx_readWord() {\n let ch, start = this.pos;\n do {\n ch = this.input.charCodeAt(++this.pos);\n } while (isIdentifierChar(ch) || ch === 45); // '-'\n return this.finishToken(tok.jsxName, this.input.slice(start, this.pos));\n }\n\n // Parse next token as JSX identifier\n\n jsx_parseIdentifier() {\n let node = this.startNode();\n if (this.type === tok.jsxName)\n node.name = this.value;\n else if (this.type.keyword)\n node.name = this.type.keyword;\n else\n this.unexpected();\n this.next();\n return this.finishNode(node, 'JSXIdentifier');\n }\n\n // Parse namespaced identifier.\n\n jsx_parseNamespacedName() {\n let startPos = this.start, startLoc = this.startLoc;\n let name = this.jsx_parseIdentifier();\n if (!options.allowNamespaces || !this.eat(tt.colon)) return name;\n var node = this.startNodeAt(startPos, startLoc);\n node.namespace = name;\n node.name = this.jsx_parseIdentifier();\n return this.finishNode(node, 'JSXNamespacedName');\n }\n\n // Parses element name in any form - namespaced, member\n // or single identifier.\n\n jsx_parseElementName() {\n if (this.type === tok.jsxTagEnd) return '';\n let startPos = this.start, startLoc = this.startLoc;\n let node = this.jsx_parseNamespacedName();\n if (this.type === tt.dot && node.type === 'JSXNamespacedName' && !options.allowNamespacedObjects) {\n this.unexpected();\n }\n while (this.eat(tt.dot)) {\n let newNode = this.startNodeAt(startPos, startLoc);\n newNode.object = node;\n newNode.property = this.jsx_parseIdentifier();\n node = this.finishNode(newNode, 'JSXMemberExpression');\n }\n return node;\n }\n\n // Parses any type of JSX attribute value.\n\n jsx_parseAttributeValue() {\n switch (this.type) {\n case tt.braceL:\n let node = this.jsx_parseExpressionContainer();\n if (node.expression.type === 'JSXEmptyExpression')\n this.raise(node.start, 'JSX attributes must only be assigned a non-empty expression');\n return node;\n\n case tok.jsxTagStart:\n case tt.string:\n return this.parseExprAtom();\n\n default:\n this.raise(this.start, 'JSX value should be either an expression or a quoted JSX text');\n }\n }\n\n // JSXEmptyExpression is unique type since it doesn't actually parse anything,\n // and so it should start at the end of last read token (left brace) and finish\n // at the beginning of the next one (right brace).\n\n jsx_parseEmptyExpression() {\n let node = this.startNodeAt(this.lastTokEnd, this.lastTokEndLoc);\n return this.finishNodeAt(node, 'JSXEmptyExpression', this.start, this.startLoc);\n }\n\n // Parses JSX expression enclosed into curly brackets.\n\n jsx_parseExpressionContainer() {\n let node = this.startNode();\n this.next();\n node.expression = this.type === tt.braceR\n ? this.jsx_parseEmptyExpression()\n : this.parseExpression();\n this.expect(tt.braceR);\n return this.finishNode(node, 'JSXExpressionContainer');\n }\n\n // Parses following JSX attribute name-value pair.\n\n jsx_parseAttribute() {\n let node = this.startNode();\n if (this.eat(tt.braceL)) {\n this.expect(tt.ellipsis);\n node.argument = this.parseMaybeAssign();\n this.expect(tt.braceR);\n return this.finishNode(node, 'JSXSpreadAttribute');\n }\n node.name = this.jsx_parseNamespacedName();\n node.value = this.eat(tt.eq) ? this.jsx_parseAttributeValue() : null;\n return this.finishNode(node, 'JSXAttribute');\n }\n\n // Parses JSX opening tag starting after '<'.\n\n jsx_parseOpeningElementAt(startPos, startLoc) {\n let node = this.startNodeAt(startPos, startLoc);\n node.attributes = [];\n let nodeName = this.jsx_parseElementName();\n if (nodeName) node.name = nodeName;\n while (this.type !== tt.slash && this.type !== tok.jsxTagEnd)\n node.attributes.push(this.jsx_parseAttribute());\n node.selfClosing = this.eat(tt.slash);\n this.expect(tok.jsxTagEnd);\n return this.finishNode(node, nodeName ? 'JSXOpeningElement' : 'JSXOpeningFragment');\n }\n\n // Parses JSX closing tag starting after '</'.\n\n jsx_parseClosingElementAt(startPos, startLoc) {\n let node = this.startNodeAt(startPos, startLoc);\n let nodeName = this.jsx_parseElementName();\n if (nodeName) node.name = nodeName;\n this.expect(tok.jsxTagEnd);\n return this.finishNode(node, nodeName ? 'JSXClosingElement' : 'JSXClosingFragment');\n }\n\n // Parses entire JSX element, including it's opening tag\n // (starting after '<'), attributes, contents and closing tag.\n\n jsx_parseElementAt(startPos, startLoc) {\n let node = this.startNodeAt(startPos, startLoc);\n let children = [];\n let openingElement = this.jsx_parseOpeningElementAt(startPos, startLoc);\n let closingElement = null;\n\n if (!openingElement.selfClosing) {\n contents: for (;;) {\n switch (this.type) {\n case tok.jsxTagStart:\n startPos = this.start; startLoc = this.startLoc;\n this.next();\n if (this.eat(tt.slash)) {\n closingElement = this.jsx_parseClosingElementAt(startPos, startLoc);\n break contents;\n }\n children.push(this.jsx_parseElementAt(startPos, startLoc));\n break;\n\n case tok.jsxText:\n children.push(this.parseExprAtom());\n break;\n\n case tt.braceL:\n children.push(this.jsx_parseExpressionContainer());\n break;\n\n default:\n this.unexpected();\n }\n }\n if (getQualifiedJSXName(closingElement.name) !== getQualifiedJSXName(openingElement.name)) {\n this.raise(\n closingElement.start,\n 'Expected corresponding JSX closing tag for <' + getQualifiedJSXName(openingElement.name) + '>');\n }\n }\n let fragmentOrElement = openingElement.name ? 'Element' : 'Fragment';\n\n node['opening' + fragmentOrElement] = openingElement;\n node['closing' + fragmentOrElement] = closingElement;\n node.children = children;\n if (this.type === tt.relational && this.value === \"<\") {\n this.raise(this.start, \"Adjacent JSX elements must be wrapped in an enclosing tag\");\n }\n return this.finishNode(node, 'JSX' + fragmentOrElement);\n }\n\n // Parse JSX text\n\n jsx_parseText() {\n let node = this.parseLiteral(this.value);\n node.type = \"JSXText\";\n return node;\n }\n\n // Parses entire JSX element from current position.\n\n jsx_parseElement() {\n let startPos = this.start, startLoc = this.startLoc;\n this.next();\n return this.jsx_parseElementAt(startPos, startLoc);\n }\n\n parseExprAtom(refShortHandDefaultPos) {\n if (this.type === tok.jsxText)\n return this.jsx_parseText();\n else if (this.type === tok.jsxTagStart)\n return this.jsx_parseElement();\n else\n return super.parseExprAtom(refShortHandDefaultPos);\n }\n\n readToken(code) {\n let context = this.curContext();\n\n if (context === tc_expr) return this.jsx_readToken();\n\n if (context === tc_oTag || context === tc_cTag) {\n if (isIdentifierStart(code)) return this.jsx_readWord();\n\n if (code == 62) {\n ++this.pos;\n return this.finishToken(tok.jsxTagEnd);\n }\n\n if ((code === 34 || code === 39) && context == tc_oTag)\n return this.jsx_readString(code);\n }\n\n if (code === 60 && this.exprAllowed && this.input.charCodeAt(this.pos + 1) !== 33) {\n ++this.pos;\n return this.finishToken(tok.jsxTagStart);\n }\n return super.readToken(code);\n }\n\n updateContext(prevType) {\n if (this.type == tt.braceL) {\n var curContext = this.curContext();\n if (curContext == tc_oTag) this.context.push(tokContexts.b_expr);\n else if (curContext == tc_expr) this.context.push(tokContexts.b_tmpl);\n else super.updateContext(prevType);\n this.exprAllowed = true;\n } else if (this.type === tt.slash && prevType === tok.jsxTagStart) {\n this.context.length -= 2; // do not consider JSX expr -> JSX open tag -> ... anymore\n this.context.push(tc_cTag); // reconsider as closing tag context\n this.exprAllowed = false;\n } else {\n return super.updateContext(prevType);\n }\n }\n };\n}\n", "'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar acorn = require('acorn');\nvar jsx = require('acorn-jsx');\nvar visitorKeys = require('eslint-visitor-keys');\n\nfunction _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }\n\nfunction _interopNamespace(e) {\n if (e && e.__esModule) return e;\n var n = Object.create(null);\n if (e) {\n Object.keys(e).forEach(function (k) {\n if (k !== 'default') {\n var d = Object.getOwnPropertyDescriptor(e, k);\n Object.defineProperty(n, k, d.get ? d : {\n enumerable: true,\n get: function () { return e[k]; }\n });\n }\n });\n }\n n[\"default\"] = e;\n return Object.freeze(n);\n}\n\nvar acorn__namespace = /*#__PURE__*/_interopNamespace(acorn);\nvar jsx__default = /*#__PURE__*/_interopDefaultLegacy(jsx);\nvar visitorKeys__namespace = /*#__PURE__*/_interopNamespace(visitorKeys);\n\n/**\n * @fileoverview Translates tokens between Acorn format and Esprima format.\n * @author Nicholas C. Zakas\n */\n/* eslint no-underscore-dangle: 0 */\n\n//------------------------------------------------------------------------------\n// Requirements\n//------------------------------------------------------------------------------\n\n// none!\n\n//------------------------------------------------------------------------------\n// Private\n//------------------------------------------------------------------------------\n\n\n// Esprima Token Types\nconst Token = {\n Boolean: \"Boolean\",\n EOF: \"<end>\",\n Identifier: \"Identifier\",\n PrivateIdentifier: \"PrivateIdentifier\",\n Keyword: \"Keyword\",\n Null: \"Null\",\n Numeric: \"Numeric\",\n Punctuator: \"Punctuator\",\n String: \"String\",\n RegularExpression: \"RegularExpression\",\n Template: \"Template\",\n JSXIdentifier: \"JSXIdentifier\",\n JSXText: \"JSXText\"\n};\n\n/**\n * Converts part of a template into an Esprima token.\n * @param {AcornToken[]} tokens The Acorn tokens representing the template.\n * @param {string} code The source code.\n * @returns {EsprimaToken} The Esprima equivalent of the template token.\n * @private\n */\nfunction convertTemplatePart(tokens, code) {\n const firstToken = tokens[0],\n lastTemplateToken = tokens[tokens.length - 1];\n\n const token = {\n type: Token.Template,\n value: code.slice(firstToken.start, lastTemplateToken.end)\n };\n\n if (firstToken.loc) {\n token.loc = {\n start: firstToken.loc.start,\n end: lastTemplateToken.loc.end\n };\n }\n\n if (firstToken.range) {\n token.start = firstToken.range[0];\n token.end = lastTemplateToken.range[1];\n token.range = [token.start, token.end];\n }\n\n return token;\n}\n\n/**\n * Contains logic to translate Acorn tokens into Esprima tokens.\n * @param {Object} acornTokTypes The Acorn token types.\n * @param {string} code The source code Acorn is parsing. This is necessary\n * to correct the \"value\" property of some tokens.\n * @constructor\n */\nfunction TokenTranslator(acornTokTypes, code) {\n\n // token types\n this._acornTokTypes = acornTokTypes;\n\n // token buffer for templates\n this._tokens = [];\n\n // track the last curly brace\n this._curlyBrace = null;\n\n // the source code\n this._code = code;\n\n}\n\nTokenTranslator.prototype = {\n constructor: TokenTranslator,\n\n /**\n * Translates a single Esprima token to a single Acorn token. This may be\n * inaccurate due to how templates are handled differently in Esprima and\n * Acorn, but should be accurate for all other tokens.\n * @param {AcornToken} token The Acorn token to translate.\n * @param {Object} extra Espree extra object.\n * @returns {EsprimaToken} The Esprima version of the token.\n */\n translate(token, extra) {\n\n const type = token.type,\n tt = this._acornTokTypes;\n\n if (type === tt.name) {\n token.type = Token.Identifier;\n\n // TODO: See if this is an Acorn bug\n if (token.value === \"static\") {\n token.type = Token.Keyword;\n }\n\n if (extra.ecmaVersion > 5 && (token.value === \"yield\" || token.value === \"let\")) {\n token.type = Token.Keyword;\n }\n\n } else if (type === tt.privateId) {\n token.type = Token.PrivateIdentifier;\n\n } else if (type === tt.semi || type === tt.comma ||\n type === tt.parenL || type === tt.parenR ||\n type === tt.braceL || type === tt.braceR ||\n type === tt.dot || type === tt.bracketL ||\n type === tt.colon || type === tt.question ||\n type === tt.bracketR || type === tt.ellipsis ||\n type === tt.arrow || type === tt.jsxTagStart ||\n type === tt.incDec || type === tt.starstar ||\n type === tt.jsxTagEnd || type === tt.prefix ||\n type === tt.questionDot ||\n (type.binop && !type.keyword) ||\n type.isAssign) {\n\n token.type = Token.Punctuator;\n token.value = this._code.slice(token.start, token.end);\n } else if (type === tt.jsxName) {\n token.type = Token.JSXIdentifier;\n } else if (type.label === \"jsxText\" || type === tt.jsxAttrValueToken) {\n token.type = Token.JSXText;\n } else if (type.keyword) {\n if (type.keyword === \"true\" || type.keyword === \"false\") {\n token.type = Token.Boolean;\n } else if (type.keyword === \"null\") {\n token.type = Token.Null;\n } else {\n token.type = Token.Keyword;\n }\n } else if (type === tt.num) {\n token.type = Token.Numeric;\n token.value = this._code.slice(token.start, token.end);\n } else if (type === tt.string) {\n\n if (extra.jsxAttrValueToken) {\n extra.jsxAttrValueToken = false;\n token.type = Token.JSXText;\n } else {\n token.type = Token.String;\n }\n\n token.value = this._code.slice(token.start, token.end);\n } else if (type === tt.regexp) {\n token.type = Token.RegularExpression;\n const value = token.value;\n\n token.regex = {\n flags: value.flags,\n pattern: value.pattern\n };\n token.value = `/${value.pattern}/${value.flags}`;\n }\n\n return token;\n },\n\n /**\n * Function to call during Acorn's onToken handler.\n * @param {AcornToken} token The Acorn token.\n * @param {Object} extra The Espree extra object.\n * @returns {void}\n */\n onToken(token, extra) {\n\n const that = this,\n tt = this._acornTokTypes,\n tokens = extra.tokens,\n templateTokens = this._tokens;\n\n /**\n * Flushes the buffered template tokens and resets the template\n * tracking.\n * @returns {void}\n * @private\n */\n function translateTemplateTokens() {\n tokens.push(convertTemplatePart(that._tokens, that._code));\n that._tokens = [];\n }\n\n if (token.type === tt.eof) {\n\n // might be one last curlyBrace\n if (this._curlyBrace) {\n tokens.push(this.translate(this._curlyBrace, extra));\n }\n\n return;\n }\n\n if (token.type === tt.backQuote) {\n\n // if there's already a curly, it's not part of the template\n if (this._curlyBrace) {\n tokens.push(this.translate(this._curlyBrace, extra));\n this._curlyBrace = null;\n }\n\n templateTokens.push(token);\n\n // it's the end\n if (templateTokens.length > 1) {\n translateTemplateTokens();\n }\n\n return;\n }\n if (token.type === tt.dollarBraceL) {\n templateTokens.push(token);\n translateTemplateTokens();\n return;\n }\n if (token.type === tt.braceR) {\n\n // if there's already a curly, it's not part of the template\n if (this._curlyBrace) {\n tokens.push(this.translate(this._curlyBrace, extra));\n }\n\n // store new curly for later\n this._curlyBrace = token;\n return;\n }\n if (token.type === tt.template || token.type === tt.invalidTemplate) {\n if (this._curlyBrace) {\n templateTokens.push(this._curlyBrace);\n this._curlyBrace = null;\n }\n\n templateTokens.push(token);\n return;\n }\n\n if (this._curlyBrace) {\n tokens.push(this.translate(this._curlyBrace, extra));\n this._curlyBrace = null;\n }\n\n tokens.push(this.translate(token, extra));\n }\n};\n\n/**\n * @fileoverview A collection of methods for processing Espree's options.\n * @author Kai Cataldo\n */\n\n//------------------------------------------------------------------------------\n// Helpers\n//------------------------------------------------------------------------------\n\nconst SUPPORTED_VERSIONS = [\n 3,\n 5,\n 6, // 2015\n 7, // 2016\n 8, // 2017\n 9, // 2018\n 10, // 2019\n 11, // 2020\n 12, // 2021\n 13, // 2022\n 14 // 2023\n];\n\n/**\n * Get the latest ECMAScript version supported by Espree.\n * @returns {number} The latest ECMAScript version.\n */\nfunction getLatestEcmaVersion() {\n return SUPPORTED_VERSIONS[SUPPORTED_VERSIONS.length - 1];\n}\n\n/**\n * Get the list of ECMAScript versions supported by Espree.\n * @returns {number[]} An array containing the supported ECMAScript versions.\n */\nfunction getSupportedEcmaVersions() {\n return [...SUPPORTED_VERSIONS];\n}\n\n/**\n * Normalize ECMAScript version from the initial config\n * @param {(number|\"latest\")} ecmaVersion ECMAScript version from the initial config\n * @throws {Error} throws an error if the ecmaVersion is invalid.\n * @returns {number} normalized ECMAScript version\n */\nfunction normalizeEcmaVersion(ecmaVersion = 5) {\n\n let version = ecmaVersion === \"latest\" ? getLatestEcmaVersion() : ecmaVersion;\n\n if (typeof version !== \"number\") {\n throw new Error(`ecmaVersion must be a number or \"latest\". Received value of type ${typeof ecmaVersion} instead.`);\n }\n\n // Calculate ECMAScript edition number from official year version starting with\n // ES2015, which corresponds with ES6 (or a difference of 2009).\n if (version >= 2015) {\n version -= 2009;\n }\n\n if (!SUPPORTED_VERSIONS.includes(version)) {\n throw new Error(\"Invalid ecmaVersion.\");\n }\n\n return version;\n}\n\n/**\n * Normalize sourceType from the initial config\n * @param {string} sourceType to normalize\n * @throws {Error} throw an error if sourceType is invalid\n * @returns {string} normalized sourceType\n */\nfunction normalizeSourceType(sourceType = \"script\") {\n if (sourceType === \"script\" || sourceType === \"module\") {\n return sourceType;\n }\n\n if (sourceType === \"commonjs\") {\n return \"script\";\n }\n\n throw new Error(\"Invalid sourceType.\");\n}\n\n/**\n * Normalize parserOptions\n * @param {Object} options the parser options to normalize\n * @throws {Error} throw an error if found invalid option.\n * @returns {Object} normalized options\n */\nfunction normalizeOptions(options) {\n const ecmaVersion = normalizeEcmaVersion(options.ecmaVersion);\n const sourceType = normalizeSourceType(options.sourceType);\n const ranges = options.range === true;\n const locations = options.loc === true;\n\n if (ecmaVersion !== 3 && options.allowReserved) {\n\n // a value of `false` is intentionally allowed here, so a shared config can overwrite it when needed\n throw new Error(\"`allowReserved` is only supported when ecmaVersion is 3\");\n }\n if (typeof options.allowReserved !== \"undefined\" && typeof options.allowReserved !== \"boolean\") {\n throw new Error(\"`allowReserved`, when present, must be `true` or `false`\");\n }\n const allowReserved = ecmaVersion === 3 ? (options.allowReserved || \"never\") : false;\n const ecmaFeatures = options.ecmaFeatures || {};\n const allowReturnOutsideFunction = options.sourceType === \"commonjs\" ||\n Boolean(ecmaFeatures.globalReturn);\n\n if (sourceType === \"module\" && ecmaVersion < 6) {\n throw new Error(\"sourceType 'module' is not supported when ecmaVersion < 2015. Consider adding `{ ecmaVersion: 2015 }` to the parser options.\");\n }\n\n return Object.assign({}, options, {\n ecmaVersion,\n sourceType,\n ranges,\n locations,\n allowReserved,\n allowReturnOutsideFunction\n });\n}\n\n/* eslint-disable no-param-reassign*/\n\n\nconst STATE = Symbol(\"espree's internal state\");\nconst ESPRIMA_FINISH_NODE = Symbol(\"espree's esprimaFinishNode\");\n\n\n/**\n * Converts an Acorn comment to a Esprima comment.\n * @param {boolean} block True if it's a block comment, false if not.\n * @param {string} text The text of the comment.\n * @param {int} start The index at which the comment starts.\n * @param {int} end The index at which the comment ends.\n * @param {Location} startLoc The location at which the comment starts.\n * @param {Location} endLoc The location at which the comment ends.\n * @param {string} code The source code being parsed.\n * @returns {Object} The comment object.\n * @private\n */\nfunction convertAcornCommentToEsprimaComment(block, text, start, end, startLoc, endLoc, code) {\n let type;\n\n if (block) {\n type = \"Block\";\n } else if (code.slice(start, start + 2) === \"#!\") {\n type = \"Hashbang\";\n } else {\n type = \"Line\";\n }\n\n const comment = {\n type,\n value: text\n };\n\n if (typeof start === \"number\") {\n comment.start = start;\n comment.end = end;\n comment.range = [start, end];\n }\n\n if (typeof startLoc === \"object\") {\n comment.loc = {\n start: startLoc,\n end: endLoc\n };\n }\n\n return comment;\n}\n\nvar espree = () => Parser => {\n const tokTypes = Object.assign({}, Parser.acorn.tokTypes);\n\n if (Parser.acornJsx) {\n Object.assign(tokTypes, Parser.acornJsx.tokTypes);\n }\n\n return class Espree extends Parser {\n constructor(opts, code) {\n if (typeof opts !== \"object\" || opts === null) {\n opts = {};\n }\n if (typeof code !== \"string\" && !(code instanceof String)) {\n code = String(code);\n }\n\n // save original source type in case of commonjs\n const originalSourceType = opts.sourceType;\n const options = normalizeOptions(opts);\n const ecmaFeatures = options.ecmaFeatures || {};\n const tokenTranslator =\n options.tokens === true\n ? new TokenTranslator(tokTypes, code)\n : null;\n\n /*\n * Data that is unique to Espree and is not represented internally\n * in Acorn.\n *\n * For ES2023 hashbangs, Espree will call `onComment()` during the\n * constructor, so we must define state before having access to\n * `this`.\n */\n const state = {\n originalSourceType: originalSourceType || options.sourceType,\n tokens: tokenTranslator ? [] : null,\n comments: options.comment === true ? [] : null,\n impliedStrict: ecmaFeatures.impliedStrict === true && options.ecmaVersion >= 5,\n ecmaVersion: options.ecmaVersion,\n jsxAttrValueToken: false,\n lastToken: null,\n templateElements: []\n };\n\n // Initialize acorn parser.\n super({\n\n // do not use spread, because we don't want to pass any unknown options to acorn\n ecmaVersion: options.ecmaVersion,\n sourceType: options.sourceType,\n ranges: options.ranges,\n locations: options.locations,\n allowReserved: options.allowReserved,\n\n // Truthy value is true for backward compatibility.\n allowReturnOutsideFunction: options.allowReturnOutsideFunction,\n\n // Collect tokens\n onToken: token => {\n if (tokenTranslator) {\n\n // Use `tokens`, `ecmaVersion`, and `jsxAttrValueToken` in the state.\n tokenTranslator.onToken(token, state);\n }\n if (token.type !== tokTypes.eof) {\n state.lastToken = token;\n }\n },\n\n // Collect comments\n onComment: (block, text, start, end, startLoc, endLoc) => {\n if (state.comments) {\n const comment = convertAcornCommentToEsprimaComment(block, text, start, end, startLoc, endLoc, code);\n\n state.comments.push(comment);\n }\n }\n }, code);\n\n /*\n * We put all of this data into a symbol property as a way to avoid\n * potential naming conflicts with future versions of Acorn.\n */\n this[STATE] = state;\n }\n\n tokenize() {\n do {\n this.next();\n } while (this.type !== tokTypes.eof);\n\n // Consume the final eof token\n this.next();\n\n const extra = this[STATE];\n const tokens = extra.tokens;\n\n if (extra.comments) {\n tokens.comments = extra.comments;\n }\n\n return tokens;\n }\n\n finishNode(...args) {\n const result = super.finishNode(...args);\n\n return this[ESPRIMA_FINISH_NODE](result);\n }\n\n finishNodeAt(...args) {\n const result = super.finishNodeAt(...args);\n\n return this[ESPRIMA_FINISH_NODE](result);\n }\n\n parse() {\n const extra = this[STATE];\n const program = super.parse();\n\n program.sourceType = extra.originalSourceType;\n\n if (extra.comments) {\n program.comments = extra.comments;\n }\n if (extra.tokens) {\n program.tokens = extra.tokens;\n }\n\n /*\n * Adjust opening and closing position of program to match Esprima.\n * Acorn always starts programs at range 0 whereas Esprima starts at the\n * first AST node's start (the only real difference is when there's leading\n * whitespace or leading comments). Acorn also counts trailing whitespace\n * as part of the program whereas Esprima only counts up to the last token.\n */\n if (program.body.length) {\n const [firstNode] = program.body;\n\n if (program.range) {\n program.range[0] = firstNode.range[0];\n }\n if (program.loc) {\n program.loc.start = firstNode.loc.start;\n }\n program.start = firstNode.start;\n }\n if (extra.lastToken) {\n if (program.range) {\n program.range[1] = extra.lastToken.range[1];\n }\n if (program.loc) {\n program.loc.end = extra.lastToken.loc.end;\n }\n program.end = extra.lastToken.end;\n }\n\n\n /*\n * https://github.com/eslint/espree/issues/349\n * Ensure that template elements have correct range information.\n * This is one location where Acorn produces a different value\n * for its start and end properties vs. the values present in the\n * range property. In order to avoid confusion, we set the start\n * and end properties to the values that are present in range.\n * This is done here, instead of in finishNode(), because Acorn\n * uses the values of start and end internally while parsing, making\n * it dangerous to change those values while parsing is ongoing.\n * By waiting until the end of parsing, we can safely change these\n * values without affect any other part of the process.\n */\n this[STATE].templateElements.forEach(templateElement => {\n const startOffset = -1;\n const endOffset = templateElement.tail ? 1 : 2;\n\n templateElement.start += startOffset;\n templateElement.end += endOffset;\n\n if (templateElement.range) {\n templateElement.range[0] += startOffset;\n templateElement.range[1] += endOffset;\n }\n\n if (templateElement.loc) {\n templateElement.loc.start.column += startOffset;\n templateElement.loc.end.column += endOffset;\n }\n });\n\n return program;\n }\n\n parseTopLevel(node) {\n if (this[STATE].impliedStrict) {\n this.strict = true;\n }\n return super.parseTopLevel(node);\n }\n\n /**\n * Overwrites the default raise method to throw Esprima-style errors.\n * @param {int} pos The position of the error.\n * @param {string} message The error message.\n * @throws {SyntaxError} A syntax error.\n * @returns {void}\n */\n raise(pos, message) {\n const loc = Parser.acorn.getLineInfo(this.input, pos);\n const err = new SyntaxError(message);\n\n err.index = pos;\n err.lineNumber = loc.line;\n err.column = loc.column + 1; // acorn uses 0-based columns\n throw err;\n }\n\n /**\n * Overwrites the default raise method to throw Esprima-style errors.\n * @param {int} pos The position of the error.\n * @param {string} message The error message.\n * @throws {SyntaxError} A syntax error.\n * @returns {void}\n */\n raiseRecoverable(pos, message) {\n this.raise(pos, message);\n }\n\n /**\n * Overwrites the default unexpected method to throw Esprima-style errors.\n * @param {int} pos The position of the error.\n * @throws {SyntaxError} A syntax error.\n * @returns {void}\n */\n unexpected(pos) {\n let message = \"Unexpected token\";\n\n if (pos !== null && pos !== void 0) {\n this.pos = pos;\n\n if (this.options.locations) {\n while (this.pos < this.lineStart) {\n this.lineStart = this.input.lastIndexOf(\"\\n\", this.lineStart - 2) + 1;\n --this.curLine;\n }\n }\n\n this.nextToken();\n }\n\n if (this.end > this.start) {\n message += ` ${this.input.slice(this.start, this.end)}`;\n }\n\n this.raise(this.start, message);\n }\n\n /*\n * Esprima-FB represents JSX strings as tokens called \"JSXText\", but Acorn-JSX\n * uses regular tt.string without any distinction between this and regular JS\n * strings. As such, we intercept an attempt to read a JSX string and set a flag\n * on extra so that when tokens are converted, the next token will be switched\n * to JSXText via onToken.\n */\n jsx_readString(quote) { // eslint-disable-line camelcase\n const result = super.jsx_readString(quote);\n\n if (this.type === tokTypes.string) {\n this[STATE].jsxAttrValueToken = true;\n }\n return result;\n }\n\n /**\n * Performs last-minute Esprima-specific compatibility checks and fixes.\n * @param {ASTNode} result The node to check.\n * @returns {ASTNode} The finished node.\n */\n [ESPRIMA_FINISH_NODE](result) {\n\n // Acorn doesn't count the opening and closing backticks as part of templates\n // so we have to adjust ranges/locations appropriately.\n if (result.type === \"TemplateElement\") {\n\n // save template element references to fix start/end later\n this[STATE].templateElements.push(result);\n }\n\n if (result.type.includes(\"Function\") && !result.generator) {\n result.generator = false;\n }\n\n return result;\n }\n };\n};\n\nconst version$1 = \"9.4.1\";\n\n/**\n * @fileoverview Main Espree file that converts Acorn into Esprima output.\n *\n * This file contains code from the following MIT-licensed projects:\n * 1. Acorn\n * 2. Babylon\n * 3. Babel-ESLint\n *\n * This file also contains code from Esprima, which is BSD licensed.\n *\n * Acorn is Copyright 2012-2015 Acorn Contributors (https://github.com/marijnh/acorn/blob/master/AUTHORS)\n * Babylon is Copyright 2014-2015 various contributors (https://github.com/babel/babel/blob/master/packages/babylon/AUTHORS)\n * Babel-ESLint is Copyright 2014-2015 Sebastian McKenzie <sebmck@gmail.com>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Esprima is Copyright (c) jQuery Foundation, Inc. and Contributors, All Rights Reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n\n// To initialize lazily.\nconst parsers = {\n _regular: null,\n _jsx: null,\n\n get regular() {\n if (this._regular === null) {\n this._regular = acorn__namespace.Parser.extend(espree());\n }\n return this._regular;\n },\n\n get jsx() {\n if (this._jsx === null) {\n this._jsx = acorn__namespace.Parser.extend(jsx__default[\"default\"](), espree());\n }\n return this._jsx;\n },\n\n get(options) {\n const useJsx = Boolean(\n options &&\n options.ecmaFeatures &&\n options.ecmaFeatures.jsx\n );\n\n return useJsx ? this.jsx : this.regular;\n }\n};\n\n//------------------------------------------------------------------------------\n// Tokenizer\n//------------------------------------------------------------------------------\n\n/**\n * Tokenizes the given code.\n * @param {string} code The code to tokenize.\n * @param {Object} options Options defining how to tokenize.\n * @returns {Token[]} An array of tokens.\n * @throws {SyntaxError} If the input code is invalid.\n * @private\n */\nfunction tokenize(code, options) {\n const Parser = parsers.get(options);\n\n // Ensure to collect tokens.\n if (!options || options.tokens !== true) {\n options = Object.assign({}, options, { tokens: true }); // eslint-disable-line no-param-reassign\n }\n\n return new Parser(options, code).tokenize();\n}\n\n//------------------------------------------------------------------------------\n// Parser\n//------------------------------------------------------------------------------\n\n/**\n * Parses the given code.\n * @param {string} code The code to tokenize.\n * @param {Object} options Options defining how to tokenize.\n * @returns {ASTNode} The \"Program\" AST node.\n * @throws {SyntaxError} If the input code is invalid.\n */\nfunction parse(code, options) {\n const Parser = parsers.get(options);\n\n return new Parser(options, code).parse();\n}\n\n//------------------------------------------------------------------------------\n// Public\n//------------------------------------------------------------------------------\n\nconst version = version$1;\n\n/* istanbul ignore next */\nconst VisitorKeys = (function() {\n return visitorKeys__namespace.KEYS;\n}());\n\n// Derive node types from VisitorKeys\n/* istanbul ignore next */\nconst Syntax = (function() {\n let name,\n types = {};\n\n if (typeof Object.create === \"function\") {\n types = Object.create(null);\n }\n\n for (name in VisitorKeys) {\n if (Object.hasOwnProperty.call(VisitorKeys, name)) {\n types[name] = name;\n }\n }\n\n if (typeof Object.freeze === \"function\") {\n Object.freeze(types);\n }\n\n return types;\n}());\n\nconst latestEcmaVersion = getLatestEcmaVersion();\n\nconst supportedEcmaVersions = getSupportedEcmaVersions();\n\nexports.Syntax = Syntax;\nexports.VisitorKeys = VisitorKeys;\nexports.latestEcmaVersion = latestEcmaVersion;\nexports.parse = parse;\nexports.supportedEcmaVersions = supportedEcmaVersions;\nexports.tokenize = tokenize;\nexports.version = version;\n//# sourceMappingURL=espree.cjs.map\n", "var baseIteratee = require('./_baseIteratee'),\n baseSortedIndexBy = require('./_baseSortedIndexBy');\n\n/**\n * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n * which is invoked for `value` and each element of `array` to compute their\n * sort ranking. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The sorted array to inspect.\n * @param {*} value The value to evaluate.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {number} Returns the index at which `value` should be inserted\n * into `array`.\n * @example\n *\n * var objects = [{ 'x': 4 }, { 'x': 5 }];\n *\n * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n * // => 1\n *\n * // The `_.property` iteratee shorthand.\n * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n * // => 1\n */\nfunction sortedLastIndexBy(array, value, iteratee) {\n return baseSortedIndexBy(array, value, baseIteratee(iteratee, 2), true);\n}\n\nmodule.exports = sortedLastIndexBy;\n", "/*\n Copyright (C) 2012-2013 Yusuke Suzuki <utatane.tea@gmail.com>\n Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n/*jslint vars:false, bitwise:true*/\n/*jshint indent:4*/\n/*global exports:true*/\n(function clone(exports) {\n 'use strict';\n\n var Syntax,\n VisitorOption,\n VisitorKeys,\n BREAK,\n SKIP,\n REMOVE;\n\n function deepCopy(obj) {\n var ret = {}, key, val;\n for (key in obj) {\n if (obj.hasOwnProperty(key)) {\n val = obj[key];\n if (typeof val === 'object' && val !== null) {\n ret[key] = deepCopy(val);\n } else {\n ret[key] = val;\n }\n }\n }\n return ret;\n }\n\n // based on LLVM libc++ upper_bound / lower_bound\n // MIT License\n\n function upperBound(array, func) {\n var diff, len, i, current;\n\n len = array.length;\n i = 0;\n\n while (len) {\n diff = len >>> 1;\n current = i + diff;\n if (func(array[current])) {\n len = diff;\n } else {\n i = current + 1;\n len -= diff + 1;\n }\n }\n return i;\n }\n\n Syntax = {\n AssignmentExpression: 'AssignmentExpression',\n AssignmentPattern: 'AssignmentPattern',\n ArrayExpression: 'ArrayExpression',\n ArrayPattern: 'ArrayPattern',\n ArrowFunctionExpression: 'ArrowFunctionExpression',\n AwaitExpression: 'AwaitExpression', // CAUTION: It's deferred to ES7.\n BlockStatement: 'BlockStatement',\n BinaryExpression: 'BinaryExpression',\n BreakStatement: 'BreakStatement',\n CallExpression: 'CallExpression',\n CatchClause: 'CatchClause',\n ChainExpression: 'ChainExpression',\n ClassBody: 'ClassBody',\n ClassDeclaration: 'ClassDeclaration',\n ClassExpression: 'ClassExpression',\n ComprehensionBlock: 'ComprehensionBlock', // CAUTION: It's deferred to ES7.\n ComprehensionExpression: 'ComprehensionExpression', // CAUTION: It's deferred to ES7.\n ConditionalExpression: 'ConditionalExpression',\n ContinueStatement: 'ContinueStatement',\n DebuggerStatement: 'DebuggerStatement',\n DirectiveStatement: 'DirectiveStatement',\n DoWhileStatement: 'DoWhileStatement',\n EmptyStatement: 'EmptyStatement',\n ExportAllDeclaration: 'ExportAllDeclaration',\n ExportDefaultDeclaration: 'ExportDefaultDeclaration',\n ExportNamedDeclaration: 'ExportNamedDeclaration',\n ExportSpecifier: 'ExportSpecifier',\n ExpressionStatement: 'ExpressionStatement',\n ForStatement: 'ForStatement',\n ForInStatement: 'ForInStatement',\n ForOfStatement: 'ForOfStatement',\n FunctionDeclaration: 'FunctionDeclaration',\n FunctionExpression: 'FunctionExpression',\n GeneratorExpression: 'GeneratorExpression', // CAUTION: It's deferred to ES7.\n Identifier: 'Identifier',\n IfStatement: 'IfStatement',\n ImportExpression: 'ImportExpression',\n ImportDeclaration: 'ImportDeclaration',\n ImportDefaultSpecifier: 'ImportDefaultSpecifier',\n ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',\n ImportSpecifier: 'ImportSpecifier',\n Literal: 'Literal',\n LabeledStatement: 'LabeledStatement',\n LogicalExpression: 'LogicalExpression',\n MemberExpression: 'MemberExpression',\n MetaProperty: 'MetaProperty',\n MethodDefinition: 'MethodDefinition',\n ModuleSpecifier: 'ModuleSpecifier',\n NewExpression: 'NewExpression',\n ObjectExpression: 'ObjectExpression',\n ObjectPattern: 'ObjectPattern',\n Program: 'Program',\n Property: 'Property',\n RestElement: 'RestElement',\n ReturnStatement: 'ReturnStatement',\n SequenceExpression: 'SequenceExpression',\n SpreadElement: 'SpreadElement',\n Super: 'Super',\n SwitchStatement: 'SwitchStatement',\n SwitchCase: 'SwitchCase',\n TaggedTemplateExpression: 'TaggedTemplateExpression',\n TemplateElement: 'TemplateElement',\n TemplateLiteral: 'TemplateLiteral',\n ThisExpression: 'ThisExpression',\n ThrowStatement: 'ThrowStatement',\n TryStatement: 'TryStatement',\n UnaryExpression: 'UnaryExpression',\n UpdateExpression: 'UpdateExpression',\n VariableDeclaration: 'VariableDeclaration',\n VariableDeclarator: 'VariableDeclarator',\n WhileStatement: 'WhileStatement',\n WithStatement: 'WithStatement',\n YieldExpression: 'YieldExpression'\n };\n\n VisitorKeys = {\n AssignmentExpression: ['left', 'right'],\n AssignmentPattern: ['left', 'right'],\n ArrayExpression: ['elements'],\n ArrayPattern: ['elements'],\n ArrowFunctionExpression: ['params', 'body'],\n AwaitExpression: ['argument'], // CAUTION: It's deferred to ES7.\n BlockStatement: ['body'],\n BinaryExpression: ['left', 'right'],\n BreakStatement: ['label'],\n CallExpression: ['callee', 'arguments'],\n CatchClause: ['param', 'body'],\n ChainExpression: ['expression'],\n ClassBody: ['body'],\n ClassDeclaration: ['id', 'superClass', 'body'],\n ClassExpression: ['id', 'superClass', 'body'],\n ComprehensionBlock: ['left', 'right'], // CAUTION: It's deferred to ES7.\n ComprehensionExpression: ['blocks', 'filter', 'body'], // CAUTION: It's deferred to ES7.\n ConditionalExpression: ['test', 'consequent', 'alternate'],\n ContinueStatement: ['label'],\n DebuggerStatement: [],\n DirectiveStatement: [],\n DoWhileStatement: ['body', 'test'],\n EmptyStatement: [],\n ExportAllDeclaration: ['source'],\n ExportDefaultDeclaration: ['declaration'],\n ExportNamedDeclaration: ['declaration', 'specifiers', 'source'],\n ExportSpecifier: ['exported', 'local'],\n ExpressionStatement: ['expression'],\n ForStatement: ['init', 'test', 'update', 'body'],\n ForInStatement: ['left', 'right', 'body'],\n ForOfStatement: ['left', 'right', 'body'],\n FunctionDeclaration: ['id', 'params', 'body'],\n FunctionExpression: ['id', 'params', 'body'],\n GeneratorExpression: ['blocks', 'filter', 'body'], // CAUTION: It's deferred to ES7.\n Identifier: [],\n IfStatement: ['test', 'consequent', 'alternate'],\n ImportExpression: ['source'],\n ImportDeclaration: ['specifiers', 'source'],\n ImportDefaultSpecifier: ['local'],\n ImportNamespaceSpecifier: ['local'],\n ImportSpecifier: ['imported', 'local'],\n Literal: [],\n LabeledStatement: ['label', 'body'],\n LogicalExpression: ['left', 'right'],\n MemberExpression: ['object', 'property'],\n MetaProperty: ['meta', 'property'],\n MethodDefinition: ['key', 'value'],\n ModuleSpecifier: [],\n NewExpression: ['callee', 'arguments'],\n ObjectExpression: ['properties'],\n ObjectPattern: ['properties'],\n Program: ['body'],\n Property: ['key', 'value'],\n RestElement: [ 'argument' ],\n ReturnStatement: ['argument'],\n SequenceExpression: ['expressions'],\n SpreadElement: ['argument'],\n Super: [],\n SwitchStatement: ['discriminant', 'cases'],\n SwitchCase: ['test', 'consequent'],\n TaggedTemplateExpression: ['tag', 'quasi'],\n TemplateElement: [],\n TemplateLiteral: ['quasis', 'expressions'],\n ThisExpression: [],\n ThrowStatement: ['argument'],\n TryStatement: ['block', 'handler', 'finalizer'],\n UnaryExpression: ['argument'],\n UpdateExpression: ['argument'],\n VariableDeclaration: ['declarations'],\n VariableDeclarator: ['id', 'init'],\n WhileStatement: ['test', 'body'],\n WithStatement: ['object', 'body'],\n YieldExpression: ['argument']\n };\n\n // unique id\n BREAK = {};\n SKIP = {};\n REMOVE = {};\n\n VisitorOption = {\n Break: BREAK,\n Skip: SKIP,\n Remove: REMOVE\n };\n\n function Reference(parent, key) {\n this.parent = parent;\n this.key = key;\n }\n\n Reference.prototype.replace = function replace(node) {\n this.parent[this.key] = node;\n };\n\n Reference.prototype.remove = function remove() {\n if (Array.isArray(this.parent)) {\n this.parent.splice(this.key, 1);\n return true;\n } else {\n this.replace(null);\n return false;\n }\n };\n\n function Element(node, path, wrap, ref) {\n this.node = node;\n this.path = path;\n this.wrap = wrap;\n this.ref = ref;\n }\n\n function Controller() { }\n\n // API:\n // return property path array from root to current node\n Controller.prototype.path = function path() {\n var i, iz, j, jz, result, element;\n\n function addToPath(result, path) {\n if (Array.isArray(path)) {\n for (j = 0, jz = path.length; j < jz; ++j) {\n result.push(path[j]);\n }\n } else {\n result.push(path);\n }\n }\n\n // root node\n if (!this.__current.path) {\n return null;\n }\n\n // first node is sentinel, second node is root element\n result = [];\n for (i = 2, iz = this.__leavelist.length; i < iz; ++i) {\n element = this.__leavelist[i];\n addToPath(result, element.path);\n }\n addToPath(result, this.__current.path);\n return result;\n };\n\n // API:\n // return type of current node\n Controller.prototype.type = function () {\n var node = this.current();\n return node.type || this.__current.wrap;\n };\n\n // API:\n // return array of parent elements\n Controller.prototype.parents = function parents() {\n var i, iz, result;\n\n // first node is sentinel\n result = [];\n for (i = 1, iz = this.__leavelist.length; i < iz; ++i) {\n result.push(this.__leavelist[i].node);\n }\n\n return result;\n };\n\n // API:\n // return current node\n Controller.prototype.current = function current() {\n return this.__current.node;\n };\n\n Controller.prototype.__execute = function __execute(callback, element) {\n var previous, result;\n\n result = undefined;\n\n previous = this.__current;\n this.__current = element;\n this.__state = null;\n if (callback) {\n result = callback.call(this, element.node, this.__leavelist[this.__leavelist.length - 1].node);\n }\n this.__current = previous;\n\n return result;\n };\n\n // API:\n // notify control skip / break\n Controller.prototype.notify = function notify(flag) {\n this.__state = flag;\n };\n\n // API:\n // skip child nodes of current node\n Controller.prototype.skip = function () {\n this.notify(SKIP);\n };\n\n // API:\n // break traversals\n Controller.prototype['break'] = function () {\n this.notify(BREAK);\n };\n\n // API:\n // remove node\n Controller.prototype.remove = function () {\n this.notify(REMOVE);\n };\n\n Controller.prototype.__initialize = function(root, visitor) {\n this.visitor = visitor;\n this.root = root;\n this.__worklist = [];\n this.__leavelist = [];\n this.__current = null;\n this.__state = null;\n this.__fallback = null;\n if (visitor.fallback === 'iteration') {\n this.__fallback = Object.keys;\n } else if (typeof visitor.fallback === 'function') {\n this.__fallback = visitor.fallback;\n }\n\n this.__keys = VisitorKeys;\n if (visitor.keys) {\n this.__keys = Object.assign(Object.create(this.__keys), visitor.keys);\n }\n };\n\n function isNode(node) {\n if (node == null) {\n return false;\n }\n return typeof node === 'object' && typeof node.type === 'string';\n }\n\n function isProperty(nodeType, key) {\n return (nodeType === Syntax.ObjectExpression || nodeType === Syntax.ObjectPattern) && 'properties' === key;\n }\n \n function candidateExistsInLeaveList(leavelist, candidate) {\n for (var i = leavelist.length - 1; i >= 0; --i) {\n if (leavelist[i].node === candidate) {\n return true;\n }\n }\n return false;\n }\n\n Controller.prototype.traverse = function traverse(root, visitor) {\n var worklist,\n leavelist,\n element,\n node,\n nodeType,\n ret,\n key,\n current,\n current2,\n candidates,\n candidate,\n sentinel;\n\n this.__initialize(root, visitor);\n\n sentinel = {};\n\n // reference\n worklist = this.__worklist;\n leavelist = this.__leavelist;\n\n // initialize\n worklist.push(new Element(root, null, null, null));\n leavelist.push(new Element(null, null, null, null));\n\n while (worklist.length) {\n element = worklist.pop();\n\n if (element === sentinel) {\n element = leavelist.pop();\n\n ret = this.__execute(visitor.leave, element);\n\n if (this.__state === BREAK || ret === BREAK) {\n return;\n }\n continue;\n }\n\n if (element.node) {\n\n ret = this.__execute(visitor.enter, element);\n\n if (this.__state === BREAK || ret === BREAK) {\n return;\n }\n\n worklist.push(sentinel);\n leavelist.push(element);\n\n if (this.__state === SKIP || ret === SKIP) {\n continue;\n }\n\n node = element.node;\n nodeType = node.type || element.wrap;\n candidates = this.__keys[nodeType];\n if (!candidates) {\n if (this.__fallback) {\n candidates = this.__fallback(node);\n } else {\n throw new Error('Unknown node type ' + nodeType + '.');\n }\n }\n\n current = candidates.length;\n while ((current -= 1) >= 0) {\n key = candidates[current];\n candidate = node[key];\n if (!candidate) {\n continue;\n }\n\n if (Array.isArray(candidate)) {\n current2 = candidate.length;\n while ((current2 -= 1) >= 0) {\n if (!candidate[current2]) {\n continue;\n }\n\n if (candidateExistsInLeaveList(leavelist, candidate[current2])) {\n continue;\n }\n\n if (isProperty(nodeType, candidates[current])) {\n element = new Element(candidate[current2], [key, current2], 'Property', null);\n } else if (isNode(candidate[current2])) {\n element = new Element(candidate[current2], [key, current2], null, null);\n } else {\n continue;\n }\n worklist.push(element);\n }\n } else if (isNode(candidate)) {\n if (candidateExistsInLeaveList(leavelist, candidate)) {\n continue;\n }\n\n worklist.push(new Element(candidate, key, null, null));\n }\n }\n }\n }\n };\n\n Controller.prototype.replace = function replace(root, visitor) {\n var worklist,\n leavelist,\n node,\n nodeType,\n target,\n element,\n current,\n current2,\n candidates,\n candidate,\n sentinel,\n outer,\n key;\n\n function removeElem(element) {\n var i,\n key,\n nextElem,\n parent;\n\n if (element.ref.remove()) {\n // When the reference is an element of an array.\n key = element.ref.key;\n parent = element.ref.parent;\n\n // If removed from array, then decrease following items' keys.\n i = worklist.length;\n while (i--) {\n nextElem = worklist[i];\n if (nextElem.ref && nextElem.ref.parent === parent) {\n if (nextElem.ref.key < key) {\n break;\n }\n --nextElem.ref.key;\n }\n }\n }\n }\n\n this.__initialize(root, visitor);\n\n sentinel = {};\n\n // reference\n worklist = this.__worklist;\n leavelist = this.__leavelist;\n\n // initialize\n outer = {\n root: root\n };\n element = new Element(root, null, null, new Reference(outer, 'root'));\n worklist.push(element);\n leavelist.push(element);\n\n while (worklist.length) {\n element = worklist.pop();\n\n if (element === sentinel) {\n element = leavelist.pop();\n\n target = this.__execute(visitor.leave, element);\n\n // node may be replaced with null,\n // so distinguish between undefined and null in this place\n if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {\n // replace\n element.ref.replace(target);\n }\n\n if (this.__state === REMOVE || target === REMOVE) {\n removeElem(element);\n }\n\n if (this.__state === BREAK || target === BREAK) {\n return outer.root;\n }\n continue;\n }\n\n target = this.__execute(visitor.enter, element);\n\n // node may be replaced with null,\n // so distinguish between undefined and null in this place\n if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {\n // replace\n element.ref.replace(target);\n element.node = target;\n }\n\n if (this.__state === REMOVE || target === REMOVE) {\n removeElem(element);\n element.node = null;\n }\n\n if (this.__state === BREAK || target === BREAK) {\n return outer.root;\n }\n\n // node may be null\n node = element.node;\n if (!node) {\n continue;\n }\n\n worklist.push(sentinel);\n leavelist.push(element);\n\n if (this.__state === SKIP || target === SKIP) {\n continue;\n }\n\n nodeType = node.type || element.wrap;\n candidates = this.__keys[nodeType];\n if (!candidates) {\n if (this.__fallback) {\n candidates = this.__fallback(node);\n } else {\n throw new Error('Unknown node type ' + nodeType + '.');\n }\n }\n\n current = candidates.length;\n while ((current -= 1) >= 0) {\n key = candidates[current];\n candidate = node[key];\n if (!candidate) {\n continue;\n }\n\n if (Array.isArray(candidate)) {\n current2 = candidate.length;\n while ((current2 -= 1) >= 0) {\n if (!candidate[current2]) {\n continue;\n }\n if (isProperty(nodeType, candidates[current])) {\n element = new Element(candidate[current2], [key, current2], 'Property', new Reference(candidate, current2));\n } else if (isNode(candidate[current2])) {\n element = new Element(candidate[current2], [key, current2], null, new Reference(candidate, current2));\n } else {\n continue;\n }\n worklist.push(element);\n }\n } else if (isNode(candidate)) {\n worklist.push(new Element(candidate, key, null, new Reference(node, key)));\n }\n }\n }\n\n return outer.root;\n };\n\n function traverse(root, visitor) {\n var controller = new Controller();\n return controller.traverse(root, visitor);\n }\n\n function replace(root, visitor) {\n var controller = new Controller();\n return controller.replace(root, visitor);\n }\n\n function extendCommentRange(comment, tokens) {\n var target;\n\n target = upperBound(tokens, function search(token) {\n return token.range[0] > comment.range[0];\n });\n\n comment.extendedRange = [comment.range[0], comment.range[1]];\n\n if (target !== tokens.length) {\n comment.extendedRange[1] = tokens[target].range[0];\n }\n\n target -= 1;\n if (target >= 0) {\n comment.extendedRange[0] = tokens[target].range[1];\n }\n\n return comment;\n }\n\n function attachComments(tree, providedComments, tokens) {\n // At first, we should calculate extended comment ranges.\n var comments = [], comment, len, i, cursor;\n\n if (!tree.range) {\n throw new Error('attachComments needs range information');\n }\n\n // tokens array is empty, we attach comments to tree as 'leadingComments'\n if (!tokens.length) {\n if (providedComments.length) {\n for (i = 0, len = providedComments.length; i < len; i += 1) {\n comment = deepCopy(providedComments[i]);\n comment.extendedRange = [0, tree.range[0]];\n comments.push(comment);\n }\n tree.leadingComments = comments;\n }\n return tree;\n }\n\n for (i = 0, len = providedComments.length; i < len; i += 1) {\n comments.push(extendCommentRange(deepCopy(providedComments[i]), tokens));\n }\n\n // This is based on John Freeman's implementation.\n cursor = 0;\n traverse(tree, {\n enter: function (node) {\n var comment;\n\n while (cursor < comments.length) {\n comment = comments[cursor];\n if (comment.extendedRange[1] > node.range[0]) {\n break;\n }\n\n if (comment.extendedRange[1] === node.range[0]) {\n if (!node.leadingComments) {\n node.leadingComments = [];\n }\n node.leadingComments.push(comment);\n comments.splice(cursor, 1);\n } else {\n cursor += 1;\n }\n }\n\n // already out of owned node\n if (cursor === comments.length) {\n return VisitorOption.Break;\n }\n\n if (comments[cursor].extendedRange[0] > node.range[1]) {\n return VisitorOption.Skip;\n }\n }\n });\n\n cursor = 0;\n traverse(tree, {\n leave: function (node) {\n var comment;\n\n while (cursor < comments.length) {\n comment = comments[cursor];\n if (node.range[1] < comment.extendedRange[0]) {\n break;\n }\n\n if (node.range[1] === comment.extendedRange[0]) {\n if (!node.trailingComments) {\n node.trailingComments = [];\n }\n node.trailingComments.push(comment);\n comments.splice(cursor, 1);\n } else {\n cursor += 1;\n }\n }\n\n // already out of owned node\n if (cursor === comments.length) {\n return VisitorOption.Break;\n }\n\n if (comments[cursor].extendedRange[0] > node.range[1]) {\n return VisitorOption.Skip;\n }\n }\n });\n\n return tree;\n }\n\n exports.Syntax = Syntax;\n exports.traverse = traverse;\n exports.replace = replace;\n exports.attachComments = attachComments;\n exports.VisitorKeys = VisitorKeys;\n exports.VisitorOption = VisitorOption;\n exports.Controller = Controller;\n exports.cloneEnvironment = function () { return clone({}); };\n\n return exports;\n}(exports));\n/* vim: set sw=4 ts=4 et tw=80 : */\n", "/*\n * Generated by PEG.js 0.10.0.\n *\n * http://pegjs.org/\n */\n(function(root, factory) {\n if (typeof define === \"function\" && define.amd) {\n define([], factory);\n } else if (typeof module === \"object\" && module.exports) {\n module.exports = factory();\n }\n})(this, function() {\n \"use strict\";\n\n function peg$subclass(child, parent) {\n function ctor() { this.constructor = child; }\n ctor.prototype = parent.prototype;\n child.prototype = new ctor();\n }\n\n function peg$SyntaxError(message, expected, found, location) {\n this.message = message;\n this.expected = expected;\n this.found = found;\n this.location = location;\n this.name = \"SyntaxError\";\n\n if (typeof Error.captureStackTrace === \"function\") {\n Error.captureStackTrace(this, peg$SyntaxError);\n }\n }\n\n peg$subclass(peg$SyntaxError, Error);\n\n peg$SyntaxError.buildMessage = function(expected, found) {\n var DESCRIBE_EXPECTATION_FNS = {\n literal: function(expectation) {\n return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n },\n\n \"class\": function(expectation) {\n var escapedParts = \"\",\n i;\n\n for (i = 0; i < expectation.parts.length; i++) {\n escapedParts += expectation.parts[i] instanceof Array\n ? classEscape(expectation.parts[i][0]) + \"-\" + classEscape(expectation.parts[i][1])\n : classEscape(expectation.parts[i]);\n }\n\n return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts + \"]\";\n },\n\n any: function(expectation) {\n return \"any character\";\n },\n\n end: function(expectation) {\n return \"end of input\";\n },\n\n other: function(expectation) {\n return expectation.description;\n }\n };\n\n function hex(ch) {\n return ch.charCodeAt(0).toString(16).toUpperCase();\n }\n\n function literalEscape(s) {\n return s\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\0/g, '\\\\0')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/[\\x00-\\x0F]/g, function(ch) { return '\\\\x0' + hex(ch); })\n .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return '\\\\x' + hex(ch); });\n }\n\n function classEscape(s) {\n return s\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\]/g, '\\\\]')\n .replace(/\\^/g, '\\\\^')\n .replace(/-/g, '\\\\-')\n .replace(/\\0/g, '\\\\0')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/[\\x00-\\x0F]/g, function(ch) { return '\\\\x0' + hex(ch); })\n .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return '\\\\x' + hex(ch); });\n }\n\n function describeExpectation(expectation) {\n return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n }\n\n function describeExpected(expected) {\n var descriptions = new Array(expected.length),\n i, j;\n\n for (i = 0; i < expected.length; i++) {\n descriptions[i] = describeExpectation(expected[i]);\n }\n\n descriptions.sort();\n\n if (descriptions.length > 0) {\n for (i = 1, j = 1; i < descriptions.length; i++) {\n if (descriptions[i - 1] !== descriptions[i]) {\n descriptions[j] = descriptions[i];\n j++;\n }\n }\n descriptions.length = j;\n }\n\n switch (descriptions.length) {\n case 1:\n return descriptions[0];\n\n case 2:\n return descriptions[0] + \" or \" + descriptions[1];\n\n default:\n return descriptions.slice(0, -1).join(\", \")\n + \", or \"\n + descriptions[descriptions.length - 1];\n }\n }\n\n function describeFound(found) {\n return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n }\n\n return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n };\n\n function peg$parse(input, options) {\n options = options !== void 0 ? options : {};\n\n var peg$FAILED = {},\n\n peg$startRuleFunctions = { start: peg$parsestart },\n peg$startRuleFunction = peg$parsestart,\n\n peg$c0 = function(ss) {\n return ss.length === 1 ? ss[0] : { type: 'matches', selectors: ss };\n },\n peg$c1 = function() { return void 0; },\n peg$c2 = \" \",\n peg$c3 = peg$literalExpectation(\" \", false),\n peg$c4 = /^[^ [\\],():#!=><~+.]/,\n peg$c5 = peg$classExpectation([\" \", \"[\", \"]\", \",\", \"(\", \")\", \":\", \"#\", \"!\", \"=\", \">\", \"<\", \"~\", \"+\", \".\"], true, false),\n peg$c6 = function(i) { return i.join(''); },\n peg$c7 = \">\",\n peg$c8 = peg$literalExpectation(\">\", false),\n peg$c9 = function() { return 'child'; },\n peg$c10 = \"~\",\n peg$c11 = peg$literalExpectation(\"~\", false),\n peg$c12 = function() { return 'sibling'; },\n peg$c13 = \"+\",\n peg$c14 = peg$literalExpectation(\"+\", false),\n peg$c15 = function() { return 'adjacent'; },\n peg$c16 = function() { return 'descendant'; },\n peg$c17 = \",\",\n peg$c18 = peg$literalExpectation(\",\", false),\n peg$c19 = function(s, ss) {\n return [s].concat(ss.map(function (s) { return s[3]; }));\n },\n peg$c20 = function(a, ops) {\n return ops.reduce(function (memo, rhs) {\n return { type: rhs[0], left: memo, right: rhs[1] };\n }, a);\n },\n peg$c21 = \"!\",\n peg$c22 = peg$literalExpectation(\"!\", false),\n peg$c23 = function(subject, as) {\n const b = as.length === 1 ? as[0] : { type: 'compound', selectors: as };\n if(subject) b.subject = true;\n return b;\n },\n peg$c24 = \"*\",\n peg$c25 = peg$literalExpectation(\"*\", false),\n peg$c26 = function(a) { return { type: 'wildcard', value: a }; },\n peg$c27 = \"#\",\n peg$c28 = peg$literalExpectation(\"#\", false),\n peg$c29 = function(i) { return { type: 'identifier', value: i }; },\n peg$c30 = \"[\",\n peg$c31 = peg$literalExpectation(\"[\", false),\n peg$c32 = \"]\",\n peg$c33 = peg$literalExpectation(\"]\", false),\n peg$c34 = function(v) { return v; },\n peg$c35 = /^[><!]/,\n peg$c36 = peg$classExpectation([\">\", \"<\", \"!\"], false, false),\n peg$c37 = \"=\",\n peg$c38 = peg$literalExpectation(\"=\", false),\n peg$c39 = function(a) { return (a || '') + '='; },\n peg$c40 = /^[><]/,\n peg$c41 = peg$classExpectation([\">\", \"<\"], false, false),\n peg$c42 = \".\",\n peg$c43 = peg$literalExpectation(\".\", false),\n peg$c44 = function(a, as) {\n return [].concat.apply([a], as).join('');\n },\n peg$c45 = function(name, op, value) {\n return { type: 'attribute', name: name, operator: op, value: value };\n },\n peg$c46 = function(name) { return { type: 'attribute', name: name }; },\n peg$c47 = \"\\\"\",\n peg$c48 = peg$literalExpectation(\"\\\"\", false),\n peg$c49 = /^[^\\\\\"]/,\n peg$c50 = peg$classExpectation([\"\\\\\", \"\\\"\"], true, false),\n peg$c51 = \"\\\\\",\n peg$c52 = peg$literalExpectation(\"\\\\\", false),\n peg$c53 = peg$anyExpectation(),\n peg$c54 = function(a, b) { return a + b; },\n peg$c55 = function(d) {\n return { type: 'literal', value: strUnescape(d.join('')) };\n },\n peg$c56 = \"'\",\n peg$c57 = peg$literalExpectation(\"'\", false),\n peg$c58 = /^[^\\\\']/,\n peg$c59 = peg$classExpectation([\"\\\\\", \"'\"], true, false),\n peg$c60 = /^[0-9]/,\n peg$c61 = peg$classExpectation([[\"0\", \"9\"]], false, false),\n peg$c62 = function(a, b) {\n // Can use `a.flat().join('')` once supported\n const leadingDecimals = a ? [].concat.apply([], a).join('') : '';\n return { type: 'literal', value: parseFloat(leadingDecimals + b.join('')) };\n },\n peg$c63 = function(i) { return { type: 'literal', value: i }; },\n peg$c64 = \"type(\",\n peg$c65 = peg$literalExpectation(\"type(\", false),\n peg$c66 = /^[^ )]/,\n peg$c67 = peg$classExpectation([\" \", \")\"], true, false),\n peg$c68 = \")\",\n peg$c69 = peg$literalExpectation(\")\", false),\n peg$c70 = function(t) { return { type: 'type', value: t.join('') }; },\n peg$c71 = /^[imsu]/,\n peg$c72 = peg$classExpectation([\"i\", \"m\", \"s\", \"u\"], false, false),\n peg$c73 = \"/\",\n peg$c74 = peg$literalExpectation(\"/\", false),\n peg$c75 = /^[^\\/]/,\n peg$c76 = peg$classExpectation([\"/\"], true, false),\n peg$c77 = function(d, flgs) { return {\n type: 'regexp', value: new RegExp(d.join(''), flgs ? flgs.join('') : '') };\n },\n peg$c78 = function(i, is) {\n return { type: 'field', name: is.reduce(function(memo, p){ return memo + p[0] + p[1]; }, i)};\n },\n peg$c79 = \":not(\",\n peg$c80 = peg$literalExpectation(\":not(\", false),\n peg$c81 = function(ss) { return { type: 'not', selectors: ss }; },\n peg$c82 = \":matches(\",\n peg$c83 = peg$literalExpectation(\":matches(\", false),\n peg$c84 = function(ss) { return { type: 'matches', selectors: ss }; },\n peg$c85 = \":has(\",\n peg$c86 = peg$literalExpectation(\":has(\", false),\n peg$c87 = function(ss) { return { type: 'has', selectors: ss }; },\n peg$c88 = \":first-child\",\n peg$c89 = peg$literalExpectation(\":first-child\", false),\n peg$c90 = function() { return nth(1); },\n peg$c91 = \":last-child\",\n peg$c92 = peg$literalExpectation(\":last-child\", false),\n peg$c93 = function() { return nthLast(1); },\n peg$c94 = \":nth-child(\",\n peg$c95 = peg$literalExpectation(\":nth-child(\", false),\n peg$c96 = function(n) { return nth(parseInt(n.join(''), 10)); },\n peg$c97 = \":nth-last-child(\",\n peg$c98 = peg$literalExpectation(\":nth-last-child(\", false),\n peg$c99 = function(n) { return nthLast(parseInt(n.join(''), 10)); },\n peg$c100 = \":\",\n peg$c101 = peg$literalExpectation(\":\", false),\n peg$c102 = \"statement\",\n peg$c103 = peg$literalExpectation(\"statement\", true),\n peg$c104 = \"expression\",\n peg$c105 = peg$literalExpectation(\"expression\", true),\n peg$c106 = \"declaration\",\n peg$c107 = peg$literalExpectation(\"declaration\", true),\n peg$c108 = \"function\",\n peg$c109 = peg$literalExpectation(\"function\", true),\n peg$c110 = \"pattern\",\n peg$c111 = peg$literalExpectation(\"pattern\", true),\n peg$c112 = function(c) {\n return { type: 'class', name: c };\n },\n\n peg$currPos = 0,\n peg$savedPos = 0,\n peg$posDetailsCache = [{ line: 1, column: 1 }],\n peg$maxFailPos = 0,\n peg$maxFailExpected = [],\n peg$silentFails = 0,\n\n peg$resultsCache = {},\n\n peg$result;\n\n if (\"startRule\" in options) {\n if (!(options.startRule in peg$startRuleFunctions)) {\n throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n }\n\n peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n }\n\n function text() {\n return input.substring(peg$savedPos, peg$currPos);\n }\n\n function location() {\n return peg$computeLocation(peg$savedPos, peg$currPos);\n }\n\n function expected(description, location) {\n location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)\n\n throw peg$buildStructuredError(\n [peg$otherExpectation(description)],\n input.substring(peg$savedPos, peg$currPos),\n location\n );\n }\n\n function error(message, location) {\n location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)\n\n throw peg$buildSimpleError(message, location);\n }\n\n function peg$literalExpectation(text, ignoreCase) {\n return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n }\n\n function peg$classExpectation(parts, inverted, ignoreCase) {\n return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n }\n\n function peg$anyExpectation() {\n return { type: \"any\" };\n }\n\n function peg$endExpectation() {\n return { type: \"end\" };\n }\n\n function peg$otherExpectation(description) {\n return { type: \"other\", description: description };\n }\n\n function peg$computePosDetails(pos) {\n var details = peg$posDetailsCache[pos], p;\n\n if (details) {\n return details;\n } else {\n p = pos - 1;\n while (!peg$posDetailsCache[p]) {\n p--;\n }\n\n details = peg$posDetailsCache[p];\n details = {\n line: details.line,\n column: details.column\n };\n\n while (p < pos) {\n if (input.charCodeAt(p) === 10) {\n details.line++;\n details.column = 1;\n } else {\n details.column++;\n }\n\n p++;\n }\n\n peg$posDetailsCache[pos] = details;\n return details;\n }\n }\n\n function peg$computeLocation(startPos, endPos) {\n var startPosDetails = peg$computePosDetails(startPos),\n endPosDetails = peg$computePosDetails(endPos);\n\n return {\n start: {\n offset: startPos,\n line: startPosDetails.line,\n column: startPosDetails.column\n },\n end: {\n offset: endPos,\n line: endPosDetails.line,\n column: endPosDetails.column\n }\n };\n }\n\n function peg$fail(expected) {\n if (peg$currPos < peg$maxFailPos) { return; }\n\n if (peg$currPos > peg$maxFailPos) {\n peg$maxFailPos = peg$currPos;\n peg$maxFailExpected = [];\n }\n\n peg$maxFailExpected.push(expected);\n }\n\n function peg$buildSimpleError(message, location) {\n return new peg$SyntaxError(message, null, null, location);\n }\n\n function peg$buildStructuredError(expected, found, location) {\n return new peg$SyntaxError(\n peg$SyntaxError.buildMessage(expected, found),\n expected,\n found,\n location\n );\n }\n\n function peg$parsestart() {\n var s0, s1, s2, s3;\n\n var key = peg$currPos * 30 + 0,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n s1 = peg$parse_();\n if (s1 !== peg$FAILED) {\n s2 = peg$parseselectors();\n if (s2 !== peg$FAILED) {\n s3 = peg$parse_();\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c0(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$parse_();\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c1();\n }\n s0 = s1;\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parse_() {\n var s0, s1;\n\n var key = peg$currPos * 30 + 1,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = [];\n if (input.charCodeAt(peg$currPos) === 32) {\n s1 = peg$c2;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c3); }\n }\n while (s1 !== peg$FAILED) {\n s0.push(s1);\n if (input.charCodeAt(peg$currPos) === 32) {\n s1 = peg$c2;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c3); }\n }\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parseidentifierName() {\n var s0, s1, s2;\n\n var key = peg$currPos * 30 + 2,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n s1 = [];\n if (peg$c4.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c5); }\n }\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n if (peg$c4.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c5); }\n }\n }\n } else {\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c6(s1);\n }\n s0 = s1;\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parsebinaryOp() {\n var s0, s1, s2, s3;\n\n var key = peg$currPos * 30 + 3,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n s1 = peg$parse_();\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 62) {\n s2 = peg$c7;\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c8); }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parse_();\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c9();\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$parse_();\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 126) {\n s2 = peg$c10;\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c11); }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parse_();\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c12();\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$parse_();\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 43) {\n s2 = peg$c13;\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c14); }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parse_();\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c15();\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 32) {\n s1 = peg$c2;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c3); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c16();\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n }\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parseselectors() {\n var s0, s1, s2, s3, s4, s5, s6, s7;\n\n var key = peg$currPos * 30 + 4,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n s1 = peg$parseselector();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s5 = peg$c17;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c18); }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n s7 = peg$parseselector();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s5 = peg$c17;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c18); }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n s7 = peg$parseselector();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c19(s1, s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parseselector() {\n var s0, s1, s2, s3, s4, s5;\n\n var key = peg$currPos * 30 + 5,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n s1 = peg$parsesequence();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$currPos;\n s4 = peg$parsebinaryOp();\n if (s4 !== peg$FAILED) {\n s5 = peg$parsesequence();\n if (s5 !== peg$FAILED) {\n s4 = [s4, s5];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$currPos;\n s4 = peg$parsebinaryOp();\n if (s4 !== peg$FAILED) {\n s5 = peg$parsesequence();\n if (s5 !== peg$FAILED) {\n s4 = [s4, s5];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c20(s1, s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parsesequence() {\n var s0, s1, s2, s3;\n\n var key = peg$currPos * 30 + 6,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 33) {\n s1 = peg$c21;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c22); }\n }\n if (s1 === peg$FAILED) {\n s1 = null;\n }\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$parseatom();\n if (s3 !== peg$FAILED) {\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$parseatom();\n }\n } else {\n s2 = peg$FAILED;\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c23(s1, s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parseatom() {\n var s0;\n\n var key = peg$currPos * 30 + 7,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$parsewildcard();\n if (s0 === peg$FAILED) {\n s0 = peg$parseidentifier();\n if (s0 === peg$FAILED) {\n s0 = peg$parseattr();\n if (s0 === peg$FAILED) {\n s0 = peg$parsefield();\n if (s0 === peg$FAILED) {\n s0 = peg$parsenegation();\n if (s0 === peg$FAILED) {\n s0 = peg$parsematches();\n if (s0 === peg$FAILED) {\n s0 = peg$parsehas();\n if (s0 === peg$FAILED) {\n s0 = peg$parsefirstChild();\n if (s0 === peg$FAILED) {\n s0 = peg$parselastChild();\n if (s0 === peg$FAILED) {\n s0 = peg$parsenthChild();\n if (s0 === peg$FAILED) {\n s0 = peg$parsenthLastChild();\n if (s0 === peg$FAILED) {\n s0 = peg$parseclass();\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parsewildcard() {\n var s0, s1;\n\n var key = peg$currPos * 30 + 8,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 42) {\n s1 = peg$c24;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c25); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c26(s1);\n }\n s0 = s1;\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parseidentifier() {\n var s0, s1, s2;\n\n var key = peg$currPos * 30 + 9,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 35) {\n s1 = peg$c27;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c28); }\n }\n if (s1 === peg$FAILED) {\n s1 = null;\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseidentifierName();\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c29(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parseattr() {\n var s0, s1, s2, s3, s4, s5;\n\n var key = peg$currPos * 30 + 10,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 91) {\n s1 = peg$c30;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c31); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n if (s2 !== peg$FAILED) {\n s3 = peg$parseattrValue();\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 93) {\n s5 = peg$c32;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c33); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c34(s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parseattrOps() {\n var s0, s1, s2;\n\n var key = peg$currPos * 30 + 11,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n if (peg$c35.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c36); }\n }\n if (s1 === peg$FAILED) {\n s1 = null;\n }\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 61) {\n s2 = peg$c37;\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c38); }\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c39(s1);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n if (peg$c40.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c41); }\n }\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parseattrEqOps() {\n var s0, s1, s2;\n\n var key = peg$currPos * 30 + 12,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 33) {\n s1 = peg$c21;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c22); }\n }\n if (s1 === peg$FAILED) {\n s1 = null;\n }\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 61) {\n s2 = peg$c37;\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c38); }\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c39(s1);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parseattrName() {\n var s0, s1, s2, s3, s4, s5;\n\n var key = peg$currPos * 30 + 13,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n s1 = peg$parseidentifierName();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 46) {\n s4 = peg$c42;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c43); }\n }\n if (s4 !== peg$FAILED) {\n s5 = peg$parseidentifierName();\n if (s5 !== peg$FAILED) {\n s4 = [s4, s5];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 46) {\n s4 = peg$c42;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c43); }\n }\n if (s4 !== peg$FAILED) {\n s5 = peg$parseidentifierName();\n if (s5 !== peg$FAILED) {\n s4 = [s4, s5];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c44(s1, s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parseattrValue() {\n var s0, s1, s2, s3, s4, s5;\n\n var key = peg$currPos * 30 + 14,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n s1 = peg$parseattrName();\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n if (s2 !== peg$FAILED) {\n s3 = peg$parseattrEqOps();\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n s5 = peg$parsetype();\n if (s5 === peg$FAILED) {\n s5 = peg$parseregex();\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c45(s1, s3, s5);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$parseattrName();\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n if (s2 !== peg$FAILED) {\n s3 = peg$parseattrOps();\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n s5 = peg$parsestring();\n if (s5 === peg$FAILED) {\n s5 = peg$parsenumber();\n if (s5 === peg$FAILED) {\n s5 = peg$parsepath();\n }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c45(s1, s3, s5);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$parseattrName();\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c46(s1);\n }\n s0 = s1;\n }\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parsestring() {\n var s0, s1, s2, s3, s4, s5;\n\n var key = peg$currPos * 30 + 15,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 34) {\n s1 = peg$c47;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c48); }\n }\n if (s1 !== peg$FAILED) {\n s2 = [];\n if (peg$c49.test(input.charAt(peg$currPos))) {\n s3 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c50); }\n }\n if (s3 === peg$FAILED) {\n s3 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 92) {\n s4 = peg$c51;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c52); }\n }\n if (s4 !== peg$FAILED) {\n if (input.length > peg$currPos) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c53); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s3;\n s4 = peg$c54(s4, s5);\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n if (peg$c49.test(input.charAt(peg$currPos))) {\n s3 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c50); }\n }\n if (s3 === peg$FAILED) {\n s3 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 92) {\n s4 = peg$c51;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c52); }\n }\n if (s4 !== peg$FAILED) {\n if (input.length > peg$currPos) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c53); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s3;\n s4 = peg$c54(s4, s5);\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n }\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 34) {\n s3 = peg$c47;\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c48); }\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c55(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 39) {\n s1 = peg$c56;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c57); }\n }\n if (s1 !== peg$FAILED) {\n s2 = [];\n if (peg$c58.test(input.charAt(peg$currPos))) {\n s3 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c59); }\n }\n if (s3 === peg$FAILED) {\n s3 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 92) {\n s4 = peg$c51;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c52); }\n }\n if (s4 !== peg$FAILED) {\n if (input.length > peg$currPos) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c53); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s3;\n s4 = peg$c54(s4, s5);\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n if (peg$c58.test(input.charAt(peg$currPos))) {\n s3 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c59); }\n }\n if (s3 === peg$FAILED) {\n s3 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 92) {\n s4 = peg$c51;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c52); }\n }\n if (s4 !== peg$FAILED) {\n if (input.length > peg$currPos) {\n s5 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c53); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s3;\n s4 = peg$c54(s4, s5);\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n }\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 39) {\n s3 = peg$c56;\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c57); }\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c55(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parsenumber() {\n var s0, s1, s2, s3;\n\n var key = peg$currPos * 30 + 16,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n s1 = peg$currPos;\n s2 = [];\n if (peg$c60.test(input.charAt(peg$currPos))) {\n s3 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c61); }\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n if (peg$c60.test(input.charAt(peg$currPos))) {\n s3 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c61); }\n }\n }\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 46) {\n s3 = peg$c42;\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c43); }\n }\n if (s3 !== peg$FAILED) {\n s2 = [s2, s3];\n s1 = s2;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n if (s1 === peg$FAILED) {\n s1 = null;\n }\n if (s1 !== peg$FAILED) {\n s2 = [];\n if (peg$c60.test(input.charAt(peg$currPos))) {\n s3 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c61); }\n }\n if (s3 !== peg$FAILED) {\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n if (peg$c60.test(input.charAt(peg$currPos))) {\n s3 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c61); }\n }\n }\n } else {\n s2 = peg$FAILED;\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c62(s1, s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parsepath() {\n var s0, s1;\n\n var key = peg$currPos * 30 + 17,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n s1 = peg$parseidentifierName();\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c63(s1);\n }\n s0 = s1;\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parsetype() {\n var s0, s1, s2, s3, s4, s5;\n\n var key = peg$currPos * 30 + 18,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 5) === peg$c64) {\n s1 = peg$c64;\n peg$currPos += 5;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c65); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n if (s2 !== peg$FAILED) {\n s3 = [];\n if (peg$c66.test(input.charAt(peg$currPos))) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c67); }\n }\n if (s4 !== peg$FAILED) {\n while (s4 !== peg$FAILED) {\n s3.push(s4);\n if (peg$c66.test(input.charAt(peg$currPos))) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c67); }\n }\n }\n } else {\n s3 = peg$FAILED;\n }\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 41) {\n s5 = peg$c68;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c69); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c70(s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parseflags() {\n var s0, s1;\n\n var key = peg$currPos * 30 + 19,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = [];\n if (peg$c71.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c72); }\n }\n if (s1 !== peg$FAILED) {\n while (s1 !== peg$FAILED) {\n s0.push(s1);\n if (peg$c71.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c72); }\n }\n }\n } else {\n s0 = peg$FAILED;\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parseregex() {\n var s0, s1, s2, s3, s4;\n\n var key = peg$currPos * 30 + 20,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 47) {\n s1 = peg$c73;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c74); }\n }\n if (s1 !== peg$FAILED) {\n s2 = [];\n if (peg$c75.test(input.charAt(peg$currPos))) {\n s3 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c76); }\n }\n if (s3 !== peg$FAILED) {\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n if (peg$c75.test(input.charAt(peg$currPos))) {\n s3 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c76); }\n }\n }\n } else {\n s2 = peg$FAILED;\n }\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 47) {\n s3 = peg$c73;\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c74); }\n }\n if (s3 !== peg$FAILED) {\n s4 = peg$parseflags();\n if (s4 === peg$FAILED) {\n s4 = null;\n }\n if (s4 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c77(s2, s4);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parsefield() {\n var s0, s1, s2, s3, s4, s5, s6;\n\n var key = peg$currPos * 30 + 21,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 46) {\n s1 = peg$c42;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c43); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseidentifierName();\n if (s2 !== peg$FAILED) {\n s3 = [];\n s4 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 46) {\n s5 = peg$c42;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c43); }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parseidentifierName();\n if (s6 !== peg$FAILED) {\n s5 = [s5, s6];\n s4 = s5;\n } else {\n peg$currPos = s4;\n s4 = peg$FAILED;\n }\n } else {\n peg$currPos = s4;\n s4 = peg$FAILED;\n }\n while (s4 !== peg$FAILED) {\n s3.push(s4);\n s4 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 46) {\n s5 = peg$c42;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c43); }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parseidentifierName();\n if (s6 !== peg$FAILED) {\n s5 = [s5, s6];\n s4 = s5;\n } else {\n peg$currPos = s4;\n s4 = peg$FAILED;\n }\n } else {\n peg$currPos = s4;\n s4 = peg$FAILED;\n }\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c78(s2, s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parsenegation() {\n var s0, s1, s2, s3, s4, s5;\n\n var key = peg$currPos * 30 + 22,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 5) === peg$c79) {\n s1 = peg$c79;\n peg$currPos += 5;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c80); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n if (s2 !== peg$FAILED) {\n s3 = peg$parseselectors();\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 41) {\n s5 = peg$c68;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c69); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c81(s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parsematches() {\n var s0, s1, s2, s3, s4, s5;\n\n var key = peg$currPos * 30 + 23,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 9) === peg$c82) {\n s1 = peg$c82;\n peg$currPos += 9;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c83); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n if (s2 !== peg$FAILED) {\n s3 = peg$parseselectors();\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 41) {\n s5 = peg$c68;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c69); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c84(s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parsehas() {\n var s0, s1, s2, s3, s4, s5;\n\n var key = peg$currPos * 30 + 24,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 5) === peg$c85) {\n s1 = peg$c85;\n peg$currPos += 5;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c86); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n if (s2 !== peg$FAILED) {\n s3 = peg$parseselectors();\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 41) {\n s5 = peg$c68;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c69); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c87(s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parsefirstChild() {\n var s0, s1;\n\n var key = peg$currPos * 30 + 25,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 12) === peg$c88) {\n s1 = peg$c88;\n peg$currPos += 12;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c89); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c90();\n }\n s0 = s1;\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parselastChild() {\n var s0, s1;\n\n var key = peg$currPos * 30 + 26,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 11) === peg$c91) {\n s1 = peg$c91;\n peg$currPos += 11;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c92); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c93();\n }\n s0 = s1;\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parsenthChild() {\n var s0, s1, s2, s3, s4, s5;\n\n var key = peg$currPos * 30 + 27,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 11) === peg$c94) {\n s1 = peg$c94;\n peg$currPos += 11;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c95); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n if (s2 !== peg$FAILED) {\n s3 = [];\n if (peg$c60.test(input.charAt(peg$currPos))) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c61); }\n }\n if (s4 !== peg$FAILED) {\n while (s4 !== peg$FAILED) {\n s3.push(s4);\n if (peg$c60.test(input.charAt(peg$currPos))) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c61); }\n }\n }\n } else {\n s3 = peg$FAILED;\n }\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 41) {\n s5 = peg$c68;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c69); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c96(s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parsenthLastChild() {\n var s0, s1, s2, s3, s4, s5;\n\n var key = peg$currPos * 30 + 28,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 16) === peg$c97) {\n s1 = peg$c97;\n peg$currPos += 16;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c98); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n if (s2 !== peg$FAILED) {\n s3 = [];\n if (peg$c60.test(input.charAt(peg$currPos))) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c61); }\n }\n if (s4 !== peg$FAILED) {\n while (s4 !== peg$FAILED) {\n s3.push(s4);\n if (peg$c60.test(input.charAt(peg$currPos))) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c61); }\n }\n }\n } else {\n s3 = peg$FAILED;\n }\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 41) {\n s5 = peg$c68;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c69); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c99(s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n function peg$parseclass() {\n var s0, s1, s2;\n\n var key = peg$currPos * 30 + 29,\n cached = peg$resultsCache[key];\n\n if (cached) {\n peg$currPos = cached.nextPos;\n\n return cached.result;\n }\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 58) {\n s1 = peg$c100;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c101); }\n }\n if (s1 !== peg$FAILED) {\n if (input.substr(peg$currPos, 9).toLowerCase() === peg$c102) {\n s2 = input.substr(peg$currPos, 9);\n peg$currPos += 9;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c103); }\n }\n if (s2 === peg$FAILED) {\n if (input.substr(peg$currPos, 10).toLowerCase() === peg$c104) {\n s2 = input.substr(peg$currPos, 10);\n peg$currPos += 10;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c105); }\n }\n if (s2 === peg$FAILED) {\n if (input.substr(peg$currPos, 11).toLowerCase() === peg$c106) {\n s2 = input.substr(peg$currPos, 11);\n peg$currPos += 11;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c107); }\n }\n if (s2 === peg$FAILED) {\n if (input.substr(peg$currPos, 8).toLowerCase() === peg$c108) {\n s2 = input.substr(peg$currPos, 8);\n peg$currPos += 8;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c109); }\n }\n if (s2 === peg$FAILED) {\n if (input.substr(peg$currPos, 7).toLowerCase() === peg$c110) {\n s2 = input.substr(peg$currPos, 7);\n peg$currPos += 7;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c111); }\n }\n }\n }\n }\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c112(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };\n\n return s0;\n }\n\n\n function nth(n) { return { type: 'nth-child', index: { type: 'literal', value: n } }; }\n function nthLast(n) { return { type: 'nth-last-child', index: { type: 'literal', value: n } }; }\n function strUnescape(s) {\n return s.replace(/\\\\(.)/g, function(match, ch) {\n switch(ch) {\n case 'b': return '\\b';\n case 'f': return '\\f';\n case 'n': return '\\n';\n case 'r': return '\\r';\n case 't': return '\\t';\n case 'v': return '\\v';\n default: return ch;\n }\n });\n }\n\n\n peg$result = peg$startRuleFunction();\n\n if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n return peg$result;\n } else {\n if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n peg$fail(peg$endExpectation());\n }\n\n throw peg$buildStructuredError(\n peg$maxFailExpected,\n peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n peg$maxFailPos < input.length\n ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n );\n }\n }\n\n return {\n SyntaxError: peg$SyntaxError,\n parse: peg$parse\n };\n});\n", "/* vim: set sw=4 sts=4 : */\nimport estraverse from 'estraverse';\nimport parser from './parser.js';\n\n/**\n* @typedef {\"LEFT_SIDE\"|\"RIGHT_SIDE\"} Side\n*/\n\nconst LEFT_SIDE = 'LEFT_SIDE';\nconst RIGHT_SIDE = 'RIGHT_SIDE';\n\n/**\n * @external AST\n * @see https://esprima.readthedocs.io/en/latest/syntax-tree-format.html\n */\n\n/**\n * One of the rules of `grammar.pegjs`\n * @typedef {PlainObject} SelectorAST\n * @see grammar.pegjs\n*/\n\n/**\n * The `sequence` production of `grammar.pegjs`\n * @typedef {PlainObject} SelectorSequenceAST\n*/\n\n/**\n * Get the value of a property which may be multiple levels down\n * in the object.\n * @param {?PlainObject} obj\n * @param {string} key\n * @returns {undefined|boolean|string|number|external:AST}\n */\nfunction getPath(obj, key) {\n const keys = key.split('.');\n for (const key of keys) {\n if (obj == null) { return obj; }\n obj = obj[key];\n }\n return obj;\n}\n\n/**\n * Determine whether `node` can be reached by following `path`,\n * starting at `ancestor`.\n * @param {?external:AST} node\n * @param {?external:AST} ancestor\n * @param {string[]} path\n * @returns {boolean}\n */\nfunction inPath(node, ancestor, path) {\n if (path.length === 0) { return node === ancestor; }\n if (ancestor == null) { return false; }\n const field = ancestor[path[0]];\n const remainingPath = path.slice(1);\n if (Array.isArray(field)) {\n for (const component of field) {\n if (inPath(node, component, remainingPath)) { return true; }\n }\n return false;\n } else {\n return inPath(node, field, remainingPath);\n }\n}\n\n/**\n * @callback TraverseOptionFallback\n * @param {external:AST} node The given node.\n * @returns {string[]} An array of visitor keys for the given node.\n */\n/**\n * @typedef {object} ESQueryOptions\n * @property { { [nodeType: string]: string[] } } [visitorKeys] By passing `visitorKeys` mapping, we can extend the properties of the nodes that traverse the node.\n * @property {TraverseOptionFallback} [fallback] By passing `fallback` option, we can control the properties of traversing nodes when encountering unknown nodes.\n */\n\n/**\n * Given a `node` and its ancestors, determine if `node` is matched\n * by `selector`.\n * @param {?external:AST} node\n * @param {?SelectorAST} selector\n * @param {external:AST[]} [ancestry=[]]\n * @param {ESQueryOptions} [options]\n * @throws {Error} Unknowns (operator, class name, selector type, or\n * selector value type)\n * @returns {boolean}\n */\nfunction matches(node, selector, ancestry, options) {\n if (!selector) { return true; }\n if (!node) { return false; }\n if (!ancestry) { ancestry = []; }\n\n switch(selector.type) {\n case 'wildcard':\n return true;\n\n case 'identifier':\n return selector.value.toLowerCase() === node.type.toLowerCase();\n\n case 'field': {\n const path = selector.name.split('.');\n const ancestor = ancestry[path.length - 1];\n return inPath(node, ancestor, path);\n\n }\n case 'matches':\n for (const sel of selector.selectors) {\n if (matches(node, sel, ancestry, options)) { return true; }\n }\n return false;\n\n case 'compound':\n for (const sel of selector.selectors) {\n if (!matches(node, sel, ancestry, options)) { return false; }\n }\n return true;\n\n case 'not':\n for (const sel of selector.selectors) {\n if (matches(node, sel, ancestry, options)) { return false; }\n }\n return true;\n\n case 'has': {\n const collector = [];\n for (const sel of selector.selectors) {\n const a = [];\n estraverse.traverse(node, {\n enter (node, parent) {\n if (parent != null) { a.unshift(parent); }\n if (matches(node, sel, a, options)) {\n collector.push(node);\n }\n },\n leave () { a.shift(); },\n keys: options && options.visitorKeys,\n fallback: options && options.fallback || 'iteration'\n });\n }\n return collector.length !== 0;\n\n }\n case 'child':\n if (matches(node, selector.right, ancestry, options)) {\n return matches(ancestry[0], selector.left, ancestry.slice(1), options);\n }\n return false;\n\n case 'descendant':\n if (matches(node, selector.right, ancestry, options)) {\n for (let i = 0, l = ancestry.length; i < l; ++i) {\n if (matches(ancestry[i], selector.left, ancestry.slice(i + 1), options)) {\n return true;\n }\n }\n }\n return false;\n\n case 'attribute': {\n const p = getPath(node, selector.name);\n switch (selector.operator) {\n case void 0:\n return p != null;\n case '=':\n switch (selector.value.type) {\n case 'regexp': return typeof p === 'string' && selector.value.value.test(p);\n case 'literal': return `${selector.value.value}` === `${p}`;\n case 'type': return selector.value.value === typeof p;\n }\n throw new Error(`Unknown selector value type: ${selector.value.type}`);\n case '!=':\n switch (selector.value.type) {\n case 'regexp': return !selector.value.value.test(p);\n case 'literal': return `${selector.value.value}` !== `${p}`;\n case 'type': return selector.value.value !== typeof p;\n }\n throw new Error(`Unknown selector value type: ${selector.value.type}`);\n case '<=': return p <= selector.value.value;\n case '<': return p < selector.value.value;\n case '>': return p > selector.value.value;\n case '>=': return p >= selector.value.value;\n }\n throw new Error(`Unknown operator: ${selector.operator}`);\n }\n case 'sibling':\n return matches(node, selector.right, ancestry, options) &&\n sibling(node, selector.left, ancestry, LEFT_SIDE, options) ||\n selector.left.subject &&\n matches(node, selector.left, ancestry, options) &&\n sibling(node, selector.right, ancestry, RIGHT_SIDE, options);\n case 'adjacent':\n return matches(node, selector.right, ancestry, options) &&\n adjacent(node, selector.left, ancestry, LEFT_SIDE, options) ||\n selector.right.subject &&\n matches(node, selector.left, ancestry, options) &&\n adjacent(node, selector.right, ancestry, RIGHT_SIDE, options);\n\n case 'nth-child':\n return matches(node, selector.right, ancestry, options) &&\n nthChild(node, ancestry, function () {\n return selector.index.value - 1;\n }, options);\n\n case 'nth-last-child':\n return matches(node, selector.right, ancestry, options) &&\n nthChild(node, ancestry, function (length) {\n return length - selector.index.value;\n }, options);\n\n case 'class':\n switch(selector.name.toLowerCase()){\n case 'statement':\n if(node.type.slice(-9) === 'Statement') return true;\n // fallthrough: interface Declaration <: Statement { }\n case 'declaration':\n return node.type.slice(-11) === 'Declaration';\n case 'pattern':\n if(node.type.slice(-7) === 'Pattern') return true;\n // fallthrough: interface Expression <: Node, Pattern { }\n case 'expression':\n return node.type.slice(-10) === 'Expression' ||\n node.type.slice(-7) === 'Literal' ||\n (\n node.type === 'Identifier' &&\n (ancestry.length === 0 || ancestry[0].type !== 'MetaProperty')\n ) ||\n node.type === 'MetaProperty';\n case 'function':\n return node.type === 'FunctionDeclaration' ||\n node.type === 'FunctionExpression' ||\n node.type === 'ArrowFunctionExpression';\n }\n throw new Error(`Unknown class name: ${selector.name}`);\n }\n\n throw new Error(`Unknown selector type: ${selector.type}`);\n}\n\n/**\n * Get visitor keys of a given node.\n * @param {external:AST} node The AST node to get keys.\n * @param {ESQueryOptions|undefined} options\n * @returns {string[]} Visitor keys of the node.\n */\nfunction getVisitorKeys(node, options) {\n const nodeType = node.type;\n if (options && options.visitorKeys && options.visitorKeys[nodeType]) {\n return options.visitorKeys[nodeType];\n }\n if (estraverse.VisitorKeys[nodeType]) {\n return estraverse.VisitorKeys[nodeType];\n }\n if (options && typeof options.fallback === 'function') {\n return options.fallback(node);\n }\n // 'iteration' fallback\n return Object.keys(node).filter(function (key) {\n return key !== 'type';\n });\n}\n\n\n/**\n * Check whether the given value is an ASTNode or not.\n * @param {any} node The value to check.\n * @returns {boolean} `true` if the value is an ASTNode.\n */\nfunction isNode(node) {\n return node !== null && typeof node === 'object' && typeof node.type === 'string';\n}\n\n/**\n * Determines if the given node has a sibling that matches the\n * given selector.\n * @param {external:AST} node\n * @param {SelectorSequenceAST} selector\n * @param {external:AST[]} ancestry\n * @param {Side} side\n * @param {ESQueryOptions|undefined} options\n * @returns {boolean}\n */\nfunction sibling(node, selector, ancestry, side, options) {\n const [parent] = ancestry;\n if (!parent) { return false; }\n const keys = getVisitorKeys(parent, options);\n for (const key of keys) {\n const listProp = parent[key];\n if (Array.isArray(listProp)) {\n const startIndex = listProp.indexOf(node);\n if (startIndex < 0) { continue; }\n let lowerBound, upperBound;\n if (side === LEFT_SIDE) {\n lowerBound = 0;\n upperBound = startIndex;\n } else {\n lowerBound = startIndex + 1;\n upperBound = listProp.length;\n }\n for (let k = lowerBound; k < upperBound; ++k) {\n if (isNode(listProp[k]) && matches(listProp[k], selector, ancestry, options)) {\n return true;\n }\n }\n }\n }\n return false;\n}\n\n/**\n * Determines if the given node has an adjacent sibling that matches\n * the given selector.\n * @param {external:AST} node\n * @param {SelectorSequenceAST} selector\n * @param {external:AST[]} ancestry\n * @param {Side} side\n * @param {ESQueryOptions|undefined} options\n * @returns {boolean}\n */\nfunction adjacent(node, selector, ancestry, side, options) {\n const [parent] = ancestry;\n if (!parent) { return false; }\n const keys = getVisitorKeys(parent, options);\n for (const key of keys) {\n const listProp = parent[key];\n if (Array.isArray(listProp)) {\n const idx = listProp.indexOf(node);\n if (idx < 0) { continue; }\n if (side === LEFT_SIDE && idx > 0 && isNode(listProp[idx - 1]) && matches(listProp[idx - 1], selector, ancestry, options)) {\n return true;\n }\n if (side === RIGHT_SIDE && idx < listProp.length - 1 && isNode(listProp[idx + 1]) && matches(listProp[idx + 1], selector, ancestry, options)) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n* @callback IndexFunction\n* @param {Integer} len Containing list's length\n* @returns {Integer}\n*/\n\n/**\n * Determines if the given node is the nth child, determined by\n * `idxFn`, which is given the containing list's length.\n * @param {external:AST} node\n * @param {external:AST[]} ancestry\n * @param {IndexFunction} idxFn\n * @param {ESQueryOptions|undefined} options\n * @returns {boolean}\n */\nfunction nthChild(node, ancestry, idxFn, options) {\n const [parent] = ancestry;\n if (!parent) { return false; }\n const keys = getVisitorKeys(parent, options);\n for (const key of keys) {\n const listProp = parent[key];\n if (Array.isArray(listProp)) {\n const idx = listProp.indexOf(node);\n if (idx >= 0 && idx === idxFn(listProp.length)) { return true; }\n }\n }\n return false;\n}\n\n/**\n * For each selector node marked as a subject, find the portion of the\n * selector that the subject must match.\n * @param {SelectorAST} selector\n * @param {SelectorAST} [ancestor] Defaults to `selector`\n * @returns {SelectorAST[]}\n */\nfunction subjects(selector, ancestor) {\n if (selector == null || typeof selector != 'object') { return []; }\n if (ancestor == null) { ancestor = selector; }\n const results = selector.subject ? [ancestor] : [];\n for (const [p, sel] of Object.entries(selector)) {\n results.push(...subjects(sel, p === 'left' ? sel : ancestor));\n }\n return results;\n}\n\n/**\n* @callback TraverseVisitor\n* @param {?external:AST} node\n* @param {?external:AST} parent\n* @param {external:AST[]} ancestry\n*/\n\n/**\n * From a JS AST and a selector AST, collect all JS AST nodes that\n * match the selector.\n * @param {external:AST} ast\n * @param {?SelectorAST} selector\n * @param {TraverseVisitor} visitor\n * @param {ESQueryOptions} [options]\n * @returns {external:AST[]}\n */\nfunction traverse(ast, selector, visitor, options) {\n if (!selector) { return; }\n const ancestry = [];\n const altSubjects = subjects(selector);\n estraverse.traverse(ast, {\n enter (node, parent) {\n if (parent != null) { ancestry.unshift(parent); }\n if (matches(node, selector, ancestry, options)) {\n if (altSubjects.length) {\n for (let i = 0, l = altSubjects.length; i < l; ++i) {\n if (matches(node, altSubjects[i], ancestry, options)) {\n visitor(node, parent, ancestry);\n }\n for (let k = 0, m = ancestry.length; k < m; ++k) {\n const succeedingAncestry = ancestry.slice(k + 1);\n if (matches(ancestry[k], altSubjects[i], succeedingAncestry, options)) {\n visitor(ancestry[k], parent, succeedingAncestry);\n }\n }\n }\n } else {\n visitor(node, parent, ancestry);\n }\n }\n },\n leave () { ancestry.shift(); },\n keys: options && options.visitorKeys,\n fallback: options && options.fallback || 'iteration'\n });\n}\n\n\n/**\n * From a JS AST and a selector AST, collect all JS AST nodes that\n * match the selector.\n * @param {external:AST} ast\n * @param {?SelectorAST} selector\n * @param {ESQueryOptions} [options]\n * @returns {external:AST[]}\n */\nfunction match(ast, selector, options) {\n const results = [];\n traverse(ast, selector, function (node) {\n results.push(node);\n }, options);\n return results;\n}\n\n/**\n * Parse a selector string and return its AST.\n * @param {string} selector\n * @returns {SelectorAST}\n */\nfunction parse(selector) {\n return parser.parse(selector);\n}\n\n/**\n * Query the code AST using the selector string.\n * @param {external:AST} ast\n * @param {string} selector\n * @param {ESQueryOptions} [options]\n * @returns {external:AST[]}\n */\nfunction query(ast, selector, options) {\n return match(ast, parse(selector), options);\n}\n\nquery.parse = parse;\nquery.match = match;\nquery.traverse = traverse;\nquery.matches = matches;\nquery.query = query;\n\nexport default query;\n", "var Symbol = require('./_Symbol'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n", "var arrayPush = require('./_arrayPush'),\n isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseFlatten;\n", "/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n", "var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n", "/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n", "var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n", "var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n", "/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n", "var baseSetToString = require('./_baseSetToString'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n", "var identity = require('./identity'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n", "/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n", "/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = strictIndexOf;\n", "var baseFindIndex = require('./_baseFindIndex'),\n baseIsNaN = require('./_baseIsNaN'),\n strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n", "var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n", "/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arrayIncludesWith;\n", "/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n // No operation performed.\n}\n\nmodule.exports = noop;\n", "var Set = require('./_Set'),\n noop = require('./noop'),\n setToArray = require('./_setToArray');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n};\n\nmodule.exports = createSet;\n", "var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n cacheHas = require('./_cacheHas'),\n createSet = require('./_createSet'),\n setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseUniq;\n", "var isArrayLike = require('./isArrayLike'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nmodule.exports = isArrayLikeObject;\n", "var baseFlatten = require('./_baseFlatten'),\n baseRest = require('./_baseRest'),\n baseUniq = require('./_baseUniq'),\n isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Creates an array of unique values, in order, from all given arrays using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([2], [1, 2]);\n * // => [2, 1]\n */\nvar union = baseRest(function(arrays) {\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n});\n\nmodule.exports = union;\n", "var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n arrayMap = require('./_arrayMap'),\n baseUnary = require('./_baseUnary'),\n cacheHas = require('./_cacheHas');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMin = Math.min;\n\n/**\n * The base implementation of methods like `_.intersection`, without support\n * for iteratee shorthands, that accepts an array of arrays to inspect.\n *\n * @private\n * @param {Array} arrays The arrays to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of shared values.\n */\nfunction baseIntersection(arrays, iteratee, comparator) {\n var includes = comparator ? arrayIncludesWith : arrayIncludes,\n length = arrays[0].length,\n othLength = arrays.length,\n othIndex = othLength,\n caches = Array(othLength),\n maxLength = Infinity,\n result = [];\n\n while (othIndex--) {\n var array = arrays[othIndex];\n if (othIndex && iteratee) {\n array = arrayMap(array, baseUnary(iteratee));\n }\n maxLength = nativeMin(array.length, maxLength);\n caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n ? new SetCache(othIndex && array)\n : undefined;\n }\n array = arrays[0];\n\n var index = -1,\n seen = caches[0];\n\n outer:\n while (++index < length && result.length < maxLength) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (!(seen\n ? cacheHas(seen, computed)\n : includes(result, computed, comparator)\n )) {\n othIndex = othLength;\n while (--othIndex) {\n var cache = caches[othIndex];\n if (!(cache\n ? cacheHas(cache, computed)\n : includes(arrays[othIndex], computed, comparator))\n ) {\n continue outer;\n }\n }\n if (seen) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseIntersection;\n", "var isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Casts `value` to an empty array if it's not an array like object.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array|Object} Returns the cast array-like object.\n */\nfunction castArrayLikeObject(value) {\n return isArrayLikeObject(value) ? value : [];\n}\n\nmodule.exports = castArrayLikeObject;\n", "var arrayMap = require('./_arrayMap'),\n baseIntersection = require('./_baseIntersection'),\n baseRest = require('./_baseRest'),\n castArrayLikeObject = require('./_castArrayLikeObject');\n\n/**\n * Creates an array of unique values that are included in all given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of intersecting values.\n * @example\n *\n * _.intersection([2, 1], [2, 3]);\n * // => [2]\n */\nvar intersection = baseRest(function(arrays) {\n var mapped = arrayMap(arrays, castArrayLikeObject);\n return (mapped.length && mapped[0] === arrays[0])\n ? baseIntersection(mapped)\n : [];\n});\n\nmodule.exports = intersection;\n", "/**\n * @author Toru Nagashima <https://github.com/mysticatea>\n * @copyright 2017 Toru Nagashima. All rights reserved.\n * See LICENSE file in root directory for full license.\n */\nimport type { Location } from \"./locations\"\n\n/**\n * Check whether the given value has acorn style location information.\n * @param x The value to check.\n * @returns `true` if the value has acorn style location information.\n */\nfunction isAcornStyleParseError(\n x: any,\n): x is { message: string; pos: number; loc: Location } {\n return (\n typeof x.message === \"string\" &&\n typeof x.pos === \"number\" &&\n typeof x.loc === \"object\" &&\n x.loc !== null &&\n typeof x.loc.line === \"number\" &&\n typeof x.loc.column === \"number\"\n )\n}\n\n/**\n * HTML parse errors.\n */\nexport class ParseError extends SyntaxError {\n public code?: ErrorCode\n public index: number\n public lineNumber: number\n public column: number\n\n /**\n * Create new parser error object.\n * @param code The error code. See also: https://html.spec.whatwg.org/multipage/parsing.html#parse-errors\n * @param offset The offset number of this error.\n * @param line The line number of this error.\n * @param column The column number of this error.\n */\n public static fromCode(\n code: ErrorCode,\n offset: number,\n line: number,\n column: number,\n ): ParseError {\n return new ParseError(code, code, offset, line, column)\n }\n\n /**\n * Normalize the error object.\n * @param x The error object to normalize.\n */\n public static normalize(x: any): ParseError | null {\n if (ParseError.isParseError(x)) {\n return x\n }\n if (isAcornStyleParseError(x)) {\n return new ParseError(\n x.message,\n undefined,\n x.pos,\n x.loc.line,\n x.loc.column,\n )\n }\n return null\n }\n\n /**\n * Initialize this ParseError instance.\n * @param message The error message.\n * @param code The error code. See also: https://html.spec.whatwg.org/multipage/parsing.html#parse-errors\n * @param offset The offset number of this error.\n * @param line The line number of this error.\n * @param column The column number of this error.\n */\n public constructor(\n message: string,\n code: ErrorCode | undefined,\n offset: number,\n line: number,\n column: number,\n ) {\n super(message)\n this.code = code\n this.index = offset\n this.lineNumber = line\n this.column = column\n }\n\n /**\n * Type guard for ParseError.\n * @param x The value to check.\n * @returns `true` if the value has `message`, `pos`, `loc` properties.\n */\n public static isParseError(x: any): x is ParseError {\n return (\n x instanceof ParseError ||\n (typeof x.message === \"string\" &&\n typeof x.index === \"number\" &&\n typeof x.lineNumber === \"number\" &&\n typeof x.column === \"number\")\n )\n }\n}\n\n/**\n * The error codes of HTML syntax errors.\n * https://html.spec.whatwg.org/multipage/parsing.html#parse-errors\n */\nexport type ErrorCode =\n | \"abrupt-closing-of-empty-comment\"\n | \"absence-of-digits-in-numeric-character-reference\"\n | \"cdata-in-html-content\"\n | \"character-reference-outside-unicode-range\"\n | \"control-character-in-input-stream\"\n | \"control-character-reference\"\n | \"eof-before-tag-name\"\n | \"eof-in-cdata\"\n | \"eof-in-comment\"\n | \"eof-in-tag\"\n | \"incorrectly-closed-comment\"\n | \"incorrectly-opened-comment\"\n | \"invalid-first-character-of-tag-name\"\n | \"missing-attribute-value\"\n | \"missing-end-tag-name\"\n | \"missing-semicolon-after-character-reference\"\n | \"missing-whitespace-between-attributes\"\n | \"nested-comment\"\n | \"noncharacter-character-reference\"\n | \"noncharacter-in-input-stream\"\n | \"null-character-reference\"\n | \"surrogate-character-reference\"\n | \"surrogate-in-input-stream\"\n | \"unexpected-character-in-attribute-name\"\n | \"unexpected-character-in-unquoted-attribute-value\"\n | \"unexpected-equals-sign-before-attribute-name\"\n | \"unexpected-null-character\"\n | \"unexpected-question-mark-instead-of-tag-name\"\n | \"unexpected-solidus-in-tag\"\n | \"unknown-named-character-reference\"\n | \"end-tag-with-attributes\"\n | \"duplicate-attribute\"\n | \"end-tag-with-trailing-solidus\"\n | \"non-void-html-element-start-tag-with-trailing-solidus\"\n | \"x-invalid-end-tag\"\n | \"x-invalid-namespace\"\n | \"x-missing-interpolation-end\"\n// ---- Use RAWTEXT state for <script> elements instead ----\n// \"eof-in-script-html-comment-like-text\" |\n// ---- Use BOGUS_COMMENT state for DOCTYPEs instead ----\n// \"abrupt-doctype-public-identifier\" |\n// \"abrupt-doctype-system-identifier\" |\n// \"eof-in-doctype\" |\n// \"invalid-character-sequence-after-doctype-name\" |\n// \"missing-doctype-name\" |\n// \"missing-doctype-public-identifier\" |\n// \"missing-doctype-system-identifier\" |\n// \"missing-quote-before-doctype-public-identifier\" |\n// \"missing-quote-before-doctype-system-identifier\" |\n// \"missing-whitespace-after-doctype-public-keyword\" |\n// \"missing-whitespace-after-doctype-system-keyword\" |\n// \"missing-whitespace-before-doctype-name\" |\n// \"missing-whitespace-between-doctype-public-and-system-identifiers\" |\n// \"unexpected-character-after-doctype-system-identifier\" |\n", "/**\n * @author Toru Nagashima <https://github.com/mysticatea>\n * @copyright 2017 Toru Nagashima. All rights reserved.\n * See LICENSE file in root directory for full license.\n */\nimport type { ScopeManager } from \"eslint-scope\"\nimport type { ParseError } from \"./errors\"\nimport type { HasLocation } from \"./locations\"\nimport type { Token } from \"./tokens\"\n\n//------------------------------------------------------------------------------\n// Common\n//------------------------------------------------------------------------------\n\n/**\n * Objects which have their parent.\n */\nexport interface HasParent {\n parent?: Node | null\n}\n\n/**\n * The union type for all nodes.\n */\nexport type Node =\n | ESLintNode\n | VNode\n | VForExpression\n | VOnExpression\n | VSlotScopeExpression\n | VFilterSequenceExpression\n | VFilter\n\n//------------------------------------------------------------------------------\n// Script\n//------------------------------------------------------------------------------\n\n/**\n * The union type for ESLint nodes.\n */\nexport type ESLintNode =\n | ESLintIdentifier\n | ESLintLiteral\n | ESLintProgram\n | ESLintSwitchCase\n | ESLintCatchClause\n | ESLintVariableDeclarator\n | ESLintStatement\n | ESLintExpression\n | ESLintProperty\n | ESLintAssignmentProperty\n | ESLintSuper\n | ESLintTemplateElement\n | ESLintSpreadElement\n | ESLintPattern\n | ESLintClassBody\n | ESLintMethodDefinition\n | ESLintPropertyDefinition\n | ESLintStaticBlock\n | ESLintPrivateIdentifier\n | ESLintModuleDeclaration\n | ESLintModuleSpecifier\n | ESLintImportExpression\n | ESLintLegacyRestProperty\n\n/**\n * The parsing result of ESLint custom parsers.\n */\nexport interface ESLintExtendedProgram {\n ast: ESLintProgram\n services?: {}\n visitorKeys?: { [type: string]: string[] }\n scopeManager?: ScopeManager\n}\n\nexport interface ESLintProgram extends HasLocation, HasParent {\n type: \"Program\"\n sourceType: \"script\" | \"module\"\n body: (ESLintStatement | ESLintModuleDeclaration)[]\n templateBody?: VElement & HasConcreteInfo\n tokens?: Token[]\n comments?: Token[]\n errors?: ParseError[]\n}\n\nexport type ESLintStatement =\n | ESLintExpressionStatement\n | ESLintBlockStatement\n | ESLintEmptyStatement\n | ESLintDebuggerStatement\n | ESLintWithStatement\n | ESLintReturnStatement\n | ESLintLabeledStatement\n | ESLintBreakStatement\n | ESLintContinueStatement\n | ESLintIfStatement\n | ESLintSwitchStatement\n | ESLintThrowStatement\n | ESLintTryStatement\n | ESLintWhileStatement\n | ESLintDoWhileStatement\n | ESLintForStatement\n | ESLintForInStatement\n | ESLintForOfStatement\n | ESLintDeclaration\n\nexport interface ESLintEmptyStatement extends HasLocation, HasParent {\n type: \"EmptyStatement\"\n}\n\nexport interface ESLintBlockStatement extends HasLocation, HasParent {\n type: \"BlockStatement\"\n body: ESLintStatement[]\n}\n\nexport interface ESLintExpressionStatement extends HasLocation, HasParent {\n type: \"ExpressionStatement\"\n expression: ESLintExpression\n}\n\nexport interface ESLintIfStatement extends HasLocation, HasParent {\n type: \"IfStatement\"\n test: ESLintExpression\n consequent: ESLintStatement\n alternate: ESLintStatement | null\n}\n\nexport interface ESLintSwitchStatement extends HasLocation, HasParent {\n type: \"SwitchStatement\"\n discriminant: ESLintExpression\n cases: ESLintSwitchCase[]\n}\n\nexport interface ESLintSwitchCase extends HasLocation, HasParent {\n type: \"SwitchCase\"\n test: ESLintExpression | null\n consequent: ESLintStatement[]\n}\n\nexport interface ESLintWhileStatement extends HasLocation, HasParent {\n type: \"WhileStatement\"\n test: ESLintExpression\n body: ESLintStatement\n}\n\nexport interface ESLintDoWhileStatement extends HasLocation, HasParent {\n type: \"DoWhileStatement\"\n body: ESLintStatement\n test: ESLintExpression\n}\n\nexport interface ESLintForStatement extends HasLocation, HasParent {\n type: \"ForStatement\"\n init: ESLintVariableDeclaration | ESLintExpression | null\n test: ESLintExpression | null\n update: ESLintExpression | null\n body: ESLintStatement\n}\n\nexport interface ESLintForInStatement extends HasLocation, HasParent {\n type: \"ForInStatement\"\n left: ESLintVariableDeclaration | ESLintPattern\n right: ESLintExpression\n body: ESLintStatement\n}\n\nexport interface ESLintForOfStatement extends HasLocation, HasParent {\n type: \"ForOfStatement\"\n left: ESLintVariableDeclaration | ESLintPattern\n right: ESLintExpression\n body: ESLintStatement\n await: boolean\n}\n\nexport interface ESLintLabeledStatement extends HasLocation, HasParent {\n type: \"LabeledStatement\"\n label: ESLintIdentifier\n body: ESLintStatement\n}\n\nexport interface ESLintBreakStatement extends HasLocation, HasParent {\n type: \"BreakStatement\"\n label: ESLintIdentifier | null\n}\n\nexport interface ESLintContinueStatement extends HasLocation, HasParent {\n type: \"ContinueStatement\"\n label: ESLintIdentifier | null\n}\n\nexport interface ESLintReturnStatement extends HasLocation, HasParent {\n type: \"ReturnStatement\"\n argument: ESLintExpression | null\n}\n\nexport interface ESLintThrowStatement extends HasLocation, HasParent {\n type: \"ThrowStatement\"\n argument: ESLintExpression\n}\n\nexport interface ESLintTryStatement extends HasLocation, HasParent {\n type: \"TryStatement\"\n block: ESLintBlockStatement\n handler: ESLintCatchClause | null\n finalizer: ESLintBlockStatement | null\n}\n\nexport interface ESLintCatchClause extends HasLocation, HasParent {\n type: \"CatchClause\"\n param: ESLintPattern | null\n body: ESLintBlockStatement\n}\n\nexport interface ESLintWithStatement extends HasLocation, HasParent {\n type: \"WithStatement\"\n object: ESLintExpression\n body: ESLintStatement\n}\n\nexport interface ESLintDebuggerStatement extends HasLocation, HasParent {\n type: \"DebuggerStatement\"\n}\n\nexport type ESLintDeclaration =\n | ESLintFunctionDeclaration\n | ESLintVariableDeclaration\n | ESLintClassDeclaration\n\nexport interface ESLintFunctionDeclaration extends HasLocation, HasParent {\n type: \"FunctionDeclaration\"\n async: boolean\n generator: boolean\n id: ESLintIdentifier | null\n params: ESLintPattern[]\n body: ESLintBlockStatement\n}\n\nexport interface ESLintVariableDeclaration extends HasLocation, HasParent {\n type: \"VariableDeclaration\"\n kind: \"var\" | \"let\" | \"const\"\n declarations: ESLintVariableDeclarator[]\n}\n\nexport interface ESLintVariableDeclarator extends HasLocation, HasParent {\n type: \"VariableDeclarator\"\n id: ESLintPattern\n init: ESLintExpression | null\n}\n\nexport interface ESLintClassDeclaration extends HasLocation, HasParent {\n type: \"ClassDeclaration\"\n id: ESLintIdentifier | null\n superClass: ESLintExpression | null\n body: ESLintClassBody\n}\n\nexport interface ESLintClassBody extends HasLocation, HasParent {\n type: \"ClassBody\"\n body: (\n | ESLintMethodDefinition\n | ESLintPropertyDefinition\n | ESLintStaticBlock\n )[]\n}\n\nexport interface ESLintMethodDefinition extends HasLocation, HasParent {\n type: \"MethodDefinition\"\n kind: \"constructor\" | \"method\" | \"get\" | \"set\"\n computed: boolean\n static: boolean\n key: ESLintExpression | ESLintPrivateIdentifier\n value: ESLintFunctionExpression\n}\nexport interface ESLintPropertyDefinition extends HasLocation, HasParent {\n type: \"PropertyDefinition\"\n computed: boolean\n static: boolean\n key: ESLintExpression | ESLintPrivateIdentifier\n value: ESLintExpression | null\n}\n\nexport interface ESLintStaticBlock\n extends HasLocation,\n HasParent,\n Omit<ESLintBlockStatement, \"type\"> {\n type: \"StaticBlock\"\n body: ESLintStatement[]\n}\n\nexport interface ESLintPrivateIdentifier extends HasLocation, HasParent {\n type: \"PrivateIdentifier\"\n name: string\n}\n\nexport type ESLintModuleDeclaration =\n | ESLintImportDeclaration\n | ESLintExportNamedDeclaration\n | ESLintExportDefaultDeclaration\n | ESLintExportAllDeclaration\n\nexport type ESLintModuleSpecifier =\n | ESLintImportSpecifier\n | ESLintImportDefaultSpecifier\n | ESLintImportNamespaceSpecifier\n | ESLintExportSpecifier\n\nexport interface ESLintImportDeclaration extends HasLocation, HasParent {\n type: \"ImportDeclaration\"\n specifiers: (\n | ESLintImportSpecifier\n | ESLintImportDefaultSpecifier\n | ESLintImportNamespaceSpecifier\n )[]\n source: ESLintLiteral\n}\n\nexport interface ESLintImportSpecifier extends HasLocation, HasParent {\n type: \"ImportSpecifier\"\n imported: ESLintIdentifier | ESLintStringLiteral\n local: ESLintIdentifier\n}\n\nexport interface ESLintImportDefaultSpecifier extends HasLocation, HasParent {\n type: \"ImportDefaultSpecifier\"\n local: ESLintIdentifier\n}\n\nexport interface ESLintImportNamespaceSpecifier extends HasLocation, HasParent {\n type: \"ImportNamespaceSpecifier\"\n local: ESLintIdentifier\n}\n\nexport interface ESLintImportExpression extends HasLocation, HasParent {\n type: \"ImportExpression\"\n source: ESLintExpression\n}\n\nexport interface ESLintExportNamedDeclaration extends HasLocation, HasParent {\n type: \"ExportNamedDeclaration\"\n declaration?: ESLintDeclaration | null\n specifiers: ESLintExportSpecifier[]\n source?: ESLintLiteral | null\n}\n\nexport interface ESLintExportSpecifier extends HasLocation, HasParent {\n type: \"ExportSpecifier\"\n local: ESLintIdentifier | ESLintStringLiteral\n exported: ESLintIdentifier | ESLintStringLiteral\n}\n\nexport interface ESLintExportDefaultDeclaration extends HasLocation, HasParent {\n type: \"ExportDefaultDeclaration\"\n declaration: ESLintDeclaration | ESLintExpression\n}\n\nexport interface ESLintExportAllDeclaration extends HasLocation, HasParent {\n type: \"ExportAllDeclaration\"\n exported: ESLintIdentifier | ESLintStringLiteral | null\n source: ESLintLiteral\n}\n\nexport type ESLintExpression =\n | ESLintThisExpression\n | ESLintArrayExpression\n | ESLintObjectExpression\n | ESLintFunctionExpression\n | ESLintArrowFunctionExpression\n | ESLintYieldExpression\n | ESLintLiteral\n | ESLintUnaryExpression\n | ESLintUpdateExpression\n | ESLintBinaryExpression\n | ESLintAssignmentExpression\n | ESLintLogicalExpression\n | ESLintMemberExpression\n | ESLintConditionalExpression\n | ESLintCallExpression\n | ESLintNewExpression\n | ESLintSequenceExpression\n | ESLintTemplateLiteral\n | ESLintTaggedTemplateExpression\n | ESLintClassExpression\n | ESLintMetaProperty\n | ESLintIdentifier\n | ESLintAwaitExpression\n | ESLintChainExpression\n\nexport interface ESLintIdentifier extends HasLocation, HasParent {\n type: \"Identifier\"\n name: string\n}\ninterface ESLintLiteralBase extends HasLocation, HasParent {\n type: \"Literal\"\n value: string | boolean | null | number | RegExp | bigint\n raw: string\n regex?: {\n pattern: string\n flags: string\n }\n bigint?: string\n}\nexport interface ESLintStringLiteral extends ESLintLiteralBase {\n value: string\n regex?: undefined\n bigint?: undefined\n}\nexport interface ESLintBooleanLiteral extends ESLintLiteralBase {\n value: boolean\n regex?: undefined\n bigint?: undefined\n}\nexport interface ESLintNullLiteral extends ESLintLiteralBase {\n value: null\n regex?: undefined\n bigint?: undefined\n}\nexport interface ESLintNumberLiteral extends ESLintLiteralBase {\n value: number\n regex?: undefined\n bigint?: undefined\n}\nexport interface ESLintRegExpLiteral extends ESLintLiteralBase {\n value: null | RegExp\n regex: {\n pattern: string\n flags: string\n }\n bigint?: undefined\n}\nexport interface ESLintBigIntLiteral extends ESLintLiteralBase {\n value: null | bigint\n regex?: undefined\n bigint: string\n}\nexport type ESLintLiteral =\n | ESLintStringLiteral\n | ESLintBooleanLiteral\n | ESLintNullLiteral\n | ESLintNumberLiteral\n | ESLintRegExpLiteral\n | ESLintBigIntLiteral\n\nexport interface ESLintThisExpression extends HasLocation, HasParent {\n type: \"ThisExpression\"\n}\n\nexport interface ESLintArrayExpression extends HasLocation, HasParent {\n type: \"ArrayExpression\"\n elements: (ESLintExpression | ESLintSpreadElement)[]\n}\n\nexport interface ESLintObjectExpression extends HasLocation, HasParent {\n type: \"ObjectExpression\"\n properties: (\n | ESLintProperty\n | ESLintSpreadElement\n | ESLintLegacySpreadProperty\n )[]\n}\n\nexport interface ESLintProperty extends HasLocation, HasParent {\n type: \"Property\"\n kind: \"init\" | \"get\" | \"set\"\n method: boolean\n shorthand: boolean\n computed: boolean\n key: ESLintExpression\n value: ESLintExpression | ESLintPattern\n}\n\nexport interface ESLintFunctionExpression extends HasLocation, HasParent {\n type: \"FunctionExpression\"\n async: boolean\n generator: boolean\n id: ESLintIdentifier | null\n params: ESLintPattern[]\n body: ESLintBlockStatement\n}\n\nexport interface ESLintArrowFunctionExpression extends HasLocation, HasParent {\n type: \"ArrowFunctionExpression\"\n async: boolean\n generator: boolean\n id: ESLintIdentifier | null\n params: ESLintPattern[]\n body: ESLintBlockStatement\n}\n\nexport interface ESLintSequenceExpression extends HasLocation, HasParent {\n type: \"SequenceExpression\"\n expressions: ESLintExpression[]\n}\n\nexport interface ESLintUnaryExpression extends HasLocation, HasParent {\n type: \"UnaryExpression\"\n operator: \"-\" | \"+\" | \"!\" | \"~\" | \"typeof\" | \"void\" | \"delete\"\n prefix: boolean\n argument: ESLintExpression\n}\n\nexport interface ESLintBinaryExpression extends HasLocation, HasParent {\n type: \"BinaryExpression\"\n operator:\n | \"==\"\n | \"!=\"\n | \"===\"\n | \"!==\"\n | \"<\"\n | \"<=\"\n | \">\"\n | \">=\"\n | \"<<\"\n | \">>\"\n | \">>>\"\n | \"+\"\n | \"-\"\n | \"*\"\n | \"/\"\n | \"%\"\n | \"**\"\n | \"|\"\n | \"^\"\n | \"&\"\n | \"in\"\n | \"instanceof\"\n left: ESLintExpression | ESLintPrivateIdentifier\n right: ESLintExpression\n}\n\nexport interface ESLintAssignmentExpression extends HasLocation, HasParent {\n type: \"AssignmentExpression\"\n operator:\n | \"=\"\n | \"+=\"\n | \"-=\"\n | \"*=\"\n | \"/=\"\n | \"%=\"\n | \"**=\"\n | \"<<=\"\n | \">>=\"\n | \">>>=\"\n | \"|=\"\n | \"^=\"\n | \"&=\"\n | \"||=\"\n | \"&&=\"\n | \"??=\"\n left: ESLintPattern\n right: ESLintExpression\n}\n\nexport interface ESLintUpdateExpression extends HasLocation, HasParent {\n type: \"UpdateExpression\"\n operator: \"++\" | \"--\"\n argument: ESLintExpression\n prefix: boolean\n}\n\nexport interface ESLintLogicalExpression extends HasLocation, HasParent {\n type: \"LogicalExpression\"\n operator: \"||\" | \"&&\" | \"??\"\n left: ESLintExpression\n right: ESLintExpression\n}\n\nexport interface ESLintConditionalExpression extends HasLocation, HasParent {\n type: \"ConditionalExpression\"\n test: ESLintExpression\n alternate: ESLintExpression\n consequent: ESLintExpression\n}\n\nexport interface ESLintCallExpression extends HasLocation, HasParent {\n type: \"CallExpression\"\n optional: boolean\n callee: ESLintExpression | ESLintSuper\n arguments: (ESLintExpression | ESLintSpreadElement)[]\n}\n\nexport interface ESLintSuper extends HasLocation, HasParent {\n type: \"Super\"\n}\n\nexport interface ESLintNewExpression extends HasLocation, HasParent {\n type: \"NewExpression\"\n callee: ESLintExpression\n arguments: (ESLintExpression | ESLintSpreadElement)[]\n}\n\nexport interface ESLintMemberExpression extends HasLocation, HasParent {\n type: \"MemberExpression\"\n optional: boolean\n computed: boolean\n object: ESLintExpression | ESLintSuper\n property: ESLintExpression | ESLintPrivateIdentifier\n}\n\nexport interface ESLintYieldExpression extends HasLocation, HasParent {\n type: \"YieldExpression\"\n delegate: boolean\n argument: ESLintExpression | null\n}\n\nexport interface ESLintAwaitExpression extends HasLocation, HasParent {\n type: \"AwaitExpression\"\n argument: ESLintExpression\n}\n\nexport interface ESLintTemplateLiteral extends HasLocation, HasParent {\n type: \"TemplateLiteral\"\n quasis: ESLintTemplateElement[]\n expressions: ESLintExpression[]\n}\n\nexport interface ESLintTaggedTemplateExpression extends HasLocation, HasParent {\n type: \"TaggedTemplateExpression\"\n tag: ESLintExpression\n quasi: ESLintTemplateLiteral\n}\n\nexport interface ESLintTemplateElement extends HasLocation, HasParent {\n type: \"TemplateElement\"\n tail: boolean\n value: {\n cooked: string | null\n raw: string\n }\n}\n\nexport interface ESLintClassExpression extends HasLocation, HasParent {\n type: \"ClassExpression\"\n id: ESLintIdentifier | null\n superClass: ESLintExpression | null\n body: ESLintClassBody\n}\n\nexport interface ESLintMetaProperty extends HasLocation, HasParent {\n type: \"MetaProperty\"\n meta: ESLintIdentifier\n property: ESLintIdentifier\n}\n\nexport type ESLintPattern =\n | ESLintIdentifier\n | ESLintObjectPattern\n | ESLintArrayPattern\n | ESLintRestElement\n | ESLintAssignmentPattern\n | ESLintMemberExpression\n | ESLintLegacyRestProperty\n\nexport interface ESLintObjectPattern extends HasLocation, HasParent {\n type: \"ObjectPattern\"\n properties: (\n | ESLintAssignmentProperty\n | ESLintRestElement\n | ESLintLegacyRestProperty\n )[]\n}\n\nexport interface ESLintAssignmentProperty extends ESLintProperty {\n value: ESLintPattern\n kind: \"init\"\n method: false\n}\n\nexport interface ESLintArrayPattern extends HasLocation, HasParent {\n type: \"ArrayPattern\"\n elements: ESLintPattern[]\n}\n\nexport interface ESLintRestElement extends HasLocation, HasParent {\n type: \"RestElement\"\n argument: ESLintPattern\n}\n\nexport interface ESLintSpreadElement extends HasLocation, HasParent {\n type: \"SpreadElement\"\n argument: ESLintExpression\n}\n\nexport interface ESLintAssignmentPattern extends HasLocation, HasParent {\n type: \"AssignmentPattern\"\n left: ESLintPattern\n right: ESLintExpression\n}\n\nexport type ESLintChainElement = ESLintCallExpression | ESLintMemberExpression\n\nexport interface ESLintChainExpression extends HasLocation, HasParent {\n type: \"ChainExpression\"\n expression: ESLintChainElement\n}\n\n/**\n * Legacy for babel-eslint and espree.\n */\nexport interface ESLintLegacyRestProperty extends HasLocation, HasParent {\n type: \"RestProperty\" | \"ExperimentalRestProperty\"\n argument: ESLintPattern\n}\n\n/**\n * Legacy for babel-eslint and espree.\n */\nexport interface ESLintLegacySpreadProperty extends HasLocation, HasParent {\n type: \"SpreadProperty\" | \"ExperimentalSpreadProperty\"\n argument: ESLintExpression\n}\n\n//------------------------------------------------------------------------------\n// Template\n//------------------------------------------------------------------------------\n\n/**\n * Constants of namespaces.\n * @see https://infra.spec.whatwg.org/#namespaces\n */\nexport const NS = Object.freeze({\n HTML: \"http://www.w3.org/1999/xhtml\" as \"http://www.w3.org/1999/xhtml\",\n MathML: \"http://www.w3.org/1998/Math/MathML\" as \"http://www.w3.org/1998/Math/MathML\",\n SVG: \"http://www.w3.org/2000/svg\" as \"http://www.w3.org/2000/svg\",\n XLink: \"http://www.w3.org/1999/xlink\" as \"http://www.w3.org/1999/xlink\",\n XML: \"http://www.w3.org/XML/1998/namespace\" as \"http://www.w3.org/XML/1998/namespace\",\n XMLNS: \"http://www.w3.org/2000/xmlns/\" as \"http://www.w3.org/2000/xmlns/\",\n})\n\n/**\n * Type of namespaces.\n */\nexport type Namespace =\n | typeof NS.HTML\n | typeof NS.MathML\n | typeof NS.SVG\n | typeof NS.XLink\n | typeof NS.XML\n | typeof NS.XMLNS\n\n/**\n * Type of variable definitions.\n */\nexport interface Variable {\n id: ESLintIdentifier\n kind: \"v-for\" | \"scope\"\n references: Reference[]\n}\n\n/**\n * Type of variable references.\n */\nexport interface Reference {\n id: ESLintIdentifier\n mode: \"rw\" | \"r\" | \"w\"\n variable: Variable | null\n}\n\n/**\n * The node of `v-for` directives.\n */\nexport interface VForExpression extends HasLocation, HasParent {\n type: \"VForExpression\"\n parent: VExpressionContainer\n left: ESLintPattern[]\n right: ESLintExpression\n}\n\n/**\n * The node of `v-on` directives.\n */\nexport interface VOnExpression extends HasLocation, HasParent {\n type: \"VOnExpression\"\n parent: VExpressionContainer\n body: ESLintStatement[]\n}\n\n/**\n * The node of `slot-scope` directives.\n */\nexport interface VSlotScopeExpression extends HasLocation, HasParent {\n type: \"VSlotScopeExpression\"\n parent: VExpressionContainer\n params: ESLintPattern[]\n}\n\n/**\n * The node of a filter sequence which is separated by `|`.\n */\nexport interface VFilterSequenceExpression extends HasLocation, HasParent {\n type: \"VFilterSequenceExpression\"\n parent: VExpressionContainer\n expression: ESLintExpression\n filters: VFilter[]\n}\n\n/**\n * The node of a filter sequence which is separated by `|`.\n */\nexport interface VFilter extends HasLocation, HasParent {\n type: \"VFilter\"\n parent: VFilterSequenceExpression\n callee: ESLintIdentifier\n arguments: (ESLintExpression | ESLintSpreadElement)[]\n}\n\n/**\n * The union type of any nodes.\n */\nexport type VNode =\n | VAttribute\n | VDirective\n | VDirectiveKey\n | VDocumentFragment\n | VElement\n | VEndTag\n | VExpressionContainer\n | VIdentifier\n | VLiteral\n | VStartTag\n | VText\n\n/**\n * Text nodes.\n */\nexport interface VText extends HasLocation, HasParent {\n type: \"VText\"\n parent: VDocumentFragment | VElement\n value: string\n}\n\n/**\n * The node of JavaScript expression in text.\n * e.g. `{{ name }}`\n */\nexport interface VExpressionContainer extends HasLocation, HasParent {\n type: \"VExpressionContainer\"\n parent: VDocumentFragment | VElement | VDirective | VDirectiveKey\n expression:\n | ESLintExpression\n | VFilterSequenceExpression\n | VForExpression\n | VOnExpression\n | VSlotScopeExpression\n | null\n references: Reference[]\n}\n\n/**\n * Attribute name nodes.\n */\nexport interface VIdentifier extends HasLocation, HasParent {\n type: \"VIdentifier\"\n parent: VAttribute | VDirectiveKey\n name: string\n rawName: string\n}\n\n/**\n * Attribute name nodes.\n */\nexport interface VDirectiveKey extends HasLocation, HasParent {\n type: \"VDirectiveKey\"\n parent: VDirective\n name: VIdentifier\n argument: VExpressionContainer | VIdentifier | null\n modifiers: VIdentifier[]\n}\n\n/**\n * Attribute value nodes.\n */\nexport interface VLiteral extends HasLocation, HasParent {\n type: \"VLiteral\"\n parent: VAttribute\n value: string\n}\n\n/**\n * Static attribute nodes.\n */\nexport interface VAttribute extends HasLocation, HasParent {\n type: \"VAttribute\"\n parent: VStartTag\n directive: false\n key: VIdentifier\n value: VLiteral | null\n}\n\n/**\n * Directive nodes.\n */\nexport interface VDirective extends HasLocation, HasParent {\n type: \"VAttribute\"\n parent: VStartTag\n directive: true\n key: VDirectiveKey\n value: VExpressionContainer | null\n}\n\n/**\n * Start tag nodes.\n */\nexport interface VStartTag extends HasLocation, HasParent {\n type: \"VStartTag\"\n parent: VElement\n selfClosing: boolean\n attributes: (VAttribute | VDirective)[]\n}\n\n/**\n * End tag nodes.\n */\nexport interface VEndTag extends HasLocation, HasParent {\n type: \"VEndTag\"\n parent: VElement\n}\n\n/**\n * The property which has concrete information.\n */\nexport interface HasConcreteInfo {\n tokens: Token[]\n comments: Token[]\n errors: ParseError[]\n}\n\n/**\n * Element nodes.\n */\nexport interface VElement extends HasLocation, HasParent {\n type: \"VElement\"\n parent: VDocumentFragment | VElement\n namespace: Namespace\n name: string\n rawName: string\n startTag: VStartTag\n children: (VElement | VText | VExpressionContainer)[]\n endTag: VEndTag | null\n variables: Variable[]\n}\n\n/**\n * Root nodes.\n */\nexport interface VDocumentFragment\n extends HasLocation,\n HasParent,\n HasConcreteInfo {\n type: \"VDocumentFragment\"\n parent: null\n children: (VElement | VText | VExpressionContainer | VStyleElement)[]\n}\n\n/**\n * Style element nodes.\n */\nexport interface VStyleElement extends VElement {\n type: \"VElement\"\n name: \"style\"\n style: true\n children: (VText | VExpressionContainer)[]\n}\n", "/**\n * @author Toru Nagashima <https://github.com/mysticatea>\n * @copyright 2017 Toru Nagashima. All rights reserved.\n * See LICENSE file in root directory for full license.\n */\nimport type { VisitorKeys } from \"eslint-visitor-keys\"\nimport * as Evk from \"eslint-visitor-keys\"\nimport type { Node } from \"./nodes\"\n\n//------------------------------------------------------------------------------\n// Helpers\n//------------------------------------------------------------------------------\n\nexport const KEYS = Evk.unionWith({\n VAttribute: [\"key\", \"value\"],\n VDirectiveKey: [\"name\", \"argument\", \"modifiers\"],\n VDocumentFragment: [\"children\"],\n VElement: [\"startTag\", \"children\", \"endTag\"],\n VEndTag: [],\n VExpressionContainer: [\"expression\"],\n VFilter: [\"callee\", \"arguments\"],\n VFilterSequenceExpression: [\"expression\", \"filters\"],\n VForExpression: [\"left\", \"right\"],\n VIdentifier: [],\n VLiteral: [],\n VOnExpression: [\"body\"],\n VSlotScopeExpression: [\"params\"],\n VStartTag: [\"attributes\"],\n VText: [],\n})\n\n/**\n * Check that the given key should be traversed or not.\n * @this {Traversable}\n * @param key The key to check.\n * @returns `true` if the key should be traversed.\n */\nfunction fallbackKeysFilter(this: any, key: string): boolean {\n let value = null\n return (\n key !== \"comments\" &&\n key !== \"leadingComments\" &&\n key !== \"loc\" &&\n key !== \"parent\" &&\n key !== \"range\" &&\n key !== \"tokens\" &&\n key !== \"trailingComments\" &&\n (value = this[key]) !== null &&\n typeof value === \"object\" &&\n (typeof value.type === \"string\" || Array.isArray(value))\n )\n}\n\n/**\n * Get the keys of the given node to traverse it.\n * @param node The node to get.\n * @returns The keys to traverse.\n */\nfunction getFallbackKeys(node: Node): string[] {\n return Object.keys(node).filter(fallbackKeysFilter, node)\n}\n\n/**\n * Check wheather a given value is a node.\n * @param x The value to check.\n * @returns `true` if the value is a node.\n */\nfunction isNode(x: any): x is Node {\n return x !== null && typeof x === \"object\" && typeof x.type === \"string\"\n}\n\n/**\n * Traverse the given node.\n * @param node The node to traverse.\n * @param parent The parent node.\n * @param visitor The node visitor.\n */\nfunction traverse(node: Node, parent: Node | null, visitor: Visitor): void {\n let i = 0\n let j = 0\n\n visitor.enterNode(node, parent)\n\n const keys =\n (visitor.visitorKeys || KEYS)[node.type] || getFallbackKeys(node)\n for (i = 0; i < keys.length; ++i) {\n const child = (node as any)[keys[i]]\n\n if (Array.isArray(child)) {\n for (j = 0; j < child.length; ++j) {\n if (isNode(child[j])) {\n traverse(child[j], node, visitor)\n }\n }\n } else if (isNode(child)) {\n traverse(child, node, visitor)\n }\n }\n\n visitor.leaveNode(node, parent)\n}\n\n//------------------------------------------------------------------------------\n// Exports\n//------------------------------------------------------------------------------\n\nexport interface Visitor {\n visitorKeys?: VisitorKeys\n enterNode(node: Node, parent: Node | null): void\n leaveNode(node: Node, parent: Node | null): void\n}\n\n/**\n * Traverse the given AST tree.\n * @param node Root node to traverse.\n * @param visitor Visitor.\n */\nexport function traverseNodes(node: Node, visitor: Visitor): void {\n traverse(node, null, visitor)\n}\n\nexport { getFallbackKeys }\n", "import sortedLastIndex from \"lodash/sortedLastIndex\"\nimport type { Location } from \"../ast\"\nimport type { LocationCalculator } from \"./location-calculator\"\n/**\n * A class for getting lines and columns location.\n */\nexport class LinesAndColumns {\n protected ltOffsets: number[]\n\n /**\n * Initialize.\n * @param ltOffsets The list of the offset of line terminators.\n */\n public constructor(ltOffsets: number[]) {\n this.ltOffsets = ltOffsets\n }\n\n /**\n * Calculate the location of the given index.\n * @param index The index to calculate their location.\n * @returns The location of the index.\n */\n public getLocFromIndex(index: number): Location {\n const line = sortedLastIndex(this.ltOffsets, index) + 1\n const column = index - (line === 1 ? 0 : this.ltOffsets[line - 2])\n return { line, column }\n }\n\n public createOffsetLocationCalculator(offset: number): LocationCalculator {\n return {\n getFixOffset() {\n return offset\n },\n getLocFromIndex: this.getLocFromIndex.bind(this),\n }\n }\n}\n", "/**\n * @author Toru Nagashima <https://github.com/mysticatea>\n * @copyright 2017 Toru Nagashima. All rights reserved.\n * See LICENSE file in root directory for full license.\n */\nimport sortedLastIndex from \"lodash/sortedLastIndex\"\nimport type { Location } from \"../ast\"\nimport { LinesAndColumns } from \"./lines-and-columns\"\n\n/**\n * Location calculators.\n */\nexport interface LocationCalculator {\n /**\n * Gets the fix location offset of the given offset with using the base offset of this calculator.\n * @param offset The offset to modify.\n */\n getFixOffset(offset: number, kind: \"start\" | \"end\"): number\n\n /**\n * Calculate the location of the given index.\n * @param index The index to calculate their location.\n * @returns The location of the index.\n */\n getLocFromIndex(index: number): Location\n}\n\n/**\n * Location calculators.\n *\n * HTML tokenizers remove several characters to handle HTML entities and line terminators.\n * Tokens have the processed text as their value, but tokens have offsets and locations in the original text.\n * This calculator calculates the original locations from the processed texts.\n *\n * This calculator will be used for:\n *\n * - Adjusts the locations of script ASTs.\n * - Creates expression containers in postprocess.\n */\nexport class LocationCalculatorForHtml\n extends LinesAndColumns\n implements LocationCalculator\n{\n private gapOffsets: number[]\n private baseOffset: number\n private baseIndexOfGap: number\n private shiftOffset: number\n\n /**\n * Initialize this calculator.\n * @param gapOffsets The list of the offset of removed characters in tokenization phase.\n * @param ltOffsets The list of the offset of line terminators.\n * @param baseOffset The base offset to calculate locations.\n * @param shiftOffset The shift offset to calculate locations.\n */\n public constructor(\n gapOffsets: number[],\n ltOffsets: number[],\n baseOffset?: number,\n shiftOffset = 0,\n ) {\n super(ltOffsets)\n this.gapOffsets = gapOffsets\n this.ltOffsets = ltOffsets\n this.baseOffset = baseOffset || 0\n this.baseIndexOfGap =\n this.baseOffset === 0\n ? 0\n : sortedLastIndex(gapOffsets, this.baseOffset)\n this.shiftOffset = shiftOffset\n }\n\n /**\n * Get sub calculator which have the given base offset.\n * @param offset The base offset of new sub calculator.\n * @returns Sub calculator.\n */\n public getSubCalculatorAfter(offset: number): LocationCalculatorForHtml {\n return new LocationCalculatorForHtml(\n this.gapOffsets,\n this.ltOffsets,\n this.baseOffset + offset,\n this.shiftOffset,\n )\n }\n\n /**\n * Get sub calculator that shifts the given offset.\n * @param offset The shift of new sub calculator.\n * @returns Sub calculator.\n */\n public getSubCalculatorShift(offset: number): LocationCalculatorForHtml {\n return new LocationCalculatorForHtml(\n this.gapOffsets,\n this.ltOffsets,\n this.baseOffset,\n this.shiftOffset + offset,\n )\n }\n\n /**\n * Calculate gap at the given index.\n * @param index The index to calculate gap.\n */\n private _getGap(index: number): number {\n const offsets = this.gapOffsets\n let g0 = sortedLastIndex(offsets, index + this.baseOffset)\n let pos = index + this.baseOffset + g0 - this.baseIndexOfGap\n\n while (g0 < offsets.length && offsets[g0] <= pos) {\n g0 += 1\n pos += 1\n }\n\n return g0 - this.baseIndexOfGap\n }\n\n /**\n * Calculate the location of the given index.\n * @param index The index to calculate their location.\n * @returns The location of the index.\n */\n public getLocation(index: number): Location {\n return this.getLocFromIndex(this.getOffsetWithGap(index))\n }\n\n /**\n * Calculate the offset of the given index.\n * @param index The index to calculate their location.\n * @returns The offset of the index.\n */\n public getOffsetWithGap(index: number): number {\n return index + this.getFixOffset(index)\n }\n\n /**\n * Gets the fix location offset of the given offset with using the base offset of this calculator.\n * @param offset The offset to modify.\n */\n public getFixOffset(offset: number): number {\n const shiftOffset = this.shiftOffset\n const gap = this._getGap(offset + shiftOffset)\n return this.baseOffset + gap + shiftOffset\n }\n}\n", "/**\n * @author Toru Nagashima <https://github.com/mysticatea>\n * @copyright 2017 Toru Nagashima. All rights reserved.\n * See LICENSE file in root directory for full license.\n */\nimport debugFactory from \"debug\"\nexport const debug = debugFactory(\"vue-eslint-parser\")\n", "import type {\n VAttribute,\n VDirective,\n VDocumentFragment,\n VElement,\n VNode,\n} from \"../ast\"\n\n/**\n * Check whether the node is a `<script>` element.\n * @param node The node to check.\n * @returns `true` if the node is a `<script>` element.\n */\nexport function isScriptElement(node: VNode): node is VElement {\n return node.type === \"VElement\" && node.name === \"script\"\n}\n\n/**\n * Checks whether the given script element is `<script setup>`.\n */\nexport function isScriptSetupElement(script: VElement): boolean {\n return (\n isScriptElement(script) &&\n script.startTag.attributes.some(\n (attr) => !attr.directive && attr.key.name === \"setup\",\n )\n )\n}\n\n/**\n * Check whether the node is a `<template>` element.\n * @param node The node to check.\n * @returns `true` if the node is a `<template>` element.\n */\nexport function isTemplateElement(node: VNode): node is VElement {\n return node.type === \"VElement\" && node.name === \"template\"\n}\n\n/**\n * Check whether the node is a `<style>` element.\n * @param node The node to check.\n * @returns `true` if the node is a `<style>` element.\n */\nexport function isStyleElement(node: VNode): node is VElement {\n return node.type === \"VElement\" && node.name === \"style\"\n}\n\n/**\n * Get the belonging document of the given node.\n * @param leafNode The node to get.\n * @returns The belonging document.\n */\nexport function getOwnerDocument(leafNode: VNode): VDocumentFragment | null {\n let node: VNode | null = leafNode\n while (node != null && node.type !== \"VDocumentFragment\") {\n node = node.parent\n }\n return node\n}\n\n/**\n * Check whether the attribute node is a `lang` attribute.\n * @param attribute The attribute node to check.\n * @returns `true` if the attribute node is a `lang` attribute.\n */\nexport function isLang(\n attribute: VAttribute | VDirective,\n): attribute is VAttribute {\n return attribute.directive === false && attribute.key.name === \"lang\"\n}\n\n/**\n * Get the `lang` attribute value from a given element.\n * @param element The element to get.\n * @param defaultLang The default value of the `lang` attribute.\n * @returns The `lang` attribute value.\n */\nexport function getLang(element: VElement | undefined): string | null {\n const langAttr = element && element.startTag.attributes.find(isLang)\n const lang = langAttr && langAttr.value && langAttr.value.value\n return lang || null\n}\n", "import type { ESLintExtendedProgram, ESLintProgram } from \"../ast\"\n\n/**\n * The type of basic ESLint custom parser.\n * e.g. espree\n */\nexport type BasicParserObject<R = ESLintProgram> = {\n parse(code: string, options: any): R\n parseForESLint: undefined\n}\n/**\n * The type of ESLint custom parser enhanced for ESLint.\n * e.g. @babel/eslint-parser, @typescript-eslint/parser\n */\nexport type EnhancedParserObject<R = ESLintExtendedProgram> = {\n parseForESLint(code: string, options: any): R\n parse: undefined\n}\n\n/**\n * The type of ESLint (custom) parsers.\n */\nexport type ParserObject<R1 = ESLintExtendedProgram, R2 = ESLintProgram> =\n | EnhancedParserObject<R1>\n | BasicParserObject<R2>\n\nexport function isParserObject<R1, R2>(\n value: ParserObject<R1, R2> | {} | undefined | null,\n): value is ParserObject<R1, R2> {\n return isEnhancedParserObject(value) || isBasicParserObject(value)\n}\nexport function isEnhancedParserObject<R>(\n value: EnhancedParserObject<R> | {} | undefined | null,\n): value is EnhancedParserObject<R> {\n return Boolean(value && typeof (value as any).parseForESLint === \"function\")\n}\nexport function isBasicParserObject<R>(\n value: BasicParserObject<R> | {} | undefined | null,\n): value is BasicParserObject<R> {\n return Boolean(value && typeof (value as any).parse === \"function\")\n}\n", "import * as path from \"path\"\nimport type { VDocumentFragment } from \"../ast\"\nimport type { CustomTemplateTokenizerConstructor } from \"../html/custom-tokenizer\"\nimport { getLang, isScriptElement, isScriptSetupElement } from \"./ast-utils\"\nimport type { ParserObject } from \"./parser-object\"\nimport { isParserObject } from \"./parser-object\"\n\nexport interface ParserOptions {\n // vue-eslint-parser options\n parser?:\n | boolean\n | string\n | ParserObject\n | Record<string, string | ParserObject | undefined>\n vueFeatures?: {\n interpolationAsNonHTML?: boolean // default true\n filter?: boolean // default true\n styleCSSVariableInjection?: boolean // default true\n }\n\n // espree options\n ecmaVersion?: number | \"latest\"\n sourceType?: \"script\" | \"module\"\n ecmaFeatures?: { [key: string]: any }\n\n // @typescript-eslint/parser options\n jsxPragma?: string\n jsxFragmentName?: string | null\n lib?: string[]\n\n project?: string | string[]\n projectFolderIgnoreList?: string[]\n tsconfigRootDir?: string\n extraFileExtensions?: string[]\n warnOnUnsupportedTypeScriptVersion?: boolean\n\n // set by eslint\n filePath?: string\n // enables by eslint\n comment?: boolean\n loc?: boolean\n range?: boolean\n tokens?: boolean\n\n // From ESLint\n eslintScopeManager?: boolean\n\n // others\n // [key: string]: any\n\n templateTokenizer?: Record<\n string,\n string | CustomTemplateTokenizerConstructor | undefined\n >\n}\n\nexport function isSFCFile(parserOptions: ParserOptions) {\n if (parserOptions.filePath === \"<input>\") {\n return true\n }\n return path.extname(parserOptions.filePath || \"unknown.vue\") === \".vue\"\n}\n\n/**\n * Gets the script parser name from the given parser lang.\n */\nexport function getScriptParser(\n parser:\n | boolean\n | string\n | ParserObject\n | Record<string, string | ParserObject | undefined>\n | undefined,\n getParserLang: () => string | null | Iterable<string | null>,\n): string | ParserObject | undefined {\n if (isParserObject(parser)) {\n return parser\n }\n if (parser && typeof parser === \"object\") {\n const parserLang = getParserLang()\n const parserLangs =\n parserLang == null\n ? []\n : typeof parserLang === \"string\"\n ? [parserLang]\n : parserLang\n for (const lang of parserLangs) {\n const parserForLang = lang && parser[lang]\n if (\n typeof parserForLang === \"string\" ||\n isParserObject(parserForLang)\n ) {\n return parserForLang\n }\n }\n return parser.js\n }\n return typeof parser === \"string\" ? parser : undefined\n}\n\nexport function getParserLangFromSFC(doc: VDocumentFragment): string | null {\n if (doc) {\n const scripts = doc.children.filter(isScriptElement)\n const script =\n (scripts.length === 2 && scripts.find(isScriptSetupElement)) ||\n scripts[0]\n if (script) {\n return getLang(script)\n }\n }\n return null\n}\n", "import Module from \"module\"\nimport path from \"path\"\nexport const createRequire: (filename: string) => (modname: string) => any =\n // Added in v12.2.0\n (Module as any).createRequire ||\n // Added in v10.12.0, but deprecated in v12.2.0.\n (Module as any).createRequireFromPath ||\n // Polyfill - This is not executed on the tests on node@>=10.\n /* istanbul ignore next */\n ((modname) => {\n const mod = new Module(modname)\n\n mod.filename = modname\n mod.paths = (Module as any)._nodeModulePaths(path.dirname(modname))\n ;(mod as any)._compile(\"module.exports = require;\", modname)\n return mod.exports\n })\n", "import path from \"path\"\nimport { createRequire } from \"./create-require\"\n\nfunction isLinterPath(p: string): boolean {\n return (\n // ESLint 6 and above\n p.includes(\n `eslint${path.sep}lib${path.sep}linter${path.sep}linter.js`,\n ) ||\n // ESLint 5\n p.includes(`eslint${path.sep}lib${path.sep}linter.js`)\n )\n}\n\nexport function getLinterRequire() {\n // Lookup the loaded eslint\n const linterPath = Object.keys(require.cache).find(isLinterPath)\n if (linterPath) {\n try {\n return createRequire(linterPath)\n } catch {\n // ignore\n }\n }\n return null\n}\n", "import * as escope from \"eslint-scope\"\nimport { getLinterRequire } from \"./linter-require\"\nimport { lte } from \"semver\"\n\nlet escopeCache: typeof escope | null = null\n\n/**\n * Load the newest `eslint-scope` from the loaded ESLint or dependency.\n */\nexport function getEslintScope(): typeof escope & {\n version: string\n} {\n if (!escopeCache) {\n escopeCache = getLinterRequire()?.(\"eslint-scope\")\n if (\n !escopeCache ||\n escopeCache.version == null ||\n lte(escopeCache.version, escope.version)\n ) {\n escopeCache = escope\n }\n }\n\n return escopeCache\n}\n", "import type { ParserOptions } from \"../common/parser-options\"\nimport { getLinterRequire } from \"./linter-require\"\n// @ts-expect-error -- ignore\nimport * as dependencyEspree from \"espree\"\nimport { lte, lt } from \"semver\"\nimport { createRequire } from \"./create-require\"\nimport path from \"path\"\nimport type { BasicParserObject } from \"./parser-object\"\n\ntype Espree = BasicParserObject & {\n latestEcmaVersion?: number\n version: string\n}\nlet espreeCache: Espree | null = null\n\n/**\n * Gets the espree that the given ecmaVersion can parse.\n */\nexport function getEspreeFromEcmaVersion(\n ecmaVersion: ParserOptions[\"ecmaVersion\"],\n): Espree {\n const linterEspree = getEspreeFromLinter()\n if (ecmaVersion == null) {\n return linterEspree\n }\n if (ecmaVersion === \"latest\") {\n return getNewestEspree()\n }\n if (\n normalizeEcmaVersion(ecmaVersion) <= getLatestEcmaVersion(linterEspree)\n ) {\n return linterEspree\n }\n const userEspree = getEspreeFromUser()\n if (normalizeEcmaVersion(ecmaVersion) <= getLatestEcmaVersion(userEspree)) {\n return userEspree\n }\n return linterEspree\n}\n\n/**\n * Load `espree` from the user dir.\n */\nexport function getEspreeFromUser(): Espree {\n try {\n const cwd = process.cwd()\n const relativeTo = path.join(cwd, \"__placeholder__.js\")\n return createRequire(relativeTo)(\"espree\")\n } catch {\n return getEspreeFromLinter()\n }\n}\n\n/**\n * Load `espree` from the loaded ESLint.\n * If the loaded ESLint was not found, just returns `require(\"espree\")`.\n */\nexport function getEspreeFromLinter(): Espree {\n if (!espreeCache) {\n espreeCache = getLinterRequire()?.(\"espree\")\n if (!espreeCache) {\n espreeCache = dependencyEspree\n }\n }\n\n return espreeCache!\n}\n\n/**\n * Load the newest `espree` from the loaded ESLint or dependency.\n */\nfunction getNewestEspree(): Espree {\n let newest = dependencyEspree\n const linterEspree = getEspreeFromLinter()\n if (\n linterEspree.version != null &&\n lte(newest.version, linterEspree.version)\n ) {\n newest = linterEspree\n }\n const userEspree = getEspreeFromUser()\n if (userEspree.version != null && lte(newest.version, userEspree.version)) {\n newest = userEspree\n }\n return newest\n}\n\nexport function getEcmaVersionIfUseEspree(\n parserOptions: ParserOptions,\n getDefault?: (defaultVer: number) => number,\n): number | undefined {\n if (parserOptions.parser != null && parserOptions.parser !== \"espree\") {\n return undefined\n }\n\n if (parserOptions.ecmaVersion === \"latest\") {\n return normalizeEcmaVersion(getLatestEcmaVersion(getNewestEspree()))\n }\n if (parserOptions.ecmaVersion == null) {\n const defVer = getDefaultEcmaVersion()\n return getDefault?.(defVer) ?? defVer\n }\n return normalizeEcmaVersion(parserOptions.ecmaVersion)\n}\n\nfunction getDefaultEcmaVersion(): number {\n if (lt(getEspreeFromLinter().version, \"9.0.0\")) {\n return 5\n }\n // Perhaps the version 9 will change the default to \"latest\".\n return normalizeEcmaVersion(getLatestEcmaVersion(getNewestEspree()))\n}\n\n/**\n * Normalize ECMAScript version\n */\nfunction normalizeEcmaVersion(version: number) {\n if (version > 5 && version < 2015) {\n return version + 2009\n }\n return version\n}\n\nfunction getLatestEcmaVersion(espree: Espree) {\n if (espree.latestEcmaVersion == null) {\n for (const { v, latest } of [\n { v: \"6.1.0\", latest: 2020 },\n { v: \"4.0.0\", latest: 2019 },\n ]) {\n if (lte(v, espree.version)) {\n return latest\n }\n }\n return 2018\n }\n return normalizeEcmaVersion(espree.latestEcmaVersion)\n}\n", "/**\n * @author Toru Nagashima <https://github.com/mysticatea>\n * @copyright 2017 Toru Nagashima. All rights reserved.\n * See LICENSE file in root directory for full license.\n */\nimport type * as escopeTypes from \"eslint-scope\"\nimport type { ParserOptions } from \"../common/parser-options\"\nimport type {\n ESLintIdentifier,\n ESLintProgram,\n Reference,\n Variable,\n} from \"../ast\"\nimport { getFallbackKeys } from \"../ast\"\nimport { getEslintScope } from \"../common/eslint-scope\"\nimport { getEcmaVersionIfUseEspree } from \"../common/espree\"\n\n/**\n * Check whether the given reference is unique in the belonging array.\n * @param reference The current reference to check.\n * @param index The index of the reference.\n * @param references The belonging array of the reference.\n */\nfunction isUnique(\n reference: escopeTypes.Reference,\n index: number,\n references: escopeTypes.Reference[],\n): boolean {\n return (\n index === 0 || reference.identifier !== references[index - 1].identifier\n )\n}\n\n/**\n * Check whether a given variable has that definition.\n * @param variable The variable to check.\n * @returns `true` if the variable has that definition.\n */\nfunction hasDefinition(variable: escopeTypes.Variable): boolean {\n return variable.defs.length >= 1\n}\n\n/**\n * Transform the given reference object.\n * @param reference The source reference object.\n * @returns The transformed reference object.\n */\nfunction transformReference(reference: escopeTypes.Reference): Reference {\n const ret: Reference = {\n id: reference.identifier as ESLintIdentifier,\n mode: reference.isReadOnly()\n ? \"r\"\n : reference.isWriteOnly()\n ? \"w\"\n : /* otherwise */ \"rw\",\n variable: null,\n }\n Object.defineProperty(ret, \"variable\", { enumerable: false })\n\n return ret\n}\n\n/**\n * Transform the given variable object.\n * @param variable The source variable object.\n * @returns The transformed variable object.\n */\nfunction transformVariable(variable: escopeTypes.Variable): Variable {\n const ret: Variable = {\n id: variable.defs[0].name as ESLintIdentifier,\n kind: variable.scope.type === \"for\" ? \"v-for\" : \"scope\",\n references: [],\n }\n Object.defineProperty(ret, \"references\", { enumerable: false })\n\n return ret\n}\n\n/**\n * Get the `for` statement scope.\n * @param scope The global scope.\n * @returns The `for` statement scope.\n */\nfunction getForScope(scope: escopeTypes.Scope): escopeTypes.Scope {\n const child = scope.childScopes[0]\n return child.block === scope.block ? child.childScopes[0] : child\n}\n\nexport function analyzeScope(\n ast: ESLintProgram,\n parserOptions: ParserOptions,\n): escopeTypes.ScopeManager {\n const ecmaVersion = getEcmaVersionIfUseEspree(parserOptions) || 2022\n const ecmaFeatures = parserOptions.ecmaFeatures || {}\n const sourceType = parserOptions.sourceType || \"script\"\n const result = getEslintScope().analyze(ast, {\n ignoreEval: true,\n nodejsScope: false,\n impliedStrict: ecmaFeatures.impliedStrict,\n ecmaVersion,\n sourceType,\n fallback: getFallbackKeys,\n })\n\n return result\n}\n\n/**\n *\n * @param ast\n * @param parserOptions\n */\nfunction analyze(\n ast: ESLintProgram,\n parserOptions: ParserOptions,\n): escopeTypes.Scope {\n return analyzeScope(ast, parserOptions).globalScope\n}\n\n/**\n * Analyze the external references of the given AST.\n * @param {ASTNode} ast The root node to analyze.\n * @returns {Reference[]} The reference objects of external references.\n */\nexport function analyzeExternalReferences(\n ast: ESLintProgram,\n parserOptions: ParserOptions,\n): Reference[] {\n const scope = analyze(ast, parserOptions)\n return scope.through.filter(isUnique).map(transformReference)\n}\n\n/**\n * Analyze the external references of the given AST.\n * @param {ASTNode} ast The root node to analyze.\n * @returns {Reference[]} The reference objects of external references.\n */\nexport function analyzeVariablesAndExternalReferences(\n ast: ESLintProgram,\n parserOptions: ParserOptions,\n): { variables: Variable[]; references: Reference[] } {\n const scope = analyze(ast, parserOptions)\n return {\n variables: getForScope(scope)\n .variables.filter(hasDefinition)\n .map(transformVariable),\n references: scope.through.filter(isUnique).map(transformReference),\n }\n}\n", "import type {\n ESLintExtendedProgram,\n ESLintNode,\n HasLocation,\n LocationRange,\n Node,\n ParseError,\n} from \"../ast\"\nimport { traverseNodes } from \"../ast\"\nimport type { LocationCalculator } from \"./location-calculator\"\n\n/**\n * Do post-process of parsing an expression.\n *\n * 1. Set `node.parent`.\n * 2. Fix `node.range` and `node.loc` for HTML entities.\n *\n * @param result The parsing result to modify.\n * @param locationCalculator The location calculator to modify.\n */\nexport function fixLocations(\n result: ESLintExtendedProgram,\n locationCalculator: LocationCalculator,\n): void {\n fixNodeLocations(result.ast, result.visitorKeys, locationCalculator)\n\n for (const token of result.ast.tokens || []) {\n fixLocation(token, locationCalculator)\n }\n for (const comment of result.ast.comments || []) {\n fixLocation(comment, locationCalculator)\n }\n}\n\nexport function fixNodeLocations(\n rootNode: ESLintNode,\n visitorKeys: ESLintExtendedProgram[\"visitorKeys\"],\n locationCalculator: LocationCalculator,\n): void {\n // There are cases which the same node instance appears twice in the tree.\n // E.g. `let {a} = {}` // This `a` appears twice at `Property#key` and `Property#value`.\n const traversed = new Map<Node | number[] | LocationRange, Node>()\n\n traverseNodes(rootNode, {\n visitorKeys,\n\n enterNode(node, parent) {\n if (!traversed.has(node)) {\n traversed.set(node, node)\n node.parent = parent\n\n // `babel-eslint@8` has shared `Node#range` with multiple nodes.\n // See also: https://github.com/vuejs/eslint-plugin-vue/issues/208\n if (traversed.has(node.range)) {\n if (!traversed.has(node.loc)) {\n // However, `Node#loc` may not be shared.\n // See also: https://github.com/vuejs/vue-eslint-parser/issues/84\n node.loc.start = locationCalculator.getLocFromIndex(\n node.range[0],\n )\n node.loc.end = locationCalculator.getLocFromIndex(\n node.range[1],\n )\n traversed.set(node.loc, node)\n } else if (node.start != null || node.end != null) {\n const traversedNode = traversed.get(node.range)!\n if (traversedNode.type === node.type) {\n node.start = traversedNode.start\n node.end = traversedNode.end\n }\n }\n } else {\n fixLocation(node, locationCalculator)\n traversed.set(node.range, node)\n traversed.set(node.loc, node)\n }\n }\n },\n\n leaveNode() {\n // Do nothing.\n },\n })\n}\n\n/**\n * Modify the location information of the given node with using the base offset and gaps of this calculator.\n * @param node The node to modify their location.\n */\nexport function fixLocation<T extends HasLocation>(\n node: T,\n locationCalculator: LocationCalculator,\n): T {\n const range = node.range\n const loc = node.loc\n const d0 = locationCalculator.getFixOffset(range[0], \"start\")\n const d1 = locationCalculator.getFixOffset(range[1], \"end\")\n\n if (d0 !== 0) {\n range[0] += d0\n if (node.start != null) {\n node.start += d0\n }\n loc.start = locationCalculator.getLocFromIndex(range[0])\n }\n if (d1 !== 0) {\n range[1] += d1\n if (node.end != null) {\n node.end += d0\n }\n loc.end = locationCalculator.getLocFromIndex(range[1])\n }\n\n return node\n}\n\n/**\n * Modify the location information of the given error with using the base offset and gaps of this calculator.\n * @param error The error to modify their location.\n */\nexport function fixErrorLocation(\n error: ParseError,\n locationCalculator: LocationCalculator,\n) {\n const diff = locationCalculator.getFixOffset(error.index, \"start\")\n\n error.index += diff\n\n const loc = locationCalculator.getLocFromIndex(error.index)\n error.lineNumber = loc.line\n error.column = loc.column\n}\n", "import { lte } from \"semver\"\nimport { getEcmaVersionIfUseEspree, getEspreeFromUser } from \"../common/espree\"\nimport type { ParserOptions } from \"../common/parser-options\"\n\nexport const DEFAULT_ECMA_VERSION = 2017\n\n/**\n * Get parser options for <script setup>\n */\nexport function getScriptSetupParserOptions(\n parserOptions: ParserOptions,\n): ParserOptions {\n const espreeEcmaVersion = getEcmaVersionIfUseEspree(\n parserOptions,\n getDefaultEcmaVersion,\n )\n\n return {\n ...parserOptions,\n ecmaVersion: espreeEcmaVersion,\n }\n}\n\nfunction getDefaultEcmaVersion(def: number) {\n if (lte(\"8.0.0\", getEspreeFromUser().version)) {\n // Script setup requires top level await support, so default the ecma version to 2022.\n return getEspreeFromUser().latestEcmaVersion!\n }\n return Math.max(def, DEFAULT_ECMA_VERSION)\n}\n", "/**\n * @author Toru Nagashima <https://github.com/mysticatea>\n * @copyright 2017 Toru Nagashima. All rights reserved.\n * See LICENSE file in root directory for full license.\n */\nimport first from \"lodash/first\"\nimport last from \"lodash/last\"\nimport sortedIndexBy from \"lodash/sortedIndexBy\"\nimport type {\n ESLintArrayExpression,\n ESLintArrayPattern,\n ESLintCallExpression,\n ESLintExpression,\n ESLintExpressionStatement,\n ESLintExtendedProgram,\n ESLintForInStatement,\n ESLintForOfStatement,\n ESLintFunctionExpression,\n ESLintIdentifier,\n ESLintUnaryExpression,\n ESLintVariableDeclaration,\n HasLocation,\n Node,\n Reference,\n Token,\n Variable,\n VElement,\n VFilter,\n VFilterSequenceExpression,\n VForExpression,\n VOnExpression,\n VSlotScopeExpression,\n OffsetRange,\n} from \"../ast\"\nimport { ParseError } from \"../ast\"\nimport { debug } from \"../common/debug\"\nimport type {\n LocationCalculator,\n LocationCalculatorForHtml,\n} from \"../common/location-calculator\"\nimport {\n analyzeExternalReferences,\n analyzeVariablesAndExternalReferences,\n} from \"./scope-analyzer\"\nimport {\n getEcmaVersionIfUseEspree,\n getEspreeFromUser,\n getEspreeFromEcmaVersion,\n} from \"../common/espree\"\nimport type { ParserOptions } from \"../common/parser-options\"\nimport {\n fixErrorLocation,\n fixLocation,\n fixLocations,\n} from \"../common/fix-locations\"\nimport {\n DEFAULT_ECMA_VERSION,\n getScriptSetupParserOptions,\n} from \"../script-setup/parser-options\"\nimport { isScriptSetupElement } from \"../common/ast-utils\"\nimport type { LinesAndColumns } from \"../common/lines-and-columns\"\nimport type { ParserObject } from \"../common/parser-object\"\nimport { isEnhancedParserObject, isParserObject } from \"../common/parser-object\"\n\n// [1] = aliases.\n// [2] = delimiter.\n// [3] = iterator.\nconst ALIAS_ITERATOR = /^([\\s\\S]*?(?:\\s|\\)))(\\bin\\b|\\bof\\b)([\\s\\S]*)$/u\nconst PARENS = /^(\\s*\\()([\\s\\S]*?)(\\)\\s*)$/u\nconst DUMMY_PARENT: any = {}\n\n// Like Vue, it judges whether it is a function expression or not.\n// https://github.com/vuejs/vue/blob/0948d999f2fddf9f90991956493f976273c5da1f/src/compiler/codegen/events.js#L3\nconst IS_FUNCTION_EXPRESSION = /^\\s*([\\w$_]+|\\([^)]*?\\))\\s*=>|^function\\s*\\(/u\nconst IS_SIMPLE_PATH =\n /^[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*|\\['[^']*?'\\]|\\[\"[^\"]*?\"\\]|\\[\\d+\\]|\\[[A-Za-z_$][\\w$]*\\])*$/u\n\n/**\n * Parse the alias and iterator of 'v-for' directive values.\n * @param code The code to parse.\n * @returns The parsed result.\n */\nfunction processVForAliasAndIterator(code: string): {\n aliases: string\n hasParens: boolean\n delimiter: string\n iterator: string\n aliasesWithBrackets: string\n} {\n const match = ALIAS_ITERATOR.exec(code)\n if (match != null) {\n const aliases = match[1]\n const parenMatch = PARENS.exec(aliases)\n return {\n aliases,\n hasParens: Boolean(parenMatch),\n aliasesWithBrackets: parenMatch\n ? `${parenMatch[1].slice(0, -1)}[${\n parenMatch[2]\n }]${parenMatch[3].slice(1)}`\n : `[${aliases.slice(0, -1)}]`,\n delimiter: match[2] || \"\",\n iterator: match[3],\n }\n }\n return {\n aliases: \"\",\n hasParens: false,\n aliasesWithBrackets: \"\",\n delimiter: \"\",\n iterator: code,\n }\n}\n\n/**\n * Get the comma token before a given node.\n * @param tokens The token list.\n * @param node The node to get the comma before this node.\n * @returns The comma token.\n */\nfunction getCommaTokenBeforeNode(tokens: Token[], node: Node): Token | null {\n let tokenIndex = sortedIndexBy(\n tokens as { range: OffsetRange }[],\n { range: node.range },\n (t) => t.range[0],\n )\n\n while (tokenIndex >= 0) {\n const token = tokens[tokenIndex]\n if (token.type === \"Punctuator\" && token.value === \",\") {\n return token\n }\n tokenIndex -= 1\n }\n\n return null\n}\n\n/**\n * Throw syntax error for empty.\n * @param locationCalculator The location calculator to get line/column.\n */\nfunction throwEmptyError(\n locationCalculator: LocationCalculatorForHtml,\n expected: string,\n): never {\n const loc = locationCalculator.getLocation(0)\n const err = new ParseError(\n `Expected to be ${expected}, but got empty.`,\n undefined,\n 0,\n loc.line,\n loc.column,\n )\n fixErrorLocation(err, locationCalculator)\n\n throw err\n}\n\n/**\n * Throw syntax error for unexpected token.\n * @param locationCalculator The location calculator to get line/column.\n * @param name The token name.\n * @param token The token object to get that location.\n */\nfunction throwUnexpectedTokenError(name: string, token: HasLocation): never {\n const err = new ParseError(\n `Unexpected token '${name}'.`,\n undefined,\n token.range[0],\n token.loc.start.line,\n token.loc.start.column,\n )\n\n throw err\n}\n\n/**\n * Throw syntax error of outside of code.\n * @param locationCalculator The location calculator to get line/column.\n */\nfunction throwErrorAsAdjustingOutsideOfCode(\n err: any,\n code: string,\n locationCalculator: LocationCalculatorForHtml,\n): never {\n if (ParseError.isParseError(err)) {\n const endOffset = locationCalculator.getOffsetWithGap(code.length)\n if (err.index >= endOffset) {\n err.message = \"Unexpected end of expression.\"\n }\n }\n\n throw err\n}\n\n/**\n * Parse the given source code.\n *\n * @param code The source code to parse.\n * @param locationCalculator The location calculator for fixLocations.\n * @param parserOptions The parser options.\n * @returns The result of parsing.\n */\nexport function parseScriptFragment(\n code: string,\n locationCalculator: LocationCalculator,\n parserOptions: ParserOptions,\n): ESLintExtendedProgram {\n try {\n const result = parseScript(code, parserOptions)\n fixLocations(result, locationCalculator)\n return result\n } catch (err) {\n const perr = ParseError.normalize(err)\n if (perr) {\n fixErrorLocation(perr, locationCalculator)\n throw perr\n }\n throw err\n }\n}\n\nconst validDivisionCharRE = /[\\w).+\\-_$\\]]/u\n\n/**\n * This is a fork of https://github.com/vuejs/vue/blob/2686818beb5728e3b7aa22f47a3b3f0d39d90c8e/src/compiler/parser/filter-parser.js\n * @param exp the expression to process filters.\n */\n//eslint-disable-next-line complexity\nfunction splitFilters(exp: string): string[] {\n const result: string[] = []\n let inSingle = false\n let inDouble = false\n let inTemplateString = false\n let inRegex = false\n let curly = 0\n let square = 0\n let paren = 0\n let lastFilterIndex = 0\n let c = 0\n let prev = 0\n\n for (let i = 0; i < exp.length; i++) {\n prev = c\n c = exp.charCodeAt(i)\n if (inSingle) {\n if (c === 0x27 && prev !== 0x5c) {\n inSingle = false\n }\n } else if (inDouble) {\n if (c === 0x22 && prev !== 0x5c) {\n inDouble = false\n }\n } else if (inTemplateString) {\n if (c === 0x60 && prev !== 0x5c) {\n inTemplateString = false\n }\n } else if (inRegex) {\n if (c === 0x2f && prev !== 0x5c) {\n inRegex = false\n }\n } else if (\n c === 0x7c && // pipe\n exp.charCodeAt(i + 1) !== 0x7c &&\n exp.charCodeAt(i - 1) !== 0x7c &&\n !curly &&\n !square &&\n !paren\n ) {\n result.push(exp.slice(lastFilterIndex, i))\n lastFilterIndex = i + 1\n } else {\n switch (c) {\n case 0x22: // \"\n inDouble = true\n break\n case 0x27: // '\n inSingle = true\n break\n case 0x60: // `\n inTemplateString = true\n break\n case 0x28: // (\n paren++\n break\n case 0x29: // )\n paren--\n break\n case 0x5b: // [\n square++\n break\n case 0x5d: // ]\n square--\n break\n case 0x7b: // {\n curly++\n break\n case 0x7d: // }\n curly--\n break\n // no default\n }\n if (c === 0x2f) {\n // /\n let j = i - 1\n let p\n // find first non-whitespace prev char\n for (; j >= 0; j--) {\n p = exp.charAt(j)\n if (p !== \" \") {\n break\n }\n }\n if (!p || !validDivisionCharRE.test(p)) {\n inRegex = true\n }\n }\n }\n }\n\n result.push(exp.slice(lastFilterIndex))\n\n return result\n}\n\n/**\n * Parse the source code of inline scripts.\n * @param code The source code of inline scripts.\n * @param locationCalculator The location calculator for the inline script.\n * @param parserOptions The parser options.\n * @returns The result of parsing.\n */\nfunction parseExpressionBody(\n code: string,\n locationCalculator: LocationCalculatorForHtml,\n parserOptions: ParserOptions,\n allowEmpty = false,\n): ExpressionParseResult<ESLintExpression> {\n debug('[script] parse expression: \"0(%s)\"', code)\n\n try {\n const ast = parseScriptFragment(\n `0(${code})`,\n locationCalculator.getSubCalculatorShift(-2),\n parserOptions,\n ).ast\n const tokens = ast.tokens || []\n const comments = ast.comments || []\n const references = analyzeExternalReferences(ast, parserOptions)\n const statement = ast.body[0] as ESLintExpressionStatement\n const callExpression = statement.expression as ESLintCallExpression\n const expression = callExpression.arguments[0]\n\n if (!allowEmpty && !expression) {\n return throwEmptyError(locationCalculator, \"an expression\")\n }\n if (expression && expression.type === \"SpreadElement\") {\n return throwUnexpectedTokenError(\"...\", expression)\n }\n if (callExpression.arguments[1]) {\n const node = callExpression.arguments[1]\n return throwUnexpectedTokenError(\n \",\",\n getCommaTokenBeforeNode(tokens, node) || node,\n )\n }\n\n // Remove parens.\n tokens.shift()\n tokens.shift()\n tokens.pop()\n\n return { expression, tokens, comments, references, variables: [] }\n } catch (err) {\n return throwErrorAsAdjustingOutsideOfCode(err, code, locationCalculator)\n }\n}\n\n/**\n * Parse the source code of inline scripts.\n * @param code The source code of inline scripts.\n * @param locationCalculator The location calculator for the inline script.\n * @param parserOptions The parser options.\n * @returns The result of parsing.\n */\nfunction parseFilter(\n code: string,\n locationCalculator: LocationCalculatorForHtml,\n parserOptions: ParserOptions,\n): ExpressionParseResult<VFilter> | null {\n debug('[script] parse filter: \"%s\"', code)\n\n try {\n const expression: VFilter = {\n type: \"VFilter\",\n parent: null as any,\n range: [0, 0],\n loc: {} as any,\n callee: null as any,\n arguments: [],\n }\n const tokens: Token[] = []\n const comments: Token[] = []\n const references: Reference[] = []\n\n // Parse the callee.\n const paren = code.indexOf(\"(\")\n const calleeCode = paren === -1 ? code : code.slice(0, paren)\n const argsCode = paren === -1 ? null : code.slice(paren)\n\n // Parse the callee.\n if (calleeCode.trim()) {\n const spaces = /^\\s*/u.exec(calleeCode)![0]\n const subCalculator = locationCalculator.getSubCalculatorShift(\n spaces.length,\n )\n const { ast } = parseScriptFragment(\n `\"${calleeCode.trim()}\"`,\n subCalculator,\n parserOptions,\n )\n const statement = ast.body[0] as ESLintExpressionStatement\n const callee = statement.expression\n if (callee.type !== \"Literal\") {\n const { loc, range } = ast.tokens![0]\n return throwUnexpectedTokenError('\"', {\n range: [range[1] - 1, range[1]],\n loc: {\n start: {\n line: loc.end.line,\n column: loc.end.column - 1,\n },\n end: loc.end,\n },\n })\n }\n\n expression.callee = {\n type: \"Identifier\",\n parent: expression,\n range: [\n callee.range[0],\n subCalculator.getOffsetWithGap(calleeCode.trim().length),\n ],\n loc: {\n start: callee.loc.start,\n end: subCalculator.getLocation(calleeCode.trim().length),\n },\n name: String(callee.value),\n }\n tokens.push({\n type: \"Identifier\",\n value: calleeCode.trim(),\n range: expression.callee.range,\n loc: expression.callee.loc,\n })\n } else {\n return throwEmptyError(locationCalculator, \"a filter name\")\n }\n\n // Parse the arguments.\n if (argsCode != null) {\n const { ast } = parseScriptFragment(\n `0${argsCode}`,\n locationCalculator\n .getSubCalculatorAfter(paren)\n .getSubCalculatorShift(-1),\n parserOptions,\n )\n const statement = ast.body[0] as ESLintExpressionStatement\n const callExpression = statement.expression\n\n ast.tokens!.shift()\n\n if (\n callExpression.type !== \"CallExpression\" ||\n callExpression.callee.type !== \"Literal\"\n ) {\n // Report the next token of `)`.\n let nestCount = 1\n for (const token of ast.tokens!.slice(1)) {\n if (nestCount === 0) {\n return throwUnexpectedTokenError(token.value, token)\n }\n if (token.type === \"Punctuator\" && token.value === \"(\") {\n nestCount += 1\n }\n if (token.type === \"Punctuator\" && token.value === \")\") {\n nestCount -= 1\n }\n }\n\n const token = last(ast.tokens)!\n return throwUnexpectedTokenError(token.value, token)\n }\n\n for (const argument of callExpression.arguments) {\n argument.parent = expression\n expression.arguments.push(argument)\n }\n tokens.push(...ast.tokens!)\n comments.push(...ast.comments!)\n references.push(...analyzeExternalReferences(ast, parserOptions))\n }\n\n // Update range.\n const firstToken = tokens[0]\n const lastToken = last(tokens)!\n expression.range = [firstToken.range[0], lastToken.range[1]]\n expression.loc = { start: firstToken.loc.start, end: lastToken.loc.end }\n\n return { expression, tokens, comments, references, variables: [] }\n } catch (err) {\n return throwErrorAsAdjustingOutsideOfCode(err, code, locationCalculator)\n }\n}\n\n/**\n * The result of parsing expressions.\n */\nexport interface ExpressionParseResult<T extends Node> {\n expression: T | null\n tokens: Token[]\n comments: Token[]\n references: Reference[]\n variables: Variable[]\n}\n\nfunction loadParser(parser: string) {\n if (parser !== \"espree\") {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(parser)\n }\n return getEspreeFromUser()\n}\n\n/**\n * Parse the given source code.\n *\n * @param code The source code to parse.\n * @param parserOptions The parser options.\n * @returns The result of parsing.\n */\nexport function parseScript(\n code: string,\n parserOptions: ParserOptions,\n): ESLintExtendedProgram {\n const parser: ParserObject =\n typeof parserOptions.parser === \"string\"\n ? loadParser(parserOptions.parser)\n : isParserObject(parserOptions.parser)\n ? parserOptions.parser\n : getEspreeFromEcmaVersion(parserOptions.ecmaVersion)\n\n const result: any = isEnhancedParserObject(parser)\n ? parser.parseForESLint(code, parserOptions)\n : parser.parse(code, parserOptions)\n\n if (result.ast != null) {\n return result\n }\n return { ast: result }\n}\n\n/**\n * Parse the source code of the given `<script>` element.\n * @param node The `<script>` element to parse.\n * @param sfcCode The source code of SFC.\n * @param linesAndColumns The lines and columns location calculator.\n * @param parserOptions The parser options.\n * @returns The result of parsing.\n */\nexport function parseScriptElement(\n node: VElement,\n sfcCode: string,\n linesAndColumns: LinesAndColumns,\n originalParserOptions: ParserOptions,\n): ESLintExtendedProgram {\n const parserOptions: ParserOptions = isScriptSetupElement(node)\n ? getScriptSetupParserOptions(originalParserOptions)\n : {\n ...originalParserOptions,\n ecmaVersion:\n originalParserOptions.ecmaVersion || DEFAULT_ECMA_VERSION,\n }\n\n let code: string\n let offset: number\n const textNode = node.children[0]\n if (textNode != null && textNode.type === \"VText\") {\n const [scriptStartOffset, scriptEndOffset] = textNode.range\n code = sfcCode.slice(scriptStartOffset, scriptEndOffset)\n offset = scriptStartOffset\n } else {\n code = \"\"\n offset = node.startTag.range[1]\n }\n const locationCalculator =\n linesAndColumns.createOffsetLocationCalculator(offset)\n const result = parseScriptFragment(code, locationCalculator, parserOptions)\n\n // Needs the tokens of start/end tags for `lines-around-*` rules to work\n // correctly.\n if (result.ast.tokens != null) {\n const startTag = node.startTag\n const endTag = node.endTag\n\n result.ast.tokens.unshift({\n type: \"Punctuator\",\n range: startTag.range,\n loc: startTag.loc,\n value: \"<script>\",\n })\n if (endTag != null) {\n result.ast.tokens.push({\n type: \"Punctuator\",\n range: endTag.range,\n loc: endTag.loc,\n value: \"</script>\",\n })\n }\n }\n\n return result\n}\n\n/**\n * Parse the source code of inline scripts.\n * @param code The source code of inline scripts.\n * @param locationCalculator The location calculator for the inline script.\n * @param parserOptions The parser options.\n * @returns The result of parsing.\n */\nexport function parseExpression(\n code: string,\n locationCalculator: LocationCalculatorForHtml,\n parserOptions: ParserOptions,\n { allowEmpty = false, allowFilters = false } = {},\n): ExpressionParseResult<ESLintExpression | VFilterSequenceExpression> {\n debug('[script] parse expression: \"%s\"', code)\n\n const [mainCode, ...filterCodes] =\n allowFilters && (parserOptions.vueFeatures?.filter ?? true)\n ? splitFilters(code)\n : [code]\n if (filterCodes.length === 0) {\n return parseExpressionBody(\n code,\n locationCalculator,\n parserOptions,\n allowEmpty,\n )\n }\n\n // Parse expression\n const retB = parseExpressionBody(\n mainCode,\n locationCalculator,\n parserOptions,\n )\n if (!retB.expression) {\n return retB\n }\n const ret =\n retB as unknown as ExpressionParseResult<VFilterSequenceExpression>\n\n ret.expression = {\n type: \"VFilterSequenceExpression\",\n parent: null as any,\n expression: retB.expression,\n filters: [],\n range: retB.expression.range.slice(0) as [number, number],\n loc: Object.assign({}, retB.expression.loc),\n }\n ret.expression.expression.parent = ret.expression\n\n // Parse filters\n let prevLoc = mainCode.length\n for (const filterCode of filterCodes) {\n // Pipe token.\n ret.tokens.push(\n fixLocation(\n {\n type: \"Punctuator\",\n value: \"|\",\n range: [prevLoc, prevLoc + 1],\n loc: {} as any,\n },\n locationCalculator,\n ),\n )\n\n // Parse a filter\n const retF = parseFilter(\n filterCode,\n locationCalculator.getSubCalculatorShift(prevLoc + 1),\n parserOptions,\n )\n if (retF) {\n if (retF.expression) {\n ret.expression.filters.push(retF.expression)\n retF.expression.parent = ret.expression\n }\n ret.tokens.push(...retF.tokens)\n ret.comments.push(...retF.comments)\n ret.references.push(...retF.references)\n }\n\n prevLoc += 1 + filterCode.length\n }\n\n // Update range.\n const lastToken = last(ret.tokens)!\n ret.expression.range[1] = lastToken.range[1]\n ret.expression.loc.end = lastToken.loc.end\n\n return ret\n}\n\n/**\n * Parse the source code of inline scripts.\n * @param code The source code of inline scripts.\n * @param locationCalculator The location calculator for the inline script.\n * @param parserOptions The parser options.\n * @returns The result of parsing.\n */\n// eslint-disable-next-line complexity\nexport function parseVForExpression(\n code: string,\n locationCalculator: LocationCalculatorForHtml,\n parserOptions: ParserOptions,\n): ExpressionParseResult<VForExpression> {\n if (code.trim() === \"\") {\n throwEmptyError(locationCalculator, \"'<alias> in <expression>'\")\n }\n\n if (isEcmaVersion5(parserOptions)) {\n return parseVForExpressionForEcmaVersion5(\n code,\n locationCalculator,\n parserOptions,\n )\n }\n const processed = processVForAliasAndIterator(code)\n\n if (!processed.aliases.trim()) {\n return throwEmptyError(locationCalculator, \"an alias\")\n }\n try {\n debug(\n '[script] parse v-for expression: \"for(%s%s%s);\"',\n processed.aliasesWithBrackets,\n processed.delimiter,\n processed.iterator,\n )\n\n const ast = parseScriptFragment(\n `for(let ${processed.aliasesWithBrackets}${processed.delimiter}${processed.iterator});`,\n locationCalculator.getSubCalculatorShift(\n processed.hasParens ? -8 : -9,\n ),\n parserOptions,\n ).ast\n const tokens = ast.tokens || []\n const comments = ast.comments || []\n const scope = analyzeVariablesAndExternalReferences(ast, parserOptions)\n const references = scope.references\n const variables = scope.variables\n const statement = ast.body[0] as\n | ESLintForInStatement\n | ESLintForOfStatement\n const varDecl = statement.left as ESLintVariableDeclaration\n const id = varDecl.declarations[0].id as ESLintArrayPattern\n const left = id.elements\n const right = statement.right\n\n if (!processed.hasParens && !left.length) {\n return throwEmptyError(locationCalculator, \"an alias\")\n }\n // Remove `for` `(` `let` `)` `;`.\n tokens.shift()\n tokens.shift()\n tokens.shift()\n tokens.pop()\n tokens.pop()\n\n const closeOffset = statement.left.range[1] - 1\n const closeIndex = tokens.findIndex((t) => t.range[0] === closeOffset)\n\n if (processed.hasParens) {\n // Restore parentheses from array brackets.\n const open = tokens[0]\n if (open != null) {\n open.value = \"(\"\n }\n const close = tokens[closeIndex]\n if (close != null) {\n close.value = \")\"\n }\n } else {\n // Remove array brackets.\n tokens.splice(closeIndex, 1)\n tokens.shift()\n }\n const firstToken = tokens[0] || statement.left\n const lastToken = tokens[tokens.length - 1] || statement.right\n const expression: VForExpression = {\n type: \"VForExpression\",\n range: [firstToken.range[0], lastToken.range[1]],\n loc: { start: firstToken.loc.start, end: lastToken.loc.end },\n parent: DUMMY_PARENT,\n left,\n right,\n }\n\n // Modify parent.\n for (const l of left) {\n if (l != null) {\n l.parent = expression\n }\n }\n right.parent = expression\n\n return { expression, tokens, comments, references, variables }\n } catch (err) {\n return throwErrorAsAdjustingOutsideOfCode(err, code, locationCalculator)\n }\n}\n\nfunction isEcmaVersion5(parserOptions: ParserOptions) {\n const ecmaVersion = getEcmaVersionIfUseEspree(parserOptions)\n return ecmaVersion != null && ecmaVersion <= 5\n}\n\nfunction parseVForExpressionForEcmaVersion5(\n code: string,\n locationCalculator: LocationCalculatorForHtml,\n parserOptions: ParserOptions,\n): ExpressionParseResult<VForExpression> {\n const processed = processVForAliasAndIterator(code)\n\n if (!processed.aliases.trim()) {\n return throwEmptyError(locationCalculator, \"an alias\")\n }\n try {\n const tokens: Token[] = []\n const comments: Token[] = []\n\n const parsedAliases = parseVForAliasesForEcmaVersion5(\n processed.aliasesWithBrackets,\n locationCalculator.getSubCalculatorShift(\n processed.hasParens ? 0 : -1,\n ),\n parserOptions,\n )\n\n if (processed.hasParens) {\n // Restore parentheses from array brackets.\n const open = parsedAliases.tokens[0]\n if (open != null) {\n open.value = \"(\"\n }\n const close = last(parsedAliases.tokens)\n if (close != null) {\n close.value = \")\"\n }\n } else {\n // Remove array brackets.\n parsedAliases.tokens.shift()\n parsedAliases.tokens.pop()\n }\n tokens.push(...parsedAliases.tokens)\n comments.push(...parsedAliases.comments)\n const { left, variables } = parsedAliases\n\n if (!processed.hasParens && !left.length) {\n return throwEmptyError(locationCalculator, \"an alias\")\n }\n\n const delimiterStart = processed.aliases.length\n const delimiterEnd = delimiterStart + processed.delimiter.length\n tokens.push(\n fixLocation(\n {\n type:\n processed.delimiter === \"in\" ? \"Keyword\" : \"Identifier\",\n value: processed.delimiter,\n start: delimiterStart,\n end: delimiterEnd,\n loc: {} as any,\n range: [delimiterStart, delimiterEnd],\n } as Token,\n locationCalculator,\n ),\n )\n\n const parsedIterator = parseVForIteratorForEcmaVersion5(\n processed.iterator,\n locationCalculator.getSubCalculatorShift(delimiterEnd),\n parserOptions,\n )\n\n tokens.push(...parsedIterator.tokens)\n comments.push(...parsedIterator.comments)\n const { right, references } = parsedIterator\n const firstToken = tokens[0]\n const lastToken = last(tokens) || firstToken\n const expression: VForExpression = {\n type: \"VForExpression\",\n range: [firstToken.range[0], lastToken.range[1]],\n loc: { start: firstToken.loc.start, end: lastToken.loc.end },\n parent: DUMMY_PARENT,\n left,\n right,\n }\n\n // Modify parent.\n for (const l of left) {\n if (l != null) {\n l.parent = expression\n }\n }\n right.parent = expression\n\n return { expression, tokens, comments, references, variables }\n } catch (err) {\n return throwErrorAsAdjustingOutsideOfCode(err, code, locationCalculator)\n }\n}\n\nfunction parseVForAliasesForEcmaVersion5(\n code: string,\n locationCalculator: LocationCalculatorForHtml,\n parserOptions: ParserOptions,\n) {\n const ast = parseScriptFragment(\n `0(${code})`,\n locationCalculator.getSubCalculatorShift(-2),\n parserOptions,\n ).ast\n const tokens = ast.tokens || []\n const comments = ast.comments || []\n const variables = analyzeExternalReferences(ast, parserOptions).map(\n transformVariable,\n )\n\n const statement = ast.body[0] as ESLintExpressionStatement\n const callExpression = statement.expression as ESLintCallExpression\n const expression = callExpression.arguments[0] as ESLintArrayExpression\n\n const left: ESLintIdentifier[] = expression.elements.filter(\n (e): e is ESLintIdentifier => {\n if (e == null || e.type === \"Identifier\") {\n return true\n }\n const errorToken = tokens.find(\n (t) => e.range[0] <= t.range[0] && t.range[1] <= e.range[1],\n )!\n return throwUnexpectedTokenError(errorToken.value, errorToken)\n },\n )\n // Remove parens.\n tokens.shift()\n tokens.shift()\n tokens.pop()\n\n return { left, tokens, comments, variables }\n\n function transformVariable(reference: Reference): Variable {\n const ret: Variable = {\n id: reference.id,\n kind: \"v-for\",\n references: [],\n }\n Object.defineProperty(ret, \"references\", { enumerable: false })\n\n return ret\n }\n}\n\nfunction parseVForIteratorForEcmaVersion5(\n code: string,\n locationCalculator: LocationCalculatorForHtml,\n parserOptions: ParserOptions,\n) {\n const ast = parseScriptFragment(\n `0(${code})`,\n locationCalculator.getSubCalculatorShift(-2),\n parserOptions,\n ).ast\n const tokens = ast.tokens || []\n const comments = ast.comments || []\n const references = analyzeExternalReferences(ast, parserOptions)\n\n const statement = ast.body[0] as ESLintExpressionStatement\n const callExpression = statement.expression as ESLintCallExpression\n const expression = callExpression.arguments[0]\n\n if (!expression) {\n return throwEmptyError(locationCalculator, \"an expression\")\n }\n if (expression && expression.type === \"SpreadElement\") {\n return throwUnexpectedTokenError(\"...\", expression)\n }\n const right = expression\n\n // Remove parens.\n tokens.shift()\n tokens.shift()\n tokens.pop()\n return { right, tokens, comments, references }\n}\n\n/**\n * Parse the source code of inline scripts.\n * @param code The source code of inline scripts.\n * @param locationCalculator The location calculator for the inline script.\n * @param parserOptions The parser options.\n * @returns The result of parsing.\n */\nexport function parseVOnExpression(\n code: string,\n locationCalculator: LocationCalculatorForHtml,\n parserOptions: ParserOptions,\n): ExpressionParseResult<ESLintExpression | VOnExpression> {\n if (IS_FUNCTION_EXPRESSION.test(code) || IS_SIMPLE_PATH.test(code)) {\n return parseExpressionBody(code, locationCalculator, parserOptions)\n }\n return parseVOnExpressionBody(code, locationCalculator, parserOptions)\n}\n\n/**\n * Parse the source code of inline scripts.\n * @param code The source code of inline scripts.\n * @param locationCalculator The location calculator for the inline script.\n * @param parserOptions The parser options.\n * @returns The result of parsing.\n */\nfunction parseVOnExpressionBody(\n code: string,\n locationCalculator: LocationCalculatorForHtml,\n parserOptions: ParserOptions,\n): ExpressionParseResult<VOnExpression> {\n debug('[script] parse v-on expression: \"void function($event){%s}\"', code)\n\n if (code.trim() === \"\") {\n throwEmptyError(locationCalculator, \"statements\")\n }\n\n try {\n const ast = parseScriptFragment(\n `void function($event){${code}}`,\n locationCalculator.getSubCalculatorShift(-22),\n parserOptions,\n ).ast\n const references = analyzeExternalReferences(ast, parserOptions)\n const outermostStatement = ast.body[0] as ESLintExpressionStatement\n const functionDecl = (\n outermostStatement.expression as ESLintUnaryExpression\n ).argument as ESLintFunctionExpression\n const block = functionDecl.body\n const body = block.body\n const firstStatement = first(body)\n const lastStatement = last(body)\n const expression: VOnExpression = {\n type: \"VOnExpression\",\n range: [\n firstStatement != null\n ? firstStatement.range[0]\n : block.range[0] + 1,\n lastStatement != null\n ? lastStatement.range[1]\n : block.range[1] - 1,\n ],\n loc: {\n start:\n firstStatement != null\n ? firstStatement.loc.start\n : locationCalculator.getLocation(1),\n end:\n lastStatement != null\n ? lastStatement.loc.end\n : locationCalculator.getLocation(code.length + 1),\n },\n parent: DUMMY_PARENT,\n body,\n }\n const tokens = ast.tokens || []\n const comments = ast.comments || []\n\n // Modify parent.\n for (const b of body) {\n b.parent = expression\n }\n\n // Remove braces.\n tokens.splice(0, 6)\n tokens.pop()\n\n return { expression, tokens, comments, references, variables: [] }\n } catch (err) {\n return throwErrorAsAdjustingOutsideOfCode(err, code, locationCalculator)\n }\n}\n\n/**\n * Parse the source code of `slot-scope` directive.\n * @param code The source code of `slot-scope` directive.\n * @param locationCalculator The location calculator for the inline script.\n * @param parserOptions The parser options.\n * @returns The result of parsing.\n */\nexport function parseSlotScopeExpression(\n code: string,\n locationCalculator: LocationCalculatorForHtml,\n parserOptions: ParserOptions,\n): ExpressionParseResult<VSlotScopeExpression> {\n debug('[script] parse slot-scope expression: \"void function(%s) {}\"', code)\n\n if (code.trim() === \"\") {\n throwEmptyError(\n locationCalculator,\n \"an identifier or an array/object pattern\",\n )\n }\n\n try {\n const ast = parseScriptFragment(\n `void function(${code}) {}`,\n locationCalculator.getSubCalculatorShift(-14),\n parserOptions,\n ).ast\n const statement = ast.body[0] as ESLintExpressionStatement\n const rawExpression = statement.expression as ESLintUnaryExpression\n const functionDecl = rawExpression.argument as ESLintFunctionExpression\n const params = functionDecl.params\n\n if (params.length === 0) {\n return {\n expression: null,\n tokens: [],\n comments: [],\n references: [],\n variables: [],\n }\n }\n\n const tokens = ast.tokens || []\n const comments = ast.comments || []\n const scope = analyzeVariablesAndExternalReferences(ast, parserOptions)\n const references = scope.references\n const variables = scope.variables\n const firstParam = first(params)!\n const lastParam = last(params)!\n const expression: VSlotScopeExpression = {\n type: \"VSlotScopeExpression\",\n range: [firstParam.range[0], lastParam.range[1]],\n loc: { start: firstParam.loc.start, end: lastParam.loc.end },\n parent: DUMMY_PARENT,\n params: functionDecl.params,\n }\n\n // Modify parent.\n for (const param of params) {\n param.parent = expression\n }\n\n // Remove `void` `function` `(` `)` `{` `}`.\n tokens.shift()\n tokens.shift()\n tokens.shift()\n tokens.pop()\n tokens.pop()\n tokens.pop()\n\n return { expression, tokens, comments, references, variables }\n } catch (err) {\n return throwErrorAsAdjustingOutsideOfCode(err, code, locationCalculator)\n }\n}\n", "import sortedIndexBy from \"lodash/sortedIndexBy\"\nimport sortedLastIndexBy from \"lodash/sortedLastIndexBy\"\nimport type { LocationRange, Token, VDocumentFragment } from \"../ast\"\nimport type { LinesAndColumns } from \"./lines-and-columns\"\n\ninterface HasRange {\n range: [number, number]\n}\n/**\n * Replace the tokens in the given range.\n * @param document The document that the node is belonging to.\n * @param node The node to specify the range of replacement.\n * @param newTokens The new tokens.\n */\nexport function replaceTokens(\n document: VDocumentFragment | null,\n node: HasRange,\n newTokens: Token[],\n): void {\n if (document == null) {\n return\n }\n\n const index = sortedIndexBy(document.tokens, node, byRange0)\n const count = sortedLastIndexBy(document.tokens, node, byRange1) - index\n document.tokens.splice(index, count, ...newTokens)\n}\n\n/**\n * Replace and split the tokens in the given range.\n * @param document The document that the node is belonging to.\n * @param node The node to specify the range of replacement.\n * @param newTokens The new tokens.\n */\nexport function replaceAndSplitTokens(\n document: VDocumentFragment | null,\n node: HasRange & {\n loc: LocationRange\n },\n newTokens: Token[],\n): void {\n if (document == null) {\n return\n }\n\n const index = sortedIndexBy(document.tokens, node, byRange0)\n if (\n document.tokens.length === index ||\n node.range[0] < document.tokens[index].range[0]\n ) {\n // split\n const beforeToken = document.tokens[index - 1]\n const value = beforeToken.value\n const splitOffset = node.range[0] - beforeToken.range[0]\n const afterToken: Token = {\n type: beforeToken.type,\n range: [node.range[0], beforeToken.range[1]],\n loc: {\n start: { ...node.loc.start },\n end: { ...beforeToken.loc.end },\n },\n value: value.slice(splitOffset),\n }\n beforeToken.range[1] = node.range[0]\n beforeToken.loc.end = { ...node.loc.start }\n beforeToken.value = value.slice(0, splitOffset)\n document.tokens.splice(index, 0, afterToken)\n }\n let lastIndex = sortedLastIndexBy(document.tokens, node, byRange1)\n if (\n lastIndex === 0 ||\n node.range[1] < document.tokens[lastIndex].range[1]\n ) {\n // split\n const beforeToken = document.tokens[lastIndex]\n const value = beforeToken.value\n const splitOffset =\n beforeToken.range[1] -\n beforeToken.range[0] -\n (beforeToken.range[1] - node.range[1])\n const afterToken: Token = {\n type: beforeToken.type,\n range: [node.range[1], beforeToken.range[1]],\n loc: {\n start: { ...node.loc.end },\n end: { ...beforeToken.loc.end },\n },\n value: value.slice(splitOffset),\n }\n beforeToken.range[1] = node.range[1]\n beforeToken.loc.end = { ...node.loc.end }\n beforeToken.value = value.slice(0, splitOffset)\n document.tokens.splice(lastIndex + 1, 0, afterToken)\n lastIndex++\n }\n const count = lastIndex - index\n document.tokens.splice(index, count, ...newTokens)\n}\n\n/**\n * Insert the given comment tokens.\n * @param document The document that the node is belonging to.\n * @param newComments The comments to insert.\n */\nexport function insertComments(\n document: VDocumentFragment | null,\n newComments: Token[],\n): void {\n if (document == null || newComments.length === 0) {\n return\n }\n\n const index = sortedIndexBy(document.comments, newComments[0], byRange0)\n document.comments.splice(index, 0, ...newComments)\n}\n\n/**\n * Create a simple token.\n * @param type The type of new token.\n * @param start The offset of the start position of new token.\n * @param end The offset of the end position of new token.\n * @param value The value of new token.\n * @returns The new token.\n */\nexport function createSimpleToken(\n type: string,\n start: number,\n end: number,\n value: string,\n linesAndColumns: LinesAndColumns,\n): Token {\n return {\n type,\n range: [start, end],\n loc: {\n start: linesAndColumns.getLocFromIndex(start),\n end: linesAndColumns.getLocFromIndex(end),\n },\n value,\n }\n}\n\n/**\n * Get `x.range[0]`.\n * @param x The object to get.\n * @returns `x.range[0]`.\n */\nfunction byRange0(x: HasRange): number {\n return x.range[0]\n}\n\n/**\n * Get `x.range[1]`.\n * @param x The object to get.\n * @returns `x.range[1]`.\n */\nfunction byRange1(x: HasRange): number {\n return x.range[1]\n}\n", "import type { ParseError, VDocumentFragment } from \"../ast\"\nimport sortedIndexBy from \"lodash/sortedIndexBy\"\n/**\n * Insert the given error.\n * @param document The document that the node is belonging to.\n * @param error The error to insert.\n */\nexport function insertError(\n document: VDocumentFragment | null,\n error: ParseError,\n): void {\n if (document == null) {\n return\n }\n\n const index = sortedIndexBy(document.errors, error, byIndex)\n document.errors.splice(index, 0, error)\n}\n\n/**\n * Get `x.pos`.\n * @param x The object to get.\n * @returns `x.pos`.\n */\nfunction byIndex(x: ParseError): number {\n return x.index\n}\n", "/**\n * @author Toru Nagashima <https://github.com/mysticatea>\n * @copyright 2017 Toru Nagashima. All rights reserved.\n * See LICENSE file in root directory for full license.\n */\nimport type { ParserOptions } from \"../common/parser-options\"\nimport { isSFCFile } from \"../common/parser-options\"\nimport type {\n ESLintExpression,\n Reference,\n Token,\n VAttribute,\n VDirective,\n VDirectiveKey,\n VDocumentFragment,\n VElement,\n VExpressionContainer,\n VFilterSequenceExpression,\n VForExpression,\n VIdentifier,\n VLiteral,\n VNode,\n VOnExpression,\n VSlotScopeExpression,\n} from \"../ast\"\nimport { ParseError } from \"../ast\"\nimport { debug } from \"../common/debug\"\nimport type { LocationCalculatorForHtml } from \"../common/location-calculator\"\nimport type { ExpressionParseResult } from \"../script\"\nimport {\n parseExpression,\n parseVForExpression,\n parseVOnExpression,\n parseSlotScopeExpression,\n} from \"../script\"\nimport {\n createSimpleToken,\n insertComments,\n replaceTokens,\n} from \"../common/token-utils\"\nimport { getOwnerDocument } from \"../common/ast-utils\"\nimport { insertError } from \"../common/error-utils\"\n\nconst shorthandSign = /^[.:@#]/u\nconst shorthandNameMap = { \":\": \"bind\", \".\": \"bind\", \"@\": \"on\", \"#\": \"slot\" }\nconst invalidDynamicArgumentNextChar = /^[\\s\\r\\n=/>]$/u\n\n/**\n * Gets the tag name from the given node or token.\n * For SFC, it returns the value of `rawName` to be case sensitive.\n */\nfunction getTagName(\n startTagOrElement: { name: string; rawName: string },\n isSFC: boolean,\n) {\n return isSFC ? startTagOrElement.rawName : startTagOrElement.name\n}\n\n/**\n * Parse the given attribute name as a directive key.\n * @param node The identifier node to parse.\n * @param document The document to add parsing errors.\n * @returns The directive key node.\n */\nfunction parseDirectiveKeyStatically(\n node: VIdentifier,\n document: VDocumentFragment | null,\n): VDirectiveKey {\n const {\n name: text,\n rawName: rawText,\n range: [offset],\n loc: {\n start: { column, line },\n },\n } = node\n const directiveKey: VDirectiveKey = {\n type: \"VDirectiveKey\",\n range: node.range,\n loc: node.loc,\n parent: node.parent as any,\n name: null as any,\n argument: null as VIdentifier | null,\n modifiers: [] as VIdentifier[],\n }\n let i = 0\n\n function createIdentifier(\n start: number,\n end: number,\n name?: string,\n ): VIdentifier {\n return {\n type: \"VIdentifier\",\n parent: directiveKey,\n range: [offset + start, offset + end],\n loc: {\n start: { column: column + start, line },\n end: { column: column + end, line },\n },\n name: name || text.slice(start, end),\n rawName: rawText.slice(start, end),\n }\n }\n\n // Parse.\n if (shorthandSign.test(text)) {\n const sign = text[0] as \":\" | \".\" | \"@\" | \"#\"\n directiveKey.name = createIdentifier(0, 1, shorthandNameMap[sign])\n i = 1\n } else {\n const colon = text.indexOf(\":\")\n if (colon !== -1) {\n directiveKey.name = createIdentifier(0, colon)\n i = colon + 1\n }\n }\n\n if (directiveKey.name != null && text[i] === \"[\") {\n // Dynamic argument.\n const len = text.slice(i).lastIndexOf(\"]\")\n if (len !== -1) {\n directiveKey.argument = createIdentifier(i, i + len + 1)\n i = i + len + 1 + (text[i + len + 1] === \".\" ? 1 : 0)\n }\n }\n\n const modifiers = text\n .slice(i)\n .split(\".\")\n .map((modifierName) => {\n const modifier = createIdentifier(i, i + modifierName.length)\n if (modifierName === \"\" && i < text.length) {\n insertError(\n document,\n new ParseError(\n `Unexpected token '${text[i]}'`,\n undefined,\n offset + i,\n line,\n column + i,\n ),\n )\n }\n i += modifierName.length + 1\n return modifier\n })\n\n if (directiveKey.name == null) {\n directiveKey.name = modifiers.shift()!\n } else if (directiveKey.argument == null && modifiers[0].name !== \"\") {\n directiveKey.argument = modifiers.shift() || null\n }\n directiveKey.modifiers = modifiers.filter(isNotEmptyModifier)\n\n if (directiveKey.name.name === \"v-\") {\n insertError(\n document,\n new ParseError(\n `Unexpected token '${\n text[directiveKey.name.range[1] - offset]\n }'`,\n undefined,\n directiveKey.name.range[1],\n directiveKey.name.loc.end.line,\n directiveKey.name.loc.end.column,\n ),\n )\n }\n\n // v-bind.prop shorthand\n if (\n directiveKey.name.rawName === \".\" &&\n !directiveKey.modifiers.some(isPropModifier)\n ) {\n const pos =\n (directiveKey.argument || directiveKey.name).range[1] - offset\n const propModifier = createIdentifier(pos, pos, \"prop\")\n directiveKey.modifiers.unshift(propModifier)\n }\n\n return directiveKey\n}\n\n/**\n * Check whether a given identifier node is `prop` or not.\n * @param node The identifier node to check.\n */\nfunction isPropModifier(node: VIdentifier): boolean {\n return node.name === \"prop\"\n}\n\n/**\n * Check whether a given identifier node is empty or not.\n * @param node The identifier node to check.\n */\nfunction isNotEmptyModifier(node: VIdentifier): boolean {\n return node.name !== \"\"\n}\n\n/**\n * Parse the tokens of a given key node.\n * @param node The key node to parse.\n */\nfunction parseDirectiveKeyTokens(node: VDirectiveKey): Token[] {\n const { name, argument, modifiers } = node\n const shorthand = name.range[1] - name.range[0] === 1\n const tokens: Token[] = []\n\n if (shorthand) {\n tokens.push({\n type: \"Punctuator\",\n range: name.range,\n loc: name.loc,\n value: name.rawName,\n })\n } else {\n tokens.push({\n type: \"HTMLIdentifier\",\n range: name.range,\n loc: name.loc,\n value: name.rawName,\n })\n\n if (argument) {\n tokens.push({\n type: \"Punctuator\",\n range: [name.range[1], argument.range[0]],\n loc: { start: name.loc.end, end: argument.loc.start },\n value: \":\",\n })\n }\n }\n\n if (argument) {\n tokens.push({\n type: \"HTMLIdentifier\",\n range: argument.range,\n loc: argument.loc,\n value: (argument as VIdentifier).rawName,\n })\n }\n\n let lastNode = (argument as VIdentifier | null) || name\n for (const modifier of modifiers) {\n if (modifier.rawName === \"\") {\n continue\n }\n\n tokens.push(\n {\n type: \"Punctuator\",\n range: [lastNode.range[1], modifier.range[0]],\n loc: { start: lastNode.loc.end, end: modifier.loc.start },\n value: \".\",\n },\n {\n type: \"HTMLIdentifier\",\n range: modifier.range,\n loc: modifier.loc,\n value: modifier.rawName,\n },\n )\n lastNode = modifier\n }\n\n return tokens\n}\n\n/**\n * Convert `node.argument` property to a `VExpressionContainer` node if it's a dynamic argument.\n * @param text The source code text of the directive key node.\n * @param node The directive key node to convert.\n * @param document The belonging document node.\n * @param parserOptions The parser options to parse.\n * @param locationCalculator The location calculator to parse.\n */\nfunction convertDynamicArgument(\n node: VDirectiveKey,\n document: VDocumentFragment | null,\n parserOptions: ParserOptions,\n locationCalculator: LocationCalculatorForHtml,\n): void {\n const { argument } = node\n if (\n !(\n argument != null &&\n argument.type === \"VIdentifier\" &&\n argument.name.startsWith(\"[\") &&\n argument.name.endsWith(\"]\")\n )\n ) {\n return\n }\n\n const { rawName, range, loc } = argument\n try {\n const { comments, expression, references, tokens } = parseExpression(\n rawName.slice(1, -1),\n locationCalculator.getSubCalculatorAfter(range[0] + 1),\n parserOptions,\n )\n\n node.argument = {\n type: \"VExpressionContainer\",\n range,\n loc,\n parent: node,\n expression,\n references,\n }\n\n if (expression != null) {\n expression.parent = node.argument\n }\n\n // Add tokens of `[` and `]`.\n tokens.unshift(\n createSimpleToken(\n \"Punctuator\",\n range[0],\n range[0] + 1,\n \"[\",\n locationCalculator,\n ),\n )\n tokens.push(\n createSimpleToken(\n \"Punctuator\",\n range[1] - 1,\n range[1],\n \"]\",\n locationCalculator,\n ),\n )\n\n replaceTokens(document, node.argument, tokens)\n insertComments(document, comments)\n } catch (error) {\n debug(\"[template] Parse error: %s\", error)\n\n if (ParseError.isParseError(error)) {\n node.argument = {\n type: \"VExpressionContainer\",\n range,\n loc,\n parent: node,\n expression: null,\n references: [],\n }\n insertError(document, error)\n } else {\n throw error\n }\n }\n}\n\n/**\n * Parse the given attribute name as a directive key.\n * @param node The identifier node to parse.\n * @returns The directive key node.\n */\nfunction createDirectiveKey(\n node: VIdentifier,\n document: VDocumentFragment | null,\n parserOptions: ParserOptions,\n locationCalculator: LocationCalculatorForHtml,\n): VDirectiveKey {\n // Parse node and tokens.\n const directiveKey = parseDirectiveKeyStatically(node, document)\n const tokens = parseDirectiveKeyTokens(directiveKey)\n replaceTokens(document, directiveKey, tokens)\n\n // Drop `v-` prefix.\n if (directiveKey.name.name.startsWith(\"v-\")) {\n directiveKey.name.name = directiveKey.name.name.slice(2)\n }\n if (directiveKey.name.rawName.startsWith(\"v-\")) {\n directiveKey.name.rawName = directiveKey.name.rawName.slice(2)\n }\n\n // Parse dynamic argument.\n convertDynamicArgument(\n directiveKey,\n document,\n parserOptions,\n locationCalculator,\n )\n\n return directiveKey\n}\n\n/**\n * Parse the given attribute value as an expression.\n * @param code Whole source code text.\n * @param parserOptions The parser options to parse expressions.\n * @param globalLocationCalculator The location calculator to adjust the locations of nodes.\n * @param node The attribute node to replace. This function modifies this node directly.\n * @param tagName The name of this tag.\n * @param directiveKey The key of this directive.\n */\nfunction parseAttributeValue(\n code: string,\n parserOptions: ParserOptions,\n globalLocationCalculator: LocationCalculatorForHtml,\n node: VLiteral,\n tagName: string,\n directiveKey: VDirectiveKey,\n): ExpressionParseResult<\n | ESLintExpression\n | VFilterSequenceExpression\n | VForExpression\n | VOnExpression\n | VSlotScopeExpression\n> {\n const firstChar = code[node.range[0]]\n const quoted = firstChar === '\"' || firstChar === \"'\"\n const locationCalculator = globalLocationCalculator.getSubCalculatorAfter(\n node.range[0] + (quoted ? 1 : 0),\n )\n const directiveName = directiveKey.name.name\n\n let result: ExpressionParseResult<\n | ESLintExpression\n | VFilterSequenceExpression\n | VForExpression\n | VOnExpression\n | VSlotScopeExpression\n >\n if (quoted && node.value === \"\") {\n result = {\n expression: null,\n tokens: [],\n comments: [],\n variables: [],\n references: [],\n }\n } else if (directiveName === \"for\") {\n result = parseVForExpression(\n node.value,\n locationCalculator,\n parserOptions,\n )\n } else if (directiveName === \"on\" && directiveKey.argument != null) {\n result = parseVOnExpression(\n node.value,\n locationCalculator,\n parserOptions,\n )\n } else if (\n directiveName === \"slot\" ||\n directiveName === \"slot-scope\" ||\n (tagName === \"template\" && directiveName === \"scope\")\n ) {\n result = parseSlotScopeExpression(\n node.value,\n locationCalculator,\n parserOptions,\n )\n } else if (directiveName === \"bind\") {\n result = parseExpression(\n node.value,\n locationCalculator,\n parserOptions,\n { allowFilters: true },\n )\n } else {\n result = parseExpression(node.value, locationCalculator, parserOptions)\n }\n\n // Add the tokens of quotes.\n if (quoted) {\n result.tokens.unshift(\n createSimpleToken(\n \"Punctuator\",\n node.range[0],\n node.range[0] + 1,\n firstChar,\n globalLocationCalculator,\n ),\n )\n result.tokens.push(\n createSimpleToken(\n \"Punctuator\",\n node.range[1] - 1,\n node.range[1],\n firstChar,\n globalLocationCalculator,\n ),\n )\n }\n\n return result\n}\n\n/**\n * Resolve the variable of the given reference.\n * @param referene The reference to resolve.\n * @param element The belonging element of the reference.\n */\nfunction resolveReference(referene: Reference, element: VElement): void {\n let node: VNode | null = element\n\n // Find the variable of this reference.\n while (node != null && node.type === \"VElement\") {\n for (const variable of node.variables) {\n if (variable.id.name === referene.id.name) {\n referene.variable = variable\n variable.references.push(referene)\n return\n }\n }\n\n node = node.parent\n }\n}\n\n/**\n * Information of a mustache.\n */\nexport interface Mustache {\n value: string\n startToken: Token\n endToken: Token\n}\n\n/**\n * Replace the given attribute by a directive.\n * @param code Whole source code text.\n * @param parserOptions The parser options to parse expressions.\n * @param locationCalculator The location calculator to adjust the locations of nodes.\n * @param node The attribute node to replace. This function modifies this node directly.\n */\nexport function convertToDirective(\n code: string,\n parserOptions: ParserOptions,\n locationCalculator: LocationCalculatorForHtml,\n node: VAttribute,\n): void {\n debug(\n '[template] convert to directive: %s=\"%s\" %j',\n node.key.name,\n node.value && node.value.value,\n node.range,\n )\n\n const document = getOwnerDocument(node)\n const directive: VDirective = node as any\n directive.directive = true\n directive.key = createDirectiveKey(\n node.key,\n document,\n parserOptions,\n locationCalculator,\n )\n\n const { argument } = directive.key\n if (\n argument &&\n argument.type === \"VIdentifier\" &&\n argument.name.startsWith(\"[\")\n ) {\n const nextChar = code[argument.range[1]]\n if (nextChar == null || invalidDynamicArgumentNextChar.test(nextChar)) {\n const char =\n nextChar == null ? \"EOF\" : JSON.stringify(nextChar).slice(1, -1)\n insertError(\n document,\n new ParseError(\n `Dynamic argument cannot contain the '${char}' character.`,\n undefined,\n argument.range[1],\n argument.loc.end.line,\n argument.loc.end.column,\n ),\n )\n }\n }\n\n if (node.value == null) {\n return\n }\n\n try {\n const ret = parseAttributeValue(\n code,\n parserOptions,\n locationCalculator,\n node.value,\n getTagName(node.parent.parent, isSFCFile(parserOptions)),\n directive.key,\n )\n\n directive.value = {\n type: \"VExpressionContainer\",\n range: node.value.range,\n loc: node.value.loc,\n parent: directive,\n expression: ret.expression,\n references: ret.references,\n }\n if (ret.expression != null) {\n ret.expression.parent = directive.value\n }\n\n for (const variable of ret.variables) {\n node.parent.parent.variables.push(variable)\n }\n\n replaceTokens(document, node.value, ret.tokens)\n insertComments(document, ret.comments)\n } catch (err) {\n debug(\"[template] Parse error: %s\", err)\n\n if (ParseError.isParseError(err)) {\n directive.value = {\n type: \"VExpressionContainer\",\n range: node.value.range,\n loc: node.value.loc,\n parent: directive,\n expression: null,\n references: [],\n }\n insertError(document, err)\n } else {\n throw err\n }\n }\n}\n\n/**\n * Parse the content of the given mustache.\n * @param parserOptions The parser options to parse expressions.\n * @param globalLocationCalculator The location calculator to adjust the locations of nodes.\n * @param node The expression container node. This function modifies the `expression` and `references` properties of this node.\n * @param mustache The information of mustache to parse.\n */\nexport function processMustache(\n parserOptions: ParserOptions,\n globalLocationCalculator: LocationCalculatorForHtml,\n node: VExpressionContainer,\n mustache: Mustache,\n): void {\n const range: [number, number] = [\n mustache.startToken.range[1],\n mustache.endToken.range[0],\n ]\n debug(\"[template] convert mustache {{%s}} %j\", mustache.value, range)\n\n const document = getOwnerDocument(node)\n try {\n const locationCalculator =\n globalLocationCalculator.getSubCalculatorAfter(range[0])\n const ret = parseExpression(\n mustache.value,\n locationCalculator,\n parserOptions,\n { allowEmpty: true, allowFilters: true },\n )\n\n node.expression = ret.expression || null\n node.references = ret.references\n if (ret.expression != null) {\n ret.expression.parent = node\n }\n\n replaceTokens(document, { range }, ret.tokens)\n insertComments(document, ret.comments)\n } catch (err) {\n debug(\"[template] Parse error: %s\", err)\n\n if (ParseError.isParseError(err)) {\n insertError(document, err)\n } else {\n throw err\n }\n }\n}\n\n/**\n * Resolve all references of the given expression container.\n * @param container The expression container to resolve references.\n */\nexport function resolveReferences(container: VExpressionContainer): void {\n let element: VNode | null = container.parent\n\n // Get the belonging element.\n while (element != null && element.type !== \"VElement\") {\n element = element.parent\n }\n\n // Resolve.\n if (element != null) {\n for (const reference of container.references) {\n resolveReference(reference, element)\n }\n }\n}\n", "/**\n * @author Toru Nagashima <https://github.com/mysticatea>\n * @copyright 2017 Toru Nagashima. All rights reserved.\n * See LICENSE file in root directory for full license.\n */\nexport const SVG_ATTRIBUTE_NAME_MAP = new Map([\n [\"attributename\", \"attributeName\"],\n [\"attributetype\", \"attributeType\"],\n [\"basefrequency\", \"baseFrequency\"],\n [\"baseprofile\", \"baseProfile\"],\n [\"calcmode\", \"calcMode\"],\n [\"clippathunits\", \"clipPathUnits\"],\n [\"diffuseconstant\", \"diffuseConstant\"],\n [\"edgemode\", \"edgeMode\"],\n [\"filterunits\", \"filterUnits\"],\n [\"glyphref\", \"glyphRef\"],\n [\"gradienttransform\", \"gradientTransform\"],\n [\"gradientunits\", \"gradientUnits\"],\n [\"kernelmatrix\", \"kernelMatrix\"],\n [\"kernelunitlength\", \"kernelUnitLength\"],\n [\"keypoints\", \"keyPoints\"],\n [\"keysplines\", \"keySplines\"],\n [\"keytimes\", \"keyTimes\"],\n [\"lengthadjust\", \"lengthAdjust\"],\n [\"limitingconeangle\", \"limitingConeAngle\"],\n [\"markerheight\", \"markerHeight\"],\n [\"markerunits\", \"markerUnits\"],\n [\"markerwidth\", \"markerWidth\"],\n [\"maskcontentunits\", \"maskContentUnits\"],\n [\"maskunits\", \"maskUnits\"],\n [\"numoctaves\", \"numOctaves\"],\n [\"pathlength\", \"pathLength\"],\n [\"patterncontentunits\", \"patternContentUnits\"],\n [\"patterntransform\", \"patternTransform\"],\n [\"patternunits\", \"patternUnits\"],\n [\"pointsatx\", \"pointsAtX\"],\n [\"pointsaty\", \"pointsAtY\"],\n [\"pointsatz\", \"pointsAtZ\"],\n [\"preservealpha\", \"preserveAlpha\"],\n [\"preserveaspectratio\", \"preserveAspectRatio\"],\n [\"primitiveunits\", \"primitiveUnits\"],\n [\"refx\", \"refX\"],\n [\"refy\", \"refY\"],\n [\"repeatcount\", \"repeatCount\"],\n [\"repeatdur\", \"repeatDur\"],\n [\"requiredextensions\", \"requiredExtensions\"],\n [\"requiredfeatures\", \"requiredFeatures\"],\n [\"specularconstant\", \"specularConstant\"],\n [\"specularexponent\", \"specularExponent\"],\n [\"spreadmethod\", \"spreadMethod\"],\n [\"startoffset\", \"startOffset\"],\n [\"stddeviation\", \"stdDeviation\"],\n [\"stitchtiles\", \"stitchTiles\"],\n [\"surfacescale\", \"surfaceScale\"],\n [\"systemlanguage\", \"systemLanguage\"],\n [\"tablevalues\", \"tableValues\"],\n [\"targetx\", \"targetX\"],\n [\"targety\", \"targetY\"],\n [\"textlength\", \"textLength\"],\n [\"viewbox\", \"viewBox\"],\n [\"viewtarget\", \"viewTarget\"],\n [\"xchannelselector\", \"xChannelSelector\"],\n [\"ychannelselector\", \"yChannelSelector\"],\n [\"zoomandpan\", \"zoomAndPan\"],\n])\n\nexport const MATHML_ATTRIBUTE_NAME_MAP = new Map([\n [\"definitionurl\", \"definitionUrl\"]\n])\n", "/**\n * @author Toru Nagashima <https://github.com/mysticatea>\n * @copyright 2017 Toru Nagashima. All rights reserved.\n * See LICENSE file in root directory for full license.\n */\n\n/**\n * HTML tag names.\n */\nexport const HTML_TAGS = new Set([\n \"a\", \"abbr\", \"address\", \"area\", \"article\",\"aside\", \"audio\", \"b\", \"base\",\n \"bdi\", \"bdo\", \"blockquote\", \"body\", \"br\", \"button\", \"canvas\", \"caption\",\n \"cite\", \"code\", \"col\", \"colgroup\", \"data\", \"datalist\", \"dd\", \"del\",\n \"details\", \"dfn\", \"dialog\", \"div\", \"dl\", \"document\", \"dt\", \"em\", \"embed\",\n \"fieldset\", \"figcaption\", \"figure\", \"footer\", \"form\", \"h1\", \"h2\", \"h3\",\n \"h4\", \"h5\", \"h6\", \"head\", \"header\", \"hgroup\", \"hr\", \"html\", \"i\", \"iframe\",\n \"img\", \"input\", \"ins\", \"kbd\", \"label\", \"legend\", \"li\", \"link\", \"main\",\n \"map\", \"mark\", \"marquee\", \"menu\", \"meta\", \"meter\", \"nav\", \"noscript\",\n \"object\", \"ol\", \"optgroup\", \"option\", \"output\", \"p\", \"param\", \"picture\",\n \"pre\", \"progress\", \"q\", \"rp\", \"rt\", \"ruby\", \"s\", \"samp\", \"script\",\n \"section\", \"select\", \"slot\", \"small\", \"source\", \"span\", \"strong\", \"style\",\n \"sub\", \"summary\", \"sup\", \"table\", \"tbody\", \"td\", \"template\", \"textarea\",\n \"tfoot\", \"th\", \"thead\", \"time\", \"title\", \"tr\", \"track\", \"u\", \"ul\", \"var\",\n \"video\", \"wbr\"\n])\n\n/**\n * HTML tag names of void elements.\n */\nexport const HTML_VOID_ELEMENT_TAGS = new Set([\n \"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"link\", \"meta\",\n \"param\", \"source\", \"track\", \"wbr\",\n])\n\n/**\n * https://github.com/vuejs/vue/blob/e4da249ab8ef32a0b8156c840c9d2b9773090f8a/src/platforms/web/compiler/util.js#L12\n */\nexport const HTML_CAN_BE_LEFT_OPEN_TAGS = new Set([\n \"colgroup\", \"li\", \"options\", \"p\", \"td\", \"tfoot\", \"th\", \"thead\", \n \"tr\", \"source\",\n])\n\n/**\n * https://github.com/vuejs/vue/blob/e4da249ab8ef32a0b8156c840c9d2b9773090f8a/src/platforms/web/compiler/util.js#L18\n */\nexport const HTML_NON_FHRASING_TAGS = new Set([\n \"address\", \"article\", \"aside\", \"base\", \"blockquote\", \"body\", \"caption\", \n \"col\", \"colgroup\", \"dd\", \"details\", \"dialog\", \"div\", \"dl\", \"dt\", \"fieldset\", \n \"figcaption\", \"figure\", \"footer\", \"form\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \n \"h6\", \"head\", \"header\", \"hgroup\", \"hr\", \"html\", \"legend\", \"li\", \"menuitem\", \n \"meta\", \"optgroup\", \"option\", \"param\", \"rp\", \"rt\", \"source\", \"style\", \n \"summary\", \"tbody\", \"td\", \"tfoot\", \"th\", \"thead\", \"title\", \"tr\", \"track\",\n])\n\n/**\n * HTML tag names of RCDATA.\n */\nexport const HTML_RCDATA_TAGS = new Set([\n \"title\", \"textarea\",\n])\n\n/**\n * HTML tag names of RAWTEXT.\n */\nexport const HTML_RAWTEXT_TAGS = new Set([\n \"style\", \"xmp\", \"iframe\", \"noembed\", \"noframes\", \"noscript\", \"script\",\n])\n\n/**\n * SVG tag names.\n */\nexport const SVG_TAGS = new Set([\n \"a\", \"altGlyph\", \"altGlyphDef\", \"altGlyphItem\", \"animate\", \"animateColor\", \n \"animateMotion\", \"animateTransform\", \"animation\", \"audio\", \"canvas\", \n \"circle\", \"clipPath\", \"color-profile\", \"cursor\", \"defs\", \"desc\", \"discard\", \n \"ellipse\", \"feBlend\", \"feColorMatrix\", \"feComponentTransfer\", \"feComposite\", \n \"feConvolveMatrix\", \"feDiffuseLighting\", \"feDisplacementMap\", \n \"feDistantLight\", \"feDropShadow\", \"feFlood\", \"feFuncA\", \"feFuncB\", \n \"feFuncG\", \"feFuncR\", \"feGaussianBlur\", \"feImage\", \"feMerge\", \"feMergeNode\", \n \"feMorphology\", \"feOffset\", \"fePointLight\", \"feSpecularLighting\", \n \"feSpotLight\", \"feTile\", \"feTurbulence\", \"filter\", \"font\", \"font-face\", \n \"font-face-format\", \"font-face-name\", \"font-face-src\", \"font-face-uri\", \n \"foreignObject\", \"g\", \"glyph\", \"glyphRef\", \"handler\", \"hatch\", \"hatchpath\", \n \"hkern\", \"iframe\", \"image\", \"line\", \"linearGradient\", \"listener\", \"marker\", \n \"mask\", \"mesh\", \"meshgradient\", \"meshpatch\", \"meshrow\", \"metadata\", \n \"missing-glyph\", \"mpath\", \"path\", \"pattern\", \"polygon\", \"polyline\", \n \"prefetch\", \"radialGradient\", \"rect\", \"script\", \"set\", \"solidColor\", \n \"solidcolor\", \"stop\", \"style\", \"svg\", \"switch\", \"symbol\", \"tbreak\", \"text\", \n \"textArea\", \"textPath\", \"title\", \"tref\", \"tspan\", \"unknown\", \"use\", \"video\", \n \"view\", \"vkern\",\n])\n\n/**\n * The map from lowercase names to actual names in SVG.\n */\nexport const SVG_ELEMENT_NAME_MAP = new Map<string, string>()\nfor (const name of SVG_TAGS) {\n if (/[A-Z]/.test(name)) {\n SVG_ELEMENT_NAME_MAP.set(name.toLowerCase(), name)\n }\n}\n\n/**\n * MathML tag names.\n */\nexport const MATHML_TAGS = new Set([\n \"abs\", \"and\", \"annotation\", \"annotation-xml\", \"apply\", \"approx\", \"arccos\", \n \"arccosh\", \"arccot\", \"arccoth\", \"arccsc\", \"arccsch\", \"arcsec\", \"arcsech\", \n \"arcsin\", \"arcsinh\", \"arctan\", \"arctanh\", \"arg\", \"bind\", \"bvar\", \"card\", \n \"cartesianproduct\", \"cbytes\", \"ceiling\", \"cerror\", \"ci\", \"cn\", \"codomain\", \n \"complexes\", \"compose\", \"condition\", \"conjugate\", \"cos\", \"cosh\", \"cot\", \n \"coth\", \"cs\", \"csc\", \"csch\", \"csymbol\", \"curl\", \"declare\", \"degree\", \n \"determinant\", \"diff\", \"divergence\", \"divide\", \"domain\", \n \"domainofapplication\", \"emptyset\", \"encoding\", \"eq\", \"equivalent\", \n \"eulergamma\", \"exists\", \"exp\", \"exponentiale\", \"factorial\", \"factorof\", \n \"false\", \"floor\", \"fn\", \"forall\", \"function\", \"gcd\", \"geq\", \"grad\", \"gt\", \n \"ident\", \"image\", \"imaginary\", \"imaginaryi\", \"implies\", \"in\", \"infinity\", \n \"int\", \"integers\", \"intersect\", \"interval\", \"inverse\", \"lambda\", \n \"laplacian\", \"lcm\", \"leq\", \"limit\", \"list\", \"ln\", \"log\", \"logbase\", \n \"lowlimit\", \"lt\", \"m:apply\", \"m:mrow\", \"maction\", \"malign\", \"maligngroup\", \n \"malignmark\", \"malignscope\", \"math\", \"matrix\", \"matrixrow\", \"max\", \"mean\", \n \"median\", \"menclose\", \"merror\", \"mfenced\", \"mfrac\", \"mfraction\", \"mglyph\", \n \"mi\", \"mi\\\"\", \"min\", \"minus\", \"mlabeledtr\", \"mlongdiv\", \"mmultiscripts\", \n \"mn\", \"mo\", \"mode\", \"moment\", \"momentabout\", \"mover\", \"mpadded\", \"mphantom\", \n \"mprescripts\", \"mroot\", \"mrow\", \"ms\", \"mscarries\", \"mscarry\", \"msgroup\", \n \"msline\", \"mspace\", \"msqrt\", \"msrow\", \"mstack\", \"mstyle\", \"msub\", \"msubsup\", \n \"msup\", \"mtable\", \"mtd\", \"mtext\", \"mtr\", \"munder\", \"munderover\", \n \"naturalnumbers\", \"neq\", \"none\", \"not\", \"notanumber\", \"notin\", \n \"notprsubset\", \"notsubset\", \"or\", \"otherwise\", \"outerproduct\", \n \"partialdiff\", \"pi\", \"piece\", \"piecewice\", \"piecewise\", \"plus\", \"power\", \n \"primes\", \"product\", \"prsubset\", \"quotient\", \"rationals\", \"real\", \"reals\", \n \"reln\", \"rem\", \"root\", \"scalarproduct\", \"sdev\", \"sec\", \"sech\", \"select\", \n \"selector\", \"semantics\", \"sep\", \"set\", \"setdiff\", \"share\", \"sin\", \"sinh\", \n \"span\", \"subset\", \"sum\", \"tan\", \"tanh\", \"tendsto\", \"times\", \"transpose\", \n \"true\", \"union\", \"uplimit\", \"var\", \"variance\", \"vector\", \"vectorproduct\", \n \"xor\",\n])\n", "/**\n * @author Toru Nagashima <https://github.com/mysticatea>\n * @copyright 2017 Toru Nagashima. All rights reserved.\n * See LICENSE file in root directory for full license.\n */\nimport assert from \"assert\"\nimport last from \"lodash/last\"\nimport type {\n ErrorCode,\n HasLocation,\n Namespace,\n Token,\n VAttribute,\n} from \"../ast\"\nimport { ParseError } from \"../ast\"\nimport { debug } from \"../common/debug\"\nimport type { Tokenizer, TokenizerState, TokenType } from \"./tokenizer\"\n\nconst DUMMY_PARENT: any = Object.freeze({})\n\n/**\n * Concatenate token values.\n * @param text Concatenated text.\n * @param token The token to concatenate.\n */\nfunction concat(text: string, token: Token): string {\n return text + token.value\n}\n\n/**\n * The type of intermediate tokens.\n */\nexport type IntermediateToken = StartTag | EndTag | Text | Mustache\n\n/**\n * The type of start tags.\n */\nexport interface StartTag extends HasLocation {\n type: \"StartTag\"\n name: string\n rawName: string\n selfClosing: boolean\n attributes: VAttribute[]\n}\n\n/**\n * The type of end tags.\n */\nexport interface EndTag extends HasLocation {\n type: \"EndTag\"\n name: string\n}\n\n/**\n * The type of text chunks.\n */\nexport interface Text extends HasLocation {\n type: \"Text\"\n value: string\n}\n\n/**\n * The type of text chunks of an expression container.\n */\nexport interface Mustache extends HasLocation {\n type: \"Mustache\"\n value: string\n startToken: Token\n endToken: Token\n}\n\n/**\n * The class to create HTML tokens from ESTree-like tokens which are created by a Tokenizer.\n */\nexport class IntermediateTokenizer {\n private tokenizer: Tokenizer\n private currentToken: IntermediateToken | null\n private attribute: VAttribute | null\n private attributeNames: Set<string>\n private expressionStartToken: Token | null\n private expressionTokens: Token[]\n\n public readonly tokens: Token[]\n public readonly comments: Token[]\n\n /**\n * The source code text.\n */\n public get text(): string {\n return this.tokenizer.text\n }\n\n /**\n * The parse errors.\n */\n public get errors(): ParseError[] {\n return this.tokenizer.errors\n }\n\n /**\n * The current state.\n */\n public get state(): TokenizerState {\n return this.tokenizer.state\n }\n public set state(value: TokenizerState) {\n this.tokenizer.state = value\n }\n\n /**\n * The current namespace.\n */\n public get namespace(): Namespace {\n return this.tokenizer.namespace\n }\n public set namespace(value: Namespace) {\n this.tokenizer.namespace = value\n }\n\n /**\n * The current flag of expression enabled.\n */\n public get expressionEnabled(): boolean {\n return this.tokenizer.expressionEnabled\n }\n public set expressionEnabled(value: boolean) {\n this.tokenizer.expressionEnabled = value\n }\n\n /**\n * Initialize this intermediate tokenizer.\n * @param tokenizer The tokenizer.\n */\n public constructor(tokenizer: Tokenizer) {\n this.tokenizer = tokenizer\n this.currentToken = null\n this.attribute = null\n this.attributeNames = new Set<string>()\n this.expressionStartToken = null\n this.expressionTokens = []\n this.tokens = []\n this.comments = []\n }\n\n /**\n * Get the next intermediate token.\n * @returns The intermediate token or null.\n */\n public nextToken(): IntermediateToken | null {\n let token: Token | null = null\n let result: IntermediateToken | null = null\n\n while (result == null && (token = this.tokenizer.nextToken()) != null) {\n result = this[token.type as TokenType](token)\n }\n\n if (result == null && token == null && this.currentToken != null) {\n result = this.commit()\n }\n\n return result\n }\n\n /**\n * Commit the current token.\n */\n private commit(): IntermediateToken {\n assert(this.currentToken != null || this.expressionStartToken != null)\n\n let token = this.currentToken\n this.currentToken = null\n this.attribute = null\n\n if (this.expressionStartToken != null) {\n // VExpressionEnd was not found.\n // Concatenate the deferred tokens to the committed token.\n const start = this.expressionStartToken\n const end = last(this.expressionTokens) || start\n const value = this.expressionTokens.reduce(concat, start.value)\n this.expressionStartToken = null\n this.expressionTokens = []\n\n if (token == null) {\n token = {\n type: \"Text\",\n range: [start.range[0], end.range[1]],\n loc: { start: start.loc.start, end: end.loc.end },\n value,\n }\n } else if (token.type === \"Text\") {\n token.range[1] = end.range[1]\n token.loc.end = end.loc.end\n token.value += value\n } else {\n throw new Error(\"unreachable\")\n }\n }\n\n return token as IntermediateToken\n }\n\n /**\n * Report an invalid character error.\n * @param code The error code.\n */\n private reportParseError(token: HasLocation, code: ErrorCode): void {\n const error = ParseError.fromCode(\n code,\n token.range[0],\n token.loc.start.line,\n token.loc.start.column,\n )\n this.errors.push(error)\n\n debug(\"[html] syntax error:\", error.message)\n }\n\n /**\n * Process the given comment token.\n * @param token The comment token to process.\n */\n private processComment(token: Token): IntermediateToken | null {\n this.comments.push(token)\n\n if (this.currentToken != null && this.currentToken.type === \"Text\") {\n return this.commit()\n }\n return null\n }\n\n /**\n * Process the given text token.\n * @param token The text token to process.\n */\n private processText(token: Token): IntermediateToken | null {\n this.tokens.push(token)\n\n let result: IntermediateToken | null = null\n\n if (this.expressionStartToken != null) {\n // Defer this token until a VExpressionEnd token or a non-text token appear.\n const lastToken =\n last(this.expressionTokens) || this.expressionStartToken\n if (lastToken.range[1] === token.range[0]) {\n this.expressionTokens.push(token)\n return null\n }\n\n result = this.commit()\n } else if (this.currentToken != null) {\n // Concatenate this token to the current text token.\n if (\n this.currentToken.type === \"Text\" &&\n this.currentToken.range[1] === token.range[0]\n ) {\n this.currentToken.value += token.value\n this.currentToken.range[1] = token.range[1]\n this.currentToken.loc.end = token.loc.end\n return null\n }\n\n result = this.commit()\n }\n assert(this.currentToken == null)\n\n this.currentToken = {\n type: \"Text\",\n range: [token.range[0], token.range[1]],\n loc: { start: token.loc.start, end: token.loc.end },\n value: token.value,\n }\n\n return result\n }\n\n /**\n * Process a HTMLAssociation token.\n * @param token The token to process.\n */\n protected HTMLAssociation(token: Token): IntermediateToken | null {\n this.tokens.push(token)\n\n if (this.attribute != null) {\n this.attribute.range[1] = token.range[1]\n this.attribute.loc.end = token.loc.end\n\n if (\n this.currentToken == null ||\n this.currentToken.type !== \"StartTag\"\n ) {\n throw new Error(\"unreachable\")\n }\n this.currentToken.range[1] = token.range[1]\n this.currentToken.loc.end = token.loc.end\n }\n\n return null\n }\n\n /**\n * Process a HTMLBogusComment token.\n * @param token The token to process.\n */\n protected HTMLBogusComment(token: Token): IntermediateToken | null {\n return this.processComment(token)\n }\n\n /**\n * Process a HTMLCDataText token.\n * @param token The token to process.\n */\n protected HTMLCDataText(token: Token): IntermediateToken | null {\n return this.processText(token)\n }\n\n /**\n * Process a HTMLComment token.\n * @param token The token to process.\n */\n protected HTMLComment(token: Token): IntermediateToken | null {\n return this.processComment(token)\n }\n\n /**\n * Process a HTMLEndTagOpen token.\n * @param token The token to process.\n */\n protected HTMLEndTagOpen(token: Token): IntermediateToken | null {\n this.tokens.push(token)\n\n let result: IntermediateToken | null = null\n\n if (this.currentToken != null || this.expressionStartToken != null) {\n result = this.commit()\n }\n\n this.currentToken = {\n type: \"EndTag\",\n range: [token.range[0], token.range[1]],\n loc: { start: token.loc.start, end: token.loc.end },\n name: token.value,\n }\n\n return result\n }\n\n /**\n * Process a HTMLIdentifier token.\n * @param token The token to process.\n */\n protected HTMLIdentifier(token: Token): IntermediateToken | null {\n this.tokens.push(token)\n\n if (\n this.currentToken == null ||\n this.currentToken.type === \"Text\" ||\n this.currentToken.type === \"Mustache\"\n ) {\n throw new Error(\"unreachable\")\n }\n if (this.currentToken.type === \"EndTag\") {\n this.reportParseError(token, \"end-tag-with-attributes\")\n return null\n }\n if (this.attributeNames.has(token.value)) {\n this.reportParseError(token, \"duplicate-attribute\")\n }\n this.attributeNames.add(token.value)\n\n this.attribute = {\n type: \"VAttribute\",\n range: [token.range[0], token.range[1]],\n loc: { start: token.loc.start, end: token.loc.end },\n parent: DUMMY_PARENT,\n directive: false,\n key: {\n type: \"VIdentifier\",\n range: [token.range[0], token.range[1]],\n loc: { start: token.loc.start, end: token.loc.end },\n parent: DUMMY_PARENT,\n name: token.value,\n rawName: this.text.slice(token.range[0], token.range[1]),\n },\n value: null,\n }\n this.attribute.key.parent = this.attribute\n\n this.currentToken.range[1] = token.range[1]\n this.currentToken.loc.end = token.loc.end\n this.currentToken.attributes.push(this.attribute)\n\n return null\n }\n\n /**\n * Process a HTMLLiteral token.\n * @param token The token to process.\n */\n protected HTMLLiteral(token: Token): IntermediateToken | null {\n this.tokens.push(token)\n\n if (this.attribute != null) {\n this.attribute.range[1] = token.range[1]\n this.attribute.loc.end = token.loc.end\n this.attribute.value = {\n type: \"VLiteral\",\n range: [token.range[0], token.range[1]],\n loc: { start: token.loc.start, end: token.loc.end },\n parent: this.attribute,\n value: token.value,\n }\n\n if (\n this.currentToken == null ||\n this.currentToken.type !== \"StartTag\"\n ) {\n throw new Error(\"unreachable\")\n }\n this.currentToken.range[1] = token.range[1]\n this.currentToken.loc.end = token.loc.end\n }\n\n return null\n }\n\n /**\n * Process a HTMLRCDataText token.\n * @param token The token to process.\n */\n protected HTMLRCDataText(token: Token): IntermediateToken | null {\n return this.processText(token)\n }\n\n /**\n * Process a HTMLRawText token.\n * @param token The token to process.\n */\n protected HTMLRawText(token: Token): IntermediateToken | null {\n return this.processText(token)\n }\n\n /**\n * Process a HTMLSelfClosingTagClose token.\n * @param token The token to process.\n */\n protected HTMLSelfClosingTagClose(token: Token): IntermediateToken | null {\n this.tokens.push(token)\n\n if (this.currentToken == null || this.currentToken.type === \"Text\") {\n throw new Error(\"unreachable\")\n }\n\n if (this.currentToken.type === \"StartTag\") {\n this.currentToken.selfClosing = true\n } else {\n this.reportParseError(token, \"end-tag-with-trailing-solidus\")\n }\n\n this.currentToken.range[1] = token.range[1]\n this.currentToken.loc.end = token.loc.end\n\n return this.commit()\n }\n\n /**\n * Process a HTMLTagClose token.\n * @param token The token to process.\n */\n protected HTMLTagClose(token: Token): IntermediateToken | null {\n this.tokens.push(token)\n\n if (this.currentToken == null || this.currentToken.type === \"Text\") {\n throw new Error(\"unreachable\")\n }\n\n this.currentToken.range[1] = token.range[1]\n this.currentToken.loc.end = token.loc.end\n\n return this.commit()\n }\n\n /**\n * Process a HTMLTagOpen token.\n * @param token The token to process.\n */\n protected HTMLTagOpen(token: Token): IntermediateToken | null {\n this.tokens.push(token)\n\n let result: IntermediateToken | null = null\n\n if (this.currentToken != null || this.expressionStartToken != null) {\n result = this.commit()\n }\n\n this.currentToken = {\n type: \"StartTag\",\n range: [token.range[0], token.range[1]],\n loc: { start: token.loc.start, end: token.loc.end },\n name: token.value,\n rawName: this.text.slice(token.range[0] + 1, token.range[1]),\n selfClosing: false,\n attributes: [],\n }\n this.attribute = null\n this.attributeNames.clear()\n\n return result\n }\n\n /**\n * Process a HTMLText token.\n * @param token The token to process.\n */\n protected HTMLText(token: Token): IntermediateToken | null {\n return this.processText(token)\n }\n\n /**\n * Process a HTMLWhitespace token.\n * @param token The token to process.\n */\n protected HTMLWhitespace(token: Token): IntermediateToken | null {\n return this.processText(token)\n }\n\n /**\n * Process a VExpressionStart token.\n * @param token The token to process.\n */\n protected VExpressionStart(token: Token): IntermediateToken | null {\n if (this.expressionStartToken != null) {\n return this.processText(token)\n }\n const separated =\n this.currentToken != null &&\n this.currentToken.range[1] !== token.range[0]\n const result = separated ? this.commit() : null\n\n this.tokens.push(token)\n this.expressionStartToken = token\n\n return result\n }\n\n /**\n * Process a VExpressionEnd token.\n * @param token The token to process.\n */\n protected VExpressionEnd(token: Token): IntermediateToken | null {\n if (this.expressionStartToken == null) {\n return this.processText(token)\n }\n\n const start = this.expressionStartToken\n const end = last(this.expressionTokens) || start\n\n // If it's '{{}}', it's handled as a text.\n if (token.range[0] === start.range[1]) {\n this.tokens.pop()\n this.expressionStartToken = null\n const result = this.processText(start)\n this.processText(token)\n return result\n }\n\n // If invalid notation `</>` exists directly before this token, separate it.\n if (end.range[1] !== token.range[0]) {\n const result = this.commit()\n this.processText(token)\n return result\n }\n\n // Clear state.\n const value = this.expressionTokens.reduce(concat, \"\")\n this.tokens.push(token)\n this.expressionStartToken = null\n this.expressionTokens = []\n\n // Create token.\n const result = this.currentToken != null ? this.commit() : null\n this.currentToken = {\n type: \"Mustache\",\n range: [start.range[0], token.range[1]],\n loc: { start: start.loc.start, end: token.loc.end },\n value,\n startToken: start,\n endToken: token,\n }\n\n return result || this.commit()\n }\n}\n", "/**\n * @author Toru Nagashima <https://github.com/mysticatea>\n * @copyright 2017 Toru Nagashima. All rights reserved.\n * See LICENSE file in root directory for full license.\n */\nimport assert from \"assert\"\nimport last from \"lodash/last\"\nimport findLastIndex from \"lodash/findLastIndex\"\nimport type {\n ErrorCode,\n HasLocation,\n Namespace,\n Token,\n VAttribute,\n VDocumentFragment,\n VElement,\n VExpressionContainer,\n VLiteral,\n} from \"../ast\"\nimport { NS, ParseError } from \"../ast\"\nimport { debug } from \"../common/debug\"\nimport { LocationCalculatorForHtml } from \"../common/location-calculator\"\nimport {\n convertToDirective,\n processMustache,\n resolveReferences,\n} from \"../template\"\nimport {\n MATHML_ATTRIBUTE_NAME_MAP,\n SVG_ATTRIBUTE_NAME_MAP,\n} from \"./util/attribute-names\"\nimport {\n HTML_CAN_BE_LEFT_OPEN_TAGS,\n HTML_NON_FHRASING_TAGS,\n HTML_RAWTEXT_TAGS,\n HTML_RCDATA_TAGS,\n HTML_VOID_ELEMENT_TAGS,\n SVG_ELEMENT_NAME_MAP,\n} from \"./util/tag-names\"\nimport type {\n IntermediateToken,\n EndTag,\n Mustache,\n StartTag,\n Text,\n} from \"./intermediate-tokenizer\"\nimport { IntermediateTokenizer } from \"./intermediate-tokenizer\"\nimport type { Tokenizer } from \"./tokenizer\"\nimport type { ParserOptions } from \"../common/parser-options\"\nimport {\n isSFCFile,\n getScriptParser,\n getParserLangFromSFC,\n} from \"../common/parser-options\"\nimport sortedIndexBy from \"lodash/sortedIndexBy\"\nimport sortedLastIndexBy from \"lodash/sortedLastIndexBy\"\nimport type {\n CustomTemplateTokenizer,\n CustomTemplateTokenizerConstructor,\n} from \"./custom-tokenizer\"\n\nconst DIRECTIVE_NAME = /^(?:v-|[.:@#]).*[^.:@#]$/u\nconst DT_DD = /^d[dt]$/u\nconst DUMMY_PARENT: any = Object.freeze({})\n\n/**\n * Gets the tag name from the given node or token.\n * For SFC, it returns the value of `rawName` to be case sensitive.\n */\nfunction getTagName(\n startTagOrElement: { name: string; rawName: string },\n isSFC: boolean,\n) {\n return isSFC ? startTagOrElement.rawName : startTagOrElement.name\n}\n\n/**\n * Check whether the element is a MathML text integration point or not.\n * @see https://html.spec.whatwg.org/multipage/parsing.html#tree-construction-dispatcher\n * @param element The current element.\n * @param isSFC For SFC, give `true`.\n * @returns `true` if the element is a MathML text integration point.\n */\nfunction isMathMLIntegrationPoint(element: VElement, isSFC: boolean): boolean {\n if (element.namespace === NS.MathML) {\n const name = getTagName(element, isSFC)\n return (\n name === \"mi\" ||\n name === \"mo\" ||\n name === \"mn\" ||\n name === \"ms\" ||\n name === \"mtext\"\n )\n }\n return false\n}\n\n/**\n * Check whether the element is a HTML integration point or not.\n * @see https://html.spec.whatwg.org/multipage/parsing.html#tree-construction-dispatcher\n * @param element The current element.\n * @param isSFC For SFC, give `true`.\n * @returns `true` if the element is a HTML integration point.\n */\nfunction isHTMLIntegrationPoint(element: VElement, isSFC: boolean): boolean {\n if (element.namespace === NS.MathML) {\n return (\n getTagName(element, isSFC) === \"annotation-xml\" &&\n element.startTag.attributes.some(\n (a) =>\n a.directive === false &&\n a.key.name === \"encoding\" &&\n a.value != null &&\n (a.value.value === \"text/html\" ||\n a.value.value === \"application/xhtml+xml\"),\n )\n )\n }\n if (element.namespace === NS.SVG) {\n const name = getTagName(element, isSFC)\n return name === \"foreignObject\" || name === \"desc\" || name === \"title\"\n }\n\n return false\n}\n\n/**\n * Adjust element names by the current namespace.\n * @param name The lowercase element name to adjust.\n * @param namespace The current namespace.\n * @returns The adjusted element name.\n */\nfunction adjustElementName(name: string, namespace: Namespace): string {\n if (namespace === NS.SVG) {\n return SVG_ELEMENT_NAME_MAP.get(name) || name\n }\n return name\n}\n\n/**\n * Adjust attribute names by the current namespace.\n * @param name The lowercase attribute name to adjust.\n * @param namespace The current namespace.\n * @returns The adjusted attribute name.\n */\nfunction adjustAttributeName(name: string, namespace: Namespace): string {\n if (namespace === NS.SVG) {\n return SVG_ATTRIBUTE_NAME_MAP.get(name) || name\n }\n if (namespace === NS.MathML) {\n return MATHML_ATTRIBUTE_NAME_MAP.get(name) || name\n }\n return name\n}\n\n/**\n * Set the location of the last child node to the end location of the given node.\n * @param node The node to commit the end location.\n */\nfunction propagateEndLocation(node: VDocumentFragment | VElement): void {\n const lastChild =\n (node.type === \"VElement\" ? node.endTag : null) || last(node.children)\n if (lastChild != null) {\n node.range[1] = lastChild.range[1]\n node.loc.end = lastChild.loc.end\n }\n}\n\n/**\n * The parser of HTML.\n * This is not following to the HTML spec completely because Vue.js template spec is pretty different to HTML.\n */\nexport class Parser {\n private tokenizer: IntermediateTokenizer | CustomTemplateTokenizer\n private locationCalculator: LocationCalculatorForHtml\n private baseParserOptions: ParserOptions\n private isSFC: boolean\n private document: VDocumentFragment\n private elementStack: VElement[]\n private vPreElement: VElement | null\n private postProcessesForScript: ((parserOptions: ParserOptions) => void)[] =\n []\n\n /**\n * The source code text.\n */\n private get text(): string {\n return this.tokenizer.text\n }\n\n /**\n * The tokens.\n */\n private get tokens(): Token[] {\n return this.tokenizer.tokens\n }\n\n /**\n * The comments.\n */\n private get comments(): Token[] {\n return this.tokenizer.comments\n }\n\n /**\n * The syntax errors which are found in this parsing.\n */\n private get errors(): ParseError[] {\n return this.tokenizer.errors\n }\n\n /**\n * The current namespace.\n */\n private get namespace(): Namespace {\n return this.tokenizer.namespace\n }\n private set namespace(value: Namespace) {\n this.tokenizer.namespace = value\n }\n\n /**\n * The current flag of expression enabled.\n */\n private get expressionEnabled(): boolean {\n return this.tokenizer.expressionEnabled\n }\n private set expressionEnabled(value: boolean) {\n this.tokenizer.expressionEnabled = value\n }\n\n /**\n * Get the current node.\n */\n private get currentNode(): VDocumentFragment | VElement {\n return last(this.elementStack) || this.document\n }\n\n /**\n * Check if the current location is in a v-pre element.\n */\n private get isInVPreElement(): boolean {\n return this.vPreElement != null\n }\n\n /**\n * Initialize this parser.\n * @param tokenizer The tokenizer to parse.\n * @param parserOptions The parser options to parse inline expressions.\n */\n public constructor(tokenizer: Tokenizer, parserOptions: ParserOptions) {\n this.tokenizer = new IntermediateTokenizer(tokenizer)\n this.locationCalculator = new LocationCalculatorForHtml(\n tokenizer.gaps,\n tokenizer.lineTerminators,\n )\n this.baseParserOptions = parserOptions\n this.isSFC = isSFCFile(parserOptions)\n this.document = {\n type: \"VDocumentFragment\",\n range: [0, 0],\n loc: {\n start: { line: 1, column: 0 },\n end: { line: 1, column: 0 },\n },\n parent: null,\n children: [],\n tokens: this.tokens,\n comments: this.comments,\n errors: this.errors,\n }\n this.elementStack = []\n this.vPreElement = null\n\n this.postProcessesForScript = []\n }\n\n /**\n * Parse the HTML which was given in this constructor.\n * @returns The result of parsing.\n */\n public parse(): VDocumentFragment {\n let token: IntermediateToken | null = null\n while ((token = this.tokenizer.nextToken()) != null) {\n ;(this as any)[token.type](token)\n }\n\n this.popElementStackUntil(0)\n propagateEndLocation(this.document)\n\n const doc = this.document\n\n const parserOptions = {\n ...this.baseParserOptions,\n parser: getScriptParser(\n this.baseParserOptions.parser,\n function* () {\n yield \"<template>\"\n yield getParserLangFromSFC(doc)\n },\n ),\n }\n for (const proc of this.postProcessesForScript) {\n proc(parserOptions)\n }\n this.postProcessesForScript = []\n\n return doc\n }\n\n /**\n * Report an invalid character error.\n * @param code The error code.\n */\n private reportParseError(token: HasLocation, code: ErrorCode): void {\n const error = ParseError.fromCode(\n code,\n token.range[0],\n token.loc.start.line,\n token.loc.start.column,\n )\n this.errors.push(error)\n\n debug(\"[html] syntax error:\", error.message)\n }\n\n /**\n * Pop an element from the current element stack.\n */\n private popElementStack(): void {\n assert(this.elementStack.length >= 1)\n\n const element = this.elementStack.pop()!\n propagateEndLocation(element)\n\n // Update the current namespace.\n const current = this.currentNode\n this.namespace =\n current.type === \"VElement\" ? current.namespace : NS.HTML\n\n // Update v-pre state.\n if (this.vPreElement === element) {\n this.vPreElement = null\n this.expressionEnabled = true\n }\n\n // Update expression flag.\n if (this.elementStack.length === 0) {\n this.expressionEnabled = false\n }\n }\n\n /**\n * Pop elements from the current element stack.\n * @param index The index of the element you want to pop.\n */\n private popElementStackUntil(index: number): void {\n while (this.elementStack.length > index) {\n this.popElementStack()\n }\n }\n\n /**\n * Gets the tag name from the given node or token.\n * For SFC, it returns the value of `rawName` to be case sensitive.\n */\n private getTagName(startTagOrElement: { name: string; rawName: string }) {\n return getTagName(startTagOrElement, this.isSFC)\n }\n\n /**\n * Detect the namespace of the new element.\n * @param token The StartTag token to detect.\n * @returns The namespace of the new element.\n */\n //eslint-disable-next-line complexity\n private detectNamespace(token: StartTag): Namespace {\n const name = this.getTagName(token)\n let ns = this.namespace\n\n if (ns === NS.MathML || ns === NS.SVG) {\n const element = this.currentNode\n if (element.type === \"VElement\") {\n if (\n element.namespace === NS.MathML &&\n this.getTagName(element) === \"annotation-xml\" &&\n name === \"svg\"\n ) {\n return NS.SVG\n }\n if (\n isHTMLIntegrationPoint(element, this.isSFC) ||\n (isMathMLIntegrationPoint(element, this.isSFC) &&\n name !== \"mglyph\" &&\n name !== \"malignmark\")\n ) {\n ns = NS.HTML\n }\n }\n }\n\n if (ns === NS.HTML) {\n if (name === \"svg\") {\n return NS.SVG\n }\n if (name === \"math\") {\n return NS.MathML\n }\n }\n\n if (name === \"template\") {\n const xmlns = token.attributes.find((a) => a.key.name === \"xmlns\")\n const value = xmlns && xmlns.value && xmlns.value.value\n\n if (value === NS.HTML || value === NS.MathML || value === NS.SVG) {\n return value\n }\n }\n\n return ns\n }\n\n /**\n * Close the current element if necessary.\n * @param token The start tag to check.\n */\n private closeCurrentElementIfNecessary(token: StartTag): void {\n const element = this.currentNode\n if (element.type !== \"VElement\") {\n return\n }\n const name = this.getTagName(token)\n const elementName = this.getTagName(element)\n\n if (elementName === \"p\" && HTML_NON_FHRASING_TAGS.has(name)) {\n this.popElementStack()\n }\n if (elementName === name && HTML_CAN_BE_LEFT_OPEN_TAGS.has(name)) {\n this.popElementStack()\n }\n if (DT_DD.test(elementName) && DT_DD.test(name)) {\n this.popElementStack()\n }\n }\n\n /**\n * Adjust and validate the given attribute node.\n * @param node The attribute node to handle.\n * @param namespace The current namespace.\n */\n private processAttribute(node: VAttribute, namespace: Namespace): void {\n const tagName = this.getTagName(node.parent.parent)\n const attrName = this.getTagName(node.key)\n\n if (\n (this.expressionEnabled ||\n (attrName === \"v-pre\" && !this.isInVPreElement)) &&\n (DIRECTIVE_NAME.test(attrName) ||\n attrName === \"slot-scope\" ||\n (tagName === \"template\" && attrName === \"scope\"))\n ) {\n this.postProcessesForScript.push((parserOptions) => {\n convertToDirective(\n this.text,\n parserOptions,\n this.locationCalculator,\n node,\n )\n })\n return\n }\n\n node.key.name = adjustAttributeName(node.key.name, namespace)\n const key = this.getTagName(node.key)\n const value = node.value && node.value.value\n\n if (key === \"xmlns\" && value !== namespace) {\n this.reportParseError(node, \"x-invalid-namespace\")\n } else if (key === \"xmlns:xlink\" && value !== NS.XLink) {\n this.reportParseError(node, \"x-invalid-namespace\")\n }\n }\n\n /**\n * Process the given template text token with a configured template tokenizer, based on language.\n * @param token The template text token to process.\n * @param templateTokenizerOption The template tokenizer option.\n */\n private processTemplateText(\n token: Text,\n templateTokenizerOption: string | CustomTemplateTokenizerConstructor,\n ): void {\n const TemplateTokenizer: CustomTemplateTokenizerConstructor =\n typeof templateTokenizerOption === \"function\"\n ? templateTokenizerOption\n : // eslint-disable-next-line @typescript-eslint/no-require-imports\n require(templateTokenizerOption)\n const templateTokenizer = new TemplateTokenizer(\n token.value,\n this.text,\n {\n startingLine: token.loc.start.line,\n startingColumn: token.loc.start.column,\n },\n )\n\n // override this.tokenizer to forward expressionEnabled and state changes\n const rootTokenizer = this.tokenizer\n this.tokenizer = templateTokenizer\n\n let templateToken: IntermediateToken | null = null\n while ((templateToken = templateTokenizer.nextToken()) != null) {\n ;(this as any)[templateToken.type](templateToken)\n }\n\n this.tokenizer = rootTokenizer\n\n const index = sortedIndexBy(\n this.tokenizer.tokens,\n token,\n (x) => x.range[0],\n )\n const count =\n sortedLastIndexBy(this.tokenizer.tokens, token, (x) => x.range[1]) -\n index\n this.tokenizer.tokens.splice(index, count, ...templateTokenizer.tokens)\n this.tokenizer.comments.push(...templateTokenizer.comments)\n this.tokenizer.errors.push(...templateTokenizer.errors)\n }\n\n /**\n * Handle the start tag token.\n * @param token The token to handle.\n */\n //eslint-disable-next-line complexity\n protected StartTag(token: StartTag): void {\n debug(\"[html] StartTag %j\", token)\n\n this.closeCurrentElementIfNecessary(token)\n\n const parent = this.currentNode\n const namespace = this.detectNamespace(token)\n const element: VElement = {\n type: \"VElement\",\n range: [token.range[0], token.range[1]],\n loc: { start: token.loc.start, end: token.loc.end },\n parent,\n name: adjustElementName(token.name, namespace),\n rawName: token.rawName,\n namespace,\n startTag: {\n type: \"VStartTag\",\n range: token.range,\n loc: token.loc,\n parent: DUMMY_PARENT,\n selfClosing: token.selfClosing,\n attributes: token.attributes,\n },\n children: [],\n endTag: null,\n variables: [],\n }\n const hasVPre =\n !this.isInVPreElement &&\n token.attributes.some((a) => this.getTagName(a.key) === \"v-pre\")\n\n // Disable expression if v-pre\n if (hasVPre) {\n this.expressionEnabled = false\n }\n\n // Setup relations.\n parent.children.push(element)\n element.startTag.parent = element\n for (const attribute of token.attributes) {\n attribute.parent = element.startTag\n this.processAttribute(attribute, namespace)\n }\n\n // Resolve references.\n this.postProcessesForScript.push(() => {\n for (const attribute of element.startTag.attributes) {\n if (attribute.directive) {\n if (\n attribute.key.argument != null &&\n attribute.key.argument.type === \"VExpressionContainer\"\n ) {\n resolveReferences(attribute.key.argument)\n }\n if (attribute.value != null) {\n resolveReferences(attribute.value)\n }\n }\n }\n })\n\n // Check whether the self-closing is valid.\n const isVoid =\n namespace === NS.HTML &&\n HTML_VOID_ELEMENT_TAGS.has(this.getTagName(element))\n if (token.selfClosing && !isVoid && namespace === NS.HTML) {\n this.reportParseError(\n token,\n \"non-void-html-element-start-tag-with-trailing-solidus\",\n )\n }\n\n // Vue.js supports self-closing elements even if it's not one of void elements.\n if (token.selfClosing || isVoid) {\n this.expressionEnabled = !this.isInVPreElement\n return\n }\n\n // Push to stack.\n this.elementStack.push(element)\n if (hasVPre) {\n assert(this.vPreElement === null)\n this.vPreElement = element\n }\n this.namespace = namespace\n\n // Update the content type of this element.\n if (namespace === NS.HTML) {\n const elementName = this.getTagName(element)\n if (element.parent.type === \"VDocumentFragment\") {\n const langAttr = element.startTag.attributes.find(\n (a) => !a.directive && a.key.name === \"lang\",\n ) as VAttribute | undefined\n const lang = langAttr?.value?.value\n\n if (elementName === \"template\") {\n this.expressionEnabled = true\n if (lang && lang !== \"html\") {\n // It is not an HTML template.\n this.tokenizer.state = \"RAWTEXT\"\n this.expressionEnabled = false\n }\n } else if (this.isSFC) {\n // Element is Custom Block. e.g. <i18n>\n // Referred to the Vue parser. See https://github.com/vuejs/vue-next/blob/cbaa3805064cb581fc2007cf63774c91d39844fe/packages/compiler-sfc/src/parse.ts#L127\n if (!lang || lang !== \"html\") {\n // Custom Block is not HTML.\n this.tokenizer.state = \"RAWTEXT\"\n }\n } else {\n if (HTML_RCDATA_TAGS.has(elementName)) {\n this.tokenizer.state = \"RCDATA\"\n }\n if (HTML_RAWTEXT_TAGS.has(elementName)) {\n this.tokenizer.state = \"RAWTEXT\"\n }\n }\n } else {\n if (HTML_RCDATA_TAGS.has(elementName)) {\n this.tokenizer.state = \"RCDATA\"\n }\n if (HTML_RAWTEXT_TAGS.has(elementName)) {\n this.tokenizer.state = \"RAWTEXT\"\n }\n }\n }\n }\n\n /**\n * Handle the end tag token.\n * @param token The token to handle.\n */\n protected EndTag(token: EndTag): void {\n debug(\"[html] EndTag %j\", token)\n\n const i = findLastIndex(\n this.elementStack,\n (el) => el.name.toLowerCase() === token.name,\n )\n if (i === -1) {\n this.reportParseError(token, \"x-invalid-end-tag\")\n return\n }\n\n const element = this.elementStack[i]\n element.endTag = {\n type: \"VEndTag\",\n range: token.range,\n loc: token.loc,\n parent: element,\n }\n\n this.popElementStackUntil(i)\n }\n\n /**\n * Handle the text token.\n * @param token The token to handle.\n */\n protected Text(token: Text): void {\n debug(\"[html] Text %j\", token)\n const parent = this.currentNode\n if (\n token.value &&\n parent.type === \"VElement\" &&\n parent.name === \"template\" &&\n parent.parent.type === \"VDocumentFragment\"\n ) {\n const langAttribute = parent.startTag.attributes.find(\n (a) => a.key.name === \"lang\",\n )\n const lang = (langAttribute?.value as VLiteral)?.value\n if (lang && lang !== \"html\") {\n const templateTokenizerOption =\n this.baseParserOptions.templateTokenizer?.[lang]\n if (templateTokenizerOption) {\n this.processTemplateText(token, templateTokenizerOption)\n return\n }\n }\n }\n parent.children.push({\n type: \"VText\",\n range: token.range,\n loc: token.loc,\n parent,\n value: token.value,\n })\n }\n\n /**\n * Handle the text token.\n * @param token The token to handle.\n */\n protected Mustache(token: Mustache): void {\n debug(\"[html] Mustache %j\", token)\n\n const parent = this.currentNode\n const container: VExpressionContainer = {\n type: \"VExpressionContainer\",\n range: token.range,\n loc: token.loc,\n parent,\n expression: null,\n references: [],\n }\n // Set relationship.\n parent.children.push(container)\n\n this.postProcessesForScript.push((parserOptions) => {\n processMustache(\n parserOptions,\n this.locationCalculator,\n container,\n token,\n )\n // Resolve references.\n resolveReferences(container)\n })\n }\n}\n", "/**\n * @author Toru Nagashima <https://github.com/mysticatea>\n * @copyright 2017 Toru Nagashima. All rights reserved.\n * See LICENSE file in root directory for full license.\n */\n\n/**\n * Code mapping of HTML numeric entities.\n */\nexport const alternativeCR = new Map(\n [[128, 8364], [130, 8218], [131, 402], [132, 8222], [133, 8230], [134, 8224], [135, 8225], [136, 710], [137, 8240], [138, 352], [139, 8249], [140, 338], [142, 381], [145, 8216], [146, 8217], [147, 8220], [148, 8221], [149, 8226], [150, 8211], [151, 8212], [152, 732], [153, 8482], [154, 353], [155, 8250], [156, 339], [158, 382], [159, 376]]\n)\n", "/**\n * @author Toru Nagashima <https://github.com/mysticatea>\n * @copyright 2017 Toru Nagashima. All rights reserved.\n * See LICENSE file in root directory for full license.\n */\n\n/**\n * HTML entities which are separated by their length.\n */\nexport const entitySets: {\n length: number,\n entities: {\n [name: string]: number[] | undefined\n }\n}[] = [{\"length\":32,\"entities\":{\"CounterClockwiseContourIntegral;\":[8755]}},{\"length\":25,\"entities\":{\"ClockwiseContourIntegral;\":[8754],\"DoubleLongLeftRightArrow;\":[10234]}},{\"length\":24,\"entities\":{\"NotNestedGreaterGreater;\":[10914,824]}},{\"length\":23,\"entities\":{\"DiacriticalDoubleAcute;\":[733],\"NotSquareSupersetEqual;\":[8931]}},{\"length\":22,\"entities\":{\"CloseCurlyDoubleQuote;\":[8221],\"DoubleContourIntegral;\":[8751],\"FilledVerySmallSquare;\":[9642],\"NegativeVeryThinSpace;\":[8203],\"NotPrecedesSlantEqual;\":[8928],\"NotRightTriangleEqual;\":[8941],\"NotSucceedsSlantEqual;\":[8929]}},{\"length\":21,\"entities\":{\"CapitalDifferentialD;\":[8517],\"DoubleLeftRightArrow;\":[8660],\"DoubleLongRightArrow;\":[10233],\"EmptyVerySmallSquare;\":[9643],\"NestedGreaterGreater;\":[8811],\"NotDoubleVerticalBar;\":[8742],\"NotGreaterSlantEqual;\":[10878,824],\"NotLeftTriangleEqual;\":[8940],\"NotSquareSubsetEqual;\":[8930],\"OpenCurlyDoubleQuote;\":[8220],\"ReverseUpEquilibrium;\":[10607]}},{\"length\":20,\"entities\":{\"DoubleLongLeftArrow;\":[10232],\"DownLeftRightVector;\":[10576],\"LeftArrowRightArrow;\":[8646],\"NegativeMediumSpace;\":[8203],\"NotGreaterFullEqual;\":[8807,824],\"NotRightTriangleBar;\":[10704,824],\"RightArrowLeftArrow;\":[8644],\"SquareSupersetEqual;\":[8850],\"leftrightsquigarrow;\":[8621]}},{\"length\":19,\"entities\":{\"DownRightTeeVector;\":[10591],\"DownRightVectorBar;\":[10583],\"LongLeftRightArrow;\":[10231],\"Longleftrightarrow;\":[10234],\"NegativeThickSpace;\":[8203],\"NotLeftTriangleBar;\":[10703,824],\"PrecedesSlantEqual;\":[8828],\"ReverseEquilibrium;\":[8651],\"RightDoubleBracket;\":[10215],\"RightDownTeeVector;\":[10589],\"RightDownVectorBar;\":[10581],\"RightTriangleEqual;\":[8885],\"SquareIntersection;\":[8851],\"SucceedsSlantEqual;\":[8829],\"blacktriangleright;\":[9656],\"longleftrightarrow;\":[10231]}},{\"length\":18,\"entities\":{\"DoubleUpDownArrow;\":[8661],\"DoubleVerticalBar;\":[8741],\"DownLeftTeeVector;\":[10590],\"DownLeftVectorBar;\":[10582],\"FilledSmallSquare;\":[9724],\"GreaterSlantEqual;\":[10878],\"LeftDoubleBracket;\":[10214],\"LeftDownTeeVector;\":[10593],\"LeftDownVectorBar;\":[10585],\"LeftTriangleEqual;\":[8884],\"NegativeThinSpace;\":[8203],\"NotGreaterGreater;\":[8811,824],\"NotLessSlantEqual;\":[10877,824],\"NotNestedLessLess;\":[10913,824],\"NotReverseElement;\":[8716],\"NotSquareSuperset;\":[8848,824],\"NotTildeFullEqual;\":[8775],\"RightAngleBracket;\":[10217],\"RightUpDownVector;\":[10575],\"SquareSubsetEqual;\":[8849],\"VerticalSeparator;\":[10072],\"blacktriangledown;\":[9662],\"blacktriangleleft;\":[9666],\"leftrightharpoons;\":[8651],\"rightleftharpoons;\":[8652],\"twoheadrightarrow;\":[8608]}},{\"length\":17,\"entities\":{\"DiacriticalAcute;\":[180],\"DiacriticalGrave;\":[96],\"DiacriticalTilde;\":[732],\"DoubleRightArrow;\":[8658],\"DownArrowUpArrow;\":[8693],\"EmptySmallSquare;\":[9723],\"GreaterEqualLess;\":[8923],\"GreaterFullEqual;\":[8807],\"LeftAngleBracket;\":[10216],\"LeftUpDownVector;\":[10577],\"LessEqualGreater;\":[8922],\"NonBreakingSpace;\":[160],\"NotPrecedesEqual;\":[10927,824],\"NotRightTriangle;\":[8939],\"NotSucceedsEqual;\":[10928,824],\"NotSucceedsTilde;\":[8831,824],\"NotSupersetEqual;\":[8841],\"RightTriangleBar;\":[10704],\"RightUpTeeVector;\":[10588],\"RightUpVectorBar;\":[10580],\"UnderParenthesis;\":[9181],\"UpArrowDownArrow;\":[8645],\"circlearrowright;\":[8635],\"downharpoonright;\":[8642],\"ntrianglerighteq;\":[8941],\"rightharpoondown;\":[8641],\"rightrightarrows;\":[8649],\"twoheadleftarrow;\":[8606],\"vartriangleright;\":[8883]}},{\"length\":16,\"entities\":{\"CloseCurlyQuote;\":[8217],\"ContourIntegral;\":[8750],\"DoubleDownArrow;\":[8659],\"DoubleLeftArrow;\":[8656],\"DownRightVector;\":[8641],\"LeftRightVector;\":[10574],\"LeftTriangleBar;\":[10703],\"LeftUpTeeVector;\":[10592],\"LeftUpVectorBar;\":[10584],\"LowerRightArrow;\":[8600],\"NotGreaterEqual;\":[8817],\"NotGreaterTilde;\":[8821],\"NotHumpDownHump;\":[8782,824],\"NotLeftTriangle;\":[8938],\"NotSquareSubset;\":[8847,824],\"OverParenthesis;\":[9180],\"RightDownVector;\":[8642],\"ShortRightArrow;\":[8594],\"UpperRightArrow;\":[8599],\"bigtriangledown;\":[9661],\"circlearrowleft;\":[8634],\"curvearrowright;\":[8631],\"downharpoonleft;\":[8643],\"leftharpoondown;\":[8637],\"leftrightarrows;\":[8646],\"nLeftrightarrow;\":[8654],\"nleftrightarrow;\":[8622],\"ntrianglelefteq;\":[8940],\"rightleftarrows;\":[8644],\"rightsquigarrow;\":[8605],\"rightthreetimes;\":[8908],\"straightepsilon;\":[1013],\"trianglerighteq;\":[8885],\"vartriangleleft;\":[8882]}},{\"length\":15,\"entities\":{\"DiacriticalDot;\":[729],\"DoubleRightTee;\":[8872],\"DownLeftVector;\":[8637],\"GreaterGreater;\":[10914],\"HorizontalLine;\":[9472],\"InvisibleComma;\":[8291],\"InvisibleTimes;\":[8290],\"LeftDownVector;\":[8643],\"LeftRightArrow;\":[8596],\"Leftrightarrow;\":[8660],\"LessSlantEqual;\":[10877],\"LongRightArrow;\":[10230],\"Longrightarrow;\":[10233],\"LowerLeftArrow;\":[8601],\"NestedLessLess;\":[8810],\"NotGreaterLess;\":[8825],\"NotLessGreater;\":[8824],\"NotSubsetEqual;\":[8840],\"NotVerticalBar;\":[8740],\"OpenCurlyQuote;\":[8216],\"ReverseElement;\":[8715],\"RightTeeVector;\":[10587],\"RightVectorBar;\":[10579],\"ShortDownArrow;\":[8595],\"ShortLeftArrow;\":[8592],\"SquareSuperset;\":[8848],\"TildeFullEqual;\":[8773],\"UpperLeftArrow;\":[8598],\"ZeroWidthSpace;\":[8203],\"curvearrowleft;\":[8630],\"doublebarwedge;\":[8966],\"downdownarrows;\":[8650],\"hookrightarrow;\":[8618],\"leftleftarrows;\":[8647],\"leftrightarrow;\":[8596],\"leftthreetimes;\":[8907],\"longrightarrow;\":[10230],\"looparrowright;\":[8620],\"nshortparallel;\":[8742],\"ntriangleright;\":[8939],\"rightarrowtail;\":[8611],\"rightharpoonup;\":[8640],\"trianglelefteq;\":[8884],\"upharpoonright;\":[8638]}},{\"length\":14,\"entities\":{\"ApplyFunction;\":[8289],\"DifferentialD;\":[8518],\"DoubleLeftTee;\":[10980],\"DoubleUpArrow;\":[8657],\"LeftTeeVector;\":[10586],\"LeftVectorBar;\":[10578],\"LessFullEqual;\":[8806],\"LongLeftArrow;\":[10229],\"Longleftarrow;\":[10232],\"NotEqualTilde;\":[8770,824],\"NotTildeEqual;\":[8772],\"NotTildeTilde;\":[8777],\"Poincareplane;\":[8460],\"PrecedesEqual;\":[10927],\"PrecedesTilde;\":[8830],\"RightArrowBar;\":[8677],\"RightTeeArrow;\":[8614],\"RightTriangle;\":[8883],\"RightUpVector;\":[8638],\"SucceedsEqual;\":[10928],\"SucceedsTilde;\":[8831],\"SupersetEqual;\":[8839],\"UpEquilibrium;\":[10606],\"VerticalTilde;\":[8768],\"VeryThinSpace;\":[8202],\"bigtriangleup;\":[9651],\"blacktriangle;\":[9652],\"divideontimes;\":[8903],\"fallingdotseq;\":[8786],\"hookleftarrow;\":[8617],\"leftarrowtail;\":[8610],\"leftharpoonup;\":[8636],\"longleftarrow;\":[10229],\"looparrowleft;\":[8619],\"measuredangle;\":[8737],\"ntriangleleft;\":[8938],\"shortparallel;\":[8741],\"smallsetminus;\":[8726],\"triangleright;\":[9657],\"upharpoonleft;\":[8639],\"varsubsetneqq;\":[10955,65024],\"varsupsetneqq;\":[10956,65024]}},{\"length\":13,\"entities\":{\"DownArrowBar;\":[10515],\"DownTeeArrow;\":[8615],\"ExponentialE;\":[8519],\"GreaterEqual;\":[8805],\"GreaterTilde;\":[8819],\"HilbertSpace;\":[8459],\"HumpDownHump;\":[8782],\"Intersection;\":[8898],\"LeftArrowBar;\":[8676],\"LeftTeeArrow;\":[8612],\"LeftTriangle;\":[8882],\"LeftUpVector;\":[8639],\"NotCongruent;\":[8802],\"NotHumpEqual;\":[8783,824],\"NotLessEqual;\":[8816],\"NotLessTilde;\":[8820],\"Proportional;\":[8733],\"RightCeiling;\":[8969],\"RoundImplies;\":[10608],\"ShortUpArrow;\":[8593],\"SquareSubset;\":[8847],\"UnderBracket;\":[9141],\"VerticalLine;\":[124],\"blacklozenge;\":[10731],\"exponentiale;\":[8519],\"risingdotseq;\":[8787],\"triangledown;\":[9663],\"triangleleft;\":[9667],\"varsubsetneq;\":[8842,65024],\"varsupsetneq;\":[8843,65024]}},{\"length\":12,\"entities\":{\"CircleMinus;\":[8854],\"CircleTimes;\":[8855],\"Equilibrium;\":[8652],\"GreaterLess;\":[8823],\"LeftCeiling;\":[8968],\"LessGreater;\":[8822],\"MediumSpace;\":[8287],\"NotLessLess;\":[8810,824],\"NotPrecedes;\":[8832],\"NotSucceeds;\":[8833],\"NotSuperset;\":[8835,8402],\"OverBracket;\":[9140],\"RightVector;\":[8640],\"Rrightarrow;\":[8667],\"RuleDelayed;\":[10740],\"SmallCircle;\":[8728],\"SquareUnion;\":[8852],\"SubsetEqual;\":[8838],\"UpDownArrow;\":[8597],\"Updownarrow;\":[8661],\"VerticalBar;\":[8739],\"backepsilon;\":[1014],\"blacksquare;\":[9642],\"circledcirc;\":[8858],\"circleddash;\":[8861],\"curlyeqprec;\":[8926],\"curlyeqsucc;\":[8927],\"diamondsuit;\":[9830],\"eqslantless;\":[10901],\"expectation;\":[8496],\"nRightarrow;\":[8655],\"nrightarrow;\":[8603],\"preccurlyeq;\":[8828],\"precnapprox;\":[10937],\"quaternions;\":[8461],\"straightphi;\":[981],\"succcurlyeq;\":[8829],\"succnapprox;\":[10938],\"thickapprox;\":[8776],\"updownarrow;\":[8597]}},{\"length\":11,\"entities\":{\"Bernoullis;\":[8492],\"CirclePlus;\":[8853],\"EqualTilde;\":[8770],\"Fouriertrf;\":[8497],\"ImaginaryI;\":[8520],\"Laplacetrf;\":[8466],\"LeftVector;\":[8636],\"Lleftarrow;\":[8666],\"NotElement;\":[8713],\"NotGreater;\":[8815],\"Proportion;\":[8759],\"RightArrow;\":[8594],\"RightFloor;\":[8971],\"Rightarrow;\":[8658],\"ThickSpace;\":[8287,8202],\"TildeEqual;\":[8771],\"TildeTilde;\":[8776],\"UnderBrace;\":[9183],\"UpArrowBar;\":[10514],\"UpTeeArrow;\":[8613],\"circledast;\":[8859],\"complement;\":[8705],\"curlywedge;\":[8911],\"eqslantgtr;\":[10902],\"gtreqqless;\":[10892],\"lessapprox;\":[10885],\"lesseqqgtr;\":[10891],\"lmoustache;\":[9136],\"longmapsto;\":[10236],\"mapstodown;\":[8615],\"mapstoleft;\":[8612],\"nLeftarrow;\":[8653],\"nleftarrow;\":[8602],\"nsubseteqq;\":[10949,824],\"nsupseteqq;\":[10950,824],\"precapprox;\":[10935],\"rightarrow;\":[8594],\"rmoustache;\":[9137],\"sqsubseteq;\":[8849],\"sqsupseteq;\":[8850],\"subsetneqq;\":[10955],\"succapprox;\":[10936],\"supsetneqq;\":[10956],\"upuparrows;\":[8648],\"varepsilon;\":[1013],\"varnothing;\":[8709]}},{\"length\":10,\"entities\":{\"Backslash;\":[8726],\"CenterDot;\":[183],\"CircleDot;\":[8857],\"Congruent;\":[8801],\"Coproduct;\":[8720],\"DoubleDot;\":[168],\"DownArrow;\":[8595],\"DownBreve;\":[785],\"Downarrow;\":[8659],\"HumpEqual;\":[8783],\"LeftArrow;\":[8592],\"LeftFloor;\":[8970],\"Leftarrow;\":[8656],\"LessTilde;\":[8818],\"Mellintrf;\":[8499],\"MinusPlus;\":[8723],\"NotCupCap;\":[8813],\"NotExists;\":[8708],\"NotSubset;\":[8834,8402],\"OverBrace;\":[9182],\"PlusMinus;\":[177],\"Therefore;\":[8756],\"ThinSpace;\":[8201],\"TripleDot;\":[8411],\"UnionPlus;\":[8846],\"backprime;\":[8245],\"backsimeq;\":[8909],\"bigotimes;\":[10754],\"centerdot;\":[183],\"checkmark;\":[10003],\"complexes;\":[8450],\"dotsquare;\":[8865],\"downarrow;\":[8595],\"gtrapprox;\":[10886],\"gtreqless;\":[8923],\"gvertneqq;\":[8809,65024],\"heartsuit;\":[9829],\"leftarrow;\":[8592],\"lesseqgtr;\":[8922],\"lvertneqq;\":[8808,65024],\"ngeqslant;\":[10878,824],\"nleqslant;\":[10877,824],\"nparallel;\":[8742],\"nshortmid;\":[8740],\"nsubseteq;\":[8840],\"nsupseteq;\":[8841],\"pitchfork;\":[8916],\"rationals;\":[8474],\"spadesuit;\":[9824],\"subseteqq;\":[10949],\"subsetneq;\":[8842],\"supseteqq;\":[10950],\"supsetneq;\":[8843],\"therefore;\":[8756],\"triangleq;\":[8796],\"varpropto;\":[8733]}},{\"length\":9,\"entities\":{\"DDotrahd;\":[10513],\"DotEqual;\":[8784],\"Integral;\":[8747],\"LessLess;\":[10913],\"NotEqual;\":[8800],\"NotTilde;\":[8769],\"PartialD;\":[8706],\"Precedes;\":[8826],\"RightTee;\":[8866],\"Succeeds;\":[8827],\"SuchThat;\":[8715],\"Superset;\":[8835],\"Uarrocir;\":[10569],\"UnderBar;\":[95],\"andslope;\":[10840],\"angmsdaa;\":[10664],\"angmsdab;\":[10665],\"angmsdac;\":[10666],\"angmsdad;\":[10667],\"angmsdae;\":[10668],\"angmsdaf;\":[10669],\"angmsdag;\":[10670],\"angmsdah;\":[10671],\"angrtvbd;\":[10653],\"approxeq;\":[8778],\"awconint;\":[8755],\"backcong;\":[8780],\"barwedge;\":[8965],\"bbrktbrk;\":[9142],\"bigoplus;\":[10753],\"bigsqcup;\":[10758],\"biguplus;\":[10756],\"bigwedge;\":[8896],\"boxminus;\":[8863],\"boxtimes;\":[8864],\"bsolhsub;\":[10184],\"capbrcup;\":[10825],\"circledR;\":[174],\"circledS;\":[9416],\"cirfnint;\":[10768],\"clubsuit;\":[9827],\"cupbrcap;\":[10824],\"curlyvee;\":[8910],\"cwconint;\":[8754],\"doteqdot;\":[8785],\"dotminus;\":[8760],\"drbkarow;\":[10512],\"dzigrarr;\":[10239],\"elinters;\":[9191],\"emptyset;\":[8709],\"eqvparsl;\":[10725],\"fpartint;\":[10765],\"geqslant;\":[10878],\"gesdotol;\":[10884],\"gnapprox;\":[10890],\"hksearow;\":[10533],\"hkswarow;\":[10534],\"imagline;\":[8464],\"imagpart;\":[8465],\"infintie;\":[10717],\"integers;\":[8484],\"intercal;\":[8890],\"intlarhk;\":[10775],\"laemptyv;\":[10676],\"ldrushar;\":[10571],\"leqslant;\":[10877],\"lesdotor;\":[10883],\"llcorner;\":[8990],\"lnapprox;\":[10889],\"lrcorner;\":[8991],\"lurdshar;\":[10570],\"mapstoup;\":[8613],\"multimap;\":[8888],\"naturals;\":[8469],\"ncongdot;\":[10861,824],\"notindot;\":[8949,824],\"otimesas;\":[10806],\"parallel;\":[8741],\"plusacir;\":[10787],\"pointint;\":[10773],\"precneqq;\":[10933],\"precnsim;\":[8936],\"profalar;\":[9006],\"profline;\":[8978],\"profsurf;\":[8979],\"raemptyv;\":[10675],\"realpart;\":[8476],\"rppolint;\":[10770],\"rtriltri;\":[10702],\"scpolint;\":[10771],\"setminus;\":[8726],\"shortmid;\":[8739],\"smeparsl;\":[10724],\"sqsubset;\":[8847],\"sqsupset;\":[8848],\"subseteq;\":[8838],\"succneqq;\":[10934],\"succnsim;\":[8937],\"supseteq;\":[8839],\"thetasym;\":[977],\"thicksim;\":[8764],\"timesbar;\":[10801],\"triangle;\":[9653],\"triminus;\":[10810],\"trpezium;\":[9186],\"ulcorner;\":[8988],\"urcorner;\":[8989],\"varkappa;\":[1008],\"varsigma;\":[962],\"vartheta;\":[977]}},{\"length\":8,\"entities\":{\"Because;\":[8757],\"Cayleys;\":[8493],\"Cconint;\":[8752],\"Cedilla;\":[184],\"Diamond;\":[8900],\"DownTee;\":[8868],\"Element;\":[8712],\"Epsilon;\":[917],\"Implies;\":[8658],\"LeftTee;\":[8867],\"NewLine;\":[10],\"NoBreak;\":[8288],\"NotLess;\":[8814],\"Omicron;\":[927],\"OverBar;\":[8254],\"Product;\":[8719],\"UpArrow;\":[8593],\"Uparrow;\":[8657],\"Upsilon;\":[933],\"alefsym;\":[8501],\"angrtvb;\":[8894],\"angzarr;\":[9084],\"asympeq;\":[8781],\"backsim;\":[8765],\"because;\":[8757],\"bemptyv;\":[10672],\"between;\":[8812],\"bigcirc;\":[9711],\"bigodot;\":[10752],\"bigstar;\":[9733],\"bnequiv;\":[8801,8421],\"boxplus;\":[8862],\"ccupssm;\":[10832],\"cemptyv;\":[10674],\"cirscir;\":[10690],\"coloneq;\":[8788],\"congdot;\":[10861],\"cudarrl;\":[10552],\"cudarrr;\":[10549],\"cularrp;\":[10557],\"curarrm;\":[10556],\"dbkarow;\":[10511],\"ddagger;\":[8225],\"ddotseq;\":[10871],\"demptyv;\":[10673],\"diamond;\":[8900],\"digamma;\":[989],\"dotplus;\":[8724],\"dwangle;\":[10662],\"epsilon;\":[949],\"eqcolon;\":[8789],\"equivDD;\":[10872],\"gesdoto;\":[10882],\"gtquest;\":[10876],\"gtrless;\":[8823],\"harrcir;\":[10568],\"intprod;\":[10812],\"isindot;\":[8949],\"larrbfs;\":[10527],\"larrsim;\":[10611],\"lbrksld;\":[10639],\"lbrkslu;\":[10637],\"ldrdhar;\":[10599],\"lesdoto;\":[10881],\"lessdot;\":[8918],\"lessgtr;\":[8822],\"lesssim;\":[8818],\"lotimes;\":[10804],\"lozenge;\":[9674],\"ltquest;\":[10875],\"luruhar;\":[10598],\"maltese;\":[10016],\"minusdu;\":[10794],\"napprox;\":[8777],\"natural;\":[9838],\"nearrow;\":[8599],\"nexists;\":[8708],\"notinva;\":[8713],\"notinvb;\":[8951],\"notinvc;\":[8950],\"notniva;\":[8716],\"notnivb;\":[8958],\"notnivc;\":[8957],\"npolint;\":[10772],\"npreceq;\":[10927,824],\"nsqsube;\":[8930],\"nsqsupe;\":[8931],\"nsubset;\":[8834,8402],\"nsucceq;\":[10928,824],\"nsupset;\":[8835,8402],\"nvinfin;\":[10718],\"nvltrie;\":[8884,8402],\"nvrtrie;\":[8885,8402],\"nwarrow;\":[8598],\"olcross;\":[10683],\"omicron;\":[959],\"orderof;\":[8500],\"orslope;\":[10839],\"pertenk;\":[8241],\"planckh;\":[8462],\"pluscir;\":[10786],\"plussim;\":[10790],\"plustwo;\":[10791],\"precsim;\":[8830],\"quatint;\":[10774],\"questeq;\":[8799],\"rarrbfs;\":[10528],\"rarrsim;\":[10612],\"rbrksld;\":[10638],\"rbrkslu;\":[10640],\"rdldhar;\":[10601],\"realine;\":[8475],\"rotimes;\":[10805],\"ruluhar;\":[10600],\"searrow;\":[8600],\"simplus;\":[10788],\"simrarr;\":[10610],\"subedot;\":[10947],\"submult;\":[10945],\"subplus;\":[10943],\"subrarr;\":[10617],\"succsim;\":[8831],\"supdsub;\":[10968],\"supedot;\":[10948],\"suphsol;\":[10185],\"suphsub;\":[10967],\"suplarr;\":[10619],\"supmult;\":[10946],\"supplus;\":[10944],\"swarrow;\":[8601],\"topfork;\":[10970],\"triplus;\":[10809],\"tritime;\":[10811],\"uparrow;\":[8593],\"upsilon;\":[965],\"uwangle;\":[10663],\"vzigzag;\":[10650],\"zigrarr;\":[8669]}},{\"length\":7,\"entities\":{\"Aacute;\":[193],\"Abreve;\":[258],\"Agrave;\":[192],\"Assign;\":[8788],\"Atilde;\":[195],\"Barwed;\":[8966],\"Bumpeq;\":[8782],\"Cacute;\":[262],\"Ccaron;\":[268],\"Ccedil;\":[199],\"Colone;\":[10868],\"Conint;\":[8751],\"CupCap;\":[8781],\"Dagger;\":[8225],\"Dcaron;\":[270],\"DotDot;\":[8412],\"Dstrok;\":[272],\"Eacute;\":[201],\"Ecaron;\":[282],\"Egrave;\":[200],\"Exists;\":[8707],\"ForAll;\":[8704],\"Gammad;\":[988],\"Gbreve;\":[286],\"Gcedil;\":[290],\"HARDcy;\":[1066],\"Hstrok;\":[294],\"Iacute;\":[205],\"Igrave;\":[204],\"Itilde;\":[296],\"Jsercy;\":[1032],\"Kcedil;\":[310],\"Lacute;\":[313],\"Lambda;\":[923],\"Lcaron;\":[317],\"Lcedil;\":[315],\"Lmidot;\":[319],\"Lstrok;\":[321],\"Nacute;\":[323],\"Ncaron;\":[327],\"Ncedil;\":[325],\"Ntilde;\":[209],\"Oacute;\":[211],\"Odblac;\":[336],\"Ograve;\":[210],\"Oslash;\":[216],\"Otilde;\":[213],\"Otimes;\":[10807],\"Racute;\":[340],\"Rarrtl;\":[10518],\"Rcaron;\":[344],\"Rcedil;\":[342],\"SHCHcy;\":[1065],\"SOFTcy;\":[1068],\"Sacute;\":[346],\"Scaron;\":[352],\"Scedil;\":[350],\"Square;\":[9633],\"Subset;\":[8912],\"Supset;\":[8913],\"Tcaron;\":[356],\"Tcedil;\":[354],\"Tstrok;\":[358],\"Uacute;\":[218],\"Ubreve;\":[364],\"Udblac;\":[368],\"Ugrave;\":[217],\"Utilde;\":[360],\"Vdashl;\":[10982],\"Verbar;\":[8214],\"Vvdash;\":[8874],\"Yacute;\":[221],\"Zacute;\":[377],\"Zcaron;\":[381],\"aacute;\":[225],\"abreve;\":[259],\"agrave;\":[224],\"andand;\":[10837],\"angmsd;\":[8737],\"angsph;\":[8738],\"apacir;\":[10863],\"approx;\":[8776],\"atilde;\":[227],\"barvee;\":[8893],\"barwed;\":[8965],\"becaus;\":[8757],\"bernou;\":[8492],\"bigcap;\":[8898],\"bigcup;\":[8899],\"bigvee;\":[8897],\"bkarow;\":[10509],\"bottom;\":[8869],\"bowtie;\":[8904],\"boxbox;\":[10697],\"bprime;\":[8245],\"brvbar;\":[166],\"bullet;\":[8226],\"bumpeq;\":[8783],\"cacute;\":[263],\"capand;\":[10820],\"capcap;\":[10827],\"capcup;\":[10823],\"capdot;\":[10816],\"ccaron;\":[269],\"ccedil;\":[231],\"circeq;\":[8791],\"cirmid;\":[10991],\"colone;\":[8788],\"commat;\":[64],\"compfn;\":[8728],\"conint;\":[8750],\"coprod;\":[8720],\"copysr;\":[8471],\"cularr;\":[8630],\"cupcap;\":[10822],\"cupcup;\":[10826],\"cupdot;\":[8845],\"curarr;\":[8631],\"curren;\":[164],\"cylcty;\":[9005],\"dagger;\":[8224],\"daleth;\":[8504],\"dcaron;\":[271],\"dfisht;\":[10623],\"divide;\":[247],\"divonx;\":[8903],\"dlcorn;\":[8990],\"dlcrop;\":[8973],\"dollar;\":[36],\"drcorn;\":[8991],\"drcrop;\":[8972],\"dstrok;\":[273],\"eacute;\":[233],\"easter;\":[10862],\"ecaron;\":[283],\"ecolon;\":[8789],\"egrave;\":[232],\"egsdot;\":[10904],\"elsdot;\":[10903],\"emptyv;\":[8709],\"emsp13;\":[8196],\"emsp14;\":[8197],\"eparsl;\":[10723],\"eqcirc;\":[8790],\"equals;\":[61],\"equest;\":[8799],\"female;\":[9792],\"ffilig;\":[64259],\"ffllig;\":[64260],\"forall;\":[8704],\"frac12;\":[189],\"frac13;\":[8531],\"frac14;\":[188],\"frac15;\":[8533],\"frac16;\":[8537],\"frac18;\":[8539],\"frac23;\":[8532],\"frac25;\":[8534],\"frac34;\":[190],\"frac35;\":[8535],\"frac38;\":[8540],\"frac45;\":[8536],\"frac56;\":[8538],\"frac58;\":[8541],\"frac78;\":[8542],\"gacute;\":[501],\"gammad;\":[989],\"gbreve;\":[287],\"gesdot;\":[10880],\"gesles;\":[10900],\"gtlPar;\":[10645],\"gtrarr;\":[10616],\"gtrdot;\":[8919],\"gtrsim;\":[8819],\"hairsp;\":[8202],\"hamilt;\":[8459],\"hardcy;\":[1098],\"hearts;\":[9829],\"hellip;\":[8230],\"hercon;\":[8889],\"homtht;\":[8763],\"horbar;\":[8213],\"hslash;\":[8463],\"hstrok;\":[295],\"hybull;\":[8259],\"hyphen;\":[8208],\"iacute;\":[237],\"igrave;\":[236],\"iiiint;\":[10764],\"iinfin;\":[10716],\"incare;\":[8453],\"inodot;\":[305],\"intcal;\":[8890],\"iquest;\":[191],\"isinsv;\":[8947],\"itilde;\":[297],\"jsercy;\":[1112],\"kappav;\":[1008],\"kcedil;\":[311],\"kgreen;\":[312],\"lAtail;\":[10523],\"lacute;\":[314],\"lagran;\":[8466],\"lambda;\":[955],\"langle;\":[10216],\"larrfs;\":[10525],\"larrhk;\":[8617],\"larrlp;\":[8619],\"larrpl;\":[10553],\"larrtl;\":[8610],\"latail;\":[10521],\"lbrace;\":[123],\"lbrack;\":[91],\"lcaron;\":[318],\"lcedil;\":[316],\"ldquor;\":[8222],\"lesdot;\":[10879],\"lesges;\":[10899],\"lfisht;\":[10620],\"lfloor;\":[8970],\"lharul;\":[10602],\"llhard;\":[10603],\"lmidot;\":[320],\"lmoust;\":[9136],\"loplus;\":[10797],\"lowast;\":[8727],\"lowbar;\":[95],\"lparlt;\":[10643],\"lrhard;\":[10605],\"lsaquo;\":[8249],\"lsquor;\":[8218],\"lstrok;\":[322],\"lthree;\":[8907],\"ltimes;\":[8905],\"ltlarr;\":[10614],\"ltrPar;\":[10646],\"mapsto;\":[8614],\"marker;\":[9646],\"mcomma;\":[10793],\"midast;\":[42],\"midcir;\":[10992],\"middot;\":[183],\"minusb;\":[8863],\"minusd;\":[8760],\"mnplus;\":[8723],\"models;\":[8871],\"mstpos;\":[8766],\"nVDash;\":[8879],\"nVdash;\":[8878],\"nacute;\":[324],\"nbumpe;\":[8783,824],\"ncaron;\":[328],\"ncedil;\":[326],\"nearhk;\":[10532],\"nequiv;\":[8802],\"nesear;\":[10536],\"nexist;\":[8708],\"nltrie;\":[8940],\"notinE;\":[8953,824],\"nparsl;\":[11005,8421],\"nprcue;\":[8928],\"nrarrc;\":[10547,824],\"nrarrw;\":[8605,824],\"nrtrie;\":[8941],\"nsccue;\":[8929],\"nsimeq;\":[8772],\"ntilde;\":[241],\"numero;\":[8470],\"nvDash;\":[8877],\"nvHarr;\":[10500],\"nvdash;\":[8876],\"nvlArr;\":[10498],\"nvrArr;\":[10499],\"nwarhk;\":[10531],\"nwnear;\":[10535],\"oacute;\":[243],\"odblac;\":[337],\"odsold;\":[10684],\"ograve;\":[242],\"ominus;\":[8854],\"origof;\":[8886],\"oslash;\":[248],\"otilde;\":[245],\"otimes;\":[8855],\"parsim;\":[10995],\"percnt;\":[37],\"period;\":[46],\"permil;\":[8240],\"phmmat;\":[8499],\"planck;\":[8463],\"plankv;\":[8463],\"plusdo;\":[8724],\"plusdu;\":[10789],\"plusmn;\":[177],\"preceq;\":[10927],\"primes;\":[8473],\"prnsim;\":[8936],\"propto;\":[8733],\"prurel;\":[8880],\"puncsp;\":[8200],\"qprime;\":[8279],\"rAtail;\":[10524],\"racute;\":[341],\"rangle;\":[10217],\"rarrap;\":[10613],\"rarrfs;\":[10526],\"rarrhk;\":[8618],\"rarrlp;\":[8620],\"rarrpl;\":[10565],\"rarrtl;\":[8611],\"ratail;\":[10522],\"rbrace;\":[125],\"rbrack;\":[93],\"rcaron;\":[345],\"rcedil;\":[343],\"rdquor;\":[8221],\"rfisht;\":[10621],\"rfloor;\":[8971],\"rharul;\":[10604],\"rmoust;\":[9137],\"roplus;\":[10798],\"rpargt;\":[10644],\"rsaquo;\":[8250],\"rsquor;\":[8217],\"rthree;\":[8908],\"rtimes;\":[8906],\"sacute;\":[347],\"scaron;\":[353],\"scedil;\":[351],\"scnsim;\":[8937],\"searhk;\":[10533],\"seswar;\":[10537],\"sfrown;\":[8994],\"shchcy;\":[1097],\"sigmaf;\":[962],\"sigmav;\":[962],\"simdot;\":[10858],\"smashp;\":[10803],\"softcy;\":[1100],\"solbar;\":[9023],\"spades;\":[9824],\"sqcaps;\":[8851,65024],\"sqcups;\":[8852,65024],\"sqsube;\":[8849],\"sqsupe;\":[8850],\"square;\":[9633],\"squarf;\":[9642],\"ssetmn;\":[8726],\"ssmile;\":[8995],\"sstarf;\":[8902],\"subdot;\":[10941],\"subset;\":[8834],\"subsim;\":[10951],\"subsub;\":[10965],\"subsup;\":[10963],\"succeq;\":[10928],\"supdot;\":[10942],\"supset;\":[8835],\"supsim;\":[10952],\"supsub;\":[10964],\"supsup;\":[10966],\"swarhk;\":[10534],\"swnwar;\":[10538],\"target;\":[8982],\"tcaron;\":[357],\"tcedil;\":[355],\"telrec;\":[8981],\"there4;\":[8756],\"thetav;\":[977],\"thinsp;\":[8201],\"thksim;\":[8764],\"timesb;\":[8864],\"timesd;\":[10800],\"topbot;\":[9014],\"topcir;\":[10993],\"tprime;\":[8244],\"tridot;\":[9708],\"tstrok;\":[359],\"uacute;\":[250],\"ubreve;\":[365],\"udblac;\":[369],\"ufisht;\":[10622],\"ugrave;\":[249],\"ulcorn;\":[8988],\"ulcrop;\":[8975],\"urcorn;\":[8989],\"urcrop;\":[8974],\"utilde;\":[361],\"vangrt;\":[10652],\"varphi;\":[981],\"varrho;\":[1009],\"veebar;\":[8891],\"vellip;\":[8942],\"verbar;\":[124],\"vsubnE;\":[10955,65024],\"vsubne;\":[8842,65024],\"vsupnE;\":[10956,65024],\"vsupne;\":[8843,65024],\"wedbar;\":[10847],\"wedgeq;\":[8793],\"weierp;\":[8472],\"wreath;\":[8768],\"xoplus;\":[10753],\"xotime;\":[10754],\"xsqcup;\":[10758],\"xuplus;\":[10756],\"xwedge;\":[8896],\"yacute;\":[253],\"zacute;\":[378],\"zcaron;\":[382],\"zeetrf;\":[8488]}},{\"length\":6,\"entities\":{\"AElig;\":[198],\"Aacute\":[193],\"Acirc;\":[194],\"Agrave\":[192],\"Alpha;\":[913],\"Amacr;\":[256],\"Aogon;\":[260],\"Aring;\":[197],\"Atilde\":[195],\"Breve;\":[728],\"Ccedil\":[199],\"Ccirc;\":[264],\"Colon;\":[8759],\"Cross;\":[10799],\"Dashv;\":[10980],\"Delta;\":[916],\"Eacute\":[201],\"Ecirc;\":[202],\"Egrave\":[200],\"Emacr;\":[274],\"Eogon;\":[280],\"Equal;\":[10869],\"Gamma;\":[915],\"Gcirc;\":[284],\"Hacek;\":[711],\"Hcirc;\":[292],\"IJlig;\":[306],\"Iacute\":[205],\"Icirc;\":[206],\"Igrave\":[204],\"Imacr;\":[298],\"Iogon;\":[302],\"Iukcy;\":[1030],\"Jcirc;\":[308],\"Jukcy;\":[1028],\"Kappa;\":[922],\"Ntilde\":[209],\"OElig;\":[338],\"Oacute\":[211],\"Ocirc;\":[212],\"Ograve\":[210],\"Omacr;\":[332],\"Omega;\":[937],\"Oslash\":[216],\"Otilde\":[213],\"Prime;\":[8243],\"RBarr;\":[10512],\"Scirc;\":[348],\"Sigma;\":[931],\"THORN;\":[222],\"TRADE;\":[8482],\"TSHcy;\":[1035],\"Theta;\":[920],\"Tilde;\":[8764],\"Uacute\":[218],\"Ubrcy;\":[1038],\"Ucirc;\":[219],\"Ugrave\":[217],\"Umacr;\":[362],\"Union;\":[8899],\"Uogon;\":[370],\"UpTee;\":[8869],\"Uring;\":[366],\"VDash;\":[8875],\"Vdash;\":[8873],\"Wcirc;\":[372],\"Wedge;\":[8896],\"Yacute\":[221],\"Ycirc;\":[374],\"aacute\":[225],\"acirc;\":[226],\"acute;\":[180],\"aelig;\":[230],\"agrave\":[224],\"aleph;\":[8501],\"alpha;\":[945],\"amacr;\":[257],\"amalg;\":[10815],\"angle;\":[8736],\"angrt;\":[8735],\"angst;\":[197],\"aogon;\":[261],\"aring;\":[229],\"asymp;\":[8776],\"atilde\":[227],\"awint;\":[10769],\"bcong;\":[8780],\"bdquo;\":[8222],\"bepsi;\":[1014],\"blank;\":[9251],\"blk12;\":[9618],\"blk14;\":[9617],\"blk34;\":[9619],\"block;\":[9608],\"boxDL;\":[9559],\"boxDR;\":[9556],\"boxDl;\":[9558],\"boxDr;\":[9555],\"boxHD;\":[9574],\"boxHU;\":[9577],\"boxHd;\":[9572],\"boxHu;\":[9575],\"boxUL;\":[9565],\"boxUR;\":[9562],\"boxUl;\":[9564],\"boxUr;\":[9561],\"boxVH;\":[9580],\"boxVL;\":[9571],\"boxVR;\":[9568],\"boxVh;\":[9579],\"boxVl;\":[9570],\"boxVr;\":[9567],\"boxdL;\":[9557],\"boxdR;\":[9554],\"boxdl;\":[9488],\"boxdr;\":[9484],\"boxhD;\":[9573],\"boxhU;\":[9576],\"boxhd;\":[9516],\"boxhu;\":[9524],\"boxuL;\":[9563],\"boxuR;\":[9560],\"boxul;\":[9496],\"boxur;\":[9492],\"boxvH;\":[9578],\"boxvL;\":[9569],\"boxvR;\":[9566],\"boxvh;\":[9532],\"boxvl;\":[9508],\"boxvr;\":[9500],\"breve;\":[728],\"brvbar\":[166],\"bsemi;\":[8271],\"bsime;\":[8909],\"bsolb;\":[10693],\"bumpE;\":[10926],\"bumpe;\":[8783],\"caret;\":[8257],\"caron;\":[711],\"ccaps;\":[10829],\"ccedil\":[231],\"ccirc;\":[265],\"ccups;\":[10828],\"cedil;\":[184],\"check;\":[10003],\"clubs;\":[9827],\"colon;\":[58],\"comma;\":[44],\"crarr;\":[8629],\"cross;\":[10007],\"csube;\":[10961],\"csupe;\":[10962],\"ctdot;\":[8943],\"cuepr;\":[8926],\"cuesc;\":[8927],\"cupor;\":[10821],\"curren\":[164],\"cuvee;\":[8910],\"cuwed;\":[8911],\"cwint;\":[8753],\"dashv;\":[8867],\"dblac;\":[733],\"ddarr;\":[8650],\"delta;\":[948],\"dharl;\":[8643],\"dharr;\":[8642],\"diams;\":[9830],\"disin;\":[8946],\"divide\":[247],\"doteq;\":[8784],\"dtdot;\":[8945],\"dtrif;\":[9662],\"duarr;\":[8693],\"duhar;\":[10607],\"eDDot;\":[10871],\"eacute\":[233],\"ecirc;\":[234],\"efDot;\":[8786],\"egrave\":[232],\"emacr;\":[275],\"empty;\":[8709],\"eogon;\":[281],\"eplus;\":[10865],\"epsiv;\":[1013],\"eqsim;\":[8770],\"equiv;\":[8801],\"erDot;\":[8787],\"erarr;\":[10609],\"esdot;\":[8784],\"exist;\":[8707],\"fflig;\":[64256],\"filig;\":[64257],\"fjlig;\":[102,106],\"fllig;\":[64258],\"fltns;\":[9649],\"forkv;\":[10969],\"frac12\":[189],\"frac14\":[188],\"frac34\":[190],\"frasl;\":[8260],\"frown;\":[8994],\"gamma;\":[947],\"gcirc;\":[285],\"gescc;\":[10921],\"gimel;\":[8503],\"gneqq;\":[8809],\"gnsim;\":[8935],\"grave;\":[96],\"gsime;\":[10894],\"gsiml;\":[10896],\"gtcir;\":[10874],\"gtdot;\":[8919],\"harrw;\":[8621],\"hcirc;\":[293],\"hoarr;\":[8703],\"iacute\":[237],\"icirc;\":[238],\"iexcl;\":[161],\"igrave\":[236],\"iiint;\":[8749],\"iiota;\":[8489],\"ijlig;\":[307],\"imacr;\":[299],\"image;\":[8465],\"imath;\":[305],\"imped;\":[437],\"infin;\":[8734],\"iogon;\":[303],\"iprod;\":[10812],\"iquest\":[191],\"isinE;\":[8953],\"isins;\":[8948],\"isinv;\":[8712],\"iukcy;\":[1110],\"jcirc;\":[309],\"jmath;\":[567],\"jukcy;\":[1108],\"kappa;\":[954],\"lAarr;\":[8666],\"lBarr;\":[10510],\"langd;\":[10641],\"laquo;\":[171],\"larrb;\":[8676],\"lates;\":[10925,65024],\"lbarr;\":[10508],\"lbbrk;\":[10098],\"lbrke;\":[10635],\"lceil;\":[8968],\"ldquo;\":[8220],\"lescc;\":[10920],\"lhard;\":[8637],\"lharu;\":[8636],\"lhblk;\":[9604],\"llarr;\":[8647],\"lltri;\":[9722],\"lneqq;\":[8808],\"lnsim;\":[8934],\"loang;\":[10220],\"loarr;\":[8701],\"lobrk;\":[10214],\"lopar;\":[10629],\"lrarr;\":[8646],\"lrhar;\":[8651],\"lrtri;\":[8895],\"lsime;\":[10893],\"lsimg;\":[10895],\"lsquo;\":[8216],\"ltcir;\":[10873],\"ltdot;\":[8918],\"ltrie;\":[8884],\"ltrif;\":[9666],\"mDDot;\":[8762],\"mdash;\":[8212],\"micro;\":[181],\"middot\":[183],\"minus;\":[8722],\"mumap;\":[8888],\"nabla;\":[8711],\"napid;\":[8779,824],\"napos;\":[329],\"natur;\":[9838],\"nbump;\":[8782,824],\"ncong;\":[8775],\"ndash;\":[8211],\"neArr;\":[8663],\"nearr;\":[8599],\"nedot;\":[8784,824],\"nesim;\":[8770,824],\"ngeqq;\":[8807,824],\"ngsim;\":[8821],\"nhArr;\":[8654],\"nharr;\":[8622],\"nhpar;\":[10994],\"nlArr;\":[8653],\"nlarr;\":[8602],\"nleqq;\":[8806,824],\"nless;\":[8814],\"nlsim;\":[8820],\"nltri;\":[8938],\"notin;\":[8713],\"notni;\":[8716],\"npart;\":[8706,824],\"nprec;\":[8832],\"nrArr;\":[8655],\"nrarr;\":[8603],\"nrtri;\":[8939],\"nsime;\":[8772],\"nsmid;\":[8740],\"nspar;\":[8742],\"nsubE;\":[10949,824],\"nsube;\":[8840],\"nsucc;\":[8833],\"nsupE;\":[10950,824],\"nsupe;\":[8841],\"ntilde\":[241],\"numsp;\":[8199],\"nvsim;\":[8764,8402],\"nwArr;\":[8662],\"nwarr;\":[8598],\"oacute\":[243],\"ocirc;\":[244],\"odash;\":[8861],\"oelig;\":[339],\"ofcir;\":[10687],\"ograve\":[242],\"ohbar;\":[10677],\"olarr;\":[8634],\"olcir;\":[10686],\"oline;\":[8254],\"omacr;\":[333],\"omega;\":[969],\"operp;\":[10681],\"oplus;\":[8853],\"orarr;\":[8635],\"order;\":[8500],\"oslash\":[248],\"otilde\":[245],\"ovbar;\":[9021],\"parsl;\":[11005],\"phone;\":[9742],\"plusb;\":[8862],\"pluse;\":[10866],\"plusmn\":[177],\"pound;\":[163],\"prcue;\":[8828],\"prime;\":[8242],\"prnap;\":[10937],\"prsim;\":[8830],\"quest;\":[63],\"rAarr;\":[8667],\"rBarr;\":[10511],\"radic;\":[8730],\"rangd;\":[10642],\"range;\":[10661],\"raquo;\":[187],\"rarrb;\":[8677],\"rarrc;\":[10547],\"rarrw;\":[8605],\"ratio;\":[8758],\"rbarr;\":[10509],\"rbbrk;\":[10099],\"rbrke;\":[10636],\"rceil;\":[8969],\"rdquo;\":[8221],\"reals;\":[8477],\"rhard;\":[8641],\"rharu;\":[8640],\"rlarr;\":[8644],\"rlhar;\":[8652],\"rnmid;\":[10990],\"roang;\":[10221],\"roarr;\":[8702],\"robrk;\":[10215],\"ropar;\":[10630],\"rrarr;\":[8649],\"rsquo;\":[8217],\"rtrie;\":[8885],\"rtrif;\":[9656],\"sbquo;\":[8218],\"sccue;\":[8829],\"scirc;\":[349],\"scnap;\":[10938],\"scsim;\":[8831],\"sdotb;\":[8865],\"sdote;\":[10854],\"seArr;\":[8664],\"searr;\":[8600],\"setmn;\":[8726],\"sharp;\":[9839],\"sigma;\":[963],\"simeq;\":[8771],\"simgE;\":[10912],\"simlE;\":[10911],\"simne;\":[8774],\"slarr;\":[8592],\"smile;\":[8995],\"smtes;\":[10924,65024],\"sqcap;\":[8851],\"sqcup;\":[8852],\"sqsub;\":[8847],\"sqsup;\":[8848],\"srarr;\":[8594],\"starf;\":[9733],\"strns;\":[175],\"subnE;\":[10955],\"subne;\":[8842],\"supnE;\":[10956],\"supne;\":[8843],\"swArr;\":[8665],\"swarr;\":[8601],\"szlig;\":[223],\"theta;\":[952],\"thkap;\":[8776],\"thorn;\":[254],\"tilde;\":[732],\"times;\":[215],\"trade;\":[8482],\"trisb;\":[10701],\"tshcy;\":[1115],\"twixt;\":[8812],\"uacute\":[250],\"ubrcy;\":[1118],\"ucirc;\":[251],\"udarr;\":[8645],\"udhar;\":[10606],\"ugrave\":[249],\"uharl;\":[8639],\"uharr;\":[8638],\"uhblk;\":[9600],\"ultri;\":[9720],\"umacr;\":[363],\"uogon;\":[371],\"uplus;\":[8846],\"upsih;\":[978],\"uring;\":[367],\"urtri;\":[9721],\"utdot;\":[8944],\"utrif;\":[9652],\"uuarr;\":[8648],\"vBarv;\":[10985],\"vDash;\":[8872],\"varpi;\":[982],\"vdash;\":[8866],\"veeeq;\":[8794],\"vltri;\":[8882],\"vnsub;\":[8834,8402],\"vnsup;\":[8835,8402],\"vprop;\":[8733],\"vrtri;\":[8883],\"wcirc;\":[373],\"wedge;\":[8743],\"xcirc;\":[9711],\"xdtri;\":[9661],\"xhArr;\":[10234],\"xharr;\":[10231],\"xlArr;\":[10232],\"xlarr;\":[10229],\"xodot;\":[10752],\"xrArr;\":[10233],\"xrarr;\":[10230],\"xutri;\":[9651],\"yacute\":[253],\"ycirc;\":[375]}},{\"length\":5,\"entities\":{\"AElig\":[198],\"Acirc\":[194],\"Aopf;\":[120120],\"Aring\":[197],\"Ascr;\":[119964],\"Auml;\":[196],\"Barv;\":[10983],\"Beta;\":[914],\"Bopf;\":[120121],\"Bscr;\":[8492],\"CHcy;\":[1063],\"COPY;\":[169],\"Cdot;\":[266],\"Copf;\":[8450],\"Cscr;\":[119966],\"DJcy;\":[1026],\"DScy;\":[1029],\"DZcy;\":[1039],\"Darr;\":[8609],\"Dopf;\":[120123],\"Dscr;\":[119967],\"Ecirc\":[202],\"Edot;\":[278],\"Eopf;\":[120124],\"Escr;\":[8496],\"Esim;\":[10867],\"Euml;\":[203],\"Fopf;\":[120125],\"Fscr;\":[8497],\"GJcy;\":[1027],\"Gdot;\":[288],\"Gopf;\":[120126],\"Gscr;\":[119970],\"Hopf;\":[8461],\"Hscr;\":[8459],\"IEcy;\":[1045],\"IOcy;\":[1025],\"Icirc\":[206],\"Idot;\":[304],\"Iopf;\":[120128],\"Iota;\":[921],\"Iscr;\":[8464],\"Iuml;\":[207],\"Jopf;\":[120129],\"Jscr;\":[119973],\"KHcy;\":[1061],\"KJcy;\":[1036],\"Kopf;\":[120130],\"Kscr;\":[119974],\"LJcy;\":[1033],\"Lang;\":[10218],\"Larr;\":[8606],\"Lopf;\":[120131],\"Lscr;\":[8466],\"Mopf;\":[120132],\"Mscr;\":[8499],\"NJcy;\":[1034],\"Nopf;\":[8469],\"Nscr;\":[119977],\"Ocirc\":[212],\"Oopf;\":[120134],\"Oscr;\":[119978],\"Ouml;\":[214],\"Popf;\":[8473],\"Pscr;\":[119979],\"QUOT;\":[34],\"Qopf;\":[8474],\"Qscr;\":[119980],\"Rang;\":[10219],\"Rarr;\":[8608],\"Ropf;\":[8477],\"Rscr;\":[8475],\"SHcy;\":[1064],\"Sopf;\":[120138],\"Sqrt;\":[8730],\"Sscr;\":[119982],\"Star;\":[8902],\"THORN\":[222],\"TScy;\":[1062],\"Topf;\":[120139],\"Tscr;\":[119983],\"Uarr;\":[8607],\"Ucirc\":[219],\"Uopf;\":[120140],\"Upsi;\":[978],\"Uscr;\":[119984],\"Uuml;\":[220],\"Vbar;\":[10987],\"Vert;\":[8214],\"Vopf;\":[120141],\"Vscr;\":[119985],\"Wopf;\":[120142],\"Wscr;\":[119986],\"Xopf;\":[120143],\"Xscr;\":[119987],\"YAcy;\":[1071],\"YIcy;\":[1031],\"YUcy;\":[1070],\"Yopf;\":[120144],\"Yscr;\":[119988],\"Yuml;\":[376],\"ZHcy;\":[1046],\"Zdot;\":[379],\"Zeta;\":[918],\"Zopf;\":[8484],\"Zscr;\":[119989],\"acirc\":[226],\"acute\":[180],\"aelig\":[230],\"andd;\":[10844],\"andv;\":[10842],\"ange;\":[10660],\"aopf;\":[120146],\"apid;\":[8779],\"apos;\":[39],\"aring\":[229],\"ascr;\":[119990],\"auml;\":[228],\"bNot;\":[10989],\"bbrk;\":[9141],\"beta;\":[946],\"beth;\":[8502],\"bnot;\":[8976],\"bopf;\":[120147],\"boxH;\":[9552],\"boxV;\":[9553],\"boxh;\":[9472],\"boxv;\":[9474],\"bscr;\":[119991],\"bsim;\":[8765],\"bsol;\":[92],\"bull;\":[8226],\"bump;\":[8782],\"caps;\":[8745,65024],\"cdot;\":[267],\"cedil\":[184],\"cent;\":[162],\"chcy;\":[1095],\"cirE;\":[10691],\"circ;\":[710],\"cire;\":[8791],\"comp;\":[8705],\"cong;\":[8773],\"copf;\":[120148],\"copy;\":[169],\"cscr;\":[119992],\"csub;\":[10959],\"csup;\":[10960],\"cups;\":[8746,65024],\"dArr;\":[8659],\"dHar;\":[10597],\"darr;\":[8595],\"dash;\":[8208],\"diam;\":[8900],\"djcy;\":[1106],\"dopf;\":[120149],\"dscr;\":[119993],\"dscy;\":[1109],\"dsol;\":[10742],\"dtri;\":[9663],\"dzcy;\":[1119],\"eDot;\":[8785],\"ecir;\":[8790],\"ecirc\":[234],\"edot;\":[279],\"emsp;\":[8195],\"ensp;\":[8194],\"eopf;\":[120150],\"epar;\":[8917],\"epsi;\":[949],\"escr;\":[8495],\"esim;\":[8770],\"euml;\":[235],\"euro;\":[8364],\"excl;\":[33],\"flat;\":[9837],\"fnof;\":[402],\"fopf;\":[120151],\"fork;\":[8916],\"fscr;\":[119995],\"gdot;\":[289],\"geqq;\":[8807],\"gesl;\":[8923,65024],\"gjcy;\":[1107],\"gnap;\":[10890],\"gneq;\":[10888],\"gopf;\":[120152],\"gscr;\":[8458],\"gsim;\":[8819],\"gtcc;\":[10919],\"gvnE;\":[8809,65024],\"hArr;\":[8660],\"half;\":[189],\"harr;\":[8596],\"hbar;\":[8463],\"hopf;\":[120153],\"hscr;\":[119997],\"icirc\":[238],\"iecy;\":[1077],\"iexcl\":[161],\"imof;\":[8887],\"iocy;\":[1105],\"iopf;\":[120154],\"iota;\":[953],\"iscr;\":[119998],\"isin;\":[8712],\"iuml;\":[239],\"jopf;\":[120155],\"jscr;\":[119999],\"khcy;\":[1093],\"kjcy;\":[1116],\"kopf;\":[120156],\"kscr;\":[120000],\"lArr;\":[8656],\"lHar;\":[10594],\"lang;\":[10216],\"laquo\":[171],\"larr;\":[8592],\"late;\":[10925],\"lcub;\":[123],\"ldca;\":[10550],\"ldsh;\":[8626],\"leqq;\":[8806],\"lesg;\":[8922,65024],\"ljcy;\":[1113],\"lnap;\":[10889],\"lneq;\":[10887],\"lopf;\":[120157],\"lozf;\":[10731],\"lpar;\":[40],\"lscr;\":[120001],\"lsim;\":[8818],\"lsqb;\":[91],\"ltcc;\":[10918],\"ltri;\":[9667],\"lvnE;\":[8808,65024],\"macr;\":[175],\"male;\":[9794],\"malt;\":[10016],\"micro\":[181],\"mlcp;\":[10971],\"mldr;\":[8230],\"mopf;\":[120158],\"mscr;\":[120002],\"nGtv;\":[8811,824],\"nLtv;\":[8810,824],\"nang;\":[8736,8402],\"napE;\":[10864,824],\"nbsp;\":[160],\"ncap;\":[10819],\"ncup;\":[10818],\"ngeq;\":[8817],\"nges;\":[10878,824],\"ngtr;\":[8815],\"nisd;\":[8954],\"njcy;\":[1114],\"nldr;\":[8229],\"nleq;\":[8816],\"nles;\":[10877,824],\"nmid;\":[8740],\"nopf;\":[120159],\"npar;\":[8742],\"npre;\":[10927,824],\"nsce;\":[10928,824],\"nscr;\":[120003],\"nsim;\":[8769],\"nsub;\":[8836],\"nsup;\":[8837],\"ntgl;\":[8825],\"ntlg;\":[8824],\"nvap;\":[8781,8402],\"nvge;\":[8805,8402],\"nvgt;\":[62,8402],\"nvle;\":[8804,8402],\"nvlt;\":[60,8402],\"oast;\":[8859],\"ocir;\":[8858],\"ocirc\":[244],\"odiv;\":[10808],\"odot;\":[8857],\"ogon;\":[731],\"oint;\":[8750],\"omid;\":[10678],\"oopf;\":[120160],\"opar;\":[10679],\"ordf;\":[170],\"ordm;\":[186],\"oror;\":[10838],\"oscr;\":[8500],\"osol;\":[8856],\"ouml;\":[246],\"para;\":[182],\"part;\":[8706],\"perp;\":[8869],\"phiv;\":[981],\"plus;\":[43],\"popf;\":[120161],\"pound\":[163],\"prap;\":[10935],\"prec;\":[8826],\"prnE;\":[10933],\"prod;\":[8719],\"prop;\":[8733],\"pscr;\":[120005],\"qint;\":[10764],\"qopf;\":[120162],\"qscr;\":[120006],\"quot;\":[34],\"rArr;\":[8658],\"rHar;\":[10596],\"race;\":[8765,817],\"rang;\":[10217],\"raquo\":[187],\"rarr;\":[8594],\"rcub;\":[125],\"rdca;\":[10551],\"rdsh;\":[8627],\"real;\":[8476],\"rect;\":[9645],\"rhov;\":[1009],\"ring;\":[730],\"ropf;\":[120163],\"rpar;\":[41],\"rscr;\":[120007],\"rsqb;\":[93],\"rtri;\":[9657],\"scap;\":[10936],\"scnE;\":[10934],\"sdot;\":[8901],\"sect;\":[167],\"semi;\":[59],\"sext;\":[10038],\"shcy;\":[1096],\"sime;\":[8771],\"simg;\":[10910],\"siml;\":[10909],\"smid;\":[8739],\"smte;\":[10924],\"solb;\":[10692],\"sopf;\":[120164],\"spar;\":[8741],\"squf;\":[9642],\"sscr;\":[120008],\"star;\":[9734],\"subE;\":[10949],\"sube;\":[8838],\"succ;\":[8827],\"sung;\":[9834],\"sup1;\":[185],\"sup2;\":[178],\"sup3;\":[179],\"supE;\":[10950],\"supe;\":[8839],\"szlig\":[223],\"tbrk;\":[9140],\"tdot;\":[8411],\"thorn\":[254],\"times\":[215],\"tint;\":[8749],\"toea;\":[10536],\"topf;\":[120165],\"tosa;\":[10537],\"trie;\":[8796],\"tscr;\":[120009],\"tscy;\":[1094],\"uArr;\":[8657],\"uHar;\":[10595],\"uarr;\":[8593],\"ucirc\":[251],\"uopf;\":[120166],\"upsi;\":[965],\"uscr;\":[120010],\"utri;\":[9653],\"uuml;\":[252],\"vArr;\":[8661],\"vBar;\":[10984],\"varr;\":[8597],\"vert;\":[124],\"vopf;\":[120167],\"vscr;\":[120011],\"wopf;\":[120168],\"wscr;\":[120012],\"xcap;\":[8898],\"xcup;\":[8899],\"xmap;\":[10236],\"xnis;\":[8955],\"xopf;\":[120169],\"xscr;\":[120013],\"xvee;\":[8897],\"yacy;\":[1103],\"yicy;\":[1111],\"yopf;\":[120170],\"yscr;\":[120014],\"yucy;\":[1102],\"yuml;\":[255],\"zdot;\":[380],\"zeta;\":[950],\"zhcy;\":[1078],\"zopf;\":[120171],\"zscr;\":[120015],\"zwnj;\":[8204]}},{\"length\":4,\"entities\":{\"AMP;\":[38],\"Acy;\":[1040],\"Afr;\":[120068],\"And;\":[10835],\"Auml\":[196],\"Bcy;\":[1041],\"Bfr;\":[120069],\"COPY\":[169],\"Cap;\":[8914],\"Cfr;\":[8493],\"Chi;\":[935],\"Cup;\":[8915],\"Dcy;\":[1044],\"Del;\":[8711],\"Dfr;\":[120071],\"Dot;\":[168],\"ENG;\":[330],\"ETH;\":[208],\"Ecy;\":[1069],\"Efr;\":[120072],\"Eta;\":[919],\"Euml\":[203],\"Fcy;\":[1060],\"Ffr;\":[120073],\"Gcy;\":[1043],\"Gfr;\":[120074],\"Hat;\":[94],\"Hfr;\":[8460],\"Icy;\":[1048],\"Ifr;\":[8465],\"Int;\":[8748],\"Iuml\":[207],\"Jcy;\":[1049],\"Jfr;\":[120077],\"Kcy;\":[1050],\"Kfr;\":[120078],\"Lcy;\":[1051],\"Lfr;\":[120079],\"Lsh;\":[8624],\"Map;\":[10501],\"Mcy;\":[1052],\"Mfr;\":[120080],\"Ncy;\":[1053],\"Nfr;\":[120081],\"Not;\":[10988],\"Ocy;\":[1054],\"Ofr;\":[120082],\"Ouml\":[214],\"Pcy;\":[1055],\"Pfr;\":[120083],\"Phi;\":[934],\"Psi;\":[936],\"QUOT\":[34],\"Qfr;\":[120084],\"REG;\":[174],\"Rcy;\":[1056],\"Rfr;\":[8476],\"Rho;\":[929],\"Rsh;\":[8625],\"Scy;\":[1057],\"Sfr;\":[120086],\"Sub;\":[8912],\"Sum;\":[8721],\"Sup;\":[8913],\"Tab;\":[9],\"Tau;\":[932],\"Tcy;\":[1058],\"Tfr;\":[120087],\"Ucy;\":[1059],\"Ufr;\":[120088],\"Uuml\":[220],\"Vcy;\":[1042],\"Vee;\":[8897],\"Vfr;\":[120089],\"Wfr;\":[120090],\"Xfr;\":[120091],\"Ycy;\":[1067],\"Yfr;\":[120092],\"Zcy;\":[1047],\"Zfr;\":[8488],\"acE;\":[8766,819],\"acd;\":[8767],\"acy;\":[1072],\"afr;\":[120094],\"amp;\":[38],\"and;\":[8743],\"ang;\":[8736],\"apE;\":[10864],\"ape;\":[8778],\"ast;\":[42],\"auml\":[228],\"bcy;\":[1073],\"bfr;\":[120095],\"bne;\":[61,8421],\"bot;\":[8869],\"cap;\":[8745],\"cent\":[162],\"cfr;\":[120096],\"chi;\":[967],\"cir;\":[9675],\"copy\":[169],\"cup;\":[8746],\"dcy;\":[1076],\"deg;\":[176],\"dfr;\":[120097],\"die;\":[168],\"div;\":[247],\"dot;\":[729],\"ecy;\":[1101],\"efr;\":[120098],\"egs;\":[10902],\"ell;\":[8467],\"els;\":[10901],\"eng;\":[331],\"eta;\":[951],\"eth;\":[240],\"euml\":[235],\"fcy;\":[1092],\"ffr;\":[120099],\"gEl;\":[10892],\"gap;\":[10886],\"gcy;\":[1075],\"gel;\":[8923],\"geq;\":[8805],\"ges;\":[10878],\"gfr;\":[120100],\"ggg;\":[8921],\"glE;\":[10898],\"gla;\":[10917],\"glj;\":[10916],\"gnE;\":[8809],\"gne;\":[10888],\"hfr;\":[120101],\"icy;\":[1080],\"iff;\":[8660],\"ifr;\":[120102],\"int;\":[8747],\"iuml\":[239],\"jcy;\":[1081],\"jfr;\":[120103],\"kcy;\":[1082],\"kfr;\":[120104],\"lEg;\":[10891],\"lap;\":[10885],\"lat;\":[10923],\"lcy;\":[1083],\"leg;\":[8922],\"leq;\":[8804],\"les;\":[10877],\"lfr;\":[120105],\"lgE;\":[10897],\"lnE;\":[8808],\"lne;\":[10887],\"loz;\":[9674],\"lrm;\":[8206],\"lsh;\":[8624],\"macr\":[175],\"map;\":[8614],\"mcy;\":[1084],\"mfr;\":[120106],\"mho;\":[8487],\"mid;\":[8739],\"nGg;\":[8921,824],\"nGt;\":[8811,8402],\"nLl;\":[8920,824],\"nLt;\":[8810,8402],\"nap;\":[8777],\"nbsp\":[160],\"ncy;\":[1085],\"nfr;\":[120107],\"ngE;\":[8807,824],\"nge;\":[8817],\"ngt;\":[8815],\"nis;\":[8956],\"niv;\":[8715],\"nlE;\":[8806,824],\"nle;\":[8816],\"nlt;\":[8814],\"not;\":[172],\"npr;\":[8832],\"nsc;\":[8833],\"num;\":[35],\"ocy;\":[1086],\"ofr;\":[120108],\"ogt;\":[10689],\"ohm;\":[937],\"olt;\":[10688],\"ord;\":[10845],\"ordf\":[170],\"ordm\":[186],\"orv;\":[10843],\"ouml\":[246],\"par;\":[8741],\"para\":[182],\"pcy;\":[1087],\"pfr;\":[120109],\"phi;\":[966],\"piv;\":[982],\"prE;\":[10931],\"pre;\":[10927],\"psi;\":[968],\"qfr;\":[120110],\"quot\":[34],\"rcy;\":[1088],\"reg;\":[174],\"rfr;\":[120111],\"rho;\":[961],\"rlm;\":[8207],\"rsh;\":[8625],\"scE;\":[10932],\"sce;\":[10928],\"scy;\":[1089],\"sect\":[167],\"sfr;\":[120112],\"shy;\":[173],\"sim;\":[8764],\"smt;\":[10922],\"sol;\":[47],\"squ;\":[9633],\"sub;\":[8834],\"sum;\":[8721],\"sup1\":[185],\"sup2\":[178],\"sup3\":[179],\"sup;\":[8835],\"tau;\":[964],\"tcy;\":[1090],\"tfr;\":[120113],\"top;\":[8868],\"ucy;\":[1091],\"ufr;\":[120114],\"uml;\":[168],\"uuml\":[252],\"vcy;\":[1074],\"vee;\":[8744],\"vfr;\":[120115],\"wfr;\":[120116],\"xfr;\":[120117],\"ycy;\":[1099],\"yen;\":[165],\"yfr;\":[120118],\"yuml\":[255],\"zcy;\":[1079],\"zfr;\":[120119],\"zwj;\":[8205]}},{\"length\":3,\"entities\":{\"AMP\":[38],\"DD;\":[8517],\"ETH\":[208],\"GT;\":[62],\"Gg;\":[8921],\"Gt;\":[8811],\"Im;\":[8465],\"LT;\":[60],\"Ll;\":[8920],\"Lt;\":[8810],\"Mu;\":[924],\"Nu;\":[925],\"Or;\":[10836],\"Pi;\":[928],\"Pr;\":[10939],\"REG\":[174],\"Re;\":[8476],\"Sc;\":[10940],\"Xi;\":[926],\"ac;\":[8766],\"af;\":[8289],\"amp\":[38],\"ap;\":[8776],\"dd;\":[8518],\"deg\":[176],\"ee;\":[8519],\"eg;\":[10906],\"el;\":[10905],\"eth\":[240],\"gE;\":[8807],\"ge;\":[8805],\"gg;\":[8811],\"gl;\":[8823],\"gt;\":[62],\"ic;\":[8291],\"ii;\":[8520],\"in;\":[8712],\"it;\":[8290],\"lE;\":[8806],\"le;\":[8804],\"lg;\":[8822],\"ll;\":[8810],\"lt;\":[60],\"mp;\":[8723],\"mu;\":[956],\"ne;\":[8800],\"ni;\":[8715],\"not\":[172],\"nu;\":[957],\"oS;\":[9416],\"or;\":[8744],\"pi;\":[960],\"pm;\":[177],\"pr;\":[8826],\"reg\":[174],\"rx;\":[8478],\"sc;\":[8827],\"shy\":[173],\"uml\":[168],\"wp;\":[8472],\"wr;\":[8768],\"xi;\":[958],\"yen\":[165]}},{\"length\":2,\"entities\":{\"GT\":[62],\"LT\":[60],\"gt\":[62],\"lt\":[60]}}]\n", "/**\n * @author Toru Nagashima <https://github.com/mysticatea>\n * @copyright 2017 Toru Nagashima. All rights reserved.\n * See LICENSE file in root directory for full license.\n */\n\nexport const EOF = -1\nexport const NULL = 0x00\nexport const TABULATION = 0x09\nexport const CARRIAGE_RETURN = 0x0D\nexport const LINE_FEED = 0x0A\nexport const FORM_FEED = 0x0C\nexport const SPACE = 0x20\nexport const EXCLAMATION_MARK = 0x21 // !\nexport const QUOTATION_MARK = 0x22 // \"\nexport const NUMBER_SIGN = 0x23 // #\nexport const AMPERSAND = 0x26 // &\nexport const APOSTROPHE = 0x27 // '\nexport const LEFT_PARENTHESIS = 0x28 // (\nexport const RIGHT_PARENTHESIS = 0x29 // )\nexport const ASTERISK = 0x2A // *\nexport const HYPHEN_MINUS = 0x2D // -\nexport const SOLIDUS = 0x2F // /\nexport const DIGIT_0 = 0x30\nexport const DIGIT_9 = 0x39\nexport const COLON = 0x3a // :\nexport const SEMICOLON = 0x3B // ;\nexport const LESS_THAN_SIGN = 0x3C // <\nexport const EQUALS_SIGN = 0x3D // =\nexport const GREATER_THAN_SIGN = 0x3E // >\nexport const QUESTION_MARK = 0x3F // ?\nexport const LATIN_CAPITAL_A = 0x41\nexport const LATIN_CAPITAL_D = 0x44\nexport const LATIN_CAPITAL_F = 0x46\nexport const LATIN_CAPITAL_X = 0x58\nexport const LATIN_CAPITAL_Z = 0x5A\nexport const LEFT_SQUARE_BRACKET = 0x5B // [\nexport const REVERSE_SOLIDUS = 0x5C // \\\nexport const RIGHT_SQUARE_BRACKET = 0x5D // ]\nexport const GRAVE_ACCENT = 0x60 // `\nexport const LATIN_SMALL_A = 0x61\nexport const LATIN_SMALL_F = 0x66\nexport const LATIN_SMALL_X = 0x78\nexport const LATIN_SMALL_Z = 0x7A\nexport const LEFT_CURLY_BRACKET = 0x7B // {\nexport const RIGHT_CURLY_BRACKET = 0x7D // }\nexport const NULL_REPLACEMENT = 0xFFFD\n\n/**\n * Check whether the code point is a whitespace.\n * @param cp The code point to check.\n * @returns `true` if the code point is a whitespace.\n */\nexport function isWhitespace(cp: number): boolean {\n return cp === TABULATION || cp === LINE_FEED || cp === FORM_FEED || cp === CARRIAGE_RETURN || cp === SPACE\n}\n\n/**\n * Check whether the code point is an uppercase letter character.\n * @param cp The code point to check.\n * @returns `true` if the code point is an uppercase letter character.\n */\nexport function isUpperLetter(cp: number): boolean {\n return cp >= LATIN_CAPITAL_A && cp <= LATIN_CAPITAL_Z\n}\n\n/**\n * Check whether the code point is a lowercase letter character.\n * @param cp The code point to check.\n * @returns `true` if the code point is a lowercase letter character.\n */\nexport function isLowerLetter(cp: number): boolean {\n return cp >= LATIN_SMALL_A && cp <= LATIN_SMALL_Z\n}\n\n/**\n * Check whether the code point is a letter character.\n * @param cp The code point to check.\n * @returns `true` if the code point is a letter character.\n */\nexport function isLetter(cp: number): boolean {\n return isLowerLetter(cp) || isUpperLetter(cp)\n}\n\n/**\n * Check whether the code point is a digit character.\n * @param cp The code point to check.\n * @returns `true` if the code point is a digit character.\n */\nexport function isDigit(cp: number): boolean {\n return cp >= DIGIT_0 && cp <= DIGIT_9\n}\n\n/**\n * Check whether the code point is a digit character.\n * @param cp The code point to check.\n * @returns `true` if the code point is a digit character.\n */\nexport function isUpperHexDigit(cp: number): boolean {\n return cp >= LATIN_CAPITAL_A && cp <= LATIN_CAPITAL_F\n}\n\n/**\n * Check whether the code point is a digit character.\n * @param cp The code point to check.\n * @returns `true` if the code point is a digit character.\n */\nexport function isLowerHexDigit(cp: number): boolean {\n return cp >= LATIN_SMALL_A && cp <= LATIN_SMALL_F\n}\n\n/**\n * Check whether the code point is a digit character.\n * @param cp The code point to check.\n * @returns `true` if the code point is a digit character.\n */\nexport function isHexDigit(cp: number): boolean {\n return isDigit(cp) || isUpperHexDigit(cp) || isLowerHexDigit(cp)\n}\n\n/**\n * Check whether the code point is a control character.\n * @param cp The code point to check.\n * @returns `true` if the code point is a control character.\n */\nexport function isControl(cp: number): boolean {\n return (cp >= 0 && cp <= 0x1F) || (cp >= 0x7F && cp <= 0x9F)\n}\n\n/**\n * Check whether the code point is a surrogate character.\n * @param cp The code point to check.\n * @returns `true` if the code point is a surrogate character.\n */\nexport function isSurrogate(cp: number): boolean {\n return cp >= 0xD800 && cp <= 0xDFFF\n}\n\n/**\n * Check whether the code point is a surrogate pair character.\n * @param cp The code point to check.\n * @returns `true` if the code point is a surrogate pair character.\n */\nexport function isSurrogatePair(cp: number): boolean {\n return cp >= 0xDC00 && cp <= 0xDFFF\n}\n\n/**\n * Check whether the code point is a surrogate character.\n * @param cp The code point to check.\n * @returns `true` if the code point is a surrogate character.\n */\nexport function isNonCharacter(cp: number): boolean {\n return (\n (cp >= 0xFDD0 && cp <= 0xFDEF) ||\n ((cp & 0xFFFE) === 0xFFFE && cp <= 0x10FFFF)\n )\n}\n\n// export function isReservedCodePoint(cp: number): boolean {\n// return (cp >= 0xD800 && cp <= 0xDFFF) || cp > 0x10FFFF\n// }\n\n/**\n * Convert the given character to lowercases.\n * @param cp The code point to convert.\n * @returns Converted code point.\n */\nexport function toLowerCodePoint(cp: number): number {\n return cp + 0x0020\n}\n", "/**\n * @author Toru Nagashima <https://github.com/mysticatea>\n * @copyright 2017 Toru Nagashima. All rights reserved.\n * See LICENSE file in root directory for full license.\n */\n\n/*eslint-disable no-constant-condition, no-param-reassign */\n\nimport assert from \"assert\"\nimport { debug } from \"../common/debug\"\nimport type { ErrorCode, Namespace, Token } from \"../ast\"\nimport { NS, ParseError } from \"../ast\"\nimport { alternativeCR } from \"./util/alternative-cr\"\nimport { entitySets } from \"./util/entities\"\nimport {\n AMPERSAND,\n APOSTROPHE,\n CARRIAGE_RETURN,\n EOF,\n EQUALS_SIGN,\n EXCLAMATION_MARK,\n GRAVE_ACCENT,\n GREATER_THAN_SIGN,\n HYPHEN_MINUS,\n isControl,\n isDigit,\n isHexDigit,\n isLetter,\n isLowerHexDigit,\n isNonCharacter,\n isSurrogate,\n isSurrogatePair,\n isUpperHexDigit,\n isUpperLetter,\n isWhitespace,\n LATIN_CAPITAL_D,\n LATIN_CAPITAL_X,\n LATIN_SMALL_X,\n LEFT_CURLY_BRACKET,\n LEFT_SQUARE_BRACKET,\n LESS_THAN_SIGN,\n LINE_FEED,\n NULL,\n NULL_REPLACEMENT,\n NUMBER_SIGN,\n QUESTION_MARK,\n QUOTATION_MARK,\n RIGHT_CURLY_BRACKET,\n RIGHT_SQUARE_BRACKET,\n SEMICOLON,\n SOLIDUS,\n toLowerCodePoint,\n} from \"./util/unicode\"\nimport type { ParserOptions } from \"../common/parser-options\"\n\n/**\n * Enumeration of token types.\n */\nexport type TokenType =\n | \"HTMLAssociation\"\n | \"HTMLBogusComment\"\n | \"HTMLCDataText\"\n | \"HTMLComment\"\n | \"HTMLEndTagOpen\"\n | \"HTMLIdentifier\"\n | \"HTMLLiteral\"\n | \"HTMLRCDataText\"\n | \"HTMLRawText\"\n | \"HTMLSelfClosingTagClose\"\n | \"HTMLTagClose\"\n | \"HTMLTagOpen\"\n | \"HTMLText\"\n | \"HTMLWhitespace\"\n | \"VExpressionStart\"\n | \"VExpressionEnd\"\n\n/**\n * Enumeration of tokenizer's state types.\n */\nexport type TokenizerState =\n | \"DATA\"\n | \"TAG_OPEN\"\n | \"END_TAG_OPEN\"\n | \"TAG_NAME\"\n | \"RCDATA\"\n | \"RCDATA_LESS_THAN_SIGN\"\n | \"RCDATA_END_TAG_OPEN\"\n | \"RCDATA_END_TAG_NAME\"\n | \"RAWTEXT\"\n | \"RAWTEXT_LESS_THAN_SIGN\"\n | \"RAWTEXT_END_TAG_OPEN\"\n | \"RAWTEXT_END_TAG_NAME\"\n | \"BEFORE_ATTRIBUTE_NAME\"\n | \"ATTRIBUTE_NAME\"\n | \"AFTER_ATTRIBUTE_NAME\"\n | \"BEFORE_ATTRIBUTE_VALUE\"\n | \"ATTRIBUTE_VALUE_DOUBLE_QUOTED\"\n | \"ATTRIBUTE_VALUE_SINGLE_QUOTED\"\n | \"ATTRIBUTE_VALUE_UNQUOTED\"\n | \"AFTER_ATTRIBUTE_VALUE_QUOTED\"\n | \"SELF_CLOSING_START_TAG\"\n | \"BOGUS_COMMENT\"\n | \"MARKUP_DECLARATION_OPEN\"\n | \"COMMENT_START\"\n | \"COMMENT_START_DASH\"\n | \"COMMENT\"\n | \"COMMENT_LESS_THAN_SIGN\"\n | \"COMMENT_LESS_THAN_SIGN_BANG\"\n | \"COMMENT_LESS_THAN_SIGN_BANG_DASH\"\n | \"COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH\"\n | \"COMMENT_END_DASH\"\n | \"COMMENT_END\"\n | \"COMMENT_END_BANG\"\n | \"CDATA_SECTION\"\n | \"CDATA_SECTION_BRACKET\"\n | \"CDATA_SECTION_END\"\n | \"CHARACTER_REFERENCE\"\n | \"NAMED_CHARACTER_REFERENCE\"\n | \"AMBIGUOUS_AMPERSAND\"\n | \"NUMERIC_CHARACTER_REFERENCE\"\n | \"HEXADEMICAL_CHARACTER_REFERENCE_START\"\n | \"DECIMAL_CHARACTER_REFERENCE_START\"\n | \"HEXADEMICAL_CHARACTER_REFERENCE\"\n | \"DECIMAL_CHARACTER_REFERENCE\"\n | \"NUMERIC_CHARACTER_REFERENCE_END\"\n | \"CHARACTER_REFERENCE_END\"\n | \"V_EXPRESSION_START\"\n | \"V_EXPRESSION_DATA\"\n | \"V_EXPRESSION_END\"\n// ---- Use RAWTEXT state for <script> elements instead ----\n// \"SCRIPT_DATA\" |\n// \"SCRIPT_DATA_LESS_THAN_SIGN\" |\n// \"SCRIPT_DATA_END_TAG_OPEN\" |\n// \"SCRIPT_DATA_END_TAG_NAME\" |\n// \"SCRIPT_DATA_ESCAPE_START\" |\n// \"SCRIPT_DATA_ESCAPE_START_DASH\" |\n// \"SCRIPT_DATA_ESCAPED\" |\n// \"SCRIPT_DATA_ESCAPED_DASH\" |\n// \"SCRIPT_DATA_ESCAPED_DASH_DASH\" |\n// \"SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN\" |\n// \"SCRIPT_DATA_ESCAPED_END_TAG_OPEN\" |\n// \"SCRIPT_DATA_ESCAPED_END_TAG_NAME\" |\n// \"SCRIPT_DATA_DOUBLE_ESCAPE_START\" |\n// \"SCRIPT_DATA_DOUBLE_ESCAPED\" |\n// \"SCRIPT_DATA_DOUBLE_ESCAPED_DASH\" |\n// \"SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH\" |\n// \"SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN\" |\n// \"SCRIPT_DATA_DOUBLE_ESCAPE_END\" |\n// ---- Use BOGUS_COMMENT state for DOCTYPEs instead ----\n// \"DOCTYPE\" |\n// \"DOCTYPE_NAME\" |\n// \"AFTER_DOCTYPE_NAME\" |\n// \"BEFORE_DOCTYPE_PUBLIC_IDENTIFIER\" |\n// \"DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED\" |\n// \"DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED\" |\n// \"BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS\" |\n// \"BEFORE_DOCTYPE_SYSTEM_IDENTIFIER\" |\n// \"DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED\" |\n// \"DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED\" |\n// \"AFTER_DOCTYPE_SYSTEM_IDENTIFIER\" |\n// \"BOGUS_DOCTYPE\"\n\n/**\n * Tokenizer for HTML.\n */\nexport class Tokenizer {\n // Reading\n public readonly text: string\n public readonly gaps: number[]\n public readonly lineTerminators: number[]\n private readonly parserOptions: ParserOptions\n private lastCodePoint: number\n private lastCodePointRaw: number\n private offset: number\n private column: number\n private line: number\n\n // Tokenizing\n private returnState: TokenizerState\n private vExpressionScriptState: { state: TokenizerState } | null = null\n private reconsuming: boolean\n private buffer: number[]\n private crStartOffset: number\n private crCode: number\n private committedToken: Token | null\n private provisionalToken: Token | null // can be rollbacked.\n private currentToken: Token | null\n private lastTagOpenToken: Token | null\n private tokenStartOffset: number\n private tokenStartLine: number\n private tokenStartColumn: number\n\n /**\n * The current state.\n */\n public state: TokenizerState\n\n /**\n * Syntax errors.\n */\n public errors: ParseError[]\n\n /**\n * The current namespace.\n */\n public namespace: Namespace\n\n /**\n * The flag which enables expression tokens.\n * If this is true, this tokenizer will generate V_EXPRESSION_START and V_EXPRESSION_END tokens.\n */\n public expressionEnabled: boolean\n\n /**\n * Initialize this tokenizer.\n * @param text The source code to tokenize.\n * @param parserOptions The parser options.\n */\n public constructor(text: string, parserOptions?: ParserOptions) {\n debug(\"[html] the source code length: %d\", text.length)\n this.text = text\n this.gaps = []\n this.lineTerminators = []\n this.parserOptions = parserOptions || {}\n this.lastCodePoint = this.lastCodePointRaw = NULL\n this.offset = -1\n this.column = -1\n this.line = 1\n this.state = \"DATA\"\n this.returnState = \"DATA\"\n this.reconsuming = false\n this.buffer = []\n this.crStartOffset = -1\n this.crCode = 0\n this.errors = []\n this.committedToken = null\n this.provisionalToken = null\n this.currentToken = null\n this.lastTagOpenToken = null\n this.tokenStartOffset = -1\n this.tokenStartColumn = -1\n this.tokenStartLine = 1\n this.namespace = NS.HTML\n this.expressionEnabled = false\n }\n\n /**\n * Get the next token.\n * @returns The next token or null.\n */\n public nextToken(): Token | null {\n let cp = this.lastCodePoint\n while (\n this.committedToken == null &&\n (cp !== EOF || this.reconsuming)\n ) {\n if (this.provisionalToken != null && !this.isProvisionalState()) {\n this.commitProvisionalToken()\n if (this.committedToken != null) {\n break\n }\n }\n\n if (this.reconsuming) {\n this.reconsuming = false\n cp = this.lastCodePoint\n } else {\n cp = this.consumeNextCodePoint()\n }\n\n debug(\"[html] parse\", cp, this.state)\n this.state = this[this.state](cp)\n }\n\n {\n const token = this.consumeCommittedToken()\n if (token != null) {\n return token\n }\n }\n\n assert(cp === EOF)\n\n if (this.currentToken != null) {\n this.endToken()\n\n const token = this.consumeCommittedToken()\n if (token != null) {\n return token\n }\n }\n return this.currentToken\n }\n\n /**\n * Consume the last committed token.\n * @returns The last committed token.\n */\n private consumeCommittedToken(): Token | null {\n const token = this.committedToken\n this.committedToken = null\n return token\n }\n\n /**\n * Consume the next code point.\n * @returns The consumed code point.\n */\n private consumeNextCodePoint(): number {\n if (this.offset >= this.text.length) {\n this.lastCodePoint = this.lastCodePointRaw = EOF\n return EOF\n }\n\n this.offset += this.lastCodePoint >= 0x10000 ? 2 : 1\n if (this.offset >= this.text.length) {\n this.advanceLocation()\n this.lastCodePoint = this.lastCodePointRaw = EOF\n return EOF\n }\n\n const cp = this.text.codePointAt(this.offset) as number\n\n if (\n isSurrogate(this.text.charCodeAt(this.offset)) &&\n !isSurrogatePair(this.text.charCodeAt(this.offset + 1))\n ) {\n this.reportParseError(\"surrogate-in-input-stream\")\n }\n if (isNonCharacter(cp)) {\n this.reportParseError(\"noncharacter-in-input-stream\")\n }\n if (isControl(cp) && !isWhitespace(cp) && cp !== NULL) {\n this.reportParseError(\"control-character-in-input-stream\")\n }\n\n // Skip LF to convert CRLF → LF.\n if (this.lastCodePointRaw === CARRIAGE_RETURN && cp === LINE_FEED) {\n this.lastCodePoint = this.lastCodePointRaw = LINE_FEED\n this.gaps.push(this.offset)\n return this.consumeNextCodePoint()\n }\n\n // Update locations.\n this.advanceLocation()\n this.lastCodePoint = this.lastCodePointRaw = cp\n\n // To convert CRLF → LF.\n if (cp === CARRIAGE_RETURN) {\n this.lastCodePoint = LINE_FEED\n return LINE_FEED\n }\n\n return cp\n }\n\n /**\n * Advance the current line and column.\n */\n private advanceLocation(): void {\n if (this.lastCodePointRaw === LINE_FEED) {\n this.lineTerminators.push(this.offset)\n this.line += 1\n this.column = 0\n } else {\n this.column += this.lastCodePoint >= 0x10000 ? 2 : 1\n }\n }\n\n /**\n * Directive reconsuming the current code point as the given state.\n * @param state The next state.\n * @returns The next state.\n */\n private reconsumeAs(state: TokenizerState): TokenizerState {\n this.reconsuming = true\n return state\n }\n\n /**\n * Report an invalid character error.\n * @param code The error code.\n */\n private reportParseError(code: ErrorCode): void {\n const error = ParseError.fromCode(\n code,\n this.offset,\n this.line,\n this.column,\n )\n this.errors.push(error)\n\n debug(\"[html] syntax error:\", error.message)\n }\n\n /**\n * Mark the current location as a start of tokens.\n */\n private setStartTokenMark(): void {\n this.tokenStartOffset = this.offset\n this.tokenStartLine = this.line\n this.tokenStartColumn = this.column\n }\n\n /**\n * Mark the current location as a start of tokens.\n */\n private clearStartTokenMark(): void {\n this.tokenStartOffset = -1\n }\n\n /**\n * Start new token.\n * @param type The type of new token.\n * @returns The new token.\n */\n private startToken(type: TokenType): Token {\n if (this.tokenStartOffset === -1) {\n this.setStartTokenMark()\n }\n const offset = this.tokenStartOffset\n const line = this.tokenStartLine\n const column = this.tokenStartColumn\n\n if (this.currentToken != null) {\n this.endToken()\n }\n this.tokenStartOffset = -1\n\n const token = (this.currentToken = {\n type,\n range: [offset, -1],\n loc: {\n start: { line, column },\n end: { line: -1, column: -1 },\n },\n value: \"\",\n })\n\n debug(\"[html] start token: %d %s\", offset, token.type)\n return this.currentToken\n }\n\n /**\n * Commit the current token.\n * @returns The ended token.\n */\n private endToken(): Token | null {\n if (this.currentToken == null) {\n throw new Error(\"Invalid state\")\n }\n if (this.tokenStartOffset === -1) {\n this.setStartTokenMark()\n }\n const token = this.currentToken\n const offset = this.tokenStartOffset\n const line = this.tokenStartLine\n const column = this.tokenStartColumn\n const provisional = this.isProvisionalState()\n\n this.currentToken = null\n this.tokenStartOffset = -1\n\n token.range[1] = offset\n token.loc.end.line = line\n token.loc.end.column = column\n\n if (token.range[0] === offset && !provisional) {\n debug(\n \"[html] abandon token: %j %s %j\",\n token.range,\n token.type,\n token.value,\n )\n return null\n }\n\n if (provisional) {\n if (this.provisionalToken != null) {\n this.commitProvisionalToken()\n }\n this.provisionalToken = token\n debug(\n \"[html] provisional-commit token: %j %s %j\",\n token.range,\n token.type,\n token.value,\n )\n } else {\n this.commitToken(token)\n }\n\n return token\n }\n\n /**\n * Commit the given token.\n * @param token The token to commit.\n */\n private commitToken(token: Token): void {\n assert(\n this.committedToken == null,\n \"Invalid state: the commited token existed already.\",\n )\n debug(\n \"[html] commit token: %j %j %s %j\",\n token.range,\n token.loc,\n token.type,\n token.value,\n )\n\n this.committedToken = token\n if (token.type === \"HTMLTagOpen\") {\n this.lastTagOpenToken = token\n }\n }\n\n /**\n * Check whether this is provisional state or not.\n * @returns `true` if this is provisional state.\n */\n private isProvisionalState(): boolean {\n return (\n this.state.startsWith(\"RCDATA_\") ||\n this.state.startsWith(\"RAWTEXT_\")\n )\n }\n\n /**\n * Commit the last provisional committed token.\n */\n private commitProvisionalToken(): void {\n assert(\n this.provisionalToken != null,\n \"Invalid state: the provisional token was not found.\",\n )\n\n const token = this.provisionalToken\n this.provisionalToken = null\n\n if (token.range[0] < token.range[1]) {\n this.commitToken(token)\n }\n }\n\n /**\n * Cancel the current token and set the last provisional committed token as the current token.\n */\n private rollbackProvisionalToken(): void {\n assert(this.currentToken != null)\n assert(this.provisionalToken != null)\n\n const token = this.currentToken\n debug(\"[html] rollback token: %d %s\", token.range[0], token.type)\n\n this.currentToken = this.provisionalToken\n this.provisionalToken = null\n }\n\n /**\n * Append the given code point into the value of the current token.\n * @param cp The code point to append.\n * @param expected The expected type of the current token.\n */\n private appendTokenValue(cp: number, expected: TokenType | null): void {\n const token = this.currentToken\n if (token == null || (expected != null && token.type !== expected)) {\n const msg1 = expected ? `\"${expected}\" type` : \"any token\"\n const msg2 = token ? `\"${token.type}\" type` : \"no token\"\n\n throw new Error(\n `Tokenizer: Invalid state. Expected ${msg1}, but got ${msg2}.`,\n )\n }\n\n token.value += String.fromCodePoint(cp)\n }\n\n /**\n * Check whether the current token is appropriate `HTMLEndTagOpen` token.\n * @returns {boolean} `true` if the current token is appropriate `HTMLEndTagOpen` token.\n */\n private isAppropriateEndTagOpen(): boolean {\n return (\n this.currentToken != null &&\n this.lastTagOpenToken != null &&\n this.currentToken.type === \"HTMLEndTagOpen\" &&\n this.currentToken.value === this.lastTagOpenToken.value\n )\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/syntax.html#data-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected DATA(cp: number): TokenizerState {\n this.clearStartTokenMark()\n\n while (true) {\n const type = isWhitespace(cp) ? \"HTMLWhitespace\" : \"HTMLText\"\n if (this.currentToken != null && this.currentToken.type !== type) {\n this.endToken()\n return this.reconsumeAs(this.state)\n }\n if (this.currentToken == null) {\n this.startToken(type)\n }\n\n if (cp === AMPERSAND) {\n this.returnState = \"DATA\"\n return \"CHARACTER_REFERENCE\"\n }\n if (cp === LESS_THAN_SIGN) {\n this.setStartTokenMark()\n return \"TAG_OPEN\"\n }\n if (cp === LEFT_CURLY_BRACKET && this.expressionEnabled) {\n this.setStartTokenMark()\n this.returnState = \"DATA\"\n return \"V_EXPRESSION_START\"\n }\n if (cp === RIGHT_CURLY_BRACKET && this.expressionEnabled) {\n this.setStartTokenMark()\n this.returnState = \"DATA\"\n return \"V_EXPRESSION_END\"\n }\n if (cp === EOF) {\n return \"DATA\"\n }\n\n if (cp === NULL) {\n this.reportParseError(\"unexpected-null-character\")\n }\n this.appendTokenValue(cp, type)\n\n cp = this.consumeNextCodePoint()\n }\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/syntax.html#rcdata-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected RCDATA(cp: number): TokenizerState {\n this.clearStartTokenMark()\n\n while (true) {\n const type = isWhitespace(cp) ? \"HTMLWhitespace\" : \"HTMLRCDataText\"\n if (this.currentToken != null && this.currentToken.type !== type) {\n this.endToken()\n return this.reconsumeAs(this.state)\n }\n if (this.currentToken == null) {\n this.startToken(type)\n }\n\n if (cp === AMPERSAND) {\n this.returnState = \"RCDATA\"\n return \"CHARACTER_REFERENCE\"\n }\n if (cp === LESS_THAN_SIGN) {\n this.setStartTokenMark()\n return \"RCDATA_LESS_THAN_SIGN\"\n }\n if (cp === LEFT_CURLY_BRACKET && this.expressionEnabled) {\n this.setStartTokenMark()\n this.returnState = \"RCDATA\"\n return \"V_EXPRESSION_START\"\n }\n if (cp === RIGHT_CURLY_BRACKET && this.expressionEnabled) {\n this.setStartTokenMark()\n this.returnState = \"RCDATA\"\n return \"V_EXPRESSION_END\"\n }\n if (cp === EOF) {\n return \"DATA\"\n }\n\n if (cp === NULL) {\n this.reportParseError(\"unexpected-null-character\")\n cp = NULL_REPLACEMENT\n }\n this.appendTokenValue(cp, type)\n\n cp = this.consumeNextCodePoint()\n }\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/syntax.html#rawtext-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected RAWTEXT(cp: number): TokenizerState {\n this.clearStartTokenMark()\n\n while (true) {\n const type = isWhitespace(cp) ? \"HTMLWhitespace\" : \"HTMLRawText\"\n if (this.currentToken != null && this.currentToken.type !== type) {\n this.endToken()\n return this.reconsumeAs(this.state)\n }\n if (this.currentToken == null) {\n this.startToken(type)\n }\n\n if (cp === LESS_THAN_SIGN) {\n this.setStartTokenMark()\n return \"RAWTEXT_LESS_THAN_SIGN\"\n }\n if (cp === LEFT_CURLY_BRACKET && this.expressionEnabled) {\n this.setStartTokenMark()\n this.returnState = \"RAWTEXT\"\n return \"V_EXPRESSION_START\"\n }\n if (cp === RIGHT_CURLY_BRACKET && this.expressionEnabled) {\n this.setStartTokenMark()\n this.returnState = \"RAWTEXT\"\n return \"V_EXPRESSION_END\"\n }\n if (cp === EOF) {\n return \"DATA\"\n }\n\n if (cp === NULL) {\n this.reportParseError(\"unexpected-null-character\")\n cp = NULL_REPLACEMENT\n }\n this.appendTokenValue(cp, type)\n\n cp = this.consumeNextCodePoint()\n }\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/syntax.html#tag-open-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected TAG_OPEN(cp: number): TokenizerState {\n if (cp === EXCLAMATION_MARK) {\n return \"MARKUP_DECLARATION_OPEN\"\n }\n if (cp === SOLIDUS) {\n return \"END_TAG_OPEN\"\n }\n if (isLetter(cp)) {\n this.startToken(\"HTMLTagOpen\")\n return this.reconsumeAs(\"TAG_NAME\")\n }\n if (cp === QUESTION_MARK) {\n this.reportParseError(\n \"unexpected-question-mark-instead-of-tag-name\",\n )\n this.startToken(\"HTMLBogusComment\")\n return this.reconsumeAs(\"BOGUS_COMMENT\")\n }\n if (cp === EOF) {\n this.clearStartTokenMark()\n this.reportParseError(\"eof-before-tag-name\")\n this.appendTokenValue(LESS_THAN_SIGN, \"HTMLText\")\n return \"DATA\"\n }\n\n this.reportParseError(\"invalid-first-character-of-tag-name\")\n this.appendTokenValue(LESS_THAN_SIGN, \"HTMLText\")\n return this.reconsumeAs(\"DATA\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/syntax.html#end-tag-open-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected END_TAG_OPEN(cp: number): TokenizerState {\n if (isLetter(cp)) {\n this.startToken(\"HTMLEndTagOpen\")\n return this.reconsumeAs(\"TAG_NAME\")\n }\n if (cp === GREATER_THAN_SIGN) {\n this.endToken() // < Commit or abandon the current text token.\n this.reportParseError(\"missing-end-tag-name\")\n return \"DATA\"\n }\n if (cp === EOF) {\n this.clearStartTokenMark()\n this.reportParseError(\"eof-before-tag-name\")\n this.appendTokenValue(LESS_THAN_SIGN, \"HTMLText\")\n this.appendTokenValue(SOLIDUS, \"HTMLText\")\n return \"DATA\"\n }\n\n this.reportParseError(\"invalid-first-character-of-tag-name\")\n this.startToken(\"HTMLBogusComment\")\n return this.reconsumeAs(\"BOGUS_COMMENT\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/syntax.html#tag-name-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected TAG_NAME(cp: number): TokenizerState {\n while (true) {\n if (isWhitespace(cp)) {\n this.endToken()\n return \"BEFORE_ATTRIBUTE_NAME\"\n }\n if (cp === SOLIDUS) {\n this.endToken()\n this.setStartTokenMark()\n return \"SELF_CLOSING_START_TAG\"\n }\n if (cp === GREATER_THAN_SIGN) {\n this.startToken(\"HTMLTagClose\")\n return \"DATA\"\n }\n if (cp === EOF) {\n this.reportParseError(\"eof-in-tag\")\n return \"DATA\"\n }\n if (cp === NULL) {\n this.reportParseError(\"unexpected-null-character\")\n cp = NULL_REPLACEMENT\n }\n\n this.appendTokenValue(\n isUpperLetter(cp) ? toLowerCodePoint(cp) : cp,\n null,\n )\n\n cp = this.consumeNextCodePoint()\n }\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/syntax.html#rcdata-less-than-sign-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected RCDATA_LESS_THAN_SIGN(cp: number): TokenizerState {\n if (cp === SOLIDUS) {\n this.buffer = []\n return \"RCDATA_END_TAG_OPEN\"\n }\n\n this.appendTokenValue(LESS_THAN_SIGN, \"HTMLRCDataText\")\n return this.reconsumeAs(\"RCDATA\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/syntax.html#rcdata-end-tag-open-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected RCDATA_END_TAG_OPEN(cp: number): TokenizerState {\n if (isLetter(cp)) {\n this.startToken(\"HTMLEndTagOpen\")\n return this.reconsumeAs(\"RCDATA_END_TAG_NAME\")\n }\n\n this.appendTokenValue(LESS_THAN_SIGN, \"HTMLRCDataText\")\n this.appendTokenValue(SOLIDUS, \"HTMLRCDataText\")\n return this.reconsumeAs(\"RCDATA\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/syntax.html#rcdata-end-tag-name-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected RCDATA_END_TAG_NAME(cp: number): TokenizerState {\n while (true) {\n if (isWhitespace(cp) && this.isAppropriateEndTagOpen()) {\n this.endToken()\n return \"BEFORE_ATTRIBUTE_NAME\"\n }\n if (cp === SOLIDUS && this.isAppropriateEndTagOpen()) {\n this.endToken()\n this.setStartTokenMark()\n return \"SELF_CLOSING_START_TAG\"\n }\n if (cp === GREATER_THAN_SIGN && this.isAppropriateEndTagOpen()) {\n this.startToken(\"HTMLTagClose\")\n return \"DATA\"\n }\n if (!isLetter(cp)) {\n this.rollbackProvisionalToken()\n this.appendTokenValue(LESS_THAN_SIGN, \"HTMLRCDataText\")\n this.appendTokenValue(SOLIDUS, \"HTMLRCDataText\")\n for (const cp1 of this.buffer) {\n this.appendTokenValue(cp1, \"HTMLRCDataText\")\n }\n return this.reconsumeAs(\"RCDATA\")\n }\n\n this.appendTokenValue(\n isUpperLetter(cp) ? toLowerCodePoint(cp) : cp,\n \"HTMLEndTagOpen\",\n )\n this.buffer.push(cp)\n\n cp = this.consumeNextCodePoint()\n }\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/syntax.html#rawtext-less-than-sign-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected RAWTEXT_LESS_THAN_SIGN(cp: number): TokenizerState {\n if (cp === SOLIDUS) {\n this.buffer = []\n return \"RAWTEXT_END_TAG_OPEN\"\n }\n\n this.appendTokenValue(LESS_THAN_SIGN, \"HTMLRawText\")\n return this.reconsumeAs(\"RAWTEXT\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/syntax.html#rawtext-end-tag-open-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected RAWTEXT_END_TAG_OPEN(cp: number): TokenizerState {\n if (isLetter(cp)) {\n this.startToken(\"HTMLEndTagOpen\")\n return this.reconsumeAs(\"RAWTEXT_END_TAG_NAME\")\n }\n\n this.appendTokenValue(LESS_THAN_SIGN, \"HTMLRawText\")\n this.appendTokenValue(SOLIDUS, \"HTMLRawText\")\n return this.reconsumeAs(\"RAWTEXT\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/syntax.html#rawtext-end-tag-name-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected RAWTEXT_END_TAG_NAME(cp: number): TokenizerState {\n while (true) {\n if (cp === SOLIDUS && this.isAppropriateEndTagOpen()) {\n this.endToken()\n this.setStartTokenMark()\n return \"SELF_CLOSING_START_TAG\"\n }\n if (cp === GREATER_THAN_SIGN && this.isAppropriateEndTagOpen()) {\n this.startToken(\"HTMLTagClose\")\n return \"DATA\"\n }\n if (isWhitespace(cp) && this.isAppropriateEndTagOpen()) {\n this.endToken()\n return \"BEFORE_ATTRIBUTE_NAME\"\n }\n if (!isLetter(cp) && !maybeValidCustomBlock.call(this, cp)) {\n this.rollbackProvisionalToken()\n this.appendTokenValue(LESS_THAN_SIGN, \"HTMLRawText\")\n this.appendTokenValue(SOLIDUS, \"HTMLRawText\")\n for (const cp1 of this.buffer) {\n this.appendTokenValue(cp1, \"HTMLRawText\")\n }\n return this.reconsumeAs(\"RAWTEXT\")\n }\n\n this.appendTokenValue(\n isUpperLetter(cp) ? toLowerCodePoint(cp) : cp,\n \"HTMLEndTagOpen\",\n )\n this.buffer.push(cp)\n\n cp = this.consumeNextCodePoint()\n }\n\n function maybeValidCustomBlock(this: Tokenizer, nextCp: number) {\n return (\n this.currentToken &&\n this.lastTagOpenToken &&\n this.lastTagOpenToken.value.startsWith(\n this.currentToken.value + String.fromCodePoint(nextCp),\n )\n )\n }\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected BEFORE_ATTRIBUTE_NAME(cp: number): TokenizerState {\n while (isWhitespace(cp)) {\n cp = this.consumeNextCodePoint()\n }\n\n if (cp === SOLIDUS || cp === GREATER_THAN_SIGN || cp === EOF) {\n return this.reconsumeAs(\"AFTER_ATTRIBUTE_NAME\")\n }\n\n if (cp === EQUALS_SIGN) {\n this.reportParseError(\n \"unexpected-equals-sign-before-attribute-name\",\n )\n this.startToken(\"HTMLIdentifier\")\n this.appendTokenValue(cp, \"HTMLIdentifier\")\n return \"ATTRIBUTE_NAME\"\n }\n\n this.startToken(\"HTMLIdentifier\")\n return this.reconsumeAs(\"ATTRIBUTE_NAME\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#attribute-name-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected ATTRIBUTE_NAME(cp: number): TokenizerState {\n while (true) {\n if (\n isWhitespace(cp) ||\n cp === SOLIDUS ||\n cp === GREATER_THAN_SIGN ||\n cp === EOF\n ) {\n this.endToken()\n return this.reconsumeAs(\"AFTER_ATTRIBUTE_NAME\")\n }\n if (cp === EQUALS_SIGN) {\n this.startToken(\"HTMLAssociation\")\n return \"BEFORE_ATTRIBUTE_VALUE\"\n }\n\n if (cp === NULL) {\n this.reportParseError(\"unexpected-null-character\")\n cp = NULL_REPLACEMENT\n }\n if (\n cp === QUOTATION_MARK ||\n cp === APOSTROPHE ||\n cp === LESS_THAN_SIGN\n ) {\n this.reportParseError(\"unexpected-character-in-attribute-name\")\n }\n\n this.appendTokenValue(\n isUpperLetter(cp) ? toLowerCodePoint(cp) : cp,\n \"HTMLIdentifier\",\n )\n cp = this.consumeNextCodePoint()\n }\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#after-attribute-name-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected AFTER_ATTRIBUTE_NAME(cp: number): TokenizerState {\n while (isWhitespace(cp)) {\n cp = this.consumeNextCodePoint()\n }\n\n if (cp === SOLIDUS) {\n this.setStartTokenMark()\n return \"SELF_CLOSING_START_TAG\"\n }\n if (cp === EQUALS_SIGN) {\n this.startToken(\"HTMLAssociation\")\n return \"BEFORE_ATTRIBUTE_VALUE\"\n }\n if (cp === GREATER_THAN_SIGN) {\n this.startToken(\"HTMLTagClose\")\n return \"DATA\"\n }\n\n if (cp === EOF) {\n this.reportParseError(\"eof-in-tag\")\n return \"DATA\"\n }\n\n this.startToken(\"HTMLIdentifier\")\n return this.reconsumeAs(\"ATTRIBUTE_NAME\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-value-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected BEFORE_ATTRIBUTE_VALUE(cp: number): TokenizerState {\n this.endToken()\n\n while (isWhitespace(cp)) {\n cp = this.consumeNextCodePoint()\n }\n\n if (cp === GREATER_THAN_SIGN) {\n this.reportParseError(\"missing-attribute-value\")\n this.startToken(\"HTMLTagClose\")\n return \"DATA\"\n }\n\n this.startToken(\"HTMLLiteral\")\n if (cp === QUOTATION_MARK) {\n return \"ATTRIBUTE_VALUE_DOUBLE_QUOTED\"\n }\n if (cp === APOSTROPHE) {\n return \"ATTRIBUTE_VALUE_SINGLE_QUOTED\"\n }\n return this.reconsumeAs(\"ATTRIBUTE_VALUE_UNQUOTED\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#attribute-value-(double-quoted)-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected ATTRIBUTE_VALUE_DOUBLE_QUOTED(cp: number): TokenizerState {\n while (true) {\n if (cp === QUOTATION_MARK) {\n return \"AFTER_ATTRIBUTE_VALUE_QUOTED\"\n }\n if (cp === AMPERSAND) {\n this.returnState = \"ATTRIBUTE_VALUE_DOUBLE_QUOTED\"\n return \"CHARACTER_REFERENCE\"\n }\n\n if (cp === NULL) {\n this.reportParseError(\"unexpected-null-character\")\n cp = NULL_REPLACEMENT\n }\n if (cp === EOF) {\n this.reportParseError(\"eof-in-tag\")\n return \"DATA\"\n }\n\n this.appendTokenValue(cp, \"HTMLLiteral\")\n cp = this.consumeNextCodePoint()\n }\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#attribute-value-(single-quoted)-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected ATTRIBUTE_VALUE_SINGLE_QUOTED(cp: number): TokenizerState {\n while (true) {\n if (cp === APOSTROPHE) {\n return \"AFTER_ATTRIBUTE_VALUE_QUOTED\"\n }\n if (cp === AMPERSAND) {\n this.returnState = \"ATTRIBUTE_VALUE_SINGLE_QUOTED\"\n return \"CHARACTER_REFERENCE\"\n }\n\n if (cp === NULL) {\n this.reportParseError(\"unexpected-null-character\")\n cp = NULL_REPLACEMENT\n }\n if (cp === EOF) {\n this.reportParseError(\"eof-in-tag\")\n return \"DATA\"\n }\n\n this.appendTokenValue(cp, \"HTMLLiteral\")\n cp = this.consumeNextCodePoint()\n }\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#attribute-value-(unquoted)-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected ATTRIBUTE_VALUE_UNQUOTED(cp: number): TokenizerState {\n while (true) {\n if (isWhitespace(cp)) {\n this.endToken()\n return \"BEFORE_ATTRIBUTE_NAME\"\n }\n if (cp === AMPERSAND) {\n this.returnState = \"ATTRIBUTE_VALUE_UNQUOTED\"\n return \"CHARACTER_REFERENCE\"\n }\n if (cp === GREATER_THAN_SIGN) {\n this.startToken(\"HTMLTagClose\")\n return \"DATA\"\n }\n\n if (cp === NULL) {\n this.reportParseError(\"unexpected-null-character\")\n cp = NULL_REPLACEMENT\n }\n if (\n cp === QUOTATION_MARK ||\n cp === APOSTROPHE ||\n cp === LESS_THAN_SIGN ||\n cp === EQUALS_SIGN ||\n cp === GRAVE_ACCENT\n ) {\n this.reportParseError(\n \"unexpected-character-in-unquoted-attribute-value\",\n )\n }\n if (cp === EOF) {\n this.reportParseError(\"eof-in-tag\")\n return \"DATA\"\n }\n\n this.appendTokenValue(cp, \"HTMLLiteral\")\n cp = this.consumeNextCodePoint()\n }\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#after-attribute-value-(quoted)-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected AFTER_ATTRIBUTE_VALUE_QUOTED(cp: number): TokenizerState {\n this.endToken()\n\n if (isWhitespace(cp)) {\n return \"BEFORE_ATTRIBUTE_NAME\"\n }\n if (cp === SOLIDUS) {\n this.setStartTokenMark()\n return \"SELF_CLOSING_START_TAG\"\n }\n if (cp === GREATER_THAN_SIGN) {\n this.startToken(\"HTMLTagClose\")\n return \"DATA\"\n }\n\n if (cp === EOF) {\n this.reportParseError(\"eof-in-tag\")\n return \"DATA\"\n }\n\n this.reportParseError(\"missing-whitespace-between-attributes\")\n return this.reconsumeAs(\"BEFORE_ATTRIBUTE_NAME\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#self-closing-start-tag-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected SELF_CLOSING_START_TAG(cp: number): TokenizerState {\n if (cp === GREATER_THAN_SIGN) {\n this.startToken(\"HTMLSelfClosingTagClose\")\n\n // Vue.js supports self-closing elements.\n // So don't switch to RCDATA/RAWTEXT from any elements.\n return \"DATA\"\n }\n\n if (cp === EOF) {\n this.reportParseError(\"eof-in-tag\")\n return \"DATA\"\n }\n\n this.reportParseError(\"unexpected-solidus-in-tag\")\n this.clearStartTokenMark()\n return this.reconsumeAs(\"BEFORE_ATTRIBUTE_NAME\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#bogus-comment-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected BOGUS_COMMENT(cp: number): TokenizerState {\n while (true) {\n if (cp === GREATER_THAN_SIGN) {\n return \"DATA\"\n }\n\n if (cp === EOF) {\n return \"DATA\"\n }\n if (cp === NULL) {\n cp = NULL_REPLACEMENT\n }\n this.appendTokenValue(cp, null)\n\n cp = this.consumeNextCodePoint()\n }\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected MARKUP_DECLARATION_OPEN(cp: number): TokenizerState {\n if (cp === HYPHEN_MINUS && this.text[this.offset + 1] === \"-\") {\n this.offset += 1\n this.column += 1\n\n this.startToken(\"HTMLComment\")\n return \"COMMENT_START\"\n }\n if (\n cp === LATIN_CAPITAL_D &&\n this.text.slice(this.offset + 1, this.offset + 7) === \"OCTYPE\"\n ) {\n // It does not support DOCTYPE.\n // this.offset += 6\n // this.column += 6\n // return \"DOCTYPE\"\n\n // TODO\n this.startToken(\"HTMLBogusComment\")\n this.appendTokenValue(cp, \"HTMLBogusComment\")\n return \"BOGUS_COMMENT\"\n }\n if (\n cp === LEFT_SQUARE_BRACKET &&\n this.text.slice(this.offset + 1, this.offset + 7) === \"CDATA[\"\n ) {\n this.offset += 6\n this.column += 6\n\n if (this.namespace === NS.HTML) {\n this.reportParseError(\"cdata-in-html-content\")\n this.startToken(\"HTMLBogusComment\").value = \"[CDATA[\"\n return \"BOGUS_COMMENT\"\n }\n\n this.startToken(\"HTMLCDataText\")\n return \"CDATA_SECTION\"\n }\n\n this.reportParseError(\"incorrectly-opened-comment\")\n this.startToken(\"HTMLBogusComment\")\n return this.reconsumeAs(\"BOGUS_COMMENT\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#comment-start-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected COMMENT_START(cp: number): TokenizerState {\n if (cp === HYPHEN_MINUS) {\n return \"COMMENT_START_DASH\"\n }\n if (cp === GREATER_THAN_SIGN) {\n this.reportParseError(\"abrupt-closing-of-empty-comment\")\n return \"DATA\"\n }\n\n return this.reconsumeAs(\"COMMENT\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#comment-start-dash-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected COMMENT_START_DASH(cp: number): TokenizerState {\n if (cp === HYPHEN_MINUS) {\n return \"COMMENT_END\"\n }\n\n if (cp === GREATER_THAN_SIGN) {\n this.reportParseError(\"abrupt-closing-of-empty-comment\")\n return \"DATA\"\n }\n if (cp === EOF) {\n this.reportParseError(\"eof-in-comment\")\n return \"DATA\"\n }\n\n this.appendTokenValue(HYPHEN_MINUS, \"HTMLComment\")\n return this.reconsumeAs(\"COMMENT\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#comment-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected COMMENT(cp: number): TokenizerState {\n while (true) {\n if (cp === LESS_THAN_SIGN) {\n this.appendTokenValue(LESS_THAN_SIGN, \"HTMLComment\")\n return \"COMMENT_LESS_THAN_SIGN\"\n }\n if (cp === HYPHEN_MINUS) {\n return \"COMMENT_END_DASH\"\n }\n\n if (cp === NULL) {\n this.reportParseError(\"unexpected-null-character\")\n cp = NULL_REPLACEMENT\n }\n if (cp === EOF) {\n this.reportParseError(\"eof-in-comment\")\n return \"DATA\"\n }\n\n this.appendTokenValue(cp, \"HTMLComment\")\n cp = this.consumeNextCodePoint()\n }\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#comment-less-than-sign-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected COMMENT_LESS_THAN_SIGN(cp: number): TokenizerState {\n while (true) {\n if (cp === EXCLAMATION_MARK) {\n this.appendTokenValue(cp, \"HTMLComment\")\n return \"COMMENT_LESS_THAN_SIGN_BANG\"\n }\n if (cp !== LESS_THAN_SIGN) {\n return this.reconsumeAs(\"COMMENT\")\n }\n\n this.appendTokenValue(cp, \"HTMLComment\")\n cp = this.consumeNextCodePoint()\n }\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#comment-less-than-sign-bang-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected COMMENT_LESS_THAN_SIGN_BANG(cp: number): TokenizerState {\n if (cp === HYPHEN_MINUS) {\n return \"COMMENT_LESS_THAN_SIGN_BANG_DASH\"\n }\n return this.reconsumeAs(\"COMMENT\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#comment-less-than-sign-bang-dash-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected COMMENT_LESS_THAN_SIGN_BANG_DASH(cp: number): TokenizerState {\n if (cp === HYPHEN_MINUS) {\n return \"COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH\"\n }\n return this.reconsumeAs(\"COMMENT_END_DASH\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#comment-less-than-sign-bang-dash-dash-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected COMMENT_LESS_THAN_SIGN_BANG_DASH_DASH(\n cp: number,\n ): TokenizerState {\n if (cp !== GREATER_THAN_SIGN && cp !== EOF) {\n this.reportParseError(\"nested-comment\")\n }\n return this.reconsumeAs(\"COMMENT_END\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#comment-end-dash-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected COMMENT_END_DASH(cp: number): TokenizerState {\n if (cp === HYPHEN_MINUS) {\n return \"COMMENT_END\"\n }\n\n if (cp === EOF) {\n this.reportParseError(\"eof-in-comment\")\n return \"DATA\"\n }\n\n this.appendTokenValue(HYPHEN_MINUS, \"HTMLComment\")\n return this.reconsumeAs(\"COMMENT\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#comment-end-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected COMMENT_END(cp: number): TokenizerState {\n while (true) {\n if (cp === GREATER_THAN_SIGN) {\n return \"DATA\"\n }\n if (cp === EXCLAMATION_MARK) {\n return \"COMMENT_END_BANG\"\n }\n\n if (cp === EOF) {\n this.reportParseError(\"eof-in-comment\")\n return \"DATA\"\n }\n\n this.appendTokenValue(HYPHEN_MINUS, \"HTMLComment\")\n\n if (cp !== HYPHEN_MINUS) {\n this.appendTokenValue(HYPHEN_MINUS, \"HTMLComment\")\n return this.reconsumeAs(\"COMMENT\")\n }\n cp = this.consumeNextCodePoint()\n }\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#comment-end-bang-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected COMMENT_END_BANG(cp: number): TokenizerState {\n if (cp === HYPHEN_MINUS) {\n this.appendTokenValue(HYPHEN_MINUS, \"HTMLComment\")\n this.appendTokenValue(EXCLAMATION_MARK, \"HTMLComment\")\n return \"COMMENT_END_DASH\"\n }\n\n if (cp === GREATER_THAN_SIGN) {\n this.reportParseError(\"incorrectly-closed-comment\")\n return \"DATA\"\n }\n if (cp === EOF) {\n this.reportParseError(\"eof-in-comment\")\n return \"DATA\"\n }\n\n this.appendTokenValue(HYPHEN_MINUS, \"HTMLComment\")\n this.appendTokenValue(EXCLAMATION_MARK, \"HTMLComment\")\n return this.reconsumeAs(\"COMMENT\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#cdata-section-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected CDATA_SECTION(cp: number): TokenizerState {\n while (true) {\n if (cp === RIGHT_SQUARE_BRACKET) {\n return \"CDATA_SECTION_BRACKET\"\n }\n\n if (cp === EOF) {\n this.reportParseError(\"eof-in-cdata\")\n return \"DATA\"\n }\n\n this.appendTokenValue(cp, \"HTMLCDataText\")\n cp = this.consumeNextCodePoint()\n }\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#cdata-section-bracket-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected CDATA_SECTION_BRACKET(cp: number): TokenizerState {\n if (cp === RIGHT_SQUARE_BRACKET) {\n return \"CDATA_SECTION_END\"\n }\n\n this.appendTokenValue(RIGHT_SQUARE_BRACKET, \"HTMLCDataText\")\n return this.reconsumeAs(\"CDATA_SECTION\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#cdata-section-end-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected CDATA_SECTION_END(cp: number): TokenizerState {\n while (true) {\n if (cp === GREATER_THAN_SIGN) {\n return \"DATA\"\n }\n if (cp !== RIGHT_SQUARE_BRACKET) {\n this.appendTokenValue(RIGHT_SQUARE_BRACKET, \"HTMLCDataText\")\n this.appendTokenValue(RIGHT_SQUARE_BRACKET, \"HTMLCDataText\")\n return this.reconsumeAs(\"CDATA_SECTION\")\n }\n\n this.appendTokenValue(RIGHT_SQUARE_BRACKET, \"HTMLCDataText\")\n cp = this.consumeNextCodePoint()\n }\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#character-reference-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected CHARACTER_REFERENCE(cp: number): TokenizerState {\n this.crStartOffset = this.offset - 1\n this.buffer = [AMPERSAND]\n\n if (isDigit(cp) || isLetter(cp)) {\n return this.reconsumeAs(\"NAMED_CHARACTER_REFERENCE\")\n }\n if (cp === NUMBER_SIGN) {\n this.buffer.push(cp)\n return \"NUMERIC_CHARACTER_REFERENCE\"\n }\n return this.reconsumeAs(\"CHARACTER_REFERENCE_END\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected NAMED_CHARACTER_REFERENCE(cp: number): TokenizerState {\n for (const entitySet of entitySets) {\n const length = entitySet.length\n const entities = entitySet.entities\n const text = this.text.slice(this.offset, this.offset + length)\n const codepoints = entities[text]\n\n if (codepoints == null) {\n continue\n }\n\n const semi = text.endsWith(\";\")\n const next = this.text.codePointAt(this.offset + 1)\n\n this.offset += length - 1\n this.column += length - 1\n\n if (\n this.returnState.startsWith(\"ATTR\") &&\n !semi &&\n next != null &&\n (next === EQUALS_SIGN || isLetter(next) || isDigit(next))\n ) {\n for (const cp1 of text) {\n this.buffer.push(cp1.codePointAt(0) as number)\n }\n } else {\n if (!semi) {\n this.reportParseError(\n \"missing-semicolon-after-character-reference\",\n )\n }\n this.buffer = codepoints\n }\n\n return \"CHARACTER_REFERENCE_END\"\n }\n\n for (const cp0 of this.buffer) {\n this.appendTokenValue(cp0, null)\n }\n this.appendTokenValue(cp, null)\n\n return \"AMBIGUOUS_AMPERSAND\"\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#ambiguous-ampersand-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected AMBIGUOUS_AMPERSAND(cp: number): TokenizerState {\n while (isDigit(cp) || isLetter(cp)) {\n this.appendTokenValue(cp, null)\n cp = this.consumeNextCodePoint()\n }\n\n if (cp === SEMICOLON) {\n this.reportParseError(\"unknown-named-character-reference\")\n }\n return this.reconsumeAs(this.returnState)\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#numeric-character-reference-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected NUMERIC_CHARACTER_REFERENCE(cp: number): TokenizerState {\n this.crCode = 0\n\n if (cp === LATIN_SMALL_X || cp === LATIN_CAPITAL_X) {\n this.buffer.push(cp)\n return \"HEXADEMICAL_CHARACTER_REFERENCE_START\"\n }\n return this.reconsumeAs(\"DECIMAL_CHARACTER_REFERENCE_START\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#hexademical-character-reference-start-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected HEXADEMICAL_CHARACTER_REFERENCE_START(\n cp: number,\n ): TokenizerState {\n if (isHexDigit(cp)) {\n return this.reconsumeAs(\"HEXADEMICAL_CHARACTER_REFERENCE\")\n }\n\n this.reportParseError(\n \"absence-of-digits-in-numeric-character-reference\",\n )\n return this.reconsumeAs(\"CHARACTER_REFERENCE_END\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#decimal-character-reference-start-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected DECIMAL_CHARACTER_REFERENCE_START(cp: number): TokenizerState {\n if (isDigit(cp)) {\n return this.reconsumeAs(\"DECIMAL_CHARACTER_REFERENCE\")\n }\n\n this.reportParseError(\n \"absence-of-digits-in-numeric-character-reference\",\n )\n return this.reconsumeAs(\"CHARACTER_REFERENCE_END\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#hexademical-character-reference-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected HEXADEMICAL_CHARACTER_REFERENCE(cp: number): TokenizerState {\n while (true) {\n if (isDigit(cp)) {\n this.crCode = 16 * this.crCode + (cp - 0x30)\n } else if (isUpperHexDigit(cp)) {\n this.crCode = 16 * this.crCode + (cp - 0x37)\n } else if (isLowerHexDigit(cp)) {\n this.crCode = 16 * this.crCode + (cp - 0x57)\n } else {\n if (cp === SEMICOLON) {\n return \"NUMERIC_CHARACTER_REFERENCE_END\"\n }\n\n this.reportParseError(\n \"missing-semicolon-after-character-reference\",\n )\n return this.reconsumeAs(\"NUMERIC_CHARACTER_REFERENCE_END\")\n }\n\n cp = this.consumeNextCodePoint()\n }\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#decimal-character-reference-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected DECIMAL_CHARACTER_REFERENCE(cp: number): TokenizerState {\n while (true) {\n if (isDigit(cp)) {\n this.crCode = 10 * this.crCode + (cp - 0x30)\n } else {\n if (cp === SEMICOLON) {\n return \"NUMERIC_CHARACTER_REFERENCE_END\"\n }\n\n this.reportParseError(\n \"missing-semicolon-after-character-reference\",\n )\n return this.reconsumeAs(\"NUMERIC_CHARACTER_REFERENCE_END\")\n }\n\n cp = this.consumeNextCodePoint()\n }\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#numeric-character-reference-end-state\n * @param cp The current code point.\n * @returns The next state.\n */\n protected NUMERIC_CHARACTER_REFERENCE_END(_cp: number): TokenizerState {\n let code = this.crCode\n\n if (code === 0) {\n this.reportParseError(\"null-character-reference\")\n code = NULL_REPLACEMENT\n } else if (code > 0x10ffff) {\n this.reportParseError(\"character-reference-outside-unicode-range\")\n code = NULL_REPLACEMENT\n } else if (isSurrogate(code)) {\n this.reportParseError(\"surrogate-character-reference\")\n code = NULL_REPLACEMENT\n } else if (isNonCharacter(code)) {\n this.reportParseError(\"noncharacter-character-reference\")\n } else if (code === 0x0d || (isControl(code) && !isWhitespace(code))) {\n this.reportParseError(\"control-character-reference\")\n code = alternativeCR.get(code) || code\n }\n\n this.buffer = [code]\n return this.reconsumeAs(\"CHARACTER_REFERENCE_END\")\n }\n\n /**\n * https://html.spec.whatwg.org/multipage/parsing.html#flush-code-points-consumed-as-a-character-reference\n * @param cp The current code point.\n * @returns The next state.\n */\n protected CHARACTER_REFERENCE_END(_cp: number): TokenizerState {\n assert(this.currentToken != null)\n\n // The this.buffer.length is not new length since it includes surrogate pairs.\n // Calculate new length.\n const token = this.currentToken\n const len0 = token.value.length\n for (const cp1 of this.buffer) {\n this.appendTokenValue(cp1, null)\n }\n const newLength = token.value.length - len0\n\n // Make gaps in the difference of length.\n for (let i = this.crStartOffset + newLength; i < this.offset; ++i) {\n this.gaps.push(i)\n }\n\n return this.reconsumeAs(this.returnState)\n }\n\n /**\n * Original state.\n * Create `{{ `token.\n * @param cp The current code point.\n * @returns The next state.\n */\n protected V_EXPRESSION_START(cp: number): TokenizerState {\n if (cp === LEFT_CURLY_BRACKET) {\n this.startToken(\"VExpressionStart\")\n this.appendTokenValue(LEFT_CURLY_BRACKET, null)\n this.appendTokenValue(LEFT_CURLY_BRACKET, null)\n\n if (\n !(\n this.parserOptions.vueFeatures?.interpolationAsNonHTML ??\n true\n )\n ) {\n return this.returnState\n }\n\n const closeIndex = this.text.indexOf(\"}}\", this.offset + 1)\n if (closeIndex === -1) {\n this.reportParseError(\"x-missing-interpolation-end\")\n return this.returnState\n }\n this.vExpressionScriptState = {\n state: this.returnState,\n }\n return \"V_EXPRESSION_DATA\"\n }\n\n this.appendTokenValue(LEFT_CURLY_BRACKET, null)\n return this.reconsumeAs(this.returnState)\n }\n\n /**\n * Original state.\n * Parse in interpolation.\n * @see https://github.com/vuejs/vue-next/blob/3a6b1207fa39cb35eed5bae0b5fdcdb465926bca/packages/compiler-core/src/parse.ts#L752\n * @param cp The current code point.\n * @returns The next state.\n */\n protected V_EXPRESSION_DATA(cp: number): TokenizerState {\n this.clearStartTokenMark()\n const state = this.vExpressionScriptState!.state\n\n while (true) {\n const type = isWhitespace(cp)\n ? \"HTMLWhitespace\"\n : state === \"RCDATA\"\n ? \"HTMLRawText\"\n : state === \"RAWTEXT\"\n ? \"HTMLRCDataText\"\n : \"HTMLText\"\n if (this.currentToken != null && this.currentToken.type !== type) {\n this.endToken()\n return this.reconsumeAs(this.state)\n }\n if (this.currentToken == null) {\n this.startToken(type)\n }\n\n if (cp === AMPERSAND && state !== \"RAWTEXT\") {\n this.returnState = \"V_EXPRESSION_DATA\"\n return \"CHARACTER_REFERENCE\"\n }\n // if (cp === LESS_THAN_SIGN) {\n // this.setStartTokenMark()\n // return \"TAG_OPEN\"\n // }\n if (cp === RIGHT_CURLY_BRACKET) {\n this.setStartTokenMark()\n this.returnState = \"V_EXPRESSION_DATA\"\n return \"V_EXPRESSION_END\"\n }\n // Already checked\n /* istanbul ignore next */\n if (cp === EOF) {\n this.reportParseError(\"x-missing-interpolation-end\")\n return \"DATA\"\n }\n\n if (cp === NULL) {\n this.reportParseError(\"unexpected-null-character\")\n }\n this.appendTokenValue(cp, type)\n\n cp = this.consumeNextCodePoint()\n }\n }\n /**\n * Create `}} `token.\n * @param cp The current code point.\n * @returns The next state.\n */\n protected V_EXPRESSION_END(cp: number): TokenizerState {\n if (cp === RIGHT_CURLY_BRACKET) {\n this.startToken(\"VExpressionEnd\")\n this.appendTokenValue(RIGHT_CURLY_BRACKET, null)\n this.appendTokenValue(RIGHT_CURLY_BRACKET, null)\n return this.vExpressionScriptState\n ? this.vExpressionScriptState.state\n : this.returnState\n }\n\n this.appendTokenValue(RIGHT_CURLY_BRACKET, null)\n return this.reconsumeAs(this.returnState)\n }\n}\n\n/*eslint-enable no-constant-condition, no-param-reassign */\n", "/**\n * This file is copied from `eslint/lib/util/node-event-generator.js`\n */\nimport EventEmitter from \"events\"\nimport esquery, {ESQueryOptions, Selector} from \"esquery\"\nimport union from \"lodash/union\"\nimport intersection from \"lodash/intersection\"\nimport memoize from \"lodash/memoize\"\nimport {Node} from \"../ast\"\n\ninterface NodeSelector {\n rawSelector: string\n isExit: boolean\n parsedSelector: Selector\n listenerTypes: string[] | null\n attributeCount: number\n identifierCount: number\n}\n\n/**\n* Gets the possible types of a selector\n* @param parsedSelector An object (from esquery) describing the matching behavior of the selector\n* @returns The node types that could possibly trigger this selector, or `null` if all node types could trigger it\n*/\nfunction getPossibleTypes(parsedSelector: Selector): string[] | null {\n switch (parsedSelector.type) {\n case \"identifier\":\n return [parsedSelector.value]\n\n case \"matches\": {\n const typesForComponents = parsedSelector.selectors.map(getPossibleTypes)\n\n if (typesForComponents.every(Boolean)) {\n return union(...(typesForComponents as string[][]))\n }\n return null\n }\n\n case \"compound\": {\n const typesForComponents = parsedSelector.selectors.map(getPossibleTypes).filter(Boolean) as string[][]\n\n // If all of the components could match any type, then the compound could also match any type.\n if (!typesForComponents.length) {\n return null\n }\n\n /*\n * If at least one of the components could only match a particular type, the compound could only match\n * the intersection of those types.\n */\n return intersection(...typesForComponents)\n }\n\n case \"child\":\n case \"descendant\":\n case \"sibling\":\n case \"adjacent\":\n return getPossibleTypes(parsedSelector.right)\n\n default:\n return null\n }\n}\n\n/**\n * Counts the number of class, pseudo-class, and attribute queries in this selector\n * @param parsedSelector An object (from esquery) describing the selector's matching behavior\n * @returns The number of class, pseudo-class, and attribute queries in this selector\n */\nfunction countClassAttributes(parsedSelector: Selector): number {\n switch (parsedSelector.type) {\n case \"child\":\n case \"descendant\":\n case \"sibling\":\n case \"adjacent\":\n return countClassAttributes(parsedSelector.left) + countClassAttributes(parsedSelector.right)\n\n case \"compound\":\n case \"not\":\n case \"matches\":\n return parsedSelector.selectors.reduce((sum, childSelector) => sum + countClassAttributes(childSelector), 0)\n\n case \"attribute\":\n case \"field\":\n case \"nth-child\":\n case \"nth-last-child\":\n return 1\n\n default:\n return 0\n }\n}\n\n/**\n * Counts the number of identifier queries in this selector\n * @param parsedSelector An object (from esquery) describing the selector's matching behavior\n * @returns The number of identifier queries\n */\nfunction countIdentifiers(parsedSelector: Selector): number {\n switch (parsedSelector.type) {\n case \"child\":\n case \"descendant\":\n case \"sibling\":\n case \"adjacent\":\n return countIdentifiers(parsedSelector.left) + countIdentifiers(parsedSelector.right)\n\n case \"compound\":\n case \"not\":\n case \"matches\":\n return parsedSelector.selectors.reduce((sum, childSelector) => sum + countIdentifiers(childSelector), 0)\n\n case \"identifier\":\n return 1\n\n default:\n return 0\n }\n}\n\n/**\n * Compares the specificity of two selector objects, with CSS-like rules.\n * @param selectorA An AST selector descriptor\n * @param selectorB Another AST selector descriptor\n * @returns\n * a value less than 0 if selectorA is less specific than selectorB\n * a value greater than 0 if selectorA is more specific than selectorB\n * a value less than 0 if selectorA and selectorB have the same specificity, and selectorA <= selectorB alphabetically\n * a value greater than 0 if selectorA and selectorB have the same specificity, and selectorA > selectorB alphabetically\n */\nfunction compareSpecificity(selectorA: NodeSelector, selectorB: NodeSelector): number {\n return selectorA.attributeCount - selectorB.attributeCount ||\n selectorA.identifierCount - selectorB.identifierCount ||\n (selectorA.rawSelector <= selectorB.rawSelector ? -1 : 1)\n}\n\n/**\n * Parses a raw selector string, and throws a useful error if parsing fails.\n * @param rawSelector A raw AST selector\n * @returns An object (from esquery) describing the matching behavior of this selector\n * @throws An error if the selector is invalid\n */\nfunction tryParseSelector(rawSelector: string): Selector {\n try {\n return esquery.parse(rawSelector.replace(/:exit$/, \"\"))\n }\n catch (err: any) {\n if (typeof err.offset === \"number\") {\n throw new Error(`Syntax error in selector \"${rawSelector}\" at position ${err.offset}: ${err.message}`)\n }\n throw err\n }\n}\n\n/**\n * Parses a raw selector string, and returns the parsed selector along with specificity and type information.\n * @param {string} rawSelector A raw AST selector\n * @returns {ASTSelector} A selector descriptor\n */\nconst parseSelector = memoize<(rawSelector: string) => NodeSelector>(rawSelector => {\n const parsedSelector = tryParseSelector(rawSelector)\n\n return {\n rawSelector,\n isExit: rawSelector.endsWith(\":exit\"),\n parsedSelector,\n listenerTypes: getPossibleTypes(parsedSelector),\n attributeCount: countClassAttributes(parsedSelector),\n identifierCount: countIdentifiers(parsedSelector),\n }\n})\n\n//------------------------------------------------------------------------------\n// Public Interface\n//------------------------------------------------------------------------------\n\n/**\n * The event generator for AST nodes.\n * This implements below interface.\n *\n * ```ts\n * interface EventGenerator {\n * emitter: EventEmitter\n * enterNode(node: ASTNode): void\n * leaveNode(node: ASTNode): void\n * }\n * ```\n */\nexport default class NodeEventGenerator {\n emitter: EventEmitter\n esqueryOptions: ESQueryOptions\n\n private currentAncestry: Node[]\n private enterSelectorsByNodeType: Map<string, NodeSelector[]>\n private exitSelectorsByNodeType: Map<string, NodeSelector[]>\n private anyTypeEnterSelectors: NodeSelector[]\n private anyTypeExitSelectors: NodeSelector[]\n\n /**\n * @param emitter - An event emitter which is the destination of events. This emitter must already\n * have registered listeners for all of the events that it needs to listen for.\n */\n constructor(emitter: EventEmitter, esqueryOptions: ESQueryOptions) {\n this.emitter = emitter\n this.esqueryOptions = esqueryOptions\n this.currentAncestry = []\n this.enterSelectorsByNodeType = new Map()\n this.exitSelectorsByNodeType = new Map()\n this.anyTypeEnterSelectors = []\n this.anyTypeExitSelectors = []\n\n const eventNames = typeof emitter.eventNames === \"function\"\n\n // Use the built-in eventNames() function if available (Node 6+)\n ? emitter.eventNames()\n\n /*\n * Otherwise, use the private _events property.\n * Using a private property isn't ideal here, but this seems to\n * be the best way to get a list of event names without overriding\n * addEventListener, which would hurt performance. This property\n * is widely used and unlikely to be removed in a future version\n * (see https://github.com/nodejs/node/issues/1817). Also, future\n * node versions will have eventNames() anyway.\n */\n : Object.keys((emitter as any)._events)\n\n for (const rawSelector of eventNames) {\n if (typeof rawSelector === \"symbol\") {\n continue\n }\n const selector = parseSelector(rawSelector)\n\n if (selector.listenerTypes) {\n for (const nodeType of selector.listenerTypes) {\n const typeMap = selector.isExit ? this.exitSelectorsByNodeType : this.enterSelectorsByNodeType\n\n let selectors = typeMap.get(nodeType)\n if (selectors == null) {\n typeMap.set(nodeType, (selectors = []))\n }\n selectors.push(selector)\n }\n }\n else {\n (selector.isExit ? this.anyTypeExitSelectors : this.anyTypeEnterSelectors).push(selector)\n }\n }\n\n this.anyTypeEnterSelectors.sort(compareSpecificity)\n this.anyTypeExitSelectors.sort(compareSpecificity)\n for (const selectorList of this.enterSelectorsByNodeType.values()) {\n selectorList.sort(compareSpecificity)\n }\n for (const selectorList of this.exitSelectorsByNodeType.values()) {\n selectorList.sort(compareSpecificity)\n }\n }\n\n /**\n * Checks a selector against a node, and emits it if it matches\n * @param node The node to check\n * @param selector An AST selector descriptor\n */\n private applySelector(node: Node, selector: NodeSelector): void {\n if (esquery.matches(node, selector.parsedSelector, this.currentAncestry, this.esqueryOptions)) {\n this.emitter.emit(selector.rawSelector, node)\n }\n }\n\n /**\n * Applies all appropriate selectors to a node, in specificity order\n * @param node The node to check\n * @param isExit `false` if the node is currently being entered, `true` if it's currently being exited\n */\n private applySelectors(node: Node, isExit: boolean): void {\n const selectorsByNodeType = (isExit ? this.exitSelectorsByNodeType : this.enterSelectorsByNodeType).get(node.type) || []\n const anyTypeSelectors = isExit ? this.anyTypeExitSelectors : this.anyTypeEnterSelectors\n\n /*\n * selectorsByNodeType and anyTypeSelectors were already sorted by specificity in the constructor.\n * Iterate through each of them, applying selectors in the right order.\n */\n let selectorsByTypeIndex = 0\n let anyTypeSelectorsIndex = 0\n\n while (selectorsByTypeIndex < selectorsByNodeType.length || anyTypeSelectorsIndex < anyTypeSelectors.length) {\n if (\n selectorsByTypeIndex >= selectorsByNodeType.length ||\n (anyTypeSelectorsIndex < anyTypeSelectors.length && compareSpecificity(anyTypeSelectors[anyTypeSelectorsIndex], selectorsByNodeType[selectorsByTypeIndex]) < 0)\n ) {\n this.applySelector(node, anyTypeSelectors[anyTypeSelectorsIndex++])\n }\n else {\n this.applySelector(node, selectorsByNodeType[selectorsByTypeIndex++])\n }\n }\n }\n\n /**\n * Emits an event of entering AST node.\n * @param node - A node which was entered.\n */\n enterNode(node: Node): void {\n if (node.parent) {\n this.currentAncestry.unshift(node.parent)\n }\n this.applySelectors(node, false)\n }\n\n /**\n * Emits an event of leaving AST node.\n * @param node - A node which was left.\n */\n leaveNode(node: Node): void {\n this.applySelectors(node, true)\n this.currentAncestry.shift()\n }\n}\n", "/**\n * @fileoverview Define utilify functions for token store.\n * @author Toru Nagashima\n */\nimport sortedIndexBy from \"lodash/sortedIndexBy\"\nimport {HasLocation} from \"../../ast\"\n\n/**\n * Gets `token.range[0]` from the given token.\n *\n * @param token - The token to get.\n * @returns The start location.\n * @private\n */\nfunction getStartLocation(token: { range: number[] }): number {\n return token.range[0]\n}\n\n/**\n * Binary-searches the index of the first token which is after the given location.\n * If it was not found, this returns `tokens.length`.\n *\n * @param tokens - It searches the token in this list.\n * @param location - The location to search.\n * @returns The found index or `tokens.length`.\n */\nexport function search(tokens: HasLocation[], location: number): number {\n return sortedIndexBy(\n tokens as { range: number[] }[],\n { range: [location] },\n getStartLocation,\n )\n}\n\n/**\n * Gets the index of the `startLoc` in `tokens`.\n * `startLoc` can be the value of `node.range[1]`, so this checks about `startLoc - 1` as well.\n *\n * @param tokens - The tokens to find an index.\n * @param indexMap - The map from locations to indices.\n * @param startLoc - The location to get an index.\n * @returns The index.\n */\nexport function getFirstIndex(tokens: HasLocation[], indexMap: { [key: number]: number }, startLoc: number): number {\n if (startLoc in indexMap) {\n return indexMap[startLoc]\n }\n if ((startLoc - 1) in indexMap) {\n const index = indexMap[startLoc - 1]\n const token = (index >= 0 && index < tokens.length) ? tokens[index] : null\n\n // For the map of \"comment's location -> token's index\", it points the next token of a comment.\n // In that case, +1 is unnecessary.\n if (token && token.range[0] >= startLoc) {\n return index\n }\n return index + 1\n }\n return 0\n}\n\n/**\n * Gets the index of the `endLoc` in `tokens`.\n * The information of end locations are recorded at `endLoc - 1` in `indexMap`, so this checks about `endLoc - 1` as well.\n *\n * @param tokens - The tokens to find an index.\n * @param indexMap - The map from locations to indices.\n * @param endLoc - The location to get an index.\n * @returns The index.\n */\nexport function getLastIndex(tokens: HasLocation[], indexMap: { [key: number]: number }, endLoc: number): number {\n if (endLoc in indexMap) {\n return indexMap[endLoc] - 1\n }\n if ((endLoc - 1) in indexMap) {\n const index = indexMap[endLoc - 1]\n const token = (index >= 0 && index < tokens.length) ? tokens[index] : null\n\n // For the map of \"comment's location -> token's index\", it points the next token of a comment.\n // In that case, -1 is necessary.\n if (token && token.range[1] > endLoc) {\n return index - 1\n }\n return index\n }\n return tokens.length - 1\n}\n", "/**\n * @fileoverview Define the abstract class about cursors which iterate tokens.\n * @author Toru Nagashima\n */\nimport {Token} from \"../../../ast\"\n\n/**\n * The abstract class about cursors which iterate tokens.\n *\n * This class has 2 abstract methods.\n *\n * - `current: Token | Comment | null` ... The current token.\n * - `moveNext(): boolean` ... Moves this cursor to the next token. If the next token didn't exist, it returns `false`.\n *\n * This is similar to ES2015 Iterators.\n * However, Iterators were slow (at 2017-01), so I created this class as similar to C# IEnumerable.\n *\n * There are the following known sub classes.\n *\n * - ForwardTokenCursor .......... The cursor which iterates tokens only.\n * - BackwardTokenCursor ......... The cursor which iterates tokens only in reverse.\n * - ForwardTokenCommentCursor ... The cursor which iterates tokens and comments.\n * - BackwardTokenCommentCursor .. The cursor which iterates tokens and comments in reverse.\n * - DecorativeCursor\n * - FilterCursor ............ The cursor which ignores the specified tokens.\n * - SkipCursor .............. The cursor which ignores the first few tokens.\n * - LimitCursor ............. The cursor which limits the count of tokens.\n *\n */\nexport default abstract class Cursor {\n current: Token | null\n\n /**\n * Initializes this cursor.\n */\n constructor() {\n this.current = null\n }\n\n /**\n * Gets the first token.\n * This consumes this cursor.\n * @returns The first token or null.\n */\n getOneToken(): Token | null {\n return this.moveNext() ? this.current : null\n }\n\n /**\n * Gets the first tokens.\n * This consumes this cursor.\n * @returns All tokens.\n */\n getAllTokens(): Token[] {\n const tokens: Token[] = []\n\n while (this.moveNext()) {\n tokens.push(this.current as Token)\n }\n\n return tokens\n }\n\n /**\n * Moves this cursor to the next token.\n * @returns {boolean} `true` if the next token exists.\n * @abstract\n */\n abstract moveNext(): boolean\n}\n", "/**\n * @fileoverview Define the cursor which iterates tokens and comments in reverse.\n * @author Toru Nagashima\n */\nimport {Token} from \"../../../ast\"\nimport {getLastIndex, search} from \"../utils\"\nimport Cursor from \"./cursor\"\n\n/**\n * The cursor which iterates tokens and comments in reverse.\n */\nexport default class BackwardTokenCommentCursor extends Cursor {\n private tokens: Token[]\n private comments: Token[]\n private tokenIndex: number\n private commentIndex: number\n private border: number\n\n /**\n * Initializes this cursor.\n * @param tokens - The array of tokens.\n * @param comments - The array of comments.\n * @param indexMap - The map from locations to indices in `tokens`.\n * @param startLoc - The start location of the iteration range.\n * @param endLoc - The end location of the iteration range.\n */\n constructor(tokens: Token[], comments: Token[], indexMap: { [key: number]: number }, startLoc: number, endLoc: number) {\n super()\n this.tokens = tokens\n this.comments = comments\n this.tokenIndex = getLastIndex(tokens, indexMap, endLoc)\n this.commentIndex = search(comments, endLoc) - 1\n this.border = startLoc\n }\n\n /** @inheritdoc */\n moveNext(): boolean {\n const token = (this.tokenIndex >= 0) ? this.tokens[this.tokenIndex] : null\n const comment = (this.commentIndex >= 0) ? this.comments[this.commentIndex] : null\n\n if (token && (!comment || token.range[1] > comment.range[1])) {\n this.current = token\n this.tokenIndex -= 1\n }\n else if (comment) {\n this.current = comment\n this.commentIndex -= 1\n }\n else {\n this.current = null\n }\n\n return this.current != null && (this.border === -1 || this.current.range[0] >= this.border)\n }\n}\n", "/**\n * @fileoverview Define the cursor which iterates tokens only in reverse.\n * @author Toru Nagashima\n */\nimport {Token} from \"../../../ast\"\nimport {getFirstIndex, getLastIndex} from \"../utils\"\nimport Cursor from \"./cursor\"\n\n/**\n * The cursor which iterates tokens only in reverse.\n */\nexport default class BackwardTokenCursor extends Cursor {\n private tokens: Token[]\n private index: number\n private indexEnd: number\n\n /**\n * Initializes this cursor.\n * @param tokens - The array of tokens.\n * @param comments - The array of comments.\n * @param indexMap - The map from locations to indices in `tokens`.\n * @param startLoc - The start location of the iteration range.\n * @param endLoc - The end location of the iteration range.\n */\n constructor(tokens: Token[], _comments: Token[], indexMap: { [key: number]: number }, startLoc: number, endLoc: number) {\n super()\n this.tokens = tokens\n this.index = getLastIndex(tokens, indexMap, endLoc)\n this.indexEnd = getFirstIndex(tokens, indexMap, startLoc)\n }\n\n /** @inheritdoc */\n moveNext(): boolean {\n if (this.index >= this.indexEnd) {\n this.current = this.tokens[this.index]\n this.index -= 1\n return true\n }\n return false\n }\n\n //\n // Shorthand for performance.\n //\n\n /** @inheritdoc */\n getOneToken(): Token | null {\n return (this.index >= this.indexEnd) ? this.tokens[this.index] : null\n }\n}\n", "/**\n * @fileoverview Define the abstract class about cursors which manipulate another cursor.\n * @author Toru Nagashima\n */\nimport Cursor from \"./cursor\"\n\n//------------------------------------------------------------------------------\n// Exports\n//------------------------------------------------------------------------------\n\n/**\n * The abstract class about cursors which manipulate another cursor.\n */\nexport default class DecorativeCursor extends Cursor {\n protected cursor: Cursor\n\n /**\n * Initializes this cursor.\n * @param cursor - The cursor to be decorated.\n */\n constructor(cursor: Cursor) {\n super()\n this.cursor = cursor\n }\n\n /** @inheritdoc */\n moveNext(): boolean {\n const retv = this.cursor.moveNext()\n\n this.current = this.cursor.current\n\n return retv\n }\n}\n", "/**\n * @fileoverview Define the cursor which ignores specified tokens.\n * @author Toru Nagashima\n */\nimport {Token} from \"../../../ast\"\nimport Cursor from \"./cursor\"\nimport DecorativeCursor from \"./decorative-cursor\"\n\n/**\n * The decorative cursor which ignores specified tokens.\n */\nexport default class FilterCursor extends DecorativeCursor {\n private predicate: (token: Token) => boolean\n\n /**\n * Initializes this cursor.\n * @param cursor - The cursor to be decorated.\n * @param predicate - The predicate function to decide tokens this cursor iterates.\n */\n constructor(cursor: Cursor, predicate: (token: Token) => boolean) {\n super(cursor)\n this.predicate = predicate\n }\n\n /** @inheritdoc */\n moveNext(): boolean {\n const predicate = this.predicate\n\n while (super.moveNext()) {\n if (predicate(this.current as Token)) {\n return true\n }\n }\n return false\n }\n}\n", "/**\n * @fileoverview Define the cursor which iterates tokens and comments.\n * @author Toru Nagashima\n */\nimport {Token} from \"../../../ast\"\nimport {getFirstIndex, search} from \"../utils\"\nimport Cursor from \"./cursor\"\n\n/**\n * The cursor which iterates tokens and comments.\n */\nexport default class ForwardTokenCommentCursor extends Cursor {\n private tokens: Token[]\n private comments: Token[]\n private tokenIndex: number\n private commentIndex: number\n private border: number\n\n /**\n * Initializes this cursor.\n * @param tokens - The array of tokens.\n * @param comments - The array of comments.\n * @param indexMap - The map from locations to indices in `tokens`.\n * @param startLoc - The start location of the iteration range.\n * @param endLoc - The end location of the iteration range.\n */\n constructor(tokens: Token[], comments: Token[], indexMap: { [key: number]: number }, startLoc: number, endLoc: number) {\n super()\n this.tokens = tokens\n this.comments = comments\n this.tokenIndex = getFirstIndex(tokens, indexMap, startLoc)\n this.commentIndex = search(comments, startLoc)\n this.border = endLoc\n }\n\n /** @inheritdoc */\n moveNext(): boolean {\n const token = (this.tokenIndex < this.tokens.length) ? this.tokens[this.tokenIndex] : null\n const comment = (this.commentIndex < this.comments.length) ? this.comments[this.commentIndex] : null\n\n if (token && (!comment || token.range[0] < comment.range[0])) {\n this.current = token\n this.tokenIndex += 1\n }\n else if (comment) {\n this.current = comment\n this.commentIndex += 1\n }\n else {\n this.current = null\n }\n\n return this.current != null && (this.border === -1 || this.current.range[1] <= this.border)\n }\n}\n", "/**\n * @fileoverview Define the cursor which iterates tokens only.\n * @author Toru Nagashima\n */\nimport {Token} from \"../../../ast\"\nimport {getFirstIndex, getLastIndex} from \"../utils\"\nimport Cursor from \"./cursor\"\n\n/**\n * The cursor which iterates tokens only.\n */\nexport default class ForwardTokenCursor extends Cursor {\n private tokens: Token[]\n protected index: number\n protected indexEnd: number\n\n /**\n * Initializes this cursor.\n * @param tokens - The array of tokens.\n * @param comments - The array of comments.\n * @param indexMap - The map from locations to indices in `tokens`.\n * @param startLoc - The start location of the iteration range.\n * @param endLoc - The end location of the iteration range.\n */\n constructor(tokens: Token[], _comments: Token[], indexMap: { [key: number]: number }, startLoc: number, endLoc: number) {\n super()\n this.tokens = tokens\n this.index = getFirstIndex(tokens, indexMap, startLoc)\n this.indexEnd = getLastIndex(tokens, indexMap, endLoc)\n }\n\n /** @inheritdoc */\n moveNext(): boolean {\n if (this.index <= this.indexEnd) {\n this.current = this.tokens[this.index]\n this.index += 1\n return true\n }\n return false\n }\n\n //\n // Shorthand for performance.\n //\n\n /** @inheritdoc */\n getOneToken(): Token | null {\n return (this.index <= this.indexEnd) ? this.tokens[this.index] : null\n }\n\n /** @inheritdoc */\n getAllTokens(): Token[] {\n return this.tokens.slice(this.index, this.indexEnd + 1)\n }\n}\n", "/**\n * @fileoverview Define the cursor which limits the number of tokens.\n * @author Toru Nagashima\n */\nimport Cursor from \"./cursor\"\nimport DecorativeCursor from \"./decorative-cursor\"\n\n/**\n * The decorative cursor which limits the number of tokens.\n */\nexport default class LimitCursor extends DecorativeCursor {\n private count: number\n\n /**\n * Initializes this cursor.\n * @param cursor - The cursor to be decorated.\n * @param count - The count of tokens this cursor iterates.\n */\n constructor(cursor: Cursor, count: number) {\n super(cursor)\n this.count = count\n }\n\n /** @inheritdoc */\n moveNext(): boolean {\n if (this.count > 0) {\n this.count -= 1\n return super.moveNext()\n }\n return false\n }\n}\n", "/**\n * @fileoverview Define the cursor which ignores the first few tokens.\n * @author Toru Nagashima\n */\nimport Cursor from \"./cursor\"\nimport DecorativeCursor from \"./decorative-cursor\"\n\n/**\n * The decorative cursor which ignores the first few tokens.\n */\nexport default class SkipCursor extends DecorativeCursor {\n private count: number\n\n /**\n * Initializes this cursor.\n * @param cursor - The cursor to be decorated.\n * @param count - The count of tokens this cursor skips.\n */\n constructor(cursor: Cursor, count: number) {\n super(cursor)\n this.count = count\n }\n\n /** @inheritdoc */\n moveNext(): boolean {\n while (this.count > 0) {\n this.count -= 1\n if (!super.moveNext()) {\n return false\n }\n }\n return super.moveNext()\n }\n}\n", "/**\n * @fileoverview Define 2 token factories; forward and backward.\n * @author Toru Nagashima\n */\nimport {Token} from \"../../../ast\"\nimport BackwardTokenCommentCursor from \"./backward-token-comment-cursor\"\nimport BackwardTokenCursor from \"./backward-token-cursor\"\nimport Cursor from \"./cursor\"\nimport FilterCursor from \"./filter-cursor\"\nimport ForwardTokenCommentCursor from \"./forward-token-comment-cursor\"\nimport ForwardTokenCursor from \"./forward-token-cursor\"\nimport LimitCursor from \"./limit-cursor\"\nimport SkipCursor from \"./skip-cursor\"\n\n/**\n * The cursor factory.\n * @private\n */\nexport class CursorFactory {\n private TokenCursor: typeof BackwardTokenCursor | typeof ForwardTokenCursor\n private TokenCommentCursor: typeof BackwardTokenCommentCursor | typeof ForwardTokenCommentCursor\n\n /**\n * Initializes this cursor.\n * @param TokenCursor - The class of the cursor which iterates tokens only.\n * @param TokenCommentCursor - The class of the cursor which iterates the mix of tokens and comments.\n */\n constructor(TokenCursor: typeof BackwardTokenCursor | typeof ForwardTokenCursor, TokenCommentCursor: typeof BackwardTokenCommentCursor | typeof ForwardTokenCommentCursor) {\n this.TokenCursor = TokenCursor\n this.TokenCommentCursor = TokenCommentCursor\n }\n\n /**\n * Creates a base cursor instance that can be decorated by createCursor.\n *\n * @param tokens - The array of tokens.\n * @param comments - The array of comments.\n * @param indexMap - The map from locations to indices in `tokens`.\n * @param startLoc - The start location of the iteration range.\n * @param endLoc - The end location of the iteration range.\n * @param includeComments - The flag to iterate comments as well.\n * @returns The created base cursor.\n */\n createBaseCursor(tokens: Token[], comments: Token[], indexMap: { [key: number]: number }, startLoc: number, endLoc: number, includeComments: boolean): Cursor {\n const TokenCursor = includeComments ? this.TokenCommentCursor : this.TokenCursor\n return new TokenCursor(tokens, comments, indexMap, startLoc, endLoc)\n }\n\n /**\n * Creates a cursor that iterates tokens with normalized options.\n *\n * @param tokens - The array of tokens.\n * @param comments - The array of comments.\n * @param indexMap - The map from locations to indices in `tokens`.\n * @param startLoc - The start location of the iteration range.\n * @param endLoc - The end location of the iteration range.\n * @param includeComments - The flag to iterate comments as well.\n * @param filter - The predicate function to choose tokens.\n * @param skip - The count of tokens the cursor skips.\n * @param count - The maximum count of tokens the cursor iterates. Zero is no iteration for backward compatibility.\n * @returns The created cursor.\n */\n createCursor(tokens: Token[], comments: Token[], indexMap: { [key: number]: number }, startLoc: number, endLoc: number, includeComments: boolean, filter: ((token: Token) => boolean) | null, skip: number, count: number): Cursor {\n let cursor = this.createBaseCursor(tokens, comments, indexMap, startLoc, endLoc, includeComments)\n\n if (filter) {\n cursor = new FilterCursor(cursor, filter)\n }\n if (skip >= 1) {\n cursor = new SkipCursor(cursor, skip)\n }\n if (count >= 0) {\n cursor = new LimitCursor(cursor, count)\n }\n\n return cursor\n }\n}\n\nexport const forward = new CursorFactory(ForwardTokenCursor, ForwardTokenCommentCursor)\nexport const backward = new CursorFactory(BackwardTokenCursor, BackwardTokenCommentCursor)\n", "/**\n * @fileoverview Define the cursor which iterates tokens only, with inflated range.\n * @author Toru Nagashima\n */\nimport {Token} from \"../../../ast\"\nimport ForwardTokenCursor from \"./forward-token-cursor\"\n\n/**\n * The cursor which iterates tokens only, with inflated range.\n * This is for the backward compatibility of padding options.\n */\nexport default class PaddedTokenCursor extends ForwardTokenCursor {\n /**\n * Initializes this cursor.\n * @param tokens - The array of tokens.\n * @param comments - The array of comments.\n * @param indexMap - The map from locations to indices in `tokens`.\n * @param startLoc - The start location of the iteration range.\n * @param endLoc - The end location of the iteration range.\n * @param beforeCount - The number of tokens this cursor iterates before start.\n * @param afterCount - The number of tokens this cursor iterates after end.\n */\n constructor(tokens: Token[], comments: Token[], indexMap: { [key: number]: number }, startLoc: number, endLoc: number, beforeCount: number, afterCount: number) {\n super(tokens, comments, indexMap, startLoc, endLoc)\n this.index = Math.max(0, this.index - beforeCount)\n this.indexEnd = Math.min(tokens.length - 1, this.indexEnd + afterCount)\n }\n}\n", "/**\n * @fileoverview Object to handle access and retrieval of tokens.\n * @author Brandon Mills\n */\nimport assert from \"assert\"\nimport {HasLocation, Token} from \"../../ast\"\nimport * as cursors from \"./cursors\"\nimport Cursor from \"./cursors/cursor\"\nimport ForwardTokenCursor from \"./cursors/forward-token-cursor\"\nimport PaddedTokenCursor from \"./cursors/padded-token-cursor\"\nimport {search} from \"./utils\"\n\nexport type SkipOptions = number | ((token: Token) => boolean) | {\n includeComments?: boolean\n filter?: (token: Token) => boolean\n skip?: number\n}\nexport type CountOptions = number | ((token: Token) => boolean) | {\n includeComments?: boolean\n filter?: (token: Token) => boolean\n count?: number\n}\n\n/**\n * Check whether the given token is a comment token or not.\n * @param token The token to check.\n * @returns `true` if the token is a comment token.\n */\nfunction isCommentToken(token: Token): boolean {\n return token.type === \"Line\" || token.type === \"Block\" || token.type === \"Shebang\"\n}\n\n/**\n * Creates the map from locations to indices in `tokens`.\n *\n * The first/last location of tokens is mapped to the index of the token.\n * The first/last location of comments is mapped to the index of the next token of each comment.\n *\n * @param tokens - The array of tokens.\n * @param comments - The array of comments.\n * @returns The map from locations to indices in `tokens`.\n * @private\n */\nfunction createIndexMap(tokens: Token[], comments: Token[]): { [key: number]: number } {\n const map = Object.create(null)\n let tokenIndex = 0\n let commentIndex = 0\n let nextStart = 0\n let range: [number, number] | null = null\n\n while (tokenIndex < tokens.length || commentIndex < comments.length) {\n nextStart = (commentIndex < comments.length) ? comments[commentIndex].range[0] : Number.MAX_SAFE_INTEGER\n while (tokenIndex < tokens.length && (range = tokens[tokenIndex].range)[0] < nextStart) {\n map[range[0]] = tokenIndex\n map[range[1] - 1] = tokenIndex\n tokenIndex += 1\n }\n\n nextStart = (tokenIndex < tokens.length) ? tokens[tokenIndex].range[0] : Number.MAX_SAFE_INTEGER\n while (commentIndex < comments.length && (range = comments[commentIndex].range)[0] < nextStart) {\n map[range[0]] = tokenIndex\n map[range[1] - 1] = tokenIndex\n commentIndex += 1\n }\n }\n\n return map\n}\n\n/**\n * Creates the cursor iterates tokens with options.\n *\n * @param factory - The cursor factory to initialize cursor.\n * @param tokens - The array of tokens.\n * @param comments - The array of comments.\n * @param indexMap - The map from locations to indices in `tokens`.\n * @param startLoc - The start location of the iteration range.\n * @param endLoc - The end location of the iteration range.\n * @param opts - The option object. If this is a number then it's `opts.skip`. If this is a function then it's `opts.filter`.\n * @returns The created cursor.\n * @private\n */\nfunction createCursorWithSkip(factory: cursors.CursorFactory, tokens: Token[], comments: Token[], indexMap: { [key: number]: number }, startLoc: number, endLoc: number, opts?: SkipOptions): Cursor {\n let includeComments = false\n let skip = 0\n let filter: ((token: Token) => boolean) | null = null\n\n if (typeof opts === \"number\") {\n skip = opts | 0\n }\n else if (typeof opts === \"function\") {\n filter = opts\n }\n else if (opts) {\n includeComments = Boolean(opts.includeComments)\n skip = opts.skip || 0\n filter = opts.filter || null\n }\n assert(skip >= 0, \"options.skip should be zero or a positive integer.\")\n assert(!filter || typeof filter === \"function\", \"options.filter should be a function.\")\n\n return factory.createCursor(tokens, comments, indexMap, startLoc, endLoc, includeComments, filter, skip, -1)\n}\n\n/**\n * Creates the cursor iterates tokens with options.\n *\n * @param factory - The cursor factory to initialize cursor.\n * @param tokens - The array of tokens.\n * @param comments - The array of comments.\n * @param indexMap - The map from locations to indices in `tokens`.\n * @param startLoc - The start location of the iteration range.\n * @param endLoc - The end location of the iteration range.\n * @param opts - The option object. If this is a number then it's `opts.count`. If this is a function then it's `opts.filter`.\n * @returns The created cursor.\n * @private\n */\nfunction createCursorWithCount(factory: cursors.CursorFactory, tokens: Token[], comments: Token[], indexMap: { [key: number]: number }, startLoc: number, endLoc: number, opts?: CountOptions): Cursor {\n let includeComments = false\n let count = 0\n let countExists = false\n let filter: ((token: Token) => boolean) | null = null\n\n if (typeof opts === \"number\") {\n count = opts | 0\n countExists = true\n }\n else if (typeof opts === \"function\") {\n filter = opts\n }\n else if (opts) {\n includeComments = Boolean(opts.includeComments)\n count = opts.count || 0\n countExists = typeof opts.count === \"number\"\n filter = opts.filter || null\n }\n assert(count >= 0, \"options.count should be zero or a positive integer.\")\n assert(!filter || typeof filter === \"function\", \"options.filter should be a function.\")\n\n return factory.createCursor(tokens, comments, indexMap, startLoc, endLoc, includeComments, filter, 0, countExists ? count : -1)\n}\n\n/**\n * Creates the cursor iterates tokens with options.\n *\n * @param tokens - The array of tokens.\n * @param comments - The array of comments.\n * @param indexMap - The map from locations to indices in `tokens`.\n * @param startLoc - The start location of the iteration range.\n * @param endLoc - The end location of the iteration range.\n * @param beforeCount - The number of tokens before the node to retrieve.\n * @param afterCount - The number of tokens after the node to retrieve.\n * @returns The created cursor.\n * @private\n */\nfunction createCursorWithPadding(tokens: Token[], comments: Token[], indexMap: { [key: number]: number }, startLoc: number, endLoc: number, beforeCount?: CountOptions, afterCount?: number): Cursor {\n if (typeof beforeCount === \"undefined\" && typeof afterCount === \"undefined\") {\n return new ForwardTokenCursor(tokens, comments, indexMap, startLoc, endLoc)\n }\n if (typeof beforeCount === \"number\" || typeof beforeCount === \"undefined\") {\n return new PaddedTokenCursor(tokens, comments, indexMap, startLoc, endLoc, beforeCount || 0, afterCount || 0)\n }\n return createCursorWithCount(cursors.forward, tokens, comments, indexMap, startLoc, endLoc, beforeCount)\n}\n\n/**\n * Gets comment tokens that are adjacent to the current cursor position.\n * @param cursor - A cursor instance.\n * @returns An array of comment tokens adjacent to the current cursor position.\n * @private\n */\nfunction getAdjacentCommentTokensFromCursor(cursor: Cursor): Token[] {\n const tokens: Token[] = []\n let currentToken = cursor.getOneToken()\n\n while (currentToken && isCommentToken(currentToken)) {\n tokens.push(currentToken)\n currentToken = cursor.getOneToken()\n }\n\n return tokens\n}\n\n//------------------------------------------------------------------------------\n// Exports\n//------------------------------------------------------------------------------\n\n/**\n * The token store.\n *\n * This class provides methods to get tokens by locations as fast as possible.\n * The methods are a part of public API, so we should be careful if it changes this class.\n *\n * People can get tokens in O(1) by the hash map which is mapping from the location of tokens/comments to tokens.\n * Also people can get a mix of tokens and comments in O(log k), the k is the number of comments.\n * Assuming that comments to be much fewer than tokens, this does not make hash map from token's locations to comments to reduce memory cost.\n * This uses binary-searching instead for comments.\n */\nexport default class TokenStore {\n private _tokens: Token[]\n private _comments: Token[]\n private _indexMap: { [key: number]: number }\n\n /**\n * Initializes this token store.\n * @param tokens - The array of tokens.\n * @param comments - The array of comments.\n */\n constructor(tokens: Token[], comments: Token[]) {\n this._tokens = tokens\n this._comments = comments\n this._indexMap = createIndexMap(tokens, comments)\n }\n\n //--------------------------------------------------------------------------\n // Gets single token.\n //--------------------------------------------------------------------------\n\n /**\n * Gets the token starting at the specified index.\n * @param offset - Index of the start of the token's range.\n * @param options - The option object.\n * @returns The token starting at index, or null if no such token.\n */\n getTokenByRangeStart(offset: number, options?: { includeComments: boolean }): Token | null {\n const includeComments = Boolean(options && options.includeComments)\n const token = cursors.forward.createBaseCursor(\n this._tokens,\n this._comments,\n this._indexMap,\n offset,\n -1,\n includeComments\n ).getOneToken()\n\n if (token && token.range[0] === offset) {\n return token\n }\n return null\n }\n\n /**\n * Gets the first token of the given node.\n * @param node - The AST node.\n * @param options - The option object.\n * @returns An object representing the token.\n */\n getFirstToken(node: HasLocation, options?: SkipOptions): Token | null {\n return createCursorWithSkip(\n cursors.forward,\n this._tokens,\n this._comments,\n this._indexMap,\n node.range[0],\n node.range[1],\n options\n ).getOneToken()\n }\n\n /**\n * Gets the last token of the given node.\n * @param node - The AST node.\n * @param options - The option object.\n * @returns An object representing the token.\n */\n getLastToken(node: HasLocation, options?: SkipOptions): Token | null {\n return createCursorWithSkip(\n cursors.backward,\n this._tokens,\n this._comments,\n this._indexMap,\n node.range[0],\n node.range[1],\n options\n ).getOneToken()\n }\n\n /**\n * Gets the token that precedes a given node or token.\n * @param node - The AST node or token.\n * @param options - The option object.\n * @returns An object representing the token.\n */\n getTokenBefore(node: HasLocation, options?: SkipOptions): Token | null {\n return createCursorWithSkip(\n cursors.backward,\n this._tokens,\n this._comments,\n this._indexMap,\n -1,\n node.range[0],\n options\n ).getOneToken()\n }\n\n /**\n * Gets the token that follows a given node or token.\n * @param node - The AST node or token.\n * @param options - The option object.\n * @returns An object representing the token.\n */\n getTokenAfter(node: HasLocation, options?: SkipOptions): Token | null {\n return createCursorWithSkip(\n cursors.forward,\n this._tokens,\n this._comments,\n this._indexMap,\n node.range[1],\n -1,\n options\n ).getOneToken()\n }\n\n /**\n * Gets the first token between two non-overlapping nodes.\n * @param left - Node before the desired token range.\n * @param right - Node after the desired token range.\n * @param options - The option object.\n * @returns An object representing the token.\n */\n getFirstTokenBetween(left: HasLocation, right: HasLocation, options?: SkipOptions): Token | null {\n return createCursorWithSkip(\n cursors.forward,\n this._tokens,\n this._comments,\n this._indexMap,\n left.range[1],\n right.range[0],\n options\n ).getOneToken()\n }\n\n /**\n * Gets the last token between two non-overlapping nodes.\n * @param left Node before the desired token range.\n * @param right Node after the desired token range.\n * @param options - The option object.\n * @returns An object representing the token.\n */\n getLastTokenBetween(left: HasLocation, right: HasLocation, options?: SkipOptions): Token | null {\n return createCursorWithSkip(\n cursors.backward,\n this._tokens,\n this._comments,\n this._indexMap,\n left.range[1],\n right.range[0],\n options\n ).getOneToken()\n }\n\n /**\n * Gets the token that precedes a given node or token in the token stream.\n * This is defined for backward compatibility. Use `includeComments` option instead.\n * TODO: We have a plan to remove this in a future major version.\n * @param node The AST node or token.\n * @param skip A number of tokens to skip.\n * @returns An object representing the token.\n * @deprecated\n */\n getTokenOrCommentBefore(node: HasLocation, skip?: number): Token | null {\n return this.getTokenBefore(node, {includeComments: true, skip})\n }\n\n /**\n * Gets the token that follows a given node or token in the token stream.\n * This is defined for backward compatibility. Use `includeComments` option instead.\n * TODO: We have a plan to remove this in a future major version.\n * @param node The AST node or token.\n * @param skip A number of tokens to skip.\n * @returns An object representing the token.\n * @deprecated\n */\n getTokenOrCommentAfter(node: HasLocation, skip?: number): Token | null {\n return this.getTokenAfter(node, {includeComments: true, skip})\n }\n\n //--------------------------------------------------------------------------\n // Gets multiple tokens.\n //--------------------------------------------------------------------------\n\n /**\n * Gets the first `count` tokens of the given node.\n * @param node - The AST node.\n * @param [options=0] - The option object. If this is a number then it's `options.count`. If this is a function then it's `options.filter`.\n * @param [options.includeComments=false] - The flag to iterate comments as well.\n * @param [options.filter=null] - The predicate function to choose tokens.\n * @param [options.count=0] - The maximum count of tokens the cursor iterates.\n * @returns Tokens.\n */\n getFirstTokens(node: HasLocation, options?: CountOptions): Token[] {\n return createCursorWithCount(\n cursors.forward,\n this._tokens,\n this._comments,\n this._indexMap,\n node.range[0],\n node.range[1],\n options\n ).getAllTokens()\n }\n\n /**\n * Gets the last `count` tokens of the given node.\n * @param node - The AST node.\n * @param [options=0] - The option object. Same options as getFirstTokens()\n * @returns Tokens.\n */\n getLastTokens(node: HasLocation, options?: CountOptions) {\n return createCursorWithCount(\n cursors.backward,\n this._tokens,\n this._comments,\n this._indexMap,\n node.range[0],\n node.range[1],\n options\n ).getAllTokens().reverse()\n }\n\n /**\n * Gets the `count` tokens that precedes a given node or token.\n * @param node - The AST node or token.\n * @param [options=0] - The option object. Same options as getFirstTokens()\n * @returns Tokens.\n */\n getTokensBefore(node: HasLocation, options?: CountOptions): Token[] {\n return createCursorWithCount(\n cursors.backward,\n this._tokens,\n this._comments,\n this._indexMap,\n -1,\n node.range[0],\n options\n ).getAllTokens().reverse()\n }\n\n /**\n * Gets the `count` tokens that follows a given node or token.\n * @param node - The AST node or token.\n * @param [options=0] - The option object. Same options as getFirstTokens()\n * @returns Tokens.\n */\n getTokensAfter(node: HasLocation, options?: CountOptions): Token[] {\n return createCursorWithCount(\n cursors.forward,\n this._tokens,\n this._comments,\n this._indexMap,\n node.range[1],\n -1,\n options\n ).getAllTokens()\n }\n\n /**\n * Gets the first `count` tokens between two non-overlapping nodes.\n * @param left - Node before the desired token range.\n * @param right - Node after the desired token range.\n * @param [options=0] - The option object. Same options as getFirstTokens()\n * @returns Tokens between left and right.\n */\n getFirstTokensBetween(left: HasLocation, right: HasLocation, options?: CountOptions): Token[] {\n return createCursorWithCount(\n cursors.forward,\n this._tokens,\n this._comments,\n this._indexMap,\n left.range[1],\n right.range[0],\n options\n ).getAllTokens()\n }\n\n /**\n * Gets the last `count` tokens between two non-overlapping nodes.\n * @param left Node before the desired token range.\n * @param right Node after the desired token range.\n * @param [options=0] - The option object. Same options as getFirstTokens()\n * @returns Tokens between left and right.\n */\n getLastTokensBetween(left: HasLocation, right: HasLocation, options?: CountOptions): Token[] {\n return createCursorWithCount(\n cursors.backward,\n this._tokens,\n this._comments,\n this._indexMap,\n left.range[1],\n right.range[0],\n options\n ).getAllTokens().reverse()\n }\n\n /**\n * Gets all tokens that are related to the given node.\n * @param node - The AST node.\n * @param beforeCount - The number of tokens before the node to retrieve.\n * @param afterCount - The number of tokens after the node to retrieve.\n * @returns Array of objects representing tokens.\n */\n getTokens(node: HasLocation, beforeCount?: CountOptions, afterCount?: number): Token[] {\n return createCursorWithPadding(\n this._tokens,\n this._comments,\n this._indexMap,\n node.range[0],\n node.range[1],\n beforeCount,\n afterCount\n ).getAllTokens()\n }\n\n /**\n * Gets all of the tokens between two non-overlapping nodes.\n * @param left Node before the desired token range.\n * @param right Node after the desired token range.\n * @param padding Number of extra tokens on either side of center.\n * @returns Tokens between left and right.\n */\n getTokensBetween(left: HasLocation, right: HasLocation, padding?: CountOptions): Token[] {\n return createCursorWithPadding(\n this._tokens,\n this._comments,\n this._indexMap,\n left.range[1],\n right.range[0],\n padding,\n typeof padding === \"number\" ? padding : undefined\n ).getAllTokens()\n }\n\n //--------------------------------------------------------------------------\n // Others.\n //--------------------------------------------------------------------------\n\n /**\n * Checks whether any comments exist or not between the given 2 nodes.\n *\n * @param left - The node to check.\n * @param right - The node to check.\n * @returns `true` if one or more comments exist.\n */\n commentsExistBetween(left: HasLocation, right: HasLocation): boolean {\n const index = search(this._comments, left.range[1])\n\n return (\n index < this._comments.length &&\n this._comments[index].range[1] <= right.range[0]\n )\n }\n\n /**\n * Gets all comment tokens directly before the given node or token.\n * @param nodeOrToken The AST node or token to check for adjacent comment tokens.\n * @returns An array of comments in occurrence order.\n */\n getCommentsBefore(nodeOrToken: HasLocation): Token[] {\n const cursor = createCursorWithCount(\n cursors.backward,\n this._tokens,\n this._comments,\n this._indexMap,\n -1,\n nodeOrToken.range[0],\n {includeComments: true}\n )\n\n return getAdjacentCommentTokensFromCursor(cursor).reverse()\n }\n\n /**\n * Gets all comment tokens directly after the given node or token.\n * @param nodeOrToken The AST node or token to check for adjacent comment tokens.\n * @returns An array of comments in occurrence order.\n */\n getCommentsAfter(nodeOrToken: HasLocation): Token[] {\n const cursor = createCursorWithCount(\n cursors.forward,\n this._tokens,\n this._comments,\n this._indexMap,\n nodeOrToken.range[1],\n -1,\n {includeComments: true}\n )\n\n return getAdjacentCommentTokensFromCursor(cursor)\n }\n\n /**\n * Gets all comment tokens inside the given node.\n * @param node The AST node to get the comments for.\n * @returns An array of comments in occurrence order.\n */\n getCommentsInside(node: HasLocation): Token[] {\n return this.getTokens(node, {\n includeComments: true,\n filter: isCommentToken,\n })\n }\n}\n", "import type { Rule, SourceCode } from \"eslint\"\nimport type { ScopeManager, Scope } from \"eslint-scope\"\nimport type {\n ESLintExtendedProgram,\n Node,\n OffsetRange,\n VDocumentFragment,\n VElement,\n VExpressionContainer,\n VText,\n} from \"../../ast\"\nimport { getFallbackKeys, ParseError } from \"../../ast\"\nimport { getEslintScope } from \"../../common/eslint-scope\"\nimport { getEcmaVersionIfUseEspree } from \"../../common/espree\"\nimport { fixErrorLocation, fixLocations } from \"../../common/fix-locations\"\nimport type { LocationCalculatorForHtml } from \"../../common/location-calculator\"\nimport type { ParserObject } from \"../../common/parser-object\"\nimport { isEnhancedParserObject } from \"../../common/parser-object\"\nimport type { ParserOptions } from \"../../common/parser-options\"\nimport { DEFAULT_ECMA_VERSION } from \"../../script-setup/parser-options\"\n\nexport type ESLintCustomBlockParser = ParserObject<any, any>\n\nexport type CustomBlockContext = {\n getSourceCode(): SourceCode\n parserServices: any\n getAncestors(): any[]\n getDeclaredVariables(node: any): any[]\n getScope(): any\n markVariableAsUsed(name: string): boolean\n\n // Same as the original context.\n id: string\n options: any[]\n settings: { [name: string]: any }\n parserPath: string\n parserOptions: any\n getFilename(): string\n report(descriptor: Rule.ReportDescriptor): void\n}\n\n/**\n * Checks whether the given node is VElement.\n */\nfunction isVElement(\n node: VElement | VExpressionContainer | VText,\n): node is VElement {\n return node.type === \"VElement\"\n}\n\n/**\n * Get the all custom blocks from given document\n * @param document\n */\nexport function getCustomBlocks(\n document: VDocumentFragment | null,\n): VElement[] {\n return document\n ? document.children\n .filter(isVElement)\n .filter(\n (block) =>\n block.name !== \"script\" &&\n block.name !== \"template\" &&\n block.name !== \"style\",\n )\n : []\n}\n\n/**\n * Parse the source code of the given custom block element.\n * @param node The custom block element to parse.\n * @param parser The custom parser.\n * @param globalLocationCalculator The location calculator for fixLocations.\n * @param parserOptions The parser options.\n * @returns The result of parsing.\n */\nexport function parseCustomBlockElement(\n node: VElement,\n parser: ESLintCustomBlockParser,\n globalLocationCalculator: LocationCalculatorForHtml,\n parserOptions: ParserOptions,\n): ESLintExtendedProgram & { error?: ParseError | Error } {\n const text = node.children[0]\n const { code, range, loc } =\n text != null && text.type === \"VText\"\n ? {\n code: text.value,\n range: text.range,\n loc: text.loc,\n }\n : {\n code: \"\",\n range: [\n node.startTag.range[1],\n node.endTag!.range[0],\n ] as OffsetRange,\n loc: {\n start: node.startTag.loc.end,\n end: node.endTag!.loc.start,\n },\n }\n const locationCalculator = globalLocationCalculator.getSubCalculatorAfter(\n range[0],\n )\n try {\n return parseCustomBlockFragment(\n code,\n parser,\n locationCalculator,\n parserOptions,\n )\n } catch (e) {\n if (!(e instanceof Error)) {\n throw e\n }\n return {\n error: e,\n ast: {\n type: \"Program\",\n sourceType: \"module\",\n loc: {\n start: {\n ...loc.start,\n },\n end: {\n ...loc.end,\n },\n },\n range: [...range],\n body: [],\n tokens: [],\n comments: [],\n },\n }\n }\n}\n\n/**\n * Parse the given source code.\n *\n * @param code The source code to parse.\n * @param parser The custom parser.\n * @param locationCalculator The location calculator for fixLocations.\n * @param parserOptions The parser options.\n * @returns The result of parsing.\n */\nfunction parseCustomBlockFragment(\n code: string,\n parser: ESLintCustomBlockParser,\n locationCalculator: LocationCalculatorForHtml,\n parserOptions: ParserOptions,\n): ESLintExtendedProgram {\n try {\n const result = parseBlock(code, parser, {\n ecmaVersion: DEFAULT_ECMA_VERSION,\n loc: true,\n range: true,\n raw: true,\n tokens: true,\n comment: true,\n eslintVisitorKeys: true,\n eslintScopeManager: true,\n ...parserOptions,\n })\n fixLocations(result, locationCalculator)\n return result\n } catch (err) {\n const perr = ParseError.normalize(err)\n if (perr) {\n fixErrorLocation(perr, locationCalculator)\n throw perr\n }\n throw err\n }\n}\n\nfunction parseBlock(\n code: string,\n parser: ESLintCustomBlockParser,\n parserOptions: any,\n): any {\n const result = isEnhancedParserObject(parser)\n ? parser.parseForESLint(code, parserOptions)\n : parser.parse(code, parserOptions)\n\n if (result.ast != null) {\n return result\n }\n return { ast: result }\n}\n\n/**\n * Create shared context.\n *\n * @param text The source code of SFC.\n * @param customBlock The custom block node.\n * @param parsedResult The parse result data\n * @param parserOptions The parser options.\n */\nexport function createCustomBlockSharedContext({\n text,\n customBlock,\n parsedResult,\n globalLocationCalculator,\n parserOptions,\n}: {\n text: string\n customBlock: VElement\n parsedResult: ESLintExtendedProgram & { error?: ParseError | Error }\n globalLocationCalculator: LocationCalculatorForHtml\n parserOptions: any\n}) {\n let sourceCode: SourceCode\n let scopeManager: ScopeManager\n let currentNode: any\n return {\n serCurrentNode(node: any) {\n currentNode = node\n },\n context: {\n getAncestors: () => getAncestors(currentNode),\n\n getDeclaredVariables: (...args: any[]) =>\n // @ts-expect-error -- ignore\n getScopeManager().getDeclaredVariables(...args),\n getScope: () => getScope(getScopeManager(), currentNode),\n markVariableAsUsed: (name: string) =>\n markVariableAsUsed(\n getScopeManager(),\n currentNode,\n parserOptions,\n name,\n ),\n parserServices: {\n customBlock,\n parseCustomBlockElement(\n parser: ESLintCustomBlockParser,\n options: any,\n ) {\n return parseCustomBlockElement(\n customBlock,\n parser,\n globalLocationCalculator,\n { ...parserOptions, ...options },\n )\n },\n ...(parsedResult.services || {}),\n ...(parsedResult.error\n ? { parseError: parsedResult.error }\n : {}),\n },\n getSourceCode,\n },\n }\n\n function getSourceCode() {\n return (\n sourceCode ||\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n (sourceCode = new (require(\"eslint\").SourceCode)({\n text,\n ast: parsedResult.ast,\n parserServices: parsedResult.services,\n scopeManager: getScopeManager(),\n visitorKeys: parsedResult.visitorKeys,\n }))\n )\n }\n\n function getScopeManager() {\n if (parsedResult.scopeManager || scopeManager) {\n return parsedResult.scopeManager || scopeManager\n }\n\n const ecmaVersion = getEcmaVersionIfUseEspree(parserOptions) || 2022\n const ecmaFeatures = parserOptions.ecmaFeatures || {}\n const sourceType = parserOptions.sourceType || \"script\"\n scopeManager = getEslintScope().analyze(parsedResult.ast, {\n ignoreEval: true,\n nodejsScope: false,\n impliedStrict: ecmaFeatures.impliedStrict,\n ecmaVersion,\n sourceType,\n fallback: getFallbackKeys,\n })\n return scopeManager\n }\n}\n\n/* The following source code is copied from `eslint/lib/linter/linter.js` */\n\n/**\n * Gets all the ancestors of a given node\n * @param {ASTNode} node The node\n * @returns {ASTNode[]} All the ancestor nodes in the AST, not including the provided node, starting\n * from the root node and going inwards to the parent node.\n */\nfunction getAncestors(node: Node) {\n const ancestorsStartingAtParent = []\n\n for (let ancestor = node.parent; ancestor; ancestor = ancestor.parent) {\n ancestorsStartingAtParent.push(ancestor)\n }\n\n return ancestorsStartingAtParent.reverse()\n}\n\n/**\n * Gets the scope for the current node\n * @param {ScopeManager} scopeManager The scope manager for this AST\n * @param {ASTNode} currentNode The node to get the scope of\n * @returns {eslint-scope.Scope} The scope information for this node\n */\nfunction getScope(scopeManager: ScopeManager, currentNode: Node) {\n // On Program node, get the outermost scope to avoid return Node.js special function scope or ES modules scope.\n const inner = currentNode.type !== \"Program\"\n\n for (\n let node: Node | null = currentNode;\n node;\n node = node.parent || null\n ) {\n const scope = scopeManager.acquire(node as any, inner)\n\n if (scope) {\n if (scope.type === \"function-expression-name\") {\n return scope.childScopes[0]\n }\n return scope\n }\n }\n\n return scopeManager.scopes[0]\n}\n\n/**\n * Marks a variable as used in the current scope\n * @param {ScopeManager} scopeManager The scope manager for this AST. The scope may be mutated by this function.\n * @param {ASTNode} currentNode The node currently being traversed\n * @param {Object} parserOptions The options used to parse this text\n * @param {string} name The name of the variable that should be marked as used.\n * @returns {boolean} True if the variable was found and marked as used, false if not.\n */\nfunction markVariableAsUsed(\n scopeManager: ScopeManager,\n currentNode: Node,\n parserOptions: any,\n name: string,\n) {\n const hasGlobalReturn =\n parserOptions.ecmaFeatures && parserOptions.ecmaFeatures.globalReturn\n const specialScope =\n hasGlobalReturn || parserOptions.sourceType === \"module\"\n const currentScope = getScope(scopeManager, currentNode)\n\n // Special Node.js scope means we need to start one level deeper\n const initialScope =\n currentScope.type === \"global\" && specialScope\n ? currentScope.childScopes[0]\n : currentScope\n\n for (let scope: Scope | null = initialScope; scope; scope = scope.upper) {\n const variable = scope.variables.find(\n (scopeVar) => scopeVar.name === name,\n )\n\n if (variable) {\n // @ts-expect-error -- ignore\n variable.eslintUsed = true\n return true\n }\n }\n\n return false\n}\n", "/**\n * @author Toru Nagashima <https://github.com/mysticatea>\n * @copyright 2017 Toru Nagashima. All rights reserved.\n * See LICENSE file in root directory for full license.\n */\nimport type { Rule } from \"eslint\"\nimport EventEmitter from \"events\"\nimport NodeEventGenerator from \"./external/node-event-generator\"\nimport TokenStore from \"./external/token-store\"\nimport type {\n ESLintProgram,\n VElement,\n VDocumentFragment,\n VAttribute,\n} from \"./ast\"\nimport { getFallbackKeys, KEYS, traverseNodes } from \"./ast/traverse\"\nimport type { LocationCalculatorForHtml } from \"./common/location-calculator\"\nimport type {\n CustomBlockContext,\n ESLintCustomBlockParser,\n} from \"./sfc/custom-block\"\nimport {\n createCustomBlockSharedContext,\n getCustomBlocks,\n parseCustomBlockElement,\n} from \"./sfc/custom-block\"\nimport type { ParserOptions } from \"./common/parser-options\"\nimport { isSFCFile } from \"./common/parser-options\"\nimport { getLang } from \"./common/ast-utils\"\n\n//------------------------------------------------------------------------------\n// Helpers\n//------------------------------------------------------------------------------\n\ntype CustomBlockVisitorFactory = (context: CustomBlockContext) =>\n | {\n [key: string]: (...args: any) => void\n }\n | null\n | undefined\n\n//------------------------------------------------------------------------------\n// Exports\n//------------------------------------------------------------------------------\n\nexport interface ParserServices {\n /**\n * Define handlers to traverse the template body.\n * @param templateBodyVisitor The template body handlers.\n * @param scriptVisitor The script handlers. This is optional.\n * @param options The options. This is optional.\n */\n defineTemplateBodyVisitor(\n templateBodyVisitor: { [key: string]: (...args: any) => void },\n scriptVisitor?: { [key: string]: (...args: any) => void },\n options?: { templateBodyTriggerSelector: \"Program\" | \"Program:exit\" },\n ): object\n\n /**\n * Define handlers to traverse the document.\n * @param documentVisitor The document handlers.\n * @param options The options. This is optional.\n */\n defineDocumentVisitor(\n documentVisitor: { [key: string]: (...args: any) => void },\n options?: { triggerSelector: \"Program\" | \"Program:exit\" },\n ): object\n\n /**\n * Define handlers to traverse custom blocks.\n * @param context The rule context.\n * @param parser The custom parser.\n * @param rule The custom block rule definition\n * @param scriptVisitor The script handlers. This is optional.\n */\n defineCustomBlocksVisitor(\n context: Rule.RuleContext,\n parser: ESLintCustomBlockParser,\n rule: {\n target:\n | string\n | string[]\n | ((lang: string | null, customBlock: VElement) => boolean)\n create: CustomBlockVisitorFactory\n },\n scriptVisitor: { [key: string]: (...args: any) => void },\n ): { [key: string]: (...args: any) => void }\n\n /**\n * Get the token store of the template body.\n * @returns The token store of template body.\n */\n getTemplateBodyTokenStore(): TokenStore\n\n /**\n * Get the root document fragment.\n * @returns The root document fragment.\n */\n getDocumentFragment(): VDocumentFragment | null\n}\n\n/**\n * Define the parser service\n * @param rootAST\n */\nexport function define(\n sourceText: string,\n rootAST: ESLintProgram,\n document: VDocumentFragment | null,\n globalLocationCalculator: LocationCalculatorForHtml | null,\n { parserOptions }: { parserOptions: ParserOptions },\n): ParserServices {\n const templateBodyEmitters = new Map<string, EventEmitter>()\n const stores = new WeakMap<object, TokenStore>()\n\n const documentEmitters = new Map<string, EventEmitter>()\n\n const customBlocksEmitters = new Map<\n | ESLintCustomBlockParser[\"parseForESLint\"]\n | ESLintCustomBlockParser[\"parse\"],\n {\n context: Rule.RuleContext\n test: (lang: string | null, customBlock: VElement) => boolean\n create: CustomBlockVisitorFactory\n }[]\n >()\n\n const isSFC = isSFCFile(parserOptions)\n\n return {\n /**\n * Define handlers to traverse the template body.\n * @param templateBodyVisitor The template body handlers.\n * @param scriptVisitor The script handlers. This is optional.\n */\n defineTemplateBodyVisitor(\n templateBodyVisitor: { [key: string]: (...args: any) => void },\n scriptVisitor?: { [key: string]: (...args: any) => void },\n options?: {\n templateBodyTriggerSelector: \"Program\" | \"Program:exit\"\n },\n ): object {\n if (scriptVisitor == null) {\n scriptVisitor = {} //eslint-disable-line no-param-reassign\n }\n if (rootAST.templateBody == null) {\n return scriptVisitor\n }\n const templateBodyTriggerSelector =\n options?.templateBodyTriggerSelector ?? \"Program:exit\"\n\n let emitter = templateBodyEmitters.get(templateBodyTriggerSelector)\n\n // If this is the first time, initialize the intermediate event emitter.\n if (emitter == null) {\n emitter = new EventEmitter()\n emitter.setMaxListeners(0)\n templateBodyEmitters.set(templateBodyTriggerSelector, emitter)\n\n const programExitHandler =\n scriptVisitor[templateBodyTriggerSelector]\n scriptVisitor[templateBodyTriggerSelector] = (node) => {\n try {\n if (typeof programExitHandler === \"function\") {\n programExitHandler(node)\n }\n\n // Traverse template body.\n const generator = new NodeEventGenerator(emitter!, {\n visitorKeys: KEYS,\n fallback: getFallbackKeys,\n })\n traverseNodes(\n rootAST.templateBody as VElement,\n generator,\n )\n } finally {\n // @ts-expect-error -- ignore\n scriptVisitor[templateBodyTriggerSelector] =\n programExitHandler\n templateBodyEmitters.delete(templateBodyTriggerSelector)\n }\n }\n }\n\n // Register handlers into the intermediate event emitter.\n for (const selector of Object.keys(templateBodyVisitor)) {\n emitter.on(selector, templateBodyVisitor[selector])\n }\n\n return scriptVisitor\n },\n\n /**\n * Define handlers to traverse the document.\n * @param documentVisitor The document handlers.\n * @param options The options. This is optional.\n */\n defineDocumentVisitor(\n documentVisitor: { [key: string]: (...args: any) => void },\n options?: { triggerSelector: \"Program\" | \"Program:exit\" },\n ): object {\n const scriptVisitor: { [key: string]: (...args: any) => void } = {}\n if (!document) {\n return scriptVisitor\n }\n\n const documentTriggerSelector =\n options?.triggerSelector ?? \"Program:exit\"\n\n let emitter = documentEmitters.get(documentTriggerSelector)\n\n // If this is the first time, initialize the intermediate event emitter.\n if (emitter == null) {\n emitter = new EventEmitter()\n emitter.setMaxListeners(0)\n documentEmitters.set(documentTriggerSelector, emitter)\n\n const programExitHandler =\n scriptVisitor[documentTriggerSelector]\n scriptVisitor[documentTriggerSelector] = (node) => {\n try {\n if (typeof programExitHandler === \"function\") {\n programExitHandler(node)\n }\n\n // Traverse document.\n const generator = new NodeEventGenerator(emitter!, {\n visitorKeys: KEYS,\n fallback: getFallbackKeys,\n })\n traverseNodes(document, generator)\n } finally {\n scriptVisitor[documentTriggerSelector] =\n programExitHandler\n documentEmitters.delete(documentTriggerSelector)\n }\n }\n }\n\n // Register handlers into the intermediate event emitter.\n for (const selector of Object.keys(documentVisitor)) {\n emitter.on(selector, documentVisitor[selector])\n }\n\n return scriptVisitor\n },\n\n /**\n * Define handlers to traverse custom blocks.\n * @param context The rule context.\n * @param parser The custom parser.\n * @param rule The custom block rule definition\n * @param scriptVisitor The script handlers. This is optional.\n */\n defineCustomBlocksVisitor(\n context: Rule.RuleContext,\n parser: ESLintCustomBlockParser,\n rule: {\n target:\n | string\n | string[]\n | ((lang: string | null, customBlock: VElement) => boolean)\n create: CustomBlockVisitorFactory\n },\n scriptVisitor: { [key: string]: (...args: any) => void },\n ): { [key: string]: (...args: any) => void } {\n if (scriptVisitor == null) {\n scriptVisitor = {} //eslint-disable-line no-param-reassign\n }\n if (!isSFC) {\n return scriptVisitor\n }\n parserOptions = { ...parserOptions } //eslint-disable-line no-param-reassign\n const customBlocks = getCustomBlocks(document).filter(\n (block) =>\n block.endTag &&\n !block.startTag.attributes.some(\n (attr): attr is VAttribute =>\n !attr.directive && attr.key.name === \"src\",\n ),\n )\n if (!customBlocks.length || globalLocationCalculator == null) {\n return {}\n }\n const key = parser.parseForESLint ?? parser.parse\n let factories = customBlocksEmitters.get(key)\n\n // If this is the first time, initialize the intermediate event emitter.\n if (factories == null) {\n factories = []\n customBlocksEmitters.set(key, factories)\n const visitorFactories = factories\n\n const programExitHandler = scriptVisitor[\"Program:exit\"]\n scriptVisitor[\"Program:exit\"] = (node) => {\n try {\n if (typeof programExitHandler === \"function\") {\n programExitHandler(node)\n }\n for (const customBlock of customBlocks) {\n const lang = getLang(customBlock)\n\n const activeVisitorFactories =\n visitorFactories.filter((f) =>\n f.test(lang, customBlock),\n )\n if (!activeVisitorFactories.length) {\n continue\n }\n\n const parsedResult = parseCustomBlockElement(\n customBlock,\n parser,\n globalLocationCalculator,\n parserOptions,\n )\n\n const {\n serCurrentNode,\n context: customBlockContext,\n } = createCustomBlockSharedContext({\n text: sourceText,\n customBlock,\n parsedResult,\n globalLocationCalculator,\n parserOptions,\n })\n\n const emitter = new EventEmitter()\n emitter.setMaxListeners(0)\n\n for (const factory of activeVisitorFactories) {\n const ctx = {\n ...customBlockContext,\n }\n // @ts-expect-error -- custom context\n ctx.__proto__ = factory.context\n\n const visitor = factory.create(\n ctx as CustomBlockContext,\n )\n // Register handlers into the intermediate event emitter.\n for (const selector of Object.keys(\n visitor || {},\n )) {\n emitter.on(selector, visitor![selector])\n }\n }\n\n // Traverse custom block.\n const generator = new NodeEventGenerator(emitter, {\n visitorKeys: parsedResult.visitorKeys,\n fallback: getFallbackKeys,\n })\n traverseNodes(parsedResult.ast, {\n visitorKeys: parsedResult.visitorKeys,\n enterNode(n) {\n serCurrentNode(n)\n generator.enterNode(n)\n },\n leaveNode(n) {\n serCurrentNode(n)\n generator.leaveNode(n)\n },\n })\n }\n } finally {\n scriptVisitor[\"Program:exit\"] = programExitHandler\n customBlocksEmitters.delete(key)\n }\n }\n }\n\n const target = rule.target\n const test =\n typeof target === \"function\"\n ? target\n : Array.isArray(target)\n ? (lang: string | null) =>\n Boolean(lang && target.includes(lang))\n : (lang: string | null) => target === lang\n factories.push({\n context,\n test,\n create: rule.create,\n })\n\n return scriptVisitor\n },\n\n /**\n * Get the token store of the template body.\n * @returns The token store of template body.\n */\n getTemplateBodyTokenStore(): TokenStore {\n const key = document || stores\n let store = stores.get(key)\n\n if (!store) {\n store =\n document != null\n ? new TokenStore(document.tokens, document.comments)\n : new TokenStore([], [])\n stores.set(key, store)\n }\n\n return store\n },\n\n /**\n * Get the root document fragment.\n * @returns The root document fragment.\n */\n getDocumentFragment(): VDocumentFragment | null {\n return document\n },\n }\n}\n", "/**\n * @author Yosuke Ota <https://github.com/ota-meshi>\n * See LICENSE file in root directory for full license.\n */\nimport type { ScopeManager, Scope } from \"eslint-scope\"\nimport type {\n ESLintBlockStatement,\n ESLintExportSpecifier,\n ESLintExtendedProgram,\n ESLintIdentifier,\n ESLintModuleDeclaration,\n ESLintNode,\n ESLintProgram,\n ESLintStatement,\n Token,\n VElement,\n} from \"../ast\"\nimport { ParseError, traverseNodes } from \"../ast\"\nimport {\n fixErrorLocation,\n fixLocation,\n fixLocations,\n fixNodeLocations,\n} from \"../common/fix-locations\"\nimport type { LinesAndColumns } from \"../common/lines-and-columns\"\nimport type { LocationCalculator } from \"../common/location-calculator\"\nimport type { ParserOptions } from \"../common/parser-options\"\nimport { parseScript as parseScriptBase, parseScriptFragment } from \"../script\"\nimport { getScriptSetupParserOptions } from \"./parser-options\"\n\ntype RemapBlock = {\n range: [number, number]\n offset: number\n}\n\n/**\n * `parseScriptSetupElements` rewrites the source code so that it can parse\n * the combination of `<script>` and `<script setup>`, and parses it source code with JavaScript parser.\n * This class holds the information to restore the AST and token locations parsed in the rewritten source code.\n */\nclass CodeBlocks {\n public code: string\n // The location information for remapping.\n public remapBlocks: RemapBlock[] = []\n // The list of extra punctuation locations added to split the statement.\n public splitPunctuators: number[] = []\n\n public constructor() {\n this.code = \"\"\n }\n public get length() {\n return this.code.length\n }\n public append(codeLet: string, originalOffset: number) {\n const rangeStart = this.code.length\n this.code += codeLet.trimRight()\n this.remapBlocks.push({\n range: [rangeStart, this.code.length],\n offset: originalOffset - rangeStart,\n })\n }\n public appendSplitPunctuators(punctuator: string) {\n this.splitPunctuators.push(this.code.length, this.code.length + 1)\n this.code += `\\n${punctuator}\\n`\n }\n public appendCodeBlocks(codeBlocks: CodeBlocks) {\n const start = this.code.length\n this.code += codeBlocks.code\n this.remapBlocks.push(\n ...codeBlocks.remapBlocks.map(\n (b): RemapBlock => ({\n range: [b.range[0] + start, b.range[1] + start],\n offset: b.offset - start,\n }),\n ),\n )\n this.splitPunctuators.push(\n ...codeBlocks.splitPunctuators.map((s) => s + start),\n )\n }\n}\n\ntype RestoreASTCallback = (node: ESLintStatement) => {\n statement: ESLintStatement | ESLintModuleDeclaration\n tokens: Token[]\n} | null\n/**\n * Some named exports need to be replaced with a different syntax to successfully parse\n * the combination of `<script>` and `<script setup>`.\n * e.g. `export {a,b}` -> `({a,b});`, `export let a` -> `let a`\n * This class holds the callbacks to restore the rewritten syntax AST back to the original `export` AST.\n */\nclass RestoreASTCallbacks {\n private callbacks: {\n range: [number, number]\n callback: RestoreASTCallback\n }[] = []\n public addCallback(\n originalOffsetStart: number,\n range: [number, number],\n callback: RestoreASTCallback,\n ) {\n this.callbacks.push({\n range: [\n originalOffsetStart + range[0],\n originalOffsetStart + range[1],\n ],\n callback,\n })\n }\n public restore(\n program: ESLintProgram,\n scriptSetupStatements: ESLintStatement[],\n linesAndColumns: LinesAndColumns,\n ) {\n if (this.callbacks.length === 0) {\n return\n }\n const callbacks = new Set(this.callbacks)\n for (const statement of scriptSetupStatements) {\n for (const cb of callbacks) {\n if (\n cb.range[0] <= statement.range[0] &&\n statement.range[1] <= cb.range[1]\n ) {\n const restored = cb.callback(statement)\n if (restored) {\n const removeIndex = program.body.indexOf(statement)\n if (removeIndex >= 0) {\n program.body.splice(removeIndex, 1)\n program.body.push(restored.statement)\n program.tokens!.push(...restored.tokens)\n restored.statement.parent = program\n callbacks.delete(cb)\n break\n }\n }\n }\n }\n }\n if (callbacks.size) {\n const [cb] = callbacks\n const loc = linesAndColumns.getLocFromIndex(cb.range[0])\n throw new ParseError(\n \"Could not parse <script setup>. Failed to restore ExportNamedDeclaration.\",\n undefined,\n cb.range[0],\n loc.line,\n loc.column,\n )\n }\n }\n}\n\ntype ScriptSetupCodeBlocks = {\n codeBlocks: CodeBlocks\n // The location of the code of the statements in `<script setup>`.\n scriptSetupBlockRange: [number, number]\n // Used to restore ExportNamedDeclaration.\n restoreASTCallbacks: RestoreASTCallbacks\n}\ntype ScriptSetupModuleCodeBlocks =\n | ScriptSetupCodeBlocks\n | {\n codeBlocks: CodeBlocks\n scriptSetupBlockRange?: undefined\n restoreASTCallbacks?: undefined\n }\n\nfunction parseScript(\n code: string,\n parserOptions: ParserOptions,\n locationCalculator: LocationCalculator,\n) {\n try {\n return parseScriptBase(code, parserOptions)\n } catch (err) {\n const perr = ParseError.normalize(err)\n if (perr) {\n // console.log(code)\n fixErrorLocation(perr, locationCalculator)\n throw perr\n }\n throw err\n }\n}\n\n/**\n * Parse the source code of the given `<script setup>` and `<script>` elements.\n * @param scriptSetupElement The `<script setup>` element to parse.\n * @param nodes The `<script>` elements to parse.\n * @param sfcCode The source code of SFC.\n * @param linesAndColumns The lines and columns location calculator.\n * @param parserOptions The parser options.\n * @returns The result of parsing.\n */\nexport function parseScriptSetupElements(\n scriptSetupElement: VElement,\n scriptElement: VElement,\n sfcCode: string,\n linesAndColumns: LinesAndColumns,\n originalParserOptions: ParserOptions,\n): ESLintExtendedProgram {\n const parserOptions: ParserOptions = getScriptSetupParserOptions(\n originalParserOptions,\n )\n const scriptSetupModuleCodeBlocks = getScriptSetupModuleCodeBlocks(\n scriptSetupElement,\n scriptElement,\n sfcCode,\n linesAndColumns,\n parserOptions,\n )\n if (!scriptSetupModuleCodeBlocks) {\n return parseScriptFragment(\n \"\",\n linesAndColumns.createOffsetLocationCalculator(\n scriptSetupElement.startTag.range[1],\n ),\n parserOptions,\n )\n }\n\n const locationCalculator: LocationCalculator = {\n getFixOffset(offset, kind) {\n const test: (block: RemapBlock) => boolean =\n kind === \"start\"\n ? (block) => offset < block.range[1]\n : (block) => offset <= block.range[1]\n\n for (const block of scriptSetupModuleCodeBlocks.codeBlocks\n .remapBlocks) {\n if (test(block)) {\n return block.offset\n }\n }\n return offset\n },\n getLocFromIndex: linesAndColumns.getLocFromIndex.bind(linesAndColumns),\n }\n\n const result = parseScript(\n scriptSetupModuleCodeBlocks.codeBlocks.code,\n parserOptions,\n locationCalculator,\n )\n\n /* Remap ASTs */\n const scriptSetupStatements = remapAST(result, scriptSetupModuleCodeBlocks)\n\n /* Remap locations */\n remapLocationAndTokens(\n result,\n scriptSetupModuleCodeBlocks,\n locationCalculator,\n )\n\n if (scriptSetupModuleCodeBlocks.restoreASTCallbacks) {\n scriptSetupModuleCodeBlocks.restoreASTCallbacks.restore(\n result.ast,\n scriptSetupStatements,\n linesAndColumns,\n )\n }\n\n // Adjust AST and tokens\n if (result.ast.tokens != null) {\n for (const node of [scriptSetupElement, scriptElement]) {\n const startTag = node.startTag\n const endTag = node.endTag\n\n result.ast.tokens.unshift({\n type: \"Punctuator\",\n range: startTag.range,\n loc: startTag.loc,\n value: \"<script>\",\n })\n if (endTag != null) {\n result.ast.tokens.push({\n type: \"Punctuator\",\n range: endTag.range,\n loc: endTag.loc,\n value: \"</script>\",\n })\n }\n }\n result.ast.tokens.sort((a, b) => a.range[0] - b.range[0])\n }\n result.ast.body.sort((a, b) => a.range[0] - b.range[0])\n\n const programStartOffset = result.ast.body.reduce(\n (start, node) => Math.min(start, node.range[0]),\n result.ast.range[0],\n )\n result.ast.range[0] = programStartOffset\n result.ast.loc.start =\n locationCalculator.getLocFromIndex(programStartOffset)\n if (result.ast.start != null) {\n result.ast.start = [scriptSetupElement, scriptElement].reduce(\n (start, node) => {\n const textNode = node.children[0]\n return Math.min(\n start,\n textNode != null && textNode.type === \"VText\"\n ? textNode.range[0]\n : node.startTag.range[1],\n )\n },\n result.ast.start,\n )\n }\n\n const programEndOffset = result.ast.body.reduce(\n (end, node) => Math.max(end, node.range[1]),\n 0,\n )\n result.ast.range[1] = programEndOffset\n result.ast.loc.end = locationCalculator.getLocFromIndex(programEndOffset)\n if (result.ast.end != null) {\n result.ast.end = [scriptSetupElement, scriptElement].reduce(\n (end, node) => {\n const textNode = node.children[0]\n return Math.max(\n end,\n textNode != null && textNode.type === \"VText\"\n ? textNode.range[1]\n : node.endTag?.range[0] ?? node.range[1],\n )\n },\n 0,\n )\n }\n\n return result\n}\n\n/**\n * Parses the scripts of the given `<script>` elements and returns\n * the reconstructed source code as a parseable script.\n * It also returns information for remapping the location.\n *\n * For examples, the script is reconstructed as follows.\n *\n * Example 1:\n *\n * ```vue\n * <script>\n * export let count = 42\n * </script>\n * <script setup>\n * import MyComponent from './MyComponent.vue'\n * let count = 42\n * </script>\n * ```\n *\n * ↓\n *\n * ```js\n * export let count = 42\n * ;\n * import MyComponent from './MyComponent.vue';\n * {\n * let count = 42\n * }\n * ```\n *\n * Example 2:\n *\n * ```vue\n * <script>\n * export let count = 42\n * </script>\n * <script setup>\n * import MyComponent1 from './MyComponent1.vue'\n * let count = 42\n * import MyComponent2 from './MyComponent2.vue'\n * let a\n * </script>\n * ```\n *\n * ↓\n *\n * ```js\n * export let count = 42\n * ;\n * import MyComponent1 from './MyComponent1.vue';\n * import MyComponent2 from './MyComponent2.vue';\n * {\n * let count = 42;\n * let a\n * }\n * ```\n *\n * Example 3:\n *\n * ```vue\n * <script>\n * export let count = 42\n * export let count2 = 42\n * </script>\n * <script setup>\n * import MyComponent1 from './MyComponent1.vue'\n * let count = 42\n * export {count as ns}\n * export let count2 = 42\n * count2++\n * </script>\n * ```\n *\n * ↓\n *\n * ```js\n * export let count = 42\n * export let count2 = 42\n * ;\n * import MyComponent1 from './MyComponent1.vue';\n * {\n * let count = 42;\n * let a\n * ;\n * ({count})\n * ;\n * let count2 = 42\n * ;\n * count2++\n * ;\n * }\n * ```\n */\nfunction getScriptSetupModuleCodeBlocks(\n scriptSetupElement: VElement,\n scriptElement: VElement,\n sfcCode: string,\n linesAndColumns: LinesAndColumns,\n parserOptions: ParserOptions,\n): ScriptSetupModuleCodeBlocks | null {\n const scriptSetupCodeBlocks = getScriptSetupCodeBlocks(\n scriptSetupElement,\n sfcCode,\n linesAndColumns,\n parserOptions,\n )\n\n const textNode = scriptElement.children[0]\n if (textNode == null || textNode.type !== \"VText\") {\n return scriptSetupCodeBlocks\n }\n\n const [scriptStartOffset, scriptEndOffset] = textNode.range\n const codeBlocks = new CodeBlocks()\n codeBlocks.append(\n sfcCode.slice(scriptStartOffset, scriptEndOffset),\n scriptStartOffset,\n )\n if (scriptSetupCodeBlocks == null) {\n return { codeBlocks }\n }\n\n codeBlocks.appendSplitPunctuators(\";\")\n const scriptSetupOffset = codeBlocks.length\n codeBlocks.appendCodeBlocks(scriptSetupCodeBlocks.codeBlocks)\n return {\n codeBlocks,\n scriptSetupBlockRange: [\n scriptSetupCodeBlocks.scriptSetupBlockRange[0] + scriptSetupOffset,\n scriptSetupCodeBlocks.scriptSetupBlockRange[1] + scriptSetupOffset,\n ],\n restoreASTCallbacks: scriptSetupCodeBlocks.restoreASTCallbacks,\n }\n}\n\n/**\n * Parses the script in the given `<script setup>` and returns the source code with\n * the import blocks and other statements reconstructed.\n * It also returns information for remapping the location.\n */\nfunction getScriptSetupCodeBlocks(\n node: VElement,\n sfcCode: string,\n linesAndColumns: LinesAndColumns,\n parserOptions: ParserOptions,\n): ScriptSetupCodeBlocks | null {\n const textNode = node.children[0]\n if (textNode == null || textNode.type !== \"VText\") {\n return null\n }\n\n const [scriptSetupStartOffset, scriptSetupEndOffset] = textNode.range\n const scriptCode = sfcCode.slice(\n scriptSetupStartOffset,\n scriptSetupEndOffset,\n )\n\n const offsetLocationCalculator =\n linesAndColumns.createOffsetLocationCalculator(scriptSetupStartOffset)\n\n const result = parseScript(\n scriptCode,\n parserOptions,\n offsetLocationCalculator,\n )\n\n const { ast } = result\n\n // Holds the `import` and re-`export` statements.\n // All import and re-`export` statements are hoisted to the top.\n const importCodeBlocks = new CodeBlocks()\n // Holds statements other than `import`, re-`export` and `export default` statements.\n // This is moved to a block statement to avoid conflicts with variables of the same name in `<script>`.\n const statementCodeBlocks = new CodeBlocks()\n // Holds `export default` statements.\n // All `export default` statements are move to the bottom.\n const exportDefaultCodeBlocks = new CodeBlocks()\n // It holds the information to restore the transformation source code of the export statements held in `statementCodeBlocks`.\n const restoreASTCallbacks = new RestoreASTCallbacks()\n\n let astOffset = 0\n\n /**\n * Append the given range of code to the given codeBlocks.\n */\n function processAppend(codeBlocks: CodeBlocks, start: number, end: number) {\n if (start < end) {\n codeBlocks.append(\n scriptCode.slice(start, end),\n scriptSetupStartOffset + start,\n )\n astOffset = end\n }\n }\n\n /**\n * Append the partial statements up to the start position to `statementCodeBlocks`.\n */\n function processStatementCodeBlock(start: number) {\n if (astOffset < start) {\n processAppend(statementCodeBlocks, astOffset, start)\n statementCodeBlocks.appendSplitPunctuators(\";\")\n }\n }\n\n /**\n * Append the given range of import or export statement to the given codeBlocks.\n */\n function processModuleCodeBlock(\n codeBlocks: CodeBlocks,\n start: number,\n end: number,\n ) {\n processAppend(codeBlocks, start, end)\n codeBlocks.appendSplitPunctuators(\";\")\n }\n\n for (const body of ast.body) {\n if (\n body.type === \"ImportDeclaration\" ||\n body.type === \"ExportAllDeclaration\" ||\n (body.type === \"ExportNamedDeclaration\" && body.source != null)\n ) {\n const [start, end] = getNodeFullRange(body)\n processStatementCodeBlock(start)\n processModuleCodeBlock(importCodeBlocks, start, end)\n } else if (body.type === \"ExportDefaultDeclaration\") {\n const [start, end] = getNodeFullRange(body)\n processStatementCodeBlock(start)\n processModuleCodeBlock(exportDefaultCodeBlocks, start, end)\n } else if (body.type === \"ExportNamedDeclaration\") {\n // Transform ExportNamedDeclaration\n // The transformed statement ASTs are restored by RestoreASTCallbacks.\n // e.g.\n // - `export let v = 42` -> `let v = 42`\n // - `export {foo, bar as Bar}` -> `({foo, bar})`\n\n const [start, end] = getNodeFullRange(body)\n processStatementCodeBlock(start)\n\n const tokens = ast.tokens!\n const exportTokenIndex = tokens.findIndex(\n (t) => t.range[0] === body.range[0],\n )\n const exportToken = tokens[exportTokenIndex]\n if (exportToken && exportToken.value === \"export\") {\n processAppend(\n statementCodeBlocks,\n astOffset,\n exportToken.range[0],\n ) // Maybe decorator\n if (body.declaration) {\n processModuleCodeBlock(\n statementCodeBlocks,\n exportToken.range[1],\n end,\n )\n\n restoreASTCallbacks.addCallback(\n scriptSetupStartOffset,\n [start, end],\n (statement) => {\n if (statement.type !== body.declaration!.type) {\n return null\n }\n fixNodeLocations(\n body,\n result.visitorKeys,\n offsetLocationCalculator,\n )\n fixLocation(exportToken, offsetLocationCalculator)\n body.declaration = statement\n statement.parent = body\n return {\n statement: body,\n tokens: [exportToken],\n }\n },\n )\n } else {\n statementCodeBlocks.appendSplitPunctuators(\"(\")\n const restoreTokens: Token[] = [exportToken]\n let startOffset = exportToken.range[1]\n for (const spec of body.specifiers) {\n if (spec.local.range[0] < spec.exported.range[0]) {\n // {a as b}\n const localTokenIndex = tokens.findIndex(\n (t) => t.range[0] === spec.local.range[0],\n exportTokenIndex,\n )\n checkToken(\n tokens[localTokenIndex],\n (spec.local as ESLintIdentifier).name,\n )\n const asToken = tokens[localTokenIndex + 1]\n checkToken(asToken, \"as\")\n restoreTokens.push(asToken)\n const exportedToken = tokens[localTokenIndex + 2]\n checkToken(\n exportedToken,\n spec.exported.type === \"Identifier\"\n ? spec.exported.name\n : spec.exported.raw,\n )\n restoreTokens.push(exportedToken)\n processAppend(\n statementCodeBlocks,\n startOffset,\n asToken.range[0],\n )\n processAppend(\n statementCodeBlocks,\n asToken.range[1],\n exportedToken.range[0],\n )\n startOffset = exportedToken.range[1]\n }\n }\n processAppend(statementCodeBlocks, startOffset, end)\n statementCodeBlocks.appendSplitPunctuators(\")\")\n statementCodeBlocks.appendSplitPunctuators(\";\")\n\n restoreASTCallbacks.addCallback(\n scriptSetupStartOffset,\n [start, end],\n (statement) => {\n if (\n statement.type !== \"ExpressionStatement\" ||\n statement.expression.type !== \"ObjectExpression\"\n ) {\n return null\n }\n // preprocess and check\n const locals: ESLintIdentifier[] = []\n for (const prop of statement.expression\n .properties) {\n if (\n prop.type !== \"Property\" ||\n prop.value.type !== \"Identifier\"\n ) {\n return null\n }\n locals.push(prop.value)\n }\n if (body.specifiers.length !== locals.length) {\n return null\n }\n const map = new Map<\n ESLintExportSpecifier,\n ESLintIdentifier\n >()\n for (\n let index = 0;\n index < body.specifiers.length;\n index++\n ) {\n const spec = body.specifiers[index]\n const local = locals[index]\n map.set(spec, local)\n }\n\n // restore\n fixNodeLocations(\n body,\n result.visitorKeys,\n offsetLocationCalculator,\n )\n for (const token of restoreTokens) {\n fixLocation(token, offsetLocationCalculator)\n }\n for (const [spec, local] of map) {\n spec.local = local\n local.parent = spec\n }\n return {\n statement: body,\n tokens: restoreTokens,\n }\n },\n )\n }\n } else {\n processModuleCodeBlock(statementCodeBlocks, start, end)\n }\n }\n }\n processStatementCodeBlock(scriptSetupEndOffset)\n\n // Creates a code block that combines import, statement block, and export default.\n const codeBlocks = new CodeBlocks()\n\n codeBlocks.appendCodeBlocks(importCodeBlocks)\n const scriptSetupBlockRangeStart = codeBlocks.length\n codeBlocks.appendSplitPunctuators(\"{\")\n codeBlocks.appendCodeBlocks(statementCodeBlocks)\n codeBlocks.appendSplitPunctuators(\"}\")\n const scriptSetupBlockRangeEnd = codeBlocks.length\n codeBlocks.appendCodeBlocks(exportDefaultCodeBlocks)\n return {\n codeBlocks,\n scriptSetupBlockRange: [\n scriptSetupBlockRangeStart,\n scriptSetupBlockRangeEnd,\n ],\n restoreASTCallbacks,\n }\n\n function getNodeFullRange(n: ESLintNode) {\n let start = n.range[0]\n let end = n.range[1]\n traverseNodes(n, {\n visitorKeys: result.visitorKeys,\n enterNode(c) {\n start = Math.min(start, c.range[0])\n end = Math.max(end, c.range[1])\n },\n leaveNode() {\n // Do nothing.\n },\n })\n return [start, end] as const\n }\n\n function checkToken(token: Token, value: string) {\n if (token.value === value) {\n return\n }\n\n const perr = new ParseError(\n `Could not parse <script setup>. Expected \"${value}\", but it was \"${token.value}\".`,\n undefined,\n token.range[0],\n token.loc.start.line,\n token.loc.start.column,\n )\n fixErrorLocation(perr, offsetLocationCalculator)\n throw perr\n }\n}\n\nfunction remapAST(\n result: ESLintExtendedProgram,\n { scriptSetupBlockRange, codeBlocks }: ScriptSetupModuleCodeBlocks,\n): ESLintStatement[] {\n if (!scriptSetupBlockRange) {\n return []\n }\n\n let scriptSetupBlock: ESLintBlockStatement | null = null\n const scriptSetupStatements: ESLintStatement[] = []\n for (let index = result.ast.body.length - 1; index >= 0; index--) {\n const body = result.ast.body[index]\n\n if (body.type === \"BlockStatement\") {\n if (\n scriptSetupBlockRange[0] <= body.range[0] &&\n body.range[1] <= scriptSetupBlockRange[1]\n ) {\n if (scriptSetupBlock) {\n throw new Error(\n `Unexpected state error: An unexpected block statement was found. ${JSON.stringify(\n body.loc,\n )}`,\n )\n }\n scriptSetupBlock = body\n scriptSetupStatements.push(\n ...body.body.filter(\n (b) => !isSplitPunctuatorsEmptyStatement(b),\n ),\n )\n result.ast.body.splice(index, 1, ...scriptSetupStatements)\n }\n } else if (body.type === \"EmptyStatement\") {\n if (isSplitPunctuatorsEmptyStatement(body)) {\n // remove\n result.ast.body.splice(index, 1)\n }\n }\n }\n\n if (result.scopeManager && scriptSetupBlock) {\n const blockScope = result.scopeManager.acquire(\n scriptSetupBlock as never,\n true,\n )!\n remapScope(result.scopeManager, blockScope)\n }\n\n return scriptSetupStatements\n\n function isSplitPunctuatorsEmptyStatement(body: ESLintStatement) {\n return (\n body.type === \"EmptyStatement\" &&\n codeBlocks.splitPunctuators.includes(body.range[1] - 1)\n )\n }\n\n function remapScope(scopeManager: ScopeManager, blockScope: Scope) {\n const moduleScope = blockScope.upper!\n\n // Restore references\n for (const reference of blockScope.references) {\n reference.from = moduleScope\n moduleScope.references.push(reference)\n }\n // Restore variables\n for (const variable of blockScope.variables) {\n variable.scope = moduleScope\n const alreadyVariable = moduleScope.variables.find(\n (v) => v.name === variable.name,\n )\n if (alreadyVariable) {\n alreadyVariable.defs.push(...variable.defs)\n alreadyVariable.identifiers.push(...variable.identifiers)\n alreadyVariable.references.push(...variable.references)\n for (const reference of variable.references) {\n reference.resolved = alreadyVariable\n }\n } else {\n moduleScope.variables.push(variable)\n moduleScope.set.set(variable.name, variable)\n }\n }\n // Remove scope\n const upper = blockScope.upper\n if (upper) {\n const index = upper.childScopes.indexOf(blockScope)\n if (index >= 0) {\n upper.childScopes.splice(index, 1)\n }\n }\n const index = scopeManager.scopes.indexOf(blockScope)\n if (index >= 0) {\n scopeManager.scopes.splice(index, 1)\n }\n }\n}\n\nfunction remapLocationAndTokens(\n result: ESLintExtendedProgram,\n { codeBlocks }: ScriptSetupModuleCodeBlocks,\n locationCalculator: LocationCalculator,\n) {\n const tokens = result.ast.tokens || []\n\n const endMap = new Map<number, number>()\n const buffer: number[] = []\n for (let index = tokens.length - 1; index >= 0; index--) {\n const token = tokens[index]\n\n if (\n token.range[0] + 1 === token.range[1] &&\n codeBlocks.splitPunctuators.includes(token.range[0])\n ) {\n // remove\n tokens.splice(index, 1)\n buffer.push(token.range[1])\n continue\n } else {\n for (const end of buffer) {\n endMap.set(end, token.range[1])\n }\n buffer.length = 0\n }\n }\n\n traverseNodes(result.ast, {\n visitorKeys: result.visitorKeys,\n enterNode(node) {\n const rangeEnd = endMap.get(node.range[1])\n if (rangeEnd != null) {\n node.range[1] = rangeEnd\n }\n if (node.end) {\n const end = endMap.get(node.end)\n if (end != null) {\n node.end = rangeEnd\n }\n }\n },\n leaveNode() {\n // Do nothing.\n },\n })\n\n fixLocations(result, locationCalculator)\n}\n", "import { debug } from \"../common/debug\"\nimport type { OffsetRange } from \"../ast\"\nimport {\n APOSTROPHE,\n ASTERISK,\n CARRIAGE_RETURN,\n EOF,\n isWhitespace,\n LEFT_CURLY_BRACKET,\n LEFT_PARENTHESIS,\n LINE_FEED,\n NULL,\n QUOTATION_MARK,\n REVERSE_SOLIDUS,\n RIGHT_CURLY_BRACKET,\n RIGHT_PARENTHESIS,\n SOLIDUS,\n COLON,\n SEMICOLON,\n LEFT_SQUARE_BRACKET,\n RIGHT_SQUARE_BRACKET,\n} from \"../html/util/unicode\"\n\nexport const enum CSSTokenType {\n Quoted = \"Quoted\",\n Block = \"Block\",\n Line = \"Line\",\n Word = \"Word\",\n Punctuator = \"Punctuator\",\n}\n\nexport interface CSSWordToken {\n type: CSSTokenType.Word\n value: string\n range: OffsetRange\n}\nexport interface CSSQuotedToken {\n type: CSSTokenType.Quoted\n valueRange: OffsetRange\n value: string\n range: OffsetRange\n quote: '\"' | \"'\"\n}\nexport interface CSSPunctuatorToken {\n type: CSSTokenType.Punctuator\n value: string\n range: OffsetRange\n}\nexport interface CSSCommentToken {\n type: CSSTokenType.Block | CSSTokenType.Line\n valueRange: OffsetRange\n value: string\n range: OffsetRange\n}\nexport type CSSToken =\n | CSSWordToken\n | CSSQuotedToken\n | CSSPunctuatorToken\n | CSSCommentToken\n\nexport type CSSTokenizeOption = { inlineComment?: boolean }\n\n/**\n * A simplified CSS tokenizer.\n * The tokenizer is implemented with reference to the CSS specification,\n * but it does not follow it. This tokenizer only does the tokenization needed to properly handle `v-bind()`.\n * @see https://drafts.csswg.org/css-syntax/#tokenization\n */\nexport class CSSTokenizer {\n // Reading\n public readonly text: string\n private readonly options: CSSTokenizeOption\n private cp: number\n private offset: number\n private nextOffset: number\n\n // Tokenizing\n private reconsuming: boolean\n\n /**\n * Initialize this tokenizer.\n * @param text The source code to tokenize.\n * @param options The tokenizer options.\n */\n public constructor(\n text: string,\n startOffset: number,\n options?: CSSTokenizeOption,\n ) {\n debug(\"[css] the source code length: %d\", text.length)\n this.text = text\n this.options = {\n inlineComment: options?.inlineComment ?? false,\n }\n this.cp = NULL\n this.offset = startOffset - 1\n this.nextOffset = startOffset\n this.reconsuming = false\n }\n\n /**\n * Get the next token.\n * @returns The next token or null.\n */\n public nextToken(): CSSToken | null {\n let cp\n if (this.reconsuming) {\n cp = this.cp\n this.reconsuming = false\n } else {\n cp = this.consumeNextCodePoint()\n }\n // Skip whitespaces\n while (isWhitespace(cp)) {\n cp = this.consumeNextCodePoint()\n }\n if (cp === EOF) {\n return null\n }\n\n const start = this.offset\n return this.consumeNextToken(cp, start)\n }\n\n /**\n * Get the next code point.\n * @returns The code point.\n */\n private nextCodePoint(): number {\n if (this.nextOffset >= this.text.length) {\n return EOF\n }\n return this.text.codePointAt(this.nextOffset)!\n }\n\n /**\n * Consume the next code point.\n * @returns The consumed code point.\n */\n private consumeNextCodePoint(): number {\n if (this.offset >= this.text.length) {\n this.cp = EOF\n return EOF\n }\n\n this.offset = this.nextOffset\n\n if (this.offset >= this.text.length) {\n this.cp = EOF\n return EOF\n }\n\n let cp = this.text.codePointAt(this.offset)!\n if (cp === CARRIAGE_RETURN) {\n this.nextOffset = this.offset + 1\n if (this.text.codePointAt(this.nextOffset)! === LINE_FEED) {\n this.nextOffset++\n }\n cp = LINE_FEED\n } else {\n this.nextOffset = this.offset + (cp >= 0x10000 ? 2 : 1)\n }\n\n this.cp = cp\n\n return cp\n }\n\n private consumeNextToken(cp: number, start: number): CSSToken | null {\n if (cp === SOLIDUS) {\n const nextCp = this.nextCodePoint()\n if (nextCp === ASTERISK) {\n return this.consumeComment(start)\n }\n if (nextCp === SOLIDUS && this.options.inlineComment) {\n return this.consumeInlineComment(start)\n }\n }\n if (isQuote(cp)) {\n return this.consumeString(start, cp)\n }\n if (isPunctuator(cp)) {\n return {\n type: CSSTokenType.Punctuator,\n range: [start, start + 1],\n value: String.fromCodePoint(cp),\n }\n }\n return this.consumeWord(start)\n }\n\n /**\n * Consume word\n */\n private consumeWord(start: number): CSSToken {\n let cp = this.consumeNextCodePoint()\n while (!isWhitespace(cp) && !isPunctuator(cp) && !isQuote(cp)) {\n cp = this.consumeNextCodePoint()\n }\n this.reconsuming = true\n const range: OffsetRange = [start, this.offset]\n const text = this.text\n let value: string\n return {\n type: CSSTokenType.Word,\n range,\n get value() {\n return (value ??= text.slice(...range))\n },\n }\n }\n\n /**\n * https://drafts.csswg.org/css-syntax/#consume-string-token\n */\n private consumeString(start: number, quote: number): CSSToken {\n let valueEndOffset: number | null = null\n let cp = this.consumeNextCodePoint()\n while (cp !== EOF) {\n if (cp === quote) {\n valueEndOffset = this.offset\n break\n }\n // PostCSS seems to continue parsing.\n // if (cp === LINE_FEED) {\n // // Bad string\n // this.reconsuming = true\n // valueEndOffset = this.offset\n // break\n // }\n if (cp === REVERSE_SOLIDUS) {\n // Escape\n this.consumeNextCodePoint()\n }\n cp = this.consumeNextCodePoint()\n }\n const text = this.text\n let value: string\n const valueRange: OffsetRange = [\n start + 1,\n valueEndOffset ?? this.nextOffset,\n ]\n return {\n type: CSSTokenType.Quoted,\n range: [start, this.nextOffset],\n valueRange,\n get value() {\n return (value ??= text.slice(...valueRange))\n },\n quote: String.fromCodePoint(quote) as never,\n }\n }\n /**\n * https://drafts.csswg.org/css-syntax/#consume-comment\n */\n private consumeComment(start: number): CSSToken {\n this.consumeNextCodePoint() // consume \"*\"\n let valueEndOffset: number | null = null\n let cp = this.consumeNextCodePoint()\n while (cp !== EOF) {\n if (cp === ASTERISK) {\n cp = this.consumeNextCodePoint()\n if (cp === SOLIDUS) {\n valueEndOffset = this.offset - 1\n break\n }\n }\n cp = this.consumeNextCodePoint()\n }\n const valueRange: OffsetRange = [\n start + 2,\n valueEndOffset ?? this.nextOffset,\n ]\n const text = this.text\n let value: string\n return {\n type: CSSTokenType.Block,\n range: [start, this.nextOffset],\n valueRange,\n get value() {\n return (value ??= text.slice(...valueRange))\n },\n }\n }\n /**\n * Consume inline comment\n */\n private consumeInlineComment(start: number): CSSToken {\n this.consumeNextCodePoint() // consume \"/\"\n let valueEndOffset: number | null = null\n let cp = this.consumeNextCodePoint()\n while (cp !== EOF) {\n if (cp === LINE_FEED) {\n valueEndOffset = this.offset - 1\n break\n }\n cp = this.consumeNextCodePoint()\n }\n const valueRange: OffsetRange = [\n start + 2,\n valueEndOffset ?? this.nextOffset,\n ]\n const text = this.text\n let value: string\n return {\n type: CSSTokenType.Line,\n range: [start, this.nextOffset],\n valueRange,\n get value() {\n return (value ??= text.slice(...valueRange))\n },\n }\n }\n}\n\nfunction isPunctuator(cp: number): boolean {\n return (\n cp === COLON ||\n cp === SEMICOLON ||\n // Brackets\n cp === LEFT_PARENTHESIS ||\n cp === RIGHT_PARENTHESIS ||\n cp === LEFT_CURLY_BRACKET ||\n cp === RIGHT_CURLY_BRACKET ||\n cp === LEFT_SQUARE_BRACKET ||\n cp === RIGHT_SQUARE_BRACKET ||\n // Maybe v-bind() in calc()\n cp === SOLIDUS ||\n cp === ASTERISK\n )\n}\n\nfunction isQuote(cp: number): boolean {\n return cp === APOSTROPHE || cp === QUOTATION_MARK\n}\n", "import type {\n OffsetRange,\n Token,\n VDocumentFragment,\n VElement,\n VExpressionContainer,\n VStyleElement,\n VText,\n} from \"../ast\"\nimport { ParseError } from \"../ast\"\nimport { getLang, getOwnerDocument } from \"../common/ast-utils\"\nimport { debug } from \"../common/debug\"\nimport { insertError } from \"../common/error-utils\"\nimport type { LocationCalculatorForHtml } from \"../common/location-calculator\"\nimport type { ParserOptions } from \"../common/parser-options\"\nimport {\n createSimpleToken,\n insertComments,\n replaceAndSplitTokens,\n} from \"../common/token-utils\"\nimport { parseExpression } from \"../script\"\nimport { DEFAULT_ECMA_VERSION } from \"../script-setup/parser-options\"\nimport { resolveReferences } from \"../template\"\nimport type {\n CSSCommentToken,\n CSSPunctuatorToken,\n CSSToken,\n CSSTokenizeOption,\n} from \"./tokenizer\"\nimport { CSSTokenType, CSSTokenizer } from \"./tokenizer\"\n\nclass CSSTokenScanner {\n private reconsuming: CSSToken[] = []\n private tokenizer: CSSTokenizer\n public constructor(text: string, options: CSSTokenizeOption) {\n this.tokenizer = new CSSTokenizer(text, 0, options)\n }\n public nextToken(): CSSToken | null {\n return this.reconsuming.shift() || this.tokenizer.nextToken()\n }\n public reconsume(...tokens: CSSToken[]) {\n this.reconsuming.push(...tokens)\n }\n}\n\n/**\n * Parse the source code of the given `<style>` elements.\n * @param elements The `<style>` elements to parse.\n * @param globalLocationCalculator The location calculator for fixLocations.\n * @param parserOptions The parser options.\n * @returns The result of parsing.\n */\nexport function parseStyleElements(\n elements: VElement[],\n globalLocationCalculator: LocationCalculatorForHtml,\n originalParserOptions: ParserOptions,\n): void {\n const parserOptions: ParserOptions = {\n ...originalParserOptions,\n ecmaVersion: originalParserOptions.ecmaVersion || DEFAULT_ECMA_VERSION,\n }\n\n for (const style of elements) {\n ;(style as VStyleElement).style = true\n parseStyleElement(\n style as VStyleElement,\n globalLocationCalculator,\n parserOptions,\n {\n inlineComment: (getLang(style) || \"css\") !== \"css\",\n },\n )\n }\n}\n\nfunction parseStyleElement(\n style: VStyleElement,\n globalLocationCalculator: LocationCalculatorForHtml,\n parserOptions: ParserOptions,\n cssOptions: CSSTokenizeOption,\n) {\n if (style.children.length !== 1) {\n return\n }\n const textNode = style.children[0]\n if (textNode.type !== \"VText\") {\n return\n }\n const code = textNode.value\n // short circuit\n if (!/v-bind\\s*(?:\\(|\\/)/u.test(code)) {\n return\n }\n\n const locationCalculator = globalLocationCalculator.getSubCalculatorAfter(\n textNode.range[0],\n )\n const document = getOwnerDocument(style)\n parseStyle(\n document,\n style,\n code,\n locationCalculator,\n parserOptions,\n cssOptions,\n )\n}\n\nfunction parseStyle(\n document: VDocumentFragment | null,\n style: VStyleElement,\n code: string,\n locationCalculator: LocationCalculatorForHtml,\n parserOptions: ParserOptions,\n cssOptions: CSSTokenizeOption,\n) {\n let textStart = 0\n for (const {\n range,\n exprRange,\n quote,\n openingParenOffset,\n comments,\n } of iterateVBind(code, cssOptions)) {\n insertComments(\n document,\n comments.map((c) =>\n createSimpleToken(\n c.type,\n locationCalculator.getOffsetWithGap(c.range[0]),\n locationCalculator.getOffsetWithGap(c.range[1]),\n c.value,\n locationCalculator,\n ),\n ),\n )\n\n const container: VExpressionContainer = {\n type: \"VExpressionContainer\",\n range: [\n locationCalculator.getOffsetWithGap(range[0]),\n locationCalculator.getOffsetWithGap(range[1]),\n ],\n loc: {\n start: locationCalculator.getLocation(range[0]),\n end: locationCalculator.getLocation(range[1]),\n },\n parent: style,\n expression: null,\n references: [],\n }\n\n const openingParenStart =\n locationCalculator.getOffsetWithGap(openingParenOffset)\n const beforeTokens: Token[] = [\n createSimpleToken(\n \"HTMLRawText\",\n container.range[0],\n container.range[0] + 6 /* v-bind */,\n \"v-bind\",\n locationCalculator,\n ),\n createSimpleToken(\n \"Punctuator\",\n openingParenStart,\n openingParenStart + 1,\n \"(\",\n locationCalculator,\n ),\n ]\n const afterTokens: Token[] = [\n createSimpleToken(\n \"Punctuator\",\n container.range[1] - 1,\n container.range[1],\n \")\",\n locationCalculator,\n ),\n ]\n if (quote) {\n const openStart = locationCalculator.getOffsetWithGap(\n exprRange[0] - 1,\n )\n beforeTokens.push(\n createSimpleToken(\n \"Punctuator\",\n openStart,\n openStart + 1,\n quote,\n locationCalculator,\n ),\n )\n const closeStart = locationCalculator.getOffsetWithGap(exprRange[1])\n afterTokens.unshift(\n createSimpleToken(\n \"Punctuator\",\n closeStart,\n closeStart + 1,\n quote,\n locationCalculator,\n ),\n )\n }\n const beforeLast = beforeTokens[beforeTokens.length - 1]\n replaceAndSplitTokens(\n document,\n {\n range: [container.range[0], beforeLast.range[1]],\n loc: { start: container.loc.start, end: beforeLast.loc.end },\n },\n beforeTokens,\n )\n const afterFirst = afterTokens[0]\n replaceAndSplitTokens(\n document,\n {\n range: [afterFirst.range[0], container.range[1]],\n loc: { start: afterFirst.loc.start, end: container.loc.end },\n },\n afterTokens,\n )\n\n const lastChild = style.children[style.children.length - 1]\n style.children.push(container)\n if (lastChild.type === \"VText\") {\n const newTextNode: VText = {\n type: \"VText\",\n range: [container.range[1], lastChild.range[1]],\n loc: {\n start: { ...container.loc.end },\n end: { ...lastChild.loc.end },\n },\n parent: style,\n value: code.slice(range[1]),\n }\n style.children.push(newTextNode)\n\n lastChild.range[1] = container.range[0]\n lastChild.loc.end = { ...container.loc.start }\n lastChild.value = code.slice(textStart, range[0])\n textStart = range[1]\n }\n try {\n const ret = parseExpression(\n code.slice(...exprRange),\n locationCalculator.getSubCalculatorShift(exprRange[0]),\n parserOptions,\n { allowEmpty: false, allowFilters: false },\n )\n if (ret.expression) {\n ret.expression.parent = container\n container.expression = ret.expression\n container.references = ret.references\n }\n replaceAndSplitTokens(\n document,\n {\n range: [beforeLast.range[1], afterFirst.range[0]],\n loc: {\n start: beforeLast.loc.end,\n end: afterFirst.loc.start,\n },\n },\n ret.tokens,\n )\n insertComments(document, ret.comments)\n\n for (const variable of ret.variables) {\n style.variables.push(variable)\n }\n resolveReferences(container)\n } catch (err) {\n debug(\"[style] Parse error: %s\", err)\n\n if (ParseError.isParseError(err)) {\n insertError(document, err)\n } else {\n throw err\n }\n }\n }\n}\n\ntype VBindLocations = {\n range: OffsetRange\n exprRange: OffsetRange\n quote: '\"' | \"'\" | null\n openingParenOffset: number\n comments: CSSCommentToken[]\n}\n\n/**\n * Iterate the `v-bind()` information.\n */\nfunction* iterateVBind(\n code: string,\n cssOptions: CSSTokenizeOption,\n): IterableIterator<VBindLocations> {\n const tokenizer = new CSSTokenScanner(code, cssOptions)\n\n let token\n while ((token = tokenizer.nextToken())) {\n if (token.type !== CSSTokenType.Word || token.value !== \"v-bind\") {\n continue\n }\n const openingParen = findVBindOpeningParen(tokenizer)\n if (!openingParen) {\n continue\n }\n const arg = parseVBindArg(tokenizer)\n if (!arg) {\n continue\n }\n yield {\n range: [token.range[0], arg.closingParen.range[1]],\n exprRange: arg.exprRange,\n quote: arg.quote,\n openingParenOffset: openingParen.openingParen.range[0],\n comments: [...openingParen.comments, ...arg.comments],\n }\n }\n}\n\nfunction findVBindOpeningParen(tokenizer: CSSTokenScanner): {\n openingParen: CSSPunctuatorToken\n comments: CSSCommentToken[]\n} | null {\n const comments: CSSCommentToken[] = []\n let token\n while ((token = tokenizer.nextToken())) {\n if (token.type === CSSTokenType.Punctuator && token.value === \"(\") {\n return {\n openingParen: token,\n comments,\n }\n } else if (isComment(token)) {\n // Comment between `v-bind` and opening paren.\n comments.push(token)\n continue\n }\n tokenizer.reconsume(...comments, token)\n // There were no opening parens.\n return null\n }\n return null\n}\n\nfunction parseVBindArg(tokenizer: CSSTokenScanner): {\n exprRange: OffsetRange\n quote: '\"' | \"'\" | null\n closingParen: CSSPunctuatorToken\n comments: CSSCommentToken[]\n} | null {\n const tokensBuffer: CSSToken[] = []\n const comments: CSSCommentToken[] = []\n const tokens: CSSToken[] = []\n const closeTokenStack: string[] = []\n let token\n while ((token = tokenizer.nextToken())) {\n if (token.type === CSSTokenType.Punctuator) {\n if (token.value === \")\" && !closeTokenStack.length) {\n if (\n tokens.length === 1 &&\n tokens[0].type === CSSTokenType.Quoted\n ) {\n // for v-bind( 'expr' ), and v-bind( /**/ 'expr' /**/ )\n const quotedToken = tokens[0]\n return {\n exprRange: quotedToken.valueRange,\n quote: quotedToken.quote,\n closingParen: token,\n comments,\n }\n }\n const startToken = tokensBuffer[0] || token\n return {\n exprRange: [startToken.range[0], token.range[0]],\n quote: null,\n closingParen: token,\n comments: [],\n }\n }\n\n if (token.value === closeTokenStack[0]) {\n closeTokenStack.shift()\n } else if (token.value === \"(\") {\n closeTokenStack.unshift(\")\")\n }\n }\n\n tokensBuffer.push(token)\n if (isComment(token)) {\n comments.push(token)\n } else {\n tokens.push(token)\n }\n }\n tokenizer.reconsume(...tokensBuffer)\n return null\n}\n\nfunction isComment(token: CSSToken): token is CSSCommentToken {\n return token.type === CSSTokenType.Block || token.type === CSSTokenType.Line\n}\n", "import type * as escopeTypes from \"eslint-scope\"\nimport type { ParserOptions } from \"../common/parser-options\"\nimport type {\n VAttribute,\n VDirective,\n VDocumentFragment,\n VElement,\n VExpressionContainer,\n} from \"../ast\"\nimport { traverseNodes } from \"../ast\"\nimport { getEslintScope } from \"../common/eslint-scope\"\n\nconst BUILTIN_COMPONENTS = new Set([\n \"template\",\n \"slot\",\n \"component\",\n \"Component\",\n \"transition\",\n \"Transition\",\n \"transition-group\",\n \"TransitionGroup\",\n \"keep-alive\",\n \"KeepAlive\",\n \"teleport\",\n \"Teleport\",\n \"suspense\",\n \"Suspense\",\n])\n\nconst BUILTIN_DIRECTIVES = new Set([\n \"bind\",\n \"on\",\n \"text\",\n \"html\",\n \"show\",\n \"if\",\n \"else\",\n \"else-if\",\n \"for\",\n \"model\",\n \"slot\",\n \"pre\",\n \"cloak\",\n \"once\",\n \"memo\",\n \"is\",\n])\n\n/**\n * @see https://github.com/vuejs/core/blob/48de8a42b7fed7a03f7f1ff5d53d6a704252cafe/packages/shared/src/domTagConfig.ts#L5-L28\n */\n// https://developer.mozilla.org/en-US/docs/Web/HTML/Element\nconst HTML_TAGS =\n \"html,body,base,head,link,meta,style,title,address,article,aside,footer,\" +\n \"header,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,\" +\n \"figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,\" +\n \"data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,\" +\n \"time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,\" +\n \"canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,\" +\n \"th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,\" +\n \"option,output,progress,select,textarea,details,dialog,menu,\" +\n \"summary,template,blockquote,iframe,tfoot\"\n\n// https://developer.mozilla.org/en-US/docs/Web/SVG/Element\nconst SVG_TAGS =\n \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,\" +\n \"defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,\" +\n \"feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,\" +\n \"feDistanceLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,\" +\n \"feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,\" +\n \"fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,\" +\n \"foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,\" +\n \"mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,\" +\n \"polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,\" +\n \"text,textPath,title,tspan,unknown,use,view\"\n\nconst NATIVE_TAGS = new Set([...HTML_TAGS.split(\",\"), ...SVG_TAGS.split(\",\")])\n\nconst COMPILER_MACROS_AT_ROOT = new Set([\n \"defineProps\",\n \"defineEmits\",\n \"defineExpose\",\n \"withDefaults\",\n])\n\n/**\n * `casing.camelCase()` converts the beginning to lowercase,\n * but does not convert the case of the beginning character when converting with Vue3.\n * @see https://github.com/vuejs/vue-next/blob/48de8a42b7fed7a03f7f1ff5d53d6a704252cafe/packages/shared/src/index.ts#L109\n */\nfunction camelize(str: string) {\n return str.replace(/-(\\w)/gu, (_, c) => (c ? c.toUpperCase() : \"\"))\n}\n\nfunction capitalize(str: string) {\n return str[0].toUpperCase() + str.slice(1)\n}\n\n/**\n * Analyze `<script setup>` scope.\n * This method does the following process:\n *\n * 1. Add a virtual reference to the variables used in the template to mark them as used.\n * (This is the same way typescript-eslint marks a `React` variable.)\n *\n * 2. If compiler macros were used, add these variables as global variables.\n */\nexport function analyzeScriptSetupScope(\n scopeManager: escopeTypes.ScopeManager,\n templateBody: VElement | undefined,\n df: VDocumentFragment,\n _parserOptions: ParserOptions,\n): void {\n analyzeUsedInTemplateVariables(scopeManager, templateBody, df)\n\n analyzeCompilerMacrosVariables(scopeManager)\n}\n\nfunction extractVariables(scopeManager: escopeTypes.ScopeManager) {\n const scriptVariables = new Map<string, escopeTypes.Variable>()\n const globalScope = scopeManager.globalScope\n if (!globalScope) {\n return scriptVariables\n }\n for (const variable of globalScope.variables) {\n scriptVariables.set(variable.name, variable)\n }\n const moduleScope = globalScope.childScopes.find(\n (scope) => scope.type === \"module\",\n )\n for (const variable of (moduleScope && moduleScope.variables) || []) {\n scriptVariables.set(variable.name, variable)\n }\n return scriptVariables\n}\n\n/**\n * Analyze the variables used in the template.\n * Add a virtual reference to the variables used in the template to mark them as used.\n * (This is the same way typescript-eslint marks a `React` variable.)\n */\nfunction analyzeUsedInTemplateVariables(\n scopeManager: escopeTypes.ScopeManager,\n templateBody: VElement | undefined,\n df: VDocumentFragment,\n) {\n const scriptVariables = extractVariables(scopeManager)\n\n const markedVariables = new Set<string>()\n\n /**\n * @see https://github.com/vuejs/vue-next/blob/48de8a42b7fed7a03f7f1ff5d53d6a704252cafe/packages/compiler-core/src/transforms/transformElement.ts#L335\n */\n function markSetupReferenceVariableAsUsed(name: string) {\n if (scriptVariables.has(name)) {\n markVariableAsUsed(name)\n return true\n }\n const camelName = camelize(name)\n if (scriptVariables.has(camelName)) {\n markVariableAsUsed(camelName)\n return true\n }\n const pascalName = capitalize(camelName)\n if (scriptVariables.has(pascalName)) {\n markVariableAsUsed(pascalName)\n return true\n }\n return false\n }\n\n function markVariableAsUsed(name: string) {\n const variable = scriptVariables.get(name)\n if (!variable || variable.identifiers.length === 0) {\n return\n }\n if (markedVariables.has(name)) {\n return\n }\n markedVariables.add(name)\n\n const reference = new (getEslintScope().Reference)()\n ;(reference as any).vueUsedInTemplate = true // Mark for debugging.\n reference.from = variable.scope\n reference.identifier = variable.identifiers[0]\n reference.isWrite = () => false\n reference.isWriteOnly = () => false\n reference.isRead = () => true\n reference.isReadOnly = () => true\n reference.isReadWrite = () => false\n reference.isValueReference = true // For typescript-eslint\n\n variable.references.push(reference)\n reference.resolved = variable\n }\n\n function processVExpressionContainer(node: VExpressionContainer) {\n for (const reference of node.references.filter(\n (ref) => ref.variable == null,\n )) {\n markVariableAsUsed(reference.id.name)\n }\n }\n\n function processVElement(node: VElement) {\n if (\n (node.rawName === node.name && NATIVE_TAGS.has(node.rawName)) ||\n BUILTIN_COMPONENTS.has(node.rawName)\n ) {\n return\n }\n if (!markSetupReferenceVariableAsUsed(node.rawName)) {\n // Check namespace\n // https://github.com/vuejs/vue-next/blob/48de8a42b7fed7a03f7f1ff5d53d6a704252cafe/packages/compiler-core/src/transforms/transformElement.ts#L306\n const dotIndex = node.rawName.indexOf(\".\")\n if (dotIndex > 0) {\n markSetupReferenceVariableAsUsed(\n node.rawName.slice(0, dotIndex),\n )\n }\n }\n }\n\n function processVAttribute(node: VAttribute | VDirective) {\n if (node.directive) {\n if (BUILTIN_DIRECTIVES.has(node.key.name.name)) {\n return\n }\n markSetupReferenceVariableAsUsed(`v-${node.key.name.rawName}`)\n } else if (node.key.name === \"ref\" && node.value) {\n markVariableAsUsed(node.value.value)\n }\n }\n\n if (templateBody) {\n // Analyze `<template>`\n traverseNodes(templateBody, {\n enterNode(node) {\n if (node.type === \"VExpressionContainer\") {\n processVExpressionContainer(node)\n } else if (node.type === \"VElement\") {\n processVElement(node)\n } else if (node.type === \"VAttribute\") {\n processVAttribute(node)\n }\n },\n leaveNode() {\n /* noop */\n },\n })\n }\n\n // Analyze CSS v-bind()\n for (const child of df.children) {\n if (child.type === \"VElement\" && child.name === \"style\") {\n for (const node of child.children) {\n if (node.type === \"VExpressionContainer\") {\n processVExpressionContainer(node)\n }\n }\n }\n }\n}\n\n/**\n * Analyze compiler macros.\n * If compiler macros were used, add these variables as global variables.\n */\nfunction analyzeCompilerMacrosVariables(\n scopeManager: escopeTypes.ScopeManager,\n) {\n const globalScope = scopeManager.globalScope\n if (!globalScope) {\n return\n }\n const compilerMacroVariables = new Map<string, escopeTypes.Variable>()\n\n function addCompilerMacroVariable(reference: escopeTypes.Reference) {\n const name = reference.identifier.name\n let variable = compilerMacroVariables.get(name)\n if (!variable) {\n variable = new (getEslintScope().Variable)()\n variable.name = name\n variable.scope = globalScope\n globalScope.variables.push(variable)\n globalScope.set.set(name, variable)\n compilerMacroVariables.set(name, variable)\n }\n // Links the variable and the reference.\n reference.resolved = variable\n variable.references.push(reference)\n }\n\n const newThrough: escopeTypes.Reference[] = []\n for (const reference of globalScope.through) {\n if (COMPILER_MACROS_AT_ROOT.has(reference.identifier.name)) {\n if (\n reference.from.type === \"global\" ||\n reference.from.type === \"module\"\n ) {\n addCompilerMacroVariable(reference)\n // This reference is removed from `Scope#through`.\n continue\n }\n }\n newThrough.push(reference)\n }\n\n globalScope.through = newThrough\n}\n", "/**\n * @author Toru Nagashima <https://github.com/mysticatea>\n * @copyright 2017 Toru Nagashima. All rights reserved.\n * See LICENSE file in root directory for full license.\n */\nimport * as path from \"path\"\nimport * as AST from \"./ast\"\nimport { LocationCalculatorForHtml } from \"./common/location-calculator\"\nimport { HTMLParser, HTMLTokenizer } from \"./html\"\nimport { parseScript, parseScriptElement } from \"./script\"\nimport * as services from \"./parser-services\"\nimport type { ParserOptions } from \"./common/parser-options\"\nimport { getScriptParser, getParserLangFromSFC } from \"./common/parser-options\"\nimport { parseScriptSetupElements } from \"./script-setup\"\nimport { LinesAndColumns } from \"./common/lines-and-columns\"\nimport type { VElement } from \"./ast\"\nimport { DEFAULT_ECMA_VERSION } from \"./script-setup/parser-options\"\nimport {\n getLang,\n isScriptElement,\n isScriptSetupElement,\n isStyleElement,\n isTemplateElement,\n} from \"./common/ast-utils\"\nimport { parseStyleElements } from \"./style\"\nimport { analyzeScope } from \"./script/scope-analyzer\"\nimport { analyzeScriptSetupScope } from \"./script-setup/scope-analyzer\"\n\nconst STARTS_WITH_LT = /^\\s*</u\n\n/**\n * Check whether the code is a Vue.js component.\n * @param code The source code to check.\n * @param options The parser options.\n * @returns `true` if the source code is a Vue.js component.\n */\nfunction isVueFile(code: string, options: ParserOptions): boolean {\n const filePath = options.filePath || \"unknown.js\"\n return path.extname(filePath) === \".vue\" || STARTS_WITH_LT.test(code)\n}\n\n/**\n * Parse the given source code.\n * @param code The source code to parse.\n * @param parserOptions The parser options.\n * @returns The parsing result.\n */\nexport function parseForESLint(\n code: string,\n parserOptions: any,\n): AST.ESLintExtendedProgram {\n const options: ParserOptions = Object.assign(\n {\n comment: true,\n loc: true,\n range: true,\n tokens: true,\n },\n parserOptions || {},\n )\n\n let result: AST.ESLintExtendedProgram\n let document: AST.VDocumentFragment | null\n let locationCalculator: LocationCalculatorForHtml | null\n if (!isVueFile(code, options)) {\n result = parseAsScript(code, options)\n document = null\n locationCalculator = null\n } else {\n ;({ result, document, locationCalculator } = parseAsSFC(code, options))\n }\n\n result.services = Object.assign(\n result.services || {},\n services.define(code, result.ast, document, locationCalculator, {\n parserOptions: options,\n }),\n )\n\n return result\n}\n\n/**\n * Parse the given source code.\n * @param code The source code to parse.\n * @param options The parser options.\n * @returns The parsing result.\n */\nexport function parse(code: string, options: any): AST.ESLintProgram {\n return parseForESLint(code, options).ast\n}\n\nexport { AST }\n\nfunction parseAsSFC(code: string, options: ParserOptions) {\n const optionsForTemplate = {\n ...options,\n ecmaVersion: options.ecmaVersion || DEFAULT_ECMA_VERSION,\n }\n const skipParsingScript = options.parser === false\n const tokenizer = new HTMLTokenizer(code, optionsForTemplate)\n const rootAST = new HTMLParser(tokenizer, optionsForTemplate).parse()\n\n const locationCalculator = new LocationCalculatorForHtml(\n tokenizer.gaps,\n tokenizer.lineTerminators,\n )\n const scripts = rootAST.children.filter(isScriptElement)\n const template = rootAST.children.find(isTemplateElement)\n const templateLang = getLang(template) || \"html\"\n const hasTemplateTokenizer = options?.templateTokenizer?.[templateLang]\n const concreteInfo: AST.HasConcreteInfo = {\n tokens: rootAST.tokens,\n comments: rootAST.comments,\n errors: rootAST.errors,\n }\n const templateBody =\n template != null && (templateLang === \"html\" || hasTemplateTokenizer)\n ? Object.assign(template, concreteInfo)\n : undefined\n\n const scriptParser = getScriptParser(options.parser, () =>\n getParserLangFromSFC(rootAST),\n )\n let result: AST.ESLintExtendedProgram\n let scriptSetup: VElement | undefined\n if (skipParsingScript || !scripts.length) {\n result = parseScript(\"\", {\n ...options,\n ecmaVersion: options.ecmaVersion || DEFAULT_ECMA_VERSION,\n parser: scriptParser,\n })\n } else if (\n scripts.length === 2 &&\n (scriptSetup = scripts.find(isScriptSetupElement))\n ) {\n result = parseScriptSetupElements(\n scriptSetup,\n scripts.find((e) => e !== scriptSetup)!,\n code,\n new LinesAndColumns(tokenizer.lineTerminators),\n {\n ...options,\n parser: scriptParser,\n },\n )\n } else {\n result = parseScriptElement(\n scripts[0],\n code,\n new LinesAndColumns(tokenizer.lineTerminators),\n {\n ...options,\n parser: scriptParser,\n },\n )\n }\n\n if (options.vueFeatures?.styleCSSVariableInjection ?? true) {\n const styles = rootAST.children.filter(isStyleElement)\n parseStyleElements(styles, locationCalculator, {\n ...options,\n parser: getScriptParser(options.parser, function* () {\n yield \"<template>\"\n yield getParserLangFromSFC(rootAST)\n }),\n })\n }\n result.ast.templateBody = templateBody\n\n if (options.eslintScopeManager) {\n if (scripts.some(isScriptSetupElement)) {\n if (!result.scopeManager) {\n result.scopeManager = analyzeScope(result.ast, options)\n }\n analyzeScriptSetupScope(\n result.scopeManager,\n templateBody,\n rootAST,\n options,\n )\n }\n }\n\n return {\n result,\n locationCalculator,\n document: rootAST,\n }\n}\n\nfunction parseAsScript(code: string, options: ParserOptions) {\n return parseScript(code, {\n ...options,\n ecmaVersion: options.ecmaVersion || DEFAULT_ECMA_VERSION,\n parser: getScriptParser(options.parser, () => {\n const ext = (\n path.extname(options.filePath || \"unknown.js\").toLowerCase() ||\n \"\"\n )\n // remove dot\n .slice(1)\n if (/^[jt]sx$/u.test(ext)) {\n return [ext, ext.slice(0, -1)]\n }\n\n return ext\n }),\n })\n}\n", "\n/*!\n * Stylus - Token\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar inspect = require('util').inspect;\n\n/**\n * Initialize a new `Token` with the given `type` and `val`.\n *\n * @param {String} type\n * @param {Mixed} val\n * @api private\n */\n\nvar Token = exports = module.exports = function Token(type, val) {\n this.type = type;\n this.val = val;\n};\n\n/**\n * Custom inspect.\n *\n * @return {String}\n * @api public\n */\n\nToken.prototype.inspect = function(){\n var val = ' ' + inspect(this.val);\n return '[Token:' + this.lineno + ':' + this.column + ' '\n + '\\x1b[32m' + this.type + '\\x1b[0m'\n + '\\x1b[33m' + (this.val ? val : '') + '\\x1b[0m'\n + ']';\n};\n\n/**\n * Return type or val.\n *\n * @return {String}\n * @api public\n */\n\nToken.prototype.toString = function(){\n return (undefined === this.val\n ? this.type\n : this.val).toString();\n};\n", "\n/*!\n * Stylus - Visitor\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Initialize a new `Visitor` with the given `root` Node.\n *\n * @param {Node} root\n * @api private\n */\n\nvar Visitor = module.exports = function Visitor(root) {\n this.root = root;\n};\n\n/**\n * Visit the given `node`.\n *\n * @param {Node|Array} node\n * @api public\n */\n\nVisitor.prototype.visit = function(node, fn){\n var method = 'visit' + node.constructor.name;\n if (this[method]) return this[method](node);\n return node;\n};\n\n", "\n/*!\n * Stylus - units\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n// units found in http://www.w3.org/TR/css3-values\n\nmodule.exports = [\n 'em', 'ex', 'ch', 'rem' // relative lengths\n , 'vw', 'vh', 'vmin', 'vmax' // relative viewport-percentage lengths\n , 'cm', 'mm', 'in', 'pt', 'pc', 'px' // absolute lengths\n , 'deg', 'grad', 'rad', 'turn' // angles\n , 's', 'ms' // times\n , 'Hz', 'kHz' // frequencies\n , 'dpi', 'dpcm', 'dppx', 'x' // resolutions\n , '%' // percentage type\n , 'fr' // grid-layout (http://www.w3.org/TR/css3-grid-layout/)\n];\n", "\n/*!\n * Stylus - Stack\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Initialize a new `Stack`.\n *\n * @api private\n */\n\nvar Stack = module.exports = function Stack() {\n Array.apply(this, arguments);\n};\n\n/**\n * Inherit from `Array.prototype`.\n */\n\nStack.prototype.__proto__ = Array.prototype;\n\n/**\n * Push the given `frame`.\n *\n * @param {Frame} frame\n * @api public\n */\n\nStack.prototype.push = function(frame){\n frame.stack = this;\n frame.parent = this.currentFrame;\n return [].push.apply(this, arguments);\n};\n\n/**\n * Return the current stack `Frame`.\n *\n * @return {Frame}\n * @api private\n */\n\nStack.prototype.__defineGetter__('currentFrame', function(){\n return this[this.length - 1];\n});\n\n/**\n * Lookup stack frame for the given `block`.\n *\n * @param {Block} block\n * @return {Frame}\n * @api private\n */\n\nStack.prototype.getBlockFrame = function(block){\n for (var i = 0; i < this.length; ++i) {\n if (block == this[i].block) {\n return this[i];\n }\n }\n};\n\n/**\n * Lookup the given local variable `name`, relative\n * to the lexical scope of the current frame's `Block`.\n *\n * When the result of a lookup is an identifier\n * a recursive lookup is performed, defaulting to\n * returning the identifier itself.\n *\n * @param {String} name\n * @return {Node}\n * @api private\n */\n\nStack.prototype.lookup = function(name){\n var block = this.currentFrame.block\n , val\n , ret;\n\n do {\n var frame = this.getBlockFrame(block);\n if (frame && (val = frame.lookup(name))) {\n return val;\n }\n } while (block = block.parent);\n};\n\n/**\n * Custom inspect.\n *\n * @return {String}\n * @api private\n */\n\nStack.prototype.inspect = function(){\n return this.reverse().map(function(frame){\n return frame.inspect();\n }).join('\\n');\n};\n\n/**\n * Return stack string formatted as:\n *\n * at <context> (<filename>:<lineno>:<column>)\n *\n * @return {String}\n * @api private\n */\n\nStack.prototype.toString = function(){\n var block\n , node\n , buf = []\n , location\n , len = this.length;\n\n while (len--) {\n block = this[len].block;\n if (node = block.node) {\n location = '(' + node.filename + ':' + (node.lineno + 1) + ':' + node.column + ')';\n switch (node.nodeName) {\n case 'function':\n buf.push(' at ' + node.name + '() ' + location);\n break;\n case 'group':\n buf.push(' at \"' + node.nodes[0].val + '\" ' + location);\n break;\n }\n }\n }\n\n return buf.join('\\n');\n};\n", "\n/*!\n * Stylus - stack - Scope\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Initialize a new `Scope`.\n *\n * @api private\n */\n\nvar Scope = module.exports = function Scope() {\n this.locals = {};\n};\n\n/**\n * Add `ident` node to the current scope.\n *\n * @param {Ident} ident\n * @api private\n */\n\nScope.prototype.add = function(ident){\n this.locals[ident.name] = ident.val;\n};\n\n/**\n * Lookup the given local variable `name`.\n *\n * @param {String} name\n * @return {Node}\n * @api private\n */\n\nScope.prototype.lookup = function(name){\n return hasOwnProperty(this.locals, name) ? this.locals[name] : undefined;\n};\n\n/**\n * Custom inspect.\n *\n * @return {String}\n * @api public\n */\n\nScope.prototype.inspect = function(){\n var keys = Object.keys(this.locals).map(function(key){ return '@' + key; });\n return '[Scope'\n + (keys.length ? ' ' + keys.join(', ') : '')\n + ']';\n};\n\n/**\n * @param {Object} obj\n * @param {String} propName\n * @returns {Boolean}\n */\nfunction hasOwnProperty(obj, propName) {\n return Object.prototype.hasOwnProperty.call(obj, propName);\n}\n", "\n/*!\n * Stylus - stack - Frame\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Scope = require('./scope');\n\n/**\n * Initialize a new `Frame` with the given `block`.\n *\n * @param {Block} block\n * @api private\n */\n\nvar Frame = module.exports = function Frame(block) {\n this._scope = false === block.scope\n ? null\n : new Scope;\n this.block = block;\n};\n\n/**\n * Return this frame's scope or the parent scope\n * for scope-less blocks.\n *\n * @return {Scope}\n * @api public\n */\n\nFrame.prototype.__defineGetter__('scope', function(){\n return this._scope || this.parent.scope;\n});\n\n/**\n * Lookup the given local variable `name`.\n *\n * @param {String} name\n * @return {Node}\n * @api private\n */\n\nFrame.prototype.lookup = function(name){\n return this.scope.lookup(name)\n};\n\n/**\n * Custom inspect.\n *\n * @return {String}\n * @api public\n */\n\nFrame.prototype.inspect = function(){\n return '[Frame '\n + (false === this.block.scope\n ? 'scope-less'\n : this.scope.inspect())\n + ']';\n};\n", "// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar pathModule = require('path');\nvar isWindows = process.platform === 'win32';\nvar fs = require('fs');\n\n// JavaScript implementation of realpath, ported from node pre-v6\n\nvar DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG);\n\nfunction rethrow() {\n // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and\n // is fairly slow to generate.\n var callback;\n if (DEBUG) {\n var backtrace = new Error;\n callback = debugCallback;\n } else\n callback = missingCallback;\n\n return callback;\n\n function debugCallback(err) {\n if (err) {\n backtrace.message = err.message;\n err = backtrace;\n missingCallback(err);\n }\n }\n\n function missingCallback(err) {\n if (err) {\n if (process.throwDeprecation)\n throw err; // Forgot a callback but don't know where? Use NODE_DEBUG=fs\n else if (!process.noDeprecation) {\n var msg = 'fs: missing callback ' + (err.stack || err.message);\n if (process.traceDeprecation)\n console.trace(msg);\n else\n console.error(msg);\n }\n }\n }\n}\n\nfunction maybeCallback(cb) {\n return typeof cb === 'function' ? cb : rethrow();\n}\n\nvar normalize = pathModule.normalize;\n\n// Regexp that finds the next partion of a (partial) path\n// result is [base_with_slash, base], e.g. ['somedir/', 'somedir']\nif (isWindows) {\n var nextPartRe = /(.*?)(?:[\\/\\\\]+|$)/g;\n} else {\n var nextPartRe = /(.*?)(?:[\\/]+|$)/g;\n}\n\n// Regex to find the device root, including trailing slash. E.g. 'c:\\\\'.\nif (isWindows) {\n var splitRootRe = /^(?:[a-zA-Z]:|[\\\\\\/]{2}[^\\\\\\/]+[\\\\\\/][^\\\\\\/]+)?[\\\\\\/]*/;\n} else {\n var splitRootRe = /^[\\/]*/;\n}\n\nexports.realpathSync = function realpathSync(p, cache) {\n // make p is absolute\n p = pathModule.resolve(p);\n\n if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {\n return cache[p];\n }\n\n var original = p,\n seenLinks = {},\n knownHard = {};\n\n // current character position in p\n var pos;\n // the partial path so far, including a trailing slash if any\n var current;\n // the partial path without a trailing slash (except when pointing at a root)\n var base;\n // the partial path scanned in the previous round, with slash\n var previous;\n\n start();\n\n function start() {\n // Skip over roots\n var m = splitRootRe.exec(p);\n pos = m[0].length;\n current = m[0];\n base = m[0];\n previous = '';\n\n // On windows, check that the root exists. On unix there is no need.\n if (isWindows && !knownHard[base]) {\n fs.lstatSync(base);\n knownHard[base] = true;\n }\n }\n\n // walk down the path, swapping out linked pathparts for their real\n // values\n // NB: p.length changes.\n while (pos < p.length) {\n // find the next part\n nextPartRe.lastIndex = pos;\n var result = nextPartRe.exec(p);\n previous = current;\n current += result[0];\n base = previous + result[1];\n pos = nextPartRe.lastIndex;\n\n // continue if not a symlink\n if (knownHard[base] || (cache && cache[base] === base)) {\n continue;\n }\n\n var resolvedLink;\n if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {\n // some known symbolic link. no need to stat again.\n resolvedLink = cache[base];\n } else {\n var stat = fs.lstatSync(base);\n if (!stat.isSymbolicLink()) {\n knownHard[base] = true;\n if (cache) cache[base] = base;\n continue;\n }\n\n // read the link if it wasn't read before\n // dev/ino always return 0 on windows, so skip the check.\n var linkTarget = null;\n if (!isWindows) {\n var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);\n if (seenLinks.hasOwnProperty(id)) {\n linkTarget = seenLinks[id];\n }\n }\n if (linkTarget === null) {\n fs.statSync(base);\n linkTarget = fs.readlinkSync(base);\n }\n resolvedLink = pathModule.resolve(previous, linkTarget);\n // track this, if given a cache.\n if (cache) cache[base] = resolvedLink;\n if (!isWindows) seenLinks[id] = linkTarget;\n }\n\n // resolve the link, then start over\n p = pathModule.resolve(resolvedLink, p.slice(pos));\n start();\n }\n\n if (cache) cache[original] = p;\n\n return p;\n};\n\n\nexports.realpath = function realpath(p, cache, cb) {\n if (typeof cb !== 'function') {\n cb = maybeCallback(cache);\n cache = null;\n }\n\n // make p is absolute\n p = pathModule.resolve(p);\n\n if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {\n return process.nextTick(cb.bind(null, null, cache[p]));\n }\n\n var original = p,\n seenLinks = {},\n knownHard = {};\n\n // current character position in p\n var pos;\n // the partial path so far, including a trailing slash if any\n var current;\n // the partial path without a trailing slash (except when pointing at a root)\n var base;\n // the partial path scanned in the previous round, with slash\n var previous;\n\n start();\n\n function start() {\n // Skip over roots\n var m = splitRootRe.exec(p);\n pos = m[0].length;\n current = m[0];\n base = m[0];\n previous = '';\n\n // On windows, check that the root exists. On unix there is no need.\n if (isWindows && !knownHard[base]) {\n fs.lstat(base, function(err) {\n if (err) return cb(err);\n knownHard[base] = true;\n LOOP();\n });\n } else {\n process.nextTick(LOOP);\n }\n }\n\n // walk down the path, swapping out linked pathparts for their real\n // values\n function LOOP() {\n // stop if scanned past end of path\n if (pos >= p.length) {\n if (cache) cache[original] = p;\n return cb(null, p);\n }\n\n // find the next part\n nextPartRe.lastIndex = pos;\n var result = nextPartRe.exec(p);\n previous = current;\n current += result[0];\n base = previous + result[1];\n pos = nextPartRe.lastIndex;\n\n // continue if not a symlink\n if (knownHard[base] || (cache && cache[base] === base)) {\n return process.nextTick(LOOP);\n }\n\n if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {\n // known symbolic link. no need to stat again.\n return gotResolvedLink(cache[base]);\n }\n\n return fs.lstat(base, gotStat);\n }\n\n function gotStat(err, stat) {\n if (err) return cb(err);\n\n // if not a symlink, skip to the next path part\n if (!stat.isSymbolicLink()) {\n knownHard[base] = true;\n if (cache) cache[base] = base;\n return process.nextTick(LOOP);\n }\n\n // stat & read the link if not read before\n // call gotTarget as soon as the link target is known\n // dev/ino always return 0 on windows, so skip the check.\n if (!isWindows) {\n var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);\n if (seenLinks.hasOwnProperty(id)) {\n return gotTarget(null, seenLinks[id], base);\n }\n }\n fs.stat(base, function(err) {\n if (err) return cb(err);\n\n fs.readlink(base, function(err, target) {\n if (!isWindows) seenLinks[id] = target;\n gotTarget(err, target);\n });\n });\n }\n\n function gotTarget(err, target, base) {\n if (err) return cb(err);\n\n var resolvedLink = pathModule.resolve(previous, target);\n if (cache) cache[base] = resolvedLink;\n gotResolvedLink(resolvedLink);\n }\n\n function gotResolvedLink(resolvedLink) {\n // resolve the link, then start over\n p = pathModule.resolve(resolvedLink, p.slice(pos));\n start();\n }\n};\n", "module.exports = realpath\nrealpath.realpath = realpath\nrealpath.sync = realpathSync\nrealpath.realpathSync = realpathSync\nrealpath.monkeypatch = monkeypatch\nrealpath.unmonkeypatch = unmonkeypatch\n\nvar fs = require('fs')\nvar origRealpath = fs.realpath\nvar origRealpathSync = fs.realpathSync\n\nvar version = process.version\nvar ok = /^v[0-5]\\./.test(version)\nvar old = require('./old.js')\n\nfunction newError (er) {\n return er && er.syscall === 'realpath' && (\n er.code === 'ELOOP' ||\n er.code === 'ENOMEM' ||\n er.code === 'ENAMETOOLONG'\n )\n}\n\nfunction realpath (p, cache, cb) {\n if (ok) {\n return origRealpath(p, cache, cb)\n }\n\n if (typeof cache === 'function') {\n cb = cache\n cache = null\n }\n origRealpath(p, cache, function (er, result) {\n if (newError(er)) {\n old.realpath(p, cache, cb)\n } else {\n cb(er, result)\n }\n })\n}\n\nfunction realpathSync (p, cache) {\n if (ok) {\n return origRealpathSync(p, cache)\n }\n\n try {\n return origRealpathSync(p, cache)\n } catch (er) {\n if (newError(er)) {\n return old.realpathSync(p, cache)\n } else {\n throw er\n }\n }\n}\n\nfunction monkeypatch () {\n fs.realpath = realpath\n fs.realpathSync = realpathSync\n}\n\nfunction unmonkeypatch () {\n fs.realpath = origRealpath\n fs.realpathSync = origRealpathSync\n}\n", "module.exports = function (xs, fn) {\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n var x = fn(xs[i], i);\n if (isArray(x)) res.push.apply(res, x);\n else res.push(x);\n }\n return res;\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};\n", "'use strict';\nmodule.exports = balanced;\nfunction balanced(a, b, str) {\n if (a instanceof RegExp) a = maybeMatch(a, str);\n if (b instanceof RegExp) b = maybeMatch(b, str);\n\n var r = range(a, b, str);\n\n return r && {\n start: r[0],\n end: r[1],\n pre: str.slice(0, r[0]),\n body: str.slice(r[0] + a.length, r[1]),\n post: str.slice(r[1] + b.length)\n };\n}\n\nfunction maybeMatch(reg, str) {\n var m = str.match(reg);\n return m ? m[0] : null;\n}\n\nbalanced.range = range;\nfunction range(a, b, str) {\n var begs, beg, left, right, result;\n var ai = str.indexOf(a);\n var bi = str.indexOf(b, ai + 1);\n var i = ai;\n\n if (ai >= 0 && bi > 0) {\n if(a===b) {\n return [ai, bi];\n }\n begs = [];\n left = str.length;\n\n while (i >= 0 && !result) {\n if (i == ai) {\n begs.push(i);\n ai = str.indexOf(a, i + 1);\n } else if (begs.length == 1) {\n result = [ begs.pop(), bi ];\n } else {\n beg = begs.pop();\n if (beg < left) {\n left = beg;\n right = bi;\n }\n\n bi = str.indexOf(b, i + 1);\n }\n\n i = ai < bi && ai >= 0 ? ai : bi;\n }\n\n if (begs.length) {\n result = [ left, right ];\n }\n }\n\n return result;\n}\n", "var concatMap = require('concat-map');\nvar balanced = require('balanced-match');\n\nmodule.exports = expandTop;\n\nvar escSlash = '\\0SLASH'+Math.random()+'\\0';\nvar escOpen = '\\0OPEN'+Math.random()+'\\0';\nvar escClose = '\\0CLOSE'+Math.random()+'\\0';\nvar escComma = '\\0COMMA'+Math.random()+'\\0';\nvar escPeriod = '\\0PERIOD'+Math.random()+'\\0';\n\nfunction numeric(str) {\n return parseInt(str, 10) == str\n ? parseInt(str, 10)\n : str.charCodeAt(0);\n}\n\nfunction escapeBraces(str) {\n return str.split('\\\\\\\\').join(escSlash)\n .split('\\\\{').join(escOpen)\n .split('\\\\}').join(escClose)\n .split('\\\\,').join(escComma)\n .split('\\\\.').join(escPeriod);\n}\n\nfunction unescapeBraces(str) {\n return str.split(escSlash).join('\\\\')\n .split(escOpen).join('{')\n .split(escClose).join('}')\n .split(escComma).join(',')\n .split(escPeriod).join('.');\n}\n\n\n// Basically just str.split(\",\"), but handling cases\n// where we have nested braced sections, which should be\n// treated as individual members, like {a,{b,c},d}\nfunction parseCommaParts(str) {\n if (!str)\n return [''];\n\n var parts = [];\n var m = balanced('{', '}', str);\n\n if (!m)\n return str.split(',');\n\n var pre = m.pre;\n var body = m.body;\n var post = m.post;\n var p = pre.split(',');\n\n p[p.length-1] += '{' + body + '}';\n var postParts = parseCommaParts(post);\n if (post.length) {\n p[p.length-1] += postParts.shift();\n p.push.apply(p, postParts);\n }\n\n parts.push.apply(parts, p);\n\n return parts;\n}\n\nfunction expandTop(str) {\n if (!str)\n return [];\n\n // I don't know why Bash 4.3 does this, but it does.\n // Anything starting with {} will have the first two bytes preserved\n // but *only* at the top level, so {},a}b will not expand to anything,\n // but a{},b}c will be expanded to [a}c,abc].\n // One could argue that this is a bug in Bash, but since the goal of\n // this module is to match Bash's rules, we escape a leading {}\n if (str.substr(0, 2) === '{}') {\n str = '\\\\{\\\\}' + str.substr(2);\n }\n\n return expand(escapeBraces(str), true).map(unescapeBraces);\n}\n\nfunction identity(e) {\n return e;\n}\n\nfunction embrace(str) {\n return '{' + str + '}';\n}\nfunction isPadded(el) {\n return /^-?0\\d/.test(el);\n}\n\nfunction lte(i, y) {\n return i <= y;\n}\nfunction gte(i, y) {\n return i >= y;\n}\n\nfunction expand(str, isTop) {\n var expansions = [];\n\n var m = balanced('{', '}', str);\n if (!m || /\\$$/.test(m.pre)) return [str];\n\n var isNumericSequence = /^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(m.body);\n var isAlphaSequence = /^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(m.body);\n var isSequence = isNumericSequence || isAlphaSequence;\n var isOptions = m.body.indexOf(',') >= 0;\n if (!isSequence && !isOptions) {\n // {a},b}\n if (m.post.match(/,.*\\}/)) {\n str = m.pre + '{' + m.body + escClose + m.post;\n return expand(str);\n }\n return [str];\n }\n\n var n;\n if (isSequence) {\n n = m.body.split(/\\.\\./);\n } else {\n n = parseCommaParts(m.body);\n if (n.length === 1) {\n // x{{a,b}}y ==> x{a}y x{b}y\n n = expand(n[0], false).map(embrace);\n if (n.length === 1) {\n var post = m.post.length\n ? expand(m.post, false)\n : [''];\n return post.map(function(p) {\n return m.pre + n[0] + p;\n });\n }\n }\n }\n\n // at this point, n is the parts, and we know it's not a comma set\n // with a single entry.\n\n // no need to expand pre, since it is guaranteed to be free of brace-sets\n var pre = m.pre;\n var post = m.post.length\n ? expand(m.post, false)\n : [''];\n\n var N;\n\n if (isSequence) {\n var x = numeric(n[0]);\n var y = numeric(n[1]);\n var width = Math.max(n[0].length, n[1].length)\n var incr = n.length == 3\n ? Math.abs(numeric(n[2]))\n : 1;\n var test = lte;\n var reverse = y < x;\n if (reverse) {\n incr *= -1;\n test = gte;\n }\n var pad = n.some(isPadded);\n\n N = [];\n\n for (var i = x; test(i, y); i += incr) {\n var c;\n if (isAlphaSequence) {\n c = String.fromCharCode(i);\n if (c === '\\\\')\n c = '';\n } else {\n c = String(i);\n if (pad) {\n var need = width - c.length;\n if (need > 0) {\n var z = new Array(need + 1).join('0');\n if (i < 0)\n c = '-' + z + c.slice(1);\n else\n c = z + c;\n }\n }\n }\n N.push(c);\n }\n } else {\n N = concatMap(n, function(el) { return expand(el, false) });\n }\n\n for (var j = 0; j < N.length; j++) {\n for (var k = 0; k < post.length; k++) {\n var expansion = pre + N[j] + post[k];\n if (!isTop || isSequence || expansion)\n expansions.push(expansion);\n }\n }\n\n return expansions;\n}\n\n", "module.exports = minimatch\nminimatch.Minimatch = Minimatch\n\nvar path = (function () { try { return require('path') } catch (e) {}}()) || {\n sep: '/'\n}\nminimatch.sep = path.sep\n\nvar GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}\nvar expand = require('brace-expansion')\n\nvar plTypes = {\n '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},\n '?': { open: '(?:', close: ')?' },\n '+': { open: '(?:', close: ')+' },\n '*': { open: '(?:', close: ')*' },\n '@': { open: '(?:', close: ')' }\n}\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nvar qmark = '[^/]'\n\n// * => any number of characters\nvar star = qmark + '*?'\n\n// ** when dots are allowed. Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nvar twoStarDot = '(?:(?!(?:\\\\\\/|^)(?:\\\\.{1,2})($|\\\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nvar twoStarNoDot = '(?:(?!(?:\\\\\\/|^)\\\\.).)*?'\n\n// characters that need to be escaped in RegExp.\nvar reSpecials = charSet('().*{}+?[]^$\\\\!')\n\n// \"abc\" -> { a:true, b:true, c:true }\nfunction charSet (s) {\n return s.split('').reduce(function (set, c) {\n set[c] = true\n return set\n }, {})\n}\n\n// normalizes slashes.\nvar slashSplit = /\\/+/\n\nminimatch.filter = filter\nfunction filter (pattern, options) {\n options = options || {}\n return function (p, i, list) {\n return minimatch(p, pattern, options)\n }\n}\n\nfunction ext (a, b) {\n b = b || {}\n var t = {}\n Object.keys(a).forEach(function (k) {\n t[k] = a[k]\n })\n Object.keys(b).forEach(function (k) {\n t[k] = b[k]\n })\n return t\n}\n\nminimatch.defaults = function (def) {\n if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n return minimatch\n }\n\n var orig = minimatch\n\n var m = function minimatch (p, pattern, options) {\n return orig(p, pattern, ext(def, options))\n }\n\n m.Minimatch = function Minimatch (pattern, options) {\n return new orig.Minimatch(pattern, ext(def, options))\n }\n m.Minimatch.defaults = function defaults (options) {\n return orig.defaults(ext(def, options)).Minimatch\n }\n\n m.filter = function filter (pattern, options) {\n return orig.filter(pattern, ext(def, options))\n }\n\n m.defaults = function defaults (options) {\n return orig.defaults(ext(def, options))\n }\n\n m.makeRe = function makeRe (pattern, options) {\n return orig.makeRe(pattern, ext(def, options))\n }\n\n m.braceExpand = function braceExpand (pattern, options) {\n return orig.braceExpand(pattern, ext(def, options))\n }\n\n m.match = function (list, pattern, options) {\n return orig.match(list, pattern, ext(def, options))\n }\n\n return m\n}\n\nMinimatch.defaults = function (def) {\n return minimatch.defaults(def).Minimatch\n}\n\nfunction minimatch (p, pattern, options) {\n assertValidPattern(pattern)\n\n if (!options) options = {}\n\n // shortcut: comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n return false\n }\n\n return new Minimatch(pattern, options).match(p)\n}\n\nfunction Minimatch (pattern, options) {\n if (!(this instanceof Minimatch)) {\n return new Minimatch(pattern, options)\n }\n\n assertValidPattern(pattern)\n\n if (!options) options = {}\n\n pattern = pattern.trim()\n\n // windows support: need to use /, not \\\n if (!options.allowWindowsEscape && path.sep !== '/') {\n pattern = pattern.split(path.sep).join('/')\n }\n\n this.options = options\n this.set = []\n this.pattern = pattern\n this.regexp = null\n this.negate = false\n this.comment = false\n this.empty = false\n this.partial = !!options.partial\n\n // make the set of regexps etc.\n this.make()\n}\n\nMinimatch.prototype.debug = function () {}\n\nMinimatch.prototype.make = make\nfunction make () {\n var pattern = this.pattern\n var options = this.options\n\n // empty patterns and comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n this.comment = true\n return\n }\n if (!pattern) {\n this.empty = true\n return\n }\n\n // step 1: figure out negation, etc.\n this.parseNegate()\n\n // step 2: expand braces\n var set = this.globSet = this.braceExpand()\n\n if (options.debug) this.debug = function debug() { console.error.apply(console, arguments) }\n\n this.debug(this.pattern, set)\n\n // step 3: now we have a set, so turn each one into a series of path-portion\n // matching patterns.\n // These will be regexps, except in the case of \"**\", which is\n // set to the GLOBSTAR object for globstar behavior,\n // and will not contain any / characters\n set = this.globParts = set.map(function (s) {\n return s.split(slashSplit)\n })\n\n this.debug(this.pattern, set)\n\n // glob --> regexps\n set = set.map(function (s, si, set) {\n return s.map(this.parse, this)\n }, this)\n\n this.debug(this.pattern, set)\n\n // filter out everything that didn't compile properly.\n set = set.filter(function (s) {\n return s.indexOf(false) === -1\n })\n\n this.debug(this.pattern, set)\n\n this.set = set\n}\n\nMinimatch.prototype.parseNegate = parseNegate\nfunction parseNegate () {\n var pattern = this.pattern\n var negate = false\n var options = this.options\n var negateOffset = 0\n\n if (options.nonegate) return\n\n for (var i = 0, l = pattern.length\n ; i < l && pattern.charAt(i) === '!'\n ; i++) {\n negate = !negate\n negateOffset++\n }\n\n if (negateOffset) this.pattern = pattern.substr(negateOffset)\n this.negate = negate\n}\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nminimatch.braceExpand = function (pattern, options) {\n return braceExpand(pattern, options)\n}\n\nMinimatch.prototype.braceExpand = braceExpand\n\nfunction braceExpand (pattern, options) {\n if (!options) {\n if (this instanceof Minimatch) {\n options = this.options\n } else {\n options = {}\n }\n }\n\n pattern = typeof pattern === 'undefined'\n ? this.pattern : pattern\n\n assertValidPattern(pattern)\n\n // Thanks to Yeting Li <https://github.com/yetingli> for\n // improving this regexp to avoid a ReDOS vulnerability.\n if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n // shortcut. no need to expand.\n return [pattern]\n }\n\n return expand(pattern)\n}\n\nvar MAX_PATTERN_LENGTH = 1024 * 64\nvar assertValidPattern = function (pattern) {\n if (typeof pattern !== 'string') {\n throw new TypeError('invalid pattern')\n }\n\n if (pattern.length > MAX_PATTERN_LENGTH) {\n throw new TypeError('pattern is too long')\n }\n}\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion. Otherwise, any series\n// of * is equivalent to a single *. Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\nMinimatch.prototype.parse = parse\nvar SUBPARSE = {}\nfunction parse (pattern, isSub) {\n assertValidPattern(pattern)\n\n var options = this.options\n\n // shortcuts\n if (pattern === '**') {\n if (!options.noglobstar)\n return GLOBSTAR\n else\n pattern = '*'\n }\n if (pattern === '') return ''\n\n var re = ''\n var hasMagic = !!options.nocase\n var escaping = false\n // ? => one single character\n var patternListStack = []\n var negativeLists = []\n var stateChar\n var inClass = false\n var reClassStart = -1\n var classStart = -1\n // . and .. never match anything that doesn't start with .,\n // even when options.dot is set.\n var patternStart = pattern.charAt(0) === '.' ? '' // anything\n // not (start or / followed by . or .. followed by / or end)\n : options.dot ? '(?!(?:^|\\\\\\/)\\\\.{1,2}(?:$|\\\\\\/))'\n : '(?!\\\\.)'\n var self = this\n\n function clearStateChar () {\n if (stateChar) {\n // we had some state-tracking character\n // that wasn't consumed by this pass.\n switch (stateChar) {\n case '*':\n re += star\n hasMagic = true\n break\n case '?':\n re += qmark\n hasMagic = true\n break\n default:\n re += '\\\\' + stateChar\n break\n }\n self.debug('clearStateChar %j %j', stateChar, re)\n stateChar = false\n }\n }\n\n for (var i = 0, len = pattern.length, c\n ; (i < len) && (c = pattern.charAt(i))\n ; i++) {\n this.debug('%s\\t%s %s %j', pattern, i, re, c)\n\n // skip over any that are escaped.\n if (escaping && reSpecials[c]) {\n re += '\\\\' + c\n escaping = false\n continue\n }\n\n switch (c) {\n /* istanbul ignore next */\n case '/': {\n // completely not allowed, even escaped.\n // Should already be path-split by now.\n return false\n }\n\n case '\\\\':\n clearStateChar()\n escaping = true\n continue\n\n // the various stateChar values\n // for the \"extglob\" stuff.\n case '?':\n case '*':\n case '+':\n case '@':\n case '!':\n this.debug('%s\\t%s %s %j <-- stateChar', pattern, i, re, c)\n\n // all of those are literals inside a class, except that\n // the glob [!a] means [^a] in regexp\n if (inClass) {\n this.debug(' in class')\n if (c === '!' && i === classStart + 1) c = '^'\n re += c\n continue\n }\n\n // if we already have a stateChar, then it means\n // that there was something like ** or +? in there.\n // Handle the stateChar, then proceed with this one.\n self.debug('call clearStateChar %j', stateChar)\n clearStateChar()\n stateChar = c\n // if extglob is disabled, then +(asdf|foo) isn't a thing.\n // just clear the statechar *now*, rather than even diving into\n // the patternList stuff.\n if (options.noext) clearStateChar()\n continue\n\n case '(':\n if (inClass) {\n re += '('\n continue\n }\n\n if (!stateChar) {\n re += '\\\\('\n continue\n }\n\n patternListStack.push({\n type: stateChar,\n start: i - 1,\n reStart: re.length,\n open: plTypes[stateChar].open,\n close: plTypes[stateChar].close\n })\n // negation is (?:(?!js)[^/]*)\n re += stateChar === '!' ? '(?:(?!(?:' : '(?:'\n this.debug('plType %j %j', stateChar, re)\n stateChar = false\n continue\n\n case ')':\n if (inClass || !patternListStack.length) {\n re += '\\\\)'\n continue\n }\n\n clearStateChar()\n hasMagic = true\n var pl = patternListStack.pop()\n // negation is (?:(?!js)[^/]*)\n // The others are (?:<pattern>)<type>\n re += pl.close\n if (pl.type === '!') {\n negativeLists.push(pl)\n }\n pl.reEnd = re.length\n continue\n\n case '|':\n if (inClass || !patternListStack.length || escaping) {\n re += '\\\\|'\n escaping = false\n continue\n }\n\n clearStateChar()\n re += '|'\n continue\n\n // these are mostly the same in regexp and glob\n case '[':\n // swallow any state-tracking char before the [\n clearStateChar()\n\n if (inClass) {\n re += '\\\\' + c\n continue\n }\n\n inClass = true\n classStart = i\n reClassStart = re.length\n re += c\n continue\n\n case ']':\n // a right bracket shall lose its special\n // meaning and represent itself in\n // a bracket expression if it occurs\n // first in the list. -- POSIX.2 2.8.3.2\n if (i === classStart + 1 || !inClass) {\n re += '\\\\' + c\n escaping = false\n continue\n }\n\n // handle the case where we left a class open.\n // \"[z-a]\" is valid, equivalent to \"\\[z-a\\]\"\n // split where the last [ was, make sure we don't have\n // an invalid re. if so, re-walk the contents of the\n // would-be class to re-translate any characters that\n // were passed through as-is\n // TODO: It would probably be faster to determine this\n // without a try/catch and a new RegExp, but it's tricky\n // to do safely. For now, this is safe and works.\n var cs = pattern.substring(classStart + 1, i)\n try {\n RegExp('[' + cs + ']')\n } catch (er) {\n // not a valid class!\n var sp = this.parse(cs, SUBPARSE)\n re = re.substr(0, reClassStart) + '\\\\[' + sp[0] + '\\\\]'\n hasMagic = hasMagic || sp[1]\n inClass = false\n continue\n }\n\n // finish up the class.\n hasMagic = true\n inClass = false\n re += c\n continue\n\n default:\n // swallow any state char that wasn't consumed\n clearStateChar()\n\n if (escaping) {\n // no need\n escaping = false\n } else if (reSpecials[c]\n && !(c === '^' && inClass)) {\n re += '\\\\'\n }\n\n re += c\n\n } // switch\n } // for\n\n // handle the case where we left a class open.\n // \"[abc\" is valid, equivalent to \"\\[abc\"\n if (inClass) {\n // split where the last [ was, and escape it\n // this is a huge pita. We now have to re-walk\n // the contents of the would-be class to re-translate\n // any characters that were passed through as-is\n cs = pattern.substr(classStart + 1)\n sp = this.parse(cs, SUBPARSE)\n re = re.substr(0, reClassStart) + '\\\\[' + sp[0]\n hasMagic = hasMagic || sp[1]\n }\n\n // handle the case where we had a +( thing at the *end*\n // of the pattern.\n // each pattern list stack adds 3 chars, and we need to go through\n // and escape any | chars that were passed through as-is for the regexp.\n // Go through and escape them, taking care not to double-escape any\n // | chars that were already escaped.\n for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {\n var tail = re.slice(pl.reStart + pl.open.length)\n this.debug('setting tail', re, pl)\n // maybe some even number of \\, then maybe 1 \\, followed by a |\n tail = tail.replace(/((?:\\\\{2}){0,64})(\\\\?)\\|/g, function (_, $1, $2) {\n if (!$2) {\n // the | isn't already escaped, so escape it.\n $2 = '\\\\'\n }\n\n // need to escape all those slashes *again*, without escaping the\n // one that we need for escaping the | character. As it works out,\n // escaping an even number of slashes can be done by simply repeating\n // it exactly after itself. That's why this trick works.\n //\n // I am sorry that you have to see this.\n return $1 + $1 + $2 + '|'\n })\n\n this.debug('tail=%j\\n %s', tail, tail, pl, re)\n var t = pl.type === '*' ? star\n : pl.type === '?' ? qmark\n : '\\\\' + pl.type\n\n hasMagic = true\n re = re.slice(0, pl.reStart) + t + '\\\\(' + tail\n }\n\n // handle trailing things that only matter at the very end.\n clearStateChar()\n if (escaping) {\n // trailing \\\\\n re += '\\\\\\\\'\n }\n\n // only need to apply the nodot start if the re starts with\n // something that could conceivably capture a dot\n var addPatternStart = false\n switch (re.charAt(0)) {\n case '[': case '.': case '(': addPatternStart = true\n }\n\n // Hack to work around lack of negative lookbehind in JS\n // A pattern like: *.!(x).!(y|z) needs to ensure that a name\n // like 'a.xyz.yz' doesn't match. So, the first negative\n // lookahead, has to look ALL the way ahead, to the end of\n // the pattern.\n for (var n = negativeLists.length - 1; n > -1; n--) {\n var nl = negativeLists[n]\n\n var nlBefore = re.slice(0, nl.reStart)\n var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)\n var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)\n var nlAfter = re.slice(nl.reEnd)\n\n nlLast += nlAfter\n\n // Handle nested stuff like *(*.js|!(*.json)), where open parens\n // mean that we should *not* include the ) in the bit that is considered\n // \"after\" the negated section.\n var openParensBefore = nlBefore.split('(').length - 1\n var cleanAfter = nlAfter\n for (i = 0; i < openParensBefore; i++) {\n cleanAfter = cleanAfter.replace(/\\)[+*?]?/, '')\n }\n nlAfter = cleanAfter\n\n var dollar = ''\n if (nlAfter === '' && isSub !== SUBPARSE) {\n dollar = '$'\n }\n var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast\n re = newRe\n }\n\n // if the re is not \"\" at this point, then we need to make sure\n // it doesn't match against an empty path part.\n // Otherwise a/* will match a/, which it should not.\n if (re !== '' && hasMagic) {\n re = '(?=.)' + re\n }\n\n if (addPatternStart) {\n re = patternStart + re\n }\n\n // parsing just a piece of a larger pattern.\n if (isSub === SUBPARSE) {\n return [re, hasMagic]\n }\n\n // skip the regexp for non-magical patterns\n // unescape anything in it, though, so that it'll be\n // an exact match against a file etc.\n if (!hasMagic) {\n return globUnescape(pattern)\n }\n\n var flags = options.nocase ? 'i' : ''\n try {\n var regExp = new RegExp('^' + re + '$', flags)\n } catch (er) /* istanbul ignore next - should be impossible */ {\n // If it was an invalid regular expression, then it can't match\n // anything. This trick looks for a character after the end of\n // the string, which is of course impossible, except in multi-line\n // mode, but it's not a /m regex.\n return new RegExp('$.')\n }\n\n regExp._glob = pattern\n regExp._src = re\n\n return regExp\n}\n\nminimatch.makeRe = function (pattern, options) {\n return new Minimatch(pattern, options || {}).makeRe()\n}\n\nMinimatch.prototype.makeRe = makeRe\nfunction makeRe () {\n if (this.regexp || this.regexp === false) return this.regexp\n\n // at this point, this.set is a 2d array of partial\n // pattern strings, or \"**\".\n //\n // It's better to use .match(). This function shouldn't\n // be used, really, but it's pretty convenient sometimes,\n // when you just want to work with a regex.\n var set = this.set\n\n if (!set.length) {\n this.regexp = false\n return this.regexp\n }\n var options = this.options\n\n var twoStar = options.noglobstar ? star\n : options.dot ? twoStarDot\n : twoStarNoDot\n var flags = options.nocase ? 'i' : ''\n\n var re = set.map(function (pattern) {\n return pattern.map(function (p) {\n return (p === GLOBSTAR) ? twoStar\n : (typeof p === 'string') ? regExpEscape(p)\n : p._src\n }).join('\\\\\\/')\n }).join('|')\n\n // must match entire pattern\n // ending in a * or ** will make it less strict.\n re = '^(?:' + re + ')$'\n\n // can match anything, as long as it's not this.\n if (this.negate) re = '^(?!' + re + ').*$'\n\n try {\n this.regexp = new RegExp(re, flags)\n } catch (ex) /* istanbul ignore next - should be impossible */ {\n this.regexp = false\n }\n return this.regexp\n}\n\nminimatch.match = function (list, pattern, options) {\n options = options || {}\n var mm = new Minimatch(pattern, options)\n list = list.filter(function (f) {\n return mm.match(f)\n })\n if (mm.options.nonull && !list.length) {\n list.push(pattern)\n }\n return list\n}\n\nMinimatch.prototype.match = function match (f, partial) {\n if (typeof partial === 'undefined') partial = this.partial\n this.debug('match', f, this.pattern)\n // short-circuit in the case of busted things.\n // comments, etc.\n if (this.comment) return false\n if (this.empty) return f === ''\n\n if (f === '/' && partial) return true\n\n var options = this.options\n\n // windows: need to use /, not \\\n if (path.sep !== '/') {\n f = f.split(path.sep).join('/')\n }\n\n // treat the test path as a set of pathparts.\n f = f.split(slashSplit)\n this.debug(this.pattern, 'split', f)\n\n // just ONE of the pattern sets in this.set needs to match\n // in order for it to be valid. If negating, then just one\n // match means that we have failed.\n // Either way, return on the first hit.\n\n var set = this.set\n this.debug(this.pattern, 'set', set)\n\n // Find the basename of the path by looking for the last non-empty segment\n var filename\n var i\n for (i = f.length - 1; i >= 0; i--) {\n filename = f[i]\n if (filename) break\n }\n\n for (i = 0; i < set.length; i++) {\n var pattern = set[i]\n var file = f\n if (options.matchBase && pattern.length === 1) {\n file = [filename]\n }\n var hit = this.matchOne(file, pattern, partial)\n if (hit) {\n if (options.flipNegate) return true\n return !this.negate\n }\n }\n\n // didn't get any hits. this is success if it's a negative\n // pattern, failure otherwise.\n if (options.flipNegate) return false\n return this.negate\n}\n\n// set partial to true to test if, for example,\n// \"/a/b\" matches the start of \"/*/b/*/d\"\n// Partial means, if you run out of file before you run\n// out of pattern, then that's fine, as long as all\n// the parts match.\nMinimatch.prototype.matchOne = function (file, pattern, partial) {\n var options = this.options\n\n this.debug('matchOne',\n { 'this': this, file: file, pattern: pattern })\n\n this.debug('matchOne', file.length, pattern.length)\n\n for (var fi = 0,\n pi = 0,\n fl = file.length,\n pl = pattern.length\n ; (fi < fl) && (pi < pl)\n ; fi++, pi++) {\n this.debug('matchOne loop')\n var p = pattern[pi]\n var f = file[fi]\n\n this.debug(pattern, p, f)\n\n // should be impossible.\n // some invalid regexp stuff in the set.\n /* istanbul ignore if */\n if (p === false) return false\n\n if (p === GLOBSTAR) {\n this.debug('GLOBSTAR', [pattern, p, f])\n\n // \"**\"\n // a/**/b/**/c would match the following:\n // a/b/x/y/z/c\n // a/x/y/z/b/c\n // a/b/x/b/x/c\n // a/b/c\n // To do this, take the rest of the pattern after\n // the **, and see if it would match the file remainder.\n // If so, return success.\n // If not, the ** \"swallows\" a segment, and try again.\n // This is recursively awful.\n //\n // a/**/b/**/c matching a/b/x/y/z/c\n // - a matches a\n // - doublestar\n // - matchOne(b/x/y/z/c, b/**/c)\n // - b matches b\n // - doublestar\n // - matchOne(x/y/z/c, c) -> no\n // - matchOne(y/z/c, c) -> no\n // - matchOne(z/c, c) -> no\n // - matchOne(c, c) yes, hit\n var fr = fi\n var pr = pi + 1\n if (pr === pl) {\n this.debug('** at the end')\n // a ** at the end will just swallow the rest.\n // We have found a match.\n // however, it will not swallow /.x, unless\n // options.dot is set.\n // . and .. are *never* matched by **, for explosively\n // exponential reasons.\n for (; fi < fl; fi++) {\n if (file[fi] === '.' || file[fi] === '..' ||\n (!options.dot && file[fi].charAt(0) === '.')) return false\n }\n return true\n }\n\n // ok, let's see if we can swallow whatever we can.\n while (fr < fl) {\n var swallowee = file[fr]\n\n this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee)\n\n // XXX remove this slice. Just pass the start index.\n if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n this.debug('globstar found match!', fr, fl, swallowee)\n // found a match.\n return true\n } else {\n // can't swallow \".\" or \"..\" ever.\n // can only swallow \".foo\" when explicitly asked.\n if (swallowee === '.' || swallowee === '..' ||\n (!options.dot && swallowee.charAt(0) === '.')) {\n this.debug('dot detected!', file, fr, pattern, pr)\n break\n }\n\n // ** swallows a segment, and continue.\n this.debug('globstar swallow a segment, and continue')\n fr++\n }\n }\n\n // no match was found.\n // However, in partial mode, we can't say this is necessarily over.\n // If there's more *pattern* left, then\n /* istanbul ignore if */\n if (partial) {\n // ran out of file\n this.debug('\\n>>> no match, partial?', file, fr, pattern, pr)\n if (fr === fl) return true\n }\n return false\n }\n\n // something other than **\n // non-magic patterns just have to match exactly\n // patterns with magic have been turned into regexps.\n var hit\n if (typeof p === 'string') {\n hit = f === p\n this.debug('string match', p, f, hit)\n } else {\n hit = f.match(p)\n this.debug('pattern match', p, f, hit)\n }\n\n if (!hit) return false\n }\n\n // Note: ending in / means that we'll get a final \"\"\n // at the end of the pattern. This can only match a\n // corresponding \"\" at the end of the file.\n // If the file ends in /, then it can only match a\n // a pattern that ends in /, unless the pattern just\n // doesn't have any more for it. But, a/b/ should *not*\n // match \"a/b/*\", even though \"\" matches against the\n // [^/]*? pattern, except in partial mode, where it might\n // simply not be reached yet.\n // However, a/b/ should still satisfy a/*\n\n // now either we fell off the end of the pattern, or we're done.\n if (fi === fl && pi === pl) {\n // ran out of pattern and filename at the same time.\n // an exact hit!\n return true\n } else if (fi === fl) {\n // ran out of file, but still had pattern left.\n // this is ok if we're doing the match as part of\n // a glob fs traversal.\n return partial\n } else /* istanbul ignore else */ if (pi === pl) {\n // ran out of pattern, still have file left.\n // this is only acceptable if we're on the very last\n // empty segment of a file with a trailing slash.\n // a/* should match a/b/\n return (fi === fl - 1) && (file[fi] === '')\n }\n\n // should be unreachable.\n /* istanbul ignore next */\n throw new Error('wtf?')\n}\n\n// replace stuff like \\* with *\nfunction globUnescape (s) {\n return s.replace(/\\\\(.)/g, '$1')\n}\n\nfunction regExpEscape (s) {\n return s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n}\n", "if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n })\n }\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n }\n}\n", "try {\n var util = require('util');\n /* istanbul ignore next */\n if (typeof util.inherits !== 'function') throw '';\n module.exports = util.inherits;\n} catch (e) {\n /* istanbul ignore next */\n module.exports = require('./inherits_browser.js');\n}\n", "'use strict';\n\nfunction posix(path) {\n\treturn path.charAt(0) === '/';\n}\n\nfunction win32(path) {\n\t// https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56\n\tvar splitDeviceRe = /^([a-zA-Z]:|[\\\\\\/]{2}[^\\\\\\/]+[\\\\\\/]+[^\\\\\\/]+)?([\\\\\\/])?([\\s\\S]*?)$/;\n\tvar result = splitDeviceRe.exec(path);\n\tvar device = result[1] || '';\n\tvar isUnc = Boolean(device && device.charAt(1) !== ':');\n\n\t// UNC paths are always absolute\n\treturn Boolean(result[2] || isUnc);\n}\n\nmodule.exports = process.platform === 'win32' ? win32 : posix;\nmodule.exports.posix = posix;\nmodule.exports.win32 = win32;\n", "exports.setopts = setopts\nexports.ownProp = ownProp\nexports.makeAbs = makeAbs\nexports.finish = finish\nexports.mark = mark\nexports.isIgnored = isIgnored\nexports.childrenIgnored = childrenIgnored\n\nfunction ownProp (obj, field) {\n return Object.prototype.hasOwnProperty.call(obj, field)\n}\n\nvar fs = require(\"fs\")\nvar path = require(\"path\")\nvar minimatch = require(\"minimatch\")\nvar isAbsolute = require(\"path-is-absolute\")\nvar Minimatch = minimatch.Minimatch\n\nfunction alphasort (a, b) {\n return a.localeCompare(b, 'en')\n}\n\nfunction setupIgnores (self, options) {\n self.ignore = options.ignore || []\n\n if (!Array.isArray(self.ignore))\n self.ignore = [self.ignore]\n\n if (self.ignore.length) {\n self.ignore = self.ignore.map(ignoreMap)\n }\n}\n\n// ignore patterns are always in dot:true mode.\nfunction ignoreMap (pattern) {\n var gmatcher = null\n if (pattern.slice(-3) === '/**') {\n var gpattern = pattern.replace(/(\\/\\*\\*)+$/, '')\n gmatcher = new Minimatch(gpattern, { dot: true })\n }\n\n return {\n matcher: new Minimatch(pattern, { dot: true }),\n gmatcher: gmatcher\n }\n}\n\nfunction setopts (self, pattern, options) {\n if (!options)\n options = {}\n\n // base-matching: just use globstar for that.\n if (options.matchBase && -1 === pattern.indexOf(\"/\")) {\n if (options.noglobstar) {\n throw new Error(\"base matching requires globstar\")\n }\n pattern = \"**/\" + pattern\n }\n\n self.silent = !!options.silent\n self.pattern = pattern\n self.strict = options.strict !== false\n self.realpath = !!options.realpath\n self.realpathCache = options.realpathCache || Object.create(null)\n self.follow = !!options.follow\n self.dot = !!options.dot\n self.mark = !!options.mark\n self.nodir = !!options.nodir\n if (self.nodir)\n self.mark = true\n self.sync = !!options.sync\n self.nounique = !!options.nounique\n self.nonull = !!options.nonull\n self.nosort = !!options.nosort\n self.nocase = !!options.nocase\n self.stat = !!options.stat\n self.noprocess = !!options.noprocess\n self.absolute = !!options.absolute\n self.fs = options.fs || fs\n\n self.maxLength = options.maxLength || Infinity\n self.cache = options.cache || Object.create(null)\n self.statCache = options.statCache || Object.create(null)\n self.symlinks = options.symlinks || Object.create(null)\n\n setupIgnores(self, options)\n\n self.changedCwd = false\n var cwd = process.cwd()\n if (!ownProp(options, \"cwd\"))\n self.cwd = cwd\n else {\n self.cwd = path.resolve(options.cwd)\n self.changedCwd = self.cwd !== cwd\n }\n\n self.root = options.root || path.resolve(self.cwd, \"/\")\n self.root = path.resolve(self.root)\n if (process.platform === \"win32\")\n self.root = self.root.replace(/\\\\/g, \"/\")\n\n // TODO: is an absolute `cwd` supposed to be resolved against `root`?\n // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test')\n self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd)\n if (process.platform === \"win32\")\n self.cwdAbs = self.cwdAbs.replace(/\\\\/g, \"/\")\n self.nomount = !!options.nomount\n\n // disable comments and negation in Minimatch.\n // Note that they are not supported in Glob itself anyway.\n options.nonegate = true\n options.nocomment = true\n // always treat \\ in patterns as escapes, not path separators\n options.allowWindowsEscape = false\n\n self.minimatch = new Minimatch(pattern, options)\n self.options = self.minimatch.options\n}\n\nfunction finish (self) {\n var nou = self.nounique\n var all = nou ? [] : Object.create(null)\n\n for (var i = 0, l = self.matches.length; i < l; i ++) {\n var matches = self.matches[i]\n if (!matches || Object.keys(matches).length === 0) {\n if (self.nonull) {\n // do like the shell, and spit out the literal glob\n var literal = self.minimatch.globSet[i]\n if (nou)\n all.push(literal)\n else\n all[literal] = true\n }\n } else {\n // had matches\n var m = Object.keys(matches)\n if (nou)\n all.push.apply(all, m)\n else\n m.forEach(function (m) {\n all[m] = true\n })\n }\n }\n\n if (!nou)\n all = Object.keys(all)\n\n if (!self.nosort)\n all = all.sort(alphasort)\n\n // at *some* point we statted all of these\n if (self.mark) {\n for (var i = 0; i < all.length; i++) {\n all[i] = self._mark(all[i])\n }\n if (self.nodir) {\n all = all.filter(function (e) {\n var notDir = !(/\\/$/.test(e))\n var c = self.cache[e] || self.cache[makeAbs(self, e)]\n if (notDir && c)\n notDir = c !== 'DIR' && !Array.isArray(c)\n return notDir\n })\n }\n }\n\n if (self.ignore.length)\n all = all.filter(function(m) {\n return !isIgnored(self, m)\n })\n\n self.found = all\n}\n\nfunction mark (self, p) {\n var abs = makeAbs(self, p)\n var c = self.cache[abs]\n var m = p\n if (c) {\n var isDir = c === 'DIR' || Array.isArray(c)\n var slash = p.slice(-1) === '/'\n\n if (isDir && !slash)\n m += '/'\n else if (!isDir && slash)\n m = m.slice(0, -1)\n\n if (m !== p) {\n var mabs = makeAbs(self, m)\n self.statCache[mabs] = self.statCache[abs]\n self.cache[mabs] = self.cache[abs]\n }\n }\n\n return m\n}\n\n// lotta situps...\nfunction makeAbs (self, f) {\n var abs = f\n if (f.charAt(0) === '/') {\n abs = path.join(self.root, f)\n } else if (isAbsolute(f) || f === '') {\n abs = f\n } else if (self.changedCwd) {\n abs = path.resolve(self.cwd, f)\n } else {\n abs = path.resolve(f)\n }\n\n if (process.platform === 'win32')\n abs = abs.replace(/\\\\/g, '/')\n\n return abs\n}\n\n\n// Return true, if pattern ends with globstar '**', for the accompanying parent directory.\n// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents\nfunction isIgnored (self, path) {\n if (!self.ignore.length)\n return false\n\n return self.ignore.some(function(item) {\n return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))\n })\n}\n\nfunction childrenIgnored (self, path) {\n if (!self.ignore.length)\n return false\n\n return self.ignore.some(function(item) {\n return !!(item.gmatcher && item.gmatcher.match(path))\n })\n}\n", "module.exports = globSync\nglobSync.GlobSync = GlobSync\n\nvar rp = require('fs.realpath')\nvar minimatch = require('minimatch')\nvar Minimatch = minimatch.Minimatch\nvar Glob = require('./glob.js').Glob\nvar util = require('util')\nvar path = require('path')\nvar assert = require('assert')\nvar isAbsolute = require('path-is-absolute')\nvar common = require('./common.js')\nvar setopts = common.setopts\nvar ownProp = common.ownProp\nvar childrenIgnored = common.childrenIgnored\nvar isIgnored = common.isIgnored\n\nfunction globSync (pattern, options) {\n if (typeof options === 'function' || arguments.length === 3)\n throw new TypeError('callback provided to sync glob\\n'+\n 'See: https://github.com/isaacs/node-glob/issues/167')\n\n return new GlobSync(pattern, options).found\n}\n\nfunction GlobSync (pattern, options) {\n if (!pattern)\n throw new Error('must provide pattern')\n\n if (typeof options === 'function' || arguments.length === 3)\n throw new TypeError('callback provided to sync glob\\n'+\n 'See: https://github.com/isaacs/node-glob/issues/167')\n\n if (!(this instanceof GlobSync))\n return new GlobSync(pattern, options)\n\n setopts(this, pattern, options)\n\n if (this.noprocess)\n return this\n\n var n = this.minimatch.set.length\n this.matches = new Array(n)\n for (var i = 0; i < n; i ++) {\n this._process(this.minimatch.set[i], i, false)\n }\n this._finish()\n}\n\nGlobSync.prototype._finish = function () {\n assert.ok(this instanceof GlobSync)\n if (this.realpath) {\n var self = this\n this.matches.forEach(function (matchset, index) {\n var set = self.matches[index] = Object.create(null)\n for (var p in matchset) {\n try {\n p = self._makeAbs(p)\n var real = rp.realpathSync(p, self.realpathCache)\n set[real] = true\n } catch (er) {\n if (er.syscall === 'stat')\n set[self._makeAbs(p)] = true\n else\n throw er\n }\n }\n })\n }\n common.finish(this)\n}\n\n\nGlobSync.prototype._process = function (pattern, index, inGlobStar) {\n assert.ok(this instanceof GlobSync)\n\n // Get the first [n] parts of pattern that are all strings.\n var n = 0\n while (typeof pattern[n] === 'string') {\n n ++\n }\n // now n is the index of the first one that is *not* a string.\n\n // See if there's anything else\n var prefix\n switch (n) {\n // if not, then this is rather simple\n case pattern.length:\n this._processSimple(pattern.join('/'), index)\n return\n\n case 0:\n // pattern *starts* with some non-trivial item.\n // going to readdir(cwd), but not include the prefix in matches.\n prefix = null\n break\n\n default:\n // pattern has some string bits in the front.\n // whatever it starts with, whether that's 'absolute' like /foo/bar,\n // or 'relative' like '../baz'\n prefix = pattern.slice(0, n).join('/')\n break\n }\n\n var remain = pattern.slice(n)\n\n // get the list of entries.\n var read\n if (prefix === null)\n read = '.'\n else if (isAbsolute(prefix) ||\n isAbsolute(pattern.map(function (p) {\n return typeof p === 'string' ? p : '[*]'\n }).join('/'))) {\n if (!prefix || !isAbsolute(prefix))\n prefix = '/' + prefix\n read = prefix\n } else\n read = prefix\n\n var abs = this._makeAbs(read)\n\n //if ignored, skip processing\n if (childrenIgnored(this, read))\n return\n\n var isGlobStar = remain[0] === minimatch.GLOBSTAR\n if (isGlobStar)\n this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)\n else\n this._processReaddir(prefix, read, abs, remain, index, inGlobStar)\n}\n\n\nGlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {\n var entries = this._readdir(abs, inGlobStar)\n\n // if the abs isn't a dir, then nothing can match!\n if (!entries)\n return\n\n // It will only match dot entries if it starts with a dot, or if\n // dot is set. Stuff like @(.foo|.bar) isn't allowed.\n var pn = remain[0]\n var negate = !!this.minimatch.negate\n var rawGlob = pn._glob\n var dotOk = this.dot || rawGlob.charAt(0) === '.'\n\n var matchedEntries = []\n for (var i = 0; i < entries.length; i++) {\n var e = entries[i]\n if (e.charAt(0) !== '.' || dotOk) {\n var m\n if (negate && !prefix) {\n m = !e.match(pn)\n } else {\n m = e.match(pn)\n }\n if (m)\n matchedEntries.push(e)\n }\n }\n\n var len = matchedEntries.length\n // If there are no matched entries, then nothing matches.\n if (len === 0)\n return\n\n // if this is the last remaining pattern bit, then no need for\n // an additional stat *unless* the user has specified mark or\n // stat explicitly. We know they exist, since readdir returned\n // them.\n\n if (remain.length === 1 && !this.mark && !this.stat) {\n if (!this.matches[index])\n this.matches[index] = Object.create(null)\n\n for (var i = 0; i < len; i ++) {\n var e = matchedEntries[i]\n if (prefix) {\n if (prefix.slice(-1) !== '/')\n e = prefix + '/' + e\n else\n e = prefix + e\n }\n\n if (e.charAt(0) === '/' && !this.nomount) {\n e = path.join(this.root, e)\n }\n this._emitMatch(index, e)\n }\n // This was the last one, and no stats were needed\n return\n }\n\n // now test all matched entries as stand-ins for that part\n // of the pattern.\n remain.shift()\n for (var i = 0; i < len; i ++) {\n var e = matchedEntries[i]\n var newPattern\n if (prefix)\n newPattern = [prefix, e]\n else\n newPattern = [e]\n this._process(newPattern.concat(remain), index, inGlobStar)\n }\n}\n\n\nGlobSync.prototype._emitMatch = function (index, e) {\n if (isIgnored(this, e))\n return\n\n var abs = this._makeAbs(e)\n\n if (this.mark)\n e = this._mark(e)\n\n if (this.absolute) {\n e = abs\n }\n\n if (this.matches[index][e])\n return\n\n if (this.nodir) {\n var c = this.cache[abs]\n if (c === 'DIR' || Array.isArray(c))\n return\n }\n\n this.matches[index][e] = true\n\n if (this.stat)\n this._stat(e)\n}\n\n\nGlobSync.prototype._readdirInGlobStar = function (abs) {\n // follow all symlinked directories forever\n // just proceed as if this is a non-globstar situation\n if (this.follow)\n return this._readdir(abs, false)\n\n var entries\n var lstat\n var stat\n try {\n lstat = this.fs.lstatSync(abs)\n } catch (er) {\n if (er.code === 'ENOENT') {\n // lstat failed, doesn't exist\n return null\n }\n }\n\n var isSym = lstat && lstat.isSymbolicLink()\n this.symlinks[abs] = isSym\n\n // If it's not a symlink or a dir, then it's definitely a regular file.\n // don't bother doing a readdir in that case.\n if (!isSym && lstat && !lstat.isDirectory())\n this.cache[abs] = 'FILE'\n else\n entries = this._readdir(abs, false)\n\n return entries\n}\n\nGlobSync.prototype._readdir = function (abs, inGlobStar) {\n var entries\n\n if (inGlobStar && !ownProp(this.symlinks, abs))\n return this._readdirInGlobStar(abs)\n\n if (ownProp(this.cache, abs)) {\n var c = this.cache[abs]\n if (!c || c === 'FILE')\n return null\n\n if (Array.isArray(c))\n return c\n }\n\n try {\n return this._readdirEntries(abs, this.fs.readdirSync(abs))\n } catch (er) {\n this._readdirError(abs, er)\n return null\n }\n}\n\nGlobSync.prototype._readdirEntries = function (abs, entries) {\n // if we haven't asked to stat everything, then just\n // assume that everything in there exists, so we can avoid\n // having to stat it a second time.\n if (!this.mark && !this.stat) {\n for (var i = 0; i < entries.length; i ++) {\n var e = entries[i]\n if (abs === '/')\n e = abs + e\n else\n e = abs + '/' + e\n this.cache[e] = true\n }\n }\n\n this.cache[abs] = entries\n\n // mark and cache dir-ness\n return entries\n}\n\nGlobSync.prototype._readdirError = function (f, er) {\n // handle errors, and cache the information\n switch (er.code) {\n case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205\n case 'ENOTDIR': // totally normal. means it *does* exist.\n var abs = this._makeAbs(f)\n this.cache[abs] = 'FILE'\n if (abs === this.cwdAbs) {\n var error = new Error(er.code + ' invalid cwd ' + this.cwd)\n error.path = this.cwd\n error.code = er.code\n throw error\n }\n break\n\n case 'ENOENT': // not terribly unusual\n case 'ELOOP':\n case 'ENAMETOOLONG':\n case 'UNKNOWN':\n this.cache[this._makeAbs(f)] = false\n break\n\n default: // some unusual error. Treat as failure.\n this.cache[this._makeAbs(f)] = false\n if (this.strict)\n throw er\n if (!this.silent)\n console.error('glob error', er)\n break\n }\n}\n\nGlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {\n\n var entries = this._readdir(abs, inGlobStar)\n\n // no entries means not a dir, so it can never have matches\n // foo.txt/** doesn't match foo.txt\n if (!entries)\n return\n\n // test without the globstar, and with every child both below\n // and replacing the globstar.\n var remainWithoutGlobStar = remain.slice(1)\n var gspref = prefix ? [ prefix ] : []\n var noGlobStar = gspref.concat(remainWithoutGlobStar)\n\n // the noGlobStar pattern exits the inGlobStar state\n this._process(noGlobStar, index, false)\n\n var len = entries.length\n var isSym = this.symlinks[abs]\n\n // If it's a symlink, and we're in a globstar, then stop\n if (isSym && inGlobStar)\n return\n\n for (var i = 0; i < len; i++) {\n var e = entries[i]\n if (e.charAt(0) === '.' && !this.dot)\n continue\n\n // these two cases enter the inGlobStar state\n var instead = gspref.concat(entries[i], remainWithoutGlobStar)\n this._process(instead, index, true)\n\n var below = gspref.concat(entries[i], remain)\n this._process(below, index, true)\n }\n}\n\nGlobSync.prototype._processSimple = function (prefix, index) {\n // XXX review this. Shouldn't it be doing the mounting etc\n // before doing stat? kinda weird?\n var exists = this._stat(prefix)\n\n if (!this.matches[index])\n this.matches[index] = Object.create(null)\n\n // If it doesn't exist, then just mark the lack of results\n if (!exists)\n return\n\n if (prefix && isAbsolute(prefix) && !this.nomount) {\n var trail = /[\\/\\\\]$/.test(prefix)\n if (prefix.charAt(0) === '/') {\n prefix = path.join(this.root, prefix)\n } else {\n prefix = path.resolve(this.root, prefix)\n if (trail)\n prefix += '/'\n }\n }\n\n if (process.platform === 'win32')\n prefix = prefix.replace(/\\\\/g, '/')\n\n // Mark this as a match\n this._emitMatch(index, prefix)\n}\n\n// Returns either 'DIR', 'FILE', or false\nGlobSync.prototype._stat = function (f) {\n var abs = this._makeAbs(f)\n var needDir = f.slice(-1) === '/'\n\n if (f.length > this.maxLength)\n return false\n\n if (!this.stat && ownProp(this.cache, abs)) {\n var c = this.cache[abs]\n\n if (Array.isArray(c))\n c = 'DIR'\n\n // It exists, but maybe not how we need it\n if (!needDir || c === 'DIR')\n return c\n\n if (needDir && c === 'FILE')\n return false\n\n // otherwise we have to stat, because maybe c=true\n // if we know it exists, but not what it is.\n }\n\n var exists\n var stat = this.statCache[abs]\n if (!stat) {\n var lstat\n try {\n lstat = this.fs.lstatSync(abs)\n } catch (er) {\n if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {\n this.statCache[abs] = false\n return false\n }\n }\n\n if (lstat && lstat.isSymbolicLink()) {\n try {\n stat = this.fs.statSync(abs)\n } catch (er) {\n stat = lstat\n }\n } else {\n stat = lstat\n }\n }\n\n this.statCache[abs] = stat\n\n var c = true\n if (stat)\n c = stat.isDirectory() ? 'DIR' : 'FILE'\n\n this.cache[abs] = this.cache[abs] || c\n\n if (needDir && c === 'FILE')\n return false\n\n return c\n}\n\nGlobSync.prototype._mark = function (p) {\n return common.mark(this, p)\n}\n\nGlobSync.prototype._makeAbs = function (f) {\n return common.makeAbs(this, f)\n}\n", "// Returns a wrapper function that returns a wrapped callback\n// The wrapper function should do some stuff, and return a\n// presumably different callback function.\n// This makes sure that own properties are retained, so that\n// decorations and such are not lost along the way.\nmodule.exports = wrappy\nfunction wrappy (fn, cb) {\n if (fn && cb) return wrappy(fn)(cb)\n\n if (typeof fn !== 'function')\n throw new TypeError('need wrapper function')\n\n Object.keys(fn).forEach(function (k) {\n wrapper[k] = fn[k]\n })\n\n return wrapper\n\n function wrapper() {\n var args = new Array(arguments.length)\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i]\n }\n var ret = fn.apply(this, args)\n var cb = args[args.length-1]\n if (typeof ret === 'function' && ret !== cb) {\n Object.keys(cb).forEach(function (k) {\n ret[k] = cb[k]\n })\n }\n return ret\n }\n}\n", "var wrappy = require('wrappy')\nmodule.exports = wrappy(once)\nmodule.exports.strict = wrappy(onceStrict)\n\nonce.proto = once(function () {\n Object.defineProperty(Function.prototype, 'once', {\n value: function () {\n return once(this)\n },\n configurable: true\n })\n\n Object.defineProperty(Function.prototype, 'onceStrict', {\n value: function () {\n return onceStrict(this)\n },\n configurable: true\n })\n})\n\nfunction once (fn) {\n var f = function () {\n if (f.called) return f.value\n f.called = true\n return f.value = fn.apply(this, arguments)\n }\n f.called = false\n return f\n}\n\nfunction onceStrict (fn) {\n var f = function () {\n if (f.called)\n throw new Error(f.onceError)\n f.called = true\n return f.value = fn.apply(this, arguments)\n }\n var name = fn.name || 'Function wrapped with `once`'\n f.onceError = name + \" shouldn't be called more than once\"\n f.called = false\n return f\n}\n", "var wrappy = require('wrappy')\nvar reqs = Object.create(null)\nvar once = require('once')\n\nmodule.exports = wrappy(inflight)\n\nfunction inflight (key, cb) {\n if (reqs[key]) {\n reqs[key].push(cb)\n return null\n } else {\n reqs[key] = [cb]\n return makeres(key)\n }\n}\n\nfunction makeres (key) {\n return once(function RES () {\n var cbs = reqs[key]\n var len = cbs.length\n var args = slice(arguments)\n\n // XXX It's somewhat ambiguous whether a new callback added in this\n // pass should be queued for later execution if something in the\n // list of callbacks throws, or if it should just be discarded.\n // However, it's such an edge case that it hardly matters, and either\n // choice is likely as surprising as the other.\n // As it happens, we do go ahead and schedule it for later execution.\n try {\n for (var i = 0; i < len; i++) {\n cbs[i].apply(null, args)\n }\n } finally {\n if (cbs.length > len) {\n // added more in the interim.\n // de-zalgo, just in case, but don't call again.\n cbs.splice(0, len)\n process.nextTick(function () {\n RES.apply(null, args)\n })\n } else {\n delete reqs[key]\n }\n }\n })\n}\n\nfunction slice (args) {\n var length = args.length\n var array = []\n\n for (var i = 0; i < length; i++) array[i] = args[i]\n return array\n}\n", "// Approach:\n//\n// 1. Get the minimatch set\n// 2. For each pattern in the set, PROCESS(pattern, false)\n// 3. Store matches per-set, then uniq them\n//\n// PROCESS(pattern, inGlobStar)\n// Get the first [n] items from pattern that are all strings\n// Join these together. This is PREFIX.\n// If there is no more remaining, then stat(PREFIX) and\n// add to matches if it succeeds. END.\n//\n// If inGlobStar and PREFIX is symlink and points to dir\n// set ENTRIES = []\n// else readdir(PREFIX) as ENTRIES\n// If fail, END\n//\n// with ENTRIES\n// If pattern[n] is GLOBSTAR\n// // handle the case where the globstar match is empty\n// // by pruning it out, and testing the resulting pattern\n// PROCESS(pattern[0..n] + pattern[n+1 .. $], false)\n// // handle other cases.\n// for ENTRY in ENTRIES (not dotfiles)\n// // attach globstar + tail onto the entry\n// // Mark that this entry is a globstar match\n// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)\n//\n// else // not globstar\n// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)\n// Test ENTRY against pattern[n]\n// If fails, continue\n// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])\n//\n// Caveat:\n// Cache all stats and readdirs results to minimize syscall. Since all\n// we ever care about is existence and directory-ness, we can just keep\n// `true` for files, and [children,...] for directories, or `false` for\n// things that don't exist.\n\nmodule.exports = glob\n\nvar rp = require('fs.realpath')\nvar minimatch = require('minimatch')\nvar Minimatch = minimatch.Minimatch\nvar inherits = require('inherits')\nvar EE = require('events').EventEmitter\nvar path = require('path')\nvar assert = require('assert')\nvar isAbsolute = require('path-is-absolute')\nvar globSync = require('./sync.js')\nvar common = require('./common.js')\nvar setopts = common.setopts\nvar ownProp = common.ownProp\nvar inflight = require('inflight')\nvar util = require('util')\nvar childrenIgnored = common.childrenIgnored\nvar isIgnored = common.isIgnored\n\nvar once = require('once')\n\nfunction glob (pattern, options, cb) {\n if (typeof options === 'function') cb = options, options = {}\n if (!options) options = {}\n\n if (options.sync) {\n if (cb)\n throw new TypeError('callback provided to sync glob')\n return globSync(pattern, options)\n }\n\n return new Glob(pattern, options, cb)\n}\n\nglob.sync = globSync\nvar GlobSync = glob.GlobSync = globSync.GlobSync\n\n// old api surface\nglob.glob = glob\n\nfunction extend (origin, add) {\n if (add === null || typeof add !== 'object') {\n return origin\n }\n\n var keys = Object.keys(add)\n var i = keys.length\n while (i--) {\n origin[keys[i]] = add[keys[i]]\n }\n return origin\n}\n\nglob.hasMagic = function (pattern, options_) {\n var options = extend({}, options_)\n options.noprocess = true\n\n var g = new Glob(pattern, options)\n var set = g.minimatch.set\n\n if (!pattern)\n return false\n\n if (set.length > 1)\n return true\n\n for (var j = 0; j < set[0].length; j++) {\n if (typeof set[0][j] !== 'string')\n return true\n }\n\n return false\n}\n\nglob.Glob = Glob\ninherits(Glob, EE)\nfunction Glob (pattern, options, cb) {\n if (typeof options === 'function') {\n cb = options\n options = null\n }\n\n if (options && options.sync) {\n if (cb)\n throw new TypeError('callback provided to sync glob')\n return new GlobSync(pattern, options)\n }\n\n if (!(this instanceof Glob))\n return new Glob(pattern, options, cb)\n\n setopts(this, pattern, options)\n this._didRealPath = false\n\n // process each pattern in the minimatch set\n var n = this.minimatch.set.length\n\n // The matches are stored as {<filename>: true,...} so that\n // duplicates are automagically pruned.\n // Later, we do an Object.keys() on these.\n // Keep them as a list so we can fill in when nonull is set.\n this.matches = new Array(n)\n\n if (typeof cb === 'function') {\n cb = once(cb)\n this.on('error', cb)\n this.on('end', function (matches) {\n cb(null, matches)\n })\n }\n\n var self = this\n this._processing = 0\n\n this._emitQueue = []\n this._processQueue = []\n this.paused = false\n\n if (this.noprocess)\n return this\n\n if (n === 0)\n return done()\n\n var sync = true\n for (var i = 0; i < n; i ++) {\n this._process(this.minimatch.set[i], i, false, done)\n }\n sync = false\n\n function done () {\n --self._processing\n if (self._processing <= 0) {\n if (sync) {\n process.nextTick(function () {\n self._finish()\n })\n } else {\n self._finish()\n }\n }\n }\n}\n\nGlob.prototype._finish = function () {\n assert(this instanceof Glob)\n if (this.aborted)\n return\n\n if (this.realpath && !this._didRealpath)\n return this._realpath()\n\n common.finish(this)\n this.emit('end', this.found)\n}\n\nGlob.prototype._realpath = function () {\n if (this._didRealpath)\n return\n\n this._didRealpath = true\n\n var n = this.matches.length\n if (n === 0)\n return this._finish()\n\n var self = this\n for (var i = 0; i < this.matches.length; i++)\n this._realpathSet(i, next)\n\n function next () {\n if (--n === 0)\n self._finish()\n }\n}\n\nGlob.prototype._realpathSet = function (index, cb) {\n var matchset = this.matches[index]\n if (!matchset)\n return cb()\n\n var found = Object.keys(matchset)\n var self = this\n var n = found.length\n\n if (n === 0)\n return cb()\n\n var set = this.matches[index] = Object.create(null)\n found.forEach(function (p, i) {\n // If there's a problem with the stat, then it means that\n // one or more of the links in the realpath couldn't be\n // resolved. just return the abs value in that case.\n p = self._makeAbs(p)\n rp.realpath(p, self.realpathCache, function (er, real) {\n if (!er)\n set[real] = true\n else if (er.syscall === 'stat')\n set[p] = true\n else\n self.emit('error', er) // srsly wtf right here\n\n if (--n === 0) {\n self.matches[index] = set\n cb()\n }\n })\n })\n}\n\nGlob.prototype._mark = function (p) {\n return common.mark(this, p)\n}\n\nGlob.prototype._makeAbs = function (f) {\n return common.makeAbs(this, f)\n}\n\nGlob.prototype.abort = function () {\n this.aborted = true\n this.emit('abort')\n}\n\nGlob.prototype.pause = function () {\n if (!this.paused) {\n this.paused = true\n this.emit('pause')\n }\n}\n\nGlob.prototype.resume = function () {\n if (this.paused) {\n this.emit('resume')\n this.paused = false\n if (this._emitQueue.length) {\n var eq = this._emitQueue.slice(0)\n this._emitQueue.length = 0\n for (var i = 0; i < eq.length; i ++) {\n var e = eq[i]\n this._emitMatch(e[0], e[1])\n }\n }\n if (this._processQueue.length) {\n var pq = this._processQueue.slice(0)\n this._processQueue.length = 0\n for (var i = 0; i < pq.length; i ++) {\n var p = pq[i]\n this._processing--\n this._process(p[0], p[1], p[2], p[3])\n }\n }\n }\n}\n\nGlob.prototype._process = function (pattern, index, inGlobStar, cb) {\n assert(this instanceof Glob)\n assert(typeof cb === 'function')\n\n if (this.aborted)\n return\n\n this._processing++\n if (this.paused) {\n this._processQueue.push([pattern, index, inGlobStar, cb])\n return\n }\n\n //console.error('PROCESS %d', this._processing, pattern)\n\n // Get the first [n] parts of pattern that are all strings.\n var n = 0\n while (typeof pattern[n] === 'string') {\n n ++\n }\n // now n is the index of the first one that is *not* a string.\n\n // see if there's anything else\n var prefix\n switch (n) {\n // if not, then this is rather simple\n case pattern.length:\n this._processSimple(pattern.join('/'), index, cb)\n return\n\n case 0:\n // pattern *starts* with some non-trivial item.\n // going to readdir(cwd), but not include the prefix in matches.\n prefix = null\n break\n\n default:\n // pattern has some string bits in the front.\n // whatever it starts with, whether that's 'absolute' like /foo/bar,\n // or 'relative' like '../baz'\n prefix = pattern.slice(0, n).join('/')\n break\n }\n\n var remain = pattern.slice(n)\n\n // get the list of entries.\n var read\n if (prefix === null)\n read = '.'\n else if (isAbsolute(prefix) ||\n isAbsolute(pattern.map(function (p) {\n return typeof p === 'string' ? p : '[*]'\n }).join('/'))) {\n if (!prefix || !isAbsolute(prefix))\n prefix = '/' + prefix\n read = prefix\n } else\n read = prefix\n\n var abs = this._makeAbs(read)\n\n //if ignored, skip _processing\n if (childrenIgnored(this, read))\n return cb()\n\n var isGlobStar = remain[0] === minimatch.GLOBSTAR\n if (isGlobStar)\n this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)\n else\n this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)\n}\n\nGlob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {\n var self = this\n this._readdir(abs, inGlobStar, function (er, entries) {\n return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)\n })\n}\n\nGlob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {\n\n // if the abs isn't a dir, then nothing can match!\n if (!entries)\n return cb()\n\n // It will only match dot entries if it starts with a dot, or if\n // dot is set. Stuff like @(.foo|.bar) isn't allowed.\n var pn = remain[0]\n var negate = !!this.minimatch.negate\n var rawGlob = pn._glob\n var dotOk = this.dot || rawGlob.charAt(0) === '.'\n\n var matchedEntries = []\n for (var i = 0; i < entries.length; i++) {\n var e = entries[i]\n if (e.charAt(0) !== '.' || dotOk) {\n var m\n if (negate && !prefix) {\n m = !e.match(pn)\n } else {\n m = e.match(pn)\n }\n if (m)\n matchedEntries.push(e)\n }\n }\n\n //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)\n\n var len = matchedEntries.length\n // If there are no matched entries, then nothing matches.\n if (len === 0)\n return cb()\n\n // if this is the last remaining pattern bit, then no need for\n // an additional stat *unless* the user has specified mark or\n // stat explicitly. We know they exist, since readdir returned\n // them.\n\n if (remain.length === 1 && !this.mark && !this.stat) {\n if (!this.matches[index])\n this.matches[index] = Object.create(null)\n\n for (var i = 0; i < len; i ++) {\n var e = matchedEntries[i]\n if (prefix) {\n if (prefix !== '/')\n e = prefix + '/' + e\n else\n e = prefix + e\n }\n\n if (e.charAt(0) === '/' && !this.nomount) {\n e = path.join(this.root, e)\n }\n this._emitMatch(index, e)\n }\n // This was the last one, and no stats were needed\n return cb()\n }\n\n // now test all matched entries as stand-ins for that part\n // of the pattern.\n remain.shift()\n for (var i = 0; i < len; i ++) {\n var e = matchedEntries[i]\n var newPattern\n if (prefix) {\n if (prefix !== '/')\n e = prefix + '/' + e\n else\n e = prefix + e\n }\n this._process([e].concat(remain), index, inGlobStar, cb)\n }\n cb()\n}\n\nGlob.prototype._emitMatch = function (index, e) {\n if (this.aborted)\n return\n\n if (isIgnored(this, e))\n return\n\n if (this.paused) {\n this._emitQueue.push([index, e])\n return\n }\n\n var abs = isAbsolute(e) ? e : this._makeAbs(e)\n\n if (this.mark)\n e = this._mark(e)\n\n if (this.absolute)\n e = abs\n\n if (this.matches[index][e])\n return\n\n if (this.nodir) {\n var c = this.cache[abs]\n if (c === 'DIR' || Array.isArray(c))\n return\n }\n\n this.matches[index][e] = true\n\n var st = this.statCache[abs]\n if (st)\n this.emit('stat', e, st)\n\n this.emit('match', e)\n}\n\nGlob.prototype._readdirInGlobStar = function (abs, cb) {\n if (this.aborted)\n return\n\n // follow all symlinked directories forever\n // just proceed as if this is a non-globstar situation\n if (this.follow)\n return this._readdir(abs, false, cb)\n\n var lstatkey = 'lstat\\0' + abs\n var self = this\n var lstatcb = inflight(lstatkey, lstatcb_)\n\n if (lstatcb)\n self.fs.lstat(abs, lstatcb)\n\n function lstatcb_ (er, lstat) {\n if (er && er.code === 'ENOENT')\n return cb()\n\n var isSym = lstat && lstat.isSymbolicLink()\n self.symlinks[abs] = isSym\n\n // If it's not a symlink or a dir, then it's definitely a regular file.\n // don't bother doing a readdir in that case.\n if (!isSym && lstat && !lstat.isDirectory()) {\n self.cache[abs] = 'FILE'\n cb()\n } else\n self._readdir(abs, false, cb)\n }\n}\n\nGlob.prototype._readdir = function (abs, inGlobStar, cb) {\n if (this.aborted)\n return\n\n cb = inflight('readdir\\0'+abs+'\\0'+inGlobStar, cb)\n if (!cb)\n return\n\n //console.error('RD %j %j', +inGlobStar, abs)\n if (inGlobStar && !ownProp(this.symlinks, abs))\n return this._readdirInGlobStar(abs, cb)\n\n if (ownProp(this.cache, abs)) {\n var c = this.cache[abs]\n if (!c || c === 'FILE')\n return cb()\n\n if (Array.isArray(c))\n return cb(null, c)\n }\n\n var self = this\n self.fs.readdir(abs, readdirCb(this, abs, cb))\n}\n\nfunction readdirCb (self, abs, cb) {\n return function (er, entries) {\n if (er)\n self._readdirError(abs, er, cb)\n else\n self._readdirEntries(abs, entries, cb)\n }\n}\n\nGlob.prototype._readdirEntries = function (abs, entries, cb) {\n if (this.aborted)\n return\n\n // if we haven't asked to stat everything, then just\n // assume that everything in there exists, so we can avoid\n // having to stat it a second time.\n if (!this.mark && !this.stat) {\n for (var i = 0; i < entries.length; i ++) {\n var e = entries[i]\n if (abs === '/')\n e = abs + e\n else\n e = abs + '/' + e\n this.cache[e] = true\n }\n }\n\n this.cache[abs] = entries\n return cb(null, entries)\n}\n\nGlob.prototype._readdirError = function (f, er, cb) {\n if (this.aborted)\n return\n\n // handle errors, and cache the information\n switch (er.code) {\n case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205\n case 'ENOTDIR': // totally normal. means it *does* exist.\n var abs = this._makeAbs(f)\n this.cache[abs] = 'FILE'\n if (abs === this.cwdAbs) {\n var error = new Error(er.code + ' invalid cwd ' + this.cwd)\n error.path = this.cwd\n error.code = er.code\n this.emit('error', error)\n this.abort()\n }\n break\n\n case 'ENOENT': // not terribly unusual\n case 'ELOOP':\n case 'ENAMETOOLONG':\n case 'UNKNOWN':\n this.cache[this._makeAbs(f)] = false\n break\n\n default: // some unusual error. Treat as failure.\n this.cache[this._makeAbs(f)] = false\n if (this.strict) {\n this.emit('error', er)\n // If the error is handled, then we abort\n // if not, we threw out of here\n this.abort()\n }\n if (!this.silent)\n console.error('glob error', er)\n break\n }\n\n return cb()\n}\n\nGlob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {\n var self = this\n this._readdir(abs, inGlobStar, function (er, entries) {\n self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)\n })\n}\n\n\nGlob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {\n //console.error('pgs2', prefix, remain[0], entries)\n\n // no entries means not a dir, so it can never have matches\n // foo.txt/** doesn't match foo.txt\n if (!entries)\n return cb()\n\n // test without the globstar, and with every child both below\n // and replacing the globstar.\n var remainWithoutGlobStar = remain.slice(1)\n var gspref = prefix ? [ prefix ] : []\n var noGlobStar = gspref.concat(remainWithoutGlobStar)\n\n // the noGlobStar pattern exits the inGlobStar state\n this._process(noGlobStar, index, false, cb)\n\n var isSym = this.symlinks[abs]\n var len = entries.length\n\n // If it's a symlink, and we're in a globstar, then stop\n if (isSym && inGlobStar)\n return cb()\n\n for (var i = 0; i < len; i++) {\n var e = entries[i]\n if (e.charAt(0) === '.' && !this.dot)\n continue\n\n // these two cases enter the inGlobStar state\n var instead = gspref.concat(entries[i], remainWithoutGlobStar)\n this._process(instead, index, true, cb)\n\n var below = gspref.concat(entries[i], remain)\n this._process(below, index, true, cb)\n }\n\n cb()\n}\n\nGlob.prototype._processSimple = function (prefix, index, cb) {\n // XXX review this. Shouldn't it be doing the mounting etc\n // before doing stat? kinda weird?\n var self = this\n this._stat(prefix, function (er, exists) {\n self._processSimple2(prefix, index, er, exists, cb)\n })\n}\nGlob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {\n\n //console.error('ps2', prefix, exists)\n\n if (!this.matches[index])\n this.matches[index] = Object.create(null)\n\n // If it doesn't exist, then just mark the lack of results\n if (!exists)\n return cb()\n\n if (prefix && isAbsolute(prefix) && !this.nomount) {\n var trail = /[\\/\\\\]$/.test(prefix)\n if (prefix.charAt(0) === '/') {\n prefix = path.join(this.root, prefix)\n } else {\n prefix = path.resolve(this.root, prefix)\n if (trail)\n prefix += '/'\n }\n }\n\n if (process.platform === 'win32')\n prefix = prefix.replace(/\\\\/g, '/')\n\n // Mark this as a match\n this._emitMatch(index, prefix)\n cb()\n}\n\n// Returns either 'DIR', 'FILE', or false\nGlob.prototype._stat = function (f, cb) {\n var abs = this._makeAbs(f)\n var needDir = f.slice(-1) === '/'\n\n if (f.length > this.maxLength)\n return cb()\n\n if (!this.stat && ownProp(this.cache, abs)) {\n var c = this.cache[abs]\n\n if (Array.isArray(c))\n c = 'DIR'\n\n // It exists, but maybe not how we need it\n if (!needDir || c === 'DIR')\n return cb(null, c)\n\n if (needDir && c === 'FILE')\n return cb()\n\n // otherwise we have to stat, because maybe c=true\n // if we know it exists, but not what it is.\n }\n\n var exists\n var stat = this.statCache[abs]\n if (stat !== undefined) {\n if (stat === false)\n return cb(null, stat)\n else {\n var type = stat.isDirectory() ? 'DIR' : 'FILE'\n if (needDir && type === 'FILE')\n return cb()\n else\n return cb(null, type, stat)\n }\n }\n\n var self = this\n var statcb = inflight('stat\\0' + abs, lstatcb_)\n if (statcb)\n self.fs.lstat(abs, statcb)\n\n function lstatcb_ (er, lstat) {\n if (lstat && lstat.isSymbolicLink()) {\n // If it's a symlink, then treat it as the target, unless\n // the target does not exist, then treat it as a file.\n return self.fs.stat(abs, function (er, stat) {\n if (er)\n self._stat2(f, abs, null, lstat, cb)\n else\n self._stat2(f, abs, er, stat, cb)\n })\n } else {\n self._stat2(f, abs, er, lstat, cb)\n }\n }\n}\n\nGlob.prototype._stat2 = function (f, abs, er, stat, cb) {\n if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {\n this.statCache[abs] = false\n return cb()\n }\n\n var needDir = f.slice(-1) === '/'\n this.statCache[abs] = stat\n\n if (abs.slice(-1) === '/' && stat && !stat.isDirectory())\n return cb(null, false, stat)\n\n var c = true\n if (stat)\n c = stat.isDirectory() ? 'DIR' : 'FILE'\n this.cache[abs] = this.cache[abs] || c\n\n if (needDir && c === 'FILE')\n return cb()\n\n return cb(null, c, stat)\n}\n", "/*!\n * Stylus - Selector Parser\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\nvar COMBINATORS = ['>', '+', '~'];\n\n/**\n * Initialize a new `SelectorParser`\n * with the given `str` and selectors `stack`.\n *\n * @param {String} str\n * @param {Array} stack\n * @param {Array} parts\n * @api private\n */\n\nvar SelectorParser = module.exports = function SelectorParser(str, stack, parts) {\n this.str = str;\n this.stack = stack || [];\n this.parts = parts || [];\n this.pos = 0;\n this.level = 2;\n this.nested = true;\n this.ignore = false;\n};\n\n/**\n * Consume the given `len` and move current position.\n *\n * @param {Number} len\n * @api private\n */\n\nSelectorParser.prototype.skip = function(len) {\n this.str = this.str.substr(len);\n this.pos += len;\n};\n\n/**\n * Consume spaces.\n */\n\nSelectorParser.prototype.skipSpaces = function() {\n while (' ' == this.str[0]) this.skip(1);\n};\n\n/**\n * Fetch next token.\n *\n * @return {String}\n * @api private\n */\n\nSelectorParser.prototype.advance = function() {\n return this.root()\n || this.relative()\n || this.initial()\n || this.escaped()\n || this.parent()\n || this.partial()\n || this.char();\n};\n\n/**\n * '/'\n */\n\nSelectorParser.prototype.root = function() {\n if (!this.pos && '/' == this.str[0]\n && 'deep' != this.str.slice(1, 5)) {\n this.nested = false;\n this.skip(1);\n }\n};\n\n/**\n * '../'\n */\n\nSelectorParser.prototype.relative = function(multi) {\n if ((!this.pos || multi) && '../' == this.str.slice(0, 3)) {\n this.nested = false;\n this.skip(3);\n while (this.relative(true)) this.level++;\n if (!this.raw) {\n var ret = this.stack[this.stack.length - this.level];\n if (ret) {\n return ret;\n } else {\n this.ignore = true;\n }\n }\n }\n};\n\n/**\n * '~/'\n */\n\nSelectorParser.prototype.initial = function() {\n if (!this.pos && '~' == this.str[0] && '/' == this.str[1]) {\n this.nested = false;\n this.skip(2);\n return this.stack[0];\n }\n};\n\n/**\n * '\\' ('&' | '^')\n */\n\nSelectorParser.prototype.escaped = function() {\n if ('\\\\' == this.str[0]) {\n var char = this.str[1];\n if ('&' == char || '^' == char) {\n this.skip(2);\n return char;\n }\n }\n};\n\n/**\n * '&'\n */\n\nSelectorParser.prototype.parent = function() {\n if ('&' == this.str[0]) {\n this.nested = false;\n\n if (!this.pos && (!this.stack.length || this.raw)) {\n var i = 0;\n while (' ' == this.str[++i]) ;\n if (~COMBINATORS.indexOf(this.str[i])) {\n this.skip(i + 1);\n return;\n }\n }\n\n this.skip(1);\n if (!this.raw)\n return this.stack[this.stack.length - 1];\n }\n};\n\n/**\n * '^[' range ']'\n */\n\nSelectorParser.prototype.partial = function() {\n if ('^' == this.str[0] && '[' == this.str[1]) {\n this.skip(2);\n this.skipSpaces();\n var ret = this.range();\n this.skipSpaces();\n if (']' != this.str[0]) return '^[';\n this.nested = false;\n this.skip(1);\n if (ret) {\n return ret;\n } else {\n this.ignore = true;\n }\n }\n};\n\n/**\n * '-'? 0-9+\n */\n\nSelectorParser.prototype.number = function() {\n var i = 0, ret = '';\n if ('-' == this.str[i])\n ret += this.str[i++];\n\n while (this.str.charCodeAt(i) >= 48\n && this.str.charCodeAt(i) <= 57)\n ret += this.str[i++];\n\n if (ret) {\n this.skip(i);\n return Number(ret);\n }\n};\n\n/**\n * number ('..' number)?\n */\n\nSelectorParser.prototype.range = function() {\n var start = this.number()\n , ret;\n\n if ('..' == this.str.slice(0, 2)) {\n this.skip(2);\n var end = this.number()\n , len = this.parts.length;\n\n if (start < 0) start = len + start - 1;\n if (end < 0) end = len + end - 1;\n\n if (start > end) {\n var tmp = start;\n start = end;\n end = tmp;\n }\n\n if (end < len - 1) {\n ret = this.parts.slice(start, end + 1).map(function(part) {\n var selector = new SelectorParser(part, this.stack, this.parts);\n selector.raw = true;\n return selector.parse();\n }, this).map(function(selector) {\n return (selector.nested ? ' ' : '') + selector.val;\n }).join('').trim();\n }\n } else {\n ret = this.stack[\n start < 0 ? this.stack.length + start - 1 : start\n ];\n }\n\n if (ret) {\n return ret;\n } else {\n this.ignore = true;\n }\n};\n\n/**\n * .+\n */\n\nSelectorParser.prototype.char = function() {\n var char = this.str[0];\n this.skip(1);\n return char;\n};\n\n/**\n * Parses the selector.\n *\n * @return {Object}\n * @api private\n */\n\nSelectorParser.prototype.parse = function() {\n var val = '';\n while (this.str.length) {\n val += this.advance() || '';\n if (this.ignore) {\n val = '';\n break;\n }\n }\n return { val: val.trimRight(), nested: this.nested };\n};\n", "\n/*!\n * Stylus - utils\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar nodes = require('./nodes')\n , basename = require('path').basename\n , relative = require('path').relative\n , join = require('path').join\n , isAbsolute = require('path').isAbsolute\n , glob = require('glob')\n , fs = require('fs');\n\n/**\n * Check if `path` looks absolute.\n *\n * @param {String} path\n * @return {Boolean}\n * @api private\n */\n\nexports.absolute = isAbsolute || function(path){\n // On Windows the path could start with a drive letter, i.e. a:\\\\ or two leading backslashes.\n // Also on Windows, the path may have been normalized to forward slashes, so check for this too.\n return path.substr(0, 2) == '\\\\\\\\' || '/' === path.charAt(0) || /^[a-z]:[\\\\\\/]/i.test(path);\n};\n\n/**\n * Attempt to lookup `path` within `paths` from tail to head.\n * Optionally a path to `ignore` may be passed.\n *\n * @param {String} path\n * @param {String} paths\n * @param {String} ignore\n * @return {String}\n * @api private\n */\n\nexports.lookup = function(path, paths, ignore){\n var lookup\n , i = paths.length;\n\n // Absolute\n if (exports.absolute(path)) {\n try {\n fs.statSync(path);\n return path;\n } catch (err) {\n // Ignore, continue on\n // to trying relative lookup.\n // Needed for url(/images/foo.png)\n // for example\n }\n }\n\n // Relative\n while (i--) {\n try {\n lookup = join(paths[i], path);\n if (ignore == lookup) continue;\n fs.statSync(lookup);\n return lookup;\n } catch (err) {\n // Ignore\n }\n }\n};\n\n/**\n * Like `utils.lookup` but uses `glob` to find files.\n *\n * @param {String} path\n * @param {String} paths\n * @param {String} ignore\n * @return {Array}\n * @api private\n */\nexports.find = function(path, paths, ignore) {\n var lookup\n , found\n , i = paths.length;\n\n // Absolute\n if (exports.absolute(path)) {\n if ((found = glob.sync(path)).length) {\n return found;\n }\n }\n\n // Relative\n while (i--) {\n lookup = join(paths[i], path);\n if (ignore == lookup) continue;\n if ((found = glob.sync(lookup)).length) {\n return found;\n }\n }\n};\n\n/**\n * Lookup index file inside dir with given `name`.\n *\n * @param {String} name\n * @return {Array}\n * @api private\n */\n\nexports.lookupIndex = function(name, paths, filename){\n // foo/index.styl\n var found = exports.find(join(name, 'index.styl'), paths, filename);\n if (!found) {\n // foo/foo.styl\n found = exports.find(join(name, basename(name).replace(/\\.styl/i, '') + '.styl'), paths, filename);\n }\n if (!found && !~name.indexOf('node_modules')) {\n // node_modules/foo/.. or node_modules/foo.styl/..\n found = lookupPackage(join('node_modules', name));\n }\n return found;\n\n function lookupPackage(dir) {\n var pkg = exports.lookup(join(dir, 'package.json'), paths, filename);\n if (!pkg) {\n return /\\.styl$/i.test(dir) ? exports.lookupIndex(dir, paths, filename) : lookupPackage(dir + '.styl');\n }\n var main = require(relative(__dirname, pkg)).main;\n if (main) {\n found = exports.find(join(dir, main), paths, filename);\n } else {\n found = exports.lookupIndex(dir, paths, filename);\n }\n return found;\n }\n};\n\n/**\n * Format the given `err` with the given `options`.\n *\n * Options:\n *\n * - `filename` context filename\n * - `context` context line count [8]\n * - `lineno` context line number\n * - `column` context column number\n * - `input` input string\n *\n * @param {Error} err\n * @param {Object} options\n * @return {Error}\n * @api private\n */\n\nexports.formatException = function(err, options){\n var lineno = options.lineno\n , column = options.column\n , filename = options.filename\n , str = options.input\n , context = options.context || 8\n , context = context / 2\n , lines = ('\\n' + str).split('\\n')\n , start = Math.max(lineno - context, 1)\n , end = Math.min(lines.length, lineno + context)\n , pad = end.toString().length;\n\n var context = lines.slice(start, end).map(function(line, i){\n var curr = i + start;\n return ' '\n + Array(pad - curr.toString().length + 1).join(' ')\n + curr\n + '| '\n + line\n + (curr == lineno\n ? '\\n' + Array(curr.toString().length + 5 + column).join('-') + '^'\n : '');\n }).join('\\n');\n\n err.message = filename\n + ':' + lineno\n + ':' + column\n + '\\n' + context\n + '\\n\\n' + err.message + '\\n'\n + (err.stylusStack ? err.stylusStack + '\\n' : '');\n\n // Don't show JS stack trace for Stylus errors\n if (err.fromStylus) err.stack = 'Error: ' + err.message;\n\n return err;\n};\n\n/**\n * Assert that `node` is of the given `type`, or throw.\n *\n * @param {Node} node\n * @param {Function} type\n * @param {String} param\n * @api public\n */\n\nexports.assertType = function(node, type, param){\n exports.assertPresent(node, param);\n if (node.nodeName == type) return;\n var actual = node.nodeName\n , msg = 'expected '\n + (param ? '\"' + param + '\" to be a ' : '')\n + type + ', but got '\n + actual + ':' + node;\n throw new Error('TypeError: ' + msg);\n};\n\n/**\n * Assert that `node` is a `String` or `Ident`.\n *\n * @param {Node} node\n * @param {String} param\n * @api public\n */\n\nexports.assertString = function(node, param){\n exports.assertPresent(node, param);\n switch (node.nodeName) {\n case 'string':\n case 'ident':\n case 'literal':\n return;\n default:\n var actual = node.nodeName\n , msg = 'expected string, ident or literal, but got ' + actual + ':' + node;\n throw new Error('TypeError: ' + msg);\n }\n};\n\n/**\n * Assert that `node` is a `RGBA` or `HSLA`.\n *\n * @param {Node} node\n * @param {String} param\n * @api public\n */\n\nexports.assertColor = function(node, param){\n exports.assertPresent(node, param);\n switch (node.nodeName) {\n case 'rgba':\n case 'hsla':\n return;\n default:\n var actual = node.nodeName\n , msg = 'expected rgba or hsla, but got ' + actual + ':' + node;\n throw new Error('TypeError: ' + msg);\n }\n};\n\n/**\n * Assert that param `name` is given, aka the `node` is passed.\n *\n * @param {Node} node\n * @param {String} name\n * @api public\n */\n\nexports.assertPresent = function(node, name){\n if (node) return;\n if (name) throw new Error('\"' + name + '\" argument required');\n throw new Error('argument missing');\n};\n\n/**\n * Unwrap `expr`.\n *\n * Takes an expressions with length of 1\n * such as `((1 2 3))` and unwraps it to `(1 2 3)`.\n *\n * @param {Expression} expr\n * @return {Node}\n * @api public\n */\n\nexports.unwrap = function(expr){\n // explicitly preserve the expression\n if (expr.preserve) return expr;\n if ('arguments' != expr.nodeName && 'expression' != expr.nodeName) return expr;\n if (1 != expr.nodes.length) return expr;\n if ('arguments' != expr.nodes[0].nodeName && 'expression' != expr.nodes[0].nodeName) return expr;\n return exports.unwrap(expr.nodes[0]);\n};\n\n/**\n * Coerce JavaScript values to their Stylus equivalents.\n *\n * @param {Mixed} val\n * @param {Boolean} [raw]\n * @return {Node}\n * @api public\n */\n\nexports.coerce = function(val, raw){\n switch (typeof val) {\n case 'function':\n return val;\n case 'string':\n return new nodes.String(val);\n case 'boolean':\n return new nodes.Boolean(val);\n case 'number':\n return new nodes.Unit(val);\n default:\n if (null == val) return nodes.null;\n if (Array.isArray(val)) return exports.coerceArray(val, raw);\n if (val.nodeName) return val;\n return exports.coerceObject(val, raw);\n }\n};\n\n/**\n * Coerce a javascript `Array` to a Stylus `Expression`.\n *\n * @param {Array} val\n * @param {Boolean} [raw]\n * @return {Expression}\n * @api private\n */\n\nexports.coerceArray = function(val, raw){\n var expr = new nodes.Expression;\n val.forEach(function(val){\n expr.push(exports.coerce(val, raw));\n });\n return expr;\n};\n\n/**\n * Coerce a javascript object to a Stylus `Expression` or `Object`.\n *\n * For example `{ foo: 'bar', bar: 'baz' }` would become\n * the expression `(foo 'bar') (bar 'baz')`. If `raw` is true\n * given `obj` would become a Stylus hash object.\n *\n * @param {Object} obj\n * @param {Boolean} [raw]\n * @return {Expression|Object}\n * @api public\n */\n\nexports.coerceObject = function(obj, raw){\n var node = raw ? new nodes.Object : new nodes.Expression\n , val;\n\n for (var key in obj) {\n val = exports.coerce(obj[key], raw);\n key = new nodes.Ident(key);\n if (raw) {\n node.set(key, val);\n } else {\n node.push(exports.coerceArray([key, val]));\n }\n }\n\n return node;\n};\n\n/**\n * Return param names for `fn`.\n *\n * @param {Function} fn\n * @return {Array}\n * @api private\n */\n\nexports.params = function(fn){\n return fn\n .toString()\n .match(/\\(([^)]*)\\)/)[1].split(/ *, */);\n};\n\n/**\n * Merge object `b` with `a`.\n *\n * @param {Object} a\n * @param {Object} b\n * @param {Boolean} [deep]\n * @return {Object} a\n * @api private\n */\nexports.merge = function(a, b, deep) {\n for (var k in b) {\n if (deep && a[k]) {\n var nodeA = exports.unwrap(a[k]).first\n , nodeB = exports.unwrap(b[k]).first;\n\n if ('object' == nodeA.nodeName && 'object' == nodeB.nodeName) {\n a[k].first.vals = exports.merge(nodeA.vals, nodeB.vals, deep);\n } else {\n a[k] = b[k];\n }\n } else {\n a[k] = b[k];\n }\n }\n return a;\n};\n\n/**\n * Returns an array with unique values.\n *\n * @param {Array} arr\n * @return {Array}\n * @api private\n */\n\nexports.uniq = function(arr){\n var obj = {}\n , ret = [];\n\n for (var i = 0, len = arr.length; i < len; ++i) {\n if (arr[i] in obj) continue;\n\n obj[arr[i]] = true;\n ret.push(arr[i]);\n }\n return ret;\n};\n\n/**\n * Compile selector strings in `arr` from the bottom-up\n * to produce the selector combinations. For example\n * the following Stylus:\n *\n * ul\n * li\n * p\n * a\n * color: red\n *\n * Would return:\n *\n * [ 'ul li a', 'ul p a' ]\n *\n * @param {Array} arr\n * @param {Boolean} leaveHidden\n * @return {Array}\n * @api private\n */\n\nexports.compileSelectors = function(arr, leaveHidden){\n var selectors = []\n , Parser = require('./selector-parser')\n , indent = (this.indent || '')\n , buf = [];\n\n function parse(selector, buf) {\n var parts = [selector.val]\n , str = new Parser(parts[0], parents, parts).parse().val\n , parents = [];\n\n if (buf.length) {\n for (var i = 0, len = buf.length; i < len; ++i) {\n parts.push(buf[i]);\n parents.push(str);\n var child = new Parser(buf[i], parents, parts).parse();\n\n if (child.nested) {\n str += ' ' + child.val;\n } else {\n str = child.val;\n }\n }\n }\n return str.trim();\n }\n\n function compile(arr, i) {\n if (i) {\n arr[i].forEach(function(selector){\n if (!leaveHidden && selector.isPlaceholder) return;\n if (selector.inherits) {\n buf.unshift(selector.val);\n compile(arr, i - 1);\n buf.shift();\n } else {\n selectors.push(indent + parse(selector, buf));\n }\n });\n } else {\n arr[0].forEach(function(selector){\n if (!leaveHidden && selector.isPlaceholder) return;\n var str = parse(selector, buf);\n if (str) selectors.push(indent + str);\n });\n }\n }\n\n compile(arr, arr.length - 1);\n\n // Return the list with unique selectors only\n return exports.uniq(selectors);\n};\n\n/**\n * Attempt to parse string.\n *\n * @param {String} str\n * @return {Node}\n * @api private\n */\n\nexports.parseString = function(str){\n var Parser = require('./parser')\n , parser\n , ret;\n\n try {\n parser = new Parser(str);\n ret = parser.list();\n } catch (e) {\n ret = new nodes.Literal(str);\n }\n return ret;\n};\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Add property `name` with the given `expr`\n * to the mixin-able block.\n *\n * @param {String|Ident|Literal} name\n * @param {Expression} expr\n * @return {Property}\n * @api public\n */\n\n(module.exports = function addProperty(name, expr){\n utils.assertType(name, 'expression', 'name');\n name = utils.unwrap(name).first;\n utils.assertString(name, 'name');\n utils.assertType(expr, 'expression', 'expr');\n var prop = new nodes.Property([name], expr);\n var block = this.closestBlock;\n\n var len = block.nodes.length\n , head = block.nodes.slice(0, block.index)\n , tail = block.nodes.slice(block.index++, len);\n head.push(prop);\n block.nodes = head.concat(tail);\n\n return prop;\n}).raw = true;\n", "var utils = require('../utils');\n\n/**\n * Adjust HSL `color` `prop` by `amount`.\n *\n * @param {RGBA|HSLA} color\n * @param {String} prop\n * @param {Unit} amount\n * @return {RGBA}\n * @api private\n */\n\nfunction adjust(color, prop, amount){\n utils.assertColor(color, 'color');\n utils.assertString(prop, 'prop');\n utils.assertType(amount, 'unit', 'amount');\n var hsl = color.hsla.clone();\n prop = { hue: 'h', saturation: 's', lightness: 'l' }[prop.string];\n if (!prop) throw new Error('invalid adjustment property');\n var val = amount.val;\n if ('%' == amount.type){\n val = 'l' == prop && val > 0\n ? (100 - hsl[prop]) * val / 100\n : hsl[prop] * (val / 100);\n }\n hsl[prop] += val;\n return hsl.rgba;\n};\nadjust.params = ['color', 'prop', 'amount'];\nmodule.exports = adjust;\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Return a `RGBA` from the r,g,b,a channels.\n *\n * Examples:\n *\n * rgba(255,0,0,0.5)\n * // => rgba(255,0,0,0.5)\n *\n * rgba(255,0,0,1)\n * // => #ff0000\n *\n * rgba(#ffcc00, 50%)\n * // rgba(255,204,0,0.5)\n *\n * @param {Unit|RGBA|HSLA} red\n * @param {Unit} green\n * @param {Unit} blue\n * @param {Unit} alpha\n * @return {RGBA}\n * @api public\n */\n\nfunction rgba(red, green, blue, alpha){\n switch (arguments.length) {\n case 1:\n utils.assertColor(red);\n return red.rgba;\n case 2:\n utils.assertColor(red);\n var color = red.rgba;\n utils.assertType(green, 'unit', 'alpha');\n alpha = green.clone();\n if ('%' == alpha.type) alpha.val /= 100;\n return new nodes.RGBA(\n color.r\n , color.g\n , color.b\n , alpha.val);\n default:\n utils.assertType(red, 'unit', 'red');\n utils.assertType(green, 'unit', 'green');\n utils.assertType(blue, 'unit', 'blue');\n utils.assertType(alpha, 'unit', 'alpha');\n var r = '%' == red.type ? Math.round(red.val * 2.55) : red.val\n , g = '%' == green.type ? Math.round(green.val * 2.55) : green.val\n , b = '%' == blue.type ? Math.round(blue.val * 2.55) : blue.val;\n\n alpha = alpha.clone();\n if (alpha && '%' == alpha.type) alpha.val /= 100;\n return new nodes.RGBA(\n r\n , g\n , b\n , alpha.val);\n }\n}\nrgba.params = ['red', 'green', 'blue', 'alpha'];\nmodule.exports = rgba;\n", "var nodes = require('../nodes')\n , rgba = require('./rgba');\n\n/**\n * Return the alpha component of the given `color`,\n * or set the alpha component to the optional second `value` argument.\n *\n * Examples:\n *\n * alpha(#fff)\n * // => 1\n *\n * alpha(rgba(0,0,0,0.3))\n * // => 0.3\n *\n * alpha(#fff, 0.5)\n * // => rgba(255,255,255,0.5)\n *\n * @param {RGBA|HSLA} color\n * @param {Unit} [value]\n * @return {Unit|RGBA}\n * @api public\n */\n\nfunction alpha(color, value){\n color = color.rgba;\n if (value) {\n return rgba(\n new nodes.Unit(color.r),\n new nodes.Unit(color.g),\n new nodes.Unit(color.b),\n value\n );\n }\n return new nodes.Unit(color.a, '');\n};\nalpha.params = ['color', 'value'];\nmodule.exports = alpha;\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Return a `Literal` `num` converted to the provided `base`, padded to `width`\n * with zeroes (default width is 2)\n *\n * @param {Number} num\n * @param {Number} base\n * @param {Number} width\n * @return {Literal}\n * @api public\n */\n\n(module.exports = function(num, base, width) {\n utils.assertPresent(num, 'number');\n utils.assertPresent(base, 'base');\n num = utils.unwrap(num).nodes[0].val;\n base = utils.unwrap(base).nodes[0].val;\n width = (width && utils.unwrap(width).nodes[0].val) || 2;\n var result = Number(num).toString(base);\n while (result.length < width) {\n result = '0' + result;\n }\n return new nodes.Literal(result);\n}).raw = true;\n", "var utils = require('../utils')\n , path = require('path');\n\n/**\n * Return the basename of `path`.\n *\n * @param {String} path\n * @return {String}\n * @api public\n */\n\nfunction basename(p, ext){\n utils.assertString(p, 'path');\n return path.basename(p.val, ext && ext.val);\n};\nbasename.params = ['p', 'ext'];\nmodule.exports = basename;\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Blend the `top` color over the `bottom`\n *\n * Examples:\n *\n * blend(rgba(#FFF, 0.5), #000)\n * // => #808080\n * \n * blend(rgba(#FFDE00,.42), #19C261)\n * // => #7ace38\n * \n * blend(rgba(lime, 0.5), rgba(red, 0.25))\n * // => rgba(128,128,0,0.625)\n *\n * @param {RGBA|HSLA} top\n * @param {RGBA|HSLA} [bottom=#fff]\n * @return {RGBA}\n * @api public\n */\n\nfunction blend(top, bottom){\n // TODO: different blend modes like overlay etc.\n utils.assertColor(top);\n top = top.rgba;\n bottom = bottom || new nodes.RGBA(255, 255, 255, 1);\n utils.assertColor(bottom);\n bottom = bottom.rgba;\n\n return new nodes.RGBA(\n top.r * top.a + bottom.r * (1 - top.a),\n top.g * top.a + bottom.g * (1 - top.a),\n top.b * top.a + bottom.b * (1 - top.a),\n top.a + bottom.a - top.a * bottom.a);\n};\nblend.params = ['top', 'bottom'];\nmodule.exports = blend;\n", "var nodes = require('../nodes')\n , rgba = require('./rgba');\n\n/**\n * Return the blue component of the given `color`,\n * or set the blue component to the optional second `value` argument.\n *\n * Examples:\n *\n * blue(#00c)\n * // => 204\n *\n * blue(#000, 255)\n * // => #00f\n *\n * @param {RGBA|HSLA} color\n * @param {Unit} [value]\n * @return {Unit|RGBA}\n * @api public\n */\n\nfunction blue(color, value){\n color = color.rgba;\n if (value) {\n return rgba(\n new nodes.Unit(color.r),\n new nodes.Unit(color.g),\n value,\n new nodes.Unit(color.a)\n );\n }\n return new nodes.Unit(color.b, '');\n};\nblue.params = ['color', 'value'];\nmodule.exports = blue;\n", "var utils = require('../utils');\n\n/**\n * Return a clone of the given `expr`.\n *\n * @param {Expression} expr\n * @return {Node}\n * @api public\n */\n\n(module.exports = function clone(expr){\n utils.assertPresent(expr, 'expr');\n return expr.clone();\n}).raw = true;\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Color component name map.\n */\n\nvar componentMap = {\n red: 'r'\n , green: 'g'\n , blue: 'b'\n , alpha: 'a'\n , hue: 'h'\n , saturation: 's'\n , lightness: 'l'\n};\n\n/**\n * Color component unit type map.\n */\n\nvar unitMap = {\n hue: 'deg'\n , saturation: '%'\n , lightness: '%'\n};\n\n/**\n * Color type map.\n */\n\nvar typeMap = {\n red: 'rgba'\n , blue: 'rgba'\n , green: 'rgba'\n , alpha: 'rgba'\n , hue: 'hsla'\n , saturation: 'hsla'\n , lightness: 'hsla'\n};\n\n/**\n * Return component `name` for the given `color`.\n *\n * @param {RGBA|HSLA} color\n * @param {String} name\n * @return {Unit}\n * @api public\n */\n\nfunction component(color, name) {\n utils.assertColor(color, 'color');\n utils.assertString(name, 'name');\n var name = name.string\n , unit = unitMap[name]\n , type = typeMap[name]\n , name = componentMap[name];\n if (!name) throw new Error('invalid color component \"' + name + '\"');\n return new nodes.Unit(color[type][name], unit);\n};\ncomponent.params = ['color', 'name'];\nmodule.exports = component;\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Returns the relative luminance of the given `color`,\n * see http://www.w3.org/TR/WCAG20/#relativeluminancedef\n *\n * Examples:\n *\n * luminosity(white)\n * // => 1\n * \n * luminosity(#000)\n * // => 0\n * \n * luminosity(red)\n * // => 0.2126\n *\n * @param {RGBA|HSLA} color\n * @return {Unit}\n * @api public\n */\n\nfunction luminosity(color){\n utils.assertColor(color);\n color = color.rgba;\n function processChannel(channel) {\n channel = channel / 255;\n return (0.03928 > channel)\n ? channel / 12.92\n : Math.pow(((channel + 0.055) / 1.055), 2.4);\n }\n return new nodes.Unit(\n 0.2126 * processChannel(color.r)\n + 0.7152 * processChannel(color.g)\n + 0.0722 * processChannel(color.b)\n );\n};\nluminosity.params = ['color'];\nmodule.exports = luminosity;\n", "var utils = require('../utils')\n , nodes = require('../nodes')\n , blend = require('./blend')\n , luminosity = require('./luminosity');\n\n/**\n * Returns the contrast ratio object between `top` and `bottom` colors,\n * based on http://leaverou.github.io/contrast-ratio/\n * and https://github.com/LeaVerou/contrast-ratio/blob/gh-pages/color.js#L108\n *\n * Examples:\n *\n * contrast(#000, #fff).ratio\n * => 21\n *\n * contrast(#000, rgba(#FFF, 0.5))\n * => { \"ratio\": \"13.15;\", \"error\": \"7.85\", \"min\": \"5.3\", \"max\": \"21\" }\n *\n * @param {RGBA|HSLA} top\n * @param {RGBA|HSLA} [bottom=#fff]\n * @return {Object}\n * @api public\n */\n\nfunction contrast(top, bottom){\n if ('rgba' != top.nodeName && 'hsla' != top.nodeName) {\n return new nodes.Literal('contrast(' + (top.isNull ? '' : top.toString()) + ')');\n }\n var result = new nodes.Object();\n top = top.rgba;\n bottom = bottom || new nodes.RGBA(255, 255, 255, 1);\n utils.assertColor(bottom);\n bottom = bottom.rgba;\n function contrast(top, bottom) {\n if (1 > top.a) {\n top = blend(top, bottom);\n }\n var l1 = luminosity(bottom).val + 0.05\n , l2 = luminosity(top).val + 0.05\n , ratio = l1 / l2;\n\n if (l2 > l1) {\n ratio = 1 / ratio;\n }\n return Math.round(ratio * 10) / 10;\n }\n\n if (1 <= bottom.a) {\n var resultRatio = new nodes.Unit(contrast(top, bottom));\n result.set('ratio', resultRatio);\n result.set('error', new nodes.Unit(0));\n result.set('min', resultRatio);\n result.set('max', resultRatio);\n } else {\n var onBlack = contrast(top, blend(bottom, new nodes.RGBA(0, 0, 0, 1)))\n , onWhite = contrast(top, blend(bottom, new nodes.RGBA(255, 255, 255, 1)))\n , max = Math.max(onBlack, onWhite);\n function processChannel(topChannel, bottomChannel) {\n return Math.min(Math.max(0, (topChannel - bottomChannel * bottom.a) / (1 - bottom.a)), 255);\n }\n var closest = new nodes.RGBA(\n processChannel(top.r, bottom.r),\n processChannel(top.g, bottom.g),\n processChannel(top.b, bottom.b),\n 1\n );\n var min = contrast(top, blend(bottom, closest));\n\n result.set('ratio', new nodes.Unit(Math.round((min + max) * 50) / 100));\n result.set('error', new nodes.Unit(Math.round((max - min) * 50) / 100));\n result.set('min', new nodes.Unit(min));\n result.set('max', new nodes.Unit(max));\n }\n return result;\n}\ncontrast.params = ['top', 'bottom'];\nmodule.exports = contrast;\n", "var utils = require('../utils');\n\n/**\n * Like `unquote` but tries to convert\n * the given `str` to a Stylus node.\n *\n * @param {String} str\n * @return {Node}\n * @api public\n */\n\nfunction convert(str){\n utils.assertString(str, 'str');\n return utils.parseString(str.string);\n};\nconvert.params = ['str'];\nmodule.exports = convert;\n", "var nodes = require('../nodes');\n\n/**\n * Returns the @media string for the current block\n *\n * @return {String}\n * @api public\n */\n\nmodule.exports = function currentMedia(){\n var self = this;\n return new nodes.String(lookForMedia(this.closestBlock.node) || '');\n\n function lookForMedia(node){\n if ('media' == node.nodeName) {\n node.val = self.visit(node.val);\n return node.toString();\n } else if (node.block.parent.node) {\n return lookForMedia(node.block.parent.node);\n }\n }\n};\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Set a variable `name` on current scope.\n *\n * @param {String} name\n * @param {Expression} expr\n * @param {Boolean} [global]\n * @api public\n */\n\nfunction define(name, expr, global){\n utils.assertType(name, 'string', 'name');\n expr = utils.unwrap(expr);\n var scope = this.currentScope;\n if (global && global.toBoolean().isTrue) {\n scope = this.global.scope;\n }\n var node = new nodes.Ident(name.val, expr);\n scope.add(node);\n return nodes.null;\n};\ndefine.params = ['name', 'expr', 'global'];\nmodule.exports = define;\n", "var utils = require('../utils')\n , path = require('path');\n\n/**\n * Return the dirname of `path`.\n *\n * @param {String} path\n * @return {String}\n * @api public\n */\n\nfunction dirname(p){\n utils.assertString(p, 'path');\n return path.dirname(p.val).replace(/\\\\/g, '/');\n};\ndirname.params = ['p'];\nmodule.exports = dirname;\n", "var utils = require('../utils');\n\n/**\n * Throw an error with the given `msg`.\n *\n * @param {String} msg\n * @api public\n */\n\nfunction error(msg){\n utils.assertType(msg, 'string', 'msg');\n var err = new Error(msg.val);\n err.fromStylus = true;\n throw err;\n};\nerror.params = ['msg'];\nmodule.exports = error;\n", "var utils = require('../utils')\n , path = require('path');\n\n/**\n * Return the extname of `path`.\n *\n * @param {String} path\n * @return {String}\n * @api public\n */\n\nfunction extname(p){\n utils.assertString(p, 'path');\n return path.extname(p.val);\n};\nextname.params = ['p'];\nmodule.exports = extname;\n", "var nodes = require('../nodes')\n , rgba = require('./rgba');\n\n/**\n * Return the green component of the given `color`,\n * or set the green component to the optional second `value` argument.\n *\n * Examples:\n *\n * green(#0c0)\n * // => 204\n *\n * green(#000, 255)\n * // => #0f0\n *\n * @param {RGBA|HSLA} color\n * @param {Unit} [value]\n * @return {Unit|RGBA}\n * @api public\n */\n\nfunction green(color, value){\n color = color.rgba;\n if (value) {\n return rgba(\n new nodes.Unit(color.r),\n value,\n new nodes.Unit(color.b),\n new nodes.Unit(color.a)\n );\n }\n return new nodes.Unit(color.g, '');\n};\ngreen.params = ['color', 'value'];\nmodule.exports = green;\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Convert the given `color` to an `HSLA` node,\n * or h,s,l,a component values.\n *\n * Examples:\n *\n * hsla(10deg, 50%, 30%, 0.5)\n * // => HSLA\n *\n * hsla(#ffcc00)\n * // => HSLA\n *\n * @param {RGBA|HSLA|Unit} hue\n * @param {Unit} saturation\n * @param {Unit} lightness\n * @param {Unit} alpha\n * @return {HSLA}\n * @api public\n */\n\nfunction hsla(hue, saturation, lightness, alpha){\n switch (arguments.length) {\n case 1:\n utils.assertColor(hue);\n return hue.hsla;\n case 2:\n utils.assertColor(hue);\n var color = hue.hsla;\n utils.assertType(saturation, 'unit', 'alpha');\n var alpha = saturation.clone();\n if ('%' == alpha.type) alpha.val /= 100;\n return new nodes.HSLA(\n color.h\n , color.s\n , color.l\n , alpha.val);\n default:\n utils.assertType(hue, 'unit', 'hue');\n utils.assertType(saturation, 'unit', 'saturation');\n utils.assertType(lightness, 'unit', 'lightness');\n utils.assertType(alpha, 'unit', 'alpha');\n var alpha = alpha.clone();\n if (alpha && '%' == alpha.type) alpha.val /= 100;\n return new nodes.HSLA(\n hue.val\n , saturation.val\n , lightness.val\n , alpha.val);\n }\n};\nhsla.params = ['hue', 'saturation', 'lightness', 'alpha'];\nmodule.exports = hsla;\n", "var utils = require('../utils')\n , nodes = require('../nodes')\n , hsla = require('./hsla');\n\n/**\n * Convert the given `color` to an `HSLA` node,\n * or h,s,l component values.\n *\n * Examples:\n *\n * hsl(10, 50, 30)\n * // => HSLA\n *\n * hsl(#ffcc00)\n * // => HSLA\n *\n * @param {Unit|HSLA|RGBA} hue\n * @param {Unit} saturation\n * @param {Unit} lightness\n * @return {HSLA}\n * @api public\n */\n\nfunction hsl(hue, saturation, lightness){\n if (1 == arguments.length) {\n utils.assertColor(hue, 'color');\n return hue.hsla;\n } else {\n return hsla(\n hue\n , saturation\n , lightness\n , new nodes.Unit(1));\n }\n};\nhsl.params = ['hue', 'saturation', 'lightness'];\nmodule.exports = hsl;\n", "var nodes = require('../nodes')\n , hsla = require('./hsla')\n , component = require('./component');\n\n/**\n * Return the hue component of the given `color`,\n * or set the hue component to the optional second `value` argument.\n *\n * Examples:\n *\n * hue(#00c)\n * // => 240deg\n *\n * hue(#00c, 90deg)\n * // => #6c0\n *\n * @param {RGBA|HSLA} color\n * @param {Unit} [value]\n * @return {Unit|RGBA}\n * @api public\n */\n\nfunction hue(color, value){\n if (value) {\n var hslaColor = color.hsla;\n return hsla(\n value,\n new nodes.Unit(hslaColor.s),\n new nodes.Unit(hslaColor.l),\n new nodes.Unit(hslaColor.a)\n )\n }\n return component(color, new nodes.String('hue'));\n};\nhue.params = ['color', 'value'];\nmodule.exports = hue;\n", ";(function (sax) { // wrapper for non-node envs\n sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }\n sax.SAXParser = SAXParser\n sax.SAXStream = SAXStream\n sax.createStream = createStream\n\n // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.\n // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),\n // since that's the earliest that a buffer overrun could occur. This way, checks are\n // as rare as required, but as often as necessary to ensure never crossing this bound.\n // Furthermore, buffers are only tested at most once per write(), so passing a very\n // large string into write() might have undesirable effects, but this is manageable by\n // the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme\n // edge case, result in creating at most one complete copy of the string passed in.\n // Set to Infinity to have unlimited buffers.\n sax.MAX_BUFFER_LENGTH = 64 * 1024\n\n var buffers = [\n 'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',\n 'procInstName', 'procInstBody', 'entity', 'attribName',\n 'attribValue', 'cdata', 'script'\n ]\n\n sax.EVENTS = [\n 'text',\n 'processinginstruction',\n 'sgmldeclaration',\n 'doctype',\n 'comment',\n 'opentagstart',\n 'attribute',\n 'opentag',\n 'closetag',\n 'opencdata',\n 'cdata',\n 'closecdata',\n 'error',\n 'end',\n 'ready',\n 'script',\n 'opennamespace',\n 'closenamespace'\n ]\n\n function SAXParser (strict, opt) {\n if (!(this instanceof SAXParser)) {\n return new SAXParser(strict, opt)\n }\n\n var parser = this\n clearBuffers(parser)\n parser.q = parser.c = ''\n parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH\n parser.opt = opt || {}\n parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags\n parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'\n parser.tags = []\n parser.closed = parser.closedRoot = parser.sawRoot = false\n parser.tag = parser.error = null\n parser.strict = !!strict\n parser.noscript = !!(strict || parser.opt.noscript)\n parser.state = S.BEGIN\n parser.strictEntities = parser.opt.strictEntities\n parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)\n parser.attribList = []\n\n // namespaces form a prototype chain.\n // it always points at the current tag,\n // which protos to its parent tag.\n if (parser.opt.xmlns) {\n parser.ns = Object.create(rootNS)\n }\n\n // mostly just for error reporting\n parser.trackPosition = parser.opt.position !== false\n if (parser.trackPosition) {\n parser.position = parser.line = parser.column = 0\n }\n emit(parser, 'onready')\n }\n\n if (!Object.create) {\n Object.create = function (o) {\n function F () {}\n F.prototype = o\n var newf = new F()\n return newf\n }\n }\n\n if (!Object.keys) {\n Object.keys = function (o) {\n var a = []\n for (var i in o) if (o.hasOwnProperty(i)) a.push(i)\n return a\n }\n }\n\n function checkBufferLength (parser) {\n var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)\n var maxActual = 0\n for (var i = 0, l = buffers.length; i < l; i++) {\n var len = parser[buffers[i]].length\n if (len > maxAllowed) {\n // Text/cdata nodes can get big, and since they're buffered,\n // we can get here under normal conditions.\n // Avoid issues by emitting the text node now,\n // so at least it won't get any bigger.\n switch (buffers[i]) {\n case 'textNode':\n closeText(parser)\n break\n\n case 'cdata':\n emitNode(parser, 'oncdata', parser.cdata)\n parser.cdata = ''\n break\n\n case 'script':\n emitNode(parser, 'onscript', parser.script)\n parser.script = ''\n break\n\n default:\n error(parser, 'Max buffer length exceeded: ' + buffers[i])\n }\n }\n maxActual = Math.max(maxActual, len)\n }\n // schedule the next check for the earliest possible buffer overrun.\n var m = sax.MAX_BUFFER_LENGTH - maxActual\n parser.bufferCheckPosition = m + parser.position\n }\n\n function clearBuffers (parser) {\n for (var i = 0, l = buffers.length; i < l; i++) {\n parser[buffers[i]] = ''\n }\n }\n\n function flushBuffers (parser) {\n closeText(parser)\n if (parser.cdata !== '') {\n emitNode(parser, 'oncdata', parser.cdata)\n parser.cdata = ''\n }\n if (parser.script !== '') {\n emitNode(parser, 'onscript', parser.script)\n parser.script = ''\n }\n }\n\n SAXParser.prototype = {\n end: function () { end(this) },\n write: write,\n resume: function () { this.error = null; return this },\n close: function () { return this.write(null) },\n flush: function () { flushBuffers(this) }\n }\n\n var Stream\n try {\n Stream = require('stream').Stream\n } catch (ex) {\n Stream = function () {}\n }\n\n var streamWraps = sax.EVENTS.filter(function (ev) {\n return ev !== 'error' && ev !== 'end'\n })\n\n function createStream (strict, opt) {\n return new SAXStream(strict, opt)\n }\n\n function SAXStream (strict, opt) {\n if (!(this instanceof SAXStream)) {\n return new SAXStream(strict, opt)\n }\n\n Stream.apply(this)\n\n this._parser = new SAXParser(strict, opt)\n this.writable = true\n this.readable = true\n\n var me = this\n\n this._parser.onend = function () {\n me.emit('end')\n }\n\n this._parser.onerror = function (er) {\n me.emit('error', er)\n\n // if didn't throw, then means error was handled.\n // go ahead and clear error, so we can write again.\n me._parser.error = null\n }\n\n this._decoder = null\n\n streamWraps.forEach(function (ev) {\n Object.defineProperty(me, 'on' + ev, {\n get: function () {\n return me._parser['on' + ev]\n },\n set: function (h) {\n if (!h) {\n me.removeAllListeners(ev)\n me._parser['on' + ev] = h\n return h\n }\n me.on(ev, h)\n },\n enumerable: true,\n configurable: false\n })\n })\n }\n\n SAXStream.prototype = Object.create(Stream.prototype, {\n constructor: {\n value: SAXStream\n }\n })\n\n SAXStream.prototype.write = function (data) {\n if (typeof Buffer === 'function' &&\n typeof Buffer.isBuffer === 'function' &&\n Buffer.isBuffer(data)) {\n if (!this._decoder) {\n var SD = require('string_decoder').StringDecoder\n this._decoder = new SD('utf8')\n }\n data = this._decoder.write(data)\n }\n\n this._parser.write(data.toString())\n this.emit('data', data)\n return true\n }\n\n SAXStream.prototype.end = function (chunk) {\n if (chunk && chunk.length) {\n this.write(chunk)\n }\n this._parser.end()\n return true\n }\n\n SAXStream.prototype.on = function (ev, handler) {\n var me = this\n if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {\n me._parser['on' + ev] = function () {\n var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)\n args.splice(0, 0, ev)\n me.emit.apply(me, args)\n }\n }\n\n return Stream.prototype.on.call(me, ev, handler)\n }\n\n // this really needs to be replaced with character classes.\n // XML allows all manner of ridiculous numbers and digits.\n var CDATA = '[CDATA['\n var DOCTYPE = 'DOCTYPE'\n var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'\n var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/'\n var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }\n\n // http://www.w3.org/TR/REC-xml/#NT-NameStartChar\n // This implementation works on strings, a single character at a time\n // as such, it cannot ever support astral-plane characters (10000-EFFFF)\n // without a significant breaking change to either this parser, or the\n // JavaScript language. Implementation of an emoji-capable xml parser\n // is left as an exercise for the reader.\n var nameStart = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n\n var nameBody = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040.\\d-]/\n\n var entityStart = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n var entityBody = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040.\\d-]/\n\n function isWhitespace (c) {\n return c === ' ' || c === '\\n' || c === '\\r' || c === '\\t'\n }\n\n function isQuote (c) {\n return c === '\"' || c === '\\''\n }\n\n function isAttribEnd (c) {\n return c === '>' || isWhitespace(c)\n }\n\n function isMatch (regex, c) {\n return regex.test(c)\n }\n\n function notMatch (regex, c) {\n return !isMatch(regex, c)\n }\n\n var S = 0\n sax.STATE = {\n BEGIN: S++, // leading byte order mark or whitespace\n BEGIN_WHITESPACE: S++, // leading whitespace\n TEXT: S++, // general stuff\n TEXT_ENTITY: S++, // & and such.\n OPEN_WAKA: S++, // <\n SGML_DECL: S++, // <!BLARG\n SGML_DECL_QUOTED: S++, // <!BLARG foo \"bar\n DOCTYPE: S++, // <!DOCTYPE\n DOCTYPE_QUOTED: S++, // <!DOCTYPE \"//blah\n DOCTYPE_DTD: S++, // <!DOCTYPE \"//blah\" [ ...\n DOCTYPE_DTD_QUOTED: S++, // <!DOCTYPE \"//blah\" [ \"foo\n COMMENT_STARTING: S++, // <!-\n COMMENT: S++, // <!--\n COMMENT_ENDING: S++, // <!-- blah -\n COMMENT_ENDED: S++, // <!-- blah --\n CDATA: S++, // <![CDATA[ something\n CDATA_ENDING: S++, // ]\n CDATA_ENDING_2: S++, // ]]\n PROC_INST: S++, // <?hi\n PROC_INST_BODY: S++, // <?hi there\n PROC_INST_ENDING: S++, // <?hi \"there\" ?\n OPEN_TAG: S++, // <strong\n OPEN_TAG_SLASH: S++, // <strong /\n ATTRIB: S++, // <a\n ATTRIB_NAME: S++, // <a foo\n ATTRIB_NAME_SAW_WHITE: S++, // <a foo _\n ATTRIB_VALUE: S++, // <a foo=\n ATTRIB_VALUE_QUOTED: S++, // <a foo=\"bar\n ATTRIB_VALUE_CLOSED: S++, // <a foo=\"bar\"\n ATTRIB_VALUE_UNQUOTED: S++, // <a foo=bar\n ATTRIB_VALUE_ENTITY_Q: S++, // <foo bar=\""\"\n ATTRIB_VALUE_ENTITY_U: S++, // <foo bar="\n CLOSE_TAG: S++, // </a\n CLOSE_TAG_SAW_WHITE: S++, // </a >\n SCRIPT: S++, // <script> ...\n SCRIPT_ENDING: S++ // <script> ... <\n }\n\n sax.XML_ENTITIES = {\n 'amp': '&',\n 'gt': '>',\n 'lt': '<',\n 'quot': '\"',\n 'apos': \"'\"\n }\n\n sax.ENTITIES = {\n 'amp': '&',\n 'gt': '>',\n 'lt': '<',\n 'quot': '\"',\n 'apos': \"'\",\n 'AElig': 198,\n 'Aacute': 193,\n 'Acirc': 194,\n 'Agrave': 192,\n 'Aring': 197,\n 'Atilde': 195,\n 'Auml': 196,\n 'Ccedil': 199,\n 'ETH': 208,\n 'Eacute': 201,\n 'Ecirc': 202,\n 'Egrave': 200,\n 'Euml': 203,\n 'Iacute': 205,\n 'Icirc': 206,\n 'Igrave': 204,\n 'Iuml': 207,\n 'Ntilde': 209,\n 'Oacute': 211,\n 'Ocirc': 212,\n 'Ograve': 210,\n 'Oslash': 216,\n 'Otilde': 213,\n 'Ouml': 214,\n 'THORN': 222,\n 'Uacute': 218,\n 'Ucirc': 219,\n 'Ugrave': 217,\n 'Uuml': 220,\n 'Yacute': 221,\n 'aacute': 225,\n 'acirc': 226,\n 'aelig': 230,\n 'agrave': 224,\n 'aring': 229,\n 'atilde': 227,\n 'auml': 228,\n 'ccedil': 231,\n 'eacute': 233,\n 'ecirc': 234,\n 'egrave': 232,\n 'eth': 240,\n 'euml': 235,\n 'iacute': 237,\n 'icirc': 238,\n 'igrave': 236,\n 'iuml': 239,\n 'ntilde': 241,\n 'oacute': 243,\n 'ocirc': 244,\n 'ograve': 242,\n 'oslash': 248,\n 'otilde': 245,\n 'ouml': 246,\n 'szlig': 223,\n 'thorn': 254,\n 'uacute': 250,\n 'ucirc': 251,\n 'ugrave': 249,\n 'uuml': 252,\n 'yacute': 253,\n 'yuml': 255,\n 'copy': 169,\n 'reg': 174,\n 'nbsp': 160,\n 'iexcl': 161,\n 'cent': 162,\n 'pound': 163,\n 'curren': 164,\n 'yen': 165,\n 'brvbar': 166,\n 'sect': 167,\n 'uml': 168,\n 'ordf': 170,\n 'laquo': 171,\n 'not': 172,\n 'shy': 173,\n 'macr': 175,\n 'deg': 176,\n 'plusmn': 177,\n 'sup1': 185,\n 'sup2': 178,\n 'sup3': 179,\n 'acute': 180,\n 'micro': 181,\n 'para': 182,\n 'middot': 183,\n 'cedil': 184,\n 'ordm': 186,\n 'raquo': 187,\n 'frac14': 188,\n 'frac12': 189,\n 'frac34': 190,\n 'iquest': 191,\n 'times': 215,\n 'divide': 247,\n 'OElig': 338,\n 'oelig': 339,\n 'Scaron': 352,\n 'scaron': 353,\n 'Yuml': 376,\n 'fnof': 402,\n 'circ': 710,\n 'tilde': 732,\n 'Alpha': 913,\n 'Beta': 914,\n 'Gamma': 915,\n 'Delta': 916,\n 'Epsilon': 917,\n 'Zeta': 918,\n 'Eta': 919,\n 'Theta': 920,\n 'Iota': 921,\n 'Kappa': 922,\n 'Lambda': 923,\n 'Mu': 924,\n 'Nu': 925,\n 'Xi': 926,\n 'Omicron': 927,\n 'Pi': 928,\n 'Rho': 929,\n 'Sigma': 931,\n 'Tau': 932,\n 'Upsilon': 933,\n 'Phi': 934,\n 'Chi': 935,\n 'Psi': 936,\n 'Omega': 937,\n 'alpha': 945,\n 'beta': 946,\n 'gamma': 947,\n 'delta': 948,\n 'epsilon': 949,\n 'zeta': 950,\n 'eta': 951,\n 'theta': 952,\n 'iota': 953,\n 'kappa': 954,\n 'lambda': 955,\n 'mu': 956,\n 'nu': 957,\n 'xi': 958,\n 'omicron': 959,\n 'pi': 960,\n 'rho': 961,\n 'sigmaf': 962,\n 'sigma': 963,\n 'tau': 964,\n 'upsilon': 965,\n 'phi': 966,\n 'chi': 967,\n 'psi': 968,\n 'omega': 969,\n 'thetasym': 977,\n 'upsih': 978,\n 'piv': 982,\n 'ensp': 8194,\n 'emsp': 8195,\n 'thinsp': 8201,\n 'zwnj': 8204,\n 'zwj': 8205,\n 'lrm': 8206,\n 'rlm': 8207,\n 'ndash': 8211,\n 'mdash': 8212,\n 'lsquo': 8216,\n 'rsquo': 8217,\n 'sbquo': 8218,\n 'ldquo': 8220,\n 'rdquo': 8221,\n 'bdquo': 8222,\n 'dagger': 8224,\n 'Dagger': 8225,\n 'bull': 8226,\n 'hellip': 8230,\n 'permil': 8240,\n 'prime': 8242,\n 'Prime': 8243,\n 'lsaquo': 8249,\n 'rsaquo': 8250,\n 'oline': 8254,\n 'frasl': 8260,\n 'euro': 8364,\n 'image': 8465,\n 'weierp': 8472,\n 'real': 8476,\n 'trade': 8482,\n 'alefsym': 8501,\n 'larr': 8592,\n 'uarr': 8593,\n 'rarr': 8594,\n 'darr': 8595,\n 'harr': 8596,\n 'crarr': 8629,\n 'lArr': 8656,\n 'uArr': 8657,\n 'rArr': 8658,\n 'dArr': 8659,\n 'hArr': 8660,\n 'forall': 8704,\n 'part': 8706,\n 'exist': 8707,\n 'empty': 8709,\n 'nabla': 8711,\n 'isin': 8712,\n 'notin': 8713,\n 'ni': 8715,\n 'prod': 8719,\n 'sum': 8721,\n 'minus': 8722,\n 'lowast': 8727,\n 'radic': 8730,\n 'prop': 8733,\n 'infin': 8734,\n 'ang': 8736,\n 'and': 8743,\n 'or': 8744,\n 'cap': 8745,\n 'cup': 8746,\n 'int': 8747,\n 'there4': 8756,\n 'sim': 8764,\n 'cong': 8773,\n 'asymp': 8776,\n 'ne': 8800,\n 'equiv': 8801,\n 'le': 8804,\n 'ge': 8805,\n 'sub': 8834,\n 'sup': 8835,\n 'nsub': 8836,\n 'sube': 8838,\n 'supe': 8839,\n 'oplus': 8853,\n 'otimes': 8855,\n 'perp': 8869,\n 'sdot': 8901,\n 'lceil': 8968,\n 'rceil': 8969,\n 'lfloor': 8970,\n 'rfloor': 8971,\n 'lang': 9001,\n 'rang': 9002,\n 'loz': 9674,\n 'spades': 9824,\n 'clubs': 9827,\n 'hearts': 9829,\n 'diams': 9830\n }\n\n Object.keys(sax.ENTITIES).forEach(function (key) {\n var e = sax.ENTITIES[key]\n var s = typeof e === 'number' ? String.fromCharCode(e) : e\n sax.ENTITIES[key] = s\n })\n\n for (var s in sax.STATE) {\n sax.STATE[sax.STATE[s]] = s\n }\n\n // shorthand\n S = sax.STATE\n\n function emit (parser, event, data) {\n parser[event] && parser[event](data)\n }\n\n function emitNode (parser, nodeType, data) {\n if (parser.textNode) closeText(parser)\n emit(parser, nodeType, data)\n }\n\n function closeText (parser) {\n parser.textNode = textopts(parser.opt, parser.textNode)\n if (parser.textNode) emit(parser, 'ontext', parser.textNode)\n parser.textNode = ''\n }\n\n function textopts (opt, text) {\n if (opt.trim) text = text.trim()\n if (opt.normalize) text = text.replace(/\\s+/g, ' ')\n return text\n }\n\n function error (parser, er) {\n closeText(parser)\n if (parser.trackPosition) {\n er += '\\nLine: ' + parser.line +\n '\\nColumn: ' + parser.column +\n '\\nChar: ' + parser.c\n }\n er = new Error(er)\n parser.error = er\n emit(parser, 'onerror', er)\n return parser\n }\n\n function end (parser) {\n if (parser.sawRoot && !parser.closedRoot) strictFail(parser, 'Unclosed root tag')\n if ((parser.state !== S.BEGIN) &&\n (parser.state !== S.BEGIN_WHITESPACE) &&\n (parser.state !== S.TEXT)) {\n error(parser, 'Unexpected end')\n }\n closeText(parser)\n parser.c = ''\n parser.closed = true\n emit(parser, 'onend')\n SAXParser.call(parser, parser.strict, parser.opt)\n return parser\n }\n\n function strictFail (parser, message) {\n if (typeof parser !== 'object' || !(parser instanceof SAXParser)) {\n throw new Error('bad call to strictFail')\n }\n if (parser.strict) {\n error(parser, message)\n }\n }\n\n function newTag (parser) {\n if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]()\n var parent = parser.tags[parser.tags.length - 1] || parser\n var tag = parser.tag = { name: parser.tagName, attributes: {} }\n\n // will be overridden if tag contails an xmlns=\"foo\" or xmlns:foo=\"bar\"\n if (parser.opt.xmlns) {\n tag.ns = parent.ns\n }\n parser.attribList.length = 0\n emitNode(parser, 'onopentagstart', tag)\n }\n\n function qname (name, attribute) {\n var i = name.indexOf(':')\n var qualName = i < 0 ? [ '', name ] : name.split(':')\n var prefix = qualName[0]\n var local = qualName[1]\n\n // <x \"xmlns\"=\"http://foo\">\n if (attribute && name === 'xmlns') {\n prefix = 'xmlns'\n local = ''\n }\n\n return { prefix: prefix, local: local }\n }\n\n function attrib (parser) {\n if (!parser.strict) {\n parser.attribName = parser.attribName[parser.looseCase]()\n }\n\n if (parser.attribList.indexOf(parser.attribName) !== -1 ||\n parser.tag.attributes.hasOwnProperty(parser.attribName)) {\n parser.attribName = parser.attribValue = ''\n return\n }\n\n if (parser.opt.xmlns) {\n var qn = qname(parser.attribName, true)\n var prefix = qn.prefix\n var local = qn.local\n\n if (prefix === 'xmlns') {\n // namespace binding attribute. push the binding into scope\n if (local === 'xml' && parser.attribValue !== XML_NAMESPACE) {\n strictFail(parser,\n 'xml: prefix must be bound to ' + XML_NAMESPACE + '\\n' +\n 'Actual: ' + parser.attribValue)\n } else if (local === 'xmlns' && parser.attribValue !== XMLNS_NAMESPACE) {\n strictFail(parser,\n 'xmlns: prefix must be bound to ' + XMLNS_NAMESPACE + '\\n' +\n 'Actual: ' + parser.attribValue)\n } else {\n var tag = parser.tag\n var parent = parser.tags[parser.tags.length - 1] || parser\n if (tag.ns === parent.ns) {\n tag.ns = Object.create(parent.ns)\n }\n tag.ns[local] = parser.attribValue\n }\n }\n\n // defer onattribute events until all attributes have been seen\n // so any new bindings can take effect. preserve attribute order\n // so deferred events can be emitted in document order\n parser.attribList.push([parser.attribName, parser.attribValue])\n } else {\n // in non-xmlns mode, we can emit the event right away\n parser.tag.attributes[parser.attribName] = parser.attribValue\n emitNode(parser, 'onattribute', {\n name: parser.attribName,\n value: parser.attribValue\n })\n }\n\n parser.attribName = parser.attribValue = ''\n }\n\n function openTag (parser, selfClosing) {\n if (parser.opt.xmlns) {\n // emit namespace binding events\n var tag = parser.tag\n\n // add namespace info to tag\n var qn = qname(parser.tagName)\n tag.prefix = qn.prefix\n tag.local = qn.local\n tag.uri = tag.ns[qn.prefix] || ''\n\n if (tag.prefix && !tag.uri) {\n strictFail(parser, 'Unbound namespace prefix: ' +\n JSON.stringify(parser.tagName))\n tag.uri = qn.prefix\n }\n\n var parent = parser.tags[parser.tags.length - 1] || parser\n if (tag.ns && parent.ns !== tag.ns) {\n Object.keys(tag.ns).forEach(function (p) {\n emitNode(parser, 'onopennamespace', {\n prefix: p,\n uri: tag.ns[p]\n })\n })\n }\n\n // handle deferred onattribute events\n // Note: do not apply default ns to attributes:\n // http://www.w3.org/TR/REC-xml-names/#defaulting\n for (var i = 0, l = parser.attribList.length; i < l; i++) {\n var nv = parser.attribList[i]\n var name = nv[0]\n var value = nv[1]\n var qualName = qname(name, true)\n var prefix = qualName.prefix\n var local = qualName.local\n var uri = prefix === '' ? '' : (tag.ns[prefix] || '')\n var a = {\n name: name,\n value: value,\n prefix: prefix,\n local: local,\n uri: uri\n }\n\n // if there's any attributes with an undefined namespace,\n // then fail on them now.\n if (prefix && prefix !== 'xmlns' && !uri) {\n strictFail(parser, 'Unbound namespace prefix: ' +\n JSON.stringify(prefix))\n a.uri = prefix\n }\n parser.tag.attributes[name] = a\n emitNode(parser, 'onattribute', a)\n }\n parser.attribList.length = 0\n }\n\n parser.tag.isSelfClosing = !!selfClosing\n\n // process the tag\n parser.sawRoot = true\n parser.tags.push(parser.tag)\n emitNode(parser, 'onopentag', parser.tag)\n if (!selfClosing) {\n // special case for <script> in non-strict mode.\n if (!parser.noscript && parser.tagName.toLowerCase() === 'script') {\n parser.state = S.SCRIPT\n } else {\n parser.state = S.TEXT\n }\n parser.tag = null\n parser.tagName = ''\n }\n parser.attribName = parser.attribValue = ''\n parser.attribList.length = 0\n }\n\n function closeTag (parser) {\n if (!parser.tagName) {\n strictFail(parser, 'Weird empty close tag.')\n parser.textNode += '</>'\n parser.state = S.TEXT\n return\n }\n\n if (parser.script) {\n if (parser.tagName !== 'script') {\n parser.script += '</' + parser.tagName + '>'\n parser.tagName = ''\n parser.state = S.SCRIPT\n return\n }\n emitNode(parser, 'onscript', parser.script)\n parser.script = ''\n }\n\n // first make sure that the closing tag actually exists.\n // <a><b></c></b></a> will close everything, otherwise.\n var t = parser.tags.length\n var tagName = parser.tagName\n if (!parser.strict) {\n tagName = tagName[parser.looseCase]()\n }\n var closeTo = tagName\n while (t--) {\n var close = parser.tags[t]\n if (close.name !== closeTo) {\n // fail the first time in strict mode\n strictFail(parser, 'Unexpected close tag')\n } else {\n break\n }\n }\n\n // didn't find it. we already failed for strict, so just abort.\n if (t < 0) {\n strictFail(parser, 'Unmatched closing tag: ' + parser.tagName)\n parser.textNode += '</' + parser.tagName + '>'\n parser.state = S.TEXT\n return\n }\n parser.tagName = tagName\n var s = parser.tags.length\n while (s-- > t) {\n var tag = parser.tag = parser.tags.pop()\n parser.tagName = parser.tag.name\n emitNode(parser, 'onclosetag', parser.tagName)\n\n var x = {}\n for (var i in tag.ns) {\n x[i] = tag.ns[i]\n }\n\n var parent = parser.tags[parser.tags.length - 1] || parser\n if (parser.opt.xmlns && tag.ns !== parent.ns) {\n // remove namespace bindings introduced by tag\n Object.keys(tag.ns).forEach(function (p) {\n var n = tag.ns[p]\n emitNode(parser, 'onclosenamespace', { prefix: p, uri: n })\n })\n }\n }\n if (t === 0) parser.closedRoot = true\n parser.tagName = parser.attribValue = parser.attribName = ''\n parser.attribList.length = 0\n parser.state = S.TEXT\n }\n\n function parseEntity (parser) {\n var entity = parser.entity\n var entityLC = entity.toLowerCase()\n var num\n var numStr = ''\n\n if (parser.ENTITIES[entity]) {\n return parser.ENTITIES[entity]\n }\n if (parser.ENTITIES[entityLC]) {\n return parser.ENTITIES[entityLC]\n }\n entity = entityLC\n if (entity.charAt(0) === '#') {\n if (entity.charAt(1) === 'x') {\n entity = entity.slice(2)\n num = parseInt(entity, 16)\n numStr = num.toString(16)\n } else {\n entity = entity.slice(1)\n num = parseInt(entity, 10)\n numStr = num.toString(10)\n }\n }\n entity = entity.replace(/^0+/, '')\n if (isNaN(num) || numStr.toLowerCase() !== entity) {\n strictFail(parser, 'Invalid character entity')\n return '&' + parser.entity + ';'\n }\n\n return String.fromCodePoint(num)\n }\n\n function beginWhiteSpace (parser, c) {\n if (c === '<') {\n parser.state = S.OPEN_WAKA\n parser.startTagPosition = parser.position\n } else if (!isWhitespace(c)) {\n // have to process this as a text node.\n // weird, but happens.\n strictFail(parser, 'Non-whitespace before first tag.')\n parser.textNode = c\n parser.state = S.TEXT\n }\n }\n\n function charAt (chunk, i) {\n var result = ''\n if (i < chunk.length) {\n result = chunk.charAt(i)\n }\n return result\n }\n\n function write (chunk) {\n var parser = this\n if (this.error) {\n throw this.error\n }\n if (parser.closed) {\n return error(parser,\n 'Cannot write after close. Assign an onready handler.')\n }\n if (chunk === null) {\n return end(parser)\n }\n if (typeof chunk === 'object') {\n chunk = chunk.toString()\n }\n var i = 0\n var c = ''\n while (true) {\n c = charAt(chunk, i++)\n parser.c = c\n\n if (!c) {\n break\n }\n\n if (parser.trackPosition) {\n parser.position++\n if (c === '\\n') {\n parser.line++\n parser.column = 0\n } else {\n parser.column++\n }\n }\n\n switch (parser.state) {\n case S.BEGIN:\n parser.state = S.BEGIN_WHITESPACE\n if (c === '\\uFEFF') {\n continue\n }\n beginWhiteSpace(parser, c)\n continue\n\n case S.BEGIN_WHITESPACE:\n beginWhiteSpace(parser, c)\n continue\n\n case S.TEXT:\n if (parser.sawRoot && !parser.closedRoot) {\n var starti = i - 1\n while (c && c !== '<' && c !== '&') {\n c = charAt(chunk, i++)\n if (c && parser.trackPosition) {\n parser.position++\n if (c === '\\n') {\n parser.line++\n parser.column = 0\n } else {\n parser.column++\n }\n }\n }\n parser.textNode += chunk.substring(starti, i - 1)\n }\n if (c === '<' && !(parser.sawRoot && parser.closedRoot && !parser.strict)) {\n parser.state = S.OPEN_WAKA\n parser.startTagPosition = parser.position\n } else {\n if (!isWhitespace(c) && (!parser.sawRoot || parser.closedRoot)) {\n strictFail(parser, 'Text data outside of root node.')\n }\n if (c === '&') {\n parser.state = S.TEXT_ENTITY\n } else {\n parser.textNode += c\n }\n }\n continue\n\n case S.SCRIPT:\n // only non-strict\n if (c === '<') {\n parser.state = S.SCRIPT_ENDING\n } else {\n parser.script += c\n }\n continue\n\n case S.SCRIPT_ENDING:\n if (c === '/') {\n parser.state = S.CLOSE_TAG\n } else {\n parser.script += '<' + c\n parser.state = S.SCRIPT\n }\n continue\n\n case S.OPEN_WAKA:\n // either a /, ?, !, or text is coming next.\n if (c === '!') {\n parser.state = S.SGML_DECL\n parser.sgmlDecl = ''\n } else if (isWhitespace(c)) {\n // wait for it...\n } else if (isMatch(nameStart, c)) {\n parser.state = S.OPEN_TAG\n parser.tagName = c\n } else if (c === '/') {\n parser.state = S.CLOSE_TAG\n parser.tagName = ''\n } else if (c === '?') {\n parser.state = S.PROC_INST\n parser.procInstName = parser.procInstBody = ''\n } else {\n strictFail(parser, 'Unencoded <')\n // if there was some whitespace, then add that in.\n if (parser.startTagPosition + 1 < parser.position) {\n var pad = parser.position - parser.startTagPosition\n c = new Array(pad).join(' ') + c\n }\n parser.textNode += '<' + c\n parser.state = S.TEXT\n }\n continue\n\n case S.SGML_DECL:\n if ((parser.sgmlDecl + c).toUpperCase() === CDATA) {\n emitNode(parser, 'onopencdata')\n parser.state = S.CDATA\n parser.sgmlDecl = ''\n parser.cdata = ''\n } else if (parser.sgmlDecl + c === '--') {\n parser.state = S.COMMENT\n parser.comment = ''\n parser.sgmlDecl = ''\n } else if ((parser.sgmlDecl + c).toUpperCase() === DOCTYPE) {\n parser.state = S.DOCTYPE\n if (parser.doctype || parser.sawRoot) {\n strictFail(parser,\n 'Inappropriately located doctype declaration')\n }\n parser.doctype = ''\n parser.sgmlDecl = ''\n } else if (c === '>') {\n emitNode(parser, 'onsgmldeclaration', parser.sgmlDecl)\n parser.sgmlDecl = ''\n parser.state = S.TEXT\n } else if (isQuote(c)) {\n parser.state = S.SGML_DECL_QUOTED\n parser.sgmlDecl += c\n } else {\n parser.sgmlDecl += c\n }\n continue\n\n case S.SGML_DECL_QUOTED:\n if (c === parser.q) {\n parser.state = S.SGML_DECL\n parser.q = ''\n }\n parser.sgmlDecl += c\n continue\n\n case S.DOCTYPE:\n if (c === '>') {\n parser.state = S.TEXT\n emitNode(parser, 'ondoctype', parser.doctype)\n parser.doctype = true // just remember that we saw it.\n } else {\n parser.doctype += c\n if (c === '[') {\n parser.state = S.DOCTYPE_DTD\n } else if (isQuote(c)) {\n parser.state = S.DOCTYPE_QUOTED\n parser.q = c\n }\n }\n continue\n\n case S.DOCTYPE_QUOTED:\n parser.doctype += c\n if (c === parser.q) {\n parser.q = ''\n parser.state = S.DOCTYPE\n }\n continue\n\n case S.DOCTYPE_DTD:\n parser.doctype += c\n if (c === ']') {\n parser.state = S.DOCTYPE\n } else if (isQuote(c)) {\n parser.state = S.DOCTYPE_DTD_QUOTED\n parser.q = c\n }\n continue\n\n case S.DOCTYPE_DTD_QUOTED:\n parser.doctype += c\n if (c === parser.q) {\n parser.state = S.DOCTYPE_DTD\n parser.q = ''\n }\n continue\n\n case S.COMMENT:\n if (c === '-') {\n parser.state = S.COMMENT_ENDING\n } else {\n parser.comment += c\n }\n continue\n\n case S.COMMENT_ENDING:\n if (c === '-') {\n parser.state = S.COMMENT_ENDED\n parser.comment = textopts(parser.opt, parser.comment)\n if (parser.comment) {\n emitNode(parser, 'oncomment', parser.comment)\n }\n parser.comment = ''\n } else {\n parser.comment += '-' + c\n parser.state = S.COMMENT\n }\n continue\n\n case S.COMMENT_ENDED:\n if (c !== '>') {\n strictFail(parser, 'Malformed comment')\n // allow <!-- blah -- bloo --> in non-strict mode,\n // which is a comment of \" blah -- bloo \"\n parser.comment += '--' + c\n parser.state = S.COMMENT\n } else {\n parser.state = S.TEXT\n }\n continue\n\n case S.CDATA:\n if (c === ']') {\n parser.state = S.CDATA_ENDING\n } else {\n parser.cdata += c\n }\n continue\n\n case S.CDATA_ENDING:\n if (c === ']') {\n parser.state = S.CDATA_ENDING_2\n } else {\n parser.cdata += ']' + c\n parser.state = S.CDATA\n }\n continue\n\n case S.CDATA_ENDING_2:\n if (c === '>') {\n if (parser.cdata) {\n emitNode(parser, 'oncdata', parser.cdata)\n }\n emitNode(parser, 'onclosecdata')\n parser.cdata = ''\n parser.state = S.TEXT\n } else if (c === ']') {\n parser.cdata += ']'\n } else {\n parser.cdata += ']]' + c\n parser.state = S.CDATA\n }\n continue\n\n case S.PROC_INST:\n if (c === '?') {\n parser.state = S.PROC_INST_ENDING\n } else if (isWhitespace(c)) {\n parser.state = S.PROC_INST_BODY\n } else {\n parser.procInstName += c\n }\n continue\n\n case S.PROC_INST_BODY:\n if (!parser.procInstBody && isWhitespace(c)) {\n continue\n } else if (c === '?') {\n parser.state = S.PROC_INST_ENDING\n } else {\n parser.procInstBody += c\n }\n continue\n\n case S.PROC_INST_ENDING:\n if (c === '>') {\n emitNode(parser, 'onprocessinginstruction', {\n name: parser.procInstName,\n body: parser.procInstBody\n })\n parser.procInstName = parser.procInstBody = ''\n parser.state = S.TEXT\n } else {\n parser.procInstBody += '?' + c\n parser.state = S.PROC_INST_BODY\n }\n continue\n\n case S.OPEN_TAG:\n if (isMatch(nameBody, c)) {\n parser.tagName += c\n } else {\n newTag(parser)\n if (c === '>') {\n openTag(parser)\n } else if (c === '/') {\n parser.state = S.OPEN_TAG_SLASH\n } else {\n if (!isWhitespace(c)) {\n strictFail(parser, 'Invalid character in tag name')\n }\n parser.state = S.ATTRIB\n }\n }\n continue\n\n case S.OPEN_TAG_SLASH:\n if (c === '>') {\n openTag(parser, true)\n closeTag(parser)\n } else {\n strictFail(parser, 'Forward-slash in opening tag not followed by >')\n parser.state = S.ATTRIB\n }\n continue\n\n case S.ATTRIB:\n // haven't read the attribute name yet.\n if (isWhitespace(c)) {\n continue\n } else if (c === '>') {\n openTag(parser)\n } else if (c === '/') {\n parser.state = S.OPEN_TAG_SLASH\n } else if (isMatch(nameStart, c)) {\n parser.attribName = c\n parser.attribValue = ''\n parser.state = S.ATTRIB_NAME\n } else {\n strictFail(parser, 'Invalid attribute name')\n }\n continue\n\n case S.ATTRIB_NAME:\n if (c === '=') {\n parser.state = S.ATTRIB_VALUE\n } else if (c === '>') {\n strictFail(parser, 'Attribute without value')\n parser.attribValue = parser.attribName\n attrib(parser)\n openTag(parser)\n } else if (isWhitespace(c)) {\n parser.state = S.ATTRIB_NAME_SAW_WHITE\n } else if (isMatch(nameBody, c)) {\n parser.attribName += c\n } else {\n strictFail(parser, 'Invalid attribute name')\n }\n continue\n\n case S.ATTRIB_NAME_SAW_WHITE:\n if (c === '=') {\n parser.state = S.ATTRIB_VALUE\n } else if (isWhitespace(c)) {\n continue\n } else {\n strictFail(parser, 'Attribute without value')\n parser.tag.attributes[parser.attribName] = ''\n parser.attribValue = ''\n emitNode(parser, 'onattribute', {\n name: parser.attribName,\n value: ''\n })\n parser.attribName = ''\n if (c === '>') {\n openTag(parser)\n } else if (isMatch(nameStart, c)) {\n parser.attribName = c\n parser.state = S.ATTRIB_NAME\n } else {\n strictFail(parser, 'Invalid attribute name')\n parser.state = S.ATTRIB\n }\n }\n continue\n\n case S.ATTRIB_VALUE:\n if (isWhitespace(c)) {\n continue\n } else if (isQuote(c)) {\n parser.q = c\n parser.state = S.ATTRIB_VALUE_QUOTED\n } else {\n strictFail(parser, 'Unquoted attribute value')\n parser.state = S.ATTRIB_VALUE_UNQUOTED\n parser.attribValue = c\n }\n continue\n\n case S.ATTRIB_VALUE_QUOTED:\n if (c !== parser.q) {\n if (c === '&') {\n parser.state = S.ATTRIB_VALUE_ENTITY_Q\n } else {\n parser.attribValue += c\n }\n continue\n }\n attrib(parser)\n parser.q = ''\n parser.state = S.ATTRIB_VALUE_CLOSED\n continue\n\n case S.ATTRIB_VALUE_CLOSED:\n if (isWhitespace(c)) {\n parser.state = S.ATTRIB\n } else if (c === '>') {\n openTag(parser)\n } else if (c === '/') {\n parser.state = S.OPEN_TAG_SLASH\n } else if (isMatch(nameStart, c)) {\n strictFail(parser, 'No whitespace between attributes')\n parser.attribName = c\n parser.attribValue = ''\n parser.state = S.ATTRIB_NAME\n } else {\n strictFail(parser, 'Invalid attribute name')\n }\n continue\n\n case S.ATTRIB_VALUE_UNQUOTED:\n if (!isAttribEnd(c)) {\n if (c === '&') {\n parser.state = S.ATTRIB_VALUE_ENTITY_U\n } else {\n parser.attribValue += c\n }\n continue\n }\n attrib(parser)\n if (c === '>') {\n openTag(parser)\n } else {\n parser.state = S.ATTRIB\n }\n continue\n\n case S.CLOSE_TAG:\n if (!parser.tagName) {\n if (isWhitespace(c)) {\n continue\n } else if (notMatch(nameStart, c)) {\n if (parser.script) {\n parser.script += '</' + c\n parser.state = S.SCRIPT\n } else {\n strictFail(parser, 'Invalid tagname in closing tag.')\n }\n } else {\n parser.tagName = c\n }\n } else if (c === '>') {\n closeTag(parser)\n } else if (isMatch(nameBody, c)) {\n parser.tagName += c\n } else if (parser.script) {\n parser.script += '</' + parser.tagName\n parser.tagName = ''\n parser.state = S.SCRIPT\n } else {\n if (!isWhitespace(c)) {\n strictFail(parser, 'Invalid tagname in closing tag')\n }\n parser.state = S.CLOSE_TAG_SAW_WHITE\n }\n continue\n\n case S.CLOSE_TAG_SAW_WHITE:\n if (isWhitespace(c)) {\n continue\n }\n if (c === '>') {\n closeTag(parser)\n } else {\n strictFail(parser, 'Invalid characters in closing tag')\n }\n continue\n\n case S.TEXT_ENTITY:\n case S.ATTRIB_VALUE_ENTITY_Q:\n case S.ATTRIB_VALUE_ENTITY_U:\n var returnState\n var buffer\n switch (parser.state) {\n case S.TEXT_ENTITY:\n returnState = S.TEXT\n buffer = 'textNode'\n break\n\n case S.ATTRIB_VALUE_ENTITY_Q:\n returnState = S.ATTRIB_VALUE_QUOTED\n buffer = 'attribValue'\n break\n\n case S.ATTRIB_VALUE_ENTITY_U:\n returnState = S.ATTRIB_VALUE_UNQUOTED\n buffer = 'attribValue'\n break\n }\n\n if (c === ';') {\n parser[buffer] += parseEntity(parser)\n parser.entity = ''\n parser.state = returnState\n } else if (isMatch(parser.entity.length ? entityBody : entityStart, c)) {\n parser.entity += c\n } else {\n strictFail(parser, 'Invalid character in entity name')\n parser[buffer] += '&' + parser.entity + c\n parser.entity = ''\n parser.state = returnState\n }\n\n continue\n\n default:\n throw new Error(parser, 'Unknown state: ' + parser.state)\n }\n } // while\n\n if (parser.position >= parser.bufferCheckPosition) {\n checkBufferLength(parser)\n }\n return parser\n }\n\n /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */\n /* istanbul ignore next */\n if (!String.fromCodePoint) {\n (function () {\n var stringFromCharCode = String.fromCharCode\n var floor = Math.floor\n var fromCodePoint = function () {\n var MAX_SIZE = 0x4000\n var codeUnits = []\n var highSurrogate\n var lowSurrogate\n var index = -1\n var length = arguments.length\n if (!length) {\n return ''\n }\n var result = ''\n while (++index < length) {\n var codePoint = Number(arguments[index])\n if (\n !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`\n codePoint < 0 || // not a valid Unicode code point\n codePoint > 0x10FFFF || // not a valid Unicode code point\n floor(codePoint) !== codePoint // not an integer\n ) {\n throw RangeError('Invalid code point: ' + codePoint)\n }\n if (codePoint <= 0xFFFF) { // BMP code point\n codeUnits.push(codePoint)\n } else { // Astral code point; split in surrogate halves\n // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n codePoint -= 0x10000\n highSurrogate = (codePoint >> 10) + 0xD800\n lowSurrogate = (codePoint % 0x400) + 0xDC00\n codeUnits.push(highSurrogate, lowSurrogate)\n }\n if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n result += stringFromCharCode.apply(null, codeUnits)\n codeUnits.length = 0\n }\n }\n return result\n }\n /* istanbul ignore next */\n if (Object.defineProperty) {\n Object.defineProperty(String, 'fromCodePoint', {\n value: fromCodePoint,\n configurable: true,\n writable: true\n })\n } else {\n String.fromCodePoint = fromCodePoint\n }\n }())\n }\n})(typeof exports === 'undefined' ? this.sax = {} : exports)\n", "\n\n/*!\n * Stylus - plugin - url\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar utils = require('../utils')\n , Buffer = require('buffer').Buffer\n , fs = require('fs')\n , path = require('path')\n , sax = require('sax');\n\n/**\n * Initialize a new `Image` with the given `ctx` and `path.\n *\n * @param {Evaluator} ctx\n * @param {String} path\n * @api private\n */\n\nvar Image = module.exports = function Image(ctx, path) {\n this.ctx = ctx;\n this.path = utils.lookup(path, ctx.paths);\n if (!this.path) throw new Error('failed to locate file ' + path);\n};\n\n/**\n * Open the image for reading.\n *\n * @api private\n */\n\nImage.prototype.open = function(){\n this.fd = fs.openSync(this.path, 'r');\n this.length = fs.fstatSync(this.fd).size;\n this.extname = path.extname(this.path).slice(1);\n};\n\n/**\n * Close the file.\n *\n * @api private\n */\n\nImage.prototype.close = function(){\n if (this.fd) fs.closeSync(this.fd);\n};\n\n/**\n * Return the type of image, supports:\n *\n * - gif\n * - png\n * - jpeg\n * - svg\n *\n * @return {String}\n * @api private\n */\n\nImage.prototype.type = function(){\n var type\n , buf = Buffer.alloc(4);\n \n fs.readSync(this.fd, buf, 0, 4, 0);\n\n // GIF\n if (0x47 == buf[0] && 0x49 == buf[1] && 0x46 == buf[2]) type = 'gif';\n\n // PNG\n else if (0x50 == buf[1] && 0x4E == buf[2] && 0x47 == buf[3]) type = 'png';\n\n // JPEG\n else if (0xff == buf[0] && 0xd8 == buf[1]) type = 'jpeg';\n\n // SVG\n else if ('svg' == this.extname) type = this.extname;\n\n return type;\n};\n\n/**\n * Return image dimensions `[width, height]`.\n *\n * @return {Array}\n * @api private\n */\n\nImage.prototype.size = function(){\n var type = this.type()\n , width\n , height\n , buf\n , offset\n , blockSize\n , parser;\n\n function uint16(b) { return b[1] << 8 | b[0]; }\n function uint32(b) { return b[0] << 24 | b[1] << 16 | b[2] << 8 | b[3]; } \n\n // Determine dimensions\n switch (type) {\n case 'jpeg':\n buf = Buffer.alloc(this.length);\n fs.readSync(this.fd, buf, 0, this.length, 0);\n offset = 4;\n blockSize = buf[offset] << 8 | buf[offset + 1];\n\n while (offset < this.length) {\n offset += blockSize;\n if (offset >= this.length || 0xff != buf[offset]) break;\n // SOF0 or SOF2 (progressive)\n if (0xc0 == buf[offset + 1] || 0xc2 == buf[offset + 1]) {\n height = buf[offset + 5] << 8 | buf[offset + 6];\n width = buf[offset + 7] << 8 | buf[offset + 8];\n } else {\n offset += 2;\n blockSize = buf[offset] << 8 | buf[offset + 1];\n }\n }\n break;\n case 'png':\n buf = Buffer.alloc(8);\n // IHDR chunk width / height uint32_t big-endian\n fs.readSync(this.fd, buf, 0, 8, 16);\n width = uint32(buf);\n height = uint32(buf.slice(4, 8));\n break;\n case 'gif':\n buf = Buffer.alloc(4);\n // width / height uint16_t little-endian\n fs.readSync(this.fd, buf, 0, 4, 6);\n width = uint16(buf);\n height = uint16(buf.slice(2, 4));\n break;\n case 'svg':\n offset = Math.min(this.length, 1024);\n buf = Buffer.alloc(offset);\n fs.readSync(this.fd, buf, 0, offset, 0);\n buf = buf.toString('utf8');\n parser = sax.parser(true);\n parser.onopentag = function(node) {\n if ('svg' == node.name && node.attributes.width && node.attributes.height) {\n width = parseInt(node.attributes.width, 10);\n height = parseInt(node.attributes.height, 10);\n }\n };\n parser.write(buf).close();\n break;\n }\n\n if ('number' != typeof width) throw new Error('failed to find width of \"' + this.path + '\"');\n if ('number' != typeof height) throw new Error('failed to find height of \"' + this.path + '\"');\n\n return [width, height];\n};\n", "var utils = require('../utils')\n , nodes = require('../nodes')\n , Image = require('./image');\n\n/**\n * Return the width and height of the given `img` path.\n *\n * Examples:\n *\n * image-size('foo.png')\n * // => 200px 100px\n *\n * image-size('foo.png')[0]\n * // => 200px\n *\n * image-size('foo.png')[1]\n * // => 100px\n *\n * Can be used to test if the image exists,\n * using an optional argument set to `true`\n * (without this argument this function throws error\n * if there is no such image).\n *\n * Example:\n *\n * image-size('nosuchimage.png', true)[0]\n * // => 0\n *\n * @param {String} img\n * @param {Boolean} ignoreErr\n * @return {Expression}\n * @api public\n */\n\nfunction imageSize(img, ignoreErr) {\n utils.assertType(img, 'string', 'img');\n try {\n var img = new Image(this, img.string);\n } catch (err) {\n if (ignoreErr) {\n return [new nodes.Unit(0), new nodes.Unit(0)];\n } else {\n throw err;\n }\n }\n\n // Read size\n img.open();\n var size = img.size();\n img.close();\n\n // Return (w h)\n var expr = [];\n expr.push(new nodes.Unit(size[0], 'px'));\n expr.push(new nodes.Unit(size[1], 'px'));\n\n return expr;\n};\nimageSize.params = ['img', 'ignoreErr'];\nmodule.exports = imageSize;\n", "var utils = require('../utils')\n , nodes = require('../nodes')\n , readFile = require('fs').readFileSync;\n\n/**\n * Convert a .json file into stylus variables or object.\n * Nested variable object keys are joined with a dash (-)\n *\n * Given this sample media-queries.json file:\n * {\n * \"small\": \"screen and (max-width:400px)\",\n * \"tablet\": {\n * \"landscape\": \"screen and (min-width:600px) and (orientation:landscape)\",\n * \"portrait\": \"screen and (min-width:600px) and (orientation:portrait)\"\n * }\n * }\n *\n * Examples:\n *\n * json('media-queries.json')\n *\n * @media small\n * // => @media screen and (max-width:400px)\n *\n * @media tablet-landscape\n * // => @media screen and (min-width:600px) and (orientation:landscape)\n *\n * vars = json('vars.json', { hash: true })\n * body\n * width: vars.width\n *\n * @param {String} path\n * @param {Boolean} [local]\n * @param {String} [namePrefix]\n * @api public\n*/\n\nfunction json(path, local, namePrefix){\n utils.assertString(path, 'path');\n\n // lookup\n path = path.string;\n var found = utils.lookup(path, this.options.paths, this.options.filename)\n , options = (local && 'object' == local.nodeName) && local;\n\n if (!found) {\n // optional JSON file\n if (options && options.get('optional').toBoolean().isTrue) {\n return nodes.null;\n }\n throw new Error('failed to locate .json file ' + path);\n }\n\n // read\n var json = JSON.parse(readFile(found, 'utf8'));\n\n if (options) {\n return convert(json, options);\n } else {\n oldJson.call(this, json, local, namePrefix);\n }\n\n function convert(obj, options){\n var ret = new nodes.Object()\n , leaveStrings = options.get('leave-strings').toBoolean();\n\n for (var key in obj) {\n var val = obj[key];\n if ('object' == typeof val) {\n ret.set(key, convert(val, options));\n } else {\n val = utils.coerce(val);\n if ('string' == val.nodeName && leaveStrings.isFalse) {\n val = utils.parseString(val.string);\n }\n ret.set(key, val);\n }\n }\n return ret;\n }\n};\njson.params = ['path', 'local', 'namePrefix'];\nmodule.exports = json;\n\n/**\n * Old `json` BIF.\n *\n * @api private\n */\n\nfunction oldJson(json, local, namePrefix){\n if (namePrefix) {\n utils.assertString(namePrefix, 'namePrefix');\n namePrefix = namePrefix.val;\n } else {\n namePrefix = '';\n }\n local = local ? local.toBoolean() : new nodes.Boolean(local);\n var scope = local.isTrue ? this.currentScope : this.global.scope;\n\n convert(json);\n return;\n\n function convert(obj, prefix){\n prefix = prefix ? prefix + '-' : '';\n for (var key in obj){\n var val = obj[key];\n var name = prefix + key;\n if ('object' == typeof val) {\n convert(val, name);\n } else {\n val = utils.coerce(val);\n if ('string' == val.nodeName) val = utils.parseString(val.string);\n scope.add({ name: namePrefix + name, val: val });\n }\n }\n }\n};\n", "var utils = require('../utils');\n\n/**\n * Return length of the given `expr`.\n *\n * @param {Expression} expr\n * @return {Unit}\n * @api public\n */\n\n(module.exports = function length(expr){\n if (expr) {\n if (expr.nodes) {\n var nodes = utils.unwrap(expr).nodes;\n if (1 == nodes.length && 'object' == nodes[0].nodeName) {\n return nodes[0].length;\n } else if (1 == nodes.length && 'string' == nodes[0].nodeName) {\n return nodes[0].val.length;\n } else {\n return nodes.length;\n }\n } else {\n return 1;\n }\n }\n return 0;\n}).raw = true;\n", "var nodes = require('../nodes')\n , hsla = require('./hsla')\n , component = require('./component');\n\n/**\n * Return the lightness component of the given `color`,\n * or set the lightness component to the optional second `value` argument.\n *\n * Examples:\n *\n * lightness(#00c)\n * // => 100%\n *\n * lightness(#00c, 80%)\n * // => #99f\n *\n * @param {RGBA|HSLA} color\n * @param {Unit} [value]\n * @return {Unit|RGBA}\n * @api public\n */\n\nfunction lightness(color, value){\n if (value) {\n var hslaColor = color.hsla;\n return hsla(\n new nodes.Unit(hslaColor.h),\n new nodes.Unit(hslaColor.s),\n value,\n new nodes.Unit(hslaColor.a)\n )\n }\n return component(color, new nodes.String('lightness'));\n};\nlightness.params = ['color', 'value'];\nmodule.exports = lightness;\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Return the separator of the given `list`.\n *\n * Examples:\n *\n * list1 = a b c\n * list-separator(list1)\n * // => ' '\n *\n * list2 = a, b, c\n * list-separator(list2)\n * // => ','\n *\n * @param {Experssion} list\n * @return {String}\n * @api public\n */\n\n(module.exports = function listSeparator(list){\n list = utils.unwrap(list);\n return new nodes.String(list.isList ? ',' : ' ');\n}).raw = true;\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Lookup variable `name` or return Null.\n *\n * @param {String} name\n * @return {Mixed}\n * @api public\n */\n\nfunction lookup(name){\n utils.assertType(name, 'string', 'name');\n var node = this.lookup(name.val);\n if (!node) return nodes.null;\n return this.visit(node);\n}\nlookup.params = ['name'];\nmodule.exports = lookup;\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\nvar VALID_FLAGS = 'igm';\n\n/**\n * retrieves the matches when matching a `val`(string)\n * against a `pattern`(regular expression).\n *\n * Examples:\n * $regex = '^(height|width)?([<>=]{1,})(.*)'\n *\n * match($regex,'height>=sm')\n * \t // => ('height>=sm' 'height' '>=' 'sm')\n * \t // => also truthy\n *\n * match($regex, 'lorem ipsum')\n * // => null\n *\n * @param {String} pattern\n * @param {String|Ident} val\n * @param {String|Ident} [flags='']\n * @return {String|Null}\n * @api public\n */\n\nfunction match(pattern, val, flags){\n utils.assertType(pattern, 'string', 'pattern');\n utils.assertString(val, 'val');\n var re = new RegExp(pattern.val, validateFlags(flags) ? flags.string : '');\n return val.string.match(re);\n}\nmatch.params = ['pattern', 'val', 'flags'];\nmodule.exports = match;\n\nfunction validateFlags(flags) {\n flags = flags && flags.string;\n\n if (flags) {\n return flags.split('').every(function(flag) {\n return ~VALID_FLAGS.indexOf(flag);\n });\n }\n return false;\n}\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Apply Math `fn` to `n`.\n *\n * @param {Unit} n\n * @param {String} fn\n * @return {Unit}\n * @api private\n */\n\nfunction math(n, fn){\n utils.assertType(n, 'unit', 'n');\n utils.assertString(fn, 'fn');\n return new nodes.Unit(Math[fn.string](n.val), n.type);\n}\nmath.params = ['n', 'fn'];\nmodule.exports = math;\n", "var utils = require('../utils');\n\n/**\n * Merge the object `dest` with the given args.\n *\n * @param {Object} dest\n * @param {Object} ...\n * @return {Object} dest\n * @api public\n */\n\n(module.exports = function merge(dest){\n utils.assertPresent(dest, 'dest');\n dest = utils.unwrap(dest).first;\n utils.assertType(dest, 'object', 'dest');\n\n var last = utils.unwrap(arguments[arguments.length - 1]).first\n , deep = (true === last.val);\n\n for (var i = 1, len = arguments.length - deep; i < len; ++i) {\n utils.merge(dest.vals, utils.unwrap(arguments[i]).first.vals, deep);\n }\n return dest;\n}).raw = true;\n", "var utils = require('../utils');\n\n/**\n * Perform `op` on the `left` and `right` operands.\n *\n * @param {String} op\n * @param {Node} left\n * @param {Node} right\n * @return {Node}\n * @api public\n */\n\nfunction operate(op, left, right){\n utils.assertType(op, 'string', 'op');\n utils.assertPresent(left, 'left');\n utils.assertPresent(right, 'right');\n return left.operate(op.val, right);\n}\noperate.params = ['op', 'left', 'right'];\nmodule.exports = operate;\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Return the opposites of the given `positions`.\n *\n * Examples:\n *\n * opposite-position(top left)\n * // => bottom right\n *\n * @param {Expression} positions\n * @return {Expression}\n * @api public\n */\n\n(module.exports = function oppositePosition(positions){\n var expr = [];\n utils.unwrap(positions).nodes.forEach(function(pos, i){\n utils.assertString(pos, 'position ' + i);\n pos = (function(){ switch (pos.string) {\n case 'top': return 'bottom';\n case 'bottom': return 'top';\n case 'left': return 'right';\n case 'right': return 'left';\n case 'center': return 'center';\n default: throw new Error('invalid position ' + pos);\n }})();\n expr.push(new nodes.Literal(pos));\n });\n return expr;\n}).raw = true;\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Inspect the given `expr`.\n *\n * @param {Expression} expr\n * @api public\n */\n\n(module.exports = function p(){\n [].slice.call(arguments).forEach(function(expr){\n expr = utils.unwrap(expr);\n if (!expr.nodes.length) return;\n console.log('\\u001b[90minspect:\\u001b[0m %s', expr.toString().replace(/^\\(|\\)$/g, ''));\n })\n return nodes.null;\n}).raw = true;\n", "var path = require('path');\n\n/**\n * Peform a path join.\n *\n * @param {String} path\n * @return {String}\n * @api public\n */\n\n(module.exports = function pathjoin(){\n var paths = [].slice.call(arguments).map(function(path){\n return path.first.string;\n });\n return path.join.apply(null, paths).replace(/\\\\/g, '/');\n}).raw = true;\n", "var utils = require('../utils');\n\n/**\n * Pop a value from `expr`.\n *\n * @param {Expression} expr\n * @return {Node}\n * @api public\n */\n\n(module.exports = function pop(expr) {\n expr = utils.unwrap(expr);\n return expr.nodes.pop();\n}).raw = true;\n", "var utils = require('../utils');\n\n/**\n * Push the given args to `expr`.\n *\n * @param {Expression} expr\n * @param {Node} ...\n * @return {Unit}\n * @api public\n */\n\n(module.exports = function(expr){\n expr = utils.unwrap(expr);\n for (var i = 1, len = arguments.length; i < len; ++i) {\n expr.nodes.push(utils.unwrap(arguments[i]).clone());\n }\n return expr.nodes.length;\n}).raw = true;\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Returns a list of units from `start` to `stop`\n * by `step`. If `step` argument is omitted,\n * it defaults to 1.\n *\n * @param {Unit} start\n * @param {Unit} stop\n * @param {Unit} [step]\n * @return {Expression}\n * @api public\n */\n\nfunction range(start, stop, step){\n utils.assertType(start, 'unit', 'start');\n utils.assertType(stop, 'unit', 'stop');\n if (step) {\n utils.assertType(step, 'unit', 'step');\n if (0 == step.val) {\n throw new Error('ArgumentError: \"step\" argument must not be zero');\n }\n } else {\n step = new nodes.Unit(1);\n }\n var list = new nodes.Expression;\n for (var i = start.val; i <= stop.val; i += step.val) {\n list.push(new nodes.Unit(i, start.type));\n }\n return list;\n}\nrange.params = ['start', 'stop', 'step'];\nmodule.exports = range;\n", "var nodes = require('../nodes')\n , rgba = require('./rgba');\n\n/**\n * Return the red component of the given `color`,\n * or set the red component to the optional second `value` argument.\n *\n * Examples:\n *\n * red(#c00)\n * // => 204\n *\n * red(#000, 255)\n * // => #f00\n *\n * @param {RGBA|HSLA} color\n * @param {Unit} [value]\n * @return {Unit|RGBA}\n * @api public\n */\n\nfunction red(color, value){\n color = color.rgba;\n if (value) {\n return rgba(\n value,\n new nodes.Unit(color.g),\n new nodes.Unit(color.b),\n new nodes.Unit(color.a)\n );\n }\n return new nodes.Unit(color.r, '');\n}\nred.params = ['color', 'value'];\nmodule.exports = red;\n", "var utils = require('../utils');\n\n/**\n * Remove the given `key` from the `object`.\n *\n * @param {Object} object\n * @param {String} key\n * @return {Object}\n * @api public\n */\n\nfunction remove(object, key){\n utils.assertType(object, 'object', 'object');\n utils.assertString(key, 'key');\n delete object.vals[key.string];\n return object;\n}\nremove.params = ['object', 'key'];\nmodule.exports = remove;\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Returns string with all matches of `pattern` replaced by `replacement` in given `val`\n *\n * @param {String} pattern\n * @param {String} replacement\n * @param {String|Ident} val\n * @return {String|Ident}\n * @api public\n */\n\nfunction replace(pattern, replacement, val){\n utils.assertString(pattern, 'pattern');\n utils.assertString(replacement, 'replacement');\n utils.assertString(val, 'val');\n pattern = new RegExp(pattern.string, 'g');\n var res = val.string.replace(pattern, replacement.string);\n return val instanceof nodes.Ident\n ? new nodes.Ident(res)\n : new nodes.String(res);\n}\nreplace.params = ['pattern', 'replacement', 'val'];\nmodule.exports = replace;\n", "var utils = require('../utils')\n , nodes = require('../nodes')\n , rgba = require('./rgba');\n\n/**\n * Return a `RGBA` from the r,g,b channels.\n *\n * Examples:\n *\n * rgb(255,204,0)\n * // => #ffcc00\n *\n * rgb(#fff)\n * // => #fff\n *\n * @param {Unit|RGBA|HSLA} red\n * @param {Unit} green\n * @param {Unit} blue\n * @return {RGBA}\n * @api public\n */\n\nfunction rgb(red, green, blue){\n switch (arguments.length) {\n case 1:\n utils.assertColor(red);\n var color = red.rgba;\n return new nodes.RGBA(\n color.r\n , color.g\n , color.b\n , 1);\n default:\n return rgba(\n red\n , green\n , blue\n , new nodes.Unit(1));\n }\n}\nrgb.params = ['red', 'green', 'blue'];\nmodule.exports = rgb;\n", "\n/**\n * Convert given value's base into the parameter unitName\n *\n * @param {Double} value\n * @param {String} unitName\n * @return {Double}\n * @api private\n */\n\nmodule.exports = function convertAngle(value, unitName) {\n\tvar factors = {\n\t\t\"rad\" : 1,\n\t\t\"deg\" : 180 / Math.PI,\n\t\t\"turn\": 0.5 / Math.PI,\n\t\t\"grad\": 200 / Math.PI\n\t}\n\treturn value * factors[unitName];\n}\n", "var nodes = require('../nodes')\n , convert = require('./convert-angle');\n\n/**\n * Return the arctangent of the given `value`.\n *\n * @param {Double} trigValue\n * @param {Unit} output \n * @return {Unit}\n * @api public\n */\n\nmodule.exports = function atan(trigValue, output) {\n\tvar output = typeof output !== 'undefined' ? output : 'deg';\n\tvar value = Math.atan(trigValue) ;\n\tvar m = Math.pow(10, 9);\n\tvar convertedValue = convert(value, output);\n\tconvertedValue = Math.round(convertedValue * m) / m;\n return new nodes.Unit(convertedValue, output);\n};\n", "var nodes = require('../nodes')\n , convert = require('./convert-angle');\n\n/**\n * Return the arcsine of the given `value`.\n *\n * @param {Double} trigValue\n * @param {Unit} output \n * @return {Unit}\n * @api public\n */\n\nmodule.exports = function atan(trigValue, output) {\n\tvar output = typeof output !== 'undefined' ? output : 'deg';\n var m = Math.pow(10, 9);\n\tvar value = Math.asin(trigValue) ;\n\tvar convertedValue = convert(value, output);\n\tconvertedValue = Math.round(convertedValue * m) / m;\n return new nodes.Unit(convertedValue, output);\n};\n", "var nodes = require('../nodes')\n , convert = require('./convert-angle')\n , asin = require('./asin');\n\n/**\n * Return the arccosine of the given `value`.\n *\n * @param {Double} trigValue\n * @param {Unit} output \n * @return {Unit}\n * @api public\n */\nmodule.exports = function acos(trigValue, output) {\n\tvar output = typeof output !== 'undefined' ? output : 'deg';\n\tvar convertedValue = convert(Math.PI / 2, output) - asin(trigValue, output).val;\n\tvar m = Math.pow(10, 9);\n\tconvertedValue = Math.round(convertedValue * m) / m;\n return new nodes.Unit(convertedValue, output);\n};\n", "/*!\n * Stylus - Compiler\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Visitor = require('./')\n , utils = require('../utils')\n , fs = require('fs');\n\n/**\n * Initialize a new `Compiler` with the given `root` Node\n * and the following `options`.\n *\n * Options:\n *\n * - `compress` Compress the CSS output (default: false)\n *\n * @param {Node} root\n * @api public\n */\n\nvar Compiler = module.exports = function Compiler(root, options) {\n options = options || {};\n this.compress = options.compress;\n this.firebug = options.firebug;\n this.linenos = options.linenos;\n this.spaces = options['indent spaces'] || 2;\n this.indents = 1;\n Visitor.call(this, root);\n this.stack = [];\n};\n\n/**\n * Inherit from `Visitor.prototype`.\n */\n\nCompiler.prototype.__proto__ = Visitor.prototype;\n\n/**\n * Compile to css, and return a string of CSS.\n *\n * @return {String}\n * @api private\n */\n\nCompiler.prototype.compile = function(){\n return this.visit(this.root);\n};\n\n/**\n * Output `str`\n *\n * @param {String} str\n * @param {Node} node\n * @return {String}\n * @api private\n */\n\nCompiler.prototype.out = function(str, node){\n return str;\n};\n\n/**\n * Return indentation string.\n *\n * @return {String}\n * @api private\n */\n\nCompiler.prototype.__defineGetter__('indent', function(){\n if (this.compress) return '';\n return new Array(this.indents).join(Array(this.spaces + 1).join(' '));\n});\n\n/**\n * Check if given `node` needs brackets.\n *\n * @param {Node} node\n * @return {Boolean}\n * @api private\n */\n\nCompiler.prototype.needBrackets = function(node){\n return 1 == this.indents\n || 'atrule' != node.nodeName\n || node.hasOnlyProperties;\n};\n\n/**\n * Visit Root.\n */\n\nCompiler.prototype.visitRoot = function(block){\n this.buf = '';\n for (var i = 0, len = block.nodes.length; i < len; ++i) {\n var node = block.nodes[i];\n if (this.linenos || this.firebug) this.debugInfo(node);\n var ret = this.visit(node);\n if (ret) this.buf += this.out(ret + '\\n', node);\n }\n return this.buf;\n};\n\n/**\n * Visit Block.\n */\n\nCompiler.prototype.visitBlock = function(block){\n var node\n , separator = this.compress ? '' : '\\n'\n , needBrackets\n , lastPropertyIndex;\n\n if (block.hasProperties && !block.lacksRenderedSelectors) {\n needBrackets = this.needBrackets(block.node);\n\n if (this.compress) {\n for (var i = block.nodes.length - 1; i >= 0; --i) {\n if (block.nodes[i].nodeName === 'property') {\n lastPropertyIndex = i;\n break;\n }\n }\n }\n if (needBrackets) {\n this.buf += this.out(this.compress ? '{' : ' {\\n');\n ++this.indents;\n }\n for (var i = 0, len = block.nodes.length; i < len; ++i) {\n this.last = lastPropertyIndex === i;\n node = block.nodes[i];\n switch (node.nodeName) {\n case 'null':\n case 'expression':\n case 'function':\n case 'group':\n case 'block':\n case 'unit':\n case 'media':\n case 'keyframes':\n case 'atrule':\n case 'supports':\n continue;\n // inline comments\n case !this.compress && node.inline && 'comment':\n this.buf = this.buf.slice(0, -1);\n this.buf += this.out(' ' + this.visit(node) + '\\n', node);\n break;\n case 'property':\n var ret = this.visit(node) + separator;\n this.buf += this.compress ? ret : this.out(ret, node);\n break;\n default:\n this.buf += this.out(this.visit(node) + separator, node);\n }\n }\n if (needBrackets) {\n --this.indents;\n this.buf += this.out(this.indent + '}' + separator);\n }\n }\n\n // Nesting\n for (var i = 0, len = block.nodes.length; i < len; ++i) {\n node = block.nodes[i];\n switch (node.nodeName) {\n case 'group':\n case 'block':\n case 'keyframes':\n if (this.linenos || this.firebug) this.debugInfo(node);\n this.visit(node);\n break;\n case 'media':\n case 'import':\n case 'atrule':\n case 'supports':\n this.visit(node);\n break;\n case 'comment':\n // only show unsuppressed comments\n if (!node.suppress) {\n this.buf += this.out(this.indent + this.visit(node) + '\\n', node);\n }\n break;\n case 'charset':\n case 'literal':\n case 'namespace':\n this.buf += this.out(this.visit(node) + '\\n', node);\n break;\n }\n }\n};\n\n/**\n * Visit Keyframes.\n */\n\nCompiler.prototype.visitKeyframes = function(node){\n if (!node.frames) return;\n\n var prefix = 'official' == node.prefix\n ? ''\n : '-' + node.prefix + '-';\n\n this.buf += this.out('@' + prefix + 'keyframes '\n + this.visit(node.val)\n + (this.compress ? '{' : ' {\\n'), node);\n\n this.keyframe = true;\n ++this.indents;\n this.visit(node.block);\n --this.indents;\n this.keyframe = false;\n\n this.buf += this.out('}' + (this.compress ? '' : '\\n'));\n};\n\n/**\n * Visit Media.\n */\n\nCompiler.prototype.visitMedia = function(media){\n var val = media.val;\n if (!media.hasOutput || !val.nodes.length) return;\n\n this.buf += this.out('@media ', media);\n this.visit(val);\n this.buf += this.out(this.compress ? '{' : ' {\\n');\n ++this.indents;\n this.visit(media.block);\n --this.indents;\n this.buf += this.out('}' + (this.compress ? '' : '\\n'));\n};\n\n/**\n * Visit QueryList.\n */\n\nCompiler.prototype.visitQueryList = function(queries){\n for (var i = 0, len = queries.nodes.length; i < len; ++i) {\n this.visit(queries.nodes[i]);\n if (len - 1 != i) this.buf += this.out(',' + (this.compress ? '' : ' '));\n }\n};\n\n/**\n * Visit Query.\n */\n\nCompiler.prototype.visitQuery = function(node){\n var len = node.nodes.length;\n if (node.predicate) this.buf += this.out(node.predicate + ' ');\n if (node.type) this.buf += this.out(node.type + (len ? ' and ' : ''));\n for (var i = 0; i < len; ++i) {\n this.buf += this.out(this.visit(node.nodes[i]));\n if (len - 1 != i) this.buf += this.out(' and ');\n }\n};\n\n/**\n * Visit Feature.\n */\n\nCompiler.prototype.visitFeature = function(node){\n if (!node.expr) {\n return node.name;\n } else if (node.expr.isEmpty) {\n return '(' + node.name + ')';\n } else {\n return '(' + node.name + ':' + (this.compress ? '' : ' ') + this.visit(node.expr) + ')';\n }\n};\n\n/**\n * Visit Import.\n */\n\nCompiler.prototype.visitImport = function(imported){\n this.buf += this.out('@import ' + this.visit(imported.path) + ';\\n', imported);\n};\n\n/**\n * Visit Atrule.\n */\n\nCompiler.prototype.visitAtrule = function(atrule){\n var newline = this.compress ? '' : '\\n';\n\n this.buf += this.out(this.indent + '@' + atrule.type, atrule);\n\n if (atrule.val) this.buf += this.out(' ' + atrule.val.trim());\n\n if (atrule.block) {\n if (atrule.block.isEmpty) {\n this.buf += this.out((this.compress ? '' : ' ') + '{}' + newline);\n } else if (atrule.hasOnlyProperties) {\n this.visit(atrule.block);\n } else {\n this.buf += this.out(this.compress ? '{' : ' {\\n');\n ++this.indents;\n this.visit(atrule.block);\n --this.indents;\n this.buf += this.out(this.indent + '}' + newline);\n }\n } else {\n this.buf += this.out(';' + newline);\n }\n};\n\n/**\n * Visit Supports.\n */\n\nCompiler.prototype.visitSupports = function(node){\n if (!node.hasOutput) return;\n\n this.buf += this.out(this.indent + '@supports ', node);\n this.isCondition = true;\n this.buf += this.out(this.visit(node.condition));\n this.isCondition = false;\n this.buf += this.out(this.compress ? '{' : ' {\\n');\n ++this.indents;\n this.visit(node.block);\n --this.indents;\n this.buf += this.out(this.indent + '}' + (this.compress ? '' : '\\n'));\n},\n\n/**\n * Visit Comment.\n */\n\nCompiler.prototype.visitComment = function(comment){\n return this.compress\n ? comment.suppress\n ? ''\n : comment.str\n : comment.str;\n};\n\n/**\n * Visit Function.\n */\n\nCompiler.prototype.visitFunction = function(fn){\n return fn.name;\n};\n\n/**\n * Visit Charset.\n */\n\nCompiler.prototype.visitCharset = function(charset){\n return '@charset ' + this.visit(charset.val) + ';';\n};\n\n/**\n * Visit Namespace.\n */\n\nCompiler.prototype.visitNamespace = function(namespace){\n return '@namespace '\n + (namespace.prefix ? this.visit(namespace.prefix) + ' ' : '')\n + this.visit(namespace.val) + ';';\n};\n\n/**\n * Visit Literal.\n */\n\nCompiler.prototype.visitLiteral = function(lit){\n var val = lit.val;\n if (lit.css) val = val.replace(/^ /gm, '');\n return val;\n};\n\n/**\n * Visit Boolean.\n */\n\nCompiler.prototype.visitBoolean = function(bool){\n return bool.toString();\n};\n\n/**\n * Visit RGBA.\n */\n\nCompiler.prototype.visitRGBA = function(rgba){\n return rgba.toString();\n};\n\n/**\n * Visit HSLA.\n */\n\nCompiler.prototype.visitHSLA = function(hsla){\n return hsla.rgba.toString();\n};\n\n/**\n * Visit Unit.\n */\n\nCompiler.prototype.visitUnit = function(unit){\n var type = unit.type || ''\n , n = unit.val\n , float = n != (n | 0);\n\n // Compress\n if (this.compress) {\n // Always return '0' unless the unit is a percentage, time, degree or fraction\n if (!(['%', 's', 'ms', 'deg', 'fr'].includes(type)) && 0 == n) return '0';\n // Omit leading '0' on floats\n if (float && n < 1 && n > -1) {\n return n.toString().replace('0.', '.') + type;\n }\n }\n\n return (float ? parseFloat(n.toFixed(15)) : n).toString() + type;\n};\n\n/**\n * Visit Group.\n */\n\nCompiler.prototype.visitGroup = function(group){\n var stack = this.keyframe ? [] : this.stack\n , comma = this.compress ? ',' : ',\\n';\n\n stack.push(group.nodes);\n\n // selectors\n if (group.block.hasProperties) {\n var selectors = utils.compileSelectors.call(this, stack)\n , len = selectors.length;\n\n if (len) {\n if (this.keyframe) comma = this.compress ? ',' : ', ';\n\n for (var i = 0; i < len; ++i) {\n var selector = selectors[i]\n , last = (i == len - 1);\n\n // keyframe blocks (10%, 20% { ... })\n if (this.keyframe) selector = i ? selector.trim() : selector;\n\n this.buf += this.out(selector + (last ? '' : comma), group.nodes[i]);\n }\n } else {\n group.block.lacksRenderedSelectors = true;\n }\n }\n\n // output block\n this.visit(group.block);\n stack.pop();\n};\n\n/**\n * Visit Ident.\n */\n\nCompiler.prototype.visitIdent = function(ident){\n return ident.name;\n};\n\n/**\n * Visit String.\n */\n\nCompiler.prototype.visitString = function(string){\n return this.isURL\n ? string.val\n : string.toString();\n};\n\n/**\n * Visit Null.\n */\n\nCompiler.prototype.visitNull = function(node){\n return '';\n};\n\n/**\n * Visit Call.\n */\n\nCompiler.prototype.visitCall = function(call){\n this.isURL = 'url' == call.name;\n var args = call.args.nodes.map(function(arg){\n return this.visit(arg);\n }, this).join(this.compress ? ',' : ', ');\n if (this.isURL) args = '\"' + args + '\"';\n this.isURL = false;\n return call.name + '(' + args + ')';\n};\n\n/**\n * Visit Expression.\n */\n\nCompiler.prototype.visitExpression = function(expr){\n var buf = []\n , self = this\n , len = expr.nodes.length\n , nodes = expr.nodes.map(function(node){ return self.visit(node); });\n\n nodes.forEach(function(node, i){\n var last = i == len - 1;\n buf.push(node);\n if ('/' == nodes[i + 1] || '/' == node) return;\n if (last) return;\n\n var space = self.isURL || (self.isCondition\n && (')' == nodes[i + 1] || '(' == node))\n ? '' : ' ';\n\n buf.push(expr.isList\n ? (self.compress ? ',' : ', ')\n : space);\n });\n\n return buf.join('');\n};\n\n/**\n * Visit Arguments.\n */\n\nCompiler.prototype.visitArguments = Compiler.prototype.visitExpression;\n\n/**\n * Visit Property.\n */\n\nCompiler.prototype.visitProperty = function(prop){\n var val = this.visit(prop.expr).trim()\n , name = (prop.name || prop.segments.join(''))\n , arr = [];\n\n if (name === '@apply') {\n arr.push(\n this.out(this.indent),\n this.out(name + ' ', prop),\n this.out(val, prop.expr),\n this.out(this.compress ? (this.last ? '' : ';') : ';')\n );\n return arr.join('');\n }\n arr.push(\n this.out(this.indent),\n this.out(name + (this.compress ? ':' : ': '), prop),\n this.out(val, prop.expr),\n this.out(this.compress ? (this.last ? '' : ';') : ';')\n );\n return arr.join('');\n};\n\n/**\n * Debug info.\n */\n\nCompiler.prototype.debugInfo = function(node){\n\n var path = node.filename == 'stdin' ? 'stdin' : fs.realpathSync(node.filename)\n , line = (node.nodes && node.nodes.length ? node.nodes[0].lineno : node.lineno) || 1;\n\n if (this.linenos){\n this.buf += '\\n/* ' + 'line ' + line + ' : ' + path + ' */\\n';\n }\n\n if (this.firebug){\n // debug info for firebug, the crazy formatting is needed\n path = 'file\\\\\\:\\\\\\/\\\\\\/' + path.replace(/([.:/\\\\])/g, function(m) {\n return '\\\\' + (m === '\\\\' ? '\\/' : m)\n });\n line = '\\\\00003' + line;\n this.buf += '\\n@media -stylus-debug-info'\n + '{filename{font-family:' + path\n + '}line{font-family:' + line + '}}\\n';\n }\n}\n", "var utils = require('../utils')\n , nodes = require('../nodes')\n , Compiler = require('../visitor/compiler');\n\n/**\n * Return a `Literal` with the given `fmt`, and\n * variable number of arguments.\n *\n * @param {String} fmt\n * @param {Node} ...\n * @return {Literal}\n * @api public\n */\n\n(module.exports = function s(fmt){\n fmt = utils.unwrap(fmt).nodes[0];\n utils.assertString(fmt);\n var self = this\n , str = fmt.string\n , args = arguments\n , i = 1;\n\n // format\n str = str.replace(/%(s|d)/g, function(_, specifier){\n var arg = args[i++] || nodes.null;\n switch (specifier) {\n case 's':\n return new Compiler(arg, self.options).compile();\n case 'd':\n arg = utils.unwrap(arg).first;\n if ('unit' != arg.nodeName) throw new Error('%d requires a unit');\n return arg.val;\n }\n });\n\n return new nodes.Literal(str);\n}).raw = true;\n", "var nodes = require('../nodes')\n , hsla = require('./hsla')\n , component = require('./component');\n\n/**\n * Return the saturation component of the given `color`,\n * or set the saturation component to the optional second `value` argument.\n *\n * Examples:\n *\n * saturation(#00c)\n * // => 100%\n *\n * saturation(#00c, 50%)\n * // => #339\n *\n * @param {RGBA|HSLA} color\n * @param {Unit} [value]\n * @return {Unit|RGBA}\n * @api public\n */\n\nfunction saturation(color, value){\n if (value) {\n var hslaColor = color.hsla;\n return hsla(\n new nodes.Unit(hslaColor.h),\n value,\n new nodes.Unit(hslaColor.l),\n new nodes.Unit(hslaColor.a)\n )\n }\n return component(color, new nodes.String('saturation'));\n}\nsaturation.params = ['color', 'value'];\nmodule.exports = saturation;\n", "\n/*!\n * Stylus - Normalizer\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Visitor = require('./')\n , nodes = require('../nodes')\n , utils = require('../utils');\n\n/**\n * Initialize a new `Normalizer` with the given `root` Node.\n *\n * This visitor implements the first stage of the duel-stage\n * compiler, tasked with stripping the \"garbage\" from\n * the evaluated nodes, ditching null rules, resolving\n * ruleset selectors etc. This step performs the logic\n * necessary to facilitate the \"@extend\" functionality,\n * as these must be resolved _before_ buffering output.\n *\n * @param {Node} root\n * @api public\n */\n\nvar Normalizer = module.exports = function Normalizer(root, options) {\n options = options || {};\n Visitor.call(this, root);\n this.hoist = options['hoist atrules'];\n this.stack = [];\n this.map = {};\n this.imports = [];\n};\n\n/**\n * Inherit from `Visitor.prototype`.\n */\n\nNormalizer.prototype.__proto__ = Visitor.prototype;\n\n/**\n * Normalize the node tree.\n *\n * @return {Node}\n * @api private\n */\n\nNormalizer.prototype.normalize = function(){\n var ret = this.visit(this.root);\n\n if (this.hoist) {\n // hoist @import\n if (this.imports.length) ret.nodes = this.imports.concat(ret.nodes);\n\n // hoist @charset\n if (this.charset) ret.nodes = [this.charset].concat(ret.nodes);\n }\n\n return ret;\n};\n\n/**\n * Bubble up the given `node`.\n *\n * @param {Node} node\n * @api private\n */\n\nNormalizer.prototype.bubble = function(node){\n var props = []\n , other = []\n , self = this;\n\n function filterProps(block) {\n block.nodes.forEach(function(node) {\n node = self.visit(node);\n\n switch (node.nodeName) {\n case 'property':\n props.push(node);\n break;\n case 'block':\n filterProps(node);\n break;\n default:\n other.push(node);\n }\n });\n }\n\n filterProps(node.block);\n\n if (props.length) {\n var selector = new nodes.Selector([new nodes.Literal('&')]);\n selector.lineno = node.lineno;\n selector.column = node.column;\n selector.filename = node.filename;\n selector.val = '&';\n\n var group = new nodes.Group;\n group.lineno = node.lineno;\n group.column = node.column;\n group.filename = node.filename;\n\n var block = new nodes.Block(node.block, group);\n block.lineno = node.lineno;\n block.column = node.column;\n block.filename = node.filename;\n\n props.forEach(function(prop){\n block.push(prop);\n });\n\n group.push(selector);\n group.block = block;\n\n node.block.nodes = [];\n node.block.push(group);\n other.forEach(function(n){\n node.block.push(n);\n });\n\n var group = this.closestGroup(node.block);\n if (group) node.group = group.clone();\n\n node.bubbled = true;\n }\n};\n\n/**\n * Return group closest to the given `block`.\n *\n * @param {Block} block\n * @return {Group}\n * @api private\n */\n\nNormalizer.prototype.closestGroup = function(block){\n var parent = block.parent\n , node;\n while (parent && (node = parent.node)) {\n if ('group' == node.nodeName) return node;\n parent = node.block && node.block.parent;\n }\n};\n\n/**\n * Visit Root.\n */\n\nNormalizer.prototype.visitRoot = function(block){\n var ret = new nodes.Root\n , node;\n\n for (var i = 0; i < block.nodes.length; ++i) {\n node = block.nodes[i];\n switch (node.nodeName) {\n case 'null':\n case 'expression':\n case 'function':\n case 'unit':\n case 'atblock':\n continue;\n default:\n this.rootIndex = i;\n ret.push(this.visit(node));\n }\n }\n\n return ret;\n};\n\n/**\n * Visit Property.\n */\n\nNormalizer.prototype.visitProperty = function(prop){\n this.visit(prop.expr);\n return prop;\n};\n\n/**\n * Visit Expression.\n */\n\nNormalizer.prototype.visitExpression = function(expr){\n expr.nodes = expr.nodes.map(function(node){\n // returns `block` literal if mixin's block\n // is used as part of a property value\n if ('block' == node.nodeName) {\n var literal = new nodes.Literal('block');\n literal.lineno = expr.lineno;\n literal.column = expr.column;\n return literal;\n }\n return node;\n });\n return expr;\n};\n\n/**\n * Visit Block.\n */\n\nNormalizer.prototype.visitBlock = function(block){\n var node;\n\n if (block.hasProperties) {\n for (var i = 0, len = block.nodes.length; i < len; ++i) {\n node = block.nodes[i];\n switch (node.nodeName) {\n case 'null':\n case 'expression':\n case 'function':\n case 'group':\n case 'unit':\n case 'atblock':\n continue;\n default:\n block.nodes[i] = this.visit(node);\n }\n }\n }\n\n // nesting\n for (var i = 0, len = block.nodes.length; i < len; ++i) {\n node = block.nodes[i];\n block.nodes[i] = this.visit(node);\n }\n\n return block;\n};\n\n/**\n * Visit Group.\n */\n\nNormalizer.prototype.visitGroup = function(group){\n var stack = this.stack\n , map = this.map\n , parts;\n\n // normalize interpolated selectors with comma\n group.nodes.forEach(function(selector, i){\n if (!~selector.val.indexOf(',')) return;\n if (~selector.val.indexOf('\\\\,')) {\n selector.val = selector.val.replace(/\\\\,/g, ',');\n return;\n }\n parts = selector.val.split(',');\n var root = '/' == selector.val.charAt(0)\n , part, s;\n for (var k = 0, len = parts.length; k < len; ++k){\n part = parts[k].trim();\n if (root && k > 0 && !~part.indexOf('&')) {\n part = '/' + part;\n }\n s = new nodes.Selector([new nodes.Literal(part)]);\n s.val = part;\n s.block = group.block;\n group.nodes[i++] = s;\n }\n });\n stack.push(group.nodes);\n\n var selectors = utils.compileSelectors(stack, true);\n\n // map for extension lookup\n selectors.forEach(function(selector){\n map[selector] = map[selector] || [];\n map[selector].push(group);\n });\n\n // extensions\n this.extend(group, selectors);\n\n stack.pop();\n return group;\n};\n\n/**\n * Visit Function.\n */\n\nNormalizer.prototype.visitFunction = function(){\n return nodes.null;\n};\n\n/**\n * Visit Media.\n */\n\nNormalizer.prototype.visitMedia = function(media){\n var medias = []\n , group = this.closestGroup(media.block)\n , parent;\n\n function mergeQueries(block) {\n block.nodes.forEach(function(node, i){\n switch (node.nodeName) {\n case 'media':\n node.val = media.val.merge(node.val);\n medias.push(node);\n block.nodes[i] = nodes.null;\n break;\n case 'block':\n mergeQueries(node);\n break;\n default:\n if (node.block && node.block.nodes)\n mergeQueries(node.block);\n }\n });\n }\n\n mergeQueries(media.block);\n this.bubble(media);\n\n if (medias.length) {\n medias.forEach(function(node){\n if (group) {\n group.block.push(node);\n } else {\n this.root.nodes.splice(++this.rootIndex, 0, node);\n }\n node = this.visit(node);\n parent = node.block.parent;\n if (node.bubbled && (!group || 'group' == parent.node.nodeName)) {\n node.group.block = node.block.nodes[0].block;\n node.block.nodes[0] = node.group;\n }\n }, this);\n }\n return media;\n};\n\n/**\n * Visit Supports.\n */\n\nNormalizer.prototype.visitSupports = function(node){\n this.bubble(node);\n return node;\n};\n\n/**\n * Visit Atrule.\n */\n\nNormalizer.prototype.visitAtrule = function(node){\n if (node.block) node.block = this.visit(node.block);\n return node;\n};\n\n/**\n * Visit Keyframes.\n */\n\nNormalizer.prototype.visitKeyframes = function(node){\n var frames = node.block.nodes.filter(function(frame){\n return frame.block && frame.block.hasProperties;\n });\n node.frames = frames.length;\n return node;\n};\n\n/**\n * Visit Import.\n */\n\nNormalizer.prototype.visitImport = function(node){\n this.imports.push(node);\n return this.hoist ? nodes.null : node;\n};\n\n/**\n * Visit Charset.\n */\n\nNormalizer.prototype.visitCharset = function(node){\n this.charset = node;\n return this.hoist ? nodes.null : node;\n};\n\n/**\n * Apply `group` extensions.\n *\n * @param {Group} group\n * @param {Array} selectors\n * @api private\n */\n\nNormalizer.prototype.extend = function(group, selectors){\n var map = this.map\n , self = this\n , parent = this.closestGroup(group.block);\n\n group.extends.forEach(function(extend){\n var groups = map[extend.selector];\n if (!groups) {\n if (extend.optional) return;\n groups = self._checkForPrefixedGroups(extend.selector);\n if(!groups) {\n var err = new Error('Failed to @extend \"' + extend.selector + '\"');\n err.lineno = extend.lineno;\n err.column = extend.column;\n throw err;\n }\n }\n selectors.forEach(function(selector){\n var node = new nodes.Selector;\n node.val = selector;\n node.inherits = false;\n groups.forEach(function(group){\n // prevent recursive extend\n if (!parent || (parent != group)) self.extend(group, selectors);\n group.push(node);\n });\n });\n });\n\n group.block = this.visit(group.block);\n};\n\nNormalizer.prototype._checkForPrefixedGroups = function (selector) {\n var prefix = [];\n var map = this.map;\n var result = null;\n for (var i = 0; i < this.stack.length; i++) {\n var stackElementArray=this.stack[i];\n var stackElement = stackElementArray[0];\n prefix.push(stackElement.val);\n var fullSelector = prefix.join(\" \") + \" \" + selector;\n result = map[fullSelector];\n if (result)\n break;\n }\n return result;\n};", "var utils = require('../utils');\n\n/**\n * Returns true if the given selector exists.\n *\n * @param {String} sel\n * @return {Boolean}\n * @api public\n */\n\nfunction selectorExists(sel) {\n utils.assertString(sel, 'selector');\n\n if (!this.__selectorsMap__) {\n var Normalizer = require('../visitor/normalizer')\n , visitor = new Normalizer(this.root.clone());\n visitor.visit(visitor.root);\n\n this.__selectorsMap__ = visitor.map;\n }\n\n return sel.string in this.__selectorsMap__;\n}\nselectorExists.params = ['sel'];\nmodule.exports = selectorExists;\n", "var utils = require('../utils');\n\n/**\n * Return the current selector or compile\n * selector from a string or a list.\n *\n * @param {String|Expression}\n * @return {String}\n * @api public\n */\n\n(module.exports = function selector(){\n var stack = this.selectorStack\n , args = [].slice.call(arguments);\n\n if (1 == args.length) {\n var expr = utils.unwrap(args[0])\n , len = expr.nodes.length;\n\n // selector('.a')\n if (1 == len) {\n utils.assertString(expr.first, 'selector');\n var SelectorParser = require('../selector-parser')\n , val = expr.first.string\n , parsed = new SelectorParser(val).parse().val;\n\n if (parsed == val) return val;\n\n stack.push(parse(val));\n } else if (len > 1) {\n // selector-list = '.a', '.b', '.c'\n // selector(selector-list)\n if (expr.isList) {\n pushToStack(expr.nodes, stack);\n // selector('.a' '.b' '.c')\n } else {\n stack.push(parse(expr.nodes.map(function(node){\n utils.assertString(node, 'selector');\n return node.string;\n }).join(' ')));\n }\n }\n // selector('.a', '.b', '.c')\n } else if (args.length > 1) {\n pushToStack(args, stack);\n }\n\n return stack.length ? utils.compileSelectors(stack).join(',') : '&';\n}).raw = true;\n\nfunction pushToStack(selectors, stack) {\n selectors.forEach(function(sel) {\n sel = sel.first;\n utils.assertString(sel, 'selector');\n stack.push(parse(sel.string));\n });\n}\n\nfunction parse(selector) {\n var Parser = new require('../parser')\n , parser = new Parser(selector)\n , nodes;\n parser.state.push('selector-parts');\n nodes = parser.selector();\n nodes.forEach(function(node) {\n node.val = node.segments.map(function(seg){\n return seg.toString();\n }).join('');\n });\n return nodes;\n}\n", "var nodes = require('../nodes')\n , Parser = require('../selector-parser');\n\n/**\n * Return a list with raw selectors parts\n * of the current group.\n *\n * For example:\n *\n * .a, .b\n * .c\n * .d\n * test: selectors() // => '.a,.b', '& .c', '& .d'\n *\n * @return {Expression}\n * @api public\n */\n\nmodule.exports = function selectors(){\n var stack = this.selectorStack\n , expr = new nodes.Expression(true);\n\n if (stack.length) {\n for (var i = 0; i < stack.length; i++) {\n var group = stack[i]\n , nested;\n\n if (group.length > 1) {\n expr.push(new nodes.String(group.map(function(selector) {\n nested = new Parser(selector.val).parse().nested;\n return (nested && i ? '& ' : '') + selector.val;\n }).join(',')))\n } else {\n var selector = group[0].val\n nested = new Parser(selector).parse().nested;\n expr.push(new nodes.String((nested && i ? '& ' : '') + selector));\n }\n }\n } else {\n expr.push(new nodes.String('&'));\n }\n return expr;\n};\n", "var utils = require('../utils');\n\n/**\n * Shift an element from `expr`.\n *\n * @param {Expression} expr\n * @return {Node}\n * @api public\n */\n\n (module.exports = function(expr){\n expr = utils.unwrap(expr);\n return expr.nodes.shift();\n }).raw = true;\n\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Splits the given `val` by `delim`\n *\n * @param {String} delim\n * @param {String|Ident} val\n * @return {Expression}\n * @api public\n */\n\nfunction split(delim, val){\n utils.assertString(delim, 'delimiter');\n utils.assertString(val, 'val');\n var splitted = val.string.split(delim.string);\n var expr = new nodes.Expression();\n var ItemNode = val instanceof nodes.Ident\n ? nodes.Ident\n : nodes.String;\n for (var i = 0, len = splitted.length; i < len; ++i) {\n expr.nodes.push(new ItemNode(splitted[i]));\n }\n return expr;\n}\nsplit.params = ['delim', 'val'];\nmodule.exports = split;\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Returns substring of the given `val`.\n *\n * @param {String|Ident} val\n * @param {Number} start\n * @param {Number} [length]\n * @return {String|Ident}\n * @api public\n */\n\nfunction substr(val, start, length){\n utils.assertString(val, 'val');\n utils.assertType(start, 'unit', 'start');\n length = length && length.val;\n var res = val.string.substr(start.val, length);\n return val instanceof nodes.Ident\n ? new nodes.Ident(res)\n : new nodes.String(res);\n}\nsubstr.params = ['val', 'start', 'length'];\nmodule.exports = substr;\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * This is a helper function for the slice method\n *\n * @param {String|Ident} vals\n * @param {Unit} start [0]\n * @param {Unit} end [vals.length]\n * @return {String|Literal|Null}\n * @api public\n*/\n(module.exports = function slice(val, start, end) {\n start = start && start.nodes[0].val;\n end = end && end.nodes[0].val;\n\n val = utils.unwrap(val).nodes;\n\n if (val.length > 1) {\n return utils.coerce(val.slice(start, end), true);\n }\n\n var result = val[0].string.slice(start, end);\n\n return val[0] instanceof nodes.Ident\n ? new nodes.Ident(result)\n : new nodes.String(result);\n}).raw = true;\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Return the tangent of the given `angle`.\n *\n * @param {Unit} angle\n * @return {Unit}\n * @api public\n */\n\nfunction tan(angle) {\n utils.assertType(angle, 'unit', 'angle');\n\n var radians = angle.val;\n\n if (angle.type === 'deg') {\n radians *= Math.PI / 180;\n }\n\n var m = Math.pow(10, 9);\n\n var sin = Math.round(Math.sin(radians) * m) / m\n , cos = Math.round(Math.cos(radians) * m) / m\n , tan = Math.round(m * sin / cos ) / m;\n\n return new nodes.Unit(tan, '');\n}\ntan.params = ['angle'];\nmodule.exports = tan;\n", "var nodes = require('../nodes');\n\n/**\n * Output stack trace.\n *\n * @api public\n */\n\nmodule.exports = function trace(){\n console.log(this.stack);\n return nodes.null;\n};\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Returns the transparent version of the given `top` color,\n * as if it was blend over the given `bottom` color.\n *\n * Examples:\n *\n * transparentify(#808080)\n * => rgba(0,0,0,0.5)\n *\n * transparentify(#414141, #000)\n * => rgba(255,255,255,0.25)\n *\n * transparentify(#91974C, #F34949, 0.5)\n * => rgba(47,229,79,0.5)\n *\n * @param {RGBA|HSLA} top\n * @param {RGBA|HSLA} [bottom=#fff]\n * @param {Unit} [alpha]\n * @return {RGBA}\n * @api public\n */\n\nfunction transparentify(top, bottom, alpha){\n utils.assertColor(top);\n top = top.rgba;\n // Handle default arguments\n bottom = bottom || new nodes.RGBA(255, 255, 255, 1);\n if (!alpha && bottom && !bottom.rgba) {\n alpha = bottom;\n bottom = new nodes.RGBA(255, 255, 255, 1);\n }\n utils.assertColor(bottom);\n bottom = bottom.rgba;\n var bestAlpha = ['r', 'g', 'b'].map(function(channel){\n return (top[channel] - bottom[channel]) / ((0 < (top[channel] - bottom[channel]) ? 255 : 0) - bottom[channel]);\n }).sort(function(a, b){return b - a;})[0];\n if (alpha) {\n utils.assertType(alpha, 'unit', 'alpha');\n if ('%' == alpha.type) {\n bestAlpha = alpha.val / 100;\n } else if (!alpha.type) {\n bestAlpha = alpha = alpha.val;\n }\n }\n bestAlpha = Math.max(Math.min(bestAlpha, 1), 0);\n // Calculate the resulting color\n function processChannel(channel) {\n if (0 == bestAlpha) {\n return bottom[channel]\n } else {\n return bottom[channel] + (top[channel] - bottom[channel]) / bestAlpha\n }\n }\n return new nodes.RGBA(\n processChannel('r'),\n processChannel('g'),\n processChannel('b'),\n Math.round(bestAlpha * 100) / 100\n );\n}\ntransparentify.params = ['top', 'bottom', 'alpha'];\nmodule.exports = transparentify;\n", "var utils = require('../utils');\n\n/**\n * Return type of `node`.\n *\n * Examples:\n * \n * type(12)\n * // => 'unit'\n *\n * type(#fff)\n * // => 'color'\n *\n * type(type)\n * // => 'function'\n *\n * type(unbound)\n * typeof(unbound)\n * type-of(unbound)\n * // => 'ident'\n *\n * @param {Node} node\n * @return {String}\n * @api public\n */\n\nfunction type(node){\n utils.assertPresent(node, 'expression');\n return node.nodeName;\n}\ntype.params = ['node'];\nmodule.exports = type;\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Assign `type` to the given `unit` or return `unit`'s type.\n *\n * @param {Unit} unit\n * @param {String|Ident} type\n * @return {Unit}\n * @api public\n */\n\nfunction unit(unit, type){\n utils.assertType(unit, 'unit', 'unit');\n\n // Assign\n if (type) {\n utils.assertString(type, 'type');\n return new nodes.Unit(unit.val, type.string);\n } else {\n return unit.type || '';\n }\n}\nunit.params = ['unit', 'type'];\nmodule.exports = unit;\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Unquote the given `string`.\n *\n * Examples:\n *\n * unquote(\"sans-serif\")\n * // => sans-serif\n *\n * unquote(sans-serif)\n * // => sans-serif\n *\n * @param {String|Ident} string\n * @return {Literal}\n * @api public\n */\n\nfunction unquote(string){\n utils.assertString(string, 'string');\n return new nodes.Literal(string.string);\n}\nunquote.params = ['string'];\nmodule.exports = unquote;\n", "var utils = require('../utils');\n\n/**\n * Unshift the given args to `expr`.\n *\n * @param {Expression} expr\n * @param {Node} ...\n * @return {Unit}\n * @api public\n */\n\n(module.exports = function(expr){\n expr = utils.unwrap(expr);\n for (var i = 1, len = arguments.length; i < len; ++i) {\n expr.nodes.unshift(utils.unwrap(arguments[i]));\n }\n return expr.nodes.length;\n}).raw = true;\n", "var utils = require('../utils')\n , path = require('path');\n\n/**\n* Use the given `plugin`\n* \n* Examples:\n*\n* use(\"plugins/add.js\")\n*\n* width add(10, 100)\n* // => width: 110\n*/\n\nfunction use(plugin, options){\n utils.assertString(plugin, 'plugin');\n\n if (options) {\n utils.assertType(options, 'object', 'options');\n options = parseObject(options);\n }\n\n // lookup\n plugin = plugin.string;\n var found = utils.lookup(plugin, this.options.paths, this.options.filename);\n if (!found) throw new Error('failed to locate plugin file \"' + plugin + '\"');\n\n // use\n var fn = require(path.resolve(found));\n if ('function' != typeof fn) {\n throw new Error('plugin \"' + plugin + '\" does not export a function');\n }\n this.renderer.use(fn(options || this.options));\n}\nuse.params = ['plugin', 'options'];\nmodule.exports = use;\n\n/**\n * Attempt to parse object node to the javascript object.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction parseObject(obj){\n obj = obj.vals;\n for (var key in obj) {\n var nodes = obj[key].nodes[0].nodes;\n if (nodes && nodes.length) {\n obj[key] = [];\n for (var i = 0, len = nodes.length; i < len; ++i) {\n obj[key].push(convert(nodes[i]));\n }\n } else {\n obj[key] = convert(obj[key].first);\n }\n }\n return obj;\n\n function convert(node){\n switch (node.nodeName) {\n case 'object':\n return parseObject(node);\n case 'boolean':\n return node.isTrue;\n case 'unit':\n return node.type ? node.toString() : +node.val;\n case 'string':\n case 'literal':\n return node.val;\n default:\n return node.toString();\n }\n }\n}\n", "var utils = require('../utils')\n , nodes = require('../nodes');\n\n/**\n * Warn with the given `msg` prefixed by \"Warning: \".\n *\n * @param {String} msg\n * @api public\n */\n\nfunction warn(msg){\n utils.assertType(msg, 'string', 'msg');\n console.warn('Warning: %s', msg.val);\n return nodes.null;\n}\nwarn.params = ['msg'];\nmodule.exports = warn;\n", "var nodes = require('../nodes');\n\n/**\n * Get Math `prop`.\n *\n * @param {String} prop\n * @return {Unit}\n * @api private\n */\n\nfunction math(prop){\n return new nodes.Unit(Math[prop.string]);\n}\nmath.params = ['prop'];\nmodule.exports = math;\n", "var utils = require('../utils');\n\n/**\n * Prefix css classes in a block\n *\n * @param {String} prefix\n * @param {Block} block\n * @return {Block}\n * @api private\n */\n\nfunction prefixClasses(prefix, block){\n utils.assertString(prefix, 'prefix');\n utils.assertType(block, 'block', 'block');\n\n var _prefix = this.prefix;\n\n this.options.prefix = this.prefix = prefix.string;\n block = this.visit(block);\n this.options.prefix = this.prefix = _prefix;\n return block;\n}\nprefixClasses.params = ['prefix', 'block'];\nmodule.exports = prefixClasses;\n", "\n/*!\n * Stylus - Evaluator - built-in functions\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\nexports['add-property'] = require('./add-property');\nexports.adjust = require('./adjust');\nexports.alpha = require('./alpha');\nexports['base-convert'] = require('./base-convert');\nexports.basename = require('./basename');\nexports.blend = require('./blend');\nexports.blue = require('./blue');\nexports.clone = require('./clone');\nexports.component = require('./component');\nexports.contrast = require('./contrast');\nexports.convert = require('./convert');\nexports['current-media'] = require('./current-media');\nexports.define = require('./define');\nexports.dirname = require('./dirname');\nexports.error = require('./error');\nexports.extname = require('./extname');\nexports.green = require('./green');\nexports.hsl = require('./hsl');\nexports.hsla = require('./hsla');\nexports.hue = require('./hue');\nexports['image-size'] = require('./image-size');\nexports.json = require('./json');\nexports.length = require('./length');\nexports.lightness = require('./lightness');\nexports['list-separator'] = require('./list-separator');\nexports.lookup = require('./lookup');\nexports.luminosity = require('./luminosity');\nexports.match = require('./match');\nexports.math = require('./math');\nexports.merge = exports.extend = require('./merge');\nexports.operate = require('./operate');\nexports['opposite-position'] = require('./opposite-position');\nexports.p = require('./p');\nexports.pathjoin = require('./pathjoin');\nexports.pop = require('./pop');\nexports.push = exports.append = require('./push');\nexports.range = require('./range');\nexports.red = require('./red');\nexports.remove = require('./remove');\nexports.replace = require('./replace');\nexports.rgb = require('./rgb');\nexports.atan = require('./atan');\nexports.asin = require('./asin');\nexports.acos = require('./acos');\nexports.rgba = require('./rgba');\nexports.s = require('./s');\nexports.saturation = require('./saturation');\nexports['selector-exists'] = require('./selector-exists');\nexports.selector = require('./selector');\nexports.selectors = require('./selectors');\nexports.shift = require('./shift');\nexports.split = require('./split');\nexports.substr = require('./substr');\nexports.slice = require('./slice');\nexports.tan = require('./tan');\nexports.trace = require('./trace');\nexports.transparentify = require('./transparentify');\nexports.type = exports.typeof = exports['type-of'] = require('./type');\nexports.unit = require('./unit');\nexports.unquote = require('./unquote');\nexports.unshift = exports.prepend = require('./unshift');\nexports.use = require('./use');\nexports.warn = require('./warn');\nexports['-math-prop'] = require('./math-prop');\nexports['-prefix-classes'] = require('./prefix-classes');\n", "\n/*!\n * Stylus - colors\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\nmodule.exports = {\n aliceblue: [240, 248, 255, 1]\n , antiquewhite: [250, 235, 215, 1]\n , aqua: [0, 255, 255, 1]\n , aquamarine: [127, 255, 212, 1]\n , azure: [240, 255, 255, 1]\n , beige: [245, 245, 220, 1]\n , bisque: [255, 228, 196, 1]\n , black: [0, 0, 0, 1]\n , blanchedalmond: [255, 235, 205, 1]\n , blue: [0, 0, 255, 1]\n , blueviolet: [138, 43, 226, 1]\n , brown: [165, 42, 42, 1]\n , burlywood: [222, 184, 135, 1]\n , cadetblue: [95, 158, 160, 1]\n , chartreuse: [127, 255, 0, 1]\n , chocolate: [210, 105, 30, 1]\n , coral: [255, 127, 80, 1]\n , cornflowerblue: [100, 149, 237, 1]\n , cornsilk: [255, 248, 220, 1]\n , crimson: [220, 20, 60, 1]\n , cyan: [0, 255, 255, 1]\n , darkblue: [0, 0, 139, 1]\n , darkcyan: [0, 139, 139, 1]\n , darkgoldenrod: [184, 134, 11, 1]\n , darkgray: [169, 169, 169, 1]\n , darkgreen: [0, 100, 0, 1]\n , darkgrey: [169, 169, 169, 1]\n , darkkhaki: [189, 183, 107, 1]\n , darkmagenta: [139, 0, 139, 1]\n , darkolivegreen: [85, 107, 47, 1]\n , darkorange: [255, 140, 0, 1]\n , darkorchid: [153, 50, 204, 1]\n , darkred: [139, 0, 0, 1]\n , darksalmon: [233, 150, 122, 1]\n , darkseagreen: [143, 188, 143, 1]\n , darkslateblue: [72, 61, 139, 1]\n , darkslategray: [47, 79, 79, 1]\n , darkslategrey: [47, 79, 79, 1]\n , darkturquoise: [0, 206, 209, 1]\n , darkviolet: [148, 0, 211, 1]\n , deeppink: [255, 20, 147, 1]\n , deepskyblue: [0, 191, 255, 1]\n , dimgray: [105, 105, 105, 1]\n , dimgrey: [105, 105, 105, 1]\n , dodgerblue: [30, 144, 255, 1]\n , firebrick: [178, 34, 34, 1]\n , floralwhite: [255, 250, 240, 1]\n , forestgreen: [34, 139, 34, 1]\n , fuchsia: [255, 0, 255, 1]\n , gainsboro: [220, 220, 220, 1]\n , ghostwhite: [248, 248, 255, 1]\n , gold: [255, 215, 0, 1]\n , goldenrod: [218, 165, 32, 1]\n , gray: [128, 128, 128, 1]\n , green: [0, 128, 0, 1]\n , greenyellow: [173, 255, 47, 1]\n , grey: [128, 128, 128, 1]\n , honeydew: [240, 255, 240, 1]\n , hotpink: [255, 105, 180, 1]\n , indianred: [205, 92, 92, 1]\n , indigo: [75, 0, 130, 1]\n , ivory: [255, 255, 240, 1]\n , khaki: [240, 230, 140, 1]\n , lavender: [230, 230, 250, 1]\n , lavenderblush: [255, 240, 245, 1]\n , lawngreen: [124, 252, 0, 1]\n , lemonchiffon: [255, 250, 205, 1]\n , lightblue: [173, 216, 230, 1]\n , lightcoral: [240, 128, 128, 1]\n , lightcyan: [224, 255, 255, 1]\n , lightgoldenrodyellow: [250, 250, 210, 1]\n , lightgray: [211, 211, 211, 1]\n , lightgreen: [144, 238, 144, 1]\n , lightgrey: [211, 211, 211, 1]\n , lightpink: [255, 182, 193, 1]\n , lightsalmon: [255, 160, 122, 1]\n , lightseagreen: [32, 178, 170, 1]\n , lightskyblue: [135, 206, 250, 1]\n , lightslategray: [119, 136, 153, 1]\n , lightslategrey: [119, 136, 153, 1]\n , lightsteelblue: [176, 196, 222, 1]\n , lightyellow: [255, 255, 224, 1]\n , lime: [0, 255, 0, 1]\n , limegreen: [50, 205, 50, 1]\n , linen: [250, 240, 230, 1]\n , magenta: [255, 0, 255, 1]\n , maroon: [128, 0, 0, 1]\n , mediumaquamarine: [102, 205, 170, 1]\n , mediumblue: [0, 0, 205, 1]\n , mediumorchid: [186, 85, 211, 1]\n , mediumpurple: [147, 112, 219, 1]\n , mediumseagreen: [60, 179, 113, 1]\n , mediumslateblue: [123, 104, 238, 1]\n , mediumspringgreen: [0, 250, 154, 1]\n , mediumturquoise: [72, 209, 204, 1]\n , mediumvioletred: [199, 21, 133, 1]\n , midnightblue: [25, 25, 112, 1]\n , mintcream: [245, 255, 250, 1]\n , mistyrose: [255, 228, 225, 1]\n , moccasin: [255, 228, 181, 1]\n , navajowhite: [255, 222, 173, 1]\n , navy: [0, 0, 128, 1]\n , oldlace: [253, 245, 230, 1]\n , olive: [128, 128, 0, 1]\n , olivedrab: [107, 142, 35, 1]\n , orange: [255, 165, 0, 1]\n , orangered: [255, 69, 0, 1]\n , orchid: [218, 112, 214, 1]\n , palegoldenrod: [238, 232, 170, 1]\n , palegreen: [152, 251, 152, 1]\n , paleturquoise: [175, 238, 238, 1]\n , palevioletred: [219, 112, 147, 1]\n , papayawhip: [255, 239, 213, 1]\n , peachpuff: [255, 218, 185, 1]\n , peru: [205, 133, 63, 1]\n , pink: [255, 192, 203, 1]\n , plum: [221, 160, 221, 1]\n , powderblue: [176, 224, 230, 1]\n , purple: [128, 0, 128, 1]\n , red: [255, 0, 0, 1]\n , rosybrown: [188, 143, 143, 1]\n , royalblue: [65, 105, 225, 1]\n , saddlebrown: [139, 69, 19, 1]\n , salmon: [250, 128, 114, 1]\n , sandybrown: [244, 164, 96, 1]\n , seagreen: [46, 139, 87, 1]\n , seashell: [255, 245, 238, 1]\n , sienna: [160, 82, 45, 1]\n , silver: [192, 192, 192, 1]\n , skyblue: [135, 206, 235, 1]\n , slateblue: [106, 90, 205, 1]\n , slategray: [112, 128, 144, 1]\n , slategrey: [112, 128, 144, 1]\n , snow: [255, 250, 250, 1]\n , springgreen: [0, 255, 127, 1]\n , steelblue: [70, 130, 180, 1]\n , tan: [210, 180, 140, 1]\n , teal: [0, 128, 128, 1]\n , thistle: [216, 191, 216, 1]\n , tomato: [255, 99, 71, 1]\n , transparent: [0, 0, 0, 0]\n , turquoise: [64, 224, 208, 1]\n , violet: [238, 130, 238, 1]\n , wheat: [245, 222, 179, 1]\n , white: [255, 255, 255, 1]\n , whitesmoke: [245, 245, 245, 1]\n , yellow: [255, 255, 0, 1]\n , yellowgreen: [154, 205, 50, 1]\n , rebeccapurple: [102, 51, 153, 1]\n};\n", "\n/*!\n * Stylus - plugin - url\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Compiler = require('../visitor/compiler')\n , events = require('../renderer').events\n , nodes = require('../nodes')\n , parse = require('url').parse\n , extname = require('path').extname\n , utils = require('../utils')\n , fs = require('fs');\n\n/**\n * Mime table.\n */\n\nvar defaultMimes = {\n '.gif': 'image/gif'\n , '.png': 'image/png'\n , '.jpg': 'image/jpeg'\n , '.jpeg': 'image/jpeg'\n , '.svg': 'image/svg+xml'\n , '.webp': 'image/webp'\n , '.ttf': 'application/x-font-ttf'\n , '.eot': 'application/vnd.ms-fontobject'\n , '.woff': 'application/font-woff'\n , '.woff2': 'application/font-woff2'\n};\n\n/**\n * Supported encoding types\n */\nvar encodingTypes = {\n BASE_64: 'base64',\n UTF8: 'charset=utf-8'\n}\n\n/**\n * Return a url() function with the given `options`.\n *\n * Options:\n *\n * - `limit` bytesize limit defaulting to 30Kb\n * - `paths` image resolution path(s), merged with general lookup paths\n *\n * Examples:\n *\n * stylus(str)\n * .set('filename', __dirname + '/css/test.styl')\n * .define('url', stylus.url({ paths: [__dirname + '/public'] }))\n * .render(function(err, css) { ... })\n *\n * @param {Object} options\n * @return {Function}\n * @api public\n */\n\nmodule.exports = function(options) {\n options = options || {};\n\n var _paths = options.paths || [];\n var sizeLimit = null != options.limit ? options.limit : 30000;\n var mimes = options.mimes || defaultMimes;\n\n /**\n * @param {object} url - The path to the image you want to encode.\n * @param {object} enc - The encoding for the image. Defaults to base64, the \n * other valid option is `utf8`.\n */\n function fn(url, enc) {\n // Compile the url\n var compiler = new Compiler(url)\n , encoding = encodingTypes.BASE_64;\n\n compiler.isURL = true;\n url = url.nodes.map(function(node) {\n return compiler.visit(node);\n }).join('');\n\n // Parse literal\n url = parse(url);\n var ext = extname(url.pathname || '')\n , mime = mimes[ext]\n , hash = url.hash || ''\n , literal = new nodes.Literal('url(\"' + url.href + '\")')\n , paths = _paths.concat(this.paths)\n , buf\n , result;\n\n // Not supported\n if(!mime) return literal;\n\n // Absolute\n if(url.protocol) return literal;\n\n // Lookup\n var found = utils.lookup(url.pathname, paths);\n\n // Failed to lookup\n if(!found) {\n events.emit(\n 'file not found'\n , 'File ' + literal + ' could not be found, literal url retained!'\n );\n\n return literal;\n }\n\n // Read data\n buf = fs.readFileSync(found);\n\n // Too large\n if(false !== sizeLimit && buf.length > sizeLimit) return literal;\n\n if(enc && 'utf8' == enc.first.val.toLowerCase()) {\n encoding = encodingTypes.UTF8;\n result = buf.toString().replace(/\\s+/g, ' ')\n .replace(/[{}\\|\\\\\\^~\\[\\]`\"<>#%]/g, function(match) {\n return '%' + match[0].charCodeAt(0).toString(16).toUpperCase();\n }).trim();\n } else {\n result = buf.toString(encoding) + hash;\n }\n\n // Encode\n return new nodes.Literal('url(\"data:' + mime + ';' + encoding + ',' + result + '\")');\n };\n\n fn.raw = true;\n return fn;\n};\n\n// Exporting default mimes so we could easily access them\nmodule.exports.mimes = defaultMimes;\n\n", "\n/*!\n * Stylus - Evaluator\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Visitor = require('./')\n , units = require('../units')\n , nodes = require('../nodes')\n , Stack = require('../stack')\n , Frame = require('../stack/frame')\n , utils = require('../utils')\n , bifs = require('../functions')\n , dirname = require('path').dirname\n , colors = require('../colors')\n , debug = require('debug')('stylus:evaluator')\n , fs = require('fs');\n\n/**\n * Import `file` and return Block node.\n *\n * @api private\n */\nfunction importFile(node, file, literal) {\n var importStack = this.importStack\n , Parser = require('../parser')\n , stat;\n\n // Handling the `require`\n if (node.once) {\n if (this.requireHistory[file]) return nodes.null;\n this.requireHistory[file] = true;\n\n if (literal && !this.includeCSS) {\n return node;\n }\n }\n\n // Avoid overflows from importing the same file over again\n if (~importStack.indexOf(file))\n throw new Error('import loop has been found');\n\n var str = fs.readFileSync(file, 'utf8');\n\n // shortcut for empty files\n if (!str.trim()) return nodes.null;\n\n // Expose imports\n node.path = file;\n node.dirname = dirname(file);\n // Store the modified time\n stat = fs.statSync(file);\n node.mtime = stat.mtime;\n this.paths.push(node.dirname);\n\n if (this.options._imports) this.options._imports.push(node.clone());\n\n // Parse the file\n importStack.push(file);\n nodes.filename = file;\n\n if (literal) {\n literal = new nodes.Literal(str.replace(/\\r\\n?/g, '\\n'));\n literal.lineno = literal.column = 1;\n if (!this.resolveURL) return literal;\n }\n\n // parse\n var block = new nodes.Block\n , parser = new Parser(str, utils.merge({ root: block }, this.options));\n\n try {\n block = parser.parse();\n } catch (err) {\n var line = parser.lexer.lineno\n , column = parser.lexer.column;\n\n if (literal && this.includeCSS && this.resolveURL) {\n this.warn('ParseError: ' + file + ':' + line + ':' + column + '. This file included as-is');\n return literal;\n } else {\n err.filename = file;\n err.lineno = line;\n err.column = column;\n err.input = str;\n throw err;\n }\n }\n\n // Evaluate imported \"root\"\n block = block.clone(this.currentBlock);\n block.parent = this.currentBlock;\n block.scope = false;\n var ret = this.visit(block);\n importStack.pop();\n if (!this.resolveURL || this.resolveURL.nocheck) this.paths.pop();\n\n return ret;\n}\n\n/**\n * Initialize a new `Evaluator` with the given `root` Node\n * and the following `options`.\n *\n * Options:\n *\n * - `compress` Compress the css output, defaults to false\n * - `warn` Warn the user of duplicate function definitions etc\n *\n * @param {Node} root\n * @api private\n */\n\nvar Evaluator = module.exports = function Evaluator(root, options) {\n options = options || {};\n Visitor.call(this, root);\n var functions = this.functions = options.functions || {};\n this.stack = new Stack;\n this.imports = options.imports || [];\n this.globals = options.globals || {};\n this.paths = options.paths || [];\n this.prefix = options.prefix || '';\n this.filename = options.filename;\n this.includeCSS = options['include css'];\n this.resolveURL = functions.url\n && 'resolver' == functions.url.name\n && functions.url.options;\n this.paths.push(dirname(options.filename || '.'));\n this.stack.push(this.global = new Frame(root));\n this.warnings = options.warn;\n this.options = options;\n this.calling = []; // TODO: remove, use stack\n this.importStack = [];\n this.requireHistory = {};\n this.return = 0;\n};\n\n/**\n * Inherit from `Visitor.prototype`.\n */\n\nEvaluator.prototype.__proto__ = Visitor.prototype;\n\n/**\n * Proxy visit to expose node line numbers.\n *\n * @param {Node} node\n * @return {Node}\n * @api private\n */\n\nvar visit = Visitor.prototype.visit;\nEvaluator.prototype.visit = function(node){\n try {\n return visit.call(this, node);\n } catch (err) {\n if (err.filename) throw err;\n err.lineno = node.lineno;\n err.column = node.column;\n err.filename = node.filename;\n err.stylusStack = this.stack.toString();\n try {\n err.input = fs.readFileSync(err.filename, 'utf8');\n } catch (err) {\n // ignore\n }\n throw err;\n }\n};\n\n/**\n * Perform evaluation setup:\n *\n * - populate global scope\n * - iterate imports\n *\n * @api private\n */\n\nEvaluator.prototype.setup = function(){\n var root = this.root;\n var imports = [];\n\n this.populateGlobalScope();\n this.imports.forEach(function(file){\n var expr = new nodes.Expression;\n expr.push(new nodes.String(file));\n imports.push(new nodes.Import(expr));\n }, this);\n\n root.nodes = imports.concat(root.nodes);\n};\n\n/**\n * Populate the global scope with:\n *\n * - css colors\n * - user-defined globals\n *\n * @api private\n */\n\nEvaluator.prototype.populateGlobalScope = function(){\n var scope = this.global.scope;\n\n // colors\n Object.keys(colors).forEach(function(name){\n var color = colors[name]\n , rgba = new nodes.RGBA(color[0], color[1], color[2], color[3])\n , node = new nodes.Ident(name, rgba);\n rgba.name = name;\n scope.add(node);\n });\n\n // expose url function\n scope.add(new nodes.Ident(\n 'embedurl',\n new nodes.Function('embedurl', require('../functions/url')({\n limit: false\n }))\n ));\n\n // user-defined globals\n var globals = this.globals;\n Object.keys(globals).forEach(function(name){\n var val = globals[name];\n if (!val.nodeName) val = new nodes.Literal(val);\n scope.add(new nodes.Ident(name, val));\n });\n};\n\n/**\n * Evaluate the tree.\n *\n * @return {Node}\n * @api private\n */\n\nEvaluator.prototype.evaluate = function(){\n debug('eval %s', this.filename);\n this.setup();\n return this.visit(this.root);\n};\n\n/**\n * Visit Group.\n */\n\nEvaluator.prototype.visitGroup = function(group){\n group.nodes = group.nodes.map(function(selector){\n selector.val = this.interpolate(selector);\n debug('ruleset %s', selector.val);\n return selector;\n }, this);\n\n group.block = this.visit(group.block);\n return group;\n};\n\n/**\n * Visit Return.\n */\n\nEvaluator.prototype.visitReturn = function(ret){\n ret.expr = this.visit(ret.expr);\n throw ret;\n};\n\n/**\n * Visit Media.\n */\n\nEvaluator.prototype.visitMedia = function(media){\n media.block = this.visit(media.block);\n media.val = this.visit(media.val);\n return media;\n};\n\n/**\n * Visit QueryList.\n */\n\nEvaluator.prototype.visitQueryList = function(queries){\n var val, query;\n queries.nodes.forEach(this.visit, this);\n\n if (1 == queries.nodes.length) {\n query = queries.nodes[0];\n if (val = this.lookup(query.type)) {\n val = val.first.string;\n if (!val) return queries;\n var Parser = require('../parser')\n , parser = new Parser(val, this.options);\n queries = this.visit(parser.queries());\n }\n }\n return queries;\n};\n\n/**\n * Visit Query.\n */\n\nEvaluator.prototype.visitQuery = function(node){\n node.predicate = this.visit(node.predicate);\n node.type = this.visit(node.type);\n node.nodes.forEach(this.visit, this);\n return node;\n};\n\n/**\n * Visit Feature.\n */\n\nEvaluator.prototype.visitFeature = function(node){\n node.name = this.interpolate(node);\n if (node.expr) {\n this.return++;\n node.expr = this.visit(node.expr);\n this.return--;\n }\n return node;\n};\n\n/**\n * Visit Object.\n */\n\nEvaluator.prototype.visitObject = function(obj){\n for (var key in obj.vals) {\n obj.vals[key] = this.visit(obj.vals[key]);\n }\n return obj;\n};\n\n/**\n * Visit Member.\n */\n\nEvaluator.prototype.visitMember = function(node){\n var left = node.left\n , right = node.right\n , obj = this.visit(left).first;\n\n if ('object' != obj.nodeName) {\n throw new Error(left.toString() + ' has no property .' + right);\n }\n if (node.val) {\n this.return++;\n obj.set(right.name, this.visit(node.val));\n this.return--;\n }\n return obj.get(right.name);\n};\n\n/**\n * Visit Keyframes.\n */\n\nEvaluator.prototype.visitKeyframes = function(keyframes){\n var val;\n if (keyframes.fabricated) return keyframes;\n keyframes.val = this.interpolate(keyframes).trim();\n if (val = this.lookup(keyframes.val)) {\n keyframes.val = val.first.string || val.first.name;\n }\n keyframes.block = this.visit(keyframes.block);\n\n if ('official' != keyframes.prefix) return keyframes;\n\n this.vendors.forEach(function(prefix){\n // IE never had prefixes for keyframes\n if ('ms' == prefix) return;\n var node = keyframes.clone();\n node.val = keyframes.val;\n node.prefix = prefix;\n node.block = keyframes.block;\n node.fabricated = true;\n this.currentBlock.push(node);\n }, this);\n\n return nodes.null;\n};\n\n/**\n * Visit Function.\n */\n\nEvaluator.prototype.visitFunction = function(fn){\n // check local\n var local = this.stack.currentFrame.scope.lookup(fn.name);\n if (local) this.warn('local ' + local.nodeName + ' \"' + fn.name + '\" previously defined in this scope');\n\n // user-defined\n var user = this.functions[fn.name];\n if (user) this.warn('user-defined function \"' + fn.name + '\" is already defined');\n\n // BIF\n var bif = bifs[fn.name];\n if (bif) this.warn('built-in function \"' + fn.name + '\" is already defined');\n\n return fn;\n};\n\n/**\n * Visit Each.\n */\n\nEvaluator.prototype.visitEach = function(each){\n this.return++;\n var expr = utils.unwrap(this.visit(each.expr))\n , len = expr.nodes.length\n , val = new nodes.Ident(each.val)\n , key = new nodes.Ident(each.key || '__index__')\n , scope = this.currentScope\n , block = this.currentBlock\n , vals = []\n , self = this\n , body\n , obj;\n this.return--;\n\n each.block.scope = false;\n\n function visitBody(key, val) {\n scope.add(val);\n scope.add(key);\n body = self.visit(each.block.clone());\n vals = vals.concat(body.nodes);\n }\n\n // for prop in obj\n if (1 == len && 'object' == expr.nodes[0].nodeName) {\n obj = expr.nodes[0];\n for (var prop in obj.vals) {\n val.val = new nodes.String(prop);\n key.val = obj.get(prop);\n visitBody(key, val);\n }\n } else {\n for (var i = 0; i < len; ++i) {\n val.val = expr.nodes[i];\n key.val = new nodes.Unit(i);\n visitBody(key, val);\n }\n }\n\n this.mixin(vals, block);\n return vals[vals.length - 1] || nodes.null;\n};\n\n/**\n * Visit Call.\n */\n\nEvaluator.prototype.visitCall = function(call){\n debug('call %s', call);\n var fn = this.lookup(call.name)\n , literal\n , ret;\n\n // url()\n this.ignoreColors = 'url' == call.name;\n\n // Variable function\n if (fn && 'expression' == fn.nodeName) {\n fn = fn.nodes[0];\n }\n\n // Not a function? try user-defined or built-ins\n if (fn && 'function' != fn.nodeName) {\n fn = this.lookupFunction(call.name);\n }\n\n // Undefined function? render literal CSS\n if (!fn || fn.nodeName != 'function') {\n debug('%s is undefined', call);\n // Special case for `calc`\n if ('calc' == this.unvendorize(call.name)) {\n literal = call.args.nodes && call.args.nodes[0];\n if (literal) ret = new nodes.Literal(call.name + literal);\n } else {\n ret = this.literalCall(call);\n }\n this.ignoreColors = false;\n return ret;\n }\n\n this.calling.push(call.name);\n\n // Massive stack\n if (this.calling.length > 200) {\n throw new RangeError('Maximum stylus call stack size exceeded');\n }\n\n // First node in expression\n if ('expression' == fn.nodeName) fn = fn.first;\n\n // Evaluate arguments\n this.return++;\n var args = this.visit(call.args);\n\n for (var key in args.map) {\n args.map[key] = this.visit(args.map[key].clone());\n }\n this.return--;\n\n // Built-in\n if (fn.fn) {\n debug('%s is built-in', call);\n ret = this.invokeBuiltin(fn.fn, args);\n // User-defined\n } else if ('function' == fn.nodeName) {\n debug('%s is user-defined', call);\n // Evaluate mixin block\n if (call.block) call.block = this.visit(call.block);\n ret = this.invokeFunction(fn, args, call.block);\n }\n\n this.calling.pop();\n this.ignoreColors = false;\n return ret;\n};\n\n/**\n * Visit Ident.\n */\n\nEvaluator.prototype.visitIdent = function(ident){\n var prop;\n // Property lookup\n if (ident.property) {\n if (prop = this.lookupProperty(ident.name)) {\n return this.visit(prop.expr.clone());\n }\n return nodes.null;\n // Lookup\n } else if (ident.val.isNull) {\n var val = this.lookup(ident.name);\n // Object or Block mixin\n if (val && ident.mixin) this.mixinNode(val);\n return val ? this.visit(val) : ident;\n // Assign\n } else {\n this.return++;\n ident.val = this.visit(ident.val);\n this.return--;\n this.currentScope.add(ident);\n return ident.val;\n }\n};\n\n/**\n * Visit BinOp.\n */\n\nEvaluator.prototype.visitBinOp = function(binop){\n // Special-case \"is defined\" pseudo binop\n if ('is defined' == binop.op) return this.isDefined(binop.left);\n\n this.return++;\n // Visit operands\n var op = binop.op\n , left = this.visit(binop.left)\n , right = ('||' == op || '&&' == op)\n ? binop.right : this.visit(binop.right);\n\n // HACK: ternary\n var val = binop.val\n ? this.visit(binop.val)\n : null;\n this.return--;\n\n // Operate\n try {\n return this.visit(left.operate(op, right, val));\n } catch (err) {\n // disregard coercion issues in equality\n // checks, and simply return false\n if ('CoercionError' == err.name) {\n switch (op) {\n case '==':\n return nodes.false;\n case '!=':\n return nodes.true;\n }\n }\n throw err;\n }\n};\n\n/**\n * Visit UnaryOp.\n */\n\nEvaluator.prototype.visitUnaryOp = function(unary){\n var op = unary.op\n , node = this.visit(unary.expr);\n\n if ('!' != op) {\n node = node.first.clone();\n utils.assertType(node, 'unit');\n }\n\n switch (op) {\n case '-':\n node.val = -node.val;\n break;\n case '+':\n node.val = +node.val;\n break;\n case '~':\n node.val = ~node.val;\n break;\n case '!':\n return node.toBoolean().negate();\n }\n\n return node;\n};\n\n/**\n * Visit TernaryOp.\n */\n\nEvaluator.prototype.visitTernary = function(ternary){\n var ok = this.visit(ternary.cond).toBoolean();\n return ok.isTrue\n ? this.visit(ternary.trueExpr)\n : this.visit(ternary.falseExpr);\n};\n\n/**\n * Visit Expression.\n */\n\nEvaluator.prototype.visitExpression = function(expr){\n for (var i = 0, len = expr.nodes.length; i < len; ++i) {\n expr.nodes[i] = this.visit(expr.nodes[i]);\n }\n\n // support (n * 5)px etc\n if (this.castable(expr)) expr = this.cast(expr);\n\n return expr;\n};\n\n/**\n * Visit Arguments.\n */\n\nEvaluator.prototype.visitArguments = Evaluator.prototype.visitExpression;\n\n/**\n * Visit Property.\n */\n\nEvaluator.prototype.visitProperty = function(prop){\n var name = this.interpolate(prop)\n , fn = this.lookup(name)\n , call = fn && 'function' == fn.first.nodeName\n , literal = ~this.calling.indexOf(name)\n , _prop = this.property;\n\n // Function of the same name\n if (call && !literal && !prop.literal) {\n var args = nodes.Arguments.fromExpression(utils.unwrap(prop.expr.clone()));\n prop.name = name;\n this.property = prop;\n this.return++;\n this.property.expr = this.visit(prop.expr);\n this.return--;\n var ret = this.visit(new nodes.Call(name, args));\n this.property = _prop;\n return ret;\n // Regular property\n } else {\n this.return++;\n prop.name = name;\n prop.literal = true;\n this.property = prop;\n prop.expr = this.visit(prop.expr);\n this.property = _prop;\n this.return--;\n return prop;\n }\n};\n\n/**\n * Visit Root.\n */\n\nEvaluator.prototype.visitRoot = function(block){\n // normalize cached imports\n if (block != this.root) {\n block.constructor = nodes.Block;\n return this.visit(block);\n }\n\n for (var i = 0; i < block.nodes.length; ++i) {\n block.index = i;\n block.nodes[i] = this.visit(block.nodes[i]);\n }\n return block;\n};\n\n/**\n * Visit Block.\n */\n\nEvaluator.prototype.visitBlock = function(block){\n this.stack.push(new Frame(block));\n for (block.index = 0; block.index < block.nodes.length; ++block.index) {\n try {\n block.nodes[block.index] = this.visit(block.nodes[block.index]);\n } catch (err) {\n if ('return' == err.nodeName) {\n if (this.return) {\n this.stack.pop();\n throw err;\n } else {\n block.nodes[block.index] = err;\n break;\n }\n } else {\n throw err;\n }\n }\n }\n this.stack.pop();\n return block;\n};\n\n/**\n * Visit Atblock.\n */\n\nEvaluator.prototype.visitAtblock = function(atblock){\n atblock.block = this.visit(atblock.block);\n return atblock;\n};\n\n/**\n * Visit Atrule.\n */\n\nEvaluator.prototype.visitAtrule = function(atrule){\n atrule.val = this.interpolate(atrule);\n if (atrule.block) atrule.block = this.visit(atrule.block);\n return atrule;\n};\n\n/**\n * Visit Supports.\n */\n\nEvaluator.prototype.visitSupports = function(node){\n var condition = node.condition\n , val;\n\n this.return++;\n node.condition = this.visit(condition);\n this.return--;\n\n val = condition.first;\n if (1 == condition.nodes.length\n && 'string' == val.nodeName) {\n node.condition = val.string;\n }\n node.block = this.visit(node.block);\n return node;\n};\n\n/**\n * Visit If.\n */\n\nEvaluator.prototype.visitIf = function(node){\n var ret\n , block = this.currentBlock\n , negate = node.negate;\n\n this.return++;\n var ok = this.visit(node.cond).first.toBoolean();\n this.return--;\n\n node.block.scope = node.block.hasMedia;\n\n // Evaluate body\n if (negate) {\n // unless\n if (ok.isFalse) {\n ret = this.visit(node.block);\n }\n } else {\n // if\n if (ok.isTrue) {\n ret = this.visit(node.block);\n // else\n } else if (node.elses.length) {\n var elses = node.elses\n , len = elses.length\n , cond;\n for (var i = 0; i < len; ++i) {\n // else if\n if (elses[i].cond) {\n elses[i].block.scope = elses[i].block.hasMedia;\n this.return++;\n cond = this.visit(elses[i].cond).first.toBoolean();\n this.return--;\n if (cond.isTrue) {\n ret = this.visit(elses[i].block);\n break;\n }\n // else\n } else {\n elses[i].scope = elses[i].hasMedia;\n ret = this.visit(elses[i]);\n }\n }\n }\n }\n\n // mixin conditional statements within\n // a selector group or at-rule\n if (ret && !node.postfix && block.node\n && ~['group'\n , 'atrule'\n , 'media'\n , 'supports'\n , 'keyframes'].indexOf(block.node.nodeName)) {\n this.mixin(ret.nodes, block);\n return nodes.null;\n }\n\n return ret || nodes.null;\n};\n\n/**\n * Visit Extend.\n */\n\nEvaluator.prototype.visitExtend = function(extend){\n var block = this.currentBlock;\n if ('group' != block.node.nodeName) block = this.closestGroup;\n extend.selectors.forEach(function(selector){\n block.node.extends.push({\n // Cloning the selector for when we are in a loop and don't want it to affect\n // the selector nodes and cause the values to be different to expected\n selector: this.interpolate(selector.clone()).trim(),\n optional: selector.optional,\n lineno: selector.lineno,\n column: selector.column\n });\n }, this);\n return nodes.null;\n};\n\n/**\n * Visit Import.\n */\n\nEvaluator.prototype.visitImport = function(imported){\n this.return++;\n\n var path = this.visit(imported.path).first\n , nodeName = imported.once ? 'require' : 'import'\n , found\n , literal;\n\n this.return--;\n debug('import %s', path);\n\n // url() passed\n if ('url' == path.name) {\n if (imported.once) throw new Error('You cannot @require a url');\n\n return imported;\n }\n\n // Ensure string\n if (!path.string) throw new Error('@' + nodeName + ' string expected');\n\n var name = path = path.string;\n\n // Absolute URL or hash\n if (/(?:url\\s*\\(\\s*)?['\"]?(?:#|(?:https?:)?\\/\\/)/i.test(path)) {\n if (imported.once) throw new Error('You cannot @require a url');\n return imported;\n }\n\n // Literal\n if (/\\.css(?:\"|$)/.test(path)) {\n literal = true;\n if (!imported.once && !this.includeCSS) {\n return imported;\n }\n }\n\n // support optional .styl\n if (!literal && !/\\.styl$/i.test(path)) path += '.styl';\n\n // Lookup\n found = utils.find(path, this.paths, this.filename);\n if (!found) {\n found = utils.lookupIndex(name, this.paths, this.filename);\n }\n\n // Throw if import failed\n if (!found) throw new Error('failed to locate @' + nodeName + ' file ' + path);\n \n var block = new nodes.Block;\n\n for (var i = 0, len = found.length; i < len; ++i) {\n block.push(importFile.call(this, imported, found[i], literal));\n }\n\n return block;\n};\n\n/**\n * Invoke `fn` with `args`.\n *\n * @param {Function} fn\n * @param {Array} args\n * @return {Node}\n * @api private\n */\n\nEvaluator.prototype.invokeFunction = function(fn, args, content){\n var block = new nodes.Block(fn.block.parent);\n\n // Clone the function body\n // to prevent mutation of subsequent calls\n var body = fn.block.clone(block);\n\n // mixin block\n var mixinBlock = this.stack.currentFrame.block;\n\n // new block scope\n this.stack.push(new Frame(block));\n var scope = this.currentScope;\n\n // normalize arguments\n if ('arguments' != args.nodeName) {\n var expr = new nodes.Expression;\n expr.push(args);\n args = nodes.Arguments.fromExpression(expr);\n }\n\n // arguments local\n scope.add(new nodes.Ident('arguments', args));\n\n // mixin scope introspection\n scope.add(new nodes.Ident('mixin', this.return\n ? nodes.false\n : new nodes.String(mixinBlock.nodeName)));\n\n // current property\n if (this.property) {\n var prop = this.propertyExpression(this.property, fn.name);\n scope.add(new nodes.Ident('current-property', prop));\n } else {\n scope.add(new nodes.Ident('current-property', nodes.null));\n }\n\n // current call stack\n var expr = new nodes.Expression;\n for (var i = this.calling.length - 1; i-- ; ) {\n expr.push(new nodes.Literal(this.calling[i]));\n };\n scope.add(new nodes.Ident('called-from', expr));\n\n // inject arguments as locals\n var i = 0\n , len = args.nodes.length;\n fn.params.nodes.forEach(function(node){\n // rest param support\n if (node.rest) {\n node.val = new nodes.Expression;\n for (; i < len; ++i) node.val.push(args.nodes[i]);\n node.val.preserve = true;\n node.val.isList = args.isList;\n // argument default support\n } else {\n var arg = args.map[node.name] || args.nodes[i++];\n node = node.clone();\n if (arg) {\n arg.isEmpty ? args.nodes[i - 1] = this.visit(node) : node.val = arg;\n } else {\n args.push(node.val);\n }\n\n // required argument not satisfied\n if (node.val.isNull) {\n throw new Error('argument \"' + node + '\" required for ' + fn);\n }\n }\n\n scope.add(node);\n }, this);\n\n // mixin block\n if (content) scope.add(new nodes.Ident('block', content, true));\n\n // invoke\n return this.invoke(body, true, fn.filename);\n};\n\n/**\n * Invoke built-in `fn` with `args`.\n *\n * @param {Function} fn\n * @param {Array} args\n * @return {Node}\n * @api private\n */\n\nEvaluator.prototype.invokeBuiltin = function(fn, args){\n // Map arguments to first node\n // providing a nicer js api for\n // BIFs. Functions may specify that\n // they wish to accept full expressions\n // via .raw\n if (fn.raw) {\n args = args.nodes;\n } else {\n if (!fn.params) {\n fn.params = utils.params(fn);\n }\n args = fn.params.reduce(function(ret, param){\n var arg = args.map[param] || args.nodes.shift()\n if (arg) {\n arg = utils.unwrap(arg);\n var len = arg.nodes.length;\n if (len > 1) {\n for (var i = 0; i < len; ++i) {\n ret.push(utils.unwrap(arg.nodes[i].first));\n }\n } else {\n ret.push(arg.first);\n }\n }\n return ret;\n }, []);\n }\n\n // Invoke the BIF\n var body = utils.coerce(fn.apply(this, args));\n\n // Always wrapping allows js functions\n // to return several values with a single\n // Expression node\n var expr = new nodes.Expression;\n expr.push(body);\n body = expr;\n\n // Invoke\n return this.invoke(body);\n};\n\n/**\n * Invoke the given function `body`.\n *\n * @param {Block} body\n * @return {Node}\n * @api private\n */\n\nEvaluator.prototype.invoke = function(body, stack, filename){\n var self = this\n , ret;\n\n if (filename) this.paths.push(dirname(filename));\n\n // Return\n if (this.return) {\n ret = this.eval(body.nodes);\n if (stack) this.stack.pop();\n // Mixin\n } else {\n body = this.visit(body);\n if (stack) this.stack.pop();\n this.mixin(body.nodes, this.currentBlock);\n ret = nodes.null;\n }\n\n if (filename) this.paths.pop();\n\n return ret;\n};\n\n/**\n * Mixin the given `nodes` to the given `block`.\n *\n * @param {Array} nodes\n * @param {Block} block\n * @api private\n */\n\nEvaluator.prototype.mixin = function(nodes, block){\n if (!nodes.length) return;\n var len = block.nodes.length\n , head = block.nodes.slice(0, block.index)\n , tail = block.nodes.slice(block.index + 1, len);\n this._mixin(nodes, head, block);\n block.index = 0;\n block.nodes = head.concat(tail);\n};\n\n/**\n * Mixin the given `items` to the `dest` array.\n *\n * @param {Array} items\n * @param {Array} dest\n * @param {Block} block\n * @api private\n */\n\nEvaluator.prototype._mixin = function(items, dest, block){\n var node\n , len = items.length;\n for (var i = 0; i < len; ++i) {\n switch ((node = items[i]).nodeName) {\n case 'return':\n return;\n case 'block':\n this._mixin(node.nodes, dest, block);\n break;\n case 'media':\n // fix link to the parent block\n var parentNode = node.block.parent.node;\n if (parentNode && 'call' != parentNode.nodeName) {\n node.block.parent = block;\n }\n case 'property':\n var val = node.expr;\n // prevent `block` mixin recursion\n if (node.literal && 'block' == val.first.name) {\n val = utils.unwrap(val);\n val.nodes[0] = new nodes.Literal('block');\n }\n default:\n dest.push(node);\n }\n }\n};\n\n/**\n * Mixin the given `node` to the current block.\n *\n * @param {Node} node\n * @api private\n */\n\nEvaluator.prototype.mixinNode = function(node){\n node = this.visit(node.first);\n switch (node.nodeName) {\n case 'object':\n this.mixinObject(node);\n return nodes.null;\n case 'block':\n case 'atblock':\n this.mixin(node.nodes, this.currentBlock);\n return nodes.null;\n }\n};\n\n/**\n * Mixin the given `object` to the current block.\n *\n * @param {Object} object\n * @api private\n */\n\nEvaluator.prototype.mixinObject = function(object){\n var Parser = require('../parser')\n , root = this.root\n , str = '$block ' + object.toBlock()\n , parser = new Parser(str, utils.merge({ root: block }, this.options))\n , block;\n\n try {\n block = parser.parse();\n } catch (err) {\n err.filename = this.filename;\n err.lineno = parser.lexer.lineno;\n err.column = parser.lexer.column;\n err.input = str;\n throw err;\n }\n\n block.parent = root;\n block.scope = false;\n var ret = this.visit(block)\n , vals = ret.first.nodes;\n for (var i = 0, len = vals.length; i < len; ++i) {\n if (vals[i].block) {\n this.mixin(vals[i].block.nodes, this.currentBlock);\n break;\n }\n }\n};\n\n/**\n * Evaluate the given `vals`.\n *\n * @param {Array} vals\n * @return {Node}\n * @api private\n */\n\nEvaluator.prototype.eval = function(vals){\n if (!vals) return nodes.null;\n var len = vals.length\n , node = nodes.null;\n\n try {\n for (var i = 0; i < len; ++i) {\n node = vals[i];\n switch (node.nodeName) {\n case 'if':\n if ('block' != node.block.nodeName) {\n node = this.visit(node);\n break;\n }\n case 'each':\n case 'block':\n node = this.visit(node);\n if (node.nodes) node = this.eval(node.nodes);\n break;\n default:\n node = this.visit(node);\n }\n }\n } catch (err) {\n if ('return' == err.nodeName) {\n return err.expr;\n } else {\n throw err;\n }\n }\n\n return node;\n};\n\n/**\n * Literal function `call`.\n *\n * @param {Call} call\n * @return {call}\n * @api private\n */\n\nEvaluator.prototype.literalCall = function(call){\n call.args = this.visit(call.args);\n return call;\n};\n\n/**\n * Lookup property `name`.\n *\n * @param {String} name\n * @return {Property}\n * @api private\n */\n\nEvaluator.prototype.lookupProperty = function(name){\n var i = this.stack.length\n , index = this.currentBlock.index\n , top = i\n , nodes\n , block\n , len\n , other;\n\n while (i--) {\n block = this.stack[i].block;\n if (!block.node) continue;\n switch (block.node.nodeName) {\n case 'group':\n case 'function':\n case 'if':\n case 'each':\n case 'atrule':\n case 'media':\n case 'atblock':\n case 'call':\n nodes = block.nodes;\n // scan siblings from the property index up\n if (i + 1 == top) {\n while (index--) {\n // ignore current property\n if (this.property == nodes[index]) continue;\n other = this.interpolate(nodes[index]);\n if (name == other) return nodes[index].clone();\n }\n // sequential lookup for non-siblings (for now)\n } else {\n len = nodes.length;\n while (len--) {\n if ('property' != nodes[len].nodeName\n || this.property == nodes[len]) continue;\n other = this.interpolate(nodes[len]);\n if (name == other) return nodes[len].clone();\n }\n }\n break;\n }\n }\n\n return nodes.null;\n};\n\n/**\n * Return the closest mixin-able `Block`.\n *\n * @return {Block}\n * @api private\n */\n\nEvaluator.prototype.__defineGetter__('closestBlock', function(){\n var i = this.stack.length\n , block;\n while (i--) {\n block = this.stack[i].block;\n if (block.node) {\n switch (block.node.nodeName) {\n case 'group':\n case 'keyframes':\n case 'atrule':\n case 'atblock':\n case 'media':\n case 'call':\n return block;\n }\n }\n }\n});\n\n/**\n * Return the closest group block.\n *\n * @return {Block}\n * @api private\n */\n\nEvaluator.prototype.__defineGetter__('closestGroup', function(){\n var i = this.stack.length\n , block;\n while (i--) {\n block = this.stack[i].block;\n if (block.node && 'group' == block.node.nodeName) {\n return block;\n }\n }\n});\n\n/**\n * Return the current selectors stack.\n *\n * @return {Array}\n * @api private\n */\n\nEvaluator.prototype.__defineGetter__('selectorStack', function(){\n var block\n , stack = [];\n for (var i = 0, len = this.stack.length; i < len; ++i) {\n block = this.stack[i].block;\n if (block.node && 'group' == block.node.nodeName) {\n block.node.nodes.forEach(function(selector) {\n if (!selector.val) selector.val = this.interpolate(selector);\n }, this);\n stack.push(block.node.nodes);\n }\n }\n return stack;\n});\n\n/**\n * Lookup `name`, with support for JavaScript\n * functions, and BIFs.\n *\n * @param {String} name\n * @return {Node}\n * @api private\n */\n\nEvaluator.prototype.lookup = function(name){\n var val;\n if (this.ignoreColors && name in colors) return;\n if (val = this.stack.lookup(name)) {\n return utils.unwrap(val);\n } else {\n return this.lookupFunction(name);\n }\n};\n\n/**\n * Map segments in `node` returning a string.\n *\n * @param {Node} node\n * @return {String}\n * @api private\n */\n\nEvaluator.prototype.interpolate = function(node){\n var self = this\n , isSelector = ('selector' == node.nodeName);\n function toString(node) {\n switch (node.nodeName) {\n case 'function':\n case 'ident':\n return node.name;\n case 'literal':\n case 'string':\n if (self.prefix && !node.prefixed && !node.val.nodeName) {\n node.val = node.val.replace(/\\.(?=[\\w-])|^\\.$/g, '.' + self.prefix);\n node.prefixed = true;\n }\n return node.val;\n case 'unit':\n // Interpolation inside keyframes\n return '%' == node.type ? node.val + '%' : node.val;\n case 'member':\n return toString(self.visit(node));\n case 'expression':\n // Prevent cyclic `selector()` calls.\n if (self.calling && ~self.calling.indexOf('selector') && self._selector) return self._selector;\n self.return++;\n var ret = toString(self.visit(node).first);\n self.return--;\n if (isSelector) self._selector = ret;\n return ret;\n }\n }\n\n if (node.segments) {\n return node.segments.map(toString).join('');\n } else {\n return toString(node);\n }\n};\n\n/**\n * Lookup JavaScript user-defined or built-in function.\n *\n * @param {String} name\n * @return {Function}\n * @api private\n */\n\nEvaluator.prototype.lookupFunction = function(name){\n var fn = this.functions[name] || bifs[name];\n if (fn) return new nodes.Function(name, fn);\n};\n\n/**\n * Check if the given `node` is an ident, and if it is defined.\n *\n * @param {Node} node\n * @return {Boolean}\n * @api private\n */\n\nEvaluator.prototype.isDefined = function(node){\n if ('ident' == node.nodeName) {\n return nodes.Boolean(this.lookup(node.name));\n } else {\n throw new Error('invalid \"is defined\" check on non-variable ' + node);\n }\n};\n\n/**\n * Return `Expression` based on the given `prop`,\n * replacing cyclic calls to the given function `name`\n * with \"__CALL__\".\n *\n * @param {Property} prop\n * @param {String} name\n * @return {Expression}\n * @api private\n */\n\nEvaluator.prototype.propertyExpression = function(prop, name){\n var expr = new nodes.Expression\n , val = prop.expr.clone();\n\n // name\n expr.push(new nodes.String(prop.name));\n\n // replace cyclic call with __CALL__\n function replace(node) {\n if ('call' == node.nodeName && name == node.name) {\n return new nodes.Literal('__CALL__');\n }\n\n if (node.nodes) node.nodes = node.nodes.map(replace);\n return node;\n }\n\n replace(val);\n expr.push(val);\n return expr;\n};\n\n/**\n * Cast `expr` to the trailing ident.\n *\n * @param {Expression} expr\n * @return {Unit}\n * @api private\n */\n\nEvaluator.prototype.cast = function(expr){\n return new nodes.Unit(expr.first.val, expr.nodes[1].name);\n};\n\n/**\n * Check if `expr` is castable.\n *\n * @param {Expression} expr\n * @return {Boolean}\n * @api private\n */\n\nEvaluator.prototype.castable = function(expr){\n return 2 == expr.nodes.length\n && 'unit' == expr.first.nodeName\n && ~units.indexOf(expr.nodes[1].name);\n};\n\n/**\n * Warn with the given `msg`.\n *\n * @param {String} msg\n * @api private\n */\n\nEvaluator.prototype.warn = function(msg){\n if (!this.warnings) return;\n console.warn('\\u001b[33mWarning:\\u001b[0m ' + msg);\n};\n\n/**\n * Return the current `Block`.\n *\n * @return {Block}\n * @api private\n */\n\nEvaluator.prototype.__defineGetter__('currentBlock', function(){\n return this.stack.currentFrame.block;\n});\n\n/**\n * Return an array of vendor names.\n *\n * @return {Array}\n * @api private\n */\n\nEvaluator.prototype.__defineGetter__('vendors', function(){\n return this.lookup('vendors').nodes.map(function(node){\n return node.string;\n });\n});\n\n/**\n * Return the property name without vendor prefix.\n *\n * @param {String} prop\n * @return {String}\n * @api public\n */\n\nEvaluator.prototype.unvendorize = function(prop){\n for (var i = 0, len = this.vendors.length; i < len; i++) {\n if ('official' != this.vendors[i]) {\n var vendor = '-' + this.vendors[i] + '-';\n if (~prop.indexOf(vendor)) return prop.replace(vendor, '');\n }\n }\n return prop;\n};\n\n/**\n * Return the current frame `Scope`.\n *\n * @return {Scope}\n * @api private\n */\n\nEvaluator.prototype.__defineGetter__('currentScope', function(){\n return this.stack.currentFrame.scope;\n});\n\n/**\n * Return the current `Frame`.\n *\n * @return {Frame}\n * @api private\n */\n\nEvaluator.prototype.__defineGetter__('currentFrame', function(){\n return this.stack.currentFrame;\n});\n", "\n/*!\n * Stylus - Node\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Evaluator = require('../visitor/evaluator')\n , utils = require('../utils')\n , nodes = require('./');\n\n/**\n * Initialize a new `CoercionError` with the given `msg`.\n *\n * @param {String} msg\n * @api private\n */\n\nfunction CoercionError(msg) {\n this.name = 'CoercionError'\n this.message = msg\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, CoercionError);\n }\n}\n\n/**\n * Inherit from `Error.prototype`.\n */\n\nCoercionError.prototype.__proto__ = Error.prototype;\n\n/**\n * Node constructor.\n *\n * @api public\n */\n\nvar Node = module.exports = function Node(){\n this.lineno = nodes.lineno || 1;\n this.column = nodes.column || 1;\n this.filename = nodes.filename;\n};\n\nNode.prototype = {\n constructor: Node,\n\n /**\n * Return this node.\n *\n * @return {Node}\n * @api public\n */\n\n get first() {\n return this;\n },\n\n /**\n * Return hash.\n *\n * @return {String}\n * @api public\n */\n\n get hash() {\n return this.val;\n },\n\n /**\n * Return node name.\n *\n * @return {String}\n * @api public\n */\n\n get nodeName() {\n return this.constructor.name.toLowerCase();\n },\n\n /**\n * Return this node.\n * \n * @return {Node}\n * @api public\n */\n\n clone: function(){\n return this;\n },\n\n /**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\n toJSON: function(){\n return {\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n },\n\n /**\n * Nodes by default evaluate to themselves.\n *\n * @return {Node}\n * @api public\n */\n\n eval: function(){\n return new Evaluator(this).evaluate();\n },\n\n /**\n * Return true.\n *\n * @return {Boolean}\n * @api public\n */\n\n toBoolean: function(){\n return nodes.true;\n },\n\n /**\n * Return the expression, or wrap this node in an expression.\n *\n * @return {Expression}\n * @api public\n */\n\n toExpression: function(){\n if ('expression' == this.nodeName) return this;\n var expr = new nodes.Expression;\n expr.push(this);\n return expr;\n },\n\n /**\n * Return false if `op` is generally not coerced.\n *\n * @param {String} op\n * @return {Boolean}\n * @api private\n */\n\n shouldCoerce: function(op){\n switch (op) {\n case 'is a':\n case 'in':\n case '||':\n case '&&':\n return false;\n default:\n return true;\n }\n },\n\n /**\n * Operate on `right` with the given `op`.\n *\n * @param {String} op\n * @param {Node} right\n * @return {Node}\n * @api public\n */\n\n operate: function(op, right){\n switch (op) {\n case 'is a':\n if ('string' == right.first.nodeName) {\n return nodes.Boolean(this.nodeName == right.val);\n } else {\n throw new Error('\"is a\" expects a string, got ' + right.toString());\n }\n case '==':\n return nodes.Boolean(this.hash == right.hash);\n case '!=':\n return nodes.Boolean(this.hash != right.hash);\n case '>=':\n return nodes.Boolean(this.hash >= right.hash);\n case '<=':\n return nodes.Boolean(this.hash <= right.hash);\n case '>':\n return nodes.Boolean(this.hash > right.hash);\n case '<':\n return nodes.Boolean(this.hash < right.hash);\n case '||':\n return this.toBoolean().isTrue\n ? this\n : right;\n case 'in':\n var vals = utils.unwrap(right).nodes\n , len = vals && vals.length\n , hash = this.hash;\n if (!vals) throw new Error('\"in\" given invalid right-hand operand, expecting an expression');\n\n // 'prop' in obj\n if (1 == len && 'object' == vals[0].nodeName) {\n return nodes.Boolean(vals[0].has(this.hash));\n }\n\n for (var i = 0; i < len; ++i) {\n if (hash == vals[i].hash) {\n return nodes.true;\n }\n }\n return nodes.false;\n case '&&':\n var a = this.toBoolean()\n , b = right.toBoolean();\n return a.isTrue && b.isTrue\n ? right\n : a.isFalse\n ? this\n : right;\n default:\n if ('[]' == op) {\n var msg = 'cannot perform '\n + this\n + '[' + right + ']';\n } else {\n var msg = 'cannot perform'\n + ' ' + this\n + ' ' + op\n + ' ' + right;\n }\n throw new Error(msg);\n }\n },\n\n /**\n * Default coercion throws.\n *\n * @param {Node} other\n * @return {Node}\n * @api public\n */\n\n coerce: function(other){\n if (other.nodeName == this.nodeName) return other;\n throw new CoercionError('cannot coerce ' + other + ' to ' + this.nodeName);\n }\n};\n", "\n/*!\n * Stylus - Root\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new `Root` node.\n *\n * @api public\n */\n\nvar Root = module.exports = function Root(){\n this.nodes = [];\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nRoot.prototype.__proto__ = Node.prototype;\n\n/**\n * Push a `node` to this block.\n *\n * @param {Node} node\n * @api public\n */\n\nRoot.prototype.push = function(node){\n this.nodes.push(node);\n};\n\n/**\n * Unshift a `node` to this block.\n *\n * @param {Node} node\n * @api public\n */\n\nRoot.prototype.unshift = function(node){\n this.nodes.unshift(node);\n};\n\n/**\n * Return a clone of this node.\n *\n * @return {Node}\n * @api public\n */\n\nRoot.prototype.clone = function(){\n var clone = new Root();\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n this.nodes.forEach(function(node){\n clone.push(node.clone(clone, clone));\n });\n return clone;\n};\n\n/**\n * Return \"root\".\n *\n * @return {String}\n * @api public\n */\n\nRoot.prototype.toString = function(){\n return '[Root]';\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nRoot.prototype.toJSON = function(){\n return {\n __type: 'Root',\n nodes: this.nodes,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n", "\n/*!\n * Stylus - Null\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node')\n , nodes = require('./');\n\n/**\n * Initialize a new `Null` node.\n *\n * @api public\n */\n\nvar Null = module.exports = function Null(){};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nNull.prototype.__proto__ = Node.prototype;\n\n/**\n * Return 'Null'.\n *\n * @return {String}\n * @api public\n */\n\nNull.prototype.inspect = \nNull.prototype.toString = function(){\n return 'null';\n};\n\n/**\n * Return false.\n *\n * @return {Boolean}\n * @api public\n */\n\nNull.prototype.toBoolean = function(){\n return nodes.false;\n};\n\n/**\n * Check if the node is a null node.\n *\n * @return {Boolean}\n * @api public\n */\n\nNull.prototype.__defineGetter__('isNull', function(){\n return true;\n});\n\n/**\n * Return hash.\n *\n * @return {String}\n * @api public\n */\n\nNull.prototype.__defineGetter__('hash', function(){\n return null;\n});\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nNull.prototype.toJSON = function(){\n return {\n __type: 'Null',\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n", "\n/*!\n * Stylus - Each\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node')\n , nodes = require('./');\n\n/**\n * Initialize a new `Each` node with the given `val` name,\n * `key` name, `expr`, and `block`.\n *\n * @param {String} val\n * @param {String} key\n * @param {Expression} expr\n * @param {Block} block\n * @api public\n */\n\nvar Each = module.exports = function Each(val, key, expr, block){\n Node.call(this);\n this.val = val;\n this.key = key;\n this.expr = expr;\n this.block = block;\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nEach.prototype.__proto__ = Node.prototype;\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nEach.prototype.clone = function(parent){\n var clone = new Each(this.val, this.key);\n clone.expr = this.expr.clone(parent, clone);\n clone.block = this.block.clone(parent, clone);\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nEach.prototype.toJSON = function(){\n return {\n __type: 'Each',\n val: this.val,\n key: this.key,\n expr: this.expr,\n block: this.block,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n", "\n/*!\n * Stylus - If\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new `If` with the given `cond`.\n *\n * @param {Expression} cond\n * @param {Boolean|Block} negate, block\n * @api public\n */\n\nvar If = module.exports = function If(cond, negate){\n Node.call(this);\n this.cond = cond;\n this.elses = [];\n if (negate && negate.nodeName) {\n this.block = negate;\n } else {\n this.negate = negate;\n }\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nIf.prototype.__proto__ = Node.prototype;\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nIf.prototype.clone = function(parent){\n var clone = new If();\n clone.cond = this.cond.clone(parent, clone);\n clone.block = this.block.clone(parent, clone);\n clone.elses = this.elses.map(function(node){ return node.clone(parent, clone); });\n clone.negate = this.negate;\n clone.postfix = this.postfix;\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nIf.prototype.toJSON = function(){\n return {\n __type: 'If',\n cond: this.cond,\n block: this.block,\n elses: this.elses,\n negate: this.negate,\n postfix: this.postfix,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n", "\n/*!\n * Stylus - Call\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new `Call` with `name` and `args`.\n *\n * @param {String} name\n * @param {Expression} args\n * @api public\n */\n\nvar Call = module.exports = function Call(name, args){\n Node.call(this);\n this.name = name;\n this.args = args;\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nCall.prototype.__proto__ = Node.prototype;\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nCall.prototype.clone = function(parent){\n var clone = new Call(this.name);\n clone.args = this.args.clone(parent, clone);\n if (this.block) clone.block = this.block.clone(parent, clone);\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n return clone;\n};\n\n/**\n * Return <name>(param1, param2, ...).\n *\n * @return {String}\n * @api public\n */\n\nCall.prototype.toString = function(){\n var args = this.args.nodes.map(function(node) {\n var str = node.toString();\n return str.slice(1, str.length - 1);\n }).join(', ');\n\n return this.name + '(' + args + ')';\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nCall.prototype.toJSON = function(){\n var json = {\n __type: 'Call',\n name: this.name,\n args: this.args,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n if (this.block) json.block = this.block;\n return json;\n};\n", "\n/*!\n * Stylus - UnaryOp\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new `UnaryOp` with `op`, and `expr`.\n *\n * @param {String} op\n * @param {Node} expr\n * @api public\n */\n\nvar UnaryOp = module.exports = function UnaryOp(op, expr){\n Node.call(this);\n this.op = op;\n this.expr = expr;\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nUnaryOp.prototype.__proto__ = Node.prototype;\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nUnaryOp.prototype.clone = function(parent){\n var clone = new UnaryOp(this.op);\n clone.expr = this.expr.clone(parent, clone);\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nUnaryOp.prototype.toJSON = function(){\n return {\n __type: 'UnaryOp',\n op: this.op,\n expr: this.expr,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n", "\n/*!\n * Stylus - BinOp\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new `BinOp` with `op`, `left` and `right`.\n *\n * @param {String} op\n * @param {Node} left\n * @param {Node} right\n * @api public\n */\n\nvar BinOp = module.exports = function BinOp(op, left, right){\n Node.call(this);\n this.op = op;\n this.left = left;\n this.right = right;\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nBinOp.prototype.__proto__ = Node.prototype;\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nBinOp.prototype.clone = function(parent){\n var clone = new BinOp(this.op);\n clone.left = this.left.clone(parent, clone);\n clone.right = this.right && this.right.clone(parent, clone);\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n if (this.val) clone.val = this.val.clone(parent, clone);\n return clone;\n};\n\n/**\n * Return <left> <op> <right>\n *\n * @return {String}\n * @api public\n */\nBinOp.prototype.toString = function() {\n return this.left.toString() + ' ' + this.op + ' ' + this.right.toString();\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nBinOp.prototype.toJSON = function(){\n var json = {\n __type: 'BinOp',\n left: this.left,\n right: this.right,\n op: this.op,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n if (this.val) json.val = this.val;\n return json;\n};\n", "\n/*!\n * Stylus - Ternary\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new `Ternary` with `cond`, `trueExpr` and `falseExpr`.\n *\n * @param {Expression} cond\n * @param {Expression} trueExpr\n * @param {Expression} falseExpr\n * @api public\n */\n\nvar Ternary = module.exports = function Ternary(cond, trueExpr, falseExpr){\n Node.call(this);\n this.cond = cond;\n this.trueExpr = trueExpr;\n this.falseExpr = falseExpr;\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nTernary.prototype.__proto__ = Node.prototype;\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nTernary.prototype.clone = function(parent){\n var clone = new Ternary();\n clone.cond = this.cond.clone(parent, clone);\n clone.trueExpr = this.trueExpr.clone(parent, clone);\n clone.falseExpr = this.falseExpr.clone(parent, clone);\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nTernary.prototype.toJSON = function(){\n return {\n __type: 'Ternary',\n cond: this.cond,\n trueExpr: this.trueExpr,\n falseExpr: this.falseExpr,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n", "\n/*!\n * Stylus - Block\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new `Block` node with `parent` Block.\n *\n * @param {Block} parent\n * @api public\n */\n\nvar Block = module.exports = function Block(parent, node){\n Node.call(this);\n this.nodes = [];\n this.parent = parent;\n this.node = node;\n this.scope = true;\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nBlock.prototype.__proto__ = Node.prototype;\n\n/**\n * Check if this block has properties..\n *\n * @return {Boolean}\n * @api public\n */\n\nBlock.prototype.__defineGetter__('hasProperties', function(){\n for (var i = 0, len = this.nodes.length; i < len; ++i) {\n if ('property' == this.nodes[i].nodeName) {\n return true;\n }\n }\n});\n\n/**\n * Check if this block has @media nodes.\n *\n * @return {Boolean}\n * @api public\n */\n\nBlock.prototype.__defineGetter__('hasMedia', function(){\n for (var i = 0, len = this.nodes.length; i < len; ++i) {\n var nodeName = this.nodes[i].nodeName;\n if ('media' == nodeName) {\n return true;\n }\n }\n return false;\n});\n\n/**\n * Check if this block is empty.\n *\n * @return {Boolean}\n * @api public\n */\n\nBlock.prototype.__defineGetter__('isEmpty', function(){\n return !this.nodes.length || this.nodes.every(function(n){return n.nodeName == 'comment'});\n});\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nBlock.prototype.clone = function(parent, node){\n parent = parent || this.parent;\n var clone = new Block(parent, node || this.node);\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n clone.scope = this.scope;\n this.nodes.forEach(function(node){\n clone.push(node.clone(clone, clone));\n });\n return clone;\n};\n\n/**\n * Push a `node` to this block.\n *\n * @param {Node} node\n * @api public\n */\n\nBlock.prototype.push = function(node){\n this.nodes.push(node);\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nBlock.prototype.toJSON = function(){\n return {\n __type: 'Block',\n // parent: this.parent,\n // node: this.node,\n scope: this.scope,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename,\n nodes: this.nodes\n };\n};\n", "\n/*!\n * Stylus - Unit\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node')\n , nodes = require('./');\n\n/**\n * Unit conversion table.\n */\n\nvar FACTOR_TABLE = {\n 'mm': {val: 1, label: 'mm'},\n 'cm': {val: 10, label: 'mm'},\n 'in': {val: 25.4, label: 'mm'},\n 'pt': {val: 25.4/72, label: 'mm'},\n 'ms': {val: 1, label: 'ms'},\n 's': {val: 1000, label: 'ms'},\n 'Hz': {val: 1, label: 'Hz'},\n 'kHz': {val: 1000, label: 'Hz'}\n};\n\n/**\n * Initialize a new `Unit` with the given `val` and unit `type`\n * such as \"px\", \"pt\", \"in\", etc.\n *\n * @param {String} val\n * @param {String} type\n * @api public\n */\n\nvar Unit = module.exports = function Unit(val, type){\n Node.call(this);\n this.val = val;\n this.type = type;\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nUnit.prototype.__proto__ = Node.prototype;\n\n/**\n * Return Boolean based on the unit value.\n *\n * @return {Boolean}\n * @api public\n */\n\nUnit.prototype.toBoolean = function(){\n return nodes.Boolean(this.type\n ? true\n : this.val);\n};\n\n/**\n * Return unit string.\n *\n * @return {String}\n * @api public\n */\n\nUnit.prototype.toString = function(){\n return this.val + (this.type || '');\n};\n\n/**\n * Return a clone of this node.\n *\n * @return {Node}\n * @api public\n */\n\nUnit.prototype.clone = function(){\n var clone = new Unit(this.val, this.type);\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nUnit.prototype.toJSON = function(){\n return {\n __type: 'Unit',\n val: this.val,\n type: this.type,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n\n/**\n * Operate on `right` with the given `op`.\n *\n * @param {String} op\n * @param {Node} right\n * @return {Node}\n * @api public\n */\n\nUnit.prototype.operate = function(op, right){\n var type = this.type || right.first.type;\n\n // swap color\n if ('rgba' == right.nodeName || 'hsla' == right.nodeName) {\n return right.operate(op, this);\n }\n\n // operate\n if (this.shouldCoerce(op)) {\n right = right.first;\n // percentages\n if ('%' != this.type && ('-' == op || '+' == op) && '%' == right.type) {\n right = new Unit(this.val * (right.val / 100), '%');\n } else {\n right = this.coerce(right);\n }\n\n switch (op) {\n case '-':\n return new Unit(this.val - right.val, type);\n case '+':\n // keyframes interpolation\n type = type || (right.type == '%' && right.type);\n return new Unit(this.val + right.val, type);\n case '/':\n return new Unit(this.val / right.val, type);\n case '*':\n return new Unit(this.val * right.val, type);\n case '%':\n return new Unit(this.val % right.val, type);\n case '**':\n return new Unit(Math.pow(this.val, right.val), type);\n case '..':\n case '...':\n var start = this.val\n , end = right.val\n , expr = new nodes.Expression\n , inclusive = '..' == op;\n if (start < end) {\n do {\n expr.push(new nodes.Unit(start));\n } while (inclusive ? ++start <= end : ++start < end);\n } else {\n do {\n expr.push(new nodes.Unit(start));\n } while (inclusive ? --start >= end : --start > end);\n }\n return expr;\n }\n }\n\n return Node.prototype.operate.call(this, op, right);\n};\n\n/**\n * Coerce `other` unit to the same type as `this` unit.\n *\n * Supports:\n *\n * mm -> cm | in\n * cm -> mm | in\n * in -> mm | cm\n *\n * ms -> s\n * s -> ms\n *\n * Hz -> kHz\n * kHz -> Hz\n *\n * @param {Unit} other\n * @return {Unit}\n * @api public\n */\n\nUnit.prototype.coerce = function(other){\n if ('unit' == other.nodeName) {\n var a = this\n , b = other\n , factorA = FACTOR_TABLE[a.type]\n , factorB = FACTOR_TABLE[b.type];\n\n if (factorA && factorB && (factorA.label == factorB.label)) {\n var bVal = b.val * (factorB.val / factorA.val);\n return new nodes.Unit(bVal, a.type);\n } else {\n return new nodes.Unit(b.val, a.type);\n }\n } else if ('string' == other.nodeName) {\n // keyframes interpolation\n if ('%' == other.val) return new nodes.Unit(0, '%');\n var val = parseFloat(other.val);\n if (isNaN(val)) Node.prototype.coerce.call(this, other);\n return new nodes.Unit(val);\n } else {\n return Node.prototype.coerce.call(this, other);\n }\n};\n", "/*!\n * Stylus - String\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node')\n , sprintf = require('../functions').s\n , utils = require('../utils')\n , nodes = require('./');\n\n/**\n * Initialize a new `String` with the given `val`.\n *\n * @param {String} val\n * @param {String} quote\n * @api public\n */\n\nvar String = module.exports = function String(val, quote){\n Node.call(this);\n this.val = val;\n this.string = val;\n this.prefixed = false;\n if (typeof quote !== 'string') {\n this.quote = \"'\";\n } else {\n this.quote = quote;\n }\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nString.prototype.__proto__ = Node.prototype;\n\n/**\n * Return quoted string.\n *\n * @return {String}\n * @api public\n */\n\nString.prototype.toString = function(){\n return this.quote + this.val + this.quote;\n};\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nString.prototype.clone = function(){\n var clone = new String(this.val, this.quote);\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nString.prototype.toJSON = function(){\n return {\n __type: 'String',\n val: this.val,\n quote: this.quote,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n\n/**\n * Return Boolean based on the length of this string.\n *\n * @return {Boolean}\n * @api public\n */\n\nString.prototype.toBoolean = function(){\n return nodes.Boolean(this.val.length);\n};\n\n/**\n * Coerce `other` to a string.\n *\n * @param {Node} other\n * @return {String}\n * @api public\n */\n\nString.prototype.coerce = function(other){\n switch (other.nodeName) {\n case 'string':\n return other;\n case 'expression':\n return new String(other.nodes.map(function(node){\n return this.coerce(node).val;\n }, this).join(' '));\n default:\n return new String(other.toString());\n }\n};\n\n/**\n * Operate on `right` with the given `op`.\n *\n * @param {String} op\n * @param {Node} right\n * @return {Node}\n * @api public\n */\n\nString.prototype.operate = function(op, right){\n switch (op) {\n case '%':\n var expr = new nodes.Expression;\n expr.push(this);\n\n // constructargs\n var args = 'expression' == right.nodeName\n ? utils.unwrap(right).nodes\n : [right];\n\n // apply\n return sprintf.apply(null, [expr].concat(args));\n case '+':\n var expr = new nodes.Expression;\n expr.push(new String(this.val + this.coerce(right).val));\n return expr;\n default:\n return Node.prototype.operate.call(this, op, right);\n }\n};\n", "\n/*!\n * Stylus - HSLA\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node')\n , nodes = require('./');\n\n/**\n * Initialize a new `HSLA` with the given h,s,l,a component values.\n *\n * @param {Number} h\n * @param {Number} s\n * @param {Number} l\n * @param {Number} a\n * @api public\n */\n\nvar HSLA = exports = module.exports = function HSLA(h,s,l,a){\n Node.call(this);\n this.h = clampDegrees(h);\n this.s = clampPercentage(s);\n this.l = clampPercentage(l);\n this.a = clampAlpha(a);\n this.hsla = this;\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nHSLA.prototype.__proto__ = Node.prototype;\n\n/**\n * Return hsla(n,n,n,n).\n *\n * @return {String}\n * @api public\n */\n\nHSLA.prototype.toString = function(){\n return 'hsla('\n + this.h + ','\n + this.s.toFixed(0) + '%,'\n + this.l.toFixed(0) + '%,'\n + this.a + ')';\n};\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nHSLA.prototype.clone = function(parent){\n var clone = new HSLA(\n this.h\n , this.s\n , this.l\n , this.a);\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nHSLA.prototype.toJSON = function(){\n return {\n __type: 'HSLA',\n h: this.h,\n s: this.s,\n l: this.l,\n a: this.a,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n\n/**\n * Return rgba `RGBA` representation.\n *\n * @return {RGBA}\n * @api public\n */\n\nHSLA.prototype.__defineGetter__('rgba', function(){\n return nodes.RGBA.fromHSLA(this);\n});\n\n/**\n * Return hash.\n *\n * @return {String}\n * @api public\n */\n\nHSLA.prototype.__defineGetter__('hash', function(){\n return this.rgba.toString();\n});\n\n/**\n * Add h,s,l to the current component values.\n *\n * @param {Number} h\n * @param {Number} s\n * @param {Number} l\n * @return {HSLA} new node\n * @api public\n */\n\nHSLA.prototype.add = function(h,s,l){\n return new HSLA(\n this.h + h\n , this.s + s\n , this.l + l\n , this.a);\n};\n\n/**\n * Subtract h,s,l from the current component values.\n *\n * @param {Number} h\n * @param {Number} s\n * @param {Number} l\n * @return {HSLA} new node\n * @api public\n */\n\nHSLA.prototype.sub = function(h,s,l){\n return this.add(-h, -s, -l);\n};\n\n/**\n * Operate on `right` with the given `op`.\n *\n * @param {String} op\n * @param {Node} right\n * @return {Node}\n * @api public\n */\n\nHSLA.prototype.operate = function(op, right){\n switch (op) {\n case '==':\n case '!=':\n case '<=':\n case '>=':\n case '<':\n case '>':\n case 'is a':\n case '||':\n case '&&':\n return this.rgba.operate(op, right);\n default:\n return this.rgba.operate(op, right).hsla;\n }\n};\n\n/**\n * Return `HSLA` representation of the given `color`.\n *\n * @param {RGBA} color\n * @return {HSLA}\n * @api public\n */\n\nexports.fromRGBA = function(rgba){\n var r = rgba.r / 255\n , g = rgba.g / 255\n , b = rgba.b / 255\n , a = rgba.a;\n\n var min = Math.min(r,g,b)\n , max = Math.max(r,g,b)\n , l = (max + min) / 2\n , d = max - min\n , h, s;\n\n switch (max) {\n case min: h = 0; break;\n case r: h = 60 * (g-b) / d; break;\n case g: h = 60 * (b-r) / d + 120; break;\n case b: h = 60 * (r-g) / d + 240; break;\n }\n\n if (max == min) {\n s = 0;\n } else if (l < .5) {\n s = d / (2 * l);\n } else {\n s = d / (2 - 2 * l);\n }\n\n h %= 360;\n s *= 100;\n l *= 100;\n\n return new HSLA(h,s,l,a);\n};\n\n/**\n * Adjust lightness by `percent`.\n *\n * @param {Number} percent\n * @return {HSLA} for chaining\n * @api public\n */\n\nHSLA.prototype.adjustLightness = function(percent){\n this.l = clampPercentage(this.l + this.l * (percent / 100));\n return this;\n};\n\n/**\n * Adjust hue by `deg`.\n *\n * @param {Number} deg\n * @return {HSLA} for chaining\n * @api public\n */\n\nHSLA.prototype.adjustHue = function(deg){\n this.h = clampDegrees(this.h + deg);\n return this;\n};\n\n/**\n * Clamp degree `n` >= 0 and <= 360.\n *\n * @param {Number} n\n * @return {Number}\n * @api private\n */\n\nfunction clampDegrees(n) {\n n = n % 360;\n return n >= 0 ? n : 360 + n;\n}\n\n/**\n * Clamp percentage `n` >= 0 and <= 100.\n *\n * @param {Number} n\n * @return {Number}\n * @api private\n */\n\nfunction clampPercentage(n) {\n return Math.max(0, Math.min(n, 100));\n}\n\n/**\n * Clamp alpha `n` >= 0 and <= 1.\n *\n * @param {Number} n\n * @return {Number}\n * @api private\n */\n\nfunction clampAlpha(n) {\n return Math.max(0, Math.min(n, 1));\n}\n", "\n/*!\n * Stylus - RGBA\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node')\n , HSLA = require('./hsla')\n , functions = require('../functions')\n , adjust = functions.adjust\n , nodes = require('./');\n\n/**\n * Initialize a new `RGBA` with the given r,g,b,a component values.\n *\n * @param {Number} r\n * @param {Number} g\n * @param {Number} b\n * @param {Number} a\n * @api public\n */\n\nvar RGBA = exports = module.exports = function RGBA(r,g,b,a){\n Node.call(this);\n this.r = clamp(r);\n this.g = clamp(g);\n this.b = clamp(b);\n this.a = clampAlpha(a);\n this.name = '';\n this.rgba = this;\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nRGBA.prototype.__proto__ = Node.prototype;\n\n/**\n * Return an `RGBA` without clamping values.\n * \n * @param {Number} r\n * @param {Number} g\n * @param {Number} b\n * @param {Number} a\n * @return {RGBA}\n * @api public\n */\n\nRGBA.withoutClamping = function(r,g,b,a){\n var rgba = new RGBA(0,0,0,0);\n rgba.r = r;\n rgba.g = g;\n rgba.b = b;\n rgba.a = a;\n return rgba;\n};\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nRGBA.prototype.clone = function(){\n var clone = new RGBA(\n this.r\n , this.g\n , this.b\n , this.a);\n clone.raw = this.raw;\n clone.name = this.name;\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nRGBA.prototype.toJSON = function(){\n return {\n __type: 'RGBA',\n r: this.r,\n g: this.g,\n b: this.b,\n a: this.a,\n raw: this.raw,\n name: this.name,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n\n/**\n * Return true.\n *\n * @return {Boolean}\n * @api public\n */\n\nRGBA.prototype.toBoolean = function(){\n return nodes.true;\n};\n\n/**\n * Return `HSLA` representation.\n *\n * @return {HSLA}\n * @api public\n */\n\nRGBA.prototype.__defineGetter__('hsla', function(){\n return HSLA.fromRGBA(this);\n});\n\n/**\n * Return hash.\n *\n * @return {String}\n * @api public\n */\n\nRGBA.prototype.__defineGetter__('hash', function(){\n return this.toString();\n});\n\n/**\n * Add r,g,b,a to the current component values.\n *\n * @param {Number} r\n * @param {Number} g\n * @param {Number} b\n * @param {Number} a\n * @return {RGBA} new node\n * @api public\n */\n\nRGBA.prototype.add = function(r,g,b,a){\n return new RGBA(\n this.r + r\n , this.g + g\n , this.b + b\n , this.a + a);\n};\n\n/**\n * Subtract r,g,b,a from the current component values.\n *\n * @param {Number} r\n * @param {Number} g\n * @param {Number} b\n * @param {Number} a\n * @return {RGBA} new node\n * @api public\n */\n\nRGBA.prototype.sub = function(r,g,b,a){\n return new RGBA(\n this.r - r\n , this.g - g\n , this.b - b\n , a == 1 ? this.a : this.a - a);\n};\n\n/**\n * Multiply rgb components by `n`.\n *\n * @param {String} n\n * @return {RGBA} new node\n * @api public\n */\n\nRGBA.prototype.multiply = function(n){\n return new RGBA(\n this.r * n\n , this.g * n\n , this.b * n\n , this.a); \n};\n\n/**\n * Divide rgb components by `n`.\n *\n * @param {String} n\n * @return {RGBA} new node\n * @api public\n */\n\nRGBA.prototype.divide = function(n){\n return new RGBA(\n this.r / n\n , this.g / n\n , this.b / n\n , this.a); \n};\n\n/**\n * Operate on `right` with the given `op`.\n *\n * @param {String} op\n * @param {Node} right\n * @return {Node}\n * @api public\n */\n\nRGBA.prototype.operate = function(op, right){\n if ('in' != op) right = right.first\n\n switch (op) {\n case 'is a':\n if ('string' == right.nodeName && 'color' == right.string) {\n return nodes.true;\n }\n break;\n case '+':\n switch (right.nodeName) {\n case 'unit':\n var n = right.val;\n switch (right.type) {\n case '%': return adjust(this, new nodes.String('lightness'), right);\n case 'deg': return this.hsla.adjustHue(n).rgba;\n default: return this.add(n,n,n,0);\n }\n case 'rgba':\n return this.add(right.r, right.g, right.b, right.a);\n case 'hsla':\n return this.hsla.add(right.h, right.s, right.l);\n }\n break;\n case '-':\n switch (right.nodeName) {\n case 'unit':\n var n = right.val;\n switch (right.type) {\n case '%': return adjust(this, new nodes.String('lightness'), new nodes.Unit(-n, '%'));\n case 'deg': return this.hsla.adjustHue(-n).rgba;\n default: return this.sub(n,n,n,0);\n }\n case 'rgba':\n return this.sub(right.r, right.g, right.b, right.a);\n case 'hsla':\n return this.hsla.sub(right.h, right.s, right.l);\n }\n break;\n case '*':\n switch (right.nodeName) {\n case 'unit':\n return this.multiply(right.val);\n }\n break;\n case '/':\n switch (right.nodeName) {\n case 'unit':\n return this.divide(right.val);\n }\n break;\n }\n return Node.prototype.operate.call(this, op, right);\n};\n\n/**\n * Return #nnnnnn, #nnn, or rgba(n,n,n,n) string representation of the color.\n *\n * @return {String}\n * @api public\n */\n\nRGBA.prototype.toString = function(){\n function pad(n) {\n return n < 16\n ? '0' + n.toString(16)\n : n.toString(16);\n }\n\n // special case for transparent named color\n if ('transparent' == this.name)\n return this.name;\n\n if (1 == this.a) {\n var r = pad(this.r)\n , g = pad(this.g)\n , b = pad(this.b);\n\n // Compress\n if (r[0] == r[1] && g[0] == g[1] && b[0] == b[1]) {\n return '#' + r[0] + g[0] + b[0];\n } else {\n return '#' + r + g + b;\n }\n } else {\n return 'rgba('\n + this.r + ','\n + this.g + ','\n + this.b + ','\n + (+this.a.toFixed(3)) + ')';\n }\n};\n\n/**\n * Return a `RGBA` from the given `hsla`.\n *\n * @param {HSLA} hsla\n * @return {RGBA}\n * @api public\n */\n\nexports.fromHSLA = function(hsla){\n var h = hsla.h / 360\n , s = hsla.s / 100\n , l = hsla.l / 100\n , a = hsla.a;\n\n var m2 = l <= .5 ? l * (s + 1) : l + s - l * s\n , m1 = l * 2 - m2;\n\n var r = hue(h + 1/3) * 0xff\n , g = hue(h) * 0xff\n , b = hue(h - 1/3) * 0xff;\n\n function hue(h) {\n if (h < 0) ++h;\n if (h > 1) --h;\n if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n if (h * 2 < 1) return m2;\n if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;\n return m1;\n }\n \n return new RGBA(r,g,b,a);\n};\n\n/**\n * Clamp `n` >= 0 and <= 255.\n *\n * @param {Number} n\n * @return {Number}\n * @api private\n */\n\nfunction clamp(n) {\n return Math.max(0, Math.min(n.toFixed(0), 255));\n}\n\n/**\n * Clamp alpha `n` >= 0 and <= 1.\n *\n * @param {Number} n\n * @return {Number}\n * @api private\n */\n\nfunction clampAlpha(n) {\n return Math.max(0, Math.min(n, 1));\n}\n", "\n/*!\n * Stylus - Ident\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node')\n , nodes = require('./');\n\n/**\n * Initialize a new `Ident` by `name` with the given `val` node.\n *\n * @param {String} name\n * @param {Node} val\n * @api public\n */\n\nvar Ident = module.exports = function Ident(name, val, mixin){\n Node.call(this);\n this.name = name;\n this.string = name;\n this.val = val || nodes.null;\n this.mixin = !!mixin;\n};\n\n/**\n * Check if the variable has a value.\n *\n * @return {Boolean}\n * @api public\n */\n\nIdent.prototype.__defineGetter__('isEmpty', function(){\n return undefined == this.val;\n});\n\n/**\n * Return hash.\n *\n * @return {String}\n * @api public\n */\n\nIdent.prototype.__defineGetter__('hash', function(){\n return this.name;\n});\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nIdent.prototype.__proto__ = Node.prototype;\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nIdent.prototype.clone = function(parent){\n var clone = new Ident(this.name);\n clone.val = this.val.clone(parent, clone);\n clone.mixin = this.mixin;\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n clone.property = this.property;\n clone.rest = this.rest;\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nIdent.prototype.toJSON = function(){\n return {\n __type: 'Ident',\n name: this.name,\n val: this.val,\n mixin: this.mixin,\n property: this.property,\n rest: this.rest,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n\n/**\n * Return <name>.\n *\n * @return {String}\n * @api public\n */\n\nIdent.prototype.toString = function(){\n return this.name;\n};\n\n/**\n * Coerce `other` to an ident.\n *\n * @param {Node} other\n * @return {String}\n * @api public\n */\n\nIdent.prototype.coerce = function(other){\n switch (other.nodeName) {\n case 'ident':\n case 'string':\n case 'literal':\n return new Ident(other.string);\n case 'unit':\n return new Ident(other.toString());\n default:\n return Node.prototype.coerce.call(this, other);\n }\n};\n\n/**\n * Operate on `right` with the given `op`.\n *\n * @param {String} op\n * @param {Node} right\n * @return {Node}\n * @api public\n */\n\nIdent.prototype.operate = function(op, right){\n var val = right.first;\n switch (op) {\n case '-':\n if ('unit' == val.nodeName) {\n var expr = new nodes.Expression;\n val = val.clone();\n val.val = -val.val;\n expr.push(this);\n expr.push(val);\n return expr;\n }\n case '+':\n return new nodes.Ident(this.string + this.coerce(val).string);\n }\n return Node.prototype.operate.call(this, op, right);\n};\n", "\n/*!\n * Stylus - Group\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new `Group`.\n *\n * @api public\n */\n\nvar Group = module.exports = function Group(){\n Node.call(this);\n this.nodes = [];\n this.extends = [];\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nGroup.prototype.__proto__ = Node.prototype;\n\n/**\n * Push the given `selector` node.\n *\n * @param {Selector} selector\n * @api public\n */\n\nGroup.prototype.push = function(selector){\n this.nodes.push(selector);\n};\n\n/**\n * Return this set's `Block`.\n */\n\nGroup.prototype.__defineGetter__('block', function(){\n return this.nodes[0].block;\n});\n\n/**\n * Assign `block` to each selector in this set.\n *\n * @param {Block} block\n * @api public\n */\n\nGroup.prototype.__defineSetter__('block', function(block){\n for (var i = 0, len = this.nodes.length; i < len; ++i) {\n this.nodes[i].block = block;\n }\n});\n\n/**\n * Check if this set has only placeholders.\n *\n * @return {Boolean}\n * @api public\n */\n\nGroup.prototype.__defineGetter__('hasOnlyPlaceholders', function(){\n return this.nodes.every(function(selector) { return selector.isPlaceholder; });\n});\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nGroup.prototype.clone = function(parent){\n var clone = new Group;\n clone.lineno = this.lineno;\n clone.column = this.column;\n this.nodes.forEach(function(node){\n clone.push(node.clone(parent, clone));\n });\n clone.filename = this.filename;\n clone.block = this.block.clone(parent, clone);\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nGroup.prototype.toJSON = function(){\n return {\n __type: 'Group',\n nodes: this.nodes,\n block: this.block,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n", "\n/*!\n * Stylus - Literal\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node')\n , nodes = require('./');\n\n/**\n * Initialize a new `Literal` with the given `str`.\n *\n * @param {String} str\n * @api public\n */\n\nvar Literal = module.exports = function Literal(str){\n Node.call(this);\n this.val = str;\n this.string = str;\n this.prefixed = false;\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nLiteral.prototype.__proto__ = Node.prototype;\n\n/**\n * Return hash.\n *\n * @return {String}\n * @api public\n */\n\nLiteral.prototype.__defineGetter__('hash', function(){\n return this.val;\n});\n\n/**\n * Return literal value.\n *\n * @return {String}\n * @api public\n */\n\nLiteral.prototype.toString = function(){\n return this.val.toString();\n};\n\n/**\n * Coerce `other` to a literal.\n *\n * @param {Node} other\n * @return {String}\n * @api public\n */\n\nLiteral.prototype.coerce = function(other){\n switch (other.nodeName) {\n case 'ident':\n case 'string':\n case 'literal':\n return new Literal(other.string);\n default:\n return Node.prototype.coerce.call(this, other);\n }\n};\n\n/**\n * Operate on `right` with the given `op`.\n *\n * @param {String} op\n * @param {Node} right\n * @return {Node}\n * @api public\n */\n\nLiteral.prototype.operate = function(op, right){\n var val = right.first;\n switch (op) {\n case '+':\n return new nodes.Literal(this.string + this.coerce(val).string);\n default:\n return Node.prototype.operate.call(this, op, right);\n }\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nLiteral.prototype.toJSON = function(){\n return {\n __type: 'Literal',\n val: this.val,\n string: this.string,\n prefixed: this.prefixed,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n", "\n/*!\n * Stylus - Boolean\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node')\n , nodes = require('./');\n\n/**\n * Initialize a new `Boolean` node with the given `val`.\n *\n * @param {Boolean} val\n * @api public\n */\n\nvar Boolean = module.exports = function Boolean(val){\n Node.call(this);\n if (this.nodeName) {\n this.val = !!val;\n } else {\n return new Boolean(val);\n }\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nBoolean.prototype.__proto__ = Node.prototype;\n\n/**\n * Return `this` node.\n *\n * @return {Boolean}\n * @api public\n */\n\nBoolean.prototype.toBoolean = function(){\n return this;\n};\n\n/**\n * Return `true` if this node represents `true`.\n *\n * @return {Boolean}\n * @api public\n */\n\nBoolean.prototype.__defineGetter__('isTrue', function(){\n return this.val;\n});\n\n/**\n * Return `true` if this node represents `false`.\n *\n * @return {Boolean}\n * @api public\n */\n\nBoolean.prototype.__defineGetter__('isFalse', function(){\n return ! this.val;\n});\n\n/**\n * Negate the value.\n *\n * @return {Boolean}\n * @api public\n */\n\nBoolean.prototype.negate = function(){\n return new Boolean(!this.val);\n};\n\n/**\n * Return 'Boolean'.\n *\n * @return {String}\n * @api public\n */\n\nBoolean.prototype.inspect = function(){\n return '[Boolean ' + this.val + ']';\n};\n\n/**\n * Return 'true' or 'false'.\n *\n * @return {String}\n * @api public\n */\n\nBoolean.prototype.toString = function(){\n return this.val\n ? 'true'\n : 'false';\n};\n\n/**\n * Return a JSON representaiton of this node.\n *\n * @return {Object}\n * @api public\n */\n\nBoolean.prototype.toJSON = function(){\n return {\n __type: 'Boolean',\n val: this.val\n };\n};\n", "\n/*!\n * Stylus - Return\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node')\n , nodes = require('./');\n\n/**\n * Initialize a new `Return` node with the given `expr`.\n *\n * @param {Expression} expr\n * @api public\n */\n\nvar Return = module.exports = function Return(expr){\n this.expr = expr || nodes.null;\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nReturn.prototype.__proto__ = Node.prototype;\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nReturn.prototype.clone = function(parent){\n var clone = new Return();\n clone.expr = this.expr.clone(parent, clone);\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nReturn.prototype.toJSON = function(){\n return {\n __type: 'Return',\n expr: this.expr,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n", "/*!\n * Stylus - at-rule\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new at-rule node.\n *\n * @param {String} type\n * @api public\n */\n\nvar Atrule = module.exports = function Atrule(type){\n Node.call(this);\n this.type = type;\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nAtrule.prototype.__proto__ = Node.prototype;\n\n/**\n * Check if at-rule's block has only properties.\n *\n * @return {Boolean}\n * @api public\n */\n\nAtrule.prototype.__defineGetter__('hasOnlyProperties', function(){\n if (!this.block) return false;\n\n var nodes = this.block.nodes;\n for (var i = 0, len = nodes.length; i < len; ++i) {\n var nodeName = nodes[i].nodeName;\n switch(nodes[i].nodeName) {\n case 'property':\n case 'expression':\n case 'comment':\n continue;\n default:\n return false;\n }\n }\n return true;\n});\n\n/**\n * Return a clone of this node.\n *\n * @return {Node}\n * @api public\n */\n\nAtrule.prototype.clone = function(parent){\n var clone = new Atrule(this.type);\n if (this.block) clone.block = this.block.clone(parent, clone);\n clone.segments = this.segments.map(function(node){ return node.clone(parent, clone); });\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nAtrule.prototype.toJSON = function(){\n var json = {\n __type: 'Atrule',\n type: this.type,\n segments: this.segments,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n if (this.block) json.block = this.block;\n return json;\n};\n\n/**\n * Return @<type>.\n *\n * @return {String}\n * @api public\n */\n\nAtrule.prototype.toString = function(){\n return '@' + this.type;\n};\n\n/**\n * Check if the at-rule's block has output nodes.\n *\n * @return {Boolean}\n * @api public\n */\n\nAtrule.prototype.__defineGetter__('hasOutput', function(){\n return !!this.block && hasOutput(this.block);\n});\n\nfunction hasOutput(block) {\n var nodes = block.nodes;\n\n // only placeholder selectors\n if (nodes.every(function(node){\n return 'group' == node.nodeName && node.hasOnlyPlaceholders;\n })) return false;\n\n // something visible\n return nodes.some(function(node) {\n switch (node.nodeName) {\n case 'property':\n case 'literal':\n case 'import':\n return true;\n case 'block':\n return hasOutput(node);\n default:\n if (node.block) return hasOutput(node.block);\n }\n });\n}\n", "\n/*!\n * Stylus - Media\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Atrule = require('./atrule');\n\n/**\n * Initialize a new `Media` with the given `val`\n *\n * @param {String} val\n * @api public\n */\n\nvar Media = module.exports = function Media(val){\n Atrule.call(this, 'media');\n this.val = val;\n};\n\n/**\n * Inherit from `Atrule.prototype`.\n */\n\nMedia.prototype.__proto__ = Atrule.prototype;\n\n/**\n * Clone this node.\n *\n * @return {Media}\n * @api public\n */\n\nMedia.prototype.clone = function(parent){\n var clone = new Media;\n clone.val = this.val.clone(parent, clone);\n clone.block = this.block.clone(parent, clone);\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nMedia.prototype.toJSON = function(){\n return {\n __type: 'Media',\n val: this.val,\n block: this.block,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n\n/**\n * Return @media \"val\".\n *\n * @return {String}\n * @api public\n */\n\nMedia.prototype.toString = function(){\n return '@media ' + this.val;\n};\n", "\n/*!\n * Stylus - QueryList\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new `QueryList`.\n *\n * @api public\n */\n\nvar QueryList = module.exports = function QueryList(){\n Node.call(this);\n this.nodes = [];\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nQueryList.prototype.__proto__ = Node.prototype;\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nQueryList.prototype.clone = function(parent){\n var clone = new QueryList;\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n for (var i = 0; i < this.nodes.length; ++i) {\n clone.push(this.nodes[i].clone(parent, clone));\n }\n return clone;\n};\n\n/**\n * Push the given `node`.\n *\n * @param {Node} node\n * @api public\n */\n\nQueryList.prototype.push = function(node){\n this.nodes.push(node);\n};\n\n/**\n * Merges this query list with the `other`.\n *\n * @param {QueryList} other\n * @return {QueryList}\n * @api private\n */\n\nQueryList.prototype.merge = function(other){\n var list = new QueryList\n , merged;\n this.nodes.forEach(function(query){\n for (var i = 0, len = other.nodes.length; i < len; ++i){\n merged = query.merge(other.nodes[i]);\n if (merged) list.push(merged);\n }\n });\n return list;\n};\n\n/**\n * Return \"<a>, <b>, <c>\"\n *\n * @return {String}\n * @api public\n */\n\nQueryList.prototype.toString = function(){\n return '(' + this.nodes.map(function(node){\n return node.toString();\n }).join(', ') + ')';\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nQueryList.prototype.toJSON = function(){\n return {\n __type: 'QueryList',\n nodes: this.nodes,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n", "\n/*!\n * Stylus - Query\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new `Query`.\n *\n * @api public\n */\n\nvar Query = module.exports = function Query(){\n Node.call(this);\n this.nodes = [];\n this.type = '';\n this.predicate = '';\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nQuery.prototype.__proto__ = Node.prototype;\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nQuery.prototype.clone = function(parent){\n var clone = new Query;\n clone.predicate = this.predicate;\n clone.type = this.type;\n for (var i = 0, len = this.nodes.length; i < len; ++i) {\n clone.push(this.nodes[i].clone(parent, clone));\n }\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n return clone;\n};\n\n/**\n * Push the given `feature`.\n *\n * @param {Feature} feature\n * @api public\n */\n\nQuery.prototype.push = function(feature){\n this.nodes.push(feature);\n};\n\n/**\n * Return resolved type of this query.\n *\n * @return {String}\n * @api private\n */\n\nQuery.prototype.__defineGetter__('resolvedType', function(){\n if (this.type) {\n return this.type.nodeName\n ? this.type.string\n : this.type;\n }\n});\n\n/**\n * Return resolved predicate of this query.\n *\n * @return {String}\n * @api private\n */\n\nQuery.prototype.__defineGetter__('resolvedPredicate', function(){\n if (this.predicate) {\n return this.predicate.nodeName\n ? this.predicate.string\n : this.predicate;\n }\n});\n\n/**\n * Merges this query with the `other`.\n *\n * @param {Query} other\n * @return {Query}\n * @api private\n */\n\nQuery.prototype.merge = function(other){\n var query = new Query\n , p1 = this.resolvedPredicate\n , p2 = other.resolvedPredicate\n , t1 = this.resolvedType\n , t2 = other.resolvedType\n , type, pred;\n\n // Stolen from Sass :D\n t1 = t1 || t2;\n t2 = t2 || t1;\n if (('not' == p1) ^ ('not' == p2)) {\n if (t1 == t2) return;\n type = ('not' == p1) ? t2 : t1;\n pred = ('not' == p1) ? p2 : p1;\n } else if (('not' == p1) && ('not' == p2)) {\n if (t1 != t2) return;\n type = t1;\n pred = 'not';\n } else if (t1 != t2) {\n return;\n } else {\n type = t1;\n pred = p1 || p2;\n }\n query.predicate = pred;\n query.type = type;\n query.nodes = this.nodes.concat(other.nodes);\n return query;\n};\n\n/**\n * Return \"<a> and <b> and <c>\"\n *\n * @return {String}\n * @api public\n */\n\nQuery.prototype.toString = function(){\n var pred = this.predicate ? this.predicate + ' ' : ''\n , type = this.type || ''\n , len = this.nodes.length\n , str = pred + type;\n if (len) {\n str += (type && ' and ') + this.nodes.map(function(expr){\n return expr.toString();\n }).join(' and ');\n }\n return str;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nQuery.prototype.toJSON = function(){\n return {\n __type: 'Query',\n predicate: this.predicate,\n type: this.type,\n nodes: this.nodes,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n", "\n/*!\n * Stylus - Feature\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new `Feature` with the given `segs`.\n *\n * @param {Array} segs\n * @api public\n */\n\nvar Feature = module.exports = function Feature(segs){\n Node.call(this);\n this.segments = segs;\n this.expr = null;\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nFeature.prototype.__proto__ = Node.prototype;\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nFeature.prototype.clone = function(parent){\n var clone = new Feature;\n clone.segments = this.segments.map(function(node){ return node.clone(parent, clone); });\n if (this.expr) clone.expr = this.expr.clone(parent, clone);\n if (this.name) clone.name = this.name;\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n return clone;\n};\n\n/**\n * Return \"<ident>\" or \"(<ident>: <expr>)\"\n *\n * @return {String}\n * @api public\n */\n\nFeature.prototype.toString = function(){\n if (this.expr) {\n return '(' + this.segments.join('') + ': ' + this.expr.toString() + ')';\n } else {\n return this.segments.join('');\n }\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nFeature.prototype.toJSON = function(){\n var json = {\n __type: 'Feature',\n segments: this.segments,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n if (this.expr) json.expr = this.expr;\n if (this.name) json.name = this.name;\n return json;\n};\n", "\n/*!\n * Stylus - Params\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new `Params` with `name`, `params`, and `body`.\n *\n * @param {String} name\n * @param {Params} params\n * @param {Expression} body\n * @api public\n */\n\nvar Params = module.exports = function Params(){\n Node.call(this);\n this.nodes = [];\n};\n\n/**\n * Check function arity.\n *\n * @return {Boolean}\n * @api public\n */\n\nParams.prototype.__defineGetter__('length', function(){\n return this.nodes.length;\n});\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nParams.prototype.__proto__ = Node.prototype;\n\n/**\n * Push the given `node`.\n *\n * @param {Node} node\n * @api public\n */\n\nParams.prototype.push = function(node){\n this.nodes.push(node);\n};\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nParams.prototype.clone = function(parent){\n var clone = new Params;\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n this.nodes.forEach(function(node){\n clone.push(node.clone(parent, clone));\n });\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nParams.prototype.toJSON = function(){\n return {\n __type: 'Params',\n nodes: this.nodes,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n\n", "\n/*!\n * Stylus - Comment\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new `Comment` with the given `str`.\n *\n * @param {String} str\n * @param {Boolean} suppress\n * @param {Boolean} inline\n * @api public\n */\n\nvar Comment = module.exports = function Comment(str, suppress, inline){\n Node.call(this);\n this.str = str;\n this.suppress = suppress;\n this.inline = inline;\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nComment.prototype.__proto__ = Node.prototype;\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nComment.prototype.toJSON = function(){\n return {\n __type: 'Comment',\n str: this.str,\n suppress: this.suppress,\n inline: this.inline,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n\n/**\n * Return comment.\n *\n * @return {String}\n * @api public\n */\n\nComment.prototype.toString = function(){\n return this.str;\n};\n", "\n/*!\n * Stylus - Keyframes\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Atrule = require('./atrule');\n\n/**\n * Initialize a new `Keyframes` with the given `segs`,\n * and optional vendor `prefix`.\n *\n * @param {Array} segs\n * @param {String} prefix\n * @api public\n */\n\nvar Keyframes = module.exports = function Keyframes(segs, prefix){\n Atrule.call(this, 'keyframes');\n this.segments = segs;\n this.prefix = prefix || 'official';\n};\n\n/**\n * Inherit from `Atrule.prototype`.\n */\n\nKeyframes.prototype.__proto__ = Atrule.prototype;\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nKeyframes.prototype.clone = function(parent){\n var clone = new Keyframes;\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n clone.segments = this.segments.map(function(node) { return node.clone(parent, clone); });\n clone.prefix = this.prefix;\n clone.block = this.block.clone(parent, clone);\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nKeyframes.prototype.toJSON = function(){\n return {\n __type: 'Keyframes',\n segments: this.segments,\n prefix: this.prefix,\n block: this.block,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n\n/**\n * Return `@keyframes name`.\n *\n * @return {String}\n * @api public\n */\n\nKeyframes.prototype.toString = function(){\n return '@keyframes ' + this.segments.join('');\n};\n", "\n/*!\n * Stylus - Member\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new `Member` with `left` and `right`.\n *\n * @param {Node} left\n * @param {Node} right\n * @api public\n */\n\nvar Member = module.exports = function Member(left, right){\n Node.call(this);\n this.left = left;\n this.right = right;\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nMember.prototype.__proto__ = Node.prototype;\n\n/**\n * Return a clone of this node.\n *\n * @return {Node}\n * @api public\n */\n\nMember.prototype.clone = function(parent){\n var clone = new Member;\n clone.left = this.left.clone(parent, clone);\n clone.right = this.right.clone(parent, clone);\n if (this.val) clone.val = this.val.clone(parent, clone);\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nMember.prototype.toJSON = function(){\n var json = {\n __type: 'Member',\n left: this.left,\n right: this.right,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n if (this.val) json.val = this.val;\n return json;\n};\n\n/**\n * Return a string representation of this node.\n *\n * @return {String}\n * @api public\n */\n\nMember.prototype.toString = function(){\n return this.left.toString()\n + '.' + this.right.toString();\n};\n", "\n/*!\n * Stylus - Charset\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new `Charset` with the given `val`\n *\n * @param {String} val\n * @api public\n */\n\nvar Charset = module.exports = function Charset(val){\n Node.call(this);\n this.val = val;\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nCharset.prototype.__proto__ = Node.prototype;\n\n/**\n * Return @charset \"val\".\n *\n * @return {String}\n * @api public\n */\n\nCharset.prototype.toString = function(){\n return '@charset ' + this.val;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nCharset.prototype.toJSON = function(){\n return {\n __type: 'Charset',\n val: this.val,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n", "/*!\n * Stylus - Namespace\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new `Namespace` with the given `val` and `prefix`\n *\n * @param {String|Call} val\n * @param {String} [prefix]\n * @api public\n */\n\nvar Namespace = module.exports = function Namespace(val, prefix){\n Node.call(this);\n this.val = val;\n this.prefix = prefix;\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nNamespace.prototype.__proto__ = Node.prototype;\n\n/**\n * Return @namespace \"val\".\n *\n * @return {String}\n * @api public\n */\n\nNamespace.prototype.toString = function(){\n return '@namespace ' + (this.prefix ? this.prefix + ' ' : '') + this.val;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nNamespace.prototype.toJSON = function(){\n return {\n __type: 'Namespace',\n val: this.val,\n prefix: this.prefix,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n", "\n/*!\n * Stylus - Import\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new `Import` with the given `expr`.\n *\n * @param {Expression} expr\n * @api public\n */\n\nvar Import = module.exports = function Import(expr, once){\n Node.call(this);\n this.path = expr;\n this.once = once || false;\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nImport.prototype.__proto__ = Node.prototype;\n\n/**\n * Return a clone of this node.\n *\n * @return {Node}\n * @api public\n */\n\nImport.prototype.clone = function(parent){\n var clone = new Import();\n clone.path = this.path.nodeName ? this.path.clone(parent, clone) : this.path;\n clone.once = this.once;\n clone.mtime = this.mtime;\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nImport.prototype.toJSON = function(){\n return {\n __type: 'Import',\n path: this.path,\n once: this.once,\n mtime: this.mtime,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n", "\n/*!\n * Stylus - Extend\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new `Extend` with the given `selectors` array.\n *\n * @param {Array} selectors array of the selectors\n * @api public\n */\n\nvar Extend = module.exports = function Extend(selectors){\n Node.call(this);\n this.selectors = selectors;\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nExtend.prototype.__proto__ = Node.prototype;\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nExtend.prototype.clone = function(){\n return new Extend(this.selectors);\n};\n\n/**\n * Return `@extend selectors`.\n *\n * @return {String}\n * @api public\n */\n\nExtend.prototype.toString = function(){\n return '@extend ' + this.selectors.join(', ');\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nExtend.prototype.toJSON = function(){\n return {\n __type: 'Extend',\n selectors: this.selectors,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n", "\n/*!\n * Stylus - Object\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node')\n , nodes = require('./')\n , nativeObj = {}.constructor;\n\n/**\n * Initialize a new `Object`.\n *\n * @api public\n */\n\nvar Object = module.exports = function Object(){\n Node.call(this);\n this.vals = {};\n this.keys = {};\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nObject.prototype.__proto__ = Node.prototype;\n\n/**\n * Set `key` to `val`.\n *\n * @param {String} key\n * @param {Node} val\n * @return {Object} for chaining\n * @api public\n */\n\nObject.prototype.setValue = function(key, val){\n this.vals[key] = val;\n return this;\n};\n\n/**\n * Alias for `setValue` for compatible API\n */\nObject.prototype.set = Object.prototype.setValue;\n\n/**\n * Set `key` to `val`.\n *\n * @param {String} key\n * @param {Node} val\n * @return {Object} for chaining\n * @api public\n */\n\nObject.prototype.setKey = function(key, val){\n this.keys[key] = val;\n return this;\n};\n\n/**\n * Return length.\n *\n * @return {Number}\n * @api public\n */\n\nObject.prototype.__defineGetter__('length', function() {\n return nativeObj.keys(this.vals).length;\n});\n\n/**\n * Get `key`.\n *\n * @param {String} key\n * @return {Node}\n * @api public\n */\n\nObject.prototype.get = function(key){\n return this.vals[key] || nodes.null;\n};\n\n/**\n * Has `key`?\n *\n * @param {String} key\n * @return {Boolean}\n * @api public\n */\n\nObject.prototype.has = function(key){\n return key in this.vals;\n};\n\n/**\n * Operate on `right` with the given `op`.\n *\n * @param {String} op\n * @param {Node} right\n * @return {Node}\n * @api public\n */\n\nObject.prototype.operate = function(op, right){\n switch (op) {\n case '.':\n case '[]':\n return this.get(right.hash);\n case '==':\n var vals = this.vals\n , a\n , b;\n if ('object' != right.nodeName || this.length != right.length)\n return nodes.false;\n for (var key in vals) {\n a = vals[key];\n b = right.vals[key];\n if (a.operate(op, b).isFalse)\n return nodes.false;\n }\n return nodes.true;\n case '!=':\n return this.operate('==', right).negate();\n default:\n return Node.prototype.operate.call(this, op, right);\n }\n};\n\n/**\n * Return Boolean based on the length of this object.\n *\n * @return {Boolean}\n * @api public\n */\n\nObject.prototype.toBoolean = function(){\n return nodes.Boolean(this.length);\n};\n\n/**\n * Convert object to string with properties.\n *\n * @return {String}\n * @api private\n */\n\nObject.prototype.toBlock = function(){\n var str = '{'\n , key\n , val;\n\n for (key in this.vals) {\n val = this.get(key);\n if ('object' == val.first.nodeName) {\n str += key + ' ' + val.first.toBlock();\n } else {\n switch (key) {\n case '@charset':\n str += key + ' ' + val.first.toString() + ';';\n break;\n default:\n str += key + ':' + toString(val) + ';';\n }\n }\n }\n\n str += '}';\n\n return str;\n\n function toString(node) {\n if (node.nodes) {\n return node.nodes.map(toString).join(node.isList ? ',' : ' ');\n } else if ('literal' == node.nodeName && ',' == node.val) {\n return '\\\\,';\n }\n return node.toString();\n }\n};\n\n/**\n * Return a clone of this node.\n *\n * @return {Node}\n * @api public\n */\n\nObject.prototype.clone = function(parent){\n var clone = new Object;\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n\n var key;\n for (key in this.vals) {\n clone.vals[key] = this.vals[key].clone(parent, clone);\n }\n\n for (key in this.keys) {\n clone.keys[key] = this.keys[key].clone(parent, clone);\n }\n\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nObject.prototype.toJSON = function(){\n return {\n __type: 'Object',\n vals: this.vals,\n keys: this.keys,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n\n/**\n * Return \"{ <prop>: <val> }\"\n *\n * @return {String}\n * @api public\n */\n\nObject.prototype.toString = function(){\n var obj = {};\n for (var prop in this.vals) {\n obj[prop] = this.vals[prop].toString();\n }\n return JSON.stringify(obj);\n};\n", "\n/*!\n * Stylus - Function\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new `Function` with `name`, `params`, and `body`.\n *\n * @param {String} name\n * @param {Params|Function} params\n * @param {Block} body\n * @api public\n */\n\nvar Function = module.exports = function Function(name, params, body){\n Node.call(this);\n this.name = name;\n this.params = params;\n this.block = body;\n if ('function' == typeof params) this.fn = params;\n};\n\n/**\n * Check function arity.\n *\n * @return {Boolean}\n * @api public\n */\n\nFunction.prototype.__defineGetter__('arity', function(){\n return this.params.length;\n});\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nFunction.prototype.__proto__ = Node.prototype;\n\n/**\n * Return hash.\n *\n * @return {String}\n * @api public\n */\n\nFunction.prototype.__defineGetter__('hash', function(){\n return 'function ' + this.name;\n});\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nFunction.prototype.clone = function(parent){\n if (this.fn) {\n var clone = new Function(\n this.name\n , this.fn);\n } else {\n var clone = new Function(this.name);\n clone.params = this.params.clone(parent, clone);\n clone.block = this.block.clone(parent, clone);\n }\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n return clone;\n};\n\n/**\n * Return <name>(param1, param2, ...).\n *\n * @return {String}\n * @api public\n */\n\nFunction.prototype.toString = function(){\n if (this.fn) {\n return this.name\n + '('\n + this.fn.toString()\n .match(/^function *\\w*\\((.*?)\\)/)\n .slice(1)\n .join(', ')\n + ')';\n } else {\n return this.name\n + '('\n + this.params.nodes.join(', ')\n + ')';\n }\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nFunction.prototype.toJSON = function(){\n var json = {\n __type: 'Function',\n name: this.name,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n if (this.fn) {\n json.fn = this.fn;\n } else {\n json.params = this.params;\n json.block = this.block;\n }\n return json;\n};\n", "\n/*!\n * Stylus - Property\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new `Property` with the given `segs` and optional `expr`.\n *\n * @param {Array} segs\n * @param {Expression} expr\n * @api public\n */\n\nvar Property = module.exports = function Property(segs, expr){\n Node.call(this);\n this.segments = segs;\n this.expr = expr;\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nProperty.prototype.__proto__ = Node.prototype;\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nProperty.prototype.clone = function(parent){\n var clone = new Property(this.segments);\n clone.name = this.name;\n if (this.literal) clone.literal = this.literal;\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n clone.segments = this.segments.map(function(node){ return node.clone(parent, clone); });\n if (this.expr) clone.expr = this.expr.clone(parent, clone);\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nProperty.prototype.toJSON = function(){\n var json = {\n __type: 'Property',\n segments: this.segments,\n name: this.name,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n if (this.expr) json.expr = this.expr;\n if (this.literal) json.literal = this.literal;\n return json;\n};\n\n/**\n * Return string representation of this node.\n *\n * @return {String}\n * @api public\n */\n\nProperty.prototype.toString = function(){\n return 'property(' + this.segments.join('') + ', ' + this.expr + ')';\n};\n\n/**\n * Operate on the property expression.\n *\n * @param {String} op\n * @param {Node} right\n * @return {Node}\n * @api public\n */\n\nProperty.prototype.operate = function(op, right, val){\n return this.expr.operate(op, right, val);\n};\n", "\n/*!\n * Stylus - Selector\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Block = require('./block')\n , Node = require('./node');\n\n/**\n * Initialize a new `Selector` with the given `segs`.\n *\n * @param {Array} segs\n * @api public\n */\n\nvar Selector = module.exports = function Selector(segs){\n Node.call(this);\n this.inherits = true;\n this.segments = segs;\n this.optional = false;\n};\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nSelector.prototype.__proto__ = Node.prototype;\n\n/**\n * Return the selector string.\n *\n * @return {String}\n * @api public\n */\n\nSelector.prototype.toString = function(){\n return this.segments.join('') + (this.optional ? ' !optional' : '');\n};\n\n/**\n * Check if this is placeholder selector.\n *\n * @return {Boolean}\n * @api public\n */\n\nSelector.prototype.__defineGetter__('isPlaceholder', function(){\n return this.val && ~this.val.substr(0, 2).indexOf('$');\n});\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nSelector.prototype.clone = function(parent){\n var clone = new Selector;\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n clone.inherits = this.inherits;\n clone.val = this.val;\n clone.segments = this.segments.map(function(node){ return node.clone(parent, clone); });\n clone.optional = this.optional;\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nSelector.prototype.toJSON = function(){\n return {\n __type: 'Selector',\n inherits: this.inherits,\n segments: this.segments,\n optional: this.optional,\n val: this.val,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n", "\n/*!\n * Stylus - Expression\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node')\n , nodes = require('../nodes')\n , utils = require('../utils');\n\n/**\n * Initialize a new `Expression`.\n *\n * @param {Boolean} isList\n * @api public\n */\n\nvar Expression = module.exports = function Expression(isList){\n Node.call(this);\n this.nodes = [];\n this.isList = isList;\n};\n\n/**\n * Check if the variable has a value.\n *\n * @return {Boolean}\n * @api public\n */\n\nExpression.prototype.__defineGetter__('isEmpty', function(){\n return !this.nodes.length;\n});\n\n/**\n * Return the first node in this expression.\n *\n * @return {Node}\n * @api public\n */\n\nExpression.prototype.__defineGetter__('first', function(){\n return this.nodes[0]\n ? this.nodes[0].first\n : nodes.null;\n});\n\n/**\n * Hash all the nodes in order.\n *\n * @return {String}\n * @api public\n */\n\nExpression.prototype.__defineGetter__('hash', function(){\n return this.nodes.map(function(node){\n return node.hash;\n }).join('::');\n});\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nExpression.prototype.__proto__ = Node.prototype;\n\n/**\n * Return a clone of this node.\n * \n * @return {Node}\n * @api public\n */\n\nExpression.prototype.clone = function(parent){\n var clone = new this.constructor(this.isList);\n clone.preserve = this.preserve;\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n clone.nodes = this.nodes.map(function(node) {\n return node.clone(parent, clone);\n });\n return clone;\n};\n\n/**\n * Push the given `node`.\n *\n * @param {Node} node\n * @api public\n */\n\nExpression.prototype.push = function(node){\n this.nodes.push(node);\n};\n\n/**\n * Operate on `right` with the given `op`.\n *\n * @param {String} op\n * @param {Node} right\n * @return {Node}\n * @api public\n */\n\nExpression.prototype.operate = function(op, right, val){\n switch (op) {\n case '[]=':\n var self = this\n , range = utils.unwrap(right).nodes\n , val = utils.unwrap(val)\n , len\n , node;\n range.forEach(function(unit){\n len = self.nodes.length;\n if ('unit' == unit.nodeName) {\n var i = unit.val < 0 ? len + unit.val : unit.val\n , n = i;\n while (i-- > len) self.nodes[i] = nodes.null;\n self.nodes[n] = val;\n } else if (unit.string) {\n node = self.nodes[0];\n if (node && 'object' == node.nodeName) node.set(unit.string, val.clone());\n }\n });\n return val;\n case '[]':\n var expr = new nodes.Expression\n , vals = utils.unwrap(this).nodes\n , range = utils.unwrap(right).nodes\n , node;\n range.forEach(function(unit){\n if ('unit' == unit.nodeName) {\n node = vals[unit.val < 0 ? vals.length + unit.val : unit.val];\n } else if ('object' == vals[0].nodeName) {\n node = vals[0].get(unit.string);\n }\n if (node) expr.push(node);\n });\n return expr.isEmpty\n ? nodes.null\n : utils.unwrap(expr);\n case '||':\n return this.toBoolean().isTrue\n ? this\n : right;\n case 'in':\n return Node.prototype.operate.call(this, op, right);\n case '!=':\n return this.operate('==', right, val).negate();\n case '==':\n var len = this.nodes.length\n , right = right.toExpression()\n , a\n , b;\n if (len != right.nodes.length) return nodes.false;\n for (var i = 0; i < len; ++i) {\n a = this.nodes[i];\n b = right.nodes[i];\n if (a.operate(op, b).isTrue) continue;\n return nodes.false;\n }\n return nodes.true;\n break;\n default:\n return this.first.operate(op, right, val);\n }\n};\n\n/**\n * Expressions with length > 1 are truthy,\n * otherwise the first value's toBoolean()\n * method is invoked.\n *\n * @return {Boolean}\n * @api public\n */\n\nExpression.prototype.toBoolean = function(){\n if (this.nodes.length > 1) return nodes.true;\n return this.first.toBoolean();\n};\n\n/**\n * Return \"<a> <b> <c>\" or \"<a>, <b>, <c>\" if\n * the expression represents a list.\n *\n * @return {String}\n * @api public\n */\n\nExpression.prototype.toString = function(){\n return '(' + this.nodes.map(function(node){\n return node.toString();\n }).join(this.isList ? ', ' : ' ') + ')';\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nExpression.prototype.toJSON = function(){\n return {\n __type: 'Expression',\n isList: this.isList,\n preserve: this.preserve,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename,\n nodes: this.nodes\n };\n};\n", "\n/*!\n * Stylus - Arguments\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar nodes = require('../nodes');\n\n/**\n * Initialize a new `Arguments`.\n *\n * @api public\n */\n\nvar Arguments = module.exports = function Arguments(){\n nodes.Expression.call(this);\n this.map = {};\n};\n\n/**\n * Inherit from `nodes.Expression.prototype`.\n */\n\nArguments.prototype.__proto__ = nodes.Expression.prototype;\n\n/**\n * Initialize an `Arguments` object with the nodes\n * from the given `expr`.\n *\n * @param {Expression} expr\n * @return {Arguments}\n * @api public\n */\n\nArguments.fromExpression = function(expr){\n var args = new Arguments\n , len = expr.nodes.length;\n args.lineno = expr.lineno;\n args.column = expr.column;\n args.isList = expr.isList;\n for (var i = 0; i < len; ++i) {\n args.push(expr.nodes[i]);\n }\n return args;\n};\n\n/**\n * Return a clone of this node.\n *\n * @return {Node}\n * @api public\n */\n\nArguments.prototype.clone = function(parent){\n var clone = nodes.Expression.prototype.clone.call(this, parent);\n clone.map = {};\n for (var key in this.map) {\n clone.map[key] = this.map[key].clone(parent, clone);\n }\n clone.isList = this.isList;\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nArguments.prototype.toJSON = function(){\n return {\n __type: 'Arguments',\n map: this.map,\n isList: this.isList,\n preserve: this.preserve,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename,\n nodes: this.nodes\n };\n};\n", "/*!\n * Stylus - @block\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Node = require('./node');\n\n/**\n * Initialize a new `@block` node.\n *\n * @api public\n */\n\nvar Atblock = module.exports = function Atblock(){\n Node.call(this);\n};\n\n/**\n * Return `block` nodes.\n */\n\nAtblock.prototype.__defineGetter__('nodes', function(){\n return this.block.nodes;\n});\n\n/**\n * Inherit from `Node.prototype`.\n */\n\nAtblock.prototype.__proto__ = Node.prototype;\n\n/**\n * Return a clone of this node.\n *\n * @return {Node}\n * @api public\n */\n\nAtblock.prototype.clone = function(parent){\n var clone = new Atblock;\n clone.block = this.block.clone(parent, clone);\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n return clone;\n};\n\n/**\n * Return @block.\n *\n * @return {String}\n * @api public\n */\n\nAtblock.prototype.toString = function(){\n return '@block';\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nAtblock.prototype.toJSON = function(){\n return {\n __type: 'Atblock',\n block: this.block,\n lineno: this.lineno,\n column: this.column,\n fileno: this.fileno\n };\n};\n", "/*!\n * Stylus - supports\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Atrule = require('./atrule');\n\n/**\n * Initialize a new supports node.\n *\n * @param {Expression} condition\n * @api public\n */\n\nvar Supports = module.exports = function Supports(condition){\n Atrule.call(this, 'supports');\n this.condition = condition;\n};\n\n/**\n * Inherit from `Atrule.prototype`.\n */\n\nSupports.prototype.__proto__ = Atrule.prototype;\n\n/**\n * Return a clone of this node.\n *\n * @return {Node}\n * @api public\n */\n\nSupports.prototype.clone = function(parent){\n var clone = new Supports;\n clone.condition = this.condition.clone(parent, clone);\n clone.block = this.block.clone(parent, clone);\n clone.lineno = this.lineno;\n clone.column = this.column;\n clone.filename = this.filename;\n return clone;\n};\n\n/**\n * Return a JSON representation of this node.\n *\n * @return {Object}\n * @api public\n */\n\nSupports.prototype.toJSON = function(){\n return {\n __type: 'Supports',\n condition: this.condition,\n block: this.block,\n lineno: this.lineno,\n column: this.column,\n filename: this.filename\n };\n};\n\n/**\n * Return @supports\n *\n * @return {String}\n * @api public\n */\n\nSupports.prototype.toString = function(){\n return '@supports ' + this.condition;\n};\n", "\n/*!\n * Stylus - nodes\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\nexports.lineno = null;\nexports.column = null;\nexports.filename = null;\n\n/**\n * Constructors\n */\n\nexports.Node = require('./node');\nexports.Root = require('./root');\nexports.Null = require('./null');\nexports.Each = require('./each');\nexports.If = require('./if');\nexports.Call = require('./call');\nexports.UnaryOp = require('./unaryop');\nexports.BinOp = require('./binop');\nexports.Ternary = require('./ternary');\nexports.Block = require('./block');\nexports.Unit = require('./unit');\nexports.String = require('./string');\nexports.HSLA = require('./hsla');\nexports.RGBA = require('./rgba');\nexports.Ident = require('./ident');\nexports.Group = require('./group');\nexports.Literal = require('./literal');\nexports.Boolean = require('./boolean');\nexports.Return = require('./return');\nexports.Media = require('./media');\nexports.QueryList = require('./query-list');\nexports.Query = require('./query');\nexports.Feature = require('./feature');\nexports.Params = require('./params');\nexports.Comment = require('./comment');\nexports.Keyframes = require('./keyframes');\nexports.Member = require('./member');\nexports.Charset = require('./charset');\nexports.Namespace = require('./namespace');\nexports.Import = require('./import');\nexports.Extend = require('./extend');\nexports.Object = require('./object');\nexports.Function = require('./function');\nexports.Property = require('./property');\nexports.Selector = require('./selector');\nexports.Expression = require('./expression');\nexports.Arguments = require('./arguments');\nexports.Atblock = require('./atblock');\nexports.Atrule = require('./atrule');\nexports.Supports = require('./supports');\n\n/**\n * Singletons.\n */\n\nexports.true = new exports.Boolean(true);\nexports.false = new exports.Boolean(false);\nexports.null = new exports.Null;\n", "\n/*!\n * Stylus - errors\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Expose constructors.\n */\n\nexports.ParseError = ParseError;\nexports.SyntaxError = SyntaxError;\n\n/**\n * Initialize a new `ParseError` with the given `msg`.\n *\n * @param {String} msg\n * @api private\n */\n\nfunction ParseError(msg) {\n this.name = 'ParseError';\n this.message = msg;\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ParseError);\n }\n}\n\n/**\n * Inherit from `Error.prototype`.\n */\n\nParseError.prototype.__proto__ = Error.prototype;\n\n/**\n * Initialize a new `SyntaxError` with the given `msg`.\n *\n * @param {String} msg\n * @api private\n */\n\nfunction SyntaxError(msg) {\n this.name = 'SyntaxError';\n this.message = msg;\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ParseError);\n }\n}\n\n/**\n * Inherit from `Error.prototype`.\n */\n\nSyntaxError.prototype.__proto__ = Error.prototype;\n", "\n/*!\n * Stylus - Lexer\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Token = require('./token')\n , nodes = require('./nodes')\n , errors = require('./errors');\n\n/**\n * Expose `Lexer`.\n */\n\nexports = module.exports = Lexer;\n\n/**\n * Operator aliases.\n */\n\nvar alias = {\n 'and': '&&'\n , 'or': '||'\n , 'is': '=='\n , 'isnt': '!='\n , 'is not': '!='\n , ':=': '?='\n};\n\n/**\n * Initialize a new `Lexer` with the given `str` and `options`.\n *\n * @param {String} str\n * @param {Object} options\n * @api private\n */\n\nfunction Lexer(str, options) {\n options = options || {};\n this.stash = [];\n this.indentStack = [];\n this.indentRe = null;\n this.lineno = 1;\n this.column = 1;\n\n // HACK!\n function comment(str, val, offset, s) {\n var inComment = s.lastIndexOf('/*', offset) > s.lastIndexOf('*/', offset)\n , commentIdx = s.lastIndexOf('//', offset)\n , i = s.lastIndexOf('\\n', offset)\n , double = 0\n , single = 0;\n\n if (~commentIdx && commentIdx > i) {\n while (i != offset) {\n if (\"'\" == s[i]) single ? single-- : single++;\n if ('\"' == s[i]) double ? double-- : double++;\n\n if ('/' == s[i] && '/' == s[i + 1]) {\n inComment = !single && !double;\n break;\n }\n ++i;\n }\n }\n\n return inComment\n ? str\n : ((val === ',' && /^[,\\t\\n]+$/.test(str)) ? str.replace(/\\n/, '\\r') : val + '\\r');\n };\n\n // Remove UTF-8 BOM.\n if ('\\uFEFF' == str.charAt(0)) str = str.slice(1);\n\n this.str = str\n .replace(/\\s+$/, '\\n')\n .replace(/\\r\\n?/g, '\\n')\n .replace(/\\\\ *\\n/g, '\\r')\n .replace(/([,(:](?!\\/\\/[^ ])) *(?:\\/\\/[^\\n]*|\\/\\*.*?\\*\\/)?\\n\\s*/g, comment)\n .replace(/\\s*\\n[ \\t]*([,)])/g, comment);\n};\n\n/**\n * Lexer prototype.\n */\n\nLexer.prototype = {\n\n /**\n * Custom inspect.\n */\n\n inspect: function(){\n var tok\n , tmp = this.str\n , buf = [];\n while ('eos' != (tok = this.next()).type) {\n buf.push(tok.inspect());\n }\n this.str = tmp;\n return buf.concat(tok.inspect()).join('\\n');\n },\n\n /**\n * Lookahead `n` tokens.\n *\n * @param {Number} n\n * @return {Object}\n * @api private\n */\n\n lookahead: function(n){\n var fetch = n - this.stash.length;\n while (fetch-- > 0) this.stash.push(this.advance());\n return this.stash[--n];\n },\n\n /**\n * Consume the given `len`.\n *\n * @param {Number|Array} len\n * @api private\n */\n\n skip: function(len){\n var chunk = len[0];\n len = chunk ? chunk.length : len;\n this.str = this.str.substr(len);\n if (chunk) {\n this.move(chunk);\n } else {\n this.column += len;\n }\n },\n\n /**\n * Move current line and column position.\n *\n * @param {String} str\n * @api private\n */\n\n move: function(str){\n var lines = str.match(/\\n/g)\n , idx = str.lastIndexOf('\\n');\n\n if (lines) this.lineno += lines.length;\n this.column = ~idx\n ? str.length - idx\n : this.column + str.length;\n },\n\n /**\n * Fetch next token including those stashed by peek.\n *\n * @return {Token}\n * @api private\n */\n\n next: function() {\n var tok = this.stashed() || this.advance();\n this.prev = tok;\n return tok;\n },\n\n /**\n * Check if the current token is a part of selector.\n *\n * @return {Boolean}\n * @api private\n */\n\n isPartOfSelector: function() {\n var tok = this.stash[this.stash.length - 1] || this.prev;\n switch (tok && tok.type) {\n // #for\n case 'color':\n return 2 == tok.val.raw.length;\n // .or\n case '.':\n // [is]\n case '[':\n return true;\n }\n return false;\n },\n\n /**\n * Fetch next token.\n *\n * @return {Token}\n * @api private\n */\n\n advance: function() {\n var column = this.column\n , line = this.lineno\n , tok = this.eos()\n || this.null()\n || this.sep()\n || this.keyword()\n || this.urlchars()\n || this.comment()\n || this.newline()\n || this.escaped()\n || this.important()\n || this.literal()\n || this.anonFunc()\n || this.atrule()\n || this.function()\n || this.brace()\n || this.paren()\n || this.color()\n || this.string()\n || this.unit()\n || this.namedop()\n || this.boolean()\n || this.unicode()\n || this.ident()\n || this.op()\n || (function () {\n var token = this.eol();\n\n if (token) {\n column = token.column;\n line = token.lineno;\n }\n\n return token;\n }).call(this)\n || this.space()\n || this.selector();\n\n tok.lineno = line;\n tok.column = column;\n\n return tok;\n },\n\n /**\n * Lookahead a single token.\n *\n * @return {Token}\n * @api private\n */\n\n peek: function() {\n return this.lookahead(1);\n },\n\n /**\n * Return the next possibly stashed token.\n *\n * @return {Token}\n * @api private\n */\n\n stashed: function() {\n return this.stash.shift();\n },\n\n /**\n * EOS | trailing outdents.\n */\n\n eos: function() {\n if (this.str.length) return;\n if (this.indentStack.length) {\n this.indentStack.shift();\n return new Token('outdent');\n } else {\n return new Token('eos');\n }\n },\n\n /**\n * url char\n */\n\n urlchars: function() {\n var captures;\n if (!this.isURL) return;\n if (captures = /^[\\/:@.;?&=*!,<>#%0-9]+/.exec(this.str)) {\n this.skip(captures);\n return new Token('literal', new nodes.Literal(captures[0]));\n }\n },\n\n /**\n * ';' [ \\t]*\n */\n\n sep: function() {\n var captures;\n if (captures = /^;[ \\t]*/.exec(this.str)) {\n this.skip(captures);\n return new Token(';');\n }\n },\n\n /**\n * '\\r'\n */\n\n eol: function() {\n if ('\\r' == this.str[0]) {\n ++this.lineno;\n this.skip(1);\n\n this.column = 1;\n while(this.space());\n\n return this.advance();\n }\n },\n\n /**\n * ' '+\n */\n\n space: function() {\n var captures;\n if (captures = /^([ \\t]+)/.exec(this.str)) {\n this.skip(captures);\n return new Token('space');\n }\n },\n\n /**\n * '\\\\' . ' '*\n */\n\n escaped: function() {\n var captures;\n if (captures = /^\\\\(.)[ \\t]*/.exec(this.str)) {\n var c = captures[1];\n this.skip(captures);\n return new Token('ident', new nodes.Literal(c));\n }\n },\n\n /**\n * '@css' ' '* '{' .* '}' ' '*\n */\n\n literal: function() {\n // HACK attack !!!\n var captures;\n if (captures = /^@css[ \\t]*\\{/.exec(this.str)) {\n this.skip(captures);\n var c\n , braces = 1\n , css = ''\n , node;\n while (c = this.str[0]) {\n this.str = this.str.substr(1);\n switch (c) {\n case '{': ++braces; break;\n case '}': --braces; break;\n case '\\n':\n case '\\r':\n ++this.lineno;\n break;\n }\n css += c;\n if (!braces) break;\n }\n css = css.replace(/\\s*}$/, '');\n node = new nodes.Literal(css);\n node.css = true;\n return new Token('literal', node);\n }\n },\n\n /**\n * '!important' ' '*\n */\n\n important: function() {\n var captures;\n if (captures = /^!important[ \\t]*/.exec(this.str)) {\n this.skip(captures);\n return new Token('ident', new nodes.Literal('!important'));\n }\n },\n\n /**\n * '{' | '}'\n */\n\n brace: function() {\n var captures;\n if (captures = /^([{}])/.exec(this.str)) {\n this.skip(1);\n var brace = captures[1];\n return new Token(brace, brace);\n }\n },\n\n /**\n * '(' | ')' ' '*\n */\n\n paren: function() {\n var captures;\n if (captures = /^([()])([ \\t]*)/.exec(this.str)) {\n var paren = captures[1];\n this.skip(captures);\n if (')' == paren) this.isURL = false;\n var tok = new Token(paren, paren);\n tok.space = captures[2];\n return tok;\n }\n },\n\n /**\n * 'null'\n */\n\n null: function() {\n var captures\n , tok;\n if (captures = /^(null)\\b[ \\t]*/.exec(this.str)) {\n this.skip(captures);\n if (this.isPartOfSelector()) {\n tok = new Token('ident', new nodes.Ident(captures[0]));\n } else {\n tok = new Token('null', nodes.null);\n }\n return tok;\n }\n },\n\n /**\n * 'if'\n * | 'else'\n * | 'unless'\n * | 'return'\n * | 'for'\n * | 'in'\n */\n\n keyword: function() {\n var captures\n , tok;\n if (captures = /^(return|if|else|unless|for|in)\\b(?!-)[ \\t]*/.exec(this.str)) {\n var keyword = captures[1];\n this.skip(captures);\n if (this.isPartOfSelector()) {\n tok = new Token('ident', new nodes.Ident(captures[0]));\n } else {\n tok = new Token(keyword, keyword);\n }\n return tok;\n }\n },\n\n /**\n * 'not'\n * | 'and'\n * | 'or'\n * | 'is'\n * | 'is not'\n * | 'isnt'\n * | 'is a'\n * | 'is defined'\n */\n\n namedop: function() {\n var captures\n , tok;\n if (captures = /^(not|and|or|is a|is defined|isnt|is not|is)(?!-)\\b([ \\t]*)/.exec(this.str)) {\n var op = captures[1];\n this.skip(captures);\n if (this.isPartOfSelector()) {\n tok = new Token('ident', new nodes.Ident(captures[0]));\n } else {\n op = alias[op] || op;\n tok = new Token(op, op);\n }\n tok.space = captures[2];\n return tok;\n }\n },\n\n /**\n * ','\n * | '+'\n * | '+='\n * | '-'\n * | '-='\n * | '*'\n * | '*='\n * | '/'\n * | '/='\n * | '%'\n * | '%='\n * | '**'\n * | '!'\n * | '&'\n * | '&&'\n * | '||'\n * | '>'\n * | '>='\n * | '<'\n * | '<='\n * | '='\n * | '=='\n * | '!='\n * | '!'\n * | '~'\n * | '?='\n * | ':='\n * | '?'\n * | ':'\n * | '['\n * | ']'\n * | '.'\n * | '..'\n * | '...'\n */\n\n op: function() {\n var captures;\n if (captures = /^([.]{1,3}|&&|\\|\\||[!<>=?:]=|\\*\\*|[-+*\\/%]=?|[,=?:!~<>&\\[\\]])([ \\t]*)/.exec(this.str)) {\n var op = captures[1];\n this.skip(captures);\n op = alias[op] || op;\n var tok = new Token(op, op);\n tok.space = captures[2];\n this.isURL = false;\n return tok;\n }\n },\n\n /**\n * '@('\n */\n\n anonFunc: function() {\n var tok;\n if ('@' == this.str[0] && '(' == this.str[1]) {\n this.skip(2);\n tok = new Token('function', new nodes.Ident('anonymous'));\n tok.anonymous = true;\n return tok;\n }\n },\n\n /**\n * '@' (-(\\w+)-)?[a-zA-Z0-9-_]+\n */\n\n atrule: function() {\n var captures;\n if (captures = /^@(?!apply)(?:-(\\w+)-)?([a-zA-Z0-9-_]+)[ \\t]*/.exec(this.str)) {\n this.skip(captures);\n var vendor = captures[1]\n , type = captures[2]\n , tok;\n switch (type) {\n case 'require':\n case 'import':\n case 'charset':\n case 'namespace':\n case 'media':\n case 'scope':\n case 'supports':\n return new Token(type);\n case 'document':\n return new Token('-moz-document');\n case 'block':\n return new Token('atblock');\n case 'extend':\n case 'extends':\n return new Token('extend');\n case 'keyframes':\n return new Token(type, vendor);\n default:\n return new Token('atrule', (vendor ? '-' + vendor + '-' + type : type));\n }\n }\n },\n\n /**\n * '//' *\n */\n\n comment: function() {\n // Single line\n if ('/' == this.str[0] && '/' == this.str[1]) {\n var end = this.str.indexOf('\\n');\n if (-1 == end) end = this.str.length;\n this.skip(end);\n return this.advance();\n }\n\n // Multi-line\n if ('/' == this.str[0] && '*' == this.str[1]) {\n var end = this.str.indexOf('*/');\n if (-1 == end) end = this.str.length;\n var str = this.str.substr(0, end + 2)\n , lines = str.split(/\\n|\\r/).length - 1\n , suppress = true\n , inline = false;\n this.lineno += lines;\n this.skip(end + 2);\n // output\n if ('!' == str[2]) {\n str = str.replace('*!', '*');\n suppress = false;\n }\n if (this.prev && ';' == this.prev.type) inline = true;\n return new Token('comment', new nodes.Comment(str, suppress, inline));\n }\n },\n\n /**\n * 'true' | 'false'\n */\n\n boolean: function() {\n var captures;\n if (captures = /^(true|false)\\b([ \\t]*)/.exec(this.str)) {\n var val = nodes.Boolean('true' == captures[1]);\n this.skip(captures);\n var tok = new Token('boolean', val);\n tok.space = captures[2];\n return tok;\n }\n },\n\n /**\n * 'U+' [0-9A-Fa-f?]{1,6}(?:-[0-9A-Fa-f]{1,6})?\n */\n\n unicode: function() {\n var captures;\n if (captures = /^u\\+[0-9a-f?]{1,6}(?:-[0-9a-f]{1,6})?/i.exec(this.str)) {\n this.skip(captures);\n return new Token('literal', new nodes.Literal(captures[0]));\n }\n },\n\n /**\n * -*[_a-zA-Z$] [-\\w\\d$]* '('\n */\n\n function: function() {\n var captures;\n if (captures = /^(-*[_a-zA-Z$][-\\w\\d$]*)\\(([ \\t]*)/.exec(this.str)) {\n var name = captures[1];\n this.skip(captures);\n this.isURL = 'url' == name;\n var tok = new Token('function', new nodes.Ident(name));\n tok.space = captures[2];\n return tok;\n }\n },\n\n /**\n * -*[_a-zA-Z$] [-\\w\\d$]*\n */\n\n ident: function() {\n var captures;\n if (captures = /^-*([_a-zA-Z$]|@apply)[-\\w\\d$]*/.exec(this.str)) {\n this.skip(captures);\n return new Token('ident', new nodes.Ident(captures[0]));\n }\n },\n\n /**\n * '\\n' ' '+\n */\n\n newline: function() {\n var captures, re;\n\n // we have established the indentation regexp\n if (this.indentRe){\n captures = this.indentRe.exec(this.str);\n // figure out if we are using tabs or spaces\n } else {\n // try tabs\n re = /^\\n([\\t]*)[ \\t]*/;\n captures = re.exec(this.str);\n\n // nope, try spaces\n if (captures && !captures[1].length) {\n re = /^\\n([ \\t]*)/;\n captures = re.exec(this.str);\n }\n\n // established\n if (captures && captures[1].length) this.indentRe = re;\n }\n\n\n if (captures) {\n var tok\n , indents = captures[1].length;\n\n this.skip(captures);\n if (this.str[0] === ' ' || this.str[0] === '\\t') {\n throw new errors.SyntaxError('Invalid indentation. You can use tabs or spaces to indent, but not both.');\n }\n\n // Blank line\n if ('\\n' == this.str[0]) return this.advance();\n\n // Outdent\n if (this.indentStack.length && indents < this.indentStack[0]) {\n while (this.indentStack.length && this.indentStack[0] > indents) {\n this.stash.push(new Token('outdent'));\n this.indentStack.shift();\n }\n tok = this.stash.pop();\n // Indent\n } else if (indents && indents != this.indentStack[0]) {\n this.indentStack.unshift(indents);\n tok = new Token('indent');\n // Newline\n } else {\n tok = new Token('newline');\n }\n\n return tok;\n }\n },\n\n /**\n * '-'? (digit+ | digit* '.' digit+) unit\n */\n\n unit: function() {\n var captures;\n if (captures = /^(-)?(\\d+\\.\\d+|\\d+|\\.\\d+)(%|[a-zA-Z]+)?[ \\t]*/.exec(this.str)) {\n this.skip(captures);\n var n = parseFloat(captures[2]);\n if ('-' == captures[1]) n = -n;\n var node = new nodes.Unit(n, captures[3]);\n node.raw = captures[0];\n return new Token('unit', node);\n }\n },\n\n /**\n * '\"' [^\"]+ '\"' | \"'\"\" [^']+ \"'\"\n */\n\n string: function() {\n var captures;\n if (captures = /^(\"[^\"]*\"|'[^']*')[ \\t]*/.exec(this.str)) {\n var str = captures[1]\n , quote = captures[0][0];\n this.skip(captures);\n str = str.slice(1,-1).replace(/\\\\n/g, '\\n');\n return new Token('string', new nodes.String(str, quote));\n }\n },\n\n /**\n * #rrggbbaa | #rrggbb | #rgba | #rgb | #nn | #n\n */\n\n color: function() {\n return this.rrggbbaa()\n || this.rrggbb()\n || this.rgba()\n || this.rgb()\n || this.nn()\n || this.n()\n },\n\n /**\n * #n\n */\n\n n: function() {\n var captures;\n if (captures = /^#([a-fA-F0-9]{1})[ \\t]*/.exec(this.str)) {\n this.skip(captures);\n var n = parseInt(captures[1] + captures[1], 16)\n , color = new nodes.RGBA(n, n, n, 1);\n color.raw = captures[0];\n return new Token('color', color);\n }\n },\n\n /**\n * #nn\n */\n\n nn: function() {\n var captures;\n if (captures = /^#([a-fA-F0-9]{2})[ \\t]*/.exec(this.str)) {\n this.skip(captures);\n var n = parseInt(captures[1], 16)\n , color = new nodes.RGBA(n, n, n, 1);\n color.raw = captures[0];\n return new Token('color', color);\n }\n },\n\n /**\n * #rgb\n */\n\n rgb: function() {\n var captures;\n if (captures = /^#([a-fA-F0-9]{3})[ \\t]*/.exec(this.str)) {\n this.skip(captures);\n var rgb = captures[1]\n , r = parseInt(rgb[0] + rgb[0], 16)\n , g = parseInt(rgb[1] + rgb[1], 16)\n , b = parseInt(rgb[2] + rgb[2], 16)\n , color = new nodes.RGBA(r, g, b, 1);\n color.raw = captures[0];\n return new Token('color', color);\n }\n },\n\n /**\n * #rgba\n */\n\n rgba: function() {\n var captures;\n if (captures = /^#([a-fA-F0-9]{4})[ \\t]*/.exec(this.str)) {\n this.skip(captures);\n var rgb = captures[1]\n , r = parseInt(rgb[0] + rgb[0], 16)\n , g = parseInt(rgb[1] + rgb[1], 16)\n , b = parseInt(rgb[2] + rgb[2], 16)\n , a = parseInt(rgb[3] + rgb[3], 16)\n , color = new nodes.RGBA(r, g, b, a/255);\n color.raw = captures[0];\n return new Token('color', color);\n }\n },\n\n /**\n * #rrggbb\n */\n\n rrggbb: function() {\n var captures;\n if (captures = /^#([a-fA-F0-9]{6})[ \\t]*/.exec(this.str)) {\n this.skip(captures);\n var rgb = captures[1]\n , r = parseInt(rgb.substr(0, 2), 16)\n , g = parseInt(rgb.substr(2, 2), 16)\n , b = parseInt(rgb.substr(4, 2), 16)\n , color = new nodes.RGBA(r, g, b, 1);\n color.raw = captures[0];\n return new Token('color', color);\n }\n },\n\n /**\n * #rrggbbaa\n */\n\n rrggbbaa: function() {\n var captures;\n if (captures = /^#([a-fA-F0-9]{8})[ \\t]*/.exec(this.str)) {\n this.skip(captures);\n var rgb = captures[1]\n , r = parseInt(rgb.substr(0, 2), 16)\n , g = parseInt(rgb.substr(2, 2), 16)\n , b = parseInt(rgb.substr(4, 2), 16)\n , a = parseInt(rgb.substr(6, 2), 16)\n , color = new nodes.RGBA(r, g, b, a/255);\n color.raw = captures[0];\n return new Token('color', color);\n }\n },\n\n /**\n * ^|[^\\n,;]+\n */\n\n selector: function() {\n var captures;\n if (captures = /^\\^|.*?(?=\\/\\/(?![^\\[]*\\])|[,\\n{])/.exec(this.str)) {\n var selector = captures[0];\n this.skip(captures);\n return new Token('selector', selector);\n }\n }\n};\n", "/**\n * Module dependencies.\n */\n\nvar crypto = require('crypto')\n , nodes = require('../nodes');\n\nvar MemoryCache = module.exports = function(options) {\n options = options || {};\n this.limit = options['cache limit'] || 256;\n this._cache = {};\n this.length = 0;\n this.head = this.tail = null;\n};\n\n/**\n * Set cache item with given `key` to `value`.\n *\n * @param {String} key\n * @param {Object} value\n * @api private\n */\n\nMemoryCache.prototype.set = function(key, value) {\n var clone = value.clone()\n , item;\n\n clone.filename = nodes.filename;\n clone.lineno = nodes.lineno;\n clone.column = nodes.column;\n item = { key: key, value: clone };\n this._cache[key] = item;\n\n if (this.tail) {\n this.tail.next = item;\n item.prev = this.tail;\n } else {\n this.head = item;\n }\n\n this.tail = item;\n if (this.length++ == this.limit) this.purge();\n};\n\n/**\n * Get cache item with given `key`.\n *\n * @param {String} key\n * @return {Object}\n * @api private\n */\n\nMemoryCache.prototype.get = function(key) {\n var item = this._cache[key]\n , val = item.value.clone();\n\n if (item == this.tail) return val;\n if (item.next) {\n if (item == this.head) this.head = item.next;\n item.next.prev = item.prev;\n }\n if (item.prev) item.prev.next = item.next;\n\n item.next = null;\n item.prev = this.tail;\n\n if (this.tail) this.tail.next = item;\n this.tail = item;\n\n return val;\n};\n\n/**\n * Check if cache has given `key`.\n *\n * @param {String} key\n * @return {Boolean}\n * @api private\n */\n\nMemoryCache.prototype.has = function(key) {\n return !!this._cache[key];\n};\n\n/**\n * Generate key for the source `str` with `options`.\n *\n * @param {String} str\n * @param {Object} options\n * @return {String}\n * @api private\n */\n\nMemoryCache.prototype.key = function(str, options) {\n var hash = crypto.createHash('sha1');\n hash.update(str + options.prefix);\n return hash.digest('hex');\n};\n\n/**\n * Remove the oldest item from the cache.\n *\n * @api private\n */\n\nMemoryCache.prototype.purge = function() {\n var item = this.head;\n\n if (this.head.next) {\n this.head = this.head.next;\n this.head.prev = null;\n }\n\n this._cache[item.key] = item.prev = item.next = null;\n this.length--;\n};\n", "/**\n * Module dependencies.\n */\n\nvar NullCache = module.exports = function() {};\n\n/**\n * Set cache item with given `key` to `value`.\n *\n * @param {String} key\n * @param {Object} value\n * @api private\n */\n\nNullCache.prototype.set = function(key, value) {};\n\n/**\n * Get cache item with given `key`.\n *\n * @param {String} key\n * @return {Object}\n * @api private\n */\n\nNullCache.prototype.get = function(key) {};\n\n/**\n * Check if cache has given `key`.\n *\n * @param {String} key\n * @return {Boolean}\n * @api private\n */\n\nNullCache.prototype.has = function(key) {\n return false;\n};\n\n/**\n * Generate key for the source `str` with `options`.\n *\n * @param {String} str\n * @param {Object} options\n * @return {String}\n * @api private\n */\n\nNullCache.prototype.key = function(str, options) {\n return '';\n};\n", "/**\n * Get cache object by `name`.\n *\n * @param {String|Function} name\n * @param {Object} options\n * @return {Object}\n * @api private\n */\n\nvar getCache = module.exports = function(name, options){\n if ('function' == typeof name) return new name(options);\n\n var cache;\n switch (name){\n // case 'fs':\n // cache = require('./fs')\n // break;\n case 'memory':\n cache = require('./memory');\n break;\n default:\n cache = require('./null');\n }\n return new cache(options);\n};\n", "/*!\n * Stylus - Parser\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Lexer = require('./lexer')\n , nodes = require('./nodes')\n , Token = require('./token')\n , units = require('./units')\n , errors = require('./errors')\n , cache = require('./cache');\n\n// debuggers\n\nvar debug = {\n lexer: require('debug')('stylus:lexer')\n , selector: require('debug')('stylus:parser:selector')\n};\n\n/**\n * Selector composite tokens.\n */\n\nvar selectorTokens = [\n 'ident'\n , 'string'\n , 'selector'\n , 'function'\n , 'comment'\n , 'boolean'\n , 'space'\n , 'color'\n , 'unit'\n , 'for'\n , 'in'\n , '['\n , ']'\n , '('\n , ')'\n , '+'\n , '-'\n , '*'\n , '*='\n , '<'\n , '>'\n , '='\n , ':'\n , '&'\n , '&&'\n , '~'\n , '{'\n , '}'\n , '.'\n , '..'\n , '/'\n];\n\n/**\n * CSS pseudo-classes and pseudo-elements.\n * See http://dev.w3.org/csswg/selectors4/\n */\n\nvar pseudoSelectors = [\n // https://www.w3.org/TR/selectors-4/#logical-combination\n // Logical Combinations\n 'is'\n , 'has'\n , 'where'\n , 'not'\n\n // Linguistic Pseudo-classes\n , 'dir'\n , 'lang'\n\n // Location Pseudo-classes\n , 'any-link'\n , 'link'\n , 'visited'\n , 'local-link'\n , 'target'\n , 'scope'\n\n // User Action Pseudo-classes\n , 'hover'\n , 'active'\n , 'focus'\n , 'drop'\n\n // Time-dimensional Pseudo-classes\n , 'current'\n , 'past'\n , 'future'\n\n // The Input Pseudo-classes\n , 'enabled'\n , 'disabled'\n , 'read-only'\n , 'read-write'\n , 'placeholder-shown'\n , 'checked'\n , 'indeterminate'\n , 'valid'\n , 'invalid'\n , 'in-range'\n , 'out-of-range'\n , 'required'\n , 'optional'\n , 'user-error'\n\n // Tree-Structural pseudo-classes\n , 'root'\n , 'empty'\n , 'blank'\n , 'nth-child'\n , 'nth-last-child'\n , 'first-child'\n , 'last-child'\n , 'only-child'\n , 'nth-of-type'\n , 'nth-last-of-type'\n , 'first-of-type'\n , 'last-of-type'\n , 'only-of-type'\n , 'nth-match'\n , 'nth-last-match'\n\n // Grid-Structural Selectors\n , 'nth-column'\n , 'nth-last-column'\n\n // Pseudo-elements\n , 'first-line'\n , 'first-letter'\n , 'before'\n , 'after'\n\n // Non-standard\n , 'selection'\n];\n\n/**\n * Initialize a new `Parser` with the given `str` and `options`.\n *\n * @param {String} str\n * @param {Object} options\n * @api private\n */\n\nvar Parser = module.exports = function Parser(str, options) {\n var self = this;\n options = options || {};\n Parser.cache = Parser.cache || Parser.getCache(options);\n this.hash = Parser.cache.key(str, options);\n this.lexer = {};\n if (!Parser.cache.has(this.hash)) {\n this.lexer = new Lexer(str, options);\n }\n this.prefix = options.prefix || '';\n this.root = options.root || new nodes.Root;\n this.state = ['root'];\n this.stash = [];\n this.parens = 0;\n this.css = 0;\n this.state.pop = function(){\n self.prevState = [].pop.call(this);\n };\n};\n\n/**\n * Get cache instance.\n *\n * @param {Object} options\n * @return {Object}\n * @api private\n */\n\nParser.getCache = function(options) {\n return false === options.cache\n ? cache(false)\n : cache(options.cache || 'memory', options);\n};\n\n/**\n * Parser prototype.\n */\n\nParser.prototype = {\n\n /**\n * Constructor.\n */\n\n constructor: Parser,\n\n /**\n * Return current state.\n *\n * @return {String}\n * @api private\n */\n\n currentState: function() {\n return this.state[this.state.length - 1];\n },\n\n /**\n * Return previous state.\n *\n * @return {String}\n * @api private\n */\n\n previousState: function() {\n return this.state[this.state.length - 2];\n },\n\n /**\n * Parse the input, then return the root node.\n *\n * @return {Node}\n * @api private\n */\n\n parse: function(){\n var block = this.parent = this.root;\n if (Parser.cache.has(this.hash)) {\n block = Parser.cache.get(this.hash);\n // normalize cached imports\n if ('block' == block.nodeName) block.constructor = nodes.Root;\n } else {\n while ('eos' != this.peek().type) {\n this.skipWhitespace();\n if ('eos' == this.peek().type) break;\n var stmt = this.statement();\n this.accept(';');\n if (!stmt) this.error('unexpected token {peek}, not allowed at the root level');\n block.push(stmt);\n }\n Parser.cache.set(this.hash, block);\n }\n return block;\n },\n\n /**\n * Throw an `Error` with the given `msg`.\n *\n * @param {String} msg\n * @api private\n */\n\n error: function(msg){\n var type = this.peek().type\n , val = undefined == this.peek().val\n ? ''\n : ' ' + this.peek().toString();\n if (val.trim() == type.trim()) val = '';\n throw new errors.ParseError(msg.replace('{peek}', '\"' + type + val + '\"'));\n },\n\n /**\n * Accept the given token `type`, and return it,\n * otherwise return `undefined`.\n *\n * @param {String} type\n * @return {Token}\n * @api private\n */\n\n accept: function(type){\n if (type == this.peek().type) {\n return this.next();\n }\n },\n\n /**\n * Expect token `type` and return it, throw otherwise.\n *\n * @param {String} type\n * @return {Token}\n * @api private\n */\n\n expect: function(type){\n if (type != this.peek().type) {\n this.error('expected \"' + type + '\", got {peek}');\n }\n return this.next();\n },\n\n /**\n * Get the next token.\n *\n * @return {Token}\n * @api private\n */\n\n next: function() {\n var tok = this.stash.length\n ? this.stash.pop()\n : this.lexer.next()\n , line = tok.lineno\n , column = tok.column || 1;\n\n if (tok.val && tok.val.nodeName) {\n tok.val.lineno = line;\n tok.val.column = column;\n }\n nodes.lineno = line;\n nodes.column = column;\n debug.lexer('%s %s', tok.type, tok.val || '');\n return tok;\n },\n\n /**\n * Peek with lookahead(1).\n *\n * @return {Token}\n * @api private\n */\n\n peek: function() {\n return this.lexer.peek();\n },\n\n /**\n * Lookahead `n` tokens.\n *\n * @param {Number} n\n * @return {Token}\n * @api private\n */\n\n lookahead: function(n){\n return this.lexer.lookahead(n);\n },\n\n /**\n * Check if the token at `n` is a valid selector token.\n *\n * @param {Number} n\n * @return {Boolean}\n * @api private\n */\n\n isSelectorToken: function(n) {\n var la = this.lookahead(n).type;\n switch (la) {\n case 'for':\n return this.bracketed;\n case '[':\n this.bracketed = true;\n return true;\n case ']':\n this.bracketed = false;\n return true;\n default:\n return ~selectorTokens.indexOf(la);\n }\n },\n\n /**\n * Check if the token at `n` is a pseudo selector.\n *\n * @param {Number} n\n * @return {Boolean}\n * @api private\n */\n\n isPseudoSelector: function(n){\n var val = this.lookahead(n).val;\n return val && ~pseudoSelectors.indexOf(val.name);\n },\n\n /**\n * Check if the current line contains `type`.\n *\n * @param {String} type\n * @return {Boolean}\n * @api private\n */\n\n lineContains: function(type){\n var i = 1\n , la;\n\n while (la = this.lookahead(i++)) {\n if (~['indent', 'outdent', 'newline', 'eos'].indexOf(la.type)) return;\n if (type == la.type) return true;\n }\n },\n\n /**\n * Valid selector tokens.\n */\n\n selectorToken: function() {\n if (this.isSelectorToken(1)) {\n if ('{' == this.peek().type) {\n // unclosed, must be a block\n if (!this.lineContains('}')) return;\n // check if ':' is within the braces.\n // though not required by Stylus, chances\n // are if someone is using {} they will\n // use CSS-style props, helping us with\n // the ambiguity in this case\n var i = 0\n , la;\n while (la = this.lookahead(++i)) {\n if ('}' == la.type) {\n // Check empty block.\n if (i == 2 || (i == 3 && this.lookahead(i - 1).type == 'space'))\n return;\n break;\n }\n if (':' == la.type) return;\n }\n }\n return this.next();\n }\n },\n\n /**\n * Skip the given `tokens`.\n *\n * @param {Array} tokens\n * @api private\n */\n\n skip: function(tokens) {\n while (~tokens.indexOf(this.peek().type))\n this.next();\n },\n\n /**\n * Consume whitespace.\n */\n\n skipWhitespace: function() {\n this.skip(['space', 'indent', 'outdent', 'newline']);\n },\n\n /**\n * Consume newlines.\n */\n\n skipNewlines: function() {\n while ('newline' == this.peek().type)\n this.next();\n },\n\n /**\n * Consume spaces.\n */\n\n skipSpaces: function() {\n while ('space' == this.peek().type)\n this.next();\n },\n\n /**\n * Consume spaces and comments.\n */\n\n skipSpacesAndComments: function() {\n while ('space' == this.peek().type\n || 'comment' == this.peek().type)\n this.next();\n },\n\n /**\n * Check if the following sequence of tokens\n * forms a function definition, ie trailing\n * `{` or indentation.\n */\n\n looksLikeFunctionDefinition: function(i) {\n return 'indent' == this.lookahead(i).type\n || '{' == this.lookahead(i).type;\n },\n\n /**\n * Check if the following sequence of tokens\n * forms a selector.\n *\n * @param {Boolean} [fromProperty]\n * @return {Boolean}\n * @api private\n */\n\n looksLikeSelector: function(fromProperty) {\n var i = 1\n , node\n , brace;\n\n // Real property\n if (fromProperty && ':' == this.lookahead(i + 1).type\n && (this.lookahead(i + 1).space || 'indent' == this.lookahead(i + 2).type))\n return false;\n\n // Assume selector when an ident is\n // followed by a selector\n while ('ident' == this.lookahead(i).type\n && ('newline' == this.lookahead(i + 1).type\n || ',' == this.lookahead(i + 1).type)) i += 2;\n\n while (this.isSelectorToken(i)\n || ',' == this.lookahead(i).type) {\n\n if ('selector' == this.lookahead(i).type)\n return true;\n\n if ('&' == this.lookahead(i + 1).type)\n return true;\n\n // Hash values inside properties\n if (\n i > 1 &&\n 'ident' === this.lookahead(i - 1).type &&\n '.' === this.lookahead(i).type &&\n 'ident' === this.lookahead(i + 1).type\n ) {\n while ((node = this.lookahead(i + 2))) {\n if ([\n 'indent',\n 'outdent',\n '{',\n ';',\n 'eos',\n 'selector',\n 'media',\n 'if',\n 'atrule',\n ')',\n '}',\n 'unit',\n '[',\n 'for',\n 'function'\n ].indexOf(node.type) !== -1) {\n if (node.type === '[') {\n while ((node = this.lookahead(i + 3)) && node.type !== ']') {\n if (~['.', 'unit'].indexOf(node.type)) {\n return false;\n }\n i += 1\n }\n } else {\n if (this.isPseudoSelector(i + 2)) {\n return true;\n }\n\n if (node.type === ')' && this.lookahead(i + 3) && this.lookahead(i + 3).type === '}') {\n break;\n }\n\n return [\n 'outdent',\n ';',\n 'eos',\n 'media',\n 'if',\n 'atrule',\n ')',\n '}',\n 'unit',\n 'for',\n 'function'\n ].indexOf(node.type) === -1;\n }\n }\n\n i += 1\n }\n\n return true;\n }\n\n if ('.' == this.lookahead(i).type && 'ident' == this.lookahead(i + 1).type) {\n return true;\n }\n\n if ('*' == this.lookahead(i).type && 'newline' == this.lookahead(i + 1).type)\n return true;\n\n // Pseudo-elements\n if (':' == this.lookahead(i).type\n && ':' == this.lookahead(i + 1).type)\n return true;\n\n // #a after an ident and newline\n if ('color' == this.lookahead(i).type\n && 'newline' == this.lookahead(i - 1).type)\n return true;\n\n if (this.looksLikeAttributeSelector(i))\n return true;\n\n if (('=' == this.lookahead(i).type || 'function' == this.lookahead(i).type)\n && '{' == this.lookahead(i + 1).type)\n return false;\n\n // Hash values inside properties\n if (':' == this.lookahead(i).type\n && !this.isPseudoSelector(i + 1)\n && this.lineContains('.'))\n return false;\n\n // the ':' token within braces signifies\n // a selector. ex: \"foo{bar:'baz'}\"\n if ('{' == this.lookahead(i).type) brace = true;\n else if ('}' == this.lookahead(i).type) brace = false;\n if (brace && ':' == this.lookahead(i).type) return true;\n\n // '{' preceded by a space is considered a selector.\n // for example \"foo{bar}{baz}\" may be a property,\n // however \"foo{bar} {baz}\" is a selector\n if ('space' == this.lookahead(i).type\n && '{' == this.lookahead(i + 1).type)\n return true;\n\n // Assume pseudo selectors are NOT properties\n // as 'td:th-child(1)' may look like a property\n // and function call to the parser otherwise\n if (':' == this.lookahead(i++).type\n && !this.lookahead(i-1).space\n && this.isPseudoSelector(i))\n return true;\n\n // Trailing space\n if ('space' == this.lookahead(i).type\n && 'newline' == this.lookahead(i + 1).type\n && '{' == this.lookahead(i + 2).type)\n return true;\n\n if (',' == this.lookahead(i).type\n && 'newline' == this.lookahead(i + 1).type)\n return true;\n }\n\n // Trailing comma\n if (',' == this.lookahead(i).type\n && 'newline' == this.lookahead(i + 1).type)\n return true;\n\n // Trailing brace\n if ('{' == this.lookahead(i).type\n && 'newline' == this.lookahead(i + 1).type)\n return true;\n\n // css-style mode, false on ; }\n if (this.css) {\n if (';' == this.lookahead(i).type ||\n '}' == this.lookahead(i - 1).type)\n return false;\n }\n\n // Trailing separators\n while (!~[\n 'indent'\n , 'outdent'\n , 'newline'\n , 'for'\n , 'if'\n , ';'\n , '}'\n , 'eos'].indexOf(this.lookahead(i).type))\n ++i;\n\n if ('indent' == this.lookahead(i).type)\n return true;\n },\n\n /**\n * Check if the following sequence of tokens\n * forms an attribute selector.\n */\n\n looksLikeAttributeSelector: function(n) {\n var type = this.lookahead(n).type;\n if ('=' == type && this.bracketed) return true;\n return ('ident' == type || 'string' == type)\n && ']' == this.lookahead(n + 1).type\n && ('newline' == this.lookahead(n + 2).type || this.isSelectorToken(n + 2))\n && !this.lineContains(':')\n && !this.lineContains('=');\n },\n\n /**\n * Check if the following sequence of tokens\n * forms a keyframe block.\n */\n\n looksLikeKeyframe: function() {\n var i = 2\n , type;\n switch (this.lookahead(i).type) {\n case '{':\n case 'indent':\n case ',':\n return true;\n case 'newline':\n while ('unit' == this.lookahead(++i).type\n || 'newline' == this.lookahead(i).type) ;\n type = this.lookahead(i).type;\n return 'indent' == type || '{' == type;\n }\n },\n\n /**\n * Check if the current state supports selectors.\n */\n\n stateAllowsSelector: function() {\n switch (this.currentState()) {\n case 'root':\n case 'atblock':\n case 'selector':\n case 'conditional':\n case 'function':\n case 'atrule':\n case 'for':\n return true;\n }\n },\n\n /**\n * Try to assign @block to the node.\n *\n * @param {Expression} expr\n * @private\n */\n\n assignAtblock: function(expr) {\n try {\n expr.push(this.atblock(expr));\n } catch(err) {\n this.error('invalid right-hand side operand in assignment, got {peek}');\n }\n },\n\n /**\n * statement\n * | statement 'if' expression\n * | statement 'unless' expression\n */\n\n statement: function() {\n var stmt = this.stmt()\n , state = this.prevState\n , block\n , op;\n\n // special-case statements since it\n // is not an expression. We could\n // implement postfix conditionals at\n // the expression level, however they\n // would then fail to enclose properties\n if (this.allowPostfix) {\n this.allowPostfix = false;\n state = 'expression';\n }\n\n switch (state) {\n case 'assignment':\n case 'expression':\n case 'function arguments':\n while (op =\n this.accept('if')\n || this.accept('unless')\n || this.accept('for')) {\n switch (op.type) {\n case 'if':\n case 'unless':\n stmt = new nodes.If(this.expression(), stmt);\n stmt.postfix = true;\n stmt.negate = 'unless' == op.type;\n this.accept(';');\n break;\n case 'for':\n var key\n , val = this.id().name;\n if (this.accept(',')) key = this.id().name;\n this.expect('in');\n var each = new nodes.Each(val, key, this.expression());\n block = new nodes.Block(this.parent, each);\n block.push(stmt);\n each.block = block;\n stmt = each;\n }\n }\n }\n\n return stmt;\n },\n\n /**\n * ident\n * | selector\n * | literal\n * | charset\n * | namespace\n * | import\n * | require\n * | media\n * | atrule\n * | scope\n * | keyframes\n * | mozdocument\n * | for\n * | if\n * | unless\n * | comment\n * | expression\n * | 'return' expression\n */\n\n stmt: function() {\n var tok = this.peek(), selector;\n switch (tok.type) {\n case 'keyframes':\n return this.keyframes();\n case '-moz-document':\n return this.mozdocument();\n case 'comment':\n case 'selector':\n case 'literal':\n case 'charset':\n case 'namespace':\n case 'import':\n case 'require':\n case 'extend':\n case 'media':\n case 'atrule':\n case 'ident':\n case 'scope':\n case 'supports':\n case 'unless':\n case 'function':\n case 'for':\n case 'if':\n return this[tok.type]();\n case 'return':\n return this.return();\n case '{':\n return this.property();\n default:\n // Contextual selectors\n if (this.stateAllowsSelector()) {\n switch (tok.type) {\n case 'color':\n case '~':\n case '>':\n case '<':\n case ':':\n case '&':\n case '&&':\n case '[':\n case '.':\n case '/':\n selector = this.selector();\n selector.column = tok.column;\n selector.lineno = tok.lineno;\n return selector;\n // relative reference\n case '..':\n if ('/' == this.lookahead(2).type)\n return this.selector();\n case '+':\n return 'function' == this.lookahead(2).type\n ? this.functionCall()\n : this.selector();\n case '*':\n return this.property();\n // keyframe blocks (10%, 20% { ... })\n case 'unit':\n if (this.looksLikeKeyframe()) {\n selector = this.selector();\n selector.column = tok.column;\n selector.lineno = tok.lineno;\n return selector;\n }\n case '-':\n if ('{' == this.lookahead(2).type)\n return this.property();\n }\n }\n\n // Expression fallback\n var expr = this.expression();\n if (expr.isEmpty) this.error('unexpected {peek}');\n return expr;\n }\n },\n\n /**\n * indent (!outdent)+ outdent\n */\n\n block: function(node, scope) {\n var delim\n , stmt\n , next\n , block = this.parent = new nodes.Block(this.parent, node);\n\n if (false === scope) block.scope = false;\n\n this.accept('newline');\n\n // css-style\n if (this.accept('{')) {\n this.css++;\n delim = '}';\n this.skipWhitespace();\n } else {\n delim = 'outdent';\n this.expect('indent');\n }\n\n while (delim != this.peek().type) {\n // css-style\n if (this.css) {\n if (this.accept('newline') || this.accept('indent')) continue;\n stmt = this.statement();\n this.accept(';');\n this.skipWhitespace();\n } else {\n if (this.accept('newline')) continue;\n // skip useless indents and comments\n next = this.lookahead(2).type;\n if ('indent' == this.peek().type\n && ~['outdent', 'newline', 'comment'].indexOf(next)) {\n this.skip(['indent', 'outdent']);\n continue;\n }\n if ('eos' == this.peek().type) return block;\n stmt = this.statement();\n this.accept(';');\n }\n if (!stmt) this.error('unexpected token {peek} in block');\n block.push(stmt);\n }\n\n // css-style\n if (this.css) {\n this.skipWhitespace();\n this.expect('}');\n this.skipSpaces();\n this.css--;\n } else {\n this.expect('outdent');\n }\n\n this.parent = block.parent;\n return block;\n },\n\n /**\n * comment space*\n */\n\n comment: function(){\n var node = this.next().val;\n this.skipSpaces();\n return node;\n },\n\n /**\n * for val (',' key) in expr\n */\n\n for: function() {\n this.expect('for');\n var key\n , val = this.id().name;\n if (this.accept(',')) key = this.id().name;\n this.expect('in');\n this.state.push('for');\n this.cond = true;\n var each = new nodes.Each(val, key, this.expression());\n this.cond = false;\n each.block = this.block(each, false);\n this.state.pop();\n return each;\n },\n\n /**\n * return expression\n */\n\n return: function() {\n this.expect('return');\n var expr = this.expression();\n return expr.isEmpty\n ? new nodes.Return\n : new nodes.Return(expr);\n },\n\n /**\n * unless expression block\n */\n\n unless: function() {\n this.expect('unless');\n this.state.push('conditional');\n this.cond = true;\n var node = new nodes.If(this.expression(), true);\n this.cond = false;\n node.block = this.block(node, false);\n this.state.pop();\n return node;\n },\n\n /**\n * if expression block (else block)?\n */\n\n if: function() {\n var token = this.expect('if');\n\n this.state.push('conditional');\n this.cond = true;\n var node = new nodes.If(this.expression())\n , cond\n , block\n , item;\n\n node.column = token.column;\n\n this.cond = false;\n node.block = this.block(node, false);\n this.skip(['newline', 'comment']);\n while (this.accept('else')) {\n token = this.accept('if');\n if (token) {\n this.cond = true;\n cond = this.expression();\n this.cond = false;\n block = this.block(node, false);\n item = new nodes.If(cond, block);\n\n item.column = token.column;\n\n node.elses.push(item);\n } else {\n node.elses.push(this.block(node, false));\n break;\n }\n this.skip(['newline', 'comment']);\n }\n this.state.pop();\n return node;\n },\n\n /**\n * @block\n *\n * @param {Expression} [node]\n */\n\n atblock: function(node){\n if (!node) this.expect('atblock');\n node = new nodes.Atblock;\n this.state.push('atblock');\n node.block = this.block(node, false);\n this.state.pop();\n return node;\n },\n\n /**\n * atrule selector? block?\n */\n\n atrule: function(){\n var type = this.expect('atrule').val\n , node = new nodes.Atrule(type)\n , tok;\n this.skipSpacesAndComments();\n node.segments = this.selectorParts();\n this.skipSpacesAndComments();\n tok = this.peek().type;\n if ('indent' == tok || '{' == tok || ('newline' == tok\n && '{' == this.lookahead(2).type)) {\n this.state.push('atrule');\n node.block = this.block(node);\n this.state.pop();\n }\n return node;\n },\n\n /**\n * scope\n */\n\n scope: function(){\n this.expect('scope');\n var selector = this.selectorParts()\n .map(function(selector) { return selector.val; })\n .join('');\n this.selectorScope = selector.trim();\n return nodes.null;\n },\n\n /**\n * supports\n */\n\n supports: function(){\n this.expect('supports');\n var node = new nodes.Supports(this.supportsCondition());\n this.state.push('atrule');\n node.block = this.block(node);\n this.state.pop();\n return node;\n },\n\n /**\n * supports negation\n * | supports op\n * | expression\n */\n\n supportsCondition: function(){\n var node = this.supportsNegation()\n || this.supportsOp();\n if (!node) {\n this.cond = true;\n node = this.expression();\n this.cond = false;\n }\n return node;\n },\n\n /**\n * 'not' supports feature\n */\n\n supportsNegation: function(){\n if (this.accept('not')) {\n var node = new nodes.Expression;\n node.push(new nodes.Literal('not'));\n node.push(this.supportsFeature());\n return node;\n }\n },\n\n /**\n * supports feature (('and' | 'or') supports feature)+\n */\n\n supportsOp: function(){\n var feature = this.supportsFeature()\n , op\n , expr;\n if (feature) {\n expr = new nodes.Expression;\n expr.push(feature);\n while (op = this.accept('&&') || this.accept('||')) {\n expr.push(new nodes.Literal('&&' == op.val ? 'and' : 'or'));\n expr.push(this.supportsFeature());\n }\n return expr;\n }\n },\n\n /**\n * ('(' supports condition ')')\n * | feature\n */\n\n supportsFeature: function(){\n this.skipSpacesAndComments();\n if ('(' == this.peek().type) {\n var la = this.lookahead(2).type;\n\n if ('ident' == la || '{' == la) {\n return this.feature();\n } else {\n this.expect('(');\n var node = new nodes.Expression;\n node.push(new nodes.Literal('('));\n node.push(this.supportsCondition());\n this.expect(')')\n node.push(new nodes.Literal(')'));\n this.skipSpacesAndComments();\n return node;\n }\n }\n },\n\n /**\n * extend\n */\n\n extend: function(){\n var tok = this.expect('extend')\n , selectors = []\n , sel\n , node\n , arr;\n\n do {\n arr = this.selectorParts();\n\n if (!arr.length) continue;\n\n sel = new nodes.Selector(arr);\n selectors.push(sel);\n\n if ('!' !== this.peek().type) continue;\n\n tok = this.lookahead(2);\n if ('ident' !== tok.type || 'optional' !== tok.val.name) continue;\n\n this.skip(['!', 'ident']);\n sel.optional = true;\n } while(this.accept(','));\n\n node = new nodes.Extend(selectors);\n node.lineno = tok.lineno;\n node.column = tok.column;\n return node;\n },\n\n /**\n * media queries\n */\n\n media: function() {\n this.expect('media');\n this.state.push('atrule');\n var media = new nodes.Media(this.queries());\n media.block = this.block(media);\n this.state.pop();\n return media;\n },\n\n /**\n * query (',' query)*\n */\n\n queries: function() {\n var queries = new nodes.QueryList\n , skip = ['comment', 'newline', 'space'];\n\n do {\n this.skip(skip);\n queries.push(this.query());\n this.skip(skip);\n } while (this.accept(','));\n return queries;\n },\n\n /**\n * expression\n * | (ident | 'not')? ident ('and' feature)*\n * | feature ('and' feature)*\n */\n\n query: function() {\n var query = new nodes.Query\n , expr\n , pred\n , id;\n\n // hash values support\n if ('ident' == this.peek().type\n && ('.' == this.lookahead(2).type\n || '[' == this.lookahead(2).type)) {\n this.cond = true;\n expr = this.expression();\n this.cond = false;\n query.push(new nodes.Feature(expr.nodes));\n return query;\n }\n\n if (pred = this.accept('ident') || this.accept('not')) {\n pred = new nodes.Literal(pred.val.string || pred.val);\n\n this.skipSpacesAndComments();\n if (id = this.accept('ident')) {\n query.type = id.val;\n query.predicate = pred;\n } else {\n query.type = pred;\n }\n this.skipSpacesAndComments();\n\n if (!this.accept('&&')) return query;\n }\n\n do {\n query.push(this.feature());\n } while (this.accept('&&'));\n\n return query;\n },\n\n /**\n * '(' ident ( ':'? expression )? ')'\n */\n\n feature: function() {\n this.skipSpacesAndComments();\n this.expect('(');\n this.skipSpacesAndComments();\n var node = new nodes.Feature(this.interpolate());\n this.skipSpacesAndComments();\n this.accept(':')\n this.skipSpacesAndComments();\n this.inProperty = true;\n node.expr = this.list();\n this.inProperty = false;\n this.skipSpacesAndComments();\n this.expect(')');\n this.skipSpacesAndComments();\n return node;\n },\n\n /**\n * @-moz-document call (',' call)* block\n */\n\n mozdocument: function(){\n this.expect('-moz-document');\n var mozdocument = new nodes.Atrule('-moz-document')\n , calls = [];\n do {\n this.skipSpacesAndComments();\n calls.push(this.functionCall());\n this.skipSpacesAndComments();\n } while (this.accept(','));\n mozdocument.segments = [new nodes.Literal(calls.join(', '))];\n this.state.push('atrule');\n mozdocument.block = this.block(mozdocument, false);\n this.state.pop();\n return mozdocument;\n },\n\n /**\n * import expression\n */\n\n import: function() {\n this.expect('import');\n this.allowPostfix = true;\n return new nodes.Import(this.expression(), false);\n },\n\n /**\n * require expression\n */\n\n require: function() {\n this.expect('require');\n this.allowPostfix = true;\n return new nodes.Import(this.expression(), true);\n },\n\n /**\n * charset string\n */\n\n charset: function() {\n this.expect('charset');\n var str = this.expect('string').val;\n this.allowPostfix = true;\n return new nodes.Charset(str);\n },\n\n /**\n * namespace ident? (string | url)\n */\n\n namespace: function() {\n var str\n , prefix;\n this.expect('namespace');\n\n this.skipSpacesAndComments();\n if (prefix = this.accept('ident')) {\n prefix = prefix.val;\n }\n this.skipSpacesAndComments();\n\n str = this.accept('string') || this.url();\n this.allowPostfix = true;\n return new nodes.Namespace(str, prefix);\n },\n\n /**\n * keyframes name block\n */\n\n keyframes: function() {\n var tok = this.expect('keyframes')\n , keyframes;\n\n this.skipSpacesAndComments();\n keyframes = new nodes.Keyframes(this.selectorParts(), tok.val);\n keyframes.column = tok.column;\n\n this.skipSpacesAndComments();\n\n // block\n this.state.push('atrule');\n keyframes.block = this.block(keyframes);\n this.state.pop();\n\n return keyframes;\n },\n\n /**\n * literal\n */\n\n literal: function() {\n return this.expect('literal').val;\n },\n\n /**\n * ident space?\n */\n\n id: function() {\n var tok = this.expect('ident');\n this.accept('space');\n return tok.val;\n },\n\n /**\n * ident\n * | assignment\n * | property\n * | selector\n */\n\n ident: function() {\n var i = 2\n , la = this.lookahead(i).type;\n\n while ('space' == la) la = this.lookahead(++i).type;\n\n switch (la) {\n // Assignment\n case '=':\n case '?=':\n case '-=':\n case '+=':\n case '*=':\n case '/=':\n case '%=':\n return this.assignment();\n // Member\n case '.':\n if ('space' == this.lookahead(i - 1).type) return this.selector();\n if (this._ident == this.peek()) return this.id();\n while ('=' != this.lookahead(++i).type\n && !~['[', ',', 'newline', 'indent', 'eos'].indexOf(this.lookahead(i).type)) ;\n if ('=' == this.lookahead(i).type) {\n this._ident = this.peek();\n return this.expression();\n } else if (this.looksLikeSelector() && this.stateAllowsSelector()) {\n return this.selector();\n }\n // Assignment []=\n case '[':\n if (this._ident == this.peek()) return this.id();\n while (']' != this.lookahead(i++).type\n && 'selector' != this.lookahead(i).type\n && 'eos' != this.lookahead(i).type) ;\n if ('=' == this.lookahead(i).type) {\n this._ident = this.peek();\n return this.expression();\n } else if (this.looksLikeSelector() && this.stateAllowsSelector()) {\n return this.selector();\n }\n // Operation\n case '-':\n case '+':\n case '/':\n case '*':\n case '%':\n case '**':\n case '&&':\n case '||':\n case '>':\n case '<':\n case '>=':\n case '<=':\n case '!=':\n case '==':\n case '?':\n case 'in':\n case 'is a':\n case 'is defined':\n // Prevent cyclic .ident, return literal\n if (this._ident == this.peek()) {\n return this.id();\n } else {\n this._ident = this.peek();\n switch (this.currentState()) {\n // unary op or selector in property / for\n case 'for':\n case 'selector':\n return this.property();\n // Part of a selector\n case 'root':\n case 'atblock':\n case 'atrule':\n return '[' == la\n ? this.subscript()\n : this.selector();\n case 'function':\n case 'conditional':\n return this.looksLikeSelector()\n ? this.selector()\n : this.expression();\n // Do not disrupt the ident when an operand\n default:\n return this.operand\n ? this.id()\n : this.expression();\n }\n }\n // Selector or property\n default:\n switch (this.currentState()) {\n case 'root':\n return this.selector();\n case 'for':\n case 'selector':\n case 'function':\n case 'conditional':\n case 'atblock':\n case 'atrule':\n return this.property();\n default:\n var id = this.id();\n if ('interpolation' == this.previousState()) id.mixin = true;\n return id;\n }\n }\n },\n\n /**\n * '*'? (ident | '{' expression '}')+\n */\n\n interpolate: function() {\n var node\n , segs = []\n , star;\n\n star = this.accept('*');\n if (star) segs.push(new nodes.Literal('*'));\n\n while (true) {\n if (this.accept('{')) {\n this.state.push('interpolation');\n segs.push(this.expression());\n this.expect('}');\n this.state.pop();\n } else if (node = this.accept('-')){\n segs.push(new nodes.Literal('-'));\n } else if (node = this.accept('ident')){\n segs.push(node.val);\n } else {\n break;\n }\n }\n if (!segs.length) this.expect('ident');\n return segs;\n },\n\n /**\n * property ':'? expression\n * | ident\n */\n\n property: function() {\n if (this.looksLikeSelector(true)) return this.selector();\n\n // property\n var ident = this.interpolate()\n , prop = new nodes.Property(ident)\n , ret = prop;\n\n // optional ':'\n this.accept('space');\n if (this.accept(':')) this.accept('space');\n\n this.state.push('property');\n this.inProperty = true;\n prop.expr = this.list();\n if (prop.expr.isEmpty) ret = ident[0];\n this.inProperty = false;\n this.allowPostfix = true;\n this.state.pop();\n\n // optional ';'\n this.accept(';');\n\n return ret;\n },\n\n /**\n * selector ',' selector\n * | selector newline selector\n * | selector block\n */\n\n selector: function() {\n var arr\n , group = new nodes.Group\n , scope = this.selectorScope\n , isRoot = 'root' == this.currentState()\n , selector;\n\n do {\n // Clobber newline after ,\n this.accept('newline');\n\n arr = this.selectorParts();\n\n // Push the selector\n if (isRoot && scope) arr.unshift(new nodes.Literal(scope + ' '));\n if (arr.length) {\n selector = new nodes.Selector(arr);\n selector.lineno = arr[0].lineno;\n selector.column = arr[0].column;\n group.push(selector);\n }\n } while (this.accept(',') || this.accept('newline'));\n\n if ('selector-parts' == this.currentState()) return group.nodes;\n\n this.state.push('selector');\n group.block = this.block(group);\n this.state.pop();\n\n return group;\n },\n\n selectorParts: function(){\n var tok\n , arr = [];\n\n // Selector candidates,\n // stitched together to\n // form a selector.\n while (tok = this.selectorToken()) {\n debug.selector('%s', tok);\n // Selector component\n switch (tok.type) {\n case '{':\n this.skipSpaces();\n var expr = this.expression();\n this.skipSpaces();\n this.expect('}');\n arr.push(expr);\n break;\n case this.prefix && '.':\n var literal = new nodes.Literal(tok.val + this.prefix);\n literal.prefixed = true;\n arr.push(literal);\n break;\n case 'comment':\n // ignore comments\n break;\n case 'color':\n case 'unit':\n arr.push(new nodes.Literal(tok.val.raw));\n break;\n case 'space':\n arr.push(new nodes.Literal(' '));\n break;\n case 'function':\n arr.push(new nodes.Literal(tok.val.name + '('));\n break;\n case 'ident':\n arr.push(new nodes.Literal(tok.val.name || tok.val.string));\n break;\n default:\n arr.push(new nodes.Literal(tok.val));\n if (tok.space) arr.push(new nodes.Literal(' '));\n }\n }\n\n return arr;\n },\n\n /**\n * ident ('=' | '?=') expression\n */\n\n assignment: function() {\n var\n op,\n node,\n ident = this.id(),\n name = ident.name;\n\n if (op =\n this.accept('=')\n || this.accept('?=')\n || this.accept('+=')\n || this.accept('-=')\n || this.accept('*=')\n || this.accept('/=')\n || this.accept('%=')) {\n this.state.push('assignment');\n var expr = this.list();\n // @block support\n if (expr.isEmpty) this.assignAtblock(expr);\n node = new nodes.Ident(name, expr);\n\n node.lineno = ident.lineno;\n node.column = ident.column;\n\n this.state.pop();\n\n switch (op.type) {\n case '?=':\n var defined = new nodes.BinOp('is defined', node)\n , lookup = new nodes.Expression;\n lookup.push(new nodes.Ident(name));\n node = new nodes.Ternary(defined, lookup, node);\n break;\n case '+=':\n case '-=':\n case '*=':\n case '/=':\n case '%=':\n node.val = new nodes.BinOp(op.type[0], new nodes.Ident(name), expr);\n break;\n }\n }\n\n return node;\n },\n\n /**\n * definition\n * | call\n */\n\n function: function() {\n var parens = 1\n , i = 2\n , tok;\n\n // Lookahead and determine if we are dealing\n // with a function call or definition. Here\n // we pair parens to prevent false negatives\n out:\n while (tok = this.lookahead(i++)) {\n switch (tok.type) {\n case 'function':\n case '(':\n ++parens;\n break;\n case ')':\n if (!--parens) break out;\n break;\n case 'eos':\n this.error('failed to find closing paren \")\"');\n }\n }\n\n // Definition or call\n switch (this.currentState()) {\n case 'expression':\n return this.functionCall();\n default:\n return this.looksLikeFunctionDefinition(i)\n ? this.functionDefinition()\n : this.expression();\n }\n },\n\n /**\n * url '(' (expression | urlchars)+ ')'\n */\n\n url: function() {\n this.expect('function');\n this.state.push('function arguments');\n var args = this.args();\n this.expect(')');\n this.state.pop();\n return new nodes.Call('url', args);\n },\n\n /**\n * '+'? ident '(' expression ')' block?\n */\n\n functionCall: function() {\n var withBlock = this.accept('+');\n if ('url' == this.peek().val.name) return this.url();\n\n var tok = this.expect('function').val;\n var name = tok.name;\n\n this.state.push('function arguments');\n this.parens++;\n var args = this.args();\n this.expect(')');\n this.parens--;\n this.state.pop();\n var call = new nodes.Call(name, args);\n\n call.column = tok.column;\n call.lineno = tok.lineno;\n\n if (withBlock) {\n this.state.push('function');\n call.block = this.block(call);\n this.state.pop();\n }\n return call;\n },\n\n /**\n * ident '(' params ')' block\n */\n\n functionDefinition: function() {\n var\n tok = this.expect('function'),\n name = tok.val.name;\n\n // params\n this.state.push('function params');\n this.skipWhitespace();\n var params = this.params();\n this.skipWhitespace();\n this.expect(')');\n this.state.pop();\n\n // Body\n this.state.push('function');\n var fn = new nodes.Function(name, params);\n\n fn.column = tok.column;\n fn.lineno = tok.lineno;\n\n fn.block = this.block(fn);\n this.state.pop();\n return new nodes.Ident(name, fn);\n },\n\n /**\n * ident\n * | ident '...'\n * | ident '=' expression\n * | ident ',' ident\n */\n\n params: function() {\n var tok\n , node\n , params = new nodes.Params;\n while (tok = this.accept('ident')) {\n this.accept('space');\n params.push(node = tok.val);\n if (this.accept('...')) {\n node.rest = true;\n } else if (this.accept('=')) {\n node.val = this.expression();\n }\n this.skipWhitespace();\n this.accept(',');\n this.skipWhitespace();\n }\n return params;\n },\n\n /**\n * (ident ':')? expression (',' (ident ':')? expression)*\n */\n\n args: function() {\n var args = new nodes.Arguments\n , keyword;\n\n do {\n // keyword\n if ('ident' == this.peek().type && ':' == this.lookahead(2).type) {\n keyword = this.next().val.string;\n this.expect(':');\n args.map[keyword] = this.expression();\n // arg\n } else {\n args.push(this.expression());\n }\n } while (this.accept(','));\n\n return args;\n },\n\n /**\n * expression (',' expression)*\n */\n\n list: function() {\n var node = this.expression();\n\n while (this.accept(',')) {\n if (node.isList) {\n list.push(this.expression());\n } else {\n var list = new nodes.Expression(true);\n list.push(node);\n list.push(this.expression());\n node = list;\n }\n }\n return node;\n },\n\n /**\n * negation+\n */\n\n expression: function() {\n var node\n , expr = new nodes.Expression;\n this.state.push('expression');\n while (node = this.negation()) {\n if (!node) this.error('unexpected token {peek} in expression');\n expr.push(node);\n }\n this.state.pop();\n if (expr.nodes.length) {\n expr.lineno = expr.nodes[0].lineno;\n expr.column = expr.nodes[0].column;\n }\n return expr;\n },\n\n /**\n * 'not' ternary\n * | ternary\n */\n\n negation: function() {\n if (this.accept('not')) {\n return new nodes.UnaryOp('!', this.negation());\n }\n return this.ternary();\n },\n\n /**\n * logical ('?' expression ':' expression)?\n */\n\n ternary: function() {\n var node = this.logical();\n if (this.accept('?')) {\n var trueExpr = this.expression();\n this.expect(':');\n var falseExpr = this.expression();\n node = new nodes.Ternary(node, trueExpr, falseExpr);\n }\n return node;\n },\n\n /**\n * typecheck (('&&' | '||') typecheck)*\n */\n\n logical: function() {\n var op\n , node = this.typecheck();\n while (op = this.accept('&&') || this.accept('||')) {\n node = new nodes.BinOp(op.type, node, this.typecheck());\n }\n return node;\n },\n\n /**\n * equality ('is a' equality)*\n */\n\n typecheck: function() {\n var op\n , node = this.equality();\n while (op = this.accept('is a')) {\n this.operand = true;\n if (!node) this.error('illegal unary \"' + op + '\", missing left-hand operand');\n node = new nodes.BinOp(op.type, node, this.equality());\n this.operand = false;\n }\n return node;\n },\n\n /**\n * in (('==' | '!=') in)*\n */\n\n equality: function() {\n var op\n , node = this.in();\n while (op = this.accept('==') || this.accept('!=')) {\n this.operand = true;\n if (!node) this.error('illegal unary \"' + op + '\", missing left-hand operand');\n node = new nodes.BinOp(op.type, node, this.in());\n this.operand = false;\n }\n return node;\n },\n\n /**\n * relational ('in' relational)*\n */\n\n in: function() {\n var node = this.relational();\n while (this.accept('in')) {\n this.operand = true;\n if (!node) this.error('illegal unary \"in\", missing left-hand operand');\n node = new nodes.BinOp('in', node, this.relational());\n this.operand = false;\n }\n return node;\n },\n\n /**\n * range (('>=' | '<=' | '>' | '<') range)*\n */\n\n relational: function() {\n var op\n , node = this.range();\n while (op =\n this.accept('>=')\n || this.accept('<=')\n || this.accept('<')\n || this.accept('>')\n ) {\n this.operand = true;\n if (!node) this.error('illegal unary \"' + op + '\", missing left-hand operand');\n node = new nodes.BinOp(op.type, node, this.range());\n this.operand = false;\n }\n return node;\n },\n\n /**\n * additive (('..' | '...') additive)*\n */\n\n range: function() {\n var op\n , node = this.additive();\n if (op = this.accept('...') || this.accept('..')) {\n this.operand = true;\n if (!node) this.error('illegal unary \"' + op + '\", missing left-hand operand');\n node = new nodes.BinOp(op.val, node, this.additive());\n this.operand = false;\n }\n return node;\n },\n\n /**\n * multiplicative (('+' | '-') multiplicative)*\n */\n\n additive: function() {\n var op\n , node = this.multiplicative();\n while (op = this.accept('+') || this.accept('-')) {\n this.operand = true;\n node = new nodes.BinOp(op.type, node, this.multiplicative());\n this.operand = false;\n }\n return node;\n },\n\n /**\n * defined (('**' | '*' | '/' | '%') defined)*\n */\n\n multiplicative: function() {\n var op\n , node = this.defined();\n while (op =\n this.accept('**')\n || this.accept('*')\n || this.accept('/')\n || this.accept('%')) {\n this.operand = true;\n if ('/' == op && this.inProperty && !this.parens) {\n this.stash.push(new Token('literal', new nodes.Literal('/')));\n this.operand = false;\n return node;\n } else {\n if (!node) this.error('illegal unary \"' + op + '\", missing left-hand operand');\n node = new nodes.BinOp(op.type, node, this.defined());\n this.operand = false;\n }\n }\n return node;\n },\n\n /**\n * unary 'is defined'\n * | unary\n */\n\n defined: function() {\n var node = this.unary();\n if (this.accept('is defined')) {\n if (!node) this.error('illegal unary \"is defined\", missing left-hand operand');\n node = new nodes.BinOp('is defined', node);\n }\n return node;\n },\n\n /**\n * ('!' | '~' | '+' | '-') unary\n * | subscript\n */\n\n unary: function() {\n var op\n , node;\n if (op =\n this.accept('!')\n || this.accept('~')\n || this.accept('+')\n || this.accept('-')) {\n this.operand = true;\n node = this.unary();\n if (!node) this.error('illegal unary \"' + op + '\"');\n node = new nodes.UnaryOp(op.type, node);\n this.operand = false;\n return node;\n }\n return this.subscript();\n },\n\n /**\n * member ('[' expression ']')+ '='?\n * | member\n */\n\n subscript: function() {\n var node = this.member()\n , id;\n while (this.accept('[')) {\n node = new nodes.BinOp('[]', node, this.expression());\n this.expect(']');\n }\n // TODO: TernaryOp :)\n if (this.accept('=')) {\n node.op += '=';\n node.val = this.list();\n // @block support\n if (node.val.isEmpty) this.assignAtblock(node.val);\n }\n return node;\n },\n\n /**\n * primary ('.' id)+ '='?\n * | primary\n */\n\n member: function() {\n var node = this.primary();\n if (node) {\n while (this.accept('.')) {\n var id = new nodes.Ident(this.expect('ident').val.string);\n node = new nodes.Member(node, id);\n }\n this.skipSpaces();\n if (this.accept('=')) {\n node.val = this.list();\n // @block support\n if (node.val.isEmpty) this.assignAtblock(node.val);\n }\n }\n return node;\n },\n\n /**\n * '{' '}'\n * | '{' pair (ws pair)* '}'\n */\n\n object: function(){\n var obj = new nodes.Object\n , id, val, comma, hash;\n this.expect('{');\n this.skipWhitespace();\n\n while (!this.accept('}')) {\n if (this.accept('comment')\n || this.accept('newline')) continue;\n\n if (!comma) this.accept(',');\n id = this.accept('ident') || this.accept('string');\n\n if (!id) {\n this.error('expected \"ident\" or \"string\", got {peek}');\n }\n\n hash = id.val.hash;\n\n this.skipSpacesAndComments();\n this.expect(':');\n\n val = this.expression();\n\n obj.setValue(hash, val);\n obj.setKey(hash, id.val);\n\n comma = this.accept(',');\n this.skipWhitespace();\n }\n\n return obj;\n },\n\n /**\n * unit\n * | null\n * | color\n * | string\n * | ident\n * | boolean\n * | literal\n * | object\n * | atblock\n * | atrule\n * | '(' expression ')' '%'?\n */\n\n primary: function() {\n var tok;\n this.skipSpaces();\n\n // Parenthesis\n if (this.accept('(')) {\n ++this.parens;\n var expr = this.expression()\n , paren = this.expect(')');\n --this.parens;\n if (this.accept('%')) expr.push(new nodes.Ident('%'));\n tok = this.peek();\n // (1 + 2)px, (1 + 2)em, etc.\n if (!paren.space\n && 'ident' == tok.type\n && ~units.indexOf(tok.val.string)) {\n expr.push(new nodes.Ident(tok.val.string));\n this.next();\n }\n return expr;\n }\n\n tok = this.peek();\n\n // Primitive\n switch (tok.type) {\n case 'null':\n case 'unit':\n case 'color':\n case 'string':\n case 'literal':\n case 'boolean':\n case 'comment':\n return this.next().val;\n case !this.cond && '{':\n return this.object();\n case 'atblock':\n return this.atblock();\n // property lookup\n case 'atrule':\n var id = new nodes.Ident(this.next().val);\n id.property = true;\n return id;\n case 'ident':\n return this.ident();\n case 'function':\n return tok.anonymous\n ? this.functionDefinition()\n : this.functionCall();\n }\n }\n};\n", "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nconst intToCharMap = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".split(\"\");\n\n/**\n * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n */\nexports.encode = function(number) {\n if (0 <= number && number < intToCharMap.length) {\n return intToCharMap[number];\n }\n throw new TypeError(\"Must be between 0 and 63: \" + number);\n};\n", "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * Based on the Base 64 VLQ implementation in Closure Compiler:\n * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n *\n * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n * * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived\n * from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nconst base64 = require(\"./base64\");\n\n// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n// length quantities we use in the source map spec, the first bit is the sign,\n// the next four bits are the actual value, and the 6th bit is the\n// continuation bit. The continuation bit tells us whether there are more\n// digits in this value following this digit.\n//\n// Continuation\n// | Sign\n// | |\n// V V\n// 101011\n\nconst VLQ_BASE_SHIFT = 5;\n\n// binary: 100000\nconst VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\n// binary: 011111\nconst VLQ_BASE_MASK = VLQ_BASE - 1;\n\n// binary: 100000\nconst VLQ_CONTINUATION_BIT = VLQ_BASE;\n\n/**\n * Converts from a two-complement value to a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n */\nfunction toVLQSigned(aValue) {\n return aValue < 0\n ? ((-aValue) << 1) + 1\n : (aValue << 1) + 0;\n}\n\n/**\n * Converts to a two-complement value from a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n */\n// eslint-disable-next-line no-unused-vars\nfunction fromVLQSigned(aValue) {\n const isNegative = (aValue & 1) === 1;\n const shifted = aValue >> 1;\n return isNegative\n ? -shifted\n : shifted;\n}\n\n/**\n * Returns the base 64 VLQ encoded value.\n */\nexports.encode = function base64VLQ_encode(aValue) {\n let encoded = \"\";\n let digit;\n\n let vlq = toVLQSigned(aValue);\n\n do {\n digit = vlq & VLQ_BASE_MASK;\n vlq >>>= VLQ_BASE_SHIFT;\n if (vlq > 0) {\n // There are still more digits in this value, so we must make sure the\n // continuation bit is marked.\n digit |= VLQ_CONTINUATION_BIT;\n }\n encoded += base64.encode(digit);\n } while (vlq > 0);\n\n return encoded;\n};\n", "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n/**\n * This is a helper function for getting values from parameter/options\n * objects.\n *\n * @param args The object we are extracting values from\n * @param name The name of the property we are getting.\n * @param defaultValue An optional value to return if the property is missing\n * from the object. If this is not specified and the property is missing, an\n * error will be thrown.\n */\nfunction getArg(aArgs, aName, aDefaultValue) {\n if (aName in aArgs) {\n return aArgs[aName];\n } else if (arguments.length === 3) {\n return aDefaultValue;\n }\n throw new Error('\"' + aName + '\" is a required argument.');\n\n}\nexports.getArg = getArg;\n\nconst urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.-]*)(?::(\\d+))?(.*)$/;\nconst dataUrlRegexp = /^data:.+\\,.+$/;\n\nfunction urlParse(aUrl) {\n const match = aUrl.match(urlRegexp);\n if (!match) {\n return null;\n }\n return {\n scheme: match[1],\n auth: match[2],\n host: match[3],\n port: match[4],\n path: match[5]\n };\n}\nexports.urlParse = urlParse;\n\nfunction urlGenerate(aParsedUrl) {\n let url = \"\";\n if (aParsedUrl.scheme) {\n url += aParsedUrl.scheme + \":\";\n }\n url += \"//\";\n if (aParsedUrl.auth) {\n url += aParsedUrl.auth + \"@\";\n }\n if (aParsedUrl.host) {\n url += aParsedUrl.host;\n }\n if (aParsedUrl.port) {\n url += \":\" + aParsedUrl.port;\n }\n if (aParsedUrl.path) {\n url += aParsedUrl.path;\n }\n return url;\n}\nexports.urlGenerate = urlGenerate;\n\nconst MAX_CACHED_INPUTS = 32;\n\n/**\n * Takes some function `f(input) -> result` and returns a memoized version of\n * `f`.\n *\n * We keep at most `MAX_CACHED_INPUTS` memoized results of `f` alive. The\n * memoization is a dumb-simple, linear least-recently-used cache.\n */\nfunction lruMemoize(f) {\n const cache = [];\n\n return function(input) {\n for (let i = 0; i < cache.length; i++) {\n if (cache[i].input === input) {\n const temp = cache[0];\n cache[0] = cache[i];\n cache[i] = temp;\n return cache[0].result;\n }\n }\n\n const result = f(input);\n\n cache.unshift({\n input,\n result,\n });\n\n if (cache.length > MAX_CACHED_INPUTS) {\n cache.pop();\n }\n\n return result;\n };\n}\n\n/**\n * Normalizes a path, or the path portion of a URL:\n *\n * - Replaces consecutive slashes with one slash.\n * - Removes unnecessary '.' parts.\n * - Removes unnecessary '<dir>/..' parts.\n *\n * Based on code in the Node.js 'path' core module.\n *\n * @param aPath The path or url to normalize.\n */\nconst normalize = lruMemoize(function normalize(aPath) {\n let path = aPath;\n const url = urlParse(aPath);\n if (url) {\n if (!url.path) {\n return aPath;\n }\n path = url.path;\n }\n const isAbsolute = exports.isAbsolute(path);\n\n // Split the path into parts between `/` characters. This is much faster than\n // using `.split(/\\/+/g)`.\n const parts = [];\n let start = 0;\n let i = 0;\n while (true) {\n start = i;\n i = path.indexOf(\"/\", start);\n if (i === -1) {\n parts.push(path.slice(start));\n break;\n } else {\n parts.push(path.slice(start, i));\n while (i < path.length && path[i] === \"/\") {\n i++;\n }\n }\n }\n\n let up = 0;\n for (i = parts.length - 1; i >= 0; i--) {\n const part = parts[i];\n if (part === \".\") {\n parts.splice(i, 1);\n } else if (part === \"..\") {\n up++;\n } else if (up > 0) {\n if (part === \"\") {\n // The first part is blank if the path is absolute. Trying to go\n // above the root is a no-op. Therefore we can remove all '..' parts\n // directly after the root.\n parts.splice(i + 1, up);\n up = 0;\n } else {\n parts.splice(i, 2);\n up--;\n }\n }\n }\n path = parts.join(\"/\");\n\n if (path === \"\") {\n path = isAbsolute ? \"/\" : \".\";\n }\n\n if (url) {\n url.path = path;\n return urlGenerate(url);\n }\n return path;\n});\nexports.normalize = normalize;\n\n/**\n * Joins two paths/URLs.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be joined with the root.\n *\n * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n * scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n * first.\n * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n * is updated with the result and aRoot is returned. Otherwise the result\n * is returned.\n * - If aPath is absolute, the result is aPath.\n * - Otherwise the two paths are joined with a slash.\n * - Joining for example 'http://' and 'www.example.com' is also supported.\n */\nfunction join(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n if (aPath === \"\") {\n aPath = \".\";\n }\n const aPathUrl = urlParse(aPath);\n const aRootUrl = urlParse(aRoot);\n if (aRootUrl) {\n aRoot = aRootUrl.path || \"/\";\n }\n\n // `join(foo, '//www.example.org')`\n if (aPathUrl && !aPathUrl.scheme) {\n if (aRootUrl) {\n aPathUrl.scheme = aRootUrl.scheme;\n }\n return urlGenerate(aPathUrl);\n }\n\n if (aPathUrl || aPath.match(dataUrlRegexp)) {\n return aPath;\n }\n\n // `join('http://', 'www.example.com')`\n if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n aRootUrl.host = aPath;\n return urlGenerate(aRootUrl);\n }\n\n const joined = aPath.charAt(0) === \"/\"\n ? aPath\n : normalize(aRoot.replace(/\\/+$/, \"\") + \"/\" + aPath);\n\n if (aRootUrl) {\n aRootUrl.path = joined;\n return urlGenerate(aRootUrl);\n }\n return joined;\n}\nexports.join = join;\n\nexports.isAbsolute = function(aPath) {\n return aPath.charAt(0) === \"/\" || urlRegexp.test(aPath);\n};\n\n/**\n * Make a path relative to a URL or another path.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be made relative to aRoot.\n */\nfunction relative(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n\n aRoot = aRoot.replace(/\\/$/, \"\");\n\n // It is possible for the path to be above the root. In this case, simply\n // checking whether the root is a prefix of the path won't work. Instead, we\n // need to remove components from the root one by one, until either we find\n // a prefix that fits, or we run out of components to remove.\n let level = 0;\n while (aPath.indexOf(aRoot + \"/\") !== 0) {\n const index = aRoot.lastIndexOf(\"/\");\n if (index < 0) {\n return aPath;\n }\n\n // If the only part of the root that is left is the scheme (i.e. http://,\n // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n // have exhausted all components, so the path is not relative to the root.\n aRoot = aRoot.slice(0, index);\n if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n return aPath;\n }\n\n ++level;\n }\n\n // Make sure we add a \"../\" for each component we removed from the root.\n return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n}\nexports.relative = relative;\n\nconst supportsNullProto = (function() {\n const obj = Object.create(null);\n return !(\"__proto__\" in obj);\n}());\n\nfunction identity(s) {\n return s;\n}\n\n/**\n * Because behavior goes wacky when you set `__proto__` on objects, we\n * have to prefix all the strings in our set with an arbitrary character.\n *\n * See https://github.com/mozilla/source-map/pull/31 and\n * https://github.com/mozilla/source-map/issues/30\n *\n * @param String aStr\n */\nfunction toSetString(aStr) {\n if (isProtoString(aStr)) {\n return \"$\" + aStr;\n }\n\n return aStr;\n}\nexports.toSetString = supportsNullProto ? identity : toSetString;\n\nfunction fromSetString(aStr) {\n if (isProtoString(aStr)) {\n return aStr.slice(1);\n }\n\n return aStr;\n}\nexports.fromSetString = supportsNullProto ? identity : fromSetString;\n\nfunction isProtoString(s) {\n if (!s) {\n return false;\n }\n\n const length = s.length;\n\n if (length < 9 /* \"__proto__\".length */) {\n return false;\n }\n\n /* eslint-disable no-multi-spaces */\n if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||\n s.charCodeAt(length - 2) !== 95 /* '_' */ ||\n s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n s.charCodeAt(length - 8) !== 95 /* '_' */ ||\n s.charCodeAt(length - 9) !== 95 /* '_' */) {\n return false;\n }\n /* eslint-enable no-multi-spaces */\n\n for (let i = length - 10; i >= 0; i--) {\n if (s.charCodeAt(i) !== 36 /* '$' */) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Comparator between two mappings where the original positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same original source/line/column, but different generated\n * line and column the same. Useful when searching for a mapping with a\n * stubbed out mapping.\n */\nfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n let cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0 || onlyCompareOriginal) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByOriginalPositions = compareByOriginalPositions;\n\n/**\n * Comparator between two mappings with deflated source and name indices where\n * the generated positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same generated line and column, but different\n * source/name/original line and column the same. Useful when searching for a\n * mapping with a stubbed out mapping.\n */\nfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n let cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0 || onlyCompareGenerated) {\n return cmp;\n }\n\n cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\nfunction strcmp(aStr1, aStr2) {\n if (aStr1 === aStr2) {\n return 0;\n }\n\n if (aStr1 === null) {\n return 1; // aStr2 !== null\n }\n\n if (aStr2 === null) {\n return -1; // aStr1 !== null\n }\n\n if (aStr1 > aStr2) {\n return 1;\n }\n\n return -1;\n}\n\n/**\n * Comparator between two mappings with inflated source and name strings where\n * the generated positions are compared.\n */\nfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n let cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\n/**\n * Strip any JSON XSSI avoidance prefix from the string (as documented\n * in the source maps specification), and then parse the string as\n * JSON.\n */\nfunction parseSourceMapInput(str) {\n return JSON.parse(str.replace(/^\\)]}'[^\\n]*\\n/, \"\"));\n}\nexports.parseSourceMapInput = parseSourceMapInput;\n\n/**\n * Compute the URL of a source given the the source root, the source's\n * URL, and the source map's URL.\n */\nfunction computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {\n sourceURL = sourceURL || \"\";\n\n if (sourceRoot) {\n // This follows what Chrome does.\n if (sourceRoot[sourceRoot.length - 1] !== \"/\" && sourceURL[0] !== \"/\") {\n sourceRoot += \"/\";\n }\n // The spec says:\n // Line 4: An optional source root, useful for relocating source\n // files on a server or removing repeated values in the\n // \u201Csources\u201D entry. This value is prepended to the individual\n // entries in the \u201Csource\u201D field.\n sourceURL = sourceRoot + sourceURL;\n }\n\n // Historically, SourceMapConsumer did not take the sourceMapURL as\n // a parameter. This mode is still somewhat supported, which is why\n // this code block is conditional. However, it's preferable to pass\n // the source map URL to SourceMapConsumer, so that this function\n // can implement the source URL resolution algorithm as outlined in\n // the spec. This block is basically the equivalent of:\n // new URL(sourceURL, sourceMapURL).toString()\n // ... except it avoids using URL, which wasn't available in the\n // older releases of node still supported by this library.\n //\n // The spec says:\n // If the sources are not absolute URLs after prepending of the\n // \u201CsourceRoot\u201D, the sources are resolved relative to the\n // SourceMap (like resolving script src in a html document).\n if (sourceMapURL) {\n const parsed = urlParse(sourceMapURL);\n if (!parsed) {\n throw new Error(\"sourceMapURL could not be parsed\");\n }\n if (parsed.path) {\n // Strip the last path component, but keep the \"/\".\n const index = parsed.path.lastIndexOf(\"/\");\n if (index >= 0) {\n parsed.path = parsed.path.substring(0, index + 1);\n }\n }\n sourceURL = join(urlGenerate(parsed), sourceURL);\n }\n\n return normalize(sourceURL);\n}\nexports.computeSourceURL = computeSourceURL;\n", "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n/**\n * A data structure which is a combination of an array and a set. Adding a new\n * member is O(1), testing for membership is O(1), and finding the index of an\n * element is O(1). Removing elements from the set is not supported. Only\n * strings are supported for membership.\n */\nclass ArraySet {\n constructor() {\n this._array = [];\n this._set = new Map();\n }\n\n /**\n * Static method for creating ArraySet instances from an existing array.\n */\n static fromArray(aArray, aAllowDuplicates) {\n const set = new ArraySet();\n for (let i = 0, len = aArray.length; i < len; i++) {\n set.add(aArray[i], aAllowDuplicates);\n }\n return set;\n }\n\n /**\n * Return how many unique items are in this ArraySet. If duplicates have been\n * added, than those do not count towards the size.\n *\n * @returns Number\n */\n size() {\n return this._set.size;\n }\n\n /**\n * Add the given string to this set.\n *\n * @param String aStr\n */\n add(aStr, aAllowDuplicates) {\n const isDuplicate = this.has(aStr);\n const idx = this._array.length;\n if (!isDuplicate || aAllowDuplicates) {\n this._array.push(aStr);\n }\n if (!isDuplicate) {\n this._set.set(aStr, idx);\n }\n }\n\n /**\n * Is the given string a member of this set?\n *\n * @param String aStr\n */\n has(aStr) {\n return this._set.has(aStr);\n }\n\n /**\n * What is the index of the given string in the array?\n *\n * @param String aStr\n */\n indexOf(aStr) {\n const idx = this._set.get(aStr);\n if (idx >= 0) {\n return idx;\n }\n throw new Error('\"' + aStr + '\" is not in the set.');\n }\n\n /**\n * What is the element at the given index?\n *\n * @param Number aIdx\n */\n at(aIdx) {\n if (aIdx >= 0 && aIdx < this._array.length) {\n return this._array[aIdx];\n }\n throw new Error(\"No element indexed by \" + aIdx);\n }\n\n /**\n * Returns the array representation of this set (which has the proper indices\n * indicated by indexOf). Note that this is a copy of the internal array used\n * for storing the members so that no one can mess with internal state.\n */\n toArray() {\n return this._array.slice();\n }\n}\nexports.ArraySet = ArraySet;\n", "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2014 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nconst util = require(\"./util\");\n\n/**\n * Determine whether mappingB is after mappingA with respect to generated\n * position.\n */\nfunction generatedPositionAfter(mappingA, mappingB) {\n // Optimized for most common case\n const lineA = mappingA.generatedLine;\n const lineB = mappingB.generatedLine;\n const columnA = mappingA.generatedColumn;\n const columnB = mappingB.generatedColumn;\n return lineB > lineA || lineB == lineA && columnB >= columnA ||\n util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n}\n\n/**\n * A data structure to provide a sorted view of accumulated mappings in a\n * performance conscious manner. It trades a negligible overhead in general\n * case for a large speedup in case of mappings being added in order.\n */\nclass MappingList {\n constructor() {\n this._array = [];\n this._sorted = true;\n // Serves as infimum\n this._last = {generatedLine: -1, generatedColumn: 0};\n }\n\n /**\n * Iterate through internal items. This method takes the same arguments that\n * `Array.prototype.forEach` takes.\n *\n * NOTE: The order of the mappings is NOT guaranteed.\n */\n unsortedForEach(aCallback, aThisArg) {\n this._array.forEach(aCallback, aThisArg);\n }\n\n /**\n * Add the given source mapping.\n *\n * @param Object aMapping\n */\n add(aMapping) {\n if (generatedPositionAfter(this._last, aMapping)) {\n this._last = aMapping;\n this._array.push(aMapping);\n } else {\n this._sorted = false;\n this._array.push(aMapping);\n }\n }\n\n /**\n * Returns the flat, sorted array of mappings. The mappings are sorted by\n * generated position.\n *\n * WARNING: This method returns internal data without copying, for\n * performance. The return value must NOT be mutated, and should be treated as\n * an immutable borrow. If you want to take ownership, you must make your own\n * copy.\n */\n toArray() {\n if (!this._sorted) {\n this._array.sort(util.compareByGeneratedPositionsInflated);\n this._sorted = true;\n }\n return this._array;\n }\n}\n\nexports.MappingList = MappingList;\n", "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nconst base64VLQ = require(\"./base64-vlq\");\nconst util = require(\"./util\");\nconst ArraySet = require(\"./array-set\").ArraySet;\nconst MappingList = require(\"./mapping-list\").MappingList;\n\n/**\n * An instance of the SourceMapGenerator represents a source map which is\n * being built incrementally. You may pass an object with the following\n * properties:\n *\n * - file: The filename of the generated source.\n * - sourceRoot: A root for all relative URLs in this source map.\n */\nclass SourceMapGenerator {\n constructor(aArgs) {\n if (!aArgs) {\n aArgs = {};\n }\n this._file = util.getArg(aArgs, \"file\", null);\n this._sourceRoot = util.getArg(aArgs, \"sourceRoot\", null);\n this._skipValidation = util.getArg(aArgs, \"skipValidation\", false);\n this._sources = new ArraySet();\n this._names = new ArraySet();\n this._mappings = new MappingList();\n this._sourcesContents = null;\n }\n\n /**\n * Creates a new SourceMapGenerator based on a SourceMapConsumer\n *\n * @param aSourceMapConsumer The SourceMap.\n */\n static fromSourceMap(aSourceMapConsumer) {\n const sourceRoot = aSourceMapConsumer.sourceRoot;\n const generator = new SourceMapGenerator({\n file: aSourceMapConsumer.file,\n sourceRoot\n });\n aSourceMapConsumer.eachMapping(function(mapping) {\n const newMapping = {\n generated: {\n line: mapping.generatedLine,\n column: mapping.generatedColumn\n }\n };\n\n if (mapping.source != null) {\n newMapping.source = mapping.source;\n if (sourceRoot != null) {\n newMapping.source = util.relative(sourceRoot, newMapping.source);\n }\n\n newMapping.original = {\n line: mapping.originalLine,\n column: mapping.originalColumn\n };\n\n if (mapping.name != null) {\n newMapping.name = mapping.name;\n }\n }\n\n generator.addMapping(newMapping);\n });\n aSourceMapConsumer.sources.forEach(function(sourceFile) {\n let sourceRelative = sourceFile;\n if (sourceRoot !== null) {\n sourceRelative = util.relative(sourceRoot, sourceFile);\n }\n\n if (!generator._sources.has(sourceRelative)) {\n generator._sources.add(sourceRelative);\n }\n\n const content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n generator.setSourceContent(sourceFile, content);\n }\n });\n return generator;\n }\n\n /**\n * Add a single mapping from original source line and column to the generated\n * source's line and column for this source map being created. The mapping\n * object should have the following properties:\n *\n * - generated: An object with the generated line and column positions.\n * - original: An object with the original line and column positions.\n * - source: The original source file (relative to the sourceRoot).\n * - name: An optional original token name for this mapping.\n */\n addMapping(aArgs) {\n const generated = util.getArg(aArgs, \"generated\");\n const original = util.getArg(aArgs, \"original\", null);\n let source = util.getArg(aArgs, \"source\", null);\n let name = util.getArg(aArgs, \"name\", null);\n\n if (!this._skipValidation) {\n this._validateMapping(generated, original, source, name);\n }\n\n if (source != null) {\n source = String(source);\n if (!this._sources.has(source)) {\n this._sources.add(source);\n }\n }\n\n if (name != null) {\n name = String(name);\n if (!this._names.has(name)) {\n this._names.add(name);\n }\n }\n\n this._mappings.add({\n generatedLine: generated.line,\n generatedColumn: generated.column,\n originalLine: original != null && original.line,\n originalColumn: original != null && original.column,\n source,\n name\n });\n }\n\n /**\n * Set the source content for a source file.\n */\n setSourceContent(aSourceFile, aSourceContent) {\n let source = aSourceFile;\n if (this._sourceRoot != null) {\n source = util.relative(this._sourceRoot, source);\n }\n\n if (aSourceContent != null) {\n // Add the source content to the _sourcesContents map.\n // Create a new _sourcesContents map if the property is null.\n if (!this._sourcesContents) {\n this._sourcesContents = Object.create(null);\n }\n this._sourcesContents[util.toSetString(source)] = aSourceContent;\n } else if (this._sourcesContents) {\n // Remove the source file from the _sourcesContents map.\n // If the _sourcesContents map is empty, set the property to null.\n delete this._sourcesContents[util.toSetString(source)];\n if (Object.keys(this._sourcesContents).length === 0) {\n this._sourcesContents = null;\n }\n }\n }\n\n /**\n * Applies the mappings of a sub-source-map for a specific source file to the\n * source map being generated. Each mapping to the supplied source file is\n * rewritten using the supplied source map. Note: The resolution for the\n * resulting mappings is the minimium of this map and the supplied map.\n *\n * @param aSourceMapConsumer The source map to be applied.\n * @param aSourceFile Optional. The filename of the source file.\n * If omitted, SourceMapConsumer's file property will be used.\n * @param aSourceMapPath Optional. The dirname of the path to the source map\n * to be applied. If relative, it is relative to the SourceMapConsumer.\n * This parameter is needed when the two source maps aren't in the same\n * directory, and the source map to be applied contains relative source\n * paths. If so, those relative source paths need to be rewritten\n * relative to the SourceMapGenerator.\n */\n applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n let sourceFile = aSourceFile;\n // If aSourceFile is omitted, we will use the file property of the SourceMap\n if (aSourceFile == null) {\n if (aSourceMapConsumer.file == null) {\n throw new Error(\n \"SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, \" +\n 'or the source map\\'s \"file\" property. Both were omitted.'\n );\n }\n sourceFile = aSourceMapConsumer.file;\n }\n const sourceRoot = this._sourceRoot;\n // Make \"sourceFile\" relative if an absolute Url is passed.\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n // Applying the SourceMap can add and remove items from the sources and\n // the names array.\n const newSources = this._mappings.toArray().length > 0\n ? new ArraySet()\n : this._sources;\n const newNames = new ArraySet();\n\n // Find mappings for the \"sourceFile\"\n this._mappings.unsortedForEach(function(mapping) {\n if (mapping.source === sourceFile && mapping.originalLine != null) {\n // Check if it can be mapped by the source map, then update the mapping.\n const original = aSourceMapConsumer.originalPositionFor({\n line: mapping.originalLine,\n column: mapping.originalColumn\n });\n if (original.source != null) {\n // Copy mapping\n mapping.source = original.source;\n if (aSourceMapPath != null) {\n mapping.source = util.join(aSourceMapPath, mapping.source);\n }\n if (sourceRoot != null) {\n mapping.source = util.relative(sourceRoot, mapping.source);\n }\n mapping.originalLine = original.line;\n mapping.originalColumn = original.column;\n if (original.name != null) {\n mapping.name = original.name;\n }\n }\n }\n\n const source = mapping.source;\n if (source != null && !newSources.has(source)) {\n newSources.add(source);\n }\n\n const name = mapping.name;\n if (name != null && !newNames.has(name)) {\n newNames.add(name);\n }\n\n }, this);\n this._sources = newSources;\n this._names = newNames;\n\n // Copy sourcesContents of applied map.\n aSourceMapConsumer.sources.forEach(function(srcFile) {\n const content = aSourceMapConsumer.sourceContentFor(srcFile);\n if (content != null) {\n if (aSourceMapPath != null) {\n srcFile = util.join(aSourceMapPath, srcFile);\n }\n if (sourceRoot != null) {\n srcFile = util.relative(sourceRoot, srcFile);\n }\n this.setSourceContent(srcFile, content);\n }\n }, this);\n }\n\n /**\n * A mapping can have one of the three levels of data:\n *\n * 1. Just the generated position.\n * 2. The Generated position, original position, and original source.\n * 3. Generated and original position, original source, as well as a name\n * token.\n *\n * To maintain consistency, we validate that any new mapping being added falls\n * in to one of these categories.\n */\n _validateMapping(aGenerated, aOriginal, aSource, aName) {\n // When aOriginal is truthy but has empty values for .line and .column,\n // it is most likely a programmer error. In this case we throw a very\n // specific error message to try to guide them the right way.\n // For example: https://github.com/Polymer/polymer-bundler/pull/519\n if (aOriginal && typeof aOriginal.line !== \"number\" && typeof aOriginal.column !== \"number\") {\n throw new Error(\n \"original.line and original.column are not numbers -- you probably meant to omit \" +\n \"the original mapping entirely and only map the generated position. If so, pass \" +\n \"null for the original mapping instead of an object with empty or null values.\"\n );\n }\n\n if (aGenerated && \"line\" in aGenerated && \"column\" in aGenerated\n && aGenerated.line > 0 && aGenerated.column >= 0\n && !aOriginal && !aSource && !aName) {\n // Case 1.\n\n } else if (aGenerated && \"line\" in aGenerated && \"column\" in aGenerated\n && aOriginal && \"line\" in aOriginal && \"column\" in aOriginal\n && aGenerated.line > 0 && aGenerated.column >= 0\n && aOriginal.line > 0 && aOriginal.column >= 0\n && aSource) {\n // Cases 2 and 3.\n\n } else {\n throw new Error(\"Invalid mapping: \" + JSON.stringify({\n generated: aGenerated,\n source: aSource,\n original: aOriginal,\n name: aName\n }));\n }\n }\n\n /**\n * Serialize the accumulated mappings in to the stream of base 64 VLQs\n * specified by the source map format.\n */\n _serializeMappings() {\n let previousGeneratedColumn = 0;\n let previousGeneratedLine = 1;\n let previousOriginalColumn = 0;\n let previousOriginalLine = 0;\n let previousName = 0;\n let previousSource = 0;\n let result = \"\";\n let next;\n let mapping;\n let nameIdx;\n let sourceIdx;\n\n const mappings = this._mappings.toArray();\n for (let i = 0, len = mappings.length; i < len; i++) {\n mapping = mappings[i];\n next = \"\";\n\n if (mapping.generatedLine !== previousGeneratedLine) {\n previousGeneratedColumn = 0;\n while (mapping.generatedLine !== previousGeneratedLine) {\n next += \";\";\n previousGeneratedLine++;\n }\n } else if (i > 0) {\n if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n continue;\n }\n next += \",\";\n }\n\n next += base64VLQ.encode(mapping.generatedColumn\n - previousGeneratedColumn);\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (mapping.source != null) {\n sourceIdx = this._sources.indexOf(mapping.source);\n next += base64VLQ.encode(sourceIdx - previousSource);\n previousSource = sourceIdx;\n\n // lines are stored 0-based in SourceMap spec version 3\n next += base64VLQ.encode(mapping.originalLine - 1\n - previousOriginalLine);\n previousOriginalLine = mapping.originalLine - 1;\n\n next += base64VLQ.encode(mapping.originalColumn\n - previousOriginalColumn);\n previousOriginalColumn = mapping.originalColumn;\n\n if (mapping.name != null) {\n nameIdx = this._names.indexOf(mapping.name);\n next += base64VLQ.encode(nameIdx - previousName);\n previousName = nameIdx;\n }\n }\n\n result += next;\n }\n\n return result;\n }\n\n _generateSourcesContent(aSources, aSourceRoot) {\n return aSources.map(function(source) {\n if (!this._sourcesContents) {\n return null;\n }\n if (aSourceRoot != null) {\n source = util.relative(aSourceRoot, source);\n }\n const key = util.toSetString(source);\n return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n ? this._sourcesContents[key]\n : null;\n }, this);\n }\n\n /**\n * Externalize the source map.\n */\n toJSON() {\n const map = {\n version: this._version,\n sources: this._sources.toArray(),\n names: this._names.toArray(),\n mappings: this._serializeMappings()\n };\n if (this._file != null) {\n map.file = this._file;\n }\n if (this._sourceRoot != null) {\n map.sourceRoot = this._sourceRoot;\n }\n if (this._sourcesContents) {\n map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n }\n\n return map;\n }\n\n /**\n * Render the source map being generated to a string.\n */\n toString() {\n return JSON.stringify(this.toJSON());\n }\n}\n\nSourceMapGenerator.prototype._version = 3;\nexports.SourceMapGenerator = SourceMapGenerator;\n", "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nexports.GREATEST_LOWER_BOUND = 1;\nexports.LEAST_UPPER_BOUND = 2;\n\n/**\n * Recursive implementation of binary search.\n *\n * @param aLow Indices here and lower do not contain the needle.\n * @param aHigh Indices here and higher do not contain the needle.\n * @param aNeedle The element being searched for.\n * @param aHaystack The non-empty array being searched.\n * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n */\nfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n // This function terminates when one of the following is true:\n //\n // 1. We find the exact element we are looking for.\n //\n // 2. We did not find the exact element, but we can return the index of\n // the next-closest element.\n //\n // 3. We did not find the exact element, and there is no next-closest\n // element than the one we are searching for, so we return -1.\n const mid = Math.floor((aHigh - aLow) / 2) + aLow;\n const cmp = aCompare(aNeedle, aHaystack[mid], true);\n if (cmp === 0) {\n // Found the element we are looking for.\n return mid;\n } else if (cmp > 0) {\n // Our needle is greater than aHaystack[mid].\n if (aHigh - mid > 1) {\n // The element is in the upper half.\n return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // The exact needle element was not found in this haystack. Determine if\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return aHigh < aHaystack.length ? aHigh : -1;\n }\n return mid;\n }\n\n // Our needle is less than aHaystack[mid].\n if (mid - aLow > 1) {\n // The element is in the lower half.\n return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return mid;\n }\n return aLow < 0 ? -1 : aLow;\n}\n\n/**\n * This is an implementation of binary search which will always try and return\n * the index of the closest element if there is no exact hit. This is because\n * mappings between original and generated line/col pairs are single points,\n * and there is an implicit region between each of them, so a miss just means\n * that you aren't on the very start of a region.\n *\n * @param aNeedle The element you are looking for.\n * @param aHaystack The array that is being searched.\n * @param aCompare A function which takes the needle and an element in the\n * array and returns -1, 0, or 1 depending on whether the needle is less\n * than, equal to, or greater than the element, respectively.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n */\nexports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n if (aHaystack.length === 0) {\n return -1;\n }\n\n let index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n if (index < 0) {\n return -1;\n }\n\n // We have found either the exact element, or the next-closest element than\n // the one we are searching for. However, there may be more than one such\n // element. Make sure we always return the smallest of these.\n while (index - 1 >= 0) {\n if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n break;\n }\n --index;\n }\n\n return index;\n};\n", "/* Determine browser vs node environment by testing the default top level context. Solution courtesy of: https://stackoverflow.com/questions/17575790/environment-detection-node-js-or-browser */\nconst isBrowserEnvironment = (function() {\n // eslint-disable-next-line no-undef\n return (typeof window !== \"undefined\") && (this === window);\n}).call();\n\nif (isBrowserEnvironment) {\n // Web version of reading a wasm file into an array buffer.\n\n let mappingsWasm = null;\n\n module.exports = function readWasm() {\n if (typeof mappingsWasm === \"string\") {\n return fetch(mappingsWasm)\n .then(response => response.arrayBuffer());\n }\n if (mappingsWasm instanceof ArrayBuffer) {\n return Promise.resolve(mappingsWasm);\n }\n throw new Error(\"You must provide the string URL or ArrayBuffer contents \" +\n \"of lib/mappings.wasm by calling \" +\n \"SourceMapConsumer.initialize({ 'lib/mappings.wasm': ... }) \" +\n \"before using SourceMapConsumer\");\n };\n\n module.exports.initialize = input => mappingsWasm = input;\n} else {\n // Node version of reading a wasm file into an array buffer.\n const fs = require(\"fs\");\n const path = require(\"path\");\n\n module.exports = function readWasm() {\n return new Promise((resolve, reject) => {\n const wasmPath = path.join(__dirname, \"mappings.wasm\");\n fs.readFile(wasmPath, null, (error, data) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve(data.buffer);\n });\n });\n };\n\n module.exports.initialize = _ => {\n console.debug(\"SourceMapConsumer.initialize is a no-op when running in node.js\");\n };\n}\n", "const readWasm = require(\"../lib/read-wasm\");\n\n/**\n * Provide the JIT with a nice shape / hidden class.\n */\nfunction Mapping() {\n this.generatedLine = 0;\n this.generatedColumn = 0;\n this.lastGeneratedColumn = null;\n this.source = null;\n this.originalLine = null;\n this.originalColumn = null;\n this.name = null;\n}\n\nlet cachedWasm = null;\n\nmodule.exports = function wasm() {\n if (cachedWasm) {\n return cachedWasm;\n }\n\n const callbackStack = [];\n\n cachedWasm = readWasm().then(buffer => {\n return WebAssembly.instantiate(buffer, {\n env: {\n mapping_callback(\n generatedLine,\n generatedColumn,\n\n hasLastGeneratedColumn,\n lastGeneratedColumn,\n\n hasOriginal,\n source,\n originalLine,\n originalColumn,\n\n hasName,\n name\n ) {\n const mapping = new Mapping();\n // JS uses 1-based line numbers, wasm uses 0-based.\n mapping.generatedLine = generatedLine + 1;\n mapping.generatedColumn = generatedColumn;\n\n if (hasLastGeneratedColumn) {\n // JS uses inclusive last generated column, wasm uses exclusive.\n mapping.lastGeneratedColumn = lastGeneratedColumn - 1;\n }\n\n if (hasOriginal) {\n mapping.source = source;\n // JS uses 1-based line numbers, wasm uses 0-based.\n mapping.originalLine = originalLine + 1;\n mapping.originalColumn = originalColumn;\n\n if (hasName) {\n mapping.name = name;\n }\n }\n\n callbackStack[callbackStack.length - 1](mapping);\n },\n\n start_all_generated_locations_for() { console.time(\"all_generated_locations_for\"); },\n end_all_generated_locations_for() { console.timeEnd(\"all_generated_locations_for\"); },\n\n start_compute_column_spans() { console.time(\"compute_column_spans\"); },\n end_compute_column_spans() { console.timeEnd(\"compute_column_spans\"); },\n\n start_generated_location_for() { console.time(\"generated_location_for\"); },\n end_generated_location_for() { console.timeEnd(\"generated_location_for\"); },\n\n start_original_location_for() { console.time(\"original_location_for\"); },\n end_original_location_for() { console.timeEnd(\"original_location_for\"); },\n\n start_parse_mappings() { console.time(\"parse_mappings\"); },\n end_parse_mappings() { console.timeEnd(\"parse_mappings\"); },\n\n start_sort_by_generated_location() { console.time(\"sort_by_generated_location\"); },\n end_sort_by_generated_location() { console.timeEnd(\"sort_by_generated_location\"); },\n\n start_sort_by_original_location() { console.time(\"sort_by_original_location\"); },\n end_sort_by_original_location() { console.timeEnd(\"sort_by_original_location\"); },\n }\n });\n }).then(Wasm => {\n return {\n exports: Wasm.instance.exports,\n withMappingCallback: (mappingCallback, f) => {\n callbackStack.push(mappingCallback);\n try {\n f();\n } finally {\n callbackStack.pop();\n }\n }\n };\n }).then(null, e => {\n cachedWasm = null;\n throw e;\n });\n\n return cachedWasm;\n};\n", "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nconst util = require(\"./util\");\nconst binarySearch = require(\"./binary-search\");\nconst ArraySet = require(\"./array-set\").ArraySet;\nconst base64VLQ = require(\"./base64-vlq\"); // eslint-disable-line no-unused-vars\nconst readWasm = require(\"../lib/read-wasm\");\nconst wasm = require(\"./wasm\");\n\nconst INTERNAL = Symbol(\"smcInternal\");\n\nclass SourceMapConsumer {\n constructor(aSourceMap, aSourceMapURL) {\n // If the constructor was called by super(), just return Promise<this>.\n // Yes, this is a hack to retain the pre-existing API of the base-class\n // constructor also being an async factory function.\n if (aSourceMap == INTERNAL) {\n return Promise.resolve(this);\n }\n\n return _factory(aSourceMap, aSourceMapURL);\n }\n\n static initialize(opts) {\n readWasm.initialize(opts[\"lib/mappings.wasm\"]);\n }\n\n static fromSourceMap(aSourceMap, aSourceMapURL) {\n return _factoryBSM(aSourceMap, aSourceMapURL);\n }\n\n /**\n * Construct a new `SourceMapConsumer` from `rawSourceMap` and `sourceMapUrl`\n * (see the `SourceMapConsumer` constructor for details. Then, invoke the `async\n * function f(SourceMapConsumer) -> T` with the newly constructed consumer, wait\n * for `f` to complete, call `destroy` on the consumer, and return `f`'s return\n * value.\n *\n * You must not use the consumer after `f` completes!\n *\n * By using `with`, you do not have to remember to manually call `destroy` on\n * the consumer, since it will be called automatically once `f` completes.\n *\n * ```js\n * const xSquared = await SourceMapConsumer.with(\n * myRawSourceMap,\n * null,\n * async function (consumer) {\n * // Use `consumer` inside here and don't worry about remembering\n * // to call `destroy`.\n *\n * const x = await whatever(consumer);\n * return x * x;\n * }\n * );\n *\n * // You may not use that `consumer` anymore out here; it has\n * // been destroyed. But you can use `xSquared`.\n * console.log(xSquared);\n * ```\n */\n static async with(rawSourceMap, sourceMapUrl, f) {\n const consumer = await new SourceMapConsumer(rawSourceMap, sourceMapUrl);\n try {\n return await f(consumer);\n } finally {\n consumer.destroy();\n }\n }\n\n /**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\n _parseMappings(aStr, aSourceRoot) {\n throw new Error(\"Subclasses must implement _parseMappings\");\n }\n\n /**\n * Iterate over each mapping between an original source/line/column and a\n * generated line/column in this source map.\n *\n * @param Function aCallback\n * The function that is called with each mapping.\n * @param Object aContext\n * Optional. If specified, this object will be the value of `this` every\n * time that `aCallback` is called.\n * @param aOrder\n * Either `SourceMapConsumer.GENERATED_ORDER` or\n * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n * iterate over the mappings sorted by the generated file's line/column\n * order or the original's source/line/column order, respectively. Defaults to\n * `SourceMapConsumer.GENERATED_ORDER`.\n */\n eachMapping(aCallback, aContext, aOrder) {\n throw new Error(\"Subclasses must implement eachMapping\");\n }\n\n /**\n * Returns all generated line and column information for the original source,\n * line, and column provided. If no column is provided, returns all mappings\n * corresponding to a either the line we are searching for or the next\n * closest line that has any mappings. Otherwise, returns all mappings\n * corresponding to the given line and either the column we are searching for\n * or the next closest column that has any offsets.\n *\n * The only argument is an object with the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source. The line number is 1-based.\n * - column: Optional. the column number in the original source.\n * The column number is 0-based.\n *\n * and an array of objects is returned, each with the following properties:\n *\n * - line: The line number in the generated source, or null. The\n * line number is 1-based.\n * - column: The column number in the generated source, or null.\n * The column number is 0-based.\n */\n allGeneratedPositionsFor(aArgs) {\n throw new Error(\"Subclasses must implement allGeneratedPositionsFor\");\n }\n\n destroy() {\n throw new Error(\"Subclasses must implement destroy\");\n }\n}\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nSourceMapConsumer.prototype._version = 3;\nSourceMapConsumer.GENERATED_ORDER = 1;\nSourceMapConsumer.ORIGINAL_ORDER = 2;\n\nSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\nSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\nexports.SourceMapConsumer = SourceMapConsumer;\n\n/**\n * A BasicSourceMapConsumer instance represents a parsed source map which we can\n * query for information about the original file positions by giving it a file\n * position in the generated source.\n *\n * The first parameter is the raw source map (either as a JSON string, or\n * already parsed to an object). According to the spec, source maps have the\n * following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - sources: An array of URLs to the original source files.\n * - names: An array of identifiers which can be referenced by individual mappings.\n * - sourceRoot: Optional. The URL root from which all sources are relative.\n * - sourcesContent: Optional. An array of contents of the original source files.\n * - mappings: A string of base64 VLQs which contain the actual mappings.\n * - file: Optional. The generated file this source map is associated with.\n *\n * Here is an example source map, taken from the source map spec[0]:\n *\n * {\n * version : 3,\n * file: \"out.js\",\n * sourceRoot : \"\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AA,AB;;ABCDE;\"\n * }\n *\n * The second parameter, if given, is a string whose value is the URL\n * at which the source map was found. This URL is used to compute the\n * sources array.\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n */\nclass BasicSourceMapConsumer extends SourceMapConsumer {\n constructor(aSourceMap, aSourceMapURL) {\n return super(INTERNAL).then(that => {\n let sourceMap = aSourceMap;\n if (typeof aSourceMap === \"string\") {\n sourceMap = util.parseSourceMapInput(aSourceMap);\n }\n\n const version = util.getArg(sourceMap, \"version\");\n let sources = util.getArg(sourceMap, \"sources\");\n // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n // requires the array) to play nice here.\n const names = util.getArg(sourceMap, \"names\", []);\n let sourceRoot = util.getArg(sourceMap, \"sourceRoot\", null);\n const sourcesContent = util.getArg(sourceMap, \"sourcesContent\", null);\n const mappings = util.getArg(sourceMap, \"mappings\");\n const file = util.getArg(sourceMap, \"file\", null);\n\n // Once again, Sass deviates from the spec and supplies the version as a\n // string rather than a number, so we use loose equality checking here.\n if (version != that._version) {\n throw new Error(\"Unsupported version: \" + version);\n }\n\n if (sourceRoot) {\n sourceRoot = util.normalize(sourceRoot);\n }\n\n sources = sources\n .map(String)\n // Some source maps produce relative source paths like \"./foo.js\" instead of\n // \"foo.js\". Normalize these first so that future comparisons will succeed.\n // See bugzil.la/1090768.\n .map(util.normalize)\n // Always ensure that absolute sources are internally stored relative to\n // the source root, if the source root is absolute. Not doing this would\n // be particularly problematic when the source root is a prefix of the\n // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n .map(function(source) {\n return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n ? util.relative(sourceRoot, source)\n : source;\n });\n\n // Pass `true` below to allow duplicate names and sources. While source maps\n // are intended to be compressed and deduplicated, the TypeScript compiler\n // sometimes generates source maps with duplicates in them. See Github issue\n // #72 and bugzil.la/889492.\n that._names = ArraySet.fromArray(names.map(String), true);\n that._sources = ArraySet.fromArray(sources, true);\n\n that._absoluteSources = that._sources.toArray().map(function(s) {\n return util.computeSourceURL(sourceRoot, s, aSourceMapURL);\n });\n\n that.sourceRoot = sourceRoot;\n that.sourcesContent = sourcesContent;\n that._mappings = mappings;\n that._sourceMapURL = aSourceMapURL;\n that.file = file;\n\n that._computedColumnSpans = false;\n that._mappingsPtr = 0;\n that._wasm = null;\n\n return wasm().then(w => {\n that._wasm = w;\n return that;\n });\n });\n }\n\n /**\n * Utility function to find the index of a source. Returns -1 if not\n * found.\n */\n _findSourceIndex(aSource) {\n let relativeSource = aSource;\n if (this.sourceRoot != null) {\n relativeSource = util.relative(this.sourceRoot, relativeSource);\n }\n\n if (this._sources.has(relativeSource)) {\n return this._sources.indexOf(relativeSource);\n }\n\n // Maybe aSource is an absolute URL as returned by |sources|. In\n // this case we can't simply undo the transform.\n for (let i = 0; i < this._absoluteSources.length; ++i) {\n if (this._absoluteSources[i] == aSource) {\n return i;\n }\n }\n\n return -1;\n }\n\n /**\n * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n *\n * @param SourceMapGenerator aSourceMap\n * The source map that will be consumed.\n * @param String aSourceMapURL\n * The URL at which the source map can be found (optional)\n * @returns BasicSourceMapConsumer\n */\n static fromSourceMap(aSourceMap, aSourceMapURL) {\n return new BasicSourceMapConsumer(aSourceMap.toString());\n }\n\n get sources() {\n return this._absoluteSources.slice();\n }\n\n _getMappingsPtr() {\n if (this._mappingsPtr === 0) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this._mappingsPtr;\n }\n\n /**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\n _parseMappings(aStr, aSourceRoot) {\n const size = aStr.length;\n\n const mappingsBufPtr = this._wasm.exports.allocate_mappings(size);\n const mappingsBuf = new Uint8Array(this._wasm.exports.memory.buffer, mappingsBufPtr, size);\n for (let i = 0; i < size; i++) {\n mappingsBuf[i] = aStr.charCodeAt(i);\n }\n\n const mappingsPtr = this._wasm.exports.parse_mappings(mappingsBufPtr);\n\n if (!mappingsPtr) {\n const error = this._wasm.exports.get_last_error();\n let msg = `Error parsing mappings (code ${error}): `;\n\n // XXX: keep these error codes in sync with `fitzgen/source-map-mappings`.\n switch (error) {\n case 1:\n msg += \"the mappings contained a negative line, column, source index, or name index\";\n break;\n case 2:\n msg += \"the mappings contained a number larger than 2**32\";\n break;\n case 3:\n msg += \"reached EOF while in the middle of parsing a VLQ\";\n break;\n case 4:\n msg += \"invalid base 64 character while parsing a VLQ\";\n break;\n default:\n msg += \"unknown error code\";\n break;\n }\n\n throw new Error(msg);\n }\n\n this._mappingsPtr = mappingsPtr;\n }\n\n eachMapping(aCallback, aContext, aOrder) {\n const context = aContext || null;\n const order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n const sourceRoot = this.sourceRoot;\n\n this._wasm.withMappingCallback(\n mapping => {\n if (mapping.source !== null) {\n mapping.source = this._sources.at(mapping.source);\n mapping.source = util.computeSourceURL(sourceRoot, mapping.source, this._sourceMapURL);\n\n if (mapping.name !== null) {\n mapping.name = this._names.at(mapping.name);\n }\n }\n\n aCallback.call(context, mapping);\n },\n () => {\n switch (order) {\n case SourceMapConsumer.GENERATED_ORDER:\n this._wasm.exports.by_generated_location(this._getMappingsPtr());\n break;\n case SourceMapConsumer.ORIGINAL_ORDER:\n this._wasm.exports.by_original_location(this._getMappingsPtr());\n break;\n default:\n throw new Error(\"Unknown order of iteration.\");\n }\n }\n );\n }\n\n allGeneratedPositionsFor(aArgs) {\n let source = util.getArg(aArgs, \"source\");\n const originalLine = util.getArg(aArgs, \"line\");\n const originalColumn = aArgs.column || 0;\n\n source = this._findSourceIndex(source);\n if (source < 0) {\n return [];\n }\n\n if (originalLine < 1) {\n throw new Error(\"Line numbers must be >= 1\");\n }\n\n if (originalColumn < 0) {\n throw new Error(\"Column numbers must be >= 0\");\n }\n\n const mappings = [];\n\n this._wasm.withMappingCallback(\n m => {\n let lastColumn = m.lastGeneratedColumn;\n if (this._computedColumnSpans && lastColumn === null) {\n lastColumn = Infinity;\n }\n mappings.push({\n line: m.generatedLine,\n column: m.generatedColumn,\n lastColumn,\n });\n }, () => {\n this._wasm.exports.all_generated_locations_for(\n this._getMappingsPtr(),\n source,\n originalLine - 1,\n \"column\" in aArgs,\n originalColumn\n );\n }\n );\n\n return mappings;\n }\n\n destroy() {\n if (this._mappingsPtr !== 0) {\n this._wasm.exports.free_mappings(this._mappingsPtr);\n this._mappingsPtr = 0;\n }\n }\n\n /**\n * Compute the last column for each generated mapping. The last column is\n * inclusive.\n */\n computeColumnSpans() {\n if (this._computedColumnSpans) {\n return;\n }\n\n this._wasm.exports.compute_column_spans(this._getMappingsPtr());\n this._computedColumnSpans = true;\n }\n\n /**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source. The line number\n * is 1-based.\n * - column: The column number in the generated source. The column\n * number is 0-based.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null. The\n * line number is 1-based.\n * - column: The column number in the original source, or null. The\n * column number is 0-based.\n * - name: The original identifier, or null.\n */\n originalPositionFor(aArgs) {\n const needle = {\n generatedLine: util.getArg(aArgs, \"line\"),\n generatedColumn: util.getArg(aArgs, \"column\")\n };\n\n if (needle.generatedLine < 1) {\n throw new Error(\"Line numbers must be >= 1\");\n }\n\n if (needle.generatedColumn < 0) {\n throw new Error(\"Column numbers must be >= 0\");\n }\n\n let bias = util.getArg(aArgs, \"bias\", SourceMapConsumer.GREATEST_LOWER_BOUND);\n if (bias == null) {\n bias = SourceMapConsumer.GREATEST_LOWER_BOUND;\n }\n\n let mapping;\n this._wasm.withMappingCallback(m => mapping = m, () => {\n this._wasm.exports.original_location_for(\n this._getMappingsPtr(),\n needle.generatedLine - 1,\n needle.generatedColumn,\n bias\n );\n });\n\n if (mapping) {\n if (mapping.generatedLine === needle.generatedLine) {\n let source = util.getArg(mapping, \"source\", null);\n if (source !== null) {\n source = this._sources.at(source);\n source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);\n }\n\n let name = util.getArg(mapping, \"name\", null);\n if (name !== null) {\n name = this._names.at(name);\n }\n\n return {\n source,\n line: util.getArg(mapping, \"originalLine\", null),\n column: util.getArg(mapping, \"originalColumn\", null),\n name\n };\n }\n }\n\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n }\n\n /**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\n hasContentsOfAllSources() {\n if (!this.sourcesContent) {\n return false;\n }\n return this.sourcesContent.length >= this._sources.size() &&\n !this.sourcesContent.some(function(sc) { return sc == null; });\n }\n\n /**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\n sourceContentFor(aSource, nullOnMissing) {\n if (!this.sourcesContent) {\n return null;\n }\n\n const index = this._findSourceIndex(aSource);\n if (index >= 0) {\n return this.sourcesContent[index];\n }\n\n let relativeSource = aSource;\n if (this.sourceRoot != null) {\n relativeSource = util.relative(this.sourceRoot, relativeSource);\n }\n\n let url;\n if (this.sourceRoot != null\n && (url = util.urlParse(this.sourceRoot))) {\n // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n // many users. We can help them out when they expect file:// URIs to\n // behave like it would if they were running a local HTTP server. See\n // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n const fileUriAbsPath = relativeSource.replace(/^file:\\/\\//, \"\");\n if (url.scheme == \"file\"\n && this._sources.has(fileUriAbsPath)) {\n return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)];\n }\n\n if ((!url.path || url.path == \"/\")\n && this._sources.has(\"/\" + relativeSource)) {\n return this.sourcesContent[this._sources.indexOf(\"/\" + relativeSource)];\n }\n }\n\n // This function is used recursively from\n // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n // don't want to throw if we can't find the source - we just want to\n // return null, so we provide a flag to exit gracefully.\n if (nullOnMissing) {\n return null;\n }\n\n throw new Error('\"' + relativeSource + '\" is not in the SourceMap.');\n }\n\n /**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source. The line number\n * is 1-based.\n * - column: The column number in the original source. The column\n * number is 0-based.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null. The\n * line number is 1-based.\n * - column: The column number in the generated source, or null.\n * The column number is 0-based.\n */\n generatedPositionFor(aArgs) {\n let source = util.getArg(aArgs, \"source\");\n source = this._findSourceIndex(source);\n if (source < 0) {\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n }\n\n const needle = {\n source,\n originalLine: util.getArg(aArgs, \"line\"),\n originalColumn: util.getArg(aArgs, \"column\")\n };\n\n if (needle.originalLine < 1) {\n throw new Error(\"Line numbers must be >= 1\");\n }\n\n if (needle.originalColumn < 0) {\n throw new Error(\"Column numbers must be >= 0\");\n }\n\n let bias = util.getArg(aArgs, \"bias\", SourceMapConsumer.GREATEST_LOWER_BOUND);\n if (bias == null) {\n bias = SourceMapConsumer.GREATEST_LOWER_BOUND;\n }\n\n let mapping;\n this._wasm.withMappingCallback(m => mapping = m, () => {\n this._wasm.exports.generated_location_for(\n this._getMappingsPtr(),\n needle.source,\n needle.originalLine - 1,\n needle.originalColumn,\n bias\n );\n });\n\n if (mapping) {\n if (mapping.source === needle.source) {\n let lastColumn = mapping.lastGeneratedColumn;\n if (this._computedColumnSpans && lastColumn === null) {\n lastColumn = Infinity;\n }\n return {\n line: util.getArg(mapping, \"generatedLine\", null),\n column: util.getArg(mapping, \"generatedColumn\", null),\n lastColumn,\n };\n }\n }\n\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n }\n}\n\nBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\nexports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\n/**\n * An IndexedSourceMapConsumer instance represents a parsed source map which\n * we can query for information. It differs from BasicSourceMapConsumer in\n * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n * input.\n *\n * The first parameter is a raw source map (either as a JSON string, or already\n * parsed to an object). According to the spec for indexed source maps, they\n * have the following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - file: Optional. The generated file this source map is associated with.\n * - sections: A list of section definitions.\n *\n * Each value under the \"sections\" field has two fields:\n * - offset: The offset into the original specified at which this section\n * begins to apply, defined as an object with a \"line\" and \"column\"\n * field.\n * - map: A source map definition. This source map could also be indexed,\n * but doesn't have to be.\n *\n * Instead of the \"map\" field, it's also possible to have a \"url\" field\n * specifying a URL to retrieve a source map from, but that's currently\n * unsupported.\n *\n * Here's an example source map, taken from the source map spec[0], but\n * modified to omit a section which uses the \"url\" field.\n *\n * {\n * version : 3,\n * file: \"app.js\",\n * sections: [{\n * offset: {line:100, column:10},\n * map: {\n * version : 3,\n * file: \"section.js\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AAAA,E;;ABCDE;\"\n * }\n * }],\n * }\n *\n * The second parameter, if given, is a string whose value is the URL\n * at which the source map was found. This URL is used to compute the\n * sources array.\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n */\nclass IndexedSourceMapConsumer extends SourceMapConsumer {\n constructor(aSourceMap, aSourceMapURL) {\n return super(INTERNAL).then(that => {\n let sourceMap = aSourceMap;\n if (typeof aSourceMap === \"string\") {\n sourceMap = util.parseSourceMapInput(aSourceMap);\n }\n\n const version = util.getArg(sourceMap, \"version\");\n const sections = util.getArg(sourceMap, \"sections\");\n\n if (version != that._version) {\n throw new Error(\"Unsupported version: \" + version);\n }\n\n that._sources = new ArraySet();\n that._names = new ArraySet();\n that.__generatedMappings = null;\n that.__originalMappings = null;\n that.__generatedMappingsUnsorted = null;\n that.__originalMappingsUnsorted = null;\n\n let lastOffset = {\n line: -1,\n column: 0\n };\n return Promise.all(sections.map(s => {\n if (s.url) {\n // The url field will require support for asynchronicity.\n // See https://github.com/mozilla/source-map/issues/16\n throw new Error(\"Support for url field in sections not implemented.\");\n }\n const offset = util.getArg(s, \"offset\");\n const offsetLine = util.getArg(offset, \"line\");\n const offsetColumn = util.getArg(offset, \"column\");\n\n if (offsetLine < lastOffset.line ||\n (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n throw new Error(\"Section offsets must be ordered and non-overlapping.\");\n }\n lastOffset = offset;\n\n const cons = new SourceMapConsumer(util.getArg(s, \"map\"), aSourceMapURL);\n return cons.then(consumer => {\n return {\n generatedOffset: {\n // The offset fields are 0-based, but we use 1-based indices when\n // encoding/decoding from VLQ.\n generatedLine: offsetLine + 1,\n generatedColumn: offsetColumn + 1\n },\n consumer\n };\n });\n })).then(s => {\n that._sections = s;\n return that;\n });\n });\n }\n\n // `__generatedMappings` and `__originalMappings` are arrays that hold the\n // parsed mapping coordinates from the source map's \"mappings\" attribute. They\n // are lazily instantiated, accessed via the `_generatedMappings` and\n // `_originalMappings` getters respectively, and we only parse the mappings\n // and create these arrays once queried for a source location. We jump through\n // these hoops because there can be many thousands of mappings, and parsing\n // them is expensive, so we only want to do it if we must.\n //\n // Each object in the arrays is of the form:\n //\n // {\n // generatedLine: The line number in the generated code,\n // generatedColumn: The column number in the generated code,\n // source: The path to the original source file that generated this\n // chunk of code,\n // originalLine: The line number in the original source that\n // corresponds to this chunk of generated code,\n // originalColumn: The column number in the original source that\n // corresponds to this chunk of generated code,\n // name: The name of the original symbol which generated this chunk of\n // code.\n // }\n //\n // All properties except for `generatedLine` and `generatedColumn` can be\n // `null`.\n //\n // `_generatedMappings` is ordered by the generated positions.\n //\n // `_originalMappings` is ordered by the original positions.\n get _generatedMappings() {\n if (!this.__generatedMappings) {\n this._sortGeneratedMappings();\n }\n\n return this.__generatedMappings;\n }\n\n get _originalMappings() {\n if (!this.__originalMappings) {\n this._sortOriginalMappings();\n }\n\n return this.__originalMappings;\n }\n\n get _generatedMappingsUnsorted() {\n if (!this.__generatedMappingsUnsorted) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__generatedMappingsUnsorted;\n }\n\n get _originalMappingsUnsorted() {\n if (!this.__originalMappingsUnsorted) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__originalMappingsUnsorted;\n }\n\n _sortGeneratedMappings() {\n const mappings = this._generatedMappingsUnsorted;\n mappings.sort(util.compareByGeneratedPositionsDeflated);\n this.__generatedMappings = mappings;\n }\n\n _sortOriginalMappings() {\n const mappings = this._originalMappingsUnsorted;\n mappings.sort(util.compareByOriginalPositions);\n this.__originalMappings = mappings;\n }\n\n /**\n * The list of original sources.\n */\n get sources() {\n const sources = [];\n for (let i = 0; i < this._sections.length; i++) {\n for (let j = 0; j < this._sections[i].consumer.sources.length; j++) {\n sources.push(this._sections[i].consumer.sources[j]);\n }\n }\n return sources;\n }\n\n /**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source. The line number\n * is 1-based.\n * - column: The column number in the generated source. The column\n * number is 0-based.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null. The\n * line number is 1-based.\n * - column: The column number in the original source, or null. The\n * column number is 0-based.\n * - name: The original identifier, or null.\n */\n originalPositionFor(aArgs) {\n const needle = {\n generatedLine: util.getArg(aArgs, \"line\"),\n generatedColumn: util.getArg(aArgs, \"column\")\n };\n\n // Find the section containing the generated position we're trying to map\n // to an original position.\n const sectionIndex = binarySearch.search(needle, this._sections,\n function(aNeedle, section) {\n const cmp = aNeedle.generatedLine - section.generatedOffset.generatedLine;\n if (cmp) {\n return cmp;\n }\n\n return (aNeedle.generatedColumn -\n section.generatedOffset.generatedColumn);\n });\n const section = this._sections[sectionIndex];\n\n if (!section) {\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n }\n\n return section.consumer.originalPositionFor({\n line: needle.generatedLine -\n (section.generatedOffset.generatedLine - 1),\n column: needle.generatedColumn -\n (section.generatedOffset.generatedLine === needle.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n bias: aArgs.bias\n });\n }\n\n /**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\n hasContentsOfAllSources() {\n return this._sections.every(function(s) {\n return s.consumer.hasContentsOfAllSources();\n });\n }\n\n /**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\n sourceContentFor(aSource, nullOnMissing) {\n for (let i = 0; i < this._sections.length; i++) {\n const section = this._sections[i];\n\n const content = section.consumer.sourceContentFor(aSource, true);\n if (content) {\n return content;\n }\n }\n if (nullOnMissing) {\n return null;\n }\n throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n }\n\n /**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source. The line number\n * is 1-based.\n * - column: The column number in the original source. The column\n * number is 0-based.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null. The\n * line number is 1-based.\n * - column: The column number in the generated source, or null.\n * The column number is 0-based.\n */\n generatedPositionFor(aArgs) {\n for (let i = 0; i < this._sections.length; i++) {\n const section = this._sections[i];\n\n // Only consider this section if the requested source is in the list of\n // sources of the consumer.\n if (section.consumer._findSourceIndex(util.getArg(aArgs, \"source\")) === -1) {\n continue;\n }\n const generatedPosition = section.consumer.generatedPositionFor(aArgs);\n if (generatedPosition) {\n const ret = {\n line: generatedPosition.line +\n (section.generatedOffset.generatedLine - 1),\n column: generatedPosition.column +\n (section.generatedOffset.generatedLine === generatedPosition.line\n ? section.generatedOffset.generatedColumn - 1\n : 0)\n };\n return ret;\n }\n }\n\n return {\n line: null,\n column: null\n };\n }\n\n /**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\n _parseMappings(aStr, aSourceRoot) {\n const generatedMappings = this.__generatedMappingsUnsorted = [];\n const originalMappings = this.__originalMappingsUnsorted = [];\n for (let i = 0; i < this._sections.length; i++) {\n const section = this._sections[i];\n\n const sectionMappings = [];\n section.consumer.eachMapping(m => sectionMappings.push(m));\n\n for (let j = 0; j < sectionMappings.length; j++) {\n const mapping = sectionMappings[j];\n\n // TODO: test if null is correct here. The original code used\n // `source`, which would actually have gotten used as null because\n // var's get hoisted.\n // See: https://github.com/mozilla/source-map/issues/333\n let source = util.computeSourceURL(section.consumer.sourceRoot, null, this._sourceMapURL);\n this._sources.add(source);\n source = this._sources.indexOf(source);\n\n let name = null;\n if (mapping.name) {\n this._names.add(mapping.name);\n name = this._names.indexOf(mapping.name);\n }\n\n // The mappings coming from the consumer for the section have\n // generated positions relative to the start of the section, so we\n // need to offset them to be relative to the start of the concatenated\n // generated file.\n const adjustedMapping = {\n source,\n generatedLine: mapping.generatedLine +\n (section.generatedOffset.generatedLine - 1),\n generatedColumn: mapping.generatedColumn +\n (section.generatedOffset.generatedLine === mapping.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name\n };\n\n generatedMappings.push(adjustedMapping);\n if (typeof adjustedMapping.originalLine === \"number\") {\n originalMappings.push(adjustedMapping);\n }\n }\n }\n }\n\n eachMapping(aCallback, aContext, aOrder) {\n const context = aContext || null;\n const order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\n let mappings;\n switch (order) {\n case SourceMapConsumer.GENERATED_ORDER:\n mappings = this._generatedMappings;\n break;\n case SourceMapConsumer.ORIGINAL_ORDER:\n mappings = this._originalMappings;\n break;\n default:\n throw new Error(\"Unknown order of iteration.\");\n }\n\n const sourceRoot = this.sourceRoot;\n mappings.map(function(mapping) {\n let source = null;\n if (mapping.source !== null) {\n source = this._sources.at(mapping.source);\n source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);\n }\n return {\n source,\n generatedLine: mapping.generatedLine,\n generatedColumn: mapping.generatedColumn,\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: mapping.name === null ? null : this._names.at(mapping.name)\n };\n }, this).forEach(aCallback, context);\n }\n\n /**\n * Find the mapping that best matches the hypothetical \"needle\" mapping that\n * we are searching for in the given \"haystack\" of mappings.\n */\n _findMapping(aNeedle, aMappings, aLineName,\n aColumnName, aComparator, aBias) {\n // To return the position we are searching for, we must first find the\n // mapping for the given position and then return the opposite position it\n // points to. Because the mappings are sorted, we can use binary search to\n // find the best mapping.\n\n if (aNeedle[aLineName] <= 0) {\n throw new TypeError(\"Line must be greater than or equal to 1, got \"\n + aNeedle[aLineName]);\n }\n if (aNeedle[aColumnName] < 0) {\n throw new TypeError(\"Column must be greater than or equal to 0, got \"\n + aNeedle[aColumnName]);\n }\n\n return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n }\n\n allGeneratedPositionsFor(aArgs) {\n const line = util.getArg(aArgs, \"line\");\n\n // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n // returns the index of the closest mapping less than the needle. By\n // setting needle.originalColumn to 0, we thus find the last mapping for\n // the given line, provided such a mapping exists.\n const needle = {\n source: util.getArg(aArgs, \"source\"),\n originalLine: line,\n originalColumn: util.getArg(aArgs, \"column\", 0)\n };\n\n needle.source = this._findSourceIndex(needle.source);\n if (needle.source < 0) {\n return [];\n }\n\n if (needle.originalLine < 1) {\n throw new Error(\"Line numbers must be >= 1\");\n }\n\n if (needle.originalColumn < 0) {\n throw new Error(\"Column numbers must be >= 0\");\n }\n\n const mappings = [];\n\n let index = this._findMapping(needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions,\n binarySearch.LEAST_UPPER_BOUND);\n if (index >= 0) {\n let mapping = this._originalMappings[index];\n\n if (aArgs.column === undefined) {\n const originalLine = mapping.originalLine;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we found. Since\n // mappings are sorted, this is guaranteed to find all mappings for\n // the line we found.\n while (mapping && mapping.originalLine === originalLine) {\n let lastColumn = mapping.lastGeneratedColumn;\n if (this._computedColumnSpans && lastColumn === null) {\n lastColumn = Infinity;\n }\n mappings.push({\n line: util.getArg(mapping, \"generatedLine\", null),\n column: util.getArg(mapping, \"generatedColumn\", null),\n lastColumn,\n });\n\n mapping = this._originalMappings[++index];\n }\n } else {\n const originalColumn = mapping.originalColumn;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we were searching for.\n // Since mappings are sorted, this is guaranteed to find all mappings for\n // the line we are searching for.\n while (mapping &&\n mapping.originalLine === line &&\n mapping.originalColumn == originalColumn) {\n let lastColumn = mapping.lastGeneratedColumn;\n if (this._computedColumnSpans && lastColumn === null) {\n lastColumn = Infinity;\n }\n mappings.push({\n line: util.getArg(mapping, \"generatedLine\", null),\n column: util.getArg(mapping, \"generatedColumn\", null),\n lastColumn,\n });\n\n mapping = this._originalMappings[++index];\n }\n }\n }\n\n return mappings;\n }\n\n destroy() {\n for (let i = 0; i < this._sections.length; i++) {\n this._sections[i].consumer.destroy();\n }\n }\n}\nexports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n\n/*\n * Cheat to get around inter-twingled classes. `factory()` can be at the end\n * where it has access to non-hoisted classes, but it gets hoisted itself.\n */\nfunction _factory(aSourceMap, aSourceMapURL) {\n let sourceMap = aSourceMap;\n if (typeof aSourceMap === \"string\") {\n sourceMap = util.parseSourceMapInput(aSourceMap);\n }\n\n const consumer = sourceMap.sections != null\n ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)\n : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);\n return Promise.resolve(consumer);\n}\n\nfunction _factoryBSM(aSourceMap, aSourceMapURL) {\n return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);\n}\n", "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nconst SourceMapGenerator = require(\"./source-map-generator\").SourceMapGenerator;\nconst util = require(\"./util\");\n\n// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n// operating systems these days (capturing the result).\nconst REGEX_NEWLINE = /(\\r?\\n)/;\n\n// Newline character code for charCodeAt() comparisons\nconst NEWLINE_CODE = 10;\n\n// Private symbol for identifying `SourceNode`s when multiple versions of\n// the source-map library are loaded. This MUST NOT CHANGE across\n// versions!\nconst isSourceNode = \"$$$isSourceNode$$$\";\n\n/**\n * SourceNodes provide a way to abstract over interpolating/concatenating\n * snippets of generated JavaScript source code while maintaining the line and\n * column information associated with the original source code.\n *\n * @param aLine The original line number.\n * @param aColumn The original column number.\n * @param aSource The original source's filename.\n * @param aChunks Optional. An array of strings which are snippets of\n * generated JS, or other SourceNodes.\n * @param aName The original identifier.\n */\nclass SourceNode {\n constructor(aLine, aColumn, aSource, aChunks, aName) {\n this.children = [];\n this.sourceContents = {};\n this.line = aLine == null ? null : aLine;\n this.column = aColumn == null ? null : aColumn;\n this.source = aSource == null ? null : aSource;\n this.name = aName == null ? null : aName;\n this[isSourceNode] = true;\n if (aChunks != null) this.add(aChunks);\n }\n\n /**\n * Creates a SourceNode from generated code and a SourceMapConsumer.\n *\n * @param aGeneratedCode The generated code\n * @param aSourceMapConsumer The SourceMap for the generated code\n * @param aRelativePath Optional. The path that relative sources in the\n * SourceMapConsumer should be relative to.\n */\n static fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n // The SourceNode we want to fill with the generated code\n // and the SourceMap\n const node = new SourceNode();\n\n // All even indices of this array are one line of the generated code,\n // while all odd indices are the newlines between two adjacent lines\n // (since `REGEX_NEWLINE` captures its match).\n // Processed fragments are accessed by calling `shiftNextLine`.\n const remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n let remainingLinesIndex = 0;\n const shiftNextLine = function() {\n const lineContents = getNextLine();\n // The last line of a file might not have a newline.\n const newLine = getNextLine() || \"\";\n return lineContents + newLine;\n\n function getNextLine() {\n return remainingLinesIndex < remainingLines.length ?\n remainingLines[remainingLinesIndex++] : undefined;\n }\n };\n\n // We need to remember the position of \"remainingLines\"\n let lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\n // The generate SourceNodes we need a code range.\n // To extract it current and last mapping is used.\n // Here we store the last mapping.\n let lastMapping = null;\n let nextLine;\n\n aSourceMapConsumer.eachMapping(function(mapping) {\n if (lastMapping !== null) {\n // We add the code from \"lastMapping\" to \"mapping\":\n // First check if there is a new line in between.\n if (lastGeneratedLine < mapping.generatedLine) {\n // Associate first line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n lastGeneratedLine++;\n lastGeneratedColumn = 0;\n // The remaining code is added without mapping\n } else {\n // There is no new line in between.\n // Associate the code between \"lastGeneratedColumn\" and\n // \"mapping.generatedColumn\" with \"lastMapping\"\n nextLine = remainingLines[remainingLinesIndex] || \"\";\n const code = nextLine.substr(0, mapping.generatedColumn -\n lastGeneratedColumn);\n remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\n lastGeneratedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n addMappingWithCode(lastMapping, code);\n // No more remaining code, continue\n lastMapping = mapping;\n return;\n }\n }\n // We add the generated code until the first mapping\n // to the SourceNode without any mapping.\n // Each line is added as separate string.\n while (lastGeneratedLine < mapping.generatedLine) {\n node.add(shiftNextLine());\n lastGeneratedLine++;\n }\n if (lastGeneratedColumn < mapping.generatedColumn) {\n nextLine = remainingLines[remainingLinesIndex] || \"\";\n node.add(nextLine.substr(0, mapping.generatedColumn));\n remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n }\n lastMapping = mapping;\n }, this);\n // We have processed all mappings.\n if (remainingLinesIndex < remainingLines.length) {\n if (lastMapping) {\n // Associate the remaining code in the current line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n }\n // and add the remaining lines without any mapping\n node.add(remainingLines.splice(remainingLinesIndex).join(\"\"));\n }\n\n // Copy sourcesContent into SourceNode\n aSourceMapConsumer.sources.forEach(function(sourceFile) {\n const content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aRelativePath != null) {\n sourceFile = util.join(aRelativePath, sourceFile);\n }\n node.setSourceContent(sourceFile, content);\n }\n });\n\n return node;\n\n function addMappingWithCode(mapping, code) {\n if (mapping === null || mapping.source === undefined) {\n node.add(code);\n } else {\n const source = aRelativePath\n ? util.join(aRelativePath, mapping.source)\n : mapping.source;\n node.add(new SourceNode(mapping.originalLine,\n mapping.originalColumn,\n source,\n code,\n mapping.name));\n }\n }\n }\n\n /**\n * Add a chunk of generated JS to this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\n add(aChunk) {\n if (Array.isArray(aChunk)) {\n aChunk.forEach(function(chunk) {\n this.add(chunk);\n }, this);\n } else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n if (aChunk) {\n this.children.push(aChunk);\n }\n } else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n }\n\n /**\n * Add a chunk of generated JS to the beginning of this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\n prepend(aChunk) {\n if (Array.isArray(aChunk)) {\n for (let i = aChunk.length - 1; i >= 0; i--) {\n this.prepend(aChunk[i]);\n }\n } else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n this.children.unshift(aChunk);\n } else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n }\n\n /**\n * Walk over the tree of JS snippets in this node and its children. The\n * walking function is called once for each snippet of JS and is passed that\n * snippet and the its original associated source's line/column location.\n *\n * @param aFn The traversal function.\n */\n walk(aFn) {\n let chunk;\n for (let i = 0, len = this.children.length; i < len; i++) {\n chunk = this.children[i];\n if (chunk[isSourceNode]) {\n chunk.walk(aFn);\n } else if (chunk !== \"\") {\n aFn(chunk, { source: this.source,\n line: this.line,\n column: this.column,\n name: this.name });\n }\n }\n }\n\n /**\n * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n * each of `this.children`.\n *\n * @param aSep The separator.\n */\n join(aSep) {\n let newChildren;\n let i;\n const len = this.children.length;\n if (len > 0) {\n newChildren = [];\n for (i = 0; i < len - 1; i++) {\n newChildren.push(this.children[i]);\n newChildren.push(aSep);\n }\n newChildren.push(this.children[i]);\n this.children = newChildren;\n }\n return this;\n }\n\n /**\n * Call String.prototype.replace on the very right-most source snippet. Useful\n * for trimming whitespace from the end of a source node, etc.\n *\n * @param aPattern The pattern to replace.\n * @param aReplacement The thing to replace the pattern with.\n */\n replaceRight(aPattern, aReplacement) {\n const lastChild = this.children[this.children.length - 1];\n if (lastChild[isSourceNode]) {\n lastChild.replaceRight(aPattern, aReplacement);\n } else if (typeof lastChild === \"string\") {\n this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n } else {\n this.children.push(\"\".replace(aPattern, aReplacement));\n }\n return this;\n }\n\n /**\n * Set the source content for a source file. This will be added to the SourceMapGenerator\n * in the sourcesContent field.\n *\n * @param aSourceFile The filename of the source file\n * @param aSourceContent The content of the source file\n */\n setSourceContent(aSourceFile, aSourceContent) {\n this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n }\n\n /**\n * Walk over the tree of SourceNodes. The walking function is called for each\n * source file content and is passed the filename and source content.\n *\n * @param aFn The traversal function.\n */\n walkSourceContents(aFn) {\n for (let i = 0, len = this.children.length; i < len; i++) {\n if (this.children[i][isSourceNode]) {\n this.children[i].walkSourceContents(aFn);\n }\n }\n\n const sources = Object.keys(this.sourceContents);\n for (let i = 0, len = sources.length; i < len; i++) {\n aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n }\n }\n\n /**\n * Return the string representation of this source node. Walks over the tree\n * and concatenates all the various snippets together to one string.\n */\n toString() {\n let str = \"\";\n this.walk(function(chunk) {\n str += chunk;\n });\n return str;\n }\n\n /**\n * Returns the string representation of this source node along with a source\n * map.\n */\n toStringWithSourceMap(aArgs) {\n const generated = {\n code: \"\",\n line: 1,\n column: 0\n };\n const map = new SourceMapGenerator(aArgs);\n let sourceMappingActive = false;\n let lastOriginalSource = null;\n let lastOriginalLine = null;\n let lastOriginalColumn = null;\n let lastOriginalName = null;\n this.walk(function(chunk, original) {\n generated.code += chunk;\n if (original.source !== null\n && original.line !== null\n && original.column !== null) {\n if (lastOriginalSource !== original.source\n || lastOriginalLine !== original.line\n || lastOriginalColumn !== original.column\n || lastOriginalName !== original.name) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n lastOriginalSource = original.source;\n lastOriginalLine = original.line;\n lastOriginalColumn = original.column;\n lastOriginalName = original.name;\n sourceMappingActive = true;\n } else if (sourceMappingActive) {\n map.addMapping({\n generated: {\n line: generated.line,\n column: generated.column\n }\n });\n lastOriginalSource = null;\n sourceMappingActive = false;\n }\n for (let idx = 0, length = chunk.length; idx < length; idx++) {\n if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n generated.line++;\n generated.column = 0;\n // Mappings end at eol\n if (idx + 1 === length) {\n lastOriginalSource = null;\n sourceMappingActive = false;\n } else if (sourceMappingActive) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n } else {\n generated.column++;\n }\n }\n });\n this.walkSourceContents(function(sourceFile, sourceContent) {\n map.setSourceContent(sourceFile, sourceContent);\n });\n\n return { code: generated.code, map };\n }\n}\n\nexports.SourceNode = SourceNode;\n", "/*\n * Copyright 2009-2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE.txt or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nexports.SourceMapGenerator = require(\"./lib/source-map-generator\").SourceMapGenerator;\nexports.SourceMapConsumer = require(\"./lib/source-map-consumer\").SourceMapConsumer;\nexports.SourceNode = require(\"./lib/source-node\").SourceNode;\n", "/*!\n * Stylus - SourceMapper\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Compiler = require('./compiler')\n , Buffer = require('buffer').Buffer\n , SourceMapGenerator = require('source-map').SourceMapGenerator\n , basename = require('path').basename\n , extname = require('path').extname\n , dirname = require('path').dirname\n , join = require('path').join\n , relative = require('path').relative\n , sep = require('path').sep\n , fs = require('fs');\n\n/**\n * Initialize a new `SourceMapper` generator with the given `root` Node\n * and the following `options`.\n *\n * @param {Node} root\n * @api public\n */\n\nvar SourceMapper = module.exports = function SourceMapper(root, options){\n options = options || {};\n this.column = 1;\n this.lineno = 1;\n this.contents = {};\n this.filename = options.filename;\n this.dest = options.dest;\n\n var sourcemap = options.sourcemap;\n this.basePath = sourcemap.basePath || '.';\n this.inline = sourcemap.inline;\n this.comment = sourcemap.comment;\n if (this.dest && extname(this.dest) === '.css') {\n this.basename = basename(this.dest);\n this.dest = dirname(this.dest);\n } else {\n this.basename = basename(this.filename, extname(this.filename)) + '.css';\n }\n this.utf8 = false;\n\n this.map = new SourceMapGenerator({\n file: this.basename,\n sourceRoot: sourcemap.sourceRoot || null\n });\n Compiler.call(this, root, options);\n};\n\n/**\n * Inherit from `Compiler.prototype`.\n */\n\nSourceMapper.prototype.__proto__ = Compiler.prototype;\n\n/**\n * Generate and write source map.\n *\n * @return {String}\n * @api private\n */\n\nvar compile = Compiler.prototype.compile;\nSourceMapper.prototype.compile = function(){\n var css = compile.call(this)\n , out = this.basename + '.map'\n , url = this.normalizePath(this.dest\n ? join(this.dest, out)\n : join(dirname(this.filename), out))\n , map;\n\n if (this.inline) {\n map = this.map.toString();\n url = 'data:application/json;'\n + (this.utf8 ? 'charset=utf-8;' : '') + 'base64,'\n + Buffer.from(map).toString('base64');\n }\n if (this.inline || false !== this.comment)\n css += '/*# sourceMappingURL=' + url + ' */';\n return css;\n};\n\n/**\n * Add mapping information.\n *\n * @param {String} str\n * @param {Node} node\n * @return {String}\n * @api private\n */\n\nSourceMapper.prototype.out = function(str, node){\n if (node && node.lineno) {\n var filename = this.normalizePath(node.filename);\n\n this.map.addMapping({\n original: {\n line: node.lineno,\n column: node.column - 1\n },\n generated: {\n line: this.lineno,\n column: this.column - 1\n },\n source: filename\n });\n\n if (this.inline && !this.contents[filename]) {\n this.map.setSourceContent(filename, fs.readFileSync(node.filename, 'utf-8'));\n this.contents[filename] = true;\n }\n }\n\n this.move(str);\n return str;\n};\n\n/**\n * Move current line and column position.\n *\n * @param {String} str\n * @api private\n */\n\nSourceMapper.prototype.move = function(str){\n var lines = str.match(/\\n/g)\n , idx = str.lastIndexOf('\\n');\n\n if (lines) this.lineno += lines.length;\n this.column = ~idx\n ? str.length - idx\n : this.column + str.length;\n};\n\n/**\n * Normalize the given `path`.\n *\n * @param {String} path\n * @return {String}\n * @api private\n */\n\nSourceMapper.prototype.normalizePath = function(path){\n path = relative(this.dest || this.basePath, path);\n if ('\\\\' == sep) {\n path = path.replace(/^[a-z]:\\\\/i, '/')\n .replace(/\\\\/g, '/');\n }\n return path;\n};\n\n/**\n * Visit Literal.\n */\n\nvar literal = Compiler.prototype.visitLiteral;\nSourceMapper.prototype.visitLiteral = function(lit){\n var val = literal.call(this, lit)\n , filename = this.normalizePath(lit.filename)\n , indentsRe = /^\\s+/\n , lines = val.split('\\n');\n\n // add mappings for multiline literals\n if (lines.length > 1) {\n lines.forEach(function(line, i) {\n var indents = line.match(indentsRe)\n , column = indents && indents[0]\n ? indents[0].length\n : 0;\n\n if (lit.css) column += 2;\n\n this.map.addMapping({\n original: {\n line: lit.lineno + i,\n column: column\n },\n generated: {\n line: this.lineno + i,\n column: 0\n },\n source: filename\n });\n }, this);\n }\n return val;\n};\n\n/**\n * Visit Charset.\n */\n\nvar charset = Compiler.prototype.visitCharset;\nSourceMapper.prototype.visitCharset = function(node){\n this.utf8 = ('utf-8' == node.val.string.toLowerCase());\n return charset.call(this, node);\n};\n", "\n/**\n * Module dependencies.\n */\n\nvar Visitor = require('./')\n , Parser = require('../parser')\n , nodes = require('../nodes')\n , utils = require('../utils')\n , dirname = require('path').dirname\n , fs = require('fs');\n\n/**\n * Initialize a new `DepsResolver` with the given `root` Node\n * and the `options`.\n *\n * @param {Node} root\n * @param {Object} options\n * @api private\n */\n\nvar DepsResolver = module.exports = function DepsResolver(root, options) {\n this.root = root;\n this.filename = options.filename;\n this.paths = options.paths || [];\n this.paths.push(dirname(options.filename || '.'));\n this.options = options;\n this.functions = {};\n this.deps = [];\n};\n\n/**\n * Inherit from `Visitor.prototype`.\n */\n\nDepsResolver.prototype.__proto__ = Visitor.prototype;\n\nvar visit = DepsResolver.prototype.visit;\n\nDepsResolver.prototype.visit = function(node) {\n switch (node.nodeName) {\n case 'root':\n case 'block':\n case 'expression':\n this.visitRoot(node);\n break;\n case 'group':\n case 'media':\n case 'atblock':\n case 'atrule':\n case 'keyframes':\n case 'each':\n case 'supports':\n this.visit(node.block);\n break;\n default:\n visit.call(this, node);\n }\n};\n\n/**\n * Visit Root.\n */\n\nDepsResolver.prototype.visitRoot = function(block) {\n for (var i = 0, len = block.nodes.length; i < len; ++i) {\n this.visit(block.nodes[i]);\n }\n};\n\n/**\n * Visit Ident.\n */\n\nDepsResolver.prototype.visitIdent = function(ident) {\n this.visit(ident.val);\n};\n\n/**\n * Visit If.\n */\n\nDepsResolver.prototype.visitIf = function(node) {\n this.visit(node.block);\n this.visit(node.cond);\n for (var i = 0, len = node.elses.length; i < len; ++i) {\n this.visit(node.elses[i]);\n }\n};\n\n/**\n * Visit Function.\n */\n\nDepsResolver.prototype.visitFunction = function(fn) {\n this.functions[fn.name] = fn.block;\n};\n\n/**\n * Visit Call.\n */\n\nDepsResolver.prototype.visitCall = function(call) {\n if (call.name in this.functions) this.visit(this.functions[call.name]);\n if (call.block) this.visit(call.block);\n};\n\n/**\n * Visit Import.\n */\n\nDepsResolver.prototype.visitImport = function(node) {\n // If it's a url() call, skip\n if (node.path.first.name === 'url') return;\n\n var path = !node.path.first.val.isNull && node.path.first.val || node.path.first.name\n , literal, found, oldPath;\n\n if (!path) return;\n\n literal = /\\.css(?:\"|$)/.test(path);\n\n // support optional .styl\n if (!literal && !/\\.styl$/i.test(path)) {\n oldPath = path;\n path += '.styl';\n }\n\n // Lookup\n found = utils.find(path, this.paths, this.filename);\n\n // support optional index\n if (!found && oldPath) found = utils.lookupIndex(oldPath, this.paths, this.filename);\n\n if (!found) return;\n\n this.deps = this.deps.concat(found);\n\n if (literal) return;\n\n // nested imports\n for (var i = 0, len = found.length; i < len; ++i) {\n var file = found[i]\n , dir = dirname(file)\n , str = fs.readFileSync(file, 'utf-8')\n , block = new nodes.Block\n , parser = new Parser(str, utils.merge({ root: block }, this.options));\n\n if (!~this.paths.indexOf(dir)) this.paths.push(dir);\n\n try {\n block = parser.parse();\n } catch (err) {\n err.filename = file;\n err.lineno = parser.lexer.lineno;\n err.column = parser.lexer.column;\n err.input = str;\n throw err;\n }\n\n this.visit(block);\n }\n};\n\n/**\n * Get dependencies.\n */\n\nDepsResolver.prototype.resolve = function() {\n this.visit(this.root);\n return utils.uniq(this.deps);\n};\n", "\n/*!\n * Stylus - Renderer\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Parser = require('./parser')\n , EventEmitter = require('events').EventEmitter\n , Evaluator = require('./visitor/evaluator')\n , Normalizer = require('./visitor/normalizer')\n , events = new EventEmitter\n , utils = require('./utils')\n , nodes = require('./nodes')\n , join = require('path').join;\n\n/**\n * Expose `Renderer`.\n */\n\nmodule.exports = Renderer;\n\n/**\n * Initialize a new `Renderer` with the given `str` and `options`.\n *\n * @param {String} str\n * @param {Object} options\n * @api public\n */\n\nfunction Renderer(str, options) {\n options = options || {};\n options.globals = options.globals || {};\n options.functions = options.functions || {};\n options.use = options.use || [];\n options.use = Array.isArray(options.use) ? options.use : [options.use];\n options.imports = [join(__dirname, 'functions/index.styl')].concat(options.imports || []);\n options.paths = options.paths || [];\n options.filename = options.filename || 'stylus';\n options.Evaluator = options.Evaluator || Evaluator;\n this.options = options;\n this.str = str;\n this.events = events;\n};\n\n/**\n * Inherit from `EventEmitter.prototype`.\n */\n\nRenderer.prototype.__proto__ = EventEmitter.prototype;\n\n/**\n * Expose events explicitly.\n */\n\nmodule.exports.events = events;\n\n/**\n * Parse and evaluate AST, then callback `fn(err, css, js)`.\n *\n * @param {Function} fn\n * @api public\n */\n\nRenderer.prototype.render = function(fn){\n var parser = this.parser = new Parser(this.str, this.options);\n\n // use plugin(s)\n for (var i = 0, len = this.options.use.length; i < len; i++) {\n this.use(this.options.use[i]);\n }\n\n try {\n nodes.filename = this.options.filename;\n // parse\n var ast = parser.parse();\n\n // evaluate\n this.evaluator = new this.options.Evaluator(ast, this.options);\n this.nodes = nodes;\n this.evaluator.renderer = this;\n ast = this.evaluator.evaluate();\n\n // normalize\n var normalizer = new Normalizer(ast, this.options);\n ast = normalizer.normalize();\n\n // compile\n var compiler = this.options.sourcemap\n ? new (require('./visitor/sourcemapper'))(ast, this.options)\n : new (require('./visitor/compiler'))(ast, this.options)\n , css = compiler.compile();\n\n // expose sourcemap\n if (this.options.sourcemap) this.sourcemap = compiler.map.toJSON();\n } catch (err) {\n var options = {};\n options.input = err.input || this.str;\n options.filename = err.filename || this.options.filename;\n options.lineno = err.lineno || parser.lexer.lineno;\n options.column = err.column || parser.lexer.column;\n if (!fn) throw utils.formatException(err, options);\n return fn(utils.formatException(err, options));\n }\n\n // fire `end` event\n var listeners = this.listeners('end');\n if (fn) listeners.push(fn);\n for (var i = 0, len = listeners.length; i < len; i++) {\n var ret = listeners[i](null, css);\n if (ret) css = ret;\n }\n if (!fn) return css;\n};\n\n/**\n * Get dependencies of the compiled file.\n *\n * @param {String} [filename]\n * @return {Array}\n * @api public\n */\n\nRenderer.prototype.deps = function(filename){\n var opts = utils.merge({ cache: false }, this.options);\n if (filename) opts.filename = filename;\n\n var DepsResolver = require('./visitor/deps-resolver')\n , parser = new Parser(this.str, opts);\n\n try {\n nodes.filename = opts.filename;\n // parse\n var ast = parser.parse()\n , resolver = new DepsResolver(ast, opts);\n\n // resolve dependencies\n return resolver.resolve();\n } catch (err) {\n var options = {};\n options.input = err.input || this.str;\n options.filename = err.filename || opts.filename;\n options.lineno = err.lineno || parser.lexer.lineno;\n options.column = err.column || parser.lexer.column;\n throw utils.formatException(err, options);\n }\n};\n\n/**\n * Set option `key` to `val`.\n *\n * @param {String} key\n * @param {Mixed} val\n * @return {Renderer} for chaining\n * @api public\n */\n\nRenderer.prototype.set = function(key, val){\n this.options[key] = val;\n return this;\n};\n\n/**\n * Get option `key`.\n *\n * @param {String} key\n * @return {Mixed} val\n * @api public\n */\n\nRenderer.prototype.get = function(key){\n return this.options[key];\n};\n\n/**\n * Include the given `path` to the lookup paths array.\n *\n * @param {String} path\n * @return {Renderer} for chaining\n * @api public\n */\n\nRenderer.prototype.include = function(path){\n this.options.paths.push(path);\n return this;\n};\n\n/**\n * Use the given `fn`.\n *\n * This allows for plugins to alter the renderer in\n * any way they wish, exposing paths etc.\n *\n * @param {Function}\n * @return {Renderer} for chaining\n * @api public\n */\n\nRenderer.prototype.use = function(fn){\n fn.call(this, this);\n return this;\n};\n\n/**\n * Define function or global var with the given `name`. Optionally\n * the function may accept full expressions, by setting `raw`\n * to `true`.\n *\n * @param {String} name\n * @param {Function|Node} fn\n * @return {Renderer} for chaining\n * @api public\n */\n\nRenderer.prototype.define = function(name, fn, raw){\n fn = utils.coerce(fn, raw);\n\n if (fn.nodeName) {\n this.options.globals[name] = fn;\n return this;\n }\n\n // function\n this.options.functions[name] = fn;\n if (undefined != raw) fn.raw = raw;\n return this;\n};\n\n/**\n * Import the given `file`.\n *\n * @param {String} file\n * @return {Renderer} for chaining\n * @api public\n */\n\nRenderer.prototype.import = function(file){\n this.options.imports.push(file);\n return this;\n};\n\n\n", "{\n \"name\": \"stylus\",\n \"description\": \"Robust, expressive, and feature-rich CSS superset\",\n \"version\": \"0.59.0\",\n \"author\": \"TJ Holowaychuk <tj@vision-media.ca>\",\n \"keywords\": [\n \"css\",\n \"parser\",\n \"style\",\n \"stylesheets\",\n \"jade\",\n \"language\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git://github.com/stylus/stylus\"\n },\n \"main\": \"./index.js\",\n \"browserify\": \"./lib/browserify.js\",\n \"engines\": {\n \"node\": \"*\"\n },\n \"bin\": {\n \"stylus\": \"./bin/stylus\"\n },\n \"scripts\": {\n \"prepublish\": \"npm prune\",\n \"test\": \"mocha test/ test/middleware/ --require chai --bail --check-leaks --reporter dot\"\n },\n \"dependencies\": {\n \"@adobe/css-tools\": \"^4.0.1\",\n \"debug\": \"^4.3.2\",\n \"glob\": \"^7.1.6\",\n \"sax\": \"~1.2.4\",\n \"source-map\": \"^0.7.3\"\n },\n \"devDependencies\": {\n \"chai\": \"^4.3.6\",\n \"mocha\": \"^9.2.0\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/stylus/stylus/issues\"\n },\n \"homepage\": \"https://github.com/stylus/stylus\",\n \"directories\": {\n \"doc\": \"docs\",\n \"example\": \"examples\",\n \"test\": \"test\"\n },\n \"license\": \"MIT\",\n \"funding\": \"https://opencollective.com/stylus\"\n}\n", "/*!\n * Stylus - middleware\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar stylus = require('./stylus')\n , fs = require('fs')\n , url = require('url')\n , dirname = require('path').dirname\n , join = require('path').join\n , sep = require('path').sep\n , debug = require('debug')('stylus:middleware')\n , mkdir = fs.mkdir;\n\n/**\n * Import map.\n */\n\nvar imports = {};\n\n/**\n * Return Connect middleware with the given `options`.\n *\n * Options:\n *\n * `force` Always re-compile\n * `src` Source directory used to find .styl files,\n * a string or function accepting `(path)` of request.\n * `dest` Destination directory used to output .css files,\n * a string or function accepting `(path)` of request,\n * when undefined defaults to `src`.\n * `compile` Custom compile function, accepting the arguments\n * `(str, path)`.\n * `compress` Whether the output .css files should be compressed\n * `firebug` Emits debug infos in the generated CSS that can\n * be used by the FireStylus Firebug plugin\n * `linenos` Emits comments in the generated CSS indicating\n * the corresponding Stylus line\n * 'sourcemap' Generates a sourcemap in sourcemaps v3 format\n *\n * Examples:\n *\n * Here we set up the custom compile function so that we may\n * set the `compress` option, or define additional functions.\n *\n * By default the compile function simply sets the `filename`\n * and renders the CSS.\n *\n * function compile(str, path) {\n * return stylus(str)\n * .set('filename', path)\n * .set('compress', true);\n * }\n *\n * Pass the middleware to Connect, grabbing .styl files from this directory\n * and saving .css files to _./public_. Also supplying our custom `compile` function.\n *\n * Following that we have a `static()` layer setup to serve the .css\n * files generated by Stylus.\n *\n * var app = connect();\n *\n * app.middleware({\n * src: __dirname\n * , dest: __dirname + '/public'\n * , compile: compile\n * })\n *\n * app.use(connect.static(__dirname + '/public'));\n *\n * @param {Object} options\n * @return {Function}\n * @api public\n */\n\nmodule.exports = function(options){\n options = options || {};\n\n // Accept src/dest dir\n if ('string' == typeof options) {\n options = { src: options };\n }\n\n // Force compilation\n var force = options.force;\n\n // Source dir required\n var src = options.src;\n if (!src) throw new Error('stylus.middleware() requires \"src\" directory');\n\n // Default dest dir to source\n var dest = options.dest || src;\n\n // Default compile callback\n options.compile = options.compile || function(str, path){\n // inline sourcemap\n if (options.sourcemap) {\n if ('boolean' == typeof options.sourcemap)\n options.sourcemap = {};\n options.sourcemap.inline = true;\n }\n\n return stylus(str)\n .set('filename', path)\n .set('compress', options.compress)\n .set('firebug', options.firebug)\n .set('linenos', options.linenos)\n .set('sourcemap', options.sourcemap);\n };\n\n // Middleware\n return function stylus(req, res, next){\n if ('GET' != req.method && 'HEAD' != req.method) return next();\n var path = url.parse(req.url).pathname;\n if (/\\.css$/.test(path)) {\n\n if (typeof dest == 'string') {\n // check for dest-path overlap\n var overlap = compare(dest, path).length;\n if ('/' == path.charAt(0)) overlap++;\n path = path.slice(overlap);\n }\n\n var cssPath, stylusPath;\n cssPath = (typeof dest == 'function')\n ? dest(path)\n : join(dest, path);\n stylusPath = (typeof src == 'function')\n ? src(path)\n : join(src, path.replace('.css', '.styl'));\n\n // Ignore ENOENT to fall through as 404\n function error(err) {\n next('ENOENT' == err.code\n ? null\n : err);\n }\n\n // Force\n if (force) return compile();\n\n // Compile to cssPath\n function compile() {\n debug('read %s', cssPath);\n fs.readFile(stylusPath, 'utf8', function(err, str){\n if (err) return error(err);\n var style = options.compile(str, stylusPath);\n var paths = style.options._imports = [];\n imports[stylusPath] = null;\n style.render(function(err, css){\n if (err) return next(err);\n debug('render %s', stylusPath);\n imports[stylusPath] = paths;\n mkdir(dirname(cssPath), { mode: parseInt('0700', 8), recursive: true }, function(err){\n if (err) return error(err);\n fs.writeFile(cssPath, css, 'utf8', next);\n });\n });\n });\n }\n\n // Re-compile on server restart, disregarding\n // mtimes since we need to map imports\n if (!imports[stylusPath]) return compile();\n\n // Compare mtimes\n fs.stat(stylusPath, function(err, stylusStats){\n if (err) return error(err);\n fs.stat(cssPath, function(err, cssStats){\n // CSS has not been compiled, compile it!\n if (err) {\n if ('ENOENT' == err.code) {\n debug('not found %s', cssPath);\n compile();\n } else {\n next(err);\n }\n } else {\n // Source has changed, compile it\n if (stylusStats.mtime > cssStats.mtime) {\n debug('modified %s', cssPath);\n compile();\n // Already compiled, check imports\n } else {\n checkImports(stylusPath, function(changed){\n if (debug && changed.length) {\n changed.forEach(function(path) {\n debug('modified import %s', path);\n });\n }\n changed.length ? compile() : next();\n });\n }\n }\n });\n });\n } else {\n next();\n }\n }\n};\n\n/**\n * Check `path`'s imports to see if they have been altered.\n *\n * @param {String} path\n * @param {Function} fn\n * @api private\n */\n\nfunction checkImports(path, fn) {\n var nodes = imports[path];\n if (!nodes) return fn();\n if (!nodes.length) return fn();\n\n var pending = nodes.length\n , changed = [];\n\n nodes.forEach(function(imported){\n fs.stat(imported.path, function(err, stat){\n // error or newer mtime\n if (err || !imported.mtime || stat.mtime > imported.mtime) {\n changed.push(imported.path);\n }\n --pending || fn(changed);\n });\n });\n}\n\n/**\n * get the overlaping path from the end of path A, and the begining of path B.\n *\n * @param {String} pathA\n * @param {String} pathB\n * @return {String}\n * @api private\n */\n\nfunction compare(pathA, pathB) {\n pathA = pathA.split(sep);\n pathB = pathB.split('/');\n if (!pathA[pathA.length - 1]) pathA.pop();\n if (!pathB[0]) pathB.shift();\n var overlap = [];\n\n while (pathA[pathA.length - 1] == pathB[0]) {\n overlap.push(pathA.pop());\n pathB.shift();\n }\n return overlap.join('/');\n}\n", "export default class CssParseError extends Error {\n readonly reason: string;\n readonly filename?: string;\n readonly line: number;\n readonly column: number;\n readonly source: string;\n\n constructor(\n filename: string,\n msg: string,\n lineno: number,\n column: number,\n css: string\n ) {\n super(filename + ':' + lineno + ':' + column + ': ' + msg);\n this.reason = msg;\n this.filename = filename;\n this.line = lineno;\n this.column = column;\n this.source = css;\n }\n}\n", "/**\n * Store position information for a node\n */\nexport default class Position {\n start: {line: number; column: number};\n end: {line: number; column: number};\n source?: string;\n\n constructor(\n start: {line: number; column: number},\n end: {line: number; column: number},\n source: string\n ) {\n this.start = start;\n this.end = end;\n this.source = source;\n }\n}\n", "export {default as parse} from './parse';\nexport {default as stringify} from './stringify';\nexport * from './type';\nexport * from './CssParseError';\nexport * from './CssPosition';\n", "import CssParseError from '../CssParseError';\nimport Position from '../CssPosition';\nimport {\n CssAtRuleAST,\n CssCharsetAST,\n CssCommentAST,\n CssCommonPositionAST,\n CssCustomMediaAST,\n CssDeclarationAST,\n CssDocumentAST,\n CssFontFaceAST,\n CssHostAST,\n CssImportAST,\n CssKeyframeAST,\n CssKeyframesAST,\n CssMediaAST,\n CssNamespaceAST,\n CssPageAST,\n CssRuleAST,\n CssStylesheetAST,\n CssSupportsAST,\n CssTypes,\n} from '../type';\n\n// http://www.w3.org/TR/CSS21/grammar.html\n// https://github.com/visionmedia/css-parse/pull/49#issuecomment-30088027\nconst commentre = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g;\n\nexport const parse = (\n css: string,\n options?: {source?: string; silent?: boolean}\n): CssStylesheetAST => {\n options = options || {};\n\n /**\n * Positional.\n */\n let lineno = 1;\n let column = 1;\n\n /**\n * Update lineno and column based on `str`.\n */\n function updatePosition(str: string) {\n const lines = str.match(/\\n/g);\n if (lines) lineno += lines.length;\n const i = str.lastIndexOf('\\n');\n column = ~i ? str.length - i : column + str.length;\n }\n\n /**\n * Mark position and patch `node.position`.\n */\n function position() {\n const start = {line: lineno, column: column};\n return function <T1 extends CssCommonPositionAST>(\n node: Omit<T1, 'position'>\n ): T1 {\n (node as T1).position = new Position(\n start,\n {line: lineno, column: column},\n options?.source || ''\n );\n whitespace();\n return node as T1;\n };\n }\n\n /**\n * Error `msg`.\n */\n const errorsList: Array<CssParseError> = [];\n\n function error(msg: string) {\n const err = new CssParseError(\n options?.source || '',\n msg,\n lineno,\n column,\n css\n );\n\n if (options?.silent) {\n errorsList.push(err);\n } else {\n throw err;\n }\n }\n\n /**\n * Parse stylesheet.\n */\n function stylesheet(): CssStylesheetAST {\n const rulesList = rules();\n\n const result: CssStylesheetAST = {\n type: CssTypes.stylesheet,\n stylesheet: {\n source: options?.source,\n rules: rulesList,\n parsingErrors: errorsList,\n },\n };\n\n return result;\n }\n\n /**\n * Opening brace.\n */\n function open() {\n return match(/^{\\s*/);\n }\n\n /**\n * Closing brace.\n */\n function close() {\n return match(/^}/);\n }\n\n /**\n * Parse ruleset.\n */\n function rules() {\n let node: CssRuleAST | CssAtRuleAST | void;\n const rules: Array<CssRuleAST | CssAtRuleAST> = [];\n whitespace();\n comments(rules);\n while (css.length && css.charAt(0) !== '}' && (node = atrule() || rule())) {\n if (node) {\n rules.push(node);\n comments(rules);\n }\n }\n return rules;\n }\n\n /**\n * Match `re` and return captures.\n */\n function match(re: RegExp) {\n const m = re.exec(css);\n if (!m) {\n return;\n }\n const str = m[0];\n updatePosition(str);\n css = css.slice(str.length);\n return m;\n }\n\n /**\n * Parse whitespace.\n */\n function whitespace() {\n match(/^\\s*/);\n }\n\n /**\n * Parse comments;\n */\n function comments<T1 extends CssCommonPositionAST>(\n rules?: Array<T1 | CssCommentAST>\n ) {\n let c;\n rules = rules || [];\n while ((c = comment())) {\n if (c) {\n rules.push(c);\n }\n }\n return rules;\n }\n\n /**\n * Parse comment.\n */\n function comment(): CssCommentAST | void {\n const pos = position();\n if ('/' !== css.charAt(0) || '*' !== css.charAt(1)) {\n return;\n }\n\n const m = match(/^\\/\\*[^]*?\\*\\//);\n if (!m) {\n return error('End of comment missing');\n }\n\n return pos<CssCommentAST>({\n type: CssTypes.comment,\n comment: m[0].slice(2, -2),\n });\n }\n\n /**\n * Parse selector.\n */\n function selector() {\n const m = match(/^([^{]+)/);\n if (!m) {\n return;\n }\n\n // remove comment in selector; [^] is equivalent to [.\\n\\r]\n const res = trim(m[0]).replace(/\\/\\*[^]*?\\*\\//gm, '');\n\n // Optimisation: If there is no ',' no need to split or post-process (this is less costly)\n if (res.indexOf(',') === -1) {\n return [res];\n }\n\n return (\n res\n /**\n * replace ',' by \\u200C for data selector (div[data-lang=\"fr,de,us\"])\n * replace ',' by \\u200C for nthChild and other selector (div:nth-child(2,3,4))\n *\n * Examples:\n * div[data-lang=\"fr,\\\"de,us\"]\n * div[data-lang='fr,\\'de,us']\n * div:matches(.toto, .titi:matches(.toto, .titi))\n *\n * Regex logic:\n * (\"|')(?:\\\\\\1|.)*?,(?:\\\\\\1|.)*?\\1 => Handle the \" and '\n * \\(.*?,.*?\\) => Handle the ()\n *\n * Optimization 0:\n * No greedy capture (see docs about the difference between .* and .*?)\n *\n * Optimization 1:\n * \\(.*?,.*?\\) instead of \\(.*?\\) to limit the number of replace (don't need to replace if , is not in the string)\n *\n * Optimization 2:\n * (\"|')(?:\\\\\\1|.)*?,(?:\\\\\\1|.)*?\\1 this use reference to capture group, it work faster.\n */\n .replace(/(\"|')(?:\\\\\\1|.)*?,(?:\\\\\\1|.)*?\\1|\\(.*?,.*?\\)/g, m =>\n m.replace(/,/g, '\\u200C')\n )\n // Split the selector by ','\n .split(',')\n // Replace back \\u200C by ','\n .map(s => {\n return trim(s.replace(/\\u200C/g, ','));\n })\n );\n }\n\n /**\n * Parse declaration.\n */\n function declaration(): CssDeclarationAST | void {\n const pos = position();\n\n // prop\n const propMatch = match(/^(\\*?[-#/*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/);\n if (!propMatch) {\n return;\n }\n const propValue = trim(propMatch[0]);\n\n // :\n if (!match(/^:\\s*/)) {\n return error(\"property missing ':'\");\n }\n\n // val\n const val = match(/^((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^)]*?\\)|[^};])+)/);\n\n const ret = pos<CssDeclarationAST>({\n type: CssTypes.declaration,\n property: propValue.replace(commentre, ''),\n value: val ? trim(val[0]).replace(commentre, '') : '',\n });\n\n // ;\n match(/^[;\\s]*/);\n\n return ret;\n }\n\n /**\n * Parse declarations.\n */\n function declarations() {\n const decls: Array<CssDeclarationAST | CssCommentAST> = [];\n\n if (!open()) {\n return error(\"missing '{'\");\n }\n comments(decls);\n\n // declarations\n let decl;\n while ((decl = declaration())) {\n if (decl) {\n decls.push(decl);\n comments(decls);\n }\n }\n\n if (!close()) {\n return error(\"missing '}'\");\n }\n return decls;\n }\n\n /**\n * Parse keyframe.\n */\n function keyframe() {\n let m;\n const vals = [];\n const pos = position();\n\n while ((m = match(/^((\\d+\\.\\d+|\\.\\d+|\\d+)%?|[a-z]+)\\s*/))) {\n vals.push(m[1]);\n match(/^,\\s*/);\n }\n\n if (!vals.length) {\n return;\n }\n\n return pos<CssKeyframeAST>({\n type: CssTypes.keyframe,\n values: vals,\n declarations: declarations() || [],\n });\n }\n\n /**\n * Parse keyframes.\n */\n function atkeyframes(): CssKeyframesAST | void {\n const pos = position();\n const m1 = match(/^@([-\\w]+)?keyframes\\s*/);\n\n if (!m1) {\n return;\n }\n const vendor = m1[1];\n\n // identifier\n const m2 = match(/^([-\\w]+)\\s*/);\n if (!m2) {\n return error('@keyframes missing name');\n }\n const name = m2[1];\n\n if (!open()) {\n return error(\"@keyframes missing '{'\");\n }\n\n let frame;\n let frames: Array<CssKeyframeAST | CssCommentAST> = comments();\n while ((frame = keyframe())) {\n frames.push(frame);\n frames = frames.concat(comments());\n }\n\n if (!close()) {\n return error(\"@keyframes missing '}'\");\n }\n\n return pos<CssKeyframesAST>({\n type: CssTypes.keyframes,\n name: name,\n vendor: vendor,\n keyframes: frames,\n });\n }\n\n /**\n * Parse supports.\n */\n function atsupports(): CssSupportsAST | void {\n const pos = position();\n const m = match(/^@supports *([^{]+)/);\n\n if (!m) {\n return;\n }\n const supports = trim(m[1]);\n\n if (!open()) {\n return error(\"@supports missing '{'\");\n }\n\n const style = comments<CssAtRuleAST>().concat(rules());\n\n if (!close()) {\n return error(\"@supports missing '}'\");\n }\n\n return pos<CssSupportsAST>({\n type: CssTypes.supports,\n supports: supports,\n rules: style,\n });\n }\n\n /**\n * Parse host.\n */\n function athost() {\n const pos = position();\n const m = match(/^@host\\s*/);\n\n if (!m) {\n return;\n }\n\n if (!open()) {\n return error(\"@host missing '{'\");\n }\n\n const style = comments<CssAtRuleAST>().concat(rules());\n\n if (!close()) {\n return error(\"@host missing '}'\");\n }\n\n return pos<CssHostAST>({\n type: CssTypes.host,\n rules: style,\n });\n }\n\n /**\n * Parse media.\n */\n function atmedia(): CssMediaAST | void {\n const pos = position();\n const m = match(/^@media *([^{]+)/);\n\n if (!m) {\n return;\n }\n const media = trim(m[1]);\n\n if (!open()) {\n return error(\"@media missing '{'\");\n }\n\n const style = comments<CssAtRuleAST>().concat(rules());\n\n if (!close()) {\n return error(\"@media missing '}'\");\n }\n\n return pos<CssMediaAST>({\n type: CssTypes.media,\n media: media,\n rules: style,\n });\n }\n\n /**\n * Parse custom-media.\n */\n function atcustommedia(): CssCustomMediaAST | void {\n const pos = position();\n const m = match(/^@custom-media\\s+(--[^\\s]+)\\s*([^{;]+);/);\n if (!m) {\n return;\n }\n\n return pos<CssCustomMediaAST>({\n type: CssTypes.customMedia,\n name: trim(m[1]),\n media: trim(m[2]),\n });\n }\n\n /**\n * Parse paged media.\n */\n function atpage(): CssPageAST | void {\n const pos = position();\n const m = match(/^@page */);\n if (!m) {\n return;\n }\n\n const sel = selector() || [];\n\n if (!open()) {\n return error(\"@page missing '{'\");\n }\n let decls = comments<CssDeclarationAST>();\n\n // declarations\n let decl;\n while ((decl = declaration())) {\n decls.push(decl);\n decls = decls.concat(comments());\n }\n\n if (!close()) {\n return error(\"@page missing '}'\");\n }\n\n return pos<CssPageAST>({\n type: CssTypes.page,\n selectors: sel,\n declarations: decls,\n });\n }\n\n /**\n * Parse document.\n */\n function atdocument(): CssDocumentAST | void {\n const pos = position();\n const m = match(/^@([-\\w]+)?document *([^{]+)/);\n if (!m) {\n return;\n }\n\n const vendor = trim(m[1]);\n const doc = trim(m[2]);\n\n if (!open()) {\n return error(\"@document missing '{'\");\n }\n\n const style = comments<CssAtRuleAST>().concat(rules());\n\n if (!close()) {\n return error(\"@document missing '}'\");\n }\n\n return pos<CssDocumentAST>({\n type: CssTypes.document,\n document: doc,\n vendor: vendor,\n rules: style,\n });\n }\n\n /**\n * Parse font-face.\n */\n function atfontface(): CssFontFaceAST | void {\n const pos = position();\n const m = match(/^@font-face\\s*/);\n if (!m) {\n return;\n }\n\n if (!open()) {\n return error(\"@font-face missing '{'\");\n }\n let decls = comments<CssDeclarationAST>();\n\n // declarations\n let decl;\n while ((decl = declaration())) {\n decls.push(decl);\n decls = decls.concat(comments());\n }\n\n if (!close()) {\n return error(\"@font-face missing '}'\");\n }\n\n return pos<CssFontFaceAST>({\n type: CssTypes.fontFace,\n declarations: decls,\n });\n }\n\n /**\n * Parse import\n */\n const atimport = _compileAtrule<CssImportAST>('import');\n\n /**\n * Parse charset\n */\n const atcharset = _compileAtrule<CssCharsetAST>('charset');\n\n /**\n * Parse namespace\n */\n const atnamespace = _compileAtrule<CssNamespaceAST>('namespace');\n\n /**\n * Parse non-block at-rules\n */\n function _compileAtrule<T1 extends CssCommonPositionAST>(\n name: string\n ): () => T1 | void {\n const re = new RegExp('^@' + name + '\\\\s*([^;]+);');\n return function (): T1 | void {\n const pos = position();\n const m = match(re);\n if (!m) {\n return;\n }\n const ret: Record<string, string> = {type: name};\n ret[name] = m[1].trim();\n return pos<T1>(ret as unknown as T1) as T1;\n };\n }\n\n /**\n * Parse at rule.\n */\n function atrule(): CssAtRuleAST | void {\n if (css[0] !== '@') {\n return;\n }\n\n return (\n atkeyframes() ||\n atmedia() ||\n atcustommedia() ||\n atsupports() ||\n atimport() ||\n atcharset() ||\n atnamespace() ||\n atdocument() ||\n atpage() ||\n athost() ||\n atfontface()\n );\n }\n\n /**\n * Parse rule.\n */\n function rule() {\n const pos = position();\n const sel = selector();\n\n if (!sel) {\n return error('selector missing');\n }\n comments();\n\n return pos<CssRuleAST>({\n type: CssTypes.rule,\n selectors: sel,\n declarations: declarations() || [],\n });\n }\n\n return addParent(stylesheet());\n};\n\n/**\n * Trim `str`.\n */\nfunction trim(str: string) {\n return str ? str.trim() : '';\n}\n\n/**\n * Adds non-enumerable parent node reference to each node.\n */\nfunction addParent<T1 extends {type?: string}>(obj: T1, parent?: unknown): T1 {\n const isNode = obj && typeof obj.type === 'string';\n const childParent = isNode ? obj : parent;\n\n for (const k in obj) {\n const value = obj[k];\n if (Array.isArray(value)) {\n value.forEach(v => {\n addParent(v, childParent);\n });\n } else if (value && typeof value === 'object') {\n addParent(value, childParent);\n }\n }\n\n if (isNode) {\n Object.defineProperty(obj, 'parent', {\n configurable: true,\n writable: true,\n enumerable: false,\n value: parent || null,\n });\n }\n\n return obj;\n}\n\nexport default parse;\n", "import {\n CssAllNodesAST,\n CssCharsetAST,\n CssCommentAST,\n CssCommonPositionAST,\n CssCustomMediaAST,\n CssDeclarationAST,\n CssDocumentAST,\n CssFontFaceAST,\n CssHostAST,\n CssImportAST,\n CssKeyframeAST,\n CssKeyframesAST,\n CssMediaAST,\n CssNamespaceAST,\n CssPageAST,\n CssRuleAST,\n CssStylesheetAST,\n CssSupportsAST,\n CssTypes,\n} from '../type';\n\nclass Compiler {\n level = 0;\n indentation = ' ';\n compress = false;\n\n constructor(options?: {indent?: string; compress?: boolean}) {\n if (typeof options?.indent === 'string') {\n this.indentation = options?.indent;\n }\n if (options?.compress) {\n this.compress = true;\n }\n }\n\n // We disable no-unused-vars for _position. We keep position for potential reintroduction of source-map\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n emit(str: string, _position?: CssCommonPositionAST['position']) {\n return str;\n }\n\n /**\n * Increase, decrease or return current indentation.\n */\n indent(level?: number) {\n this.level = this.level || 1;\n\n if (level) {\n this.level += level;\n return '';\n }\n\n return Array(this.level).join(this.indentation);\n }\n\n visit(node: CssAllNodesAST): string {\n switch (node.type) {\n case CssTypes.stylesheet:\n return this.stylesheet(node);\n case CssTypes.rule:\n return this.rule(node);\n case CssTypes.declaration:\n return this.declaration(node);\n case CssTypes.comment:\n return this.comment(node);\n case CssTypes.charset:\n return this.charset(node);\n case CssTypes.document:\n return this.document(node);\n case CssTypes.customMedia:\n return this.customMedia(node);\n case CssTypes.fontFace:\n return this.fontFace(node);\n case CssTypes.host:\n return this.host(node);\n case CssTypes.import:\n return this.import(node);\n case CssTypes.keyframes:\n return this.keyframes(node);\n case CssTypes.keyframe:\n return this.keyframe(node);\n case CssTypes.media:\n return this.media(node);\n case CssTypes.namespace:\n return this.namespace(node);\n case CssTypes.page:\n return this.page(node);\n case CssTypes.supports:\n return this.supports(node);\n }\n }\n\n mapVisit(nodes: Array<CssAllNodesAST>, delim?: string) {\n let buf = '';\n delim = delim || '';\n\n for (let i = 0, length = nodes.length; i < length; i++) {\n buf += this.visit(nodes[i]);\n if (delim && i < length - 1) {\n buf += this.emit(delim);\n }\n }\n\n return buf;\n }\n\n compile(node: CssStylesheetAST) {\n if (this.compress) {\n return node.stylesheet.rules.map(this.visit, this).join('');\n }\n\n return this.stylesheet(node);\n }\n\n /**\n * Visit stylesheet node.\n */\n stylesheet(node: CssStylesheetAST) {\n return this.mapVisit(node.stylesheet.rules, '\\n\\n');\n }\n\n /**\n * Visit comment node.\n */\n comment(node: CssCommentAST) {\n if (this.compress) {\n return this.emit('', node.position);\n }\n return this.emit(this.indent() + '/*' + node.comment + '*/', node.position);\n }\n\n /**\n * Visit import node.\n */\n import(node: CssImportAST) {\n return this.emit('@import ' + node.import + ';', node.position);\n }\n\n /**\n * Visit media node.\n */\n media(node: CssMediaAST) {\n if (this.compress) {\n return (\n this.emit('@media ' + node.media, node.position) +\n this.emit('{') +\n this.mapVisit(node.rules) +\n this.emit('}')\n );\n }\n return (\n this.emit('@media ' + node.media, node.position) +\n this.emit(' {\\n' + this.indent(1)) +\n this.mapVisit(node.rules, '\\n\\n') +\n this.emit(this.indent(-1) + '\\n}')\n );\n }\n\n /**\n * Visit document node.\n */\n document(node: CssDocumentAST) {\n const doc = '@' + (node.vendor || '') + 'document ' + node.document;\n if (this.compress) {\n return (\n this.emit(doc, node.position) +\n this.emit('{') +\n this.mapVisit(node.rules) +\n this.emit('}')\n );\n }\n return (\n this.emit(doc, node.position) +\n this.emit(' ' + ' {\\n' + this.indent(1)) +\n this.mapVisit(node.rules, '\\n\\n') +\n this.emit(this.indent(-1) + '\\n}')\n );\n }\n\n /**\n * Visit charset node.\n */\n charset(node: CssCharsetAST) {\n return this.emit('@charset ' + node.charset + ';', node.position);\n }\n\n /**\n * Visit namespace node.\n */\n namespace(node: CssNamespaceAST) {\n return this.emit('@namespace ' + node.namespace + ';', node.position);\n }\n\n /**\n * Visit supports node.\n */\n supports(node: CssSupportsAST) {\n if (this.compress) {\n return (\n this.emit('@supports ' + node.supports, node.position) +\n this.emit('{') +\n this.mapVisit(node.rules) +\n this.emit('}')\n );\n }\n return (\n this.emit('@supports ' + node.supports, node.position) +\n this.emit(' {\\n' + this.indent(1)) +\n this.mapVisit(node.rules, '\\n\\n') +\n this.emit(this.indent(-1) + '\\n}')\n );\n }\n\n /**\n * Visit keyframes node.\n */\n keyframes(node: CssKeyframesAST) {\n if (this.compress) {\n return (\n this.emit(\n '@' + (node.vendor || '') + 'keyframes ' + node.name,\n node.position\n ) +\n this.emit('{') +\n this.mapVisit(node.keyframes) +\n this.emit('}')\n );\n }\n return (\n this.emit(\n '@' + (node.vendor || '') + 'keyframes ' + node.name,\n node.position\n ) +\n this.emit(' {\\n' + this.indent(1)) +\n this.mapVisit(node.keyframes, '\\n') +\n this.emit(this.indent(-1) + '}')\n );\n }\n\n /**\n * Visit keyframe node.\n */\n keyframe(node: CssKeyframeAST) {\n const decls = node.declarations;\n if (this.compress) {\n return (\n this.emit(node.values.join(','), node.position) +\n this.emit('{') +\n this.mapVisit(decls) +\n this.emit('}')\n );\n }\n\n return (\n this.emit(this.indent()) +\n this.emit(node.values.join(', '), node.position) +\n this.emit(' {\\n' + this.indent(1)) +\n this.mapVisit(decls, '\\n') +\n this.emit(this.indent(-1) + '\\n' + this.indent() + '}\\n')\n );\n }\n\n /**\n * Visit page node.\n */\n page(node: CssPageAST) {\n if (this.compress) {\n const sel = node.selectors.length ? node.selectors.join(', ') : '';\n\n return (\n this.emit('@page ' + sel, node.position) +\n this.emit('{') +\n this.mapVisit(node.declarations) +\n this.emit('}')\n );\n }\n const sel = node.selectors.length ? node.selectors.join(', ') + ' ' : '';\n\n return (\n this.emit('@page ' + sel, node.position) +\n this.emit('{\\n') +\n this.emit(this.indent(1)) +\n this.mapVisit(node.declarations, '\\n') +\n this.emit(this.indent(-1)) +\n this.emit('\\n}')\n );\n }\n\n /**\n * Visit font-face node.\n */\n fontFace(node: CssFontFaceAST) {\n if (this.compress) {\n return (\n this.emit('@font-face', node.position) +\n this.emit('{') +\n this.mapVisit(node.declarations) +\n this.emit('}')\n );\n }\n return (\n this.emit('@font-face ', node.position) +\n this.emit('{\\n') +\n this.emit(this.indent(1)) +\n this.mapVisit(node.declarations, '\\n') +\n this.emit(this.indent(-1)) +\n this.emit('\\n}')\n );\n }\n\n /**\n * Visit host node.\n */\n host(node: CssHostAST) {\n if (this.compress) {\n return (\n this.emit('@host', node.position) +\n this.emit('{') +\n this.mapVisit(node.rules) +\n this.emit('}')\n );\n }\n return (\n this.emit('@host', node.position) +\n this.emit(' {\\n' + this.indent(1)) +\n this.mapVisit(node.rules, '\\n\\n') +\n this.emit(this.indent(-1) + '\\n}')\n );\n }\n\n /**\n * Visit custom-media node.\n */\n customMedia(node: CssCustomMediaAST) {\n return this.emit(\n '@custom-media ' + node.name + ' ' + node.media + ';',\n node.position\n );\n }\n\n /**\n * Visit rule node.\n */\n rule(node: CssRuleAST) {\n const decls = node.declarations;\n if (!decls.length) {\n return '';\n }\n\n if (this.compress) {\n return (\n this.emit(node.selectors.join(','), node.position) +\n this.emit('{') +\n this.mapVisit(decls) +\n this.emit('}')\n );\n }\n const indent = this.indent();\n\n return (\n this.emit(\n node.selectors\n .map(s => {\n return indent + s;\n })\n .join(',\\n'),\n node.position\n ) +\n this.emit(' {\\n') +\n this.emit(this.indent(1)) +\n this.mapVisit(decls, '\\n') +\n this.emit(this.indent(-1)) +\n this.emit('\\n' + this.indent() + '}')\n );\n }\n\n /**\n * Visit declaration node.\n */\n declaration(node: CssDeclarationAST) {\n if (this.compress) {\n return (\n this.emit(node.property + ':' + node.value, node.position) +\n this.emit(';')\n );\n }\n return (\n this.emit(this.indent()) +\n this.emit(node.property + ': ' + node.value, node.position) +\n this.emit(';')\n );\n }\n}\n\nexport default Compiler;\n", "import {CssStylesheetAST} from '../type';\nimport Compiler from './compiler';\n\nexport default (\n node: CssStylesheetAST,\n options?: ConstructorParameters<typeof Compiler>[0]\n) => {\n const compiler = new Compiler(options || {});\n return compiler.compile(node);\n};\n", "import CssParseError from './CssParseError';\nimport Position from './CssPosition';\n\nexport enum CssTypes {\n stylesheet = 'stylesheet',\n rule = 'rule',\n declaration = 'declaration',\n comment = 'comment',\n charset = 'charset',\n document = 'document',\n customMedia = 'custom-media',\n fontFace = 'font-face',\n host = 'host',\n import = 'import',\n keyframes = 'keyframes',\n keyframe = 'keyframe',\n media = 'media',\n namespace = 'namespace',\n page = 'page',\n supports = 'supports',\n}\n\nexport type CssCommonAST = {\n type: CssTypes;\n};\n\nexport type CssCommonPositionAST = CssCommonAST & {\n position?: Position;\n parent?: unknown;\n};\n\nexport type CssStylesheetAST = CssCommonAST & {\n type: CssTypes.stylesheet;\n stylesheet: {\n source?: string;\n rules: Array<CssAtRuleAST>;\n parsingErrors?: Array<CssParseError>;\n };\n};\n\nexport type CssRuleAST = CssCommonPositionAST & {\n type: CssTypes.rule;\n selectors: Array<string>;\n declarations: Array<CssDeclarationAST | CssCommentAST>;\n};\n\nexport type CssDeclarationAST = CssCommonPositionAST & {\n type: CssTypes.declaration;\n property: string;\n value: string;\n};\n\nexport type CssCommentAST = CssCommonPositionAST & {\n type: CssTypes.comment;\n comment: string;\n};\n\nexport type CssCharsetAST = CssCommonPositionAST & {\n type: CssTypes.charset;\n charset: string;\n};\nexport type CssCustomMediaAST = CssCommonPositionAST & {\n type: CssTypes.customMedia;\n name: string;\n media: string;\n};\nexport type CssDocumentAST = CssCommonPositionAST & {\n type: CssTypes.document;\n document: string;\n vendor?: string;\n rules: Array<CssAtRuleAST>;\n};\nexport type CssFontFaceAST = CssCommonPositionAST & {\n type: CssTypes.fontFace;\n declarations: Array<CssDeclarationAST | CssCommentAST>;\n};\nexport type CssHostAST = CssCommonPositionAST & {\n type: CssTypes.host;\n rules: Array<CssAtRuleAST>;\n};\nexport type CssImportAST = CssCommonPositionAST & {\n type: CssTypes.import;\n import: string;\n};\nexport type CssKeyframesAST = CssCommonPositionAST & {\n type: CssTypes.keyframes;\n name: string;\n vendor?: string;\n keyframes: Array<CssKeyframeAST | CssCommentAST>;\n};\nexport type CssKeyframeAST = CssCommonPositionAST & {\n type: CssTypes.keyframe;\n values: Array<string>;\n declarations: Array<CssDeclarationAST | CssCommentAST>;\n};\nexport type CssMediaAST = CssCommonPositionAST & {\n type: CssTypes.media;\n media: string;\n rules: Array<CssAtRuleAST>;\n};\nexport type CssNamespaceAST = CssCommonPositionAST & {\n type: CssTypes.namespace;\n namespace: string;\n};\nexport type CssPageAST = CssCommonPositionAST & {\n type: CssTypes.page;\n selectors: Array<string>;\n declarations: Array<CssDeclarationAST | CssCommentAST>;\n};\nexport type CssSupportsAST = CssCommonPositionAST & {\n type: CssTypes.supports;\n supports: string;\n rules: Array<CssAtRuleAST>;\n};\n\nexport type CssAtRuleAST =\n | CssRuleAST\n | CssCommentAST\n | CssCharsetAST\n | CssCustomMediaAST\n | CssDocumentAST\n | CssFontFaceAST\n | CssHostAST\n | CssImportAST\n | CssKeyframesAST\n | CssMediaAST\n | CssNamespaceAST\n | CssPageAST\n | CssSupportsAST;\n\nexport type CssAllNodesAST =\n | CssAtRuleAST\n | CssStylesheetAST\n | CssDeclarationAST\n | CssKeyframeAST;\n", "// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n", "// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(607);\n", "/*!\n * Stylus - CSS to Stylus conversion\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Convert the given `css` to Stylus source.\n *\n * @param {String} css\n * @return {String}\n * @api public\n */\n\nmodule.exports = function(css){\n return new Converter(css).stylus();\n};\n\n/**\n * Initialize a new `Converter` with the given `css`.\n *\n * @param {String} css\n * @api private\n */\n\nfunction Converter(css) {\n var { parse } = require('@adobe/css-tools');\n this.css = css;\n this.root = parse(css, { position: false });\n this.indents = 0;\n}\n\n/**\n * Convert to Stylus.\n *\n * @return {String}\n * @api private\n */\n\nConverter.prototype.stylus = function(){\n return this.visitRules(this.root.stylesheet.rules);\n};\n\n/**\n * Return indent string.\n *\n * @return {String}\n * @api private\n */\n\nConverter.prototype.__defineGetter__('indent', function(){\n return Array(this.indents + 1).join(' ');\n});\n\n/**\n * Visit `node`.\n *\n * @param {*} node\n * @return {String}\n * @api private\n */\n\nConverter.prototype.visit = function(node){\n switch (node.type) {\n case 'rule':\n case 'comment':\n case 'charset':\n case 'namespace':\n case 'media':\n case 'import':\n case 'document':\n case 'keyframes':\n case 'page':\n case 'host':\n case 'supports':\n var name = node.type[0].toUpperCase() + node.type.slice(1);\n return this['visit' + name](node);\n case 'font-face':\n return this.visitFontFace(node);\n }\n};\n\n/**\n * Visit the rules on `node`.\n *\n * @param {Array} node\n * @return {String}\n * @api private\n */\n\nConverter.prototype.visitRules = function(node){\n var buf = '';\n for (var i = 0, len = node.length; i < len; ++i) {\n buf += this.visit(node[i]);\n }\n return buf;\n};\n\n/**\n * Visit FontFace `node`.\n *\n * @param {FontFace} node\n * @return {String}\n * @api private\n */\n\n Converter.prototype.visitFontFace = function(node){\n var buf = this.indent + '@font-face';\n buf += '\\n';\n ++this.indents;\n for (var i = 0, len = node.declarations.length; i < len; ++i) {\n buf += this.visitDeclaration(node.declarations[i]);\n }\n --this.indents;\n return buf;\n };\n\n/**\n * Visit Media `node`.\n *\n * @param {Media} node\n * @return {String}\n * @api private\n */\n\nConverter.prototype.visitMedia = function(node){\n var buf = this.indent + '@media ' + node.media;\n buf += '\\n';\n ++this.indents;\n buf += this.visitRules(node.rules);\n --this.indents;\n return buf;\n};\n\n/**\n * Visit Declaration `node`.\n *\n * @param {Declaration} node\n * @return {String}\n * @api private\n */\n\nConverter.prototype.visitDeclaration = function(node){\n if ('comment' == node.type) {\n return this.visitComment(node);\n } else {\n var buf = this.indent + node.property + ': ' + node.value + '\\n';\n return buf;\n }\n};\n\n/**\n * Visit Rule `node`.`\n *\n * @param {Rule} node\n * @return {String}\n * @api private\n */\n\nConverter.prototype.visitRule = function(node){\n var buf = this.indent + node.selectors.join(',\\n' + this.indent) + '\\n';\n ++this.indents;\n for (var i = 0, len = node.declarations.length; i < len; ++i) {\n buf += this.visitDeclaration(node.declarations[i]);\n }\n --this.indents;\n return buf + '\\n';\n};\n\n/**\n * Visit Comment `node`.`\n *\n * @param {Comment} node\n * @return {String}\n * @api private\n */\n\nConverter.prototype.visitComment = function(node){\n var buf = this.indent + '/*' + node.comment + '*/';\n return buf + '\\n';\n};\n\n/**\n * Visit Charset `node`.`\n *\n * @param {Charset} node\n * @return {String}\n * @api private\n */\n\nConverter.prototype.visitCharset = function(node){\n var buf = this.indent + '@charset ' + node.charset;\n return buf + '\\n';\n};\n\n/**\n * Visit Namespace `node`.`\n *\n * @param {Namespace} node\n * @return {String}\n * @api private\n */\n\nConverter.prototype.visitNamespace = function(node){\n var buf = this.indent + '@namespace ' + node.namespace;\n return buf + '\\n';\n};\n\n/**\n * Visit Import `node`.`\n *\n * @param {Import} node\n * @return {String}\n * @api private\n */\n\nConverter.prototype.visitImport = function(node){\n var buf = this.indent + '@import ' + node.import;\n return buf + '\\n';\n};\n\n/**\n * Visit Document `node`.`\n *\n * @param {Document} node\n * @return {String}\n * @api private\n */\n\nConverter.prototype.visitDocument = function(node){\n var buf = this.indent + '@' + node.vendor + 'document ' + node.document;\n buf += '\\n';\n ++this.indents;\n buf += this.visitRules(node.rules);\n --this.indents;\n return buf;\n};\n\n/**\n * Visit Keyframes `node`.`\n *\n * @param {Keyframes} node\n * @return {String}\n * @api private\n */\n\nConverter.prototype.visitKeyframes = function(node){\n var buf = this.indent + '@keyframes ' + node.name;\n buf += '\\n';\n ++this.indents;\n for (var i = 0, len = node.keyframes.length; i < len; ++i) {\n buf += this.visitKeyframe(node.keyframes[i]);\n }\n --this.indents;\n return buf;\n};\n\n/**\n * Visit Keyframe `node`.`\n *\n * @param {Keyframe} node\n * @return {String}\n * @api private\n */\n\nConverter.prototype.visitKeyframe = function(node){\n var buf = this.indent + node.values.join(', ');\n buf += '\\n';\n ++this.indents;\n for (var i = 0, len = node.declarations.length; i < len; ++i) {\n buf += this.visitDeclaration(node.declarations[i]);\n }\n --this.indents;\n return buf;\n};\n\n/**\n * Visit Page `node`.`\n *\n * @param {Page} node\n * @return {String}\n * @api private\n */\n\nConverter.prototype.visitPage = function(node){\n var buf = this.indent + '@page' + (node.selectors.length ? ' ' + node.selectors.join(', ') : '');\n buf += '\\n';\n ++this.indents;\n for (var i = 0, len = node.declarations.length; i < len; ++i) {\n buf += this.visitDeclaration(node.declarations[i]);\n }\n --this.indents;\n return buf;\n};\n\n/**\n * Visit Supports `node`.`\n *\n * @param {Supports} node\n * @return {String}\n * @api private\n */\n\nConverter.prototype.visitSupports = function(node){\n var buf = this.indent + '@supports ' + node.supports;\n buf += '\\n';\n ++this.indents;\n buf += this.visitRules(node.rules);\n --this.indents;\n return buf;\n};\n\n/**\n * Visit Host `node`.`\n *\n * @param {Host} node\n * @return {String}\n * @api private\n */\n\nConverter.prototype.visitHost = function(node){\n var buf = this.indent + '@host';\n buf += '\\n';\n ++this.indents;\n buf += this.visitRules(node.rules);\n --this.indents;\n return buf;\n};\n", "/**\n * Module dependencies.\n */\n\nvar Compiler = require('../visitor/compiler')\n , nodes = require('../nodes')\n , parse = require('url').parse\n , relative = require('path').relative\n , join = require('path').join\n , dirname = require('path').dirname\n , extname = require('path').extname\n , sep = require('path').sep;\n\n/**\n * Return a url() function which resolves urls.\n *\n * Options:\n *\n * - `paths` resolution path(s), merged with general lookup paths\n * - `nocheck` don't check file existence\n *\n * Examples:\n *\n * stylus(str)\n * .set('filename', __dirname + '/css/test.styl')\n * .define('url', stylus.resolver({ nocheck: true }))\n * .render(function(err, css){ ... })\n *\n * @param {Object} [options]\n * @return {Function}\n * @api public\n */\n\nmodule.exports = function(options) {\n options = options || {};\n\n function resolver(url) {\n // Compile the url\n var compiler = new Compiler(url)\n , filename = url.filename;\n compiler.isURL = true;\n url = parse(url.nodes.map(function(node){\n return compiler.visit(node);\n }).join(''));\n\n // Parse literal \n var literal = new nodes.Literal('url(\"' + url.href + '\")')\n , path = url.pathname\n , dest = this.options.dest\n , tail = ''\n , res;\n\n // Absolute or hash\n if (url.protocol || !path || '/' == path[0]) return literal;\n\n // Check that file exists\n if (!options.nocheck) {\n var _paths = options.paths || [];\n path = require('../utils').lookup(path, _paths.concat(this.paths));\n if (!path) return literal;\n }\n\n if (this.includeCSS && extname(path) == '.css')\n return new nodes.Literal(url.href);\n\n if (url.search) tail += url.search;\n if (url.hash) tail += url.hash;\n\n if (dest && extname(dest) == '.css')\n dest = dirname(dest);\n\n res = relative(dest || dirname(this.filename), options.nocheck\n ? join(dirname(filename), path)\n : path) + tail;\n\n if ('\\\\' == sep) res = res.replace(/\\\\/g, '/');\n\n return new nodes.Literal('url(\"' + res + '\")');\n };\n\n // Expose options to Evaluator\n resolver.options = options;\n resolver.raw = true;\n return resolver;\n};\n", "/*!\n * Stylus\n * Copyright (c) Automattic <developer.wordpress.com>\n * MIT Licensed\n */\n\n/**\n * Module dependencies.\n */\n\nvar Renderer = require('./renderer')\n , nodes = require('./nodes')\n , utils = require('./utils');\n\n/**\n * Export render as the module.\n */\n\nexports = module.exports = render;\n\n/**\n * Library version.\n */\n\nexports.version = require('../package').version;\n\n/**\n * Expose nodes.\n */\n\nexports.nodes = nodes;\n\n/**\n * Expose BIFs.\n */\n\nexports.functions = require('./functions');\n\n/**\n * Expose utils.\n */\n\nexports.utils = require('./utils');\n\n/**\n * Expose middleware.\n */\n\nexports.middleware = require('./middleware');\n\n/**\n * Expose constructors.\n */\n\nexports.Visitor = require('./visitor');\nexports.Parser = require('./parser');\nexports.Evaluator = require('./visitor/evaluator');\nexports.Normalizer = require('./visitor/normalizer');\nexports.Compiler = require('./visitor/compiler');\n\n/**\n * Convert the given `css` to `stylus` source.\n *\n * @param {String} css\n * @return {String}\n * @api public\n */\n\nexports.convertCSS = require('./convert/css');\n\n/**\n * Render the given `str` with `options` and callback `fn(err, css)`.\n *\n * @param {String} str\n * @param {Object|Function} options\n * @param {Function} fn\n * @api public\n */\n\nexports.render = function(str, options, fn){\n if ('function' == typeof options) fn = options, options = {};\n return new Renderer(str, options).render(fn);\n};\n\n/**\n * Return a new `Renderer` for the given `str` and `options`.\n *\n * @param {String} str\n * @param {Object} options\n * @return {Renderer}\n * @api public\n */\n\nfunction render(str, options) {\n return new Renderer(str, options);\n}\n\n/**\n * Expose optional functions.\n */\n\nexports.url = require('./functions/url');\nexports.resolver = require('./functions/resolver');\n", "module.exports = require('./lib/stylus');\n", "/*!\n * parse-gitignore <https://github.com/jonschlinkert/parse-gitignore>\n * Copyright (c) 2015-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nconst fs = require('fs');\nconst isObject = v => v !== null && typeof v === 'object' && !Array.isArray(v);\n\n// eslint-disable-next-line no-control-regex\nconst INVALID_PATH_CHARS_REGEX = /[<>:\"|?*\\n\\r\\t\\f\\x00-\\x1F]/;\nconst GLOBSTAR_REGEX = /(?:^|\\/)[*]{2}($|\\/)/;\nconst MAX_PATH_LENGTH = 260 - 12;\n\nconst isValidPath = input => {\n if (typeof input === 'string') {\n return input.length <= MAX_PATH_LENGTH && !INVALID_PATH_CHARS_REGEX.test(input);\n }\n return false;\n};\n\nconst split = str => String(str).split(/\\r\\n?|\\n/);\nconst isComment = str => str.startsWith('#');\nconst isParsed = input => isObject(input) && input.patterns && input.sections;\n\nconst patterns = input => {\n return split(input).map(l => l.trim()).filter(line => line !== '' && !isComment(line));\n};\n\nconst parse = (input, options = {}) => {\n let filepath = options.path;\n\n if (isParsed(input)) return input;\n if (isValidPath(input) && fs.existsSync(input)) {\n filepath = input;\n input = fs.readFileSync(input);\n }\n\n const lines = split(input);\n const names = new Map();\n\n let parsed = { sections: [], patterns: [] };\n let section = { name: 'default', patterns: [] };\n let prev;\n\n for (const line of lines) {\n const value = line.trim();\n\n if (value.startsWith('#')) {\n const [, name] = /^#+\\s*(.*)\\s*$/.exec(value);\n\n if (prev) {\n names.delete(prev.name);\n prev.comment += value ? `\\n${value}` : '';\n prev.name = name ? `${prev.name.trim()}\\n${name.trim()}` : prev.name.trim();\n names.set(prev.name.toLowerCase().trim(), prev);\n continue;\n }\n\n section = { name: name.trim(), comment: value, patterns: [] };\n names.set(section.name.toLowerCase(), section);\n parsed.sections.push(section);\n prev = section;\n continue;\n }\n\n if (value !== '') {\n section.patterns.push(value);\n parsed.patterns.push(value);\n }\n\n prev = null;\n }\n\n if (options.dedupe === true || options.unique === true) {\n parsed = dedupe(parsed, { ...options, format: false });\n }\n\n parsed.path = filepath;\n parsed.input = Buffer.from(input);\n parsed.format = opts => format(parsed, { ...options, ...opts });\n parsed.dedupe = opts => dedupe(parsed, { ...options, ...opts });\n parsed.globs = opts => globs(parsed, { path: filepath, ...options, ...opts });\n return parsed;\n};\n\nconst parseFile = (filepath, options) => {\n return parse(fs.readFileSync(filepath, 'utf8'), options);\n};\n\nconst dedupe = (input, options) => {\n const parsed = parse(input, { ...options, dedupe: false });\n\n const names = new Map();\n const res = { sections: [], patterns: new Set() };\n let current;\n\n // first, combine duplicate sections\n for (const section of parsed.sections) {\n const { name = '', comment, patterns } = section;\n const key = name.trim().toLowerCase();\n\n for (const pattern of patterns) {\n res.patterns.add(pattern);\n }\n\n if (name && names.has(key)) {\n current = names.get(key);\n current.patterns = [...current.patterns, ...patterns];\n } else {\n current = { name, comment, patterns };\n res.sections.push(current);\n names.set(key, current);\n }\n }\n\n // next, de-dupe patterns in each section\n for (const section of res.sections) {\n section.patterns = [...new Set(section.patterns)];\n }\n\n res.patterns = [...res.patterns];\n return res;\n};\n\nconst glob = (pattern, options) => {\n // Return if a glob pattern has already been specified for sub-directories\n if (GLOBSTAR_REGEX.test(pattern)) {\n return pattern;\n }\n\n // If there is a separator at the beginning or middle (or both) of the pattern,\n // then the pattern is relative to the directory level of the particular .gitignore\n // file itself. Otherwise the pattern may also match at any level below the\n // .gitignore level. relative paths only\n let relative = false;\n if (pattern.startsWith('/')) {\n pattern = pattern.slice(1);\n relative = true;\n } else if (pattern.slice(1, pattern.length - 1).includes('/')) {\n relative = true;\n }\n\n // If there is a separator at the end of the pattern then the pattern will only match directories.\n pattern += pattern.endsWith('/') ? '**/' : '/**';\n\n // If not relative, the pattern can match any files and directories.\n return relative ? pattern : `**/${pattern}`;\n};\n\nconst globs = (input, options = {}) => {\n const parsed = parse(input, options);\n const result = [];\n let index = 0;\n\n const patterns = parsed.patterns\n .concat(options.ignore || [])\n .concat((options.unignore || []).map(p => !p.startsWith('!') ? '!' + p : p));\n\n const push = (prefix, pattern) => {\n const prev = result[result.length - 1];\n const type = prefix ? 'unignore' : 'ignore';\n\n if (prev && prev.type === type) {\n if (!prev.patterns.includes(pattern)) {\n prev.patterns.push(pattern);\n }\n } else {\n result.push({ type, path: options.path || null, patterns: [pattern], index });\n index++;\n }\n };\n\n for (let pattern of patterns) {\n let prefix = '';\n\n // An optional prefix \"!\" which negates the pattern; any matching file excluded by\n // a previous pattern will become included again\n if (pattern.startsWith('!')) {\n pattern = pattern.slice(1);\n prefix = '!';\n }\n\n // add the raw pattern to the results\n push(prefix, (pattern.startsWith('/') ? pattern.slice(1) : pattern));\n\n // add the glob pattern to the results\n push(prefix, glob(pattern));\n }\n\n return result;\n};\n\n/**\n * Formats a .gitignore section\n */\n\nconst formatSection = (section = {}) => {\n const output = [section.comment || ''];\n\n if (section.patterns?.length) {\n output.push(section.patterns.join('\\n'));\n output.push('');\n }\n\n return output.join('\\n');\n};\n\n/**\n * Format a .gitignore file from the given input or object from `.parse()`.\n * @param {String} input File path or contents.\n * @param {Object} options\n * @return {String} Returns formatted string.\n * @api public\n */\n\nconst format = (input, options = {}) => {\n const parsed = parse(input, options);\n\n const fn = options.formatSection || formatSection;\n const sections = parsed.sections || parsed;\n const output = [];\n\n for (const section of [].concat(sections)) {\n output.push(fn(section));\n }\n\n return output.join('\\n');\n};\n\nparse.file = parseFile;\nparse.parse = parse;\nparse.dedupe = dedupe;\nparse.format = format;\nparse.globs = globs;\nparse.formatSection = formatSection;\nparse.patterns = patterns;\n\n/**\n * Expose `parse`\n */\n\nmodule.exports = parse;\n", "\"use strict\";\r\nexports.__esModule = true;\r\nexports.getDistance = exports.hasPropertyValueSpace = exports.isInterpolatedProperty = exports.isAtForwardOrAtUse = exports.isBracketOrWhitespace = exports.isMoreThanOneClassOrId = exports.isBlockCommentEnd = exports.isBlockCommentStart = exports.isComment = exports.isCssOneLiner = exports.isCssPseudo = exports.isScssOrCss = exports.isSassSpace = exports.isIgnore = exports.isReset = exports.isVoidHtmlTag = exports.isHtmlTag = exports.isBracketSelector = exports.isPseudo = exports.isKeyframes = exports.isInclude = exports.isAtExtend = exports.isAnd = exports.isProperty = exports.isEmptyOrWhitespace = exports.isAdjacentSelector = exports.isSelectorOperator = exports.isClassOrId = exports.isCssSelector = exports.isStar = exports.isAtImport = exports.isVar = exports.escapeRegExp = void 0;\r\nfunction escapeRegExp(text) {\r\n return text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\r\n}\r\nexports.escapeRegExp = escapeRegExp;\r\n/** Check whether text is a variable: `/^[\\t ]*(\\$|--)\\S+[\\t ]*:.*/\r\nfunction isVar(text) {\r\n return /^[\\t ]*(\\$|--)\\S+[\\t ]*:.*/.test(text);\r\n}\r\nexports.isVar = isVar;\r\n/** Check whether text @import: `/^[\\t ]*@import/` */\r\nfunction isAtImport(text) {\r\n return /^[\\t ]*@import/.test(text);\r\n}\r\nexports.isAtImport = isAtImport;\r\n/** Check whether text is a \\*: `/^[\\t ]*?\\*\\/` */\r\nfunction isStar(text) {\r\n return /^[\\t ]*?\\*/.test(text);\r\n}\r\nexports.isStar = isStar;\r\n/** Check whether text is a css selector: `/^[\\t ]*[{}]?[\\t ]*[#\\.%@=]/` */\r\nfunction isCssSelector(text) {\r\n return /^[\\t ]*[{}]?[\\t ]*[#\\.%@=]/.test(text);\r\n}\r\nexports.isCssSelector = isCssSelector;\r\n/**Check whether text is class, id or placeholder: `/^[\\t ]*[#\\.%]/` */\r\nfunction isClassOrId(text) {\r\n return /^[\\t ]*[#\\.%]/.test(text);\r\n}\r\nexports.isClassOrId = isClassOrId;\r\n/**Check whether text starts with one of [>\\~]: `/^[\\t ]*[>~]/` */\r\nfunction isSelectorOperator(text) {\r\n return /^[\\t ]*[>~]/.test(text);\r\n}\r\nexports.isSelectorOperator = isSelectorOperator;\r\n/**`/^[\\t ]*\\+[\\t ]+/` */\r\nfunction isAdjacentSelector(text) {\r\n return /^[\\t ]*\\+[\\t ]+/.test(text);\r\n}\r\nexports.isAdjacentSelector = isAdjacentSelector;\r\n/**Check whether text is class, id or placeholder: `/^[\\t ]*\\r?\\n?$/` */\r\nfunction isEmptyOrWhitespace(text) {\r\n return /^[\\t ]*\\r?\\n?$/.test(text);\r\n}\r\nexports.isEmptyOrWhitespace = isEmptyOrWhitespace;\r\n/** Check whether text is a property: `^[\\t ]*[\\w\\-]+[\\t ]*:` */\r\nfunction isProperty(text) {\r\n // if (empty) {\r\n // return !/^[\\t ]*[\\w\\-]+ *: *\\S+/.test(text);\r\n // }\r\n return /^[\\t ]*[\\w\\-]+[\\t ]*:/.test(text);\r\n}\r\nexports.isProperty = isProperty;\r\n/** Check whether text starts with &: `/^[\\t ]*&/` */\r\nfunction isAnd(text) {\r\n return /^[\\t ]*&/.test(text);\r\n}\r\nexports.isAnd = isAnd;\r\n/** Check whether text is a extend: `/^[\\t ]*@extend/` */\r\nfunction isAtExtend(text) {\r\n return /^[\\t ]*@extend/.test(text);\r\n}\r\nexports.isAtExtend = isAtExtend;\r\n/** Check whether text is include mixin statement */\r\nfunction isInclude(text) {\r\n return /^[\\t ]*(@include|\\+\\w)/.test(text);\r\n}\r\nexports.isInclude = isInclude;\r\n/** Check whether text is a @keyframes: `/^[\\t ]*@keyframes/` */\r\nfunction isKeyframes(text) {\r\n return /^[\\t ]*@keyframes/.test(text);\r\n}\r\nexports.isKeyframes = isKeyframes;\r\n/** Check whether text is a Pseudo selector: `/^[\\t ]*\\\\?::?/`. */\r\nfunction isPseudo(text) {\r\n return /^[\\t ]*\\\\?::?/.test(text);\r\n}\r\nexports.isPseudo = isPseudo;\r\n/** Check whether text is bracket selector: `/^[\\t ]*\\[[\\w=\\-*\"' ]*\\]/`*/\r\nfunction isBracketSelector(text) {\r\n return /^[\\t ]*\\[[\\w=\\-*\"' ]*\\]/.test(text);\r\n}\r\nexports.isBracketSelector = isBracketSelector;\r\n/** Check whether text starts with an html tag. */\r\nfunction isHtmlTag(text) {\r\n return /^[\\t ]*(a|abbr|address|area|article|aside|audio|b|base|bdi|bdo|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|data|datalist|dd|del|details|dfn|dialog|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|h1|h2|h3|h4|h5|h6|head|header|hgroup|hr|html|i|iframe|img|picture|input|ins|kbd|keygen|label|legend|li|link|main|map|mark|menu|menuitem|meta|meter|nav|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rb|rp|rt|rtc|ruby|s|samp|script|section|select|small|source|span|strong|style|sub|summary|sup|svg|table|tbody|td|template|textarea|tfoot|th|thead|time|title|tr|track|u|ul|var|video|wbr|path|circle|ellipse|line|polygon|polyline|rect|text|slot|h[1-6]?)((:|::|,|\\.|#|\\[)[\\^:$#{}()\\w\\-\\[\\]='\",\\.# +\\/]*)?$/.test(text);\r\n}\r\nexports.isHtmlTag = isHtmlTag;\r\n/** Check whether text starts with a self closing html tag. */\r\nfunction isVoidHtmlTag(text) {\r\n return /^[\\t ]*(area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr|command|keygen|menuitem|path)((:|::|,|\\.|#|\\[)[:$#{}()\\w\\-\\[\\]='\",\\.# ]*)?$/.test(text);\r\n}\r\nexports.isVoidHtmlTag = isVoidHtmlTag;\r\n/** Check whether text starts with //R: `/^[\\t ]*\\/?\\/\\/ *R *$/` */\r\nfunction isReset(text) {\r\n return /^[\\t ]*\\/?\\/\\/ *R *$/.test(text);\r\n}\r\nexports.isReset = isReset;\r\n/** Check whether text starts with //I: `/^[\\t ]*\\/?\\/\\/ *I *$/` */\r\nfunction isIgnore(text) {\r\n return /^[\\t ]*\\/?\\/\\/ *I *$/.test(text);\r\n}\r\nexports.isIgnore = isIgnore;\r\n/** Check whether text starts with //S: `/^[\\t ]*\\/?\\/\\/ *S *$/` */\r\nfunction isSassSpace(text) {\r\n return /^[\\t ]*\\/?\\/\\/ *S *$/.test(text);\r\n}\r\nexports.isSassSpace = isSassSpace;\r\n/** Returns true if the string has brackets or semicolons at the end, comments get ignored. */\r\nfunction isScssOrCss(text) {\r\n // Check if has brackets at the end and ignore comments.\r\n return /[;\\{\\}][\\t ]*(\\/\\/.*)?$/.test(text);\r\n}\r\nexports.isScssOrCss = isScssOrCss;\r\n/** `/^[\\t ]*[&.#%].*:/` */\r\nfunction isCssPseudo(text) {\r\n return /^[\\t ]*[&.#%].*:/.test(text);\r\n}\r\nexports.isCssPseudo = isCssPseudo;\r\n/** `/^[\\t ]*[&.#%][\\w-]*(?!#)[\\t ]*\\{.*[;\\}][\\t ]*$/` */\r\nfunction isCssOneLiner(text) {\r\n return /^[\\t ]*[&.#%][\\w-]*(?!#)[\\t ]*\\{.*[;\\}][\\t ]*$/.test(text);\r\n}\r\nexports.isCssOneLiner = isCssOneLiner;\r\n/** `/^[\\t ]*::?[\\w\\-]+\\(.*\\)/` */\r\n// export function isPseudoWithParenthesis(text: string) {\r\n// return /^[\\t ]*::?[\\w\\-]+\\(.*\\)/.test(text);\r\n// }\r\n/** `/^[\\t ]*(\\/\\/|\\/\\*)/` */\r\nfunction isComment(text) {\r\n return /^[\\t ]*(\\/\\/|\\/\\*)/.test(text);\r\n}\r\nexports.isComment = isComment;\r\n/** `/^[\\t ]*(\\/\\*)/` */\r\nfunction isBlockCommentStart(text) {\r\n return /^[\\t ]*(\\/\\*)/.test(text);\r\n}\r\nexports.isBlockCommentStart = isBlockCommentStart;\r\n/** `/[\\t ]*(\\*\\/)/` */\r\nfunction isBlockCommentEnd(text) {\r\n return /[\\t ]*(\\*\\/)/.test(text);\r\n}\r\nexports.isBlockCommentEnd = isBlockCommentEnd;\r\n/** `/^[\\t ]*[\\.#%].* ?, *[\\.#%].*\\/` */\r\nfunction isMoreThanOneClassOrId(text) {\r\n return /^[\\t ]*[\\.#%].* ?, *[\\.#%].*/.test(text);\r\n}\r\nexports.isMoreThanOneClassOrId = isMoreThanOneClassOrId;\r\n/** `/^[\\t ]*[}{]+[\\t }{]*$/` */\r\nfunction isBracketOrWhitespace(text) {\r\n return /^[\\t ]*[}{]+[\\t }{]*$/.test(text);\r\n}\r\nexports.isBracketOrWhitespace = isBracketOrWhitespace;\r\n/** `/[\\t ]*@forward|[\\t ]*@use/` */\r\nfunction isAtForwardOrAtUse(text) {\r\n return /[\\t ]*@forward|[\\t ]*@use/.test(text);\r\n}\r\nexports.isAtForwardOrAtUse = isAtForwardOrAtUse;\r\nfunction isInterpolatedProperty(text) {\r\n return /^[\\t ]*[\\w-]*#\\{.*?\\}[\\w-]*:(?!:)/.test(text);\r\n}\r\nexports.isInterpolatedProperty = isInterpolatedProperty;\r\nfunction hasPropertyValueSpace(text) {\r\n return /^[\\t ]*([\\w ]+|[\\w ]*#\\{.*?\\}[\\w ]*): [^ ]/.test(text);\r\n}\r\nexports.hasPropertyValueSpace = hasPropertyValueSpace;\r\n/** returns the distance between the beginning and the first char. */\r\nfunction getDistance(text, tabSize) {\r\n var count = 0;\r\n for (var i = 0; i < text.length; i++) {\r\n var char = text[i];\r\n if (char !== ' ' && char !== '\\t') {\r\n break;\r\n }\r\n if (char === '\\t') {\r\n count += tabSize;\r\n }\r\n else {\r\n count++;\r\n }\r\n }\r\n return count;\r\n}\r\nexports.getDistance = getDistance;\r\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction HandleGetHex(type, color, options) {\n var isLong = color.b > 1 || color.g > 1 || color.r > 1;\n var alpha = Math.round(color.a > 1 ? color.a : color.a * 255).toString(16);\n var red = Math.round(isLong ? color.r : color.r * 255).toString(16);\n var green = Math.round(isLong ? color.g : color.g * 255).toString(16);\n var blue = Math.round(isLong ? color.b : color.b * 255).toString(16);\n if (options && options.UpperCaseHex) {\n alpha = alpha.toUpperCase();\n red = red.toUpperCase();\n green = green.toUpperCase();\n blue = blue.toUpperCase();\n }\n switch (type) {\n case 'hex':\n return \"#\" + (red.length === 1 ? '0' + red : red)\n .concat(green.length === 1 ? '0' + green : green)\n .concat(blue.length === 1 ? '0' + blue : blue)\n .concat(alpha.length === 1 ? '0' + alpha : alpha);\n case 'hex-short':\n return \"#\" + red\n .substring(0, 1)\n .concat(green.substring(0, 1))\n .concat(blue.substring(0, 1))\n .concat(alpha.substring(0, 1));\n case 'hex-without-alpha':\n return \"#\" + (red.length === 1 ? '0' + red : red)\n .concat(green.length === 1 ? '0' + green : green)\n .concat(blue.length === 1 ? '0' + blue : blue);\n case 'hex-without-alpha-short':\n return \"#\" + red\n .substring(0, 1)\n .concat(green.substring(0, 1))\n .concat(blue.substring(0, 1));\n }\n}\nexports.HandleGetHex = HandleGetHex;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction isValidHex(text) {\n return /^#[a-fA-F\\d]{3,4}$|^#[a-fA-F\\d]{6}$|^#[a-fA-F\\d]{8}$/.test(text);\n}\nexports.isValidHex = isValidHex;\nfunction isValidRGB(text) {\n return /rgba?\\([\\d. ]+[, ][\\d. ]+[, ][\\d. ]+([, ][\\d. ]+)?\\)/.test(text);\n}\nexports.isValidRGB = isValidRGB;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar regex_1 = require(\"./regex\");\nfunction isValidStringColor(input) {\n if (regex_1.isValidHex(input) || regex_1.isValidRGB(input)) {\n return input;\n }\n else {\n console.warn('[S.Color] Invalid String Input:', input);\n return null;\n }\n}\nexports.isValidStringColor = isValidStringColor;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar validators_1 = require(\"./validators\");\n/**\n * Represents a color in the rgb(a) format.\n *\n *\n * Range `[0 - 1]`\n */\nvar RGBColor = /** @class */ (function () {\n function RGBColor(r, g, b, a) {\n this.r = r;\n this.g = g;\n this.b = b;\n this.a = a !== undefined ? a : 1;\n }\n return RGBColor;\n}());\nexports.RGBColor = RGBColor;\n/**\n * Represents a color in the hsv(a) format.\n *\n *\n * Range `[h 0 - 360, v/s/a 0 - 1]`\n */\nvar HSVColor = /** @class */ (function () {\n function HSVColor(h, s, v, a) {\n this.h = h;\n this.s = s;\n this.v = v;\n this.a = a !== undefined ? a : 1;\n }\n return HSVColor;\n}());\nexports.HSVColor = HSVColor;\n/**\n * Represents a color in a string format.\n * Valid strings are `#000 | #0000 | #000000 | #00000000`\n * Or `rgb(0, 0, 0, 0) | rgba(0, 0, 0, 0, 0)` Range [rgb 0-255, a: 0-1]\n *\n */\nvar StringColor = /** @class */ (function () {\n function StringColor(color) {\n var newColor = validators_1.isValidStringColor(color);\n this.color = newColor !== null ? newColor : '#0000';\n }\n return StringColor;\n}());\nexports.StringColor = StringColor;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar validators_1 = require(\"./validators\");\nvar ColorTypes_1 = require(\"./ColorTypes\");\nfunction ConvertString(input, return255, alpha255) {\n if (validators_1.isValidStringColor(input)) {\n if (input.startsWith('#')) {\n return HandleConvertHexString(input, return255, alpha255);\n }\n else if (input.startsWith('rgb')) {\n return HandleConvertRgbString(input, return255);\n }\n }\n}\nexports.ConvertString = ConvertString;\n/**\n * **assumes that the input is valid**\n */\nfunction HandleConvertHexString(text, return255, alpha255) {\n var color = { red: 0, green: 0, blue: 0, alpha: 0 };\n var raw = text.replace('#', '');\n var length = raw.length;\n var modulo = length % 3;\n color.red =\n length > 4 ? parseInt(raw.substring(0, 2), 16) : parseInt(raw.substring(0, 1).concat(raw.substring(0, 1)), 16);\n color.green =\n length > 4 ? parseInt(raw.substring(2, 4), 16) : parseInt(raw.substring(1, 2).concat(raw.substring(1, 2)), 16);\n color.blue =\n length > 4 ? parseInt(raw.substring(4, 6), 16) : parseInt(raw.substring(2, 3).concat(raw.substring(2, 3)), 16);\n if (modulo) {\n color.alpha =\n length > 4\n ? parseInt(raw.substring(length - modulo, length), 16)\n : parseInt(raw.substring(length - modulo, length).concat(raw.substring(length - modulo, length)), 16);\n color.alpha = alpha255 ? color.alpha : color.alpha / 255;\n }\n else {\n color.alpha = 1;\n }\n return new ColorTypes_1.RGBColor(return255 ? color.red : color.red / 255, return255 ? color.green : color.green / 255, return255 ? color.blue : color.blue / 255, color.alpha);\n}\nexports.HandleConvertHexString = HandleConvertHexString;\n/**\n * **assumes that the input is valid**\n */\nfunction HandleConvertRgbString(text, return255) {\n var split = text.split(/,|\\b /g);\n return new ColorTypes_1.RGBColor(parseInt(split[0].replace(/\\D/g, '')) / (return255 ? 1 : 255), parseInt(split[1].replace(/\\D/g, '')) / (return255 ? 1 : 255), parseInt(split[2].replace(/\\D/g, '')) / (return255 ? 1 : 255), split[3] ? parseFloat(split[3].replace(/[^\\.\\d]/g, '')) : 1);\n}\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ColorConverters_1 = require(\"./ColorConverters\");\nvar ColorTypes_1 = require(\"./ColorTypes\");\n// TODO Add Description\nfunction GetReadableTextColor(color) {\n if (typeof color === 'string') {\n var rgb = ColorConverters_1.StringToRGB(color);\n return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000 > 0.5 ? '#000' : '#fff';\n }\n else if (color instanceof ColorTypes_1.StringColor) {\n var rgb = ColorConverters_1.StringToRGB(color.color);\n return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000 > 0.5 ? '#000' : '#fff';\n }\n else if (color instanceof ColorTypes_1.RGBColor) {\n var isLong = color.b > 1 || color.g > 1 || color.r > 1;\n var v = isLong ? 255 : 1;\n return (color.r * 299 + color.g * 587 + color.b * 114) / 1000 > 0.5\n ? new ColorTypes_1.RGBColor(0, 0, 0)\n : new ColorTypes_1.RGBColor(v, v, v);\n }\n else if (color instanceof ColorTypes_1.HSVColor) {\n var rgb = ColorConverters_1.HSVToRGB(color);\n return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000 > 0.5\n ? new ColorTypes_1.HSVColor(0, 0, 0)\n : new ColorTypes_1.HSVColor(0, 0, color.s > 1 || color.v > 1 ? 100 : 1);\n }\n}\nexports.GetReadableTextColor = GetReadableTextColor;\n/**\n * Shifts the hue of the `HSVColor` by the Value\n */\nfunction ShiftHue(hsv, value) {\n if (value > 360)\n value = value % 360;\n else if (value < 0)\n value = -(Math.abs(value) % 360);\n hsv.h = hsv.h + value <= 360 ? hsv.h + value : hsv.h + value - 360;\n return hsv;\n}\nexports.ShiftHue = ShiftHue;\n/**Returns the hex value of the color string or the input string */\nfunction convertCssColorToHex(color) {\n if (cssColors[color.toLowerCase()] !== undefined)\n return cssColors[color.toLowerCase()];\n return color;\n}\nexports.convertCssColorToHex = convertCssColorToHex;\nvar cssColors = {\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aqua: '#00ffff',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n black: '#000000',\n blanchedalmond: '#ffebcd',\n blue: '#0000ff',\n blueviolet: '#8a2be2',\n brown: '#a52a2a',\n burlywood: '#deb887',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n cyan: '#00ffff',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgreen: '#006400',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n fuchsia: '#ff00ff',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n gold: '#ffd700',\n goldenrod: '#daa520',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#adff2f',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n indianred: '#cd5c5c',\n indigo: '#4b0082',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n lavender: '#e6e6fa',\n lavenderblush: '#fff0f5',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrodyellow: '#fafad2',\n lightgrey: '#d3d3d3',\n lightgreen: '#90ee90',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n lime: '#00ff00',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n magenta: '#ff00ff',\n maroon: '#800000',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370d8',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n navy: '#000080',\n oldlace: '#fdf5e6',\n olive: '#808000',\n olivedrab: '#6b8e23',\n orange: '#ffa500',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#d87093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n pink: '#ffc0cb',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n purple: '#800080',\n rebeccapurple: '#663399',\n red: '#ff0000',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n silver: '#c0c0c0',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n steelblue: '#4682b4',\n tan: '#d2b48c',\n teal: '#008080',\n thistle: '#d8bfd8',\n tomato: '#ff6347',\n turquoise: '#40e0d0',\n violet: '#ee82ee',\n wheat: '#f5deb3',\n white: '#ffffff',\n whitesmoke: '#f5f5f5',\n yellow: '#ffff00',\n yellowgreen: '#9acd32'\n};\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ColorTypes_1 = require(\"./ColorTypes\");\nvar HandleSet_1 = require(\"./HandleSet\");\nvar validators_1 = require(\"./validators\");\nvar HandleGet_1 = require(\"./HandleGet\");\nvar utils_1 = require(\"./utils\");\n/**\n * Takes an `RGBColor` and converts it to `HSVColor`\n */\nfunction RGBToHSV(color, is255) {\n var isLong = is255 ? true : color.b > 1 || color.g > 1 || color.r > 1;\n if (isLong) {\n color = { a: color.a, b: color.b / 255, g: color.g / 255, r: color.r / 255 };\n }\n var cMax = Math.max(color.r, color.g, color.b);\n var cMin = Math.min(color.r, color.g, color.b);\n var diff = cMax - cMin;\n // Hue\n var hue = cMax === 1 && cMin === 1\n ? 0\n : cMax === 0 && cMin === 0\n ? 0\n : cMax === color.r\n ? (60 * ((color.g - color.b) / diff) + 360) % 360\n : cMax === color.g\n ? (60 * ((color.b - color.r) / diff) + 120) % 360\n : cMax === color.b\n ? (60 * ((color.r - color.g) / diff) + 240) % 360\n : 0;\n // Saturation\n var saturation;\n //\n if (cMax === 0) {\n saturation = 0;\n }\n else {\n saturation = (diff / cMax) * 100;\n }\n return new ColorTypes_1.HSVColor(hue ? hue : 0, saturation, cMax * 100, color.a);\n}\nexports.RGBToHSV = RGBToHSV;\n/**\n * Takes an `HSVColor` and converts it to `RGBColor`\n */\nfunction HSVToRGB(hsv, is100) {\n var isLong = is100 ? true : hsv.s > 1 || hsv.v > 1;\n if (isLong) {\n hsv = { a: hsv.a, h: hsv.h, s: hsv.s / 100, v: hsv.v / 100 };\n }\n var f = function (n, k) {\n if (k === void 0) { k = (n + hsv.h / 60) % 6; }\n return hsv.v - hsv.v * hsv.s * Math.max(Math.min(k, 4 - k, 1), 0);\n };\n if (isLong) {\n return new ColorTypes_1.RGBColor(f(5) * 255, f(3) * 255, f(1) * 255, hsv.a);\n }\n else {\n return new ColorTypes_1.RGBColor(f(5), f(3), f(1), hsv.a);\n }\n}\nexports.HSVToRGB = HSVToRGB;\n/**\n * Takes an `StringColor` and converts it to `RGBColor`,\n * If input string is invalid `null` will be returned.\n */\nfunction StringToRGB(input, return255, alpha255) {\n input = utils_1.convertCssColorToHex(input);\n if (validators_1.isValidStringColor(input)) {\n return HandleSet_1.ConvertString(input, return255, alpha255);\n }\n return null;\n}\nexports.StringToRGB = StringToRGB;\n/**\n * Takes an `StringColor` and converts it to `HSVColor`,\n * If input string is invalid `null` will be returned.\n */\nfunction StringToHVS(input, return255, alpha255) {\n input = utils_1.convertCssColorToHex(input);\n if (validators_1.isValidStringColor(input)) {\n return RGBToHSV(HandleSet_1.ConvertString(input, return255, alpha255));\n }\n return null;\n}\nexports.StringToHVS = StringToHVS;\n/**\n * Takes an `HSVColor` and converts it to `String` (HEX Format)\n */\nfunction HSVToHEX(hsv, options) {\n if (hsv.s > 1 || hsv.v > 1 || (options && options.isLong)) {\n hsv.s = hsv.s / 100;\n hsv.v = hsv.v / 100;\n }\n var f = function (n, k) {\n if (k === void 0) { k = (n + hsv.h / 60) % 6; }\n return hsv.v - hsv.v * hsv.s * Math.max(Math.min(k, 4 - k, 1), 0);\n };\n return HandleGet_1.HandleGetHex(options && options.type ? options.type : 'hex', {\n r: f(5),\n g: f(3),\n b: f(1),\n a: hsv.a\n });\n}\nexports.HSVToHEX = HSVToHEX;\n/**\n * Takes an `RGBColor` and converts it to `String` (HEX Format)\n */\nfunction RGBToHEX(color, type) {\n return HandleGet_1.HandleGetHex(type ? type : 'hex', {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n });\n}\nexports.RGBToHEX = RGBToHEX;\n", "\"use strict\";\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar HandleGet_1 = require(\"./HandleGet\");\nvar HandleSet_1 = require(\"./HandleSet\");\nvar ColorTypes_1 = require(\"./ColorTypes\");\nvar ColorConverters_1 = require(\"./ColorConverters\");\n__export(require(\"./ColorTypes\"));\n__export(require(\"./ColorConverters\"));\n__export(require(\"./regex\"));\n__export(require(\"./validators\"));\n__export(require(\"./utils\"));\nvar Color = /** @class */ (function () {\n function Color(input) {\n this.Set(input);\n }\n Color.prototype.Get = function (type, options) {\n if (type !== undefined) {\n if (type.startsWith('hex')) {\n return HandleGet_1.HandleGetHex(type, this.color, options);\n }\n else {\n switch (type) {\n case 'rgb':\n return \"rgb(\" + Math.round(this.color.r * 255) + \", \" + Math.round(this.color.g * 255) + \", \" + Math.round(this.color.b * 255) + \")\";\n case 'rgba':\n return \"rgba(\" + Math.round(this.color.r * 255) + \", \" + Math.round(this.color.g * 255) + \", \" + Math.round(this.color.b * 255) + \", \" + this.color.a.toFixed(2).toString() + \")\";\n case 'object':\n return this.color;\n case 'hsv':\n return ColorConverters_1.RGBToHSV(this.color);\n }\n }\n }\n else {\n return this.color;\n }\n };\n Color.prototype.Set = function (input) {\n if (typeof input === 'object') {\n this.color = new ColorTypes_1.RGBColor(input.r === undefined ? 1 : input.r > 1 ? input.r / 255 : input.r, input.g === undefined ? 1 : input.g > 1 ? input.g / 255 : input.g, input.b === undefined ? 1 : input.b > 1 ? input.b / 255 : input.b, input.a === undefined ? 1 : input.a > 1 ? input.a / 255 : input.a);\n }\n else if (typeof input === 'string') {\n var tempColor = HandleSet_1.ConvertString(input);\n this.color = tempColor === null ? this.color : tempColor;\n }\n else {\n this.color = new ColorTypes_1.RGBColor(0, 0, 0, 0);\n }\n };\n return Color;\n}());\nexports.default = Color;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.addReset = exports.getColumn = exports.pad = exports.removeNodeStyles = exports.maxTableColumnLength = exports.ANSICodes = exports.stringColorToAnsiColor = exports.SetLoggerEnvironment = exports.defaultLogTableOptions = exports.isBrowser = void 0;\nvar s_color_1 = require(\"s.color\");\nexports.isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';\nexports.defaultLogTableOptions = { padding: 0, spacing: 1 };\n/**\n * Can be used to change the assumed environment\n */\nfunction SetLoggerEnvironment(env) {\n exports.isBrowser = env === 'browser';\n}\nexports.SetLoggerEnvironment = SetLoggerEnvironment;\nfunction stringColorToAnsiColor(type, color) {\n if (!color) {\n return undefined;\n }\n var _a = s_color_1.StringToRGB(color, true), r = _a.r, g = _a.g, b = _a.b;\n return ANSICodes(type) + \";2;\" + r + \";\" + g + \";\" + b + \";\";\n}\nexports.stringColorToAnsiColor = stringColorToAnsiColor;\nfunction ANSICodes(type) {\n switch (type) {\n case 'reset':\n return '0';\n case 'bold':\n return '1';\n case 'color':\n return '38';\n case 'background':\n return '48';\n }\n}\nexports.ANSICodes = ANSICodes;\nfunction maxTableColumnLength(column) {\n var max = 0;\n for (var i = 0; i < column.length; i++) {\n var field = column[i];\n if (field) {\n var length_1 = removeNodeStyles(typeof field === 'object' ? field.message : field).length;\n max = length_1 > max ? length_1 : max;\n }\n }\n return max;\n}\nexports.maxTableColumnLength = maxTableColumnLength;\nfunction removeNodeStyles(item) {\n return item.toString().replace(/[\\033\\x1b\\u001b]\\[.*?m/g, '');\n}\nexports.removeNodeStyles = removeNodeStyles;\nfunction pad(text, start, end) {\n var space = function (amount) { return ' '.repeat(amount); };\n return \"\" + space(start) + text + space(end);\n}\nexports.pad = pad;\nfunction getColumn(matrix, col) {\n return matrix.map(function (row) { return row[col]; });\n}\nexports.getColumn = getColumn;\nfunction addReset(input) {\n return input + \"\\u001B[0m\";\n}\nexports.addReset = addReset;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.transformToBrowserStyle = exports.transformToNodeStyle = void 0;\nvar utils_1 = require(\"./utils\");\nfunction transformToNodeStyle(style) {\n if (typeof style === 'string') {\n return \"\\u001B[\" + handleUndefined(utils_1.stringColorToAnsiColor('color', style)).replace(/;$/, '') + \"m\";\n }\n else {\n var codes = \"\" + addBoldStyle(style) + handleUndefined(utils_1.stringColorToAnsiColor('color', style.color)) + handleUndefined(utils_1.stringColorToAnsiColor('background', style.background));\n return \"\\u001B[\" + codes.replace(/;$/, '') + \"m\";\n }\n}\nexports.transformToNodeStyle = transformToNodeStyle;\nfunction addBoldStyle(style) {\n return style['font-weight'] === 'bold' ? utils_1.ANSICodes('bold') + \";\" : '';\n}\nfunction handleUndefined(input) {\n return input ? input : '';\n}\nfunction transformToBrowserStyle(style) {\n if (style == undefined)\n return '';\n if (typeof style === 'string') {\n return \"color: \" + style + \";\";\n }\n var out = '';\n if (!('display' in style)) {\n out += \"display: inline-block; \";\n }\n for (var key in style) {\n if (Object.prototype.hasOwnProperty.call(style, key)) {\n out += key + \": \" + style[key] + \"; \";\n }\n }\n return out;\n}\nexports.transformToBrowserStyle = transformToBrowserStyle;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.styler = void 0;\nvar transformStyles_1 = require(\"./transformStyles\");\nvar utils_1 = require(\"./utils\");\n/**\n * this function is not browser compatible*.\n * @example ```ts\n * console.log(styler('test', 'red'))\n * ```\n *\n * *you have to add the styles manually, use the Log function for browser compatibly.\n */\nfunction styler(input, style) {\n if (utils_1.isBrowser) {\n return \"%c\" + input;\n }\n if (style) {\n return utils_1.addReset(\"\" + transformStyles_1.transformToNodeStyle(style) + input);\n }\n return input;\n}\nexports.styler = styler;\n", "\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __spreadArrays = (this && this.__spreadArrays) || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LogSingle = exports.LogS = exports.LogTable = exports.Log = void 0;\nvar utils_1 = require(\"./utils\");\nvar _1 = require(\".\");\nvar transformStyles_1 = require(\"./transformStyles\");\n/**works in node and the browser.*/\nfunction Log() {\n var messages = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n messages[_i] = arguments[_i];\n }\n var output = '';\n var browserStyles = [];\n for (var i = 0; i < messages.length; i++) {\n var msg = messages[i];\n if (typeof msg === 'object') {\n if (utils_1.isBrowser) {\n var style = transformStyles_1.transformToBrowserStyle(msg.style);\n if (style)\n browserStyles.push(style);\n }\n output += _1.styler(msg.message, msg.style);\n }\n else {\n output += msg;\n }\n if (i < messages.length - 1) {\n output += ' ';\n }\n }\n console.log.apply(console, __spreadArrays([output], browserStyles));\n}\nexports.Log = Log;\n/**node only*/\nfunction LogTable(table, options) {\n if (options === void 0) { options = utils_1.defaultLogTableOptions; }\n if (table[0] === undefined)\n return;\n var _a = __assign(__assign({}, utils_1.defaultLogTableOptions), options), padding = _a.padding, spacing = _a.spacing;\n var output = '';\n var maxLengths = [];\n for (var i = 0; i < table[0].length; i++) {\n var column = utils_1.getColumn(table, i);\n maxLengths.push(utils_1.maxTableColumnLength(column));\n }\n for (var i = 0; i < table.length; i++) {\n var row = table[i];\n for (var j = 0; j < row.length; j++) {\n var field = row[j];\n var text = '';\n var style = void 0;\n if (typeof field === 'object') {\n style = field.style;\n text = field.message;\n }\n else {\n text = field.toString();\n }\n var startPadding = j === 0 ? padding : 0;\n var endPadding = maxLengths[j] + (j === row.length - 1 ? padding : spacing);\n var textLength = utils_1.removeNodeStyles(text).length;\n var paddedText = utils_1.pad(text, startPadding, endPadding - textLength);\n if (style) {\n output += _1.styler(paddedText, style);\n }\n else {\n output += paddedText;\n }\n }\n output += '\\n';\n }\n console.log(output.replace(/\\n$/, ''));\n}\nexports.LogTable = LogTable;\n/**works in the browser and node. */\nfunction LogS(styles) {\n var messages = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n messages[_i - 1] = arguments[_i];\n }\n var browserStyles = [];\n var output = '';\n for (var i = 0; i < messages.length; i++) {\n var msg = messages[i];\n if (utils_1.isBrowser) {\n var style = transformStyles_1.transformToBrowserStyle(styles[i]);\n if (style)\n browserStyles.push(style);\n }\n output += _1.styler(msg, styles[i]);\n if (i < messages.length - 1) {\n output += ' ';\n }\n }\n console.log.apply(console, __spreadArrays([output], browserStyles));\n}\nexports.LogS = LogS;\n/**Log a single message with an optional style, works in the browser and node. */\nfunction LogSingle(message, style) {\n var output = _1.styler(message, style);\n if (utils_1.isBrowser) {\n console.log(output, transformStyles_1.transformToBrowserStyle(style) || '');\n return;\n }\n console.log(output);\n}\nexports.LogSingle = LogSingle;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n", "\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar utils_1 = require(\"./utils\");\nObject.defineProperty(exports, \"SetEnvironment\", { enumerable: true, get: function () { return utils_1.SetLoggerEnvironment; } });\nObject.defineProperty(exports, \"ANSICodes\", { enumerable: true, get: function () { return utils_1.ANSICodes; } });\nObject.defineProperty(exports, \"removeNodeStyles\", { enumerable: true, get: function () { return utils_1.removeNodeStyles; } });\nvar styler_1 = require(\"./styler\");\nObject.defineProperty(exports, \"styler\", { enumerable: true, get: function () { return styler_1.styler; } });\n__exportStar(require(\"./loggers\"), exports);\n__exportStar(require(\"./interfaces\"), exports);\n__exportStar(require(\"./transformStyles\"), exports);\n", "\"use strict\";\r\nexports.__esModule = true;\r\nexports.PushDebugInfo = exports.SetConvertData = exports.SetDebugLOCAL_CONTEXT = exports.ResetDebugLog = exports.LogDebugResult = void 0;\r\nvar suf_log_1 = require(\"suf-log\");\r\nsuf_log_1.SetEnvironment('node');\r\nvar colon = suf_log_1.styler(':', '#777');\r\n// const quote = styler('\"', '#f64');\r\nvar pipe = suf_log_1.styler('|', '#f64');\r\nvar TEXT = function (text) { return suf_log_1.styler(text, '#eee'); };\r\nvar NUMBER = function (number) { return suf_log_1.styler(number.toString(), '#f03'); };\r\nvar BOOL = function (bool) { return suf_log_1.styler(bool.toString(), bool ? '#4f6' : '#f03'); };\r\nfunction LogDebugResult(result) {\r\n var data = StoreLog.logs;\r\n var out = suf_log_1.styler('FORMAT', { \"font-weight\": 'bold', color: '#0af' });\r\n for (var i = 0; i < data.length; i++) {\r\n out += '\\n';\r\n out += InfoLogHelper(data[i]);\r\n }\r\n out += \"\\n\" + pipe + suf_log_1.styler(replaceWhitespace(result.replace(/\\n/g, '|\\n|')), '#c76') + pipe;\r\n console.log(out);\r\n}\r\nexports.LogDebugResult = LogDebugResult;\r\nfunction ResetDebugLog() {\r\n StoreLog.reset();\r\n}\r\nexports.ResetDebugLog = ResetDebugLog;\r\nvar StoreLog = /** @class */ (function () {\r\n function StoreLog() {\r\n }\r\n StoreLog.resetTemp = function () {\r\n this.tempConvertData = undefined;\r\n this.tempLOCAL_CONTEXT = undefined;\r\n };\r\n StoreLog.reset = function () {\r\n this.resetTemp();\r\n this.logs = [];\r\n };\r\n StoreLog.logs = [];\r\n return StoreLog;\r\n}());\r\nfunction SetDebugLOCAL_CONTEXT(data) {\r\n StoreLog.tempLOCAL_CONTEXT = data;\r\n}\r\nexports.SetDebugLOCAL_CONTEXT = SetDebugLOCAL_CONTEXT;\r\nfunction SetConvertData(data) {\r\n StoreLog.tempConvertData = data;\r\n}\r\nexports.SetConvertData = SetConvertData;\r\nfunction PushDebugInfo(info) {\r\n if (info.debug) {\r\n StoreLog.logs.push({\r\n info: info,\r\n convertData: StoreLog.tempConvertData,\r\n LOCAL_CONTEXT: StoreLog.tempLOCAL_CONTEXT\r\n });\r\n }\r\n StoreLog.resetTemp();\r\n}\r\nexports.PushDebugInfo = PushDebugInfo;\r\nfunction InfoLogHelper(data) {\r\n var convertData = data.convertData, info = data.info, LOCAL_CONTEXT = data.LOCAL_CONTEXT;\r\n var notProvided = null;\r\n var title = suf_log_1.styler(info.title, '#cc0');\r\n var lineNumber = \"\" + TEXT('Line Number') + colon + \" \" + NUMBER(info.lineNumber);\r\n var offset = info.offset !== undefined ? \"\" + TEXT('Offset') + colon + \" \" + NUMBER(info.offset) : '';\r\n var originalOffset = info.originalOffset !== undefined ? \"\" + TEXT('Original Offset') + colon + \" \" + NUMBER(info.originalOffset) : '';\r\n var nextLine = info.nextLine !== undefined\r\n ? JSON.stringify(info.nextLine)\r\n .replace(/[{}]/g, '')\r\n .replace(/:/g, ': ')\r\n .replace(/,/g, ', ')\r\n .replace(/\".*?\"/g, function (s) {\r\n return suf_log_1.styler(s, '#c76');\r\n })\r\n : notProvided;\r\n var replace = info.replaceSpaceOrTabs !== undefined ? BOOL(info.replaceSpaceOrTabs) : notProvided;\r\n var CONVERT = convertData\r\n ? \"\\n \" + TEXT('Convert') + \" \" + colon + \" \" + suf_log_1.styler(convertData.type, '#f64')\r\n : '';\r\n var newText = info.newLineText ? \"\\n \" + TEXT('New') + \" \" + colon + \" \" + suf_log_1.styler(replaceWhitespace(info.newLineText.replace(/\\n/g, '\\\\n')), '#0af') : '';\r\n switch (info.newLineText) {\r\n case 'DELETED':\r\n return \" \" + title + \" \" + lineNumber + \" \" + TEXT('Next Line') + colon + \" \" + nextLine;\r\n case 'NEWLINE':\r\n case 'NULL':\r\n return \" \" + title + \" \" + lineNumber;\r\n default:\r\n var data_1 = '';\r\n data_1 +=\r\n nextLine !== null ? \"\\n \" + TEXT('Next Line') + \" \" + colon + \" \" + nextLine : '';\r\n data_1 +=\r\n replace !== null ? \"\\n \" + TEXT('Replace') + \" \" + colon + \" \" + replace : '';\r\n if (LOCAL_CONTEXT) {\r\n data_1 += \"\\n \" + suf_log_1.styler('LOCAL_CONTEXT', '#f64') + \" \" + suf_log_1.styler('{', '#777');\r\n for (var key in LOCAL_CONTEXT) {\r\n if (Object.prototype.hasOwnProperty.call(LOCAL_CONTEXT, key)) {\r\n var val = LOCAL_CONTEXT[key];\r\n data_1 += \"\\n \" + suf_log_1.styler(key, '#777') + colon + \" \" + parseValue(val);\r\n }\r\n }\r\n data_1 += suf_log_1.styler('\\n }', '#777');\r\n }\r\n return \" \" + title + \" \" + lineNumber + \" \" + offset + \" \" + originalOffset + \"\\n \" + TEXT('Old') + \" \" + colon + \" \" + suf_log_1.styler(replaceWhitespace(info.oldLineText), '#d75') + newText + CONVERT + data_1;\r\n }\r\n}\r\nfunction replaceWhitespace(text) {\r\n return text.replace(/ /g, '\u00B7').replace(/\\t/g, '\u27F6');\r\n}\r\nfunction parseValue(val) {\r\n var type = typeof val;\r\n if (type === 'boolean') {\r\n return BOOL(val);\r\n }\r\n else if (type === 'string') {\r\n return suf_log_1.styler(val, '#f64');\r\n }\r\n else if (type === 'object') {\r\n return suf_log_1.styler(JSON.stringify(val), '#0af');\r\n }\r\n return val;\r\n}\r\n", "\"use strict\";\r\nexports.__esModule = true;\r\nexports.isKeyframePointAndSetIndentation = exports.convertLine = exports.replaceSpacesOrTabs = exports.getIndentationOffset = exports.replaceWithOffset = exports.getBlockHeaderOffset = void 0;\r\nvar regex_1 = require(\"./regex/regex\");\r\n/** returns the relative distance that the class or id should be at. */\r\nfunction getBlockHeaderOffset(distance, tabSize, current, ignoreCurrent) {\r\n if (distance === 0) {\r\n return 0;\r\n }\r\n if (tabSize * Math.round(distance / tabSize - 0.1) > current && !ignoreCurrent) {\r\n return current - distance;\r\n }\r\n return tabSize * Math.round(distance / tabSize - 0.1) - distance;\r\n}\r\nexports.getBlockHeaderOffset = getBlockHeaderOffset;\r\n/**\r\n * adds or removes whitespace based on the given offset, a positive value adds whitespace a negative value removes it.\r\n */\r\nfunction replaceWithOffset(text, offset, STATE) {\r\n if (offset < 0) {\r\n text = text\r\n .replace(/\\t/g, ' '.repeat(STATE.CONFIG.tabSize))\r\n .replace(new RegExp(\"^ {\" + Math.abs(offset) + \"}\"), '');\r\n if (!STATE.CONFIG.insertSpaces) {\r\n text = replaceSpacesOrTabs(text, STATE, false);\r\n }\r\n }\r\n else {\r\n text = text.replace(/^/, STATE.CONFIG.insertSpaces ? ' '.repeat(offset) : '\\t'.repeat(offset / STATE.CONFIG.tabSize));\r\n }\r\n return text;\r\n}\r\nexports.replaceWithOffset = replaceWithOffset;\r\n/** returns the difference between the current indentation and the indentation of the given text. */\r\nfunction getIndentationOffset(text, indentation, tabSize) {\r\n var distance = regex_1.getDistance(text, tabSize);\r\n return { offset: indentation - distance, distance: distance };\r\n}\r\nexports.getIndentationOffset = getIndentationOffset;\r\nfunction isKeyframePoint(text, isAtKeyframe) {\r\n if (isAtKeyframe === false) {\r\n return false;\r\n }\r\n return /^[\\t ]*\\d+%/.test(text) || /^[\\t ]*from[\\t ]*$|^[\\t ]*to[\\t ]*$/.test(text);\r\n}\r\nfunction replaceSpacesOrTabs(text, STATE, insertSpaces) {\r\n if (insertSpaces !== undefined ? insertSpaces : STATE.CONFIG.insertSpaces) {\r\n return text.replace(/\\t/g, ' '.repeat(STATE.CONFIG.tabSize));\r\n }\r\n else {\r\n return text.replace(new RegExp(' '.repeat(STATE.CONFIG.tabSize), 'g'), '\\t');\r\n }\r\n}\r\nexports.replaceSpacesOrTabs = replaceSpacesOrTabs;\r\nfunction convertLine(line, STATE) {\r\n return (STATE.CONFIG.convert &&\r\n regex_1.isScssOrCss(line.get()) &&\r\n !regex_1.isComment(line.get()));\r\n}\r\nexports.convertLine = convertLine;\r\nfunction isKeyframePointAndSetIndentation(line, STATE) {\r\n var isAtKeyframesPoint = isKeyframePoint(line.get(), STATE.CONTEXT.keyframes.isIn);\r\n if (STATE.CONTEXT.keyframes.isIn && isAtKeyframesPoint) {\r\n STATE.CONTEXT.indentation = Math.max(0, STATE.CONTEXT.keyframes.indentation);\r\n }\r\n return isAtKeyframesPoint;\r\n}\r\nexports.isKeyframePointAndSetIndentation = isKeyframePointAndSetIndentation;\r\n", "\"use strict\";\r\nexports.__esModule = true;\r\nexports.setPropertyValueSpaces = exports.FormatProperty = void 0;\r\nvar logger_1 = require(\"../logger\");\r\nvar regex_1 = require(\"../regex/regex\");\r\nvar utility_1 = require(\"../utility\");\r\nvar format_convert_1 = require(\"./format.convert\");\r\nfunction FormatProperty(line, STATE) {\r\n var convert = false;\r\n var replaceSpaceOrTabs = false;\r\n var edit = line.get();\r\n var isComment = regex_1.isComment(line.get());\r\n line.set(setPropertyValueSpaces(STATE, line.get()));\r\n if (utility_1.convertLine(line, STATE)) {\r\n var convertRes = format_convert_1.convertScssOrCss(line.get(), STATE);\r\n line.set(convertRes.text);\r\n convert = true;\r\n }\r\n // Set Context Vars\r\n STATE.CONTEXT.convert.wasLastLineCss = convert;\r\n var move = STATE.LOCAL_CONTEXT.indentation.offset !== 0 && !isComment;\r\n if (!move && canReplaceSpacesOrTabs(STATE, line.get())) {\r\n line.set(utility_1.replaceSpacesOrTabs(line.get(), STATE).trimRight());\r\n replaceSpaceOrTabs = true;\r\n }\r\n // Return\r\n if (move) {\r\n var offset = STATE.LOCAL_CONTEXT.indentation.offset;\r\n var distance = STATE.LOCAL_CONTEXT.indentation.distance;\r\n if (STATE.CONTEXT.wasLastHeaderIncludeMixin || STATE.CONTEXT.wasLastHeaderNestedProp) {\r\n if (distance >= STATE.CONTEXT.indentation - STATE.CONFIG.tabSize) {\r\n offset = utility_1.getBlockHeaderOffset(distance, STATE.CONFIG.tabSize, STATE.CONTEXT.indentation, false);\r\n }\r\n else {\r\n offset = (STATE.CONTEXT.indentation - STATE.CONFIG.tabSize) - distance;\r\n STATE.CONTEXT.wasLastHeaderIncludeMixin = false;\r\n STATE.CONTEXT.wasLastHeaderNestedProp = false;\r\n STATE.CONTEXT.indentation = STATE.CONTEXT.indentation - STATE.CONFIG.tabSize;\r\n }\r\n }\r\n else if (STATE.LOCAL_CONTEXT.isVariable || STATE.LOCAL_CONTEXT.isImport) {\r\n offset = utility_1.getBlockHeaderOffset(distance, STATE.CONFIG.tabSize, STATE.CONTEXT.indentation, false);\r\n }\r\n edit = utility_1.replaceWithOffset(line.get(), offset, STATE).trimRight();\r\n logger_1.PushDebugInfo({\r\n title: 'PROPERTY: MOVE',\r\n lineNumber: STATE.currentLine,\r\n oldLineText: STATE.lines[STATE.currentLine],\r\n newLineText: edit,\r\n debug: STATE.CONFIG.debug,\r\n offset: offset,\r\n originalOffset: STATE.LOCAL_CONTEXT.indentation.offset,\r\n replaceSpaceOrTabs: replaceSpaceOrTabs\r\n });\r\n }\r\n else {\r\n edit = line.get().trimRight();\r\n logger_1.PushDebugInfo({\r\n title: 'PROPERTY: DEFAULT',\r\n lineNumber: STATE.currentLine,\r\n oldLineText: STATE.lines[STATE.currentLine],\r\n newLineText: edit,\r\n debug: STATE.CONFIG.debug,\r\n replaceSpaceOrTabs: replaceSpaceOrTabs\r\n });\r\n }\r\n if (STATE.CONTEXT.keyframes.isIn && STATE.LOCAL_CONTEXT.isAtKeyframesPoint) {\r\n STATE.CONTEXT.indentation = Math.max(0, STATE.CONTEXT.indentation + STATE.CONFIG.tabSize);\r\n }\r\n return edit;\r\n}\r\nexports.FormatProperty = FormatProperty;\r\nfunction canReplaceSpacesOrTabs(STATE, text) {\r\n return STATE.CONFIG.insertSpaces\r\n ? /\\t/g.test(text)\r\n : new RegExp(' '.repeat(STATE.CONFIG.tabSize), 'g').test(text);\r\n}\r\nfunction setPropertyValueSpaces(STATE, text) {\r\n if (text &&\r\n (!STATE.LOCAL_CONTEXT.isHtmlTag &&\r\n (STATE.LOCAL_CONTEXT.isProp || STATE.LOCAL_CONTEXT.isInterpolatedProp || STATE.LOCAL_CONTEXT.isVariable) &&\r\n STATE.CONFIG.setPropertySpace)) {\r\n var newPropValue = '';\r\n var _a = text.split(/:(.*)/), propName = _a[0], propValue = _a[1];\r\n var wasLastCharSpace = true;\r\n for (var i = 0; i < propValue.length; i++) {\r\n var char = propValue[i];\r\n switch (char) {\r\n case ' ':\r\n if (!wasLastCharSpace) {\r\n newPropValue += char;\r\n wasLastCharSpace = true;\r\n }\r\n break;\r\n case '.':\r\n wasLastCharSpace = true;\r\n newPropValue += char;\r\n break;\r\n default:\r\n wasLastCharSpace = false;\r\n newPropValue += char;\r\n break;\r\n }\r\n }\r\n return propName.trimEnd() + \":\" + (propValue ? ' ' + newPropValue : '');\r\n }\r\n return text;\r\n}\r\nexports.setPropertyValueSpaces = setPropertyValueSpaces;\r\n", "\"use strict\";\r\nexports.__esModule = true;\r\nexports.convertScssOrCss = void 0;\r\nvar regex_1 = require(\"../regex/regex\");\r\nvar logger_1 = require(\"../logger\");\r\nvar utility_1 = require(\"../utility\");\r\nvar format_property_1 = require(\"./format.property\");\r\n/** converts scss/css to sass. */\r\nfunction convertScssOrCss(text, STATE) {\r\n var isMultiple = regex_1.isMoreThanOneClassOrId(text);\r\n var lastSelector = STATE.CONTEXT.convert.lastSelector;\r\n // if NOT interpolated class, id or partial\r\n if (!/[\\t ]*[#.%]\\{.*?}/.test(text)) {\r\n if (lastSelector && new RegExp('^.*' + regex_1.escapeRegExp(lastSelector)).test(text)) {\r\n /*istanbul ignore if */\r\n if (STATE.CONFIG.debug)\r\n logger_1.SetConvertData({ type: 'LAST SELECTOR', text: text });\r\n return {\r\n lastSelector: lastSelector,\r\n text: utility_1.replaceWithOffset(removeInvalidChars(text.replaceAll(lastSelector, '&')).trimEnd(), STATE.CONFIG.tabSize, STATE)\r\n };\r\n }\r\n else if (regex_1.isCssOneLiner(text)) {\r\n /*istanbul ignore if */\r\n if (STATE.CONFIG.debug)\r\n logger_1.SetConvertData({ type: 'ONE LINER', text: text });\r\n var split = text.split('{');\r\n var properties = split[1].split(';');\r\n // Set isProp to true so that it Sets the property space.\r\n STATE.LOCAL_CONTEXT.isProp = true;\r\n var selector = split[0].trim();\r\n return {\r\n lastSelector: selector,\r\n text: selector.concat('\\n', properties\r\n .map(function (v) {\r\n return utility_1.replaceWithOffset(format_property_1.setPropertyValueSpaces(STATE, removeInvalidChars(v)).trim(), STATE.CONFIG.tabSize, STATE);\r\n })\r\n .join('\\n')).trimEnd()\r\n };\r\n }\r\n else if (regex_1.isCssPseudo(text) && !isMultiple) {\r\n /*istanbul ignore if */\r\n if (STATE.CONFIG.debug)\r\n logger_1.SetConvertData({ type: 'PSEUDO', text: text });\r\n return {\r\n lastSelector: lastSelector,\r\n text: removeInvalidChars(text).trimEnd()\r\n };\r\n }\r\n else if (regex_1.isCssSelector(text)) {\r\n /*istanbul ignore if */\r\n if (STATE.CONFIG.debug)\r\n logger_1.SetConvertData({ type: 'SELECTOR', text: text });\r\n lastSelector = removeInvalidChars(text).trimEnd();\r\n return { text: lastSelector, lastSelector: lastSelector };\r\n }\r\n }\r\n /*istanbul ignore if */\r\n if (STATE.CONFIG.debug)\r\n logger_1.SetConvertData({ type: 'DEFAULT', text: text });\r\n return { text: removeInvalidChars(text).trimEnd(), lastSelector: lastSelector };\r\n}\r\nexports.convertScssOrCss = convertScssOrCss;\r\nfunction removeInvalidChars(text) {\r\n var newText = '';\r\n var isInQuotes = false;\r\n var isInComment = false;\r\n var isInInterpolation = false;\r\n var quoteChar = '';\r\n for (var i = 0; i < text.length; i++) {\r\n var char = text[i];\r\n if (!isInQuotes && char === '/' && text[i + 1] === '/') {\r\n isInComment = true;\r\n }\r\n else if (/['\"]/.test(char)) {\r\n if (!isInQuotes || char === quoteChar) {\r\n isInQuotes = !isInQuotes;\r\n if (isInQuotes) {\r\n quoteChar = char;\r\n }\r\n }\r\n }\r\n else if (/#/.test(char) && /{/.test(text[i + 1])) {\r\n isInInterpolation = true;\r\n }\r\n else if (isInInterpolation && /}/.test(text[i - 1])) {\r\n isInInterpolation = false;\r\n }\r\n if (!/[;\\{\\}]/.test(char) || isInQuotes || isInComment || isInInterpolation) {\r\n newText += char;\r\n }\r\n }\r\n return newText;\r\n}\r\n", "\"use strict\";\r\nexports.__esModule = true;\r\nexports.FormatAtForwardOrAtUse = void 0;\r\nvar format_convert_1 = require(\"./format.convert\");\r\nvar utility_1 = require(\"../utility\");\r\nvar logger_1 = require(\"../logger\");\r\nfunction FormatAtForwardOrAtUse(line, STATE) {\r\n if (utility_1.convertLine(line, STATE)) {\r\n var convertRes = format_convert_1.convertScssOrCss(line.get(), STATE);\r\n line.set(convertRes.text);\r\n }\r\n line.set(line.get().trimStart());\r\n logger_1.PushDebugInfo({\r\n title: '@forward or @use',\r\n lineNumber: STATE.currentLine,\r\n oldLineText: STATE.lines[STATE.currentLine],\r\n newLineText: line.get(),\r\n debug: STATE.CONFIG.debug\r\n });\r\n return line.get();\r\n}\r\nexports.FormatAtForwardOrAtUse = FormatAtForwardOrAtUse;\r\n", "\"use strict\";\r\nexports.__esModule = true;\r\nexports.FormatHandleBlockComment = void 0;\r\nvar utility_1 = require(\"../utility\");\r\nfunction FormatHandleBlockComment(text, STATE) {\r\n if (/^[\\t ]*\\/\\*/.test(text)) {\r\n return utility_1.replaceSpacesOrTabs(text, STATE);\r\n }\r\n return utility_1.replaceWithOffset(text, utility_1.getIndentationOffset(text, STATE.CONTEXT.blockCommentDistance + 1, STATE.CONFIG.tabSize).offset, STATE);\r\n}\r\nexports.FormatHandleBlockComment = FormatHandleBlockComment;\r\n", "\"use strict\";\r\nexports.__esModule = true;\r\nexports.FormatBlockHeader = void 0;\r\nvar logger_1 = require(\"../logger\");\r\nvar regex_1 = require(\"../regex/regex\");\r\nvar utility_1 = require(\"../utility\");\r\nvar format_convert_1 = require(\"./format.convert\");\r\nfunction FormatBlockHeader(line, STATE) {\r\n var replaceSpaceOrTabs = false;\r\n var hasBeenConverted = false;\r\n var edit = line.get();\r\n // First Convert then set Offset.\r\n if (STATE.CONFIG.convert &&\r\n regex_1.isScssOrCss(line.get()) &&\r\n !regex_1.isComment(line.get())) {\r\n var convertRes = format_convert_1.convertScssOrCss(line.get(), STATE);\r\n STATE.CONTEXT.convert.lastSelector = convertRes.lastSelector;\r\n line.set(convertRes.text);\r\n STATE.LOCAL_CONTEXT.indentation = utility_1.getIndentationOffset(line.get(), STATE.CONTEXT.indentation, STATE.CONFIG.tabSize);\r\n hasBeenConverted = true;\r\n }\r\n // Set offset.\r\n var offset = STATE.LOCAL_CONTEXT.isAdjacentSelector && STATE.CONTEXT.wasLastLineSelector\r\n ? STATE.CONTEXT.lastSelectorIndentation - STATE.LOCAL_CONTEXT.indentation.distance\r\n : utility_1.getBlockHeaderOffset(STATE.LOCAL_CONTEXT.indentation.distance, STATE.CONFIG.tabSize, STATE.CONTEXT.indentation, STATE.LOCAL_CONTEXT.isReset);\r\n if (STATE.LOCAL_CONTEXT.isElse && STATE.CONTEXT[\"if\"].isIn) {\r\n offset = (STATE.CONTEXT[\"if\"].indentation - STATE.CONFIG.tabSize) - STATE.LOCAL_CONTEXT.indentation.distance;\r\n }\r\n else if (!STATE.LOCAL_CONTEXT.isIf) {\r\n STATE.CONTEXT.keyframes.isIn =\r\n STATE.LOCAL_CONTEXT.isAtKeyframes || STATE.LOCAL_CONTEXT.isAtKeyframesPoint;\r\n }\r\n STATE.CONTEXT.allowSpace = false;\r\n if (!hasBeenConverted && STATE.LOCAL_CONTEXT.isClassOrIdSelector) {\r\n STATE.CONTEXT.convert.lastSelector = '';\r\n }\r\n STATE.CONTEXT.convert.wasLastLineCss = hasBeenConverted;\r\n if (STATE.CONTEXT.firstCommaHeader.exists) {\r\n offset = STATE.CONTEXT.firstCommaHeader.distance - STATE.LOCAL_CONTEXT.indentation.distance;\r\n }\r\n if (line.get().trim().endsWith(',')) {\r\n if (STATE.CONTEXT.firstCommaHeader.exists !== true) {\r\n STATE.CONTEXT.firstCommaHeader.distance = STATE.LOCAL_CONTEXT.indentation.distance + offset;\r\n }\r\n STATE.CONTEXT.firstCommaHeader.exists = true;\r\n }\r\n else {\r\n STATE.CONTEXT.firstCommaHeader.exists = false;\r\n }\r\n // Convert Spaces to tabs or vice versa depending on the config.\r\n if (STATE.CONFIG.insertSpaces ? /\\t/g.test(line.get()) : / /g.test(line.get())) {\r\n line.set(utility_1.replaceSpacesOrTabs(line.get(), STATE));\r\n replaceSpaceOrTabs = true;\r\n }\r\n // Set edit or just return the line text.\r\n if (offset !== 0) {\r\n edit = utility_1.replaceWithOffset(line.get(), offset, STATE).trimRight();\r\n logger_1.PushDebugInfo({\r\n title: 'BLOCK HEADER: MOVE',\r\n lineNumber: STATE.currentLine,\r\n oldLineText: STATE.lines[STATE.currentLine],\r\n newLineText: edit,\r\n debug: STATE.CONFIG.debug,\r\n replaceSpaceOrTabs: replaceSpaceOrTabs,\r\n offset: offset\r\n });\r\n }\r\n else {\r\n edit = line.get().trimRight();\r\n logger_1.PushDebugInfo({\r\n title: 'BLOCK HEADER: DEFAULT',\r\n lineNumber: STATE.currentLine,\r\n oldLineText: STATE.lines[STATE.currentLine],\r\n newLineText: edit,\r\n debug: STATE.CONFIG.debug,\r\n replaceSpaceOrTabs: replaceSpaceOrTabs\r\n });\r\n }\r\n STATE.CONTEXT.lastSelectorIndentation = Math.max(STATE.LOCAL_CONTEXT.indentation.distance + offset, 0);\r\n if (STATE.LOCAL_CONTEXT.isReset) {\r\n STATE.CONTEXT.indentation = Math.max(0, STATE.LOCAL_CONTEXT.indentation.distance + offset);\r\n }\r\n else {\r\n STATE.CONTEXT.indentation = Math.max(0, STATE.LOCAL_CONTEXT.indentation.distance +\r\n offset + // keep in mind that +offset can decrease the number.\r\n STATE.CONFIG.tabSize);\r\n }\r\n if (STATE.LOCAL_CONTEXT.isAtKeyframes) {\r\n STATE.CONTEXT.keyframes.indentation = STATE.CONTEXT.indentation;\r\n }\r\n if (STATE.LOCAL_CONTEXT.isIf) {\r\n STATE.CONTEXT[\"if\"].indentation = STATE.CONTEXT.indentation;\r\n STATE.CONTEXT[\"if\"].isIn = true;\r\n }\r\n else {\r\n STATE.CONTEXT[\"if\"].isIn = false;\r\n }\r\n STATE.CONTEXT.wasLastHeaderIncludeMixin = STATE.LOCAL_CONTEXT.isInclude;\r\n STATE.CONTEXT.wasLastHeaderNestedProp = STATE.LOCAL_CONTEXT.isNestPropHead;\r\n return edit;\r\n}\r\nexports.FormatBlockHeader = FormatBlockHeader;\r\n", "\"use strict\";\r\nexports.__esModule = true;\r\nexports.SassTextLine = void 0;\r\nvar regex_1 = require(\"./regex/regex\");\r\nvar SassTextLine = /** @class */ (function () {\r\n function SassTextLine(text) {\r\n this.text = text;\r\n this.isEmptyOrWhitespace = regex_1.isEmptyOrWhitespace(text);\r\n }\r\n /**Sets the text of the line. */\r\n SassTextLine.prototype.set = function (text) {\r\n this.text = text;\r\n };\r\n /**Gets the text of the line. */\r\n SassTextLine.prototype.get = function () {\r\n return this.text;\r\n };\r\n return SassTextLine;\r\n}());\r\nexports.SassTextLine = SassTextLine;\r\n", "\"use strict\";\r\nexports.__esModule = true;\r\nexports.defaultSassFormatterConfig = void 0;\r\nexports.defaultSassFormatterConfig = {\r\n insertSpaces: true,\r\n tabSize: 2,\r\n convert: true,\r\n debug: false,\r\n deleteEmptyRows: true,\r\n deleteWhitespace: true,\r\n setPropertySpace: true,\r\n lineEnding: 'LF'\r\n};\r\n", "\"use strict\";\r\nexports.__esModule = true;\r\nexports.FormattingState = void 0;\r\nvar config_1 = require(\"./config\");\r\nvar FormattingState = /** @class */ (function () {\r\n function FormattingState() {\r\n this.lines = [];\r\n /** Current line index. */\r\n this.currentLine = 0;\r\n this.LINE_ENDING = '\\n';\r\n /** Formatting Result */\r\n this.RESULT = '';\r\n /** Context For Each Line. */\r\n this.LOCAL_CONTEXT = {\r\n isAdjacentSelector: false,\r\n isHtmlTag: false,\r\n isReset: false,\r\n indentation: {\r\n distance: 0,\r\n offset: 0\r\n },\r\n isAtExtend: false,\r\n isAnd: false,\r\n isClassOrIdSelector: false,\r\n isIf: false,\r\n isElse: false,\r\n isAtKeyframes: false,\r\n isAtKeyframesPoint: false,\r\n isProp: false,\r\n isInterpolatedProp: false,\r\n isInclude: false,\r\n isVariable: false,\r\n isImport: false,\r\n isNestPropHead: false\r\n };\r\n this.CONTEXT = {\r\n \"if\": {\r\n isIn: false,\r\n indentation: 0\r\n },\r\n blockCommentDistance: 0,\r\n wasLastHeaderIncludeMixin: false,\r\n wasLastHeaderNestedProp: false,\r\n isFirstLine: true,\r\n isLastLine: false,\r\n allowSpace: false,\r\n isInBlockComment: false,\r\n ignoreLine: false,\r\n lastSelectorIndentation: 0,\r\n wasLastLineSelector: false,\r\n convert: {\r\n lastSelector: '',\r\n wasLastLineCss: false\r\n },\r\n keyframes: {\r\n isIn: false,\r\n indentation: 0\r\n },\r\n indentation: 0,\r\n firstCommaHeader: { exists: false, distance: 0 }\r\n };\r\n this.CONFIG = config_1.defaultSassFormatterConfig;\r\n }\r\n FormattingState.prototype.setLocalContext = function (context) {\r\n this.LOCAL_CONTEXT = context;\r\n };\r\n return FormattingState;\r\n}());\r\nexports.FormattingState = FormattingState;\r\n", "\"use strict\";\r\nvar __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}));\r\nexports.__esModule = true;\r\nexports.SassFormatter = exports.defaultSassFormatterConfig = void 0;\r\nvar format_atForwardOrAtUse_1 = require(\"./formatters/format.atForwardOrAtUse\");\r\nvar format_blockComment_1 = require(\"./formatters/format.blockComment\");\r\nvar format_header_1 = require(\"./formatters/format.header\");\r\nvar format_property_1 = require(\"./formatters/format.property\");\r\nvar logger_1 = require(\"./logger\");\r\nvar regex_1 = require(\"./regex/regex\");\r\nvar sassTextLine_1 = require(\"./sassTextLine\");\r\nvar state_1 = require(\"./state\");\r\nvar utility_1 = require(\"./utility\");\r\nvar config_1 = require(\"./config\");\r\n__createBinding(exports, config_1, \"defaultSassFormatterConfig\");\r\nvar SassFormatter = /** @class */ (function () {\r\n function SassFormatter() {\r\n }\r\n SassFormatter.Format = function (text, config) {\r\n var STATE = new state_1.FormattingState();\r\n STATE.lines = text.split(/\\r?\\n/);\r\n STATE.CONFIG = __assign(__assign({}, STATE.CONFIG), config);\r\n STATE.LINE_ENDING = STATE.CONFIG.lineEnding === 'LF' ? '\\n' : '\\r\\n';\r\n for (var i = 0; i < STATE.lines.length; i++) {\r\n STATE.currentLine = i;\r\n this.formatLine(new sassTextLine_1.SassTextLine(STATE.lines[i]), STATE);\r\n }\r\n if (!STATE.RESULT.endsWith(STATE.LINE_ENDING)) {\r\n this.addNewLine(STATE);\r\n }\r\n if (STATE.CONFIG.debug) {\r\n logger_1.LogDebugResult(STATE.RESULT);\r\n logger_1.ResetDebugLog();\r\n }\r\n return STATE.RESULT;\r\n };\r\n SassFormatter.formatLine = function (line, STATE) {\r\n if (regex_1.isBlockCommentStart(line.get())) {\r\n STATE.CONTEXT.isInBlockComment = true;\r\n STATE.CONTEXT.blockCommentDistance = regex_1.getDistance(line.get(), STATE.CONFIG.tabSize);\r\n }\r\n else if (STATE.CONTEXT.isInBlockComment &&\r\n STATE.CONTEXT.blockCommentDistance >= regex_1.getDistance(line.get(), STATE.CONFIG.tabSize)) {\r\n STATE.CONTEXT.isInBlockComment = false;\r\n STATE.CONTEXT.blockCommentDistance = 0;\r\n }\r\n if (STATE.CONTEXT.ignoreLine) {\r\n STATE.CONTEXT.ignoreLine = false;\r\n this.addNewLine(STATE);\r\n STATE.RESULT += line.get();\r\n logger_1.PushDebugInfo({\r\n title: 'IGNORED',\r\n lineNumber: STATE.currentLine,\r\n oldLineText: line.get(),\r\n debug: STATE.CONFIG.debug,\r\n newLineText: 'NULL'\r\n });\r\n }\r\n else if (STATE.CONTEXT.isInBlockComment) {\r\n this.handleCommentBlock(STATE, line);\r\n }\r\n else {\r\n if (regex_1.isIgnore(line.get())) {\r\n STATE.CONTEXT.ignoreLine = true;\r\n this.addNewLine(STATE);\r\n STATE.RESULT += line.get();\r\n logger_1.PushDebugInfo({\r\n title: 'IGNORE',\r\n lineNumber: STATE.currentLine,\r\n oldLineText: line.get(),\r\n debug: STATE.CONFIG.debug,\r\n newLineText: 'NULL'\r\n });\r\n }\r\n else {\r\n if (regex_1.isSassSpace(line.get())) {\r\n STATE.CONTEXT.allowSpace = true;\r\n }\r\n // ####### Empty Line #######\r\n if (line.isEmptyOrWhitespace ||\r\n (STATE.CONFIG.convert ? regex_1.isBracketOrWhitespace(line.get()) : false)) {\r\n this.handleEmptyLine(STATE, line);\r\n }\r\n else {\r\n STATE.setLocalContext({\r\n isAtKeyframesPoint: utility_1.isKeyframePointAndSetIndentation(line, STATE),\r\n indentation: utility_1.getIndentationOffset(line.get(), STATE.CONTEXT.indentation, STATE.CONFIG.tabSize),\r\n isIf: /[\\t ]*@if/i.test(line.get()),\r\n isElse: /[\\t ]*@else/i.test(line.get()),\r\n isAtKeyframes: regex_1.isKeyframes(line.get()),\r\n isReset: regex_1.isReset(line.get()),\r\n isAnd: regex_1.isAnd(line.get()),\r\n isProp: regex_1.isProperty(line.get()),\r\n isAdjacentSelector: regex_1.isAdjacentSelector(line.get()),\r\n isHtmlTag: regex_1.isHtmlTag(line.get().trim().split(' ')[0]),\r\n isClassOrIdSelector: regex_1.isClassOrId(line.get()),\r\n isAtExtend: regex_1.isAtExtend(line.get()),\r\n isInterpolatedProp: regex_1.isInterpolatedProperty(line.get()),\r\n isInclude: regex_1.isInclude(line.get()),\r\n isVariable: regex_1.isVar(line.get()),\r\n isImport: regex_1.isAtImport(line.get()),\r\n isNestPropHead: /^[\\t ]* \\S*[\\t ]*:[\\t ]*\\{?$/.test(line.get())\r\n });\r\n if (STATE.CONFIG.debug) {\r\n if (/\\/\\/[\\t ]*info[\\t ]*$/.test(line.get())) {\r\n logger_1.SetDebugLOCAL_CONTEXT(STATE.LOCAL_CONTEXT);\r\n }\r\n }\r\n // ####### Is @forward or @use #######\r\n if (regex_1.isAtForwardOrAtUse(line.get())) {\r\n this.addNewLine(STATE);\r\n STATE.RESULT += format_atForwardOrAtUse_1.FormatAtForwardOrAtUse(line, STATE);\r\n }\r\n // ####### Block Header #######\r\n else if (this.isBlockHeader(line, STATE)) {\r\n this.addNewLine(STATE);\r\n STATE.RESULT += format_header_1.FormatBlockHeader(line, STATE);\r\n }\r\n // ####### Properties or Vars #######\r\n else if (this.isProperty(STATE)) {\r\n STATE.CONTEXT.firstCommaHeader.exists = false;\r\n this.addNewLine(STATE);\r\n STATE.RESULT += format_property_1.FormatProperty(line, STATE);\r\n }\r\n else {\r\n logger_1.PushDebugInfo({\r\n title: 'NO CHANGE',\r\n lineNumber: STATE.currentLine,\r\n oldLineText: line.get(),\r\n debug: STATE.CONFIG.debug,\r\n newLineText: 'NULL'\r\n });\r\n this.addNewLine(STATE);\r\n STATE.RESULT += line.get();\r\n }\r\n // set CONTEXT Variables\r\n STATE.CONTEXT.wasLastLineSelector =\r\n STATE.LOCAL_CONTEXT.isClassOrIdSelector ||\r\n STATE.LOCAL_CONTEXT.isAdjacentSelector ||\r\n STATE.LOCAL_CONTEXT.isHtmlTag;\r\n }\r\n }\r\n }\r\n };\r\n SassFormatter.handleCommentBlock = function (STATE, line) {\r\n this.addNewLine(STATE);\r\n var edit = format_blockComment_1.FormatHandleBlockComment(line.get(), STATE);\r\n STATE.RESULT += edit;\r\n if (regex_1.isBlockCommentEnd(line.get())) {\r\n STATE.CONTEXT.isInBlockComment = false;\r\n }\r\n logger_1.PushDebugInfo({\r\n title: 'COMMENT BLOCK',\r\n lineNumber: STATE.currentLine,\r\n oldLineText: STATE.lines[STATE.currentLine],\r\n newLineText: edit,\r\n debug: STATE.CONFIG.debug\r\n });\r\n };\r\n SassFormatter.handleEmptyLine = function (STATE, line) {\r\n STATE.CONTEXT.firstCommaHeader.exists = false;\r\n var pass = true; // its not useless, trust me.\r\n /*istanbul ignore else */\r\n if (STATE.CONFIG.deleteEmptyRows && !STATE.CONTEXT.isLastLine) {\r\n var nextLine = new sassTextLine_1.SassTextLine(STATE.lines[STATE.currentLine + 1]);\r\n var compact = !regex_1.isProperty(nextLine.get());\r\n var nextLineWillBeDeleted = STATE.CONFIG.convert\r\n ? regex_1.isBracketOrWhitespace(nextLine.get())\r\n : false;\r\n if ((compact && !STATE.CONTEXT.allowSpace && nextLine.isEmptyOrWhitespace) ||\r\n (compact && !STATE.CONTEXT.allowSpace && nextLineWillBeDeleted)) {\r\n logger_1.PushDebugInfo({\r\n title: 'EMPTY LINE: DELETE',\r\n nextLine: nextLine,\r\n lineNumber: STATE.currentLine,\r\n oldLineText: STATE.lines[STATE.currentLine],\r\n newLineText: 'DELETED',\r\n debug: STATE.CONFIG.debug\r\n });\r\n pass = false;\r\n }\r\n }\r\n if (line.get().length > 0 && pass) {\r\n logger_1.PushDebugInfo({\r\n title: 'EMPTY LINE: WHITESPACE',\r\n lineNumber: STATE.currentLine,\r\n oldLineText: STATE.lines[STATE.currentLine],\r\n newLineText: 'NEWLINE',\r\n debug: STATE.CONFIG.debug\r\n });\r\n this.addNewLine(STATE);\r\n }\r\n else if (pass) {\r\n logger_1.PushDebugInfo({\r\n title: 'EMPTY LINE',\r\n lineNumber: STATE.currentLine,\r\n oldLineText: STATE.lines[STATE.currentLine],\r\n newLineText: 'NEWLINE',\r\n debug: STATE.CONFIG.debug\r\n });\r\n this.addNewLine(STATE);\r\n }\r\n };\r\n SassFormatter.isBlockHeader = function (line, STATE) {\r\n return (!STATE.LOCAL_CONTEXT.isInterpolatedProp &&\r\n !STATE.LOCAL_CONTEXT.isAtExtend &&\r\n !STATE.LOCAL_CONTEXT.isImport &&\r\n (STATE.LOCAL_CONTEXT.isAdjacentSelector ||\r\n STATE.LOCAL_CONTEXT.isReset ||\r\n STATE.LOCAL_CONTEXT.isAnd ||\r\n (STATE.LOCAL_CONTEXT.isHtmlTag && !/^[\\t ]*style[\\t ]*:/.test(line.get())) ||\r\n STATE.LOCAL_CONTEXT.isInclude ||\r\n STATE.LOCAL_CONTEXT.isNestPropHead ||\r\n regex_1.isPseudo(line.get()) ||\r\n regex_1.isSelectorOperator(line.get()) ||\r\n regex_1.isStar(line.get()) ||\r\n regex_1.isBracketSelector(line.get()) ||\r\n regex_1.isCssSelector(line.get())) // adds all lines that start with [@.#%=]\r\n );\r\n };\r\n SassFormatter.isProperty = function (STATE) {\r\n return (STATE.LOCAL_CONTEXT.isImport ||\r\n STATE.LOCAL_CONTEXT.isAtExtend ||\r\n STATE.LOCAL_CONTEXT.isVariable ||\r\n STATE.LOCAL_CONTEXT.isInterpolatedProp ||\r\n STATE.LOCAL_CONTEXT.isProp ||\r\n STATE.LOCAL_CONTEXT.isAtKeyframesPoint);\r\n };\r\n /** Adds new Line If not first line. */\r\n SassFormatter.addNewLine = function (STATE) {\r\n if (!STATE.CONTEXT.isFirstLine) {\r\n STATE.RESULT += STATE.LINE_ENDING;\r\n }\r\n else {\r\n STATE.CONTEXT.isFirstLine = false;\r\n }\r\n };\r\n return SassFormatter;\r\n}());\r\nexports.SassFormatter = SassFormatter;\r\n", "// Reserved word lists for various dialects of the language\n\nvar reservedWords = {\n 3: \"abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile\",\n 5: \"class enum extends super const export import\",\n 6: \"enum\",\n strict: \"implements interface let package private protected public static yield\",\n strictBind: \"eval arguments\"\n};\n\n// And the keywords\n\nvar ecma5AndLessKeywords = \"break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this\";\n\nvar keywords = {\n 5: ecma5AndLessKeywords,\n \"5module\": ecma5AndLessKeywords + \" export import\",\n 6: ecma5AndLessKeywords + \" const class extends export import super\"\n};\n\nvar keywordRelationalOperator = /^in(stanceof)?$/;\n\n// ## Character categories\n\n// Big ugly regular expressions that match characters in the\n// whitespace, identifier, and identifier-start categories. These\n// are only applied when a character is found to actually have a\n// code point above 128.\n// Generated by `bin/generate-identifier-regex.js`.\nvar nonASCIIidentifierStartChars = \"\\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\\u0560-\\u0588\\u05d0-\\u05ea\\u05ef-\\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\\u0860-\\u086a\\u08a0-\\u08b4\\u08b6-\\u08c7\\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\\u09fc\\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\\u0d04-\\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\\u0e86-\\u0e8a\\u0e8c-\\u0ea3\\u0ea5\\u0ea7-\\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-\\u1878\\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\\u1c90-\\u1cba\\u1cbd-\\u1cbf\\u1ce9-\\u1cec\\u1cee-\\u1cf3\\u1cf5\\u1cf6\\u1cfa\\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-\\u312f\\u3131-\\u318e\\u31a0-\\u31bf\\u31f0-\\u31ff\\u3400-\\u4dbf\\u4e00-\\u9ffc\\ua000-\\ua48c\\ua4d0-\\ua4fd\\ua500-\\ua60c\\ua610-\\ua61f\\ua62a\\ua62b\\ua640-\\ua66e\\ua67f-\\ua69d\\ua6a0-\\ua6ef\\ua717-\\ua71f\\ua722-\\ua788\\ua78b-\\ua7bf\\ua7c2-\\ua7ca\\ua7f5-\\ua801\\ua803-\\ua805\\ua807-\\ua80a\\ua80c-\\ua822\\ua840-\\ua873\\ua882-\\ua8b3\\ua8f2-\\ua8f7\\ua8fb\\ua8fd\\ua8fe\\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-\\uab69\\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\";\nvar nonASCIIidentifierChars = \"\\u200c\\u200d\\xb7\\u0300-\\u036f\\u0387\\u0483-\\u0487\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u0669\\u0670\\u06d6-\\u06dc\\u06df-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u06f0-\\u06f9\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07c0-\\u07c9\\u07eb-\\u07f3\\u07fd\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0859-\\u085b\\u08d3-\\u08e1\\u08e3-\\u0903\\u093a-\\u093c\\u093e-\\u094f\\u0951-\\u0957\\u0962\\u0963\\u0966-\\u096f\\u0981-\\u0983\\u09bc\\u09be-\\u09c4\\u09c7\\u09c8\\u09cb-\\u09cd\\u09d7\\u09e2\\u09e3\\u09e6-\\u09ef\\u09fe\\u0a01-\\u0a03\\u0a3c\\u0a3e-\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a66-\\u0a71\\u0a75\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0ae2\\u0ae3\\u0ae6-\\u0aef\\u0afa-\\u0aff\\u0b01-\\u0b03\\u0b3c\\u0b3e-\\u0b44\\u0b47\\u0b48\\u0b4b-\\u0b4d\\u0b55-\\u0b57\\u0b62\\u0b63\\u0b66-\\u0b6f\\u0b82\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\\u0be6-\\u0bef\\u0c00-\\u0c04\\u0c3e-\\u0c44\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0c66-\\u0c6f\\u0c81-\\u0c83\\u0cbc\\u0cbe-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0ce6-\\u0cef\\u0d00-\\u0d03\\u0d3b\\u0d3c\\u0d3e-\\u0d44\\u0d46-\\u0d48\\u0d4a-\\u0d4d\\u0d57\\u0d62\\u0d63\\u0d66-\\u0d6f\\u0d81-\\u0d83\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0de6-\\u0def\\u0df2\\u0df3\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0e50-\\u0e59\\u0eb1\\u0eb4-\\u0ebc\\u0ec8-\\u0ecd\\u0ed0-\\u0ed9\\u0f18\\u0f19\\u0f20-\\u0f29\\u0f35\\u0f37\\u0f39\\u0f3e\\u0f3f\\u0f71-\\u0f84\\u0f86\\u0f87\\u0f8d-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102b-\\u103e\\u1040-\\u1049\\u1056-\\u1059\\u105e-\\u1060\\u1062-\\u1064\\u1067-\\u106d\\u1071-\\u1074\\u1082-\\u108d\\u108f-\\u109d\\u135d-\\u135f\\u1369-\\u1371\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b4-\\u17d3\\u17dd\\u17e0-\\u17e9\\u180b-\\u180d\\u1810-\\u1819\\u18a9\\u1920-\\u192b\\u1930-\\u193b\\u1946-\\u194f\\u19d0-\\u19da\\u1a17-\\u1a1b\\u1a55-\\u1a5e\\u1a60-\\u1a7c\\u1a7f-\\u1a89\\u1a90-\\u1a99\\u1ab0-\\u1abd\\u1abf\\u1ac0\\u1b00-\\u1b04\\u1b34-\\u1b44\\u1b50-\\u1b59\\u1b6b-\\u1b73\\u1b80-\\u1b82\\u1ba1-\\u1bad\\u1bb0-\\u1bb9\\u1be6-\\u1bf3\\u1c24-\\u1c37\\u1c40-\\u1c49\\u1c50-\\u1c59\\u1cd0-\\u1cd2\\u1cd4-\\u1ce8\\u1ced\\u1cf4\\u1cf7-\\u1cf9\\u1dc0-\\u1df9\\u1dfb-\\u1dff\\u203f\\u2040\\u2054\\u20d0-\\u20dc\\u20e1\\u20e5-\\u20f0\\u2cef-\\u2cf1\\u2d7f\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua620-\\ua629\\ua66f\\ua674-\\ua67d\\ua69e\\ua69f\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua823-\\ua827\\ua82c\\ua880\\ua881\\ua8b4-\\ua8c5\\ua8d0-\\ua8d9\\ua8e0-\\ua8f1\\ua8ff-\\ua909\\ua926-\\ua92d\\ua947-\\ua953\\ua980-\\ua983\\ua9b3-\\ua9c0\\ua9d0-\\ua9d9\\ua9e5\\ua9f0-\\ua9f9\\uaa29-\\uaa36\\uaa43\\uaa4c\\uaa4d\\uaa50-\\uaa59\\uaa7b-\\uaa7d\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uaaeb-\\uaaef\\uaaf5\\uaaf6\\uabe3-\\uabea\\uabec\\uabed\\uabf0-\\uabf9\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe2f\\ufe33\\ufe34\\ufe4d-\\ufe4f\\uff10-\\uff19\\uff3f\";\n\nvar nonASCIIidentifierStart = new RegExp(\"[\" + nonASCIIidentifierStartChars + \"]\");\nvar nonASCIIidentifier = new RegExp(\"[\" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + \"]\");\n\nnonASCIIidentifierStartChars = nonASCIIidentifierChars = null;\n\n// These are a run-length and offset encoded representation of the\n// >0xffff code points that are a valid part of identifiers. The\n// offset starts at 0x10000, and each pair of numbers represents an\n// offset to the next range, and then a size of the range. They were\n// generated by bin/generate-identifier-regex.js\n\n// eslint-disable-next-line comma-spacing\nvar astralIdentifierStartCodes = [0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,157,310,10,21,11,7,153,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,349,41,7,1,79,28,11,0,9,21,107,20,28,22,13,52,76,44,33,24,27,35,30,0,3,0,9,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,85,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,21,2,31,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,230,43,117,63,32,7,3,0,3,7,2,1,2,23,16,0,2,0,95,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,35,56,264,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,328,18,190,0,80,921,103,110,18,195,2749,1070,4050,582,8634,568,8,30,114,29,19,47,17,3,32,20,6,18,689,63,129,74,6,0,67,12,65,1,2,0,29,6135,9,1237,43,8,8952,286,50,2,18,3,9,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,2357,44,11,6,17,0,370,43,1301,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42717,35,4148,12,221,3,5761,15,7472,3104,541,1507,4938];\n\n// eslint-disable-next-line comma-spacing\nvar astralIdentifierCodes = [509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,370,1,154,10,176,2,54,14,32,9,16,3,46,10,54,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,2,11,83,11,7,0,161,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,243,14,166,9,71,5,2,1,3,3,2,0,2,1,13,9,120,6,3,6,4,0,29,9,41,6,2,3,9,0,10,10,47,15,406,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,330,3,19306,9,135,4,60,6,26,9,1014,0,2,54,8,3,82,0,12,1,19628,1,5319,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,262,6,10,9,419,13,1495,6,110,6,6,9,4759,9,787719,239];\n\n// This has a complexity linear to the value of the code. The\n// assumption is that looking up astral identifier characters is\n// rare.\nfunction isInAstralSet(code, set) {\n var pos = 0x10000;\n for (var i = 0; i < set.length; i += 2) {\n pos += set[i];\n if (pos > code) { return false }\n pos += set[i + 1];\n if (pos >= code) { return true }\n }\n}\n\n// Test whether a given character code starts an identifier.\n\nfunction isIdentifierStart(code, astral) {\n if (code < 65) { return code === 36 }\n if (code < 91) { return true }\n if (code < 97) { return code === 95 }\n if (code < 123) { return true }\n if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)) }\n if (astral === false) { return false }\n return isInAstralSet(code, astralIdentifierStartCodes)\n}\n\n// Test whether a given character is part of an identifier.\n\nfunction isIdentifierChar(code, astral) {\n if (code < 48) { return code === 36 }\n if (code < 58) { return true }\n if (code < 65) { return false }\n if (code < 91) { return true }\n if (code < 97) { return code === 95 }\n if (code < 123) { return true }\n if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)) }\n if (astral === false) { return false }\n return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes)\n}\n\n// ## Token types\n\n// The assignment of fine-grained, information-carrying type objects\n// allows the tokenizer to store the information it has about a\n// token in a way that is very cheap for the parser to look up.\n\n// All token type variables start with an underscore, to make them\n// easy to recognize.\n\n// The `beforeExpr` property is used to disambiguate between regular\n// expressions and divisions. It is set on all token types that can\n// be followed by an expression (thus, a slash after them would be a\n// regular expression).\n//\n// The `startsExpr` property is used to check if the token ends a\n// `yield` expression. It is set on all token types that either can\n// directly start an expression (like a quotation mark) or can\n// continue an expression (like the body of a string).\n//\n// `isLoop` marks a keyword as starting a loop, which is important\n// to know when parsing a label, in order to allow or disallow\n// continue jumps to that label.\n\nvar TokenType = function TokenType(label, conf) {\n if ( conf === void 0 ) conf = {};\n\n this.label = label;\n this.keyword = conf.keyword;\n this.beforeExpr = !!conf.beforeExpr;\n this.startsExpr = !!conf.startsExpr;\n this.isLoop = !!conf.isLoop;\n this.isAssign = !!conf.isAssign;\n this.prefix = !!conf.prefix;\n this.postfix = !!conf.postfix;\n this.binop = conf.binop || null;\n this.updateContext = null;\n};\n\nfunction binop(name, prec) {\n return new TokenType(name, {beforeExpr: true, binop: prec})\n}\nvar beforeExpr = {beforeExpr: true}, startsExpr = {startsExpr: true};\n\n// Map keyword names to token types.\n\nvar keywords$1 = {};\n\n// Succinct definitions of keyword token types\nfunction kw(name, options) {\n if ( options === void 0 ) options = {};\n\n options.keyword = name;\n return keywords$1[name] = new TokenType(name, options)\n}\n\nvar types = {\n num: new TokenType(\"num\", startsExpr),\n regexp: new TokenType(\"regexp\", startsExpr),\n string: new TokenType(\"string\", startsExpr),\n name: new TokenType(\"name\", startsExpr),\n eof: new TokenType(\"eof\"),\n\n // Punctuation token types.\n bracketL: new TokenType(\"[\", {beforeExpr: true, startsExpr: true}),\n bracketR: new TokenType(\"]\"),\n braceL: new TokenType(\"{\", {beforeExpr: true, startsExpr: true}),\n braceR: new TokenType(\"}\"),\n parenL: new TokenType(\"(\", {beforeExpr: true, startsExpr: true}),\n parenR: new TokenType(\")\"),\n comma: new TokenType(\",\", beforeExpr),\n semi: new TokenType(\";\", beforeExpr),\n colon: new TokenType(\":\", beforeExpr),\n dot: new TokenType(\".\"),\n question: new TokenType(\"?\", beforeExpr),\n questionDot: new TokenType(\"?.\"),\n arrow: new TokenType(\"=>\", beforeExpr),\n template: new TokenType(\"template\"),\n invalidTemplate: new TokenType(\"invalidTemplate\"),\n ellipsis: new TokenType(\"...\", beforeExpr),\n backQuote: new TokenType(\"`\", startsExpr),\n dollarBraceL: new TokenType(\"${\", {beforeExpr: true, startsExpr: true}),\n\n // Operators. These carry several kinds of properties to help the\n // parser use them properly (the presence of these properties is\n // what categorizes them as operators).\n //\n // `binop`, when present, specifies that this operator is a binary\n // operator, and will refer to its precedence.\n //\n // `prefix` and `postfix` mark the operator as a prefix or postfix\n // unary operator.\n //\n // `isAssign` marks all of `=`, `+=`, `-=` etcetera, which act as\n // binary operators with a very low precedence, that should result\n // in AssignmentExpression nodes.\n\n eq: new TokenType(\"=\", {beforeExpr: true, isAssign: true}),\n assign: new TokenType(\"_=\", {beforeExpr: true, isAssign: true}),\n incDec: new TokenType(\"++/--\", {prefix: true, postfix: true, startsExpr: true}),\n prefix: new TokenType(\"!/~\", {beforeExpr: true, prefix: true, startsExpr: true}),\n logicalOR: binop(\"||\", 1),\n logicalAND: binop(\"&&\", 2),\n bitwiseOR: binop(\"|\", 3),\n bitwiseXOR: binop(\"^\", 4),\n bitwiseAND: binop(\"&\", 5),\n equality: binop(\"==/!=/===/!==\", 6),\n relational: binop(\"</>/<=/>=\", 7),\n bitShift: binop(\"<</>>/>>>\", 8),\n plusMin: new TokenType(\"+/-\", {beforeExpr: true, binop: 9, prefix: true, startsExpr: true}),\n modulo: binop(\"%\", 10),\n star: binop(\"*\", 10),\n slash: binop(\"/\", 10),\n starstar: new TokenType(\"**\", {beforeExpr: true}),\n coalesce: binop(\"??\", 1),\n\n // Keyword token types.\n _break: kw(\"break\"),\n _case: kw(\"case\", beforeExpr),\n _catch: kw(\"catch\"),\n _continue: kw(\"continue\"),\n _debugger: kw(\"debugger\"),\n _default: kw(\"default\", beforeExpr),\n _do: kw(\"do\", {isLoop: true, beforeExpr: true}),\n _else: kw(\"else\", beforeExpr),\n _finally: kw(\"finally\"),\n _for: kw(\"for\", {isLoop: true}),\n _function: kw(\"function\", startsExpr),\n _if: kw(\"if\"),\n _return: kw(\"return\", beforeExpr),\n _switch: kw(\"switch\"),\n _throw: kw(\"throw\", beforeExpr),\n _try: kw(\"try\"),\n _var: kw(\"var\"),\n _const: kw(\"const\"),\n _while: kw(\"while\", {isLoop: true}),\n _with: kw(\"with\"),\n _new: kw(\"new\", {beforeExpr: true, startsExpr: true}),\n _this: kw(\"this\", startsExpr),\n _super: kw(\"super\", startsExpr),\n _class: kw(\"class\", startsExpr),\n _extends: kw(\"extends\", beforeExpr),\n _export: kw(\"export\"),\n _import: kw(\"import\", startsExpr),\n _null: kw(\"null\", startsExpr),\n _true: kw(\"true\", startsExpr),\n _false: kw(\"false\", startsExpr),\n _in: kw(\"in\", {beforeExpr: true, binop: 7}),\n _instanceof: kw(\"instanceof\", {beforeExpr: true, binop: 7}),\n _typeof: kw(\"typeof\", {beforeExpr: true, prefix: true, startsExpr: true}),\n _void: kw(\"void\", {beforeExpr: true, prefix: true, startsExpr: true}),\n _delete: kw(\"delete\", {beforeExpr: true, prefix: true, startsExpr: true})\n};\n\n// Matches a whole line break (where CRLF is considered a single\n// line break). Used to count lines.\n\nvar lineBreak = /\\r\\n?|\\n|\\u2028|\\u2029/;\nvar lineBreakG = new RegExp(lineBreak.source, \"g\");\n\nfunction isNewLine(code, ecma2019String) {\n return code === 10 || code === 13 || (!ecma2019String && (code === 0x2028 || code === 0x2029))\n}\n\nvar nonASCIIwhitespace = /[\\u1680\\u2000-\\u200a\\u202f\\u205f\\u3000\\ufeff]/;\n\nvar skipWhiteSpace = /(?:\\s|\\/\\/.*|\\/\\*[^]*?\\*\\/)*/g;\n\nvar ref = Object.prototype;\nvar hasOwnProperty = ref.hasOwnProperty;\nvar toString = ref.toString;\n\n// Checks if an object has a property.\n\nfunction has(obj, propName) {\n return hasOwnProperty.call(obj, propName)\n}\n\nvar isArray = Array.isArray || (function (obj) { return (\n toString.call(obj) === \"[object Array]\"\n); });\n\nfunction wordsRegexp(words) {\n return new RegExp(\"^(?:\" + words.replace(/ /g, \"|\") + \")$\")\n}\n\n// These are used when `options.locations` is on, for the\n// `startLoc` and `endLoc` properties.\n\nvar Position = function Position(line, col) {\n this.line = line;\n this.column = col;\n};\n\nPosition.prototype.offset = function offset (n) {\n return new Position(this.line, this.column + n)\n};\n\nvar SourceLocation = function SourceLocation(p, start, end) {\n this.start = start;\n this.end = end;\n if (p.sourceFile !== null) { this.source = p.sourceFile; }\n};\n\n// The `getLineInfo` function is mostly useful when the\n// `locations` option is off (for performance reasons) and you\n// want to find the line/column position for a given character\n// offset. `input` should be the code string that the offset refers\n// into.\n\nfunction getLineInfo(input, offset) {\n for (var line = 1, cur = 0;;) {\n lineBreakG.lastIndex = cur;\n var match = lineBreakG.exec(input);\n if (match && match.index < offset) {\n ++line;\n cur = match.index + match[0].length;\n } else {\n return new Position(line, offset - cur)\n }\n }\n}\n\n// A second optional argument can be given to further configure\n// the parser process. These options are recognized:\n\nvar defaultOptions = {\n // `ecmaVersion` indicates the ECMAScript version to parse. Must be\n // either 3, 5, 6 (2015), 7 (2016), 8 (2017), 9 (2018), or 10\n // (2019). This influences support for strict mode, the set of\n // reserved words, and support for new syntax features. The default\n // is 10.\n ecmaVersion: 10,\n // `sourceType` indicates the mode the code should be parsed in.\n // Can be either `\"script\"` or `\"module\"`. This influences global\n // strict mode and parsing of `import` and `export` declarations.\n sourceType: \"script\",\n // `onInsertedSemicolon` can be a callback that will be called\n // when a semicolon is automatically inserted. It will be passed\n // the position of the comma as an offset, and if `locations` is\n // enabled, it is given the location as a `{line, column}` object\n // as second argument.\n onInsertedSemicolon: null,\n // `onTrailingComma` is similar to `onInsertedSemicolon`, but for\n // trailing commas.\n onTrailingComma: null,\n // By default, reserved words are only enforced if ecmaVersion >= 5.\n // Set `allowReserved` to a boolean value to explicitly turn this on\n // an off. When this option has the value \"never\", reserved words\n // and keywords can also not be used as property names.\n allowReserved: null,\n // When enabled, a return at the top level is not considered an\n // error.\n allowReturnOutsideFunction: false,\n // When enabled, import/export statements are not constrained to\n // appearing at the top of the program.\n allowImportExportEverywhere: false,\n // When enabled, await identifiers are allowed to appear at the top-level scope,\n // but they are still not allowed in non-async functions.\n allowAwaitOutsideFunction: false,\n // When enabled, hashbang directive in the beginning of file\n // is allowed and treated as a line comment.\n allowHashBang: false,\n // When `locations` is on, `loc` properties holding objects with\n // `start` and `end` properties in `{line, column}` form (with\n // line being 1-based and column 0-based) will be attached to the\n // nodes.\n locations: false,\n // A function can be passed as `onToken` option, which will\n // cause Acorn to call that function with object in the same\n // format as tokens returned from `tokenizer().getToken()`. Note\n // that you are not allowed to call the parser from the\n // callback\u2014that will corrupt its internal state.\n onToken: null,\n // A function can be passed as `onComment` option, which will\n // cause Acorn to call that function with `(block, text, start,\n // end)` parameters whenever a comment is skipped. `block` is a\n // boolean indicating whether this is a block (`/* */`) comment,\n // `text` is the content of the comment, and `start` and `end` are\n // character offsets that denote the start and end of the comment.\n // When the `locations` option is on, two more parameters are\n // passed, the full `{line, column}` locations of the start and\n // end of the comments. Note that you are not allowed to call the\n // parser from the callback\u2014that will corrupt its internal state.\n onComment: null,\n // Nodes have their start and end characters offsets recorded in\n // `start` and `end` properties (directly on the node, rather than\n // the `loc` object, which holds line/column data. To also add a\n // [semi-standardized][range] `range` property holding a `[start,\n // end]` array with the same numbers, set the `ranges` option to\n // `true`.\n //\n // [range]: https://bugzilla.mozilla.org/show_bug.cgi?id=745678\n ranges: false,\n // It is possible to parse multiple files into a single AST by\n // passing the tree produced by parsing the first file as\n // `program` option in subsequent parses. This will add the\n // toplevel forms of the parsed file to the `Program` (top) node\n // of an existing parse tree.\n program: null,\n // When `locations` is on, you can pass this to record the source\n // file in every node's `loc` object.\n sourceFile: null,\n // This value, if given, is stored in every node, whether\n // `locations` is on or off.\n directSourceFile: null,\n // When enabled, parenthesized expressions are represented by\n // (non-standard) ParenthesizedExpression nodes\n preserveParens: false\n};\n\n// Interpret and default an options object\n\nfunction getOptions(opts) {\n var options = {};\n\n for (var opt in defaultOptions)\n { options[opt] = opts && has(opts, opt) ? opts[opt] : defaultOptions[opt]; }\n\n if (options.ecmaVersion >= 2015)\n { options.ecmaVersion -= 2009; }\n\n if (options.allowReserved == null)\n { options.allowReserved = options.ecmaVersion < 5; }\n\n if (isArray(options.onToken)) {\n var tokens = options.onToken;\n options.onToken = function (token) { return tokens.push(token); };\n }\n if (isArray(options.onComment))\n { options.onComment = pushComment(options, options.onComment); }\n\n return options\n}\n\nfunction pushComment(options, array) {\n return function(block, text, start, end, startLoc, endLoc) {\n var comment = {\n type: block ? \"Block\" : \"Line\",\n value: text,\n start: start,\n end: end\n };\n if (options.locations)\n { comment.loc = new SourceLocation(this, startLoc, endLoc); }\n if (options.ranges)\n { comment.range = [start, end]; }\n array.push(comment);\n }\n}\n\n// Each scope gets a bitset that may contain these flags\nvar\n SCOPE_TOP = 1,\n SCOPE_FUNCTION = 2,\n SCOPE_VAR = SCOPE_TOP | SCOPE_FUNCTION,\n SCOPE_ASYNC = 4,\n SCOPE_GENERATOR = 8,\n SCOPE_ARROW = 16,\n SCOPE_SIMPLE_CATCH = 32,\n SCOPE_SUPER = 64,\n SCOPE_DIRECT_SUPER = 128;\n\nfunction functionFlags(async, generator) {\n return SCOPE_FUNCTION | (async ? SCOPE_ASYNC : 0) | (generator ? SCOPE_GENERATOR : 0)\n}\n\n// Used in checkLVal and declareName to determine the type of a binding\nvar\n BIND_NONE = 0, // Not a binding\n BIND_VAR = 1, // Var-style binding\n BIND_LEXICAL = 2, // Let- or const-style binding\n BIND_FUNCTION = 3, // Function declaration\n BIND_SIMPLE_CATCH = 4, // Simple (identifier pattern) catch binding\n BIND_OUTSIDE = 5; // Special case for function names as bound inside the function\n\nvar Parser = function Parser(options, input, startPos) {\n this.options = options = getOptions(options);\n this.sourceFile = options.sourceFile;\n this.keywords = wordsRegexp(keywords[options.ecmaVersion >= 6 ? 6 : options.sourceType === \"module\" ? \"5module\" : 5]);\n var reserved = \"\";\n if (options.allowReserved !== true) {\n for (var v = options.ecmaVersion;; v--)\n { if (reserved = reservedWords[v]) { break } }\n if (options.sourceType === \"module\") { reserved += \" await\"; }\n }\n this.reservedWords = wordsRegexp(reserved);\n var reservedStrict = (reserved ? reserved + \" \" : \"\") + reservedWords.strict;\n this.reservedWordsStrict = wordsRegexp(reservedStrict);\n this.reservedWordsStrictBind = wordsRegexp(reservedStrict + \" \" + reservedWords.strictBind);\n this.input = String(input);\n\n // Used to signal to callers of `readWord1` whether the word\n // contained any escape sequences. This is needed because words with\n // escape sequences must not be interpreted as keywords.\n this.containsEsc = false;\n\n // Set up token state\n\n // The current position of the tokenizer in the input.\n if (startPos) {\n this.pos = startPos;\n this.lineStart = this.input.lastIndexOf(\"\\n\", startPos - 1) + 1;\n this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length;\n } else {\n this.pos = this.lineStart = 0;\n this.curLine = 1;\n }\n\n // Properties of the current token:\n // Its type\n this.type = types.eof;\n // For tokens that include more information than their type, the value\n this.value = null;\n // Its start and end offset\n this.start = this.end = this.pos;\n // And, if locations are used, the {line, column} object\n // corresponding to those offsets\n this.startLoc = this.endLoc = this.curPosition();\n\n // Position information for the previous token\n this.lastTokEndLoc = this.lastTokStartLoc = null;\n this.lastTokStart = this.lastTokEnd = this.pos;\n\n // The context stack is used to superficially track syntactic\n // context to predict whether a regular expression is allowed in a\n // given position.\n this.context = this.initialContext();\n this.exprAllowed = true;\n\n // Figure out if it's a module code.\n this.inModule = options.sourceType === \"module\";\n this.strict = this.inModule || this.strictDirective(this.pos);\n\n // Used to signify the start of a potential arrow function\n this.potentialArrowAt = -1;\n\n // Positions to delayed-check that yield/await does not exist in default parameters.\n this.yieldPos = this.awaitPos = this.awaitIdentPos = 0;\n // Labels in scope.\n this.labels = [];\n // Thus-far undefined exports.\n this.undefinedExports = {};\n\n // If enabled, skip leading hashbang line.\n if (this.pos === 0 && options.allowHashBang && this.input.slice(0, 2) === \"#!\")\n { this.skipLineComment(2); }\n\n // Scope tracking for duplicate variable names (see scope.js)\n this.scopeStack = [];\n this.enterScope(SCOPE_TOP);\n\n // For RegExp validation\n this.regexpState = null;\n};\n\nvar prototypeAccessors = { inFunction: { configurable: true },inGenerator: { configurable: true },inAsync: { configurable: true },allowSuper: { configurable: true },allowDirectSuper: { configurable: true },treatFunctionsAsVar: { configurable: true } };\n\nParser.prototype.parse = function parse () {\n var node = this.options.program || this.startNode();\n this.nextToken();\n return this.parseTopLevel(node)\n};\n\nprototypeAccessors.inFunction.get = function () { return (this.currentVarScope().flags & SCOPE_FUNCTION) > 0 };\nprototypeAccessors.inGenerator.get = function () { return (this.currentVarScope().flags & SCOPE_GENERATOR) > 0 };\nprototypeAccessors.inAsync.get = function () { return (this.currentVarScope().flags & SCOPE_ASYNC) > 0 };\nprototypeAccessors.allowSuper.get = function () { return (this.currentThisScope().flags & SCOPE_SUPER) > 0 };\nprototypeAccessors.allowDirectSuper.get = function () { return (this.currentThisScope().flags & SCOPE_DIRECT_SUPER) > 0 };\nprototypeAccessors.treatFunctionsAsVar.get = function () { return this.treatFunctionsAsVarInScope(this.currentScope()) };\n\n// Switch to a getter for 7.0.0.\nParser.prototype.inNonArrowFunction = function inNonArrowFunction () { return (this.currentThisScope().flags & SCOPE_FUNCTION) > 0 };\n\nParser.extend = function extend () {\n var plugins = [], len = arguments.length;\n while ( len-- ) plugins[ len ] = arguments[ len ];\n\n var cls = this;\n for (var i = 0; i < plugins.length; i++) { cls = plugins[i](cls); }\n return cls\n};\n\nParser.parse = function parse (input, options) {\n return new this(options, input).parse()\n};\n\nParser.parseExpressionAt = function parseExpressionAt (input, pos, options) {\n var parser = new this(options, input, pos);\n parser.nextToken();\n return parser.parseExpression()\n};\n\nParser.tokenizer = function tokenizer (input, options) {\n return new this(options, input)\n};\n\nObject.defineProperties( Parser.prototype, prototypeAccessors );\n\nvar pp = Parser.prototype;\n\n// ## Parser utilities\n\nvar literal = /^(?:'((?:\\\\.|[^'\\\\])*?)'|\"((?:\\\\.|[^\"\\\\])*?)\")/;\npp.strictDirective = function(start) {\n for (;;) {\n // Try to find string literal.\n skipWhiteSpace.lastIndex = start;\n start += skipWhiteSpace.exec(this.input)[0].length;\n var match = literal.exec(this.input.slice(start));\n if (!match) { return false }\n if ((match[1] || match[2]) === \"use strict\") {\n skipWhiteSpace.lastIndex = start + match[0].length;\n var spaceAfter = skipWhiteSpace.exec(this.input), end = spaceAfter.index + spaceAfter[0].length;\n var next = this.input.charAt(end);\n return next === \";\" || next === \"}\" ||\n (lineBreak.test(spaceAfter[0]) &&\n !(/[(`.[+\\-/*%<>=,?^&]/.test(next) || next === \"!\" && this.input.charAt(end + 1) === \"=\"))\n }\n start += match[0].length;\n\n // Skip semicolon, if any.\n skipWhiteSpace.lastIndex = start;\n start += skipWhiteSpace.exec(this.input)[0].length;\n if (this.input[start] === \";\")\n { start++; }\n }\n};\n\n// Predicate that tests whether the next token is of the given\n// type, and if yes, consumes it as a side effect.\n\npp.eat = function(type) {\n if (this.type === type) {\n this.next();\n return true\n } else {\n return false\n }\n};\n\n// Tests whether parsed token is a contextual keyword.\n\npp.isContextual = function(name) {\n return this.type === types.name && this.value === name && !this.containsEsc\n};\n\n// Consumes contextual keyword if possible.\n\npp.eatContextual = function(name) {\n if (!this.isContextual(name)) { return false }\n this.next();\n return true\n};\n\n// Asserts that following token is given contextual keyword.\n\npp.expectContextual = function(name) {\n if (!this.eatContextual(name)) { this.unexpected(); }\n};\n\n// Test whether a semicolon can be inserted at the current position.\n\npp.canInsertSemicolon = function() {\n return this.type === types.eof ||\n this.type === types.braceR ||\n lineBreak.test(this.input.slice(this.lastTokEnd, this.start))\n};\n\npp.insertSemicolon = function() {\n if (this.canInsertSemicolon()) {\n if (this.options.onInsertedSemicolon)\n { this.options.onInsertedSemicolon(this.lastTokEnd, this.lastTokEndLoc); }\n return true\n }\n};\n\n// Consume a semicolon, or, failing that, see if we are allowed to\n// pretend that there is a semicolon at this position.\n\npp.semicolon = function() {\n if (!this.eat(types.semi) && !this.insertSemicolon()) { this.unexpected(); }\n};\n\npp.afterTrailingComma = function(tokType, notNext) {\n if (this.type === tokType) {\n if (this.options.onTrailingComma)\n { this.options.onTrailingComma(this.lastTokStart, this.lastTokStartLoc); }\n if (!notNext)\n { this.next(); }\n return true\n }\n};\n\n// Expect a token of a given type. If found, consume it, otherwise,\n// raise an unexpected token error.\n\npp.expect = function(type) {\n this.eat(type) || this.unexpected();\n};\n\n// Raise an unexpected token error.\n\npp.unexpected = function(pos) {\n this.raise(pos != null ? pos : this.start, \"Unexpected token\");\n};\n\nfunction DestructuringErrors() {\n this.shorthandAssign =\n this.trailingComma =\n this.parenthesizedAssign =\n this.parenthesizedBind =\n this.doubleProto =\n -1;\n}\n\npp.checkPatternErrors = function(refDestructuringErrors, isAssign) {\n if (!refDestructuringErrors) { return }\n if (refDestructuringErrors.trailingComma > -1)\n { this.raiseRecoverable(refDestructuringErrors.trailingComma, \"Comma is not permitted after the rest element\"); }\n var parens = isAssign ? refDestructuringErrors.parenthesizedAssign : refDestructuringErrors.parenthesizedBind;\n if (parens > -1) { this.raiseRecoverable(parens, \"Parenthesized pattern\"); }\n};\n\npp.checkExpressionErrors = function(refDestructuringErrors, andThrow) {\n if (!refDestructuringErrors) { return false }\n var shorthandAssign = refDestructuringErrors.shorthandAssign;\n var doubleProto = refDestructuringErrors.doubleProto;\n if (!andThrow) { return shorthandAssign >= 0 || doubleProto >= 0 }\n if (shorthandAssign >= 0)\n { this.raise(shorthandAssign, \"Shorthand property assignments are valid only in destructuring patterns\"); }\n if (doubleProto >= 0)\n { this.raiseRecoverable(doubleProto, \"Redefinition of __proto__ property\"); }\n};\n\npp.checkYieldAwaitInDefaultParams = function() {\n if (this.yieldPos && (!this.awaitPos || this.yieldPos < this.awaitPos))\n { this.raise(this.yieldPos, \"Yield expression cannot be a default value\"); }\n if (this.awaitPos)\n { this.raise(this.awaitPos, \"Await expression cannot be a default value\"); }\n};\n\npp.isSimpleAssignTarget = function(expr) {\n if (expr.type === \"ParenthesizedExpression\")\n { return this.isSimpleAssignTarget(expr.expression) }\n return expr.type === \"Identifier\" || expr.type === \"MemberExpression\"\n};\n\nvar pp$1 = Parser.prototype;\n\n// ### Statement parsing\n\n// Parse a program. Initializes the parser, reads any number of\n// statements, and wraps them in a Program node. Optionally takes a\n// `program` argument. If present, the statements will be appended\n// to its body instead of creating a new node.\n\npp$1.parseTopLevel = function(node) {\n var exports = {};\n if (!node.body) { node.body = []; }\n while (this.type !== types.eof) {\n var stmt = this.parseStatement(null, true, exports);\n node.body.push(stmt);\n }\n if (this.inModule)\n { for (var i = 0, list = Object.keys(this.undefinedExports); i < list.length; i += 1)\n {\n var name = list[i];\n\n this.raiseRecoverable(this.undefinedExports[name].start, (\"Export '\" + name + \"' is not defined\"));\n } }\n this.adaptDirectivePrologue(node.body);\n this.next();\n node.sourceType = this.options.sourceType;\n return this.finishNode(node, \"Program\")\n};\n\nvar loopLabel = {kind: \"loop\"}, switchLabel = {kind: \"switch\"};\n\npp$1.isLet = function(context) {\n if (this.options.ecmaVersion < 6 || !this.isContextual(\"let\")) { return false }\n skipWhiteSpace.lastIndex = this.pos;\n var skip = skipWhiteSpace.exec(this.input);\n var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next);\n // For ambiguous cases, determine if a LexicalDeclaration (or only a\n // Statement) is allowed here. If context is not empty then only a Statement\n // is allowed. However, `let [` is an explicit negative lookahead for\n // ExpressionStatement, so special-case it first.\n if (nextCh === 91) { return true } // '['\n if (context) { return false }\n\n if (nextCh === 123) { return true } // '{'\n if (isIdentifierStart(nextCh, true)) {\n var pos = next + 1;\n while (isIdentifierChar(this.input.charCodeAt(pos), true)) { ++pos; }\n var ident = this.input.slice(next, pos);\n if (!keywordRelationalOperator.test(ident)) { return true }\n }\n return false\n};\n\n// check 'async [no LineTerminator here] function'\n// - 'async /*foo*/ function' is OK.\n// - 'async /*\\n*/ function' is invalid.\npp$1.isAsyncFunction = function() {\n if (this.options.ecmaVersion < 8 || !this.isContextual(\"async\"))\n { return false }\n\n skipWhiteSpace.lastIndex = this.pos;\n var skip = skipWhiteSpace.exec(this.input);\n var next = this.pos + skip[0].length;\n return !lineBreak.test(this.input.slice(this.pos, next)) &&\n this.input.slice(next, next + 8) === \"function\" &&\n (next + 8 === this.input.length || !isIdentifierChar(this.input.charAt(next + 8)))\n};\n\n// Parse a single statement.\n//\n// If expecting a statement and finding a slash operator, parse a\n// regular expression literal. This is to handle cases like\n// `if (foo) /blah/.exec(foo)`, where looking at the previous token\n// does not help.\n\npp$1.parseStatement = function(context, topLevel, exports) {\n var starttype = this.type, node = this.startNode(), kind;\n\n if (this.isLet(context)) {\n starttype = types._var;\n kind = \"let\";\n }\n\n // Most types of statements are recognized by the keyword they\n // start with. Many are trivial to parse, some require a bit of\n // complexity.\n\n switch (starttype) {\n case types._break: case types._continue: return this.parseBreakContinueStatement(node, starttype.keyword)\n case types._debugger: return this.parseDebuggerStatement(node)\n case types._do: return this.parseDoStatement(node)\n case types._for: return this.parseForStatement(node)\n case types._function:\n // Function as sole body of either an if statement or a labeled statement\n // works, but not when it is part of a labeled statement that is the sole\n // body of an if statement.\n if ((context && (this.strict || context !== \"if\" && context !== \"label\")) && this.options.ecmaVersion >= 6) { this.unexpected(); }\n return this.parseFunctionStatement(node, false, !context)\n case types._class:\n if (context) { this.unexpected(); }\n return this.parseClass(node, true)\n case types._if: return this.parseIfStatement(node)\n case types._return: return this.parseReturnStatement(node)\n case types._switch: return this.parseSwitchStatement(node)\n case types._throw: return this.parseThrowStatement(node)\n case types._try: return this.parseTryStatement(node)\n case types._const: case types._var:\n kind = kind || this.value;\n if (context && kind !== \"var\") { this.unexpected(); }\n return this.parseVarStatement(node, kind)\n case types._while: return this.parseWhileStatement(node)\n case types._with: return this.parseWithStatement(node)\n case types.braceL: return this.parseBlock(true, node)\n case types.semi: return this.parseEmptyStatement(node)\n case types._export:\n case types._import:\n if (this.options.ecmaVersion > 10 && starttype === types._import) {\n skipWhiteSpace.lastIndex = this.pos;\n var skip = skipWhiteSpace.exec(this.input);\n var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next);\n if (nextCh === 40 || nextCh === 46) // '(' or '.'\n { return this.parseExpressionStatement(node, this.parseExpression()) }\n }\n\n if (!this.options.allowImportExportEverywhere) {\n if (!topLevel)\n { this.raise(this.start, \"'import' and 'export' may only appear at the top level\"); }\n if (!this.inModule)\n { this.raise(this.start, \"'import' and 'export' may appear only with 'sourceType: module'\"); }\n }\n return starttype === types._import ? this.parseImport(node) : this.parseExport(node, exports)\n\n // If the statement does not start with a statement keyword or a\n // brace, it's an ExpressionStatement or LabeledStatement. We\n // simply start parsing an expression, and afterwards, if the\n // next token is a colon and the expression was a simple\n // Identifier node, we switch to interpreting it as a label.\n default:\n if (this.isAsyncFunction()) {\n if (context) { this.unexpected(); }\n this.next();\n return this.parseFunctionStatement(node, true, !context)\n }\n\n var maybeName = this.value, expr = this.parseExpression();\n if (starttype === types.name && expr.type === \"Identifier\" && this.eat(types.colon))\n { return this.parseLabeledStatement(node, maybeName, expr, context) }\n else { return this.parseExpressionStatement(node, expr) }\n }\n};\n\npp$1.parseBreakContinueStatement = function(node, keyword) {\n var isBreak = keyword === \"break\";\n this.next();\n if (this.eat(types.semi) || this.insertSemicolon()) { node.label = null; }\n else if (this.type !== types.name) { this.unexpected(); }\n else {\n node.label = this.parseIdent();\n this.semicolon();\n }\n\n // Verify that there is an actual destination to break or\n // continue to.\n var i = 0;\n for (; i < this.labels.length; ++i) {\n var lab = this.labels[i];\n if (node.label == null || lab.name === node.label.name) {\n if (lab.kind != null && (isBreak || lab.kind === \"loop\")) { break }\n if (node.label && isBreak) { break }\n }\n }\n if (i === this.labels.length) { this.raise(node.start, \"Unsyntactic \" + keyword); }\n return this.finishNode(node, isBreak ? \"BreakStatement\" : \"ContinueStatement\")\n};\n\npp$1.parseDebuggerStatement = function(node) {\n this.next();\n this.semicolon();\n return this.finishNode(node, \"DebuggerStatement\")\n};\n\npp$1.parseDoStatement = function(node) {\n this.next();\n this.labels.push(loopLabel);\n node.body = this.parseStatement(\"do\");\n this.labels.pop();\n this.expect(types._while);\n node.test = this.parseParenExpression();\n if (this.options.ecmaVersion >= 6)\n { this.eat(types.semi); }\n else\n { this.semicolon(); }\n return this.finishNode(node, \"DoWhileStatement\")\n};\n\n// Disambiguating between a `for` and a `for`/`in` or `for`/`of`\n// loop is non-trivial. Basically, we have to parse the init `var`\n// statement or expression, disallowing the `in` operator (see\n// the second parameter to `parseExpression`), and then check\n// whether the next token is `in` or `of`. When there is no init\n// part (semicolon immediately after the opening parenthesis), it\n// is a regular `for` loop.\n\npp$1.parseForStatement = function(node) {\n this.next();\n var awaitAt = (this.options.ecmaVersion >= 9 && (this.inAsync || (!this.inFunction && this.options.allowAwaitOutsideFunction)) && this.eatContextual(\"await\")) ? this.lastTokStart : -1;\n this.labels.push(loopLabel);\n this.enterScope(0);\n this.expect(types.parenL);\n if (this.type === types.semi) {\n if (awaitAt > -1) { this.unexpected(awaitAt); }\n return this.parseFor(node, null)\n }\n var isLet = this.isLet();\n if (this.type === types._var || this.type === types._const || isLet) {\n var init$1 = this.startNode(), kind = isLet ? \"let\" : this.value;\n this.next();\n this.parseVar(init$1, true, kind);\n this.finishNode(init$1, \"VariableDeclaration\");\n if ((this.type === types._in || (this.options.ecmaVersion >= 6 && this.isContextual(\"of\"))) && init$1.declarations.length === 1) {\n if (this.options.ecmaVersion >= 9) {\n if (this.type === types._in) {\n if (awaitAt > -1) { this.unexpected(awaitAt); }\n } else { node.await = awaitAt > -1; }\n }\n return this.parseForIn(node, init$1)\n }\n if (awaitAt > -1) { this.unexpected(awaitAt); }\n return this.parseFor(node, init$1)\n }\n var refDestructuringErrors = new DestructuringErrors;\n var init = this.parseExpression(true, refDestructuringErrors);\n if (this.type === types._in || (this.options.ecmaVersion >= 6 && this.isContextual(\"of\"))) {\n if (this.options.ecmaVersion >= 9) {\n if (this.type === types._in) {\n if (awaitAt > -1) { this.unexpected(awaitAt); }\n } else { node.await = awaitAt > -1; }\n }\n this.toAssignable(init, false, refDestructuringErrors);\n this.checkLVal(init);\n return this.parseForIn(node, init)\n } else {\n this.checkExpressionErrors(refDestructuringErrors, true);\n }\n if (awaitAt > -1) { this.unexpected(awaitAt); }\n return this.parseFor(node, init)\n};\n\npp$1.parseFunctionStatement = function(node, isAsync, declarationPosition) {\n this.next();\n return this.parseFunction(node, FUNC_STATEMENT | (declarationPosition ? 0 : FUNC_HANGING_STATEMENT), false, isAsync)\n};\n\npp$1.parseIfStatement = function(node) {\n this.next();\n node.test = this.parseParenExpression();\n // allow function declarations in branches, but only in non-strict mode\n node.consequent = this.parseStatement(\"if\");\n node.alternate = this.eat(types._else) ? this.parseStatement(\"if\") : null;\n return this.finishNode(node, \"IfStatement\")\n};\n\npp$1.parseReturnStatement = function(node) {\n if (!this.inFunction && !this.options.allowReturnOutsideFunction)\n { this.raise(this.start, \"'return' outside of function\"); }\n this.next();\n\n // In `return` (and `break`/`continue`), the keywords with\n // optional arguments, we eagerly look for a semicolon or the\n // possibility to insert one.\n\n if (this.eat(types.semi) || this.insertSemicolon()) { node.argument = null; }\n else { node.argument = this.parseExpression(); this.semicolon(); }\n return this.finishNode(node, \"ReturnStatement\")\n};\n\npp$1.parseSwitchStatement = function(node) {\n this.next();\n node.discriminant = this.parseParenExpression();\n node.cases = [];\n this.expect(types.braceL);\n this.labels.push(switchLabel);\n this.enterScope(0);\n\n // Statements under must be grouped (by label) in SwitchCase\n // nodes. `cur` is used to keep the node that we are currently\n // adding statements to.\n\n var cur;\n for (var sawDefault = false; this.type !== types.braceR;) {\n if (this.type === types._case || this.type === types._default) {\n var isCase = this.type === types._case;\n if (cur) { this.finishNode(cur, \"SwitchCase\"); }\n node.cases.push(cur = this.startNode());\n cur.consequent = [];\n this.next();\n if (isCase) {\n cur.test = this.parseExpression();\n } else {\n if (sawDefault) { this.raiseRecoverable(this.lastTokStart, \"Multiple default clauses\"); }\n sawDefault = true;\n cur.test = null;\n }\n this.expect(types.colon);\n } else {\n if (!cur) { this.unexpected(); }\n cur.consequent.push(this.parseStatement(null));\n }\n }\n this.exitScope();\n if (cur) { this.finishNode(cur, \"SwitchCase\"); }\n this.next(); // Closing brace\n this.labels.pop();\n return this.finishNode(node, \"SwitchStatement\")\n};\n\npp$1.parseThrowStatement = function(node) {\n this.next();\n if (lineBreak.test(this.input.slice(this.lastTokEnd, this.start)))\n { this.raise(this.lastTokEnd, \"Illegal newline after throw\"); }\n node.argument = this.parseExpression();\n this.semicolon();\n return this.finishNode(node, \"ThrowStatement\")\n};\n\n// Reused empty array added for node fields that are always empty.\n\nvar empty = [];\n\npp$1.parseTryStatement = function(node) {\n this.next();\n node.block = this.parseBlock();\n node.handler = null;\n if (this.type === types._catch) {\n var clause = this.startNode();\n this.next();\n if (this.eat(types.parenL)) {\n clause.param = this.parseBindingAtom();\n var simple = clause.param.type === \"Identifier\";\n this.enterScope(simple ? SCOPE_SIMPLE_CATCH : 0);\n this.checkLVal(clause.param, simple ? BIND_SIMPLE_CATCH : BIND_LEXICAL);\n this.expect(types.parenR);\n } else {\n if (this.options.ecmaVersion < 10) { this.unexpected(); }\n clause.param = null;\n this.enterScope(0);\n }\n clause.body = this.parseBlock(false);\n this.exitScope();\n node.handler = this.finishNode(clause, \"CatchClause\");\n }\n node.finalizer = this.eat(types._finally) ? this.parseBlock() : null;\n if (!node.handler && !node.finalizer)\n { this.raise(node.start, \"Missing catch or finally clause\"); }\n return this.finishNode(node, \"TryStatement\")\n};\n\npp$1.parseVarStatement = function(node, kind) {\n this.next();\n this.parseVar(node, false, kind);\n this.semicolon();\n return this.finishNode(node, \"VariableDeclaration\")\n};\n\npp$1.parseWhileStatement = function(node) {\n this.next();\n node.test = this.parseParenExpression();\n this.labels.push(loopLabel);\n node.body = this.parseStatement(\"while\");\n this.labels.pop();\n return this.finishNode(node, \"WhileStatement\")\n};\n\npp$1.parseWithStatement = function(node) {\n if (this.strict) { this.raise(this.start, \"'with' in strict mode\"); }\n this.next();\n node.object = this.parseParenExpression();\n node.body = this.parseStatement(\"with\");\n return this.finishNode(node, \"WithStatement\")\n};\n\npp$1.parseEmptyStatement = function(node) {\n this.next();\n return this.finishNode(node, \"EmptyStatement\")\n};\n\npp$1.parseLabeledStatement = function(node, maybeName, expr, context) {\n for (var i$1 = 0, list = this.labels; i$1 < list.length; i$1 += 1)\n {\n var label = list[i$1];\n\n if (label.name === maybeName)\n { this.raise(expr.start, \"Label '\" + maybeName + \"' is already declared\");\n } }\n var kind = this.type.isLoop ? \"loop\" : this.type === types._switch ? \"switch\" : null;\n for (var i = this.labels.length - 1; i >= 0; i--) {\n var label$1 = this.labels[i];\n if (label$1.statementStart === node.start) {\n // Update information about previous labels on this node\n label$1.statementStart = this.start;\n label$1.kind = kind;\n } else { break }\n }\n this.labels.push({name: maybeName, kind: kind, statementStart: this.start});\n node.body = this.parseStatement(context ? context.indexOf(\"label\") === -1 ? context + \"label\" : context : \"label\");\n this.labels.pop();\n node.label = expr;\n return this.finishNode(node, \"LabeledStatement\")\n};\n\npp$1.parseExpressionStatement = function(node, expr) {\n node.expression = expr;\n this.semicolon();\n return this.finishNode(node, \"ExpressionStatement\")\n};\n\n// Parse a semicolon-enclosed block of statements, handling `\"use\n// strict\"` declarations when `allowStrict` is true (used for\n// function bodies).\n\npp$1.parseBlock = function(createNewLexicalScope, node, exitStrict) {\n if ( createNewLexicalScope === void 0 ) createNewLexicalScope = true;\n if ( node === void 0 ) node = this.startNode();\n\n node.body = [];\n this.expect(types.braceL);\n if (createNewLexicalScope) { this.enterScope(0); }\n while (this.type !== types.braceR) {\n var stmt = this.parseStatement(null);\n node.body.push(stmt);\n }\n if (exitStrict) { this.strict = false; }\n this.next();\n if (createNewLexicalScope) { this.exitScope(); }\n return this.finishNode(node, \"BlockStatement\")\n};\n\n// Parse a regular `for` loop. The disambiguation code in\n// `parseStatement` will already have parsed the init statement or\n// expression.\n\npp$1.parseFor = function(node, init) {\n node.init = init;\n this.expect(types.semi);\n node.test = this.type === types.semi ? null : this.parseExpression();\n this.expect(types.semi);\n node.update = this.type === types.parenR ? null : this.parseExpression();\n this.expect(types.parenR);\n node.body = this.parseStatement(\"for\");\n this.exitScope();\n this.labels.pop();\n return this.finishNode(node, \"ForStatement\")\n};\n\n// Parse a `for`/`in` and `for`/`of` loop, which are almost\n// same from parser's perspective.\n\npp$1.parseForIn = function(node, init) {\n var isForIn = this.type === types._in;\n this.next();\n\n if (\n init.type === \"VariableDeclaration\" &&\n init.declarations[0].init != null &&\n (\n !isForIn ||\n this.options.ecmaVersion < 8 ||\n this.strict ||\n init.kind !== \"var\" ||\n init.declarations[0].id.type !== \"Identifier\"\n )\n ) {\n this.raise(\n init.start,\n ((isForIn ? \"for-in\" : \"for-of\") + \" loop variable declaration may not have an initializer\")\n );\n } else if (init.type === \"AssignmentPattern\") {\n this.raise(init.start, \"Invalid left-hand side in for-loop\");\n }\n node.left = init;\n node.right = isForIn ? this.parseExpression() : this.parseMaybeAssign();\n this.expect(types.parenR);\n node.body = this.parseStatement(\"for\");\n this.exitScope();\n this.labels.pop();\n return this.finishNode(node, isForIn ? \"ForInStatement\" : \"ForOfStatement\")\n};\n\n// Parse a list of variable declarations.\n\npp$1.parseVar = function(node, isFor, kind) {\n node.declarations = [];\n node.kind = kind;\n for (;;) {\n var decl = this.startNode();\n this.parseVarId(decl, kind);\n if (this.eat(types.eq)) {\n decl.init = this.parseMaybeAssign(isFor);\n } else if (kind === \"const\" && !(this.type === types._in || (this.options.ecmaVersion >= 6 && this.isContextual(\"of\")))) {\n this.unexpected();\n } else if (decl.id.type !== \"Identifier\" && !(isFor && (this.type === types._in || this.isContextual(\"of\")))) {\n this.raise(this.lastTokEnd, \"Complex binding patterns require an initialization value\");\n } else {\n decl.init = null;\n }\n node.declarations.push(this.finishNode(decl, \"VariableDeclarator\"));\n if (!this.eat(types.comma)) { break }\n }\n return node\n};\n\npp$1.parseVarId = function(decl, kind) {\n decl.id = this.parseBindingAtom();\n this.checkLVal(decl.id, kind === \"var\" ? BIND_VAR : BIND_LEXICAL, false);\n};\n\nvar FUNC_STATEMENT = 1, FUNC_HANGING_STATEMENT = 2, FUNC_NULLABLE_ID = 4;\n\n// Parse a function declaration or literal (depending on the\n// `statement & FUNC_STATEMENT`).\n\n// Remove `allowExpressionBody` for 7.0.0, as it is only called with false\npp$1.parseFunction = function(node, statement, allowExpressionBody, isAsync) {\n this.initFunction(node);\n if (this.options.ecmaVersion >= 9 || this.options.ecmaVersion >= 6 && !isAsync) {\n if (this.type === types.star && (statement & FUNC_HANGING_STATEMENT))\n { this.unexpected(); }\n node.generator = this.eat(types.star);\n }\n if (this.options.ecmaVersion >= 8)\n { node.async = !!isAsync; }\n\n if (statement & FUNC_STATEMENT) {\n node.id = (statement & FUNC_NULLABLE_ID) && this.type !== types.name ? null : this.parseIdent();\n if (node.id && !(statement & FUNC_HANGING_STATEMENT))\n // If it is a regular function declaration in sloppy mode, then it is\n // subject to Annex B semantics (BIND_FUNCTION). Otherwise, the binding\n // mode depends on properties of the current scope (see\n // treatFunctionsAsVar).\n { this.checkLVal(node.id, (this.strict || node.generator || node.async) ? this.treatFunctionsAsVar ? BIND_VAR : BIND_LEXICAL : BIND_FUNCTION); }\n }\n\n var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;\n this.yieldPos = 0;\n this.awaitPos = 0;\n this.awaitIdentPos = 0;\n this.enterScope(functionFlags(node.async, node.generator));\n\n if (!(statement & FUNC_STATEMENT))\n { node.id = this.type === types.name ? this.parseIdent() : null; }\n\n this.parseFunctionParams(node);\n this.parseFunctionBody(node, allowExpressionBody, false);\n\n this.yieldPos = oldYieldPos;\n this.awaitPos = oldAwaitPos;\n this.awaitIdentPos = oldAwaitIdentPos;\n return this.finishNode(node, (statement & FUNC_STATEMENT) ? \"FunctionDeclaration\" : \"FunctionExpression\")\n};\n\npp$1.parseFunctionParams = function(node) {\n this.expect(types.parenL);\n node.params = this.parseBindingList(types.parenR, false, this.options.ecmaVersion >= 8);\n this.checkYieldAwaitInDefaultParams();\n};\n\n// Parse a class declaration or literal (depending on the\n// `isStatement` parameter).\n\npp$1.parseClass = function(node, isStatement) {\n this.next();\n\n // ecma-262 14.6 Class Definitions\n // A class definition is always strict mode code.\n var oldStrict = this.strict;\n this.strict = true;\n\n this.parseClassId(node, isStatement);\n this.parseClassSuper(node);\n var classBody = this.startNode();\n var hadConstructor = false;\n classBody.body = [];\n this.expect(types.braceL);\n while (this.type !== types.braceR) {\n var element = this.parseClassElement(node.superClass !== null);\n if (element) {\n classBody.body.push(element);\n if (element.type === \"MethodDefinition\" && element.kind === \"constructor\") {\n if (hadConstructor) { this.raise(element.start, \"Duplicate constructor in the same class\"); }\n hadConstructor = true;\n }\n }\n }\n this.strict = oldStrict;\n this.next();\n node.body = this.finishNode(classBody, \"ClassBody\");\n return this.finishNode(node, isStatement ? \"ClassDeclaration\" : \"ClassExpression\")\n};\n\npp$1.parseClassElement = function(constructorAllowsSuper) {\n var this$1 = this;\n\n if (this.eat(types.semi)) { return null }\n\n var method = this.startNode();\n var tryContextual = function (k, noLineBreak) {\n if ( noLineBreak === void 0 ) noLineBreak = false;\n\n var start = this$1.start, startLoc = this$1.startLoc;\n if (!this$1.eatContextual(k)) { return false }\n if (this$1.type !== types.parenL && (!noLineBreak || !this$1.canInsertSemicolon())) { return true }\n if (method.key) { this$1.unexpected(); }\n method.computed = false;\n method.key = this$1.startNodeAt(start, startLoc);\n method.key.name = k;\n this$1.finishNode(method.key, \"Identifier\");\n return false\n };\n\n method.kind = \"method\";\n method.static = tryContextual(\"static\");\n var isGenerator = this.eat(types.star);\n var isAsync = false;\n if (!isGenerator) {\n if (this.options.ecmaVersion >= 8 && tryContextual(\"async\", true)) {\n isAsync = true;\n isGenerator = this.options.ecmaVersion >= 9 && this.eat(types.star);\n } else if (tryContextual(\"get\")) {\n method.kind = \"get\";\n } else if (tryContextual(\"set\")) {\n method.kind = \"set\";\n }\n }\n if (!method.key) { this.parsePropertyName(method); }\n var key = method.key;\n var allowsDirectSuper = false;\n if (!method.computed && !method.static && (key.type === \"Identifier\" && key.name === \"constructor\" ||\n key.type === \"Literal\" && key.value === \"constructor\")) {\n if (method.kind !== \"method\") { this.raise(key.start, \"Constructor can't have get/set modifier\"); }\n if (isGenerator) { this.raise(key.start, \"Constructor can't be a generator\"); }\n if (isAsync) { this.raise(key.start, \"Constructor can't be an async method\"); }\n method.kind = \"constructor\";\n allowsDirectSuper = constructorAllowsSuper;\n } else if (method.static && key.type === \"Identifier\" && key.name === \"prototype\") {\n this.raise(key.start, \"Classes may not have a static property named prototype\");\n }\n this.parseClassMethod(method, isGenerator, isAsync, allowsDirectSuper);\n if (method.kind === \"get\" && method.value.params.length !== 0)\n { this.raiseRecoverable(method.value.start, \"getter should have no params\"); }\n if (method.kind === \"set\" && method.value.params.length !== 1)\n { this.raiseRecoverable(method.value.start, \"setter should have exactly one param\"); }\n if (method.kind === \"set\" && method.value.params[0].type === \"RestElement\")\n { this.raiseRecoverable(method.value.params[0].start, \"Setter cannot use rest params\"); }\n return method\n};\n\npp$1.parseClassMethod = function(method, isGenerator, isAsync, allowsDirectSuper) {\n method.value = this.parseMethod(isGenerator, isAsync, allowsDirectSuper);\n return this.finishNode(method, \"MethodDefinition\")\n};\n\npp$1.parseClassId = function(node, isStatement) {\n if (this.type === types.name) {\n node.id = this.parseIdent();\n if (isStatement)\n { this.checkLVal(node.id, BIND_LEXICAL, false); }\n } else {\n if (isStatement === true)\n { this.unexpected(); }\n node.id = null;\n }\n};\n\npp$1.parseClassSuper = function(node) {\n node.superClass = this.eat(types._extends) ? this.parseExprSubscripts() : null;\n};\n\n// Parses module export declaration.\n\npp$1.parseExport = function(node, exports) {\n this.next();\n // export * from '...'\n if (this.eat(types.star)) {\n if (this.options.ecmaVersion >= 11) {\n if (this.eatContextual(\"as\")) {\n node.exported = this.parseIdent(true);\n this.checkExport(exports, node.exported.name, this.lastTokStart);\n } else {\n node.exported = null;\n }\n }\n this.expectContextual(\"from\");\n if (this.type !== types.string) { this.unexpected(); }\n node.source = this.parseExprAtom();\n this.semicolon();\n return this.finishNode(node, \"ExportAllDeclaration\")\n }\n if (this.eat(types._default)) { // export default ...\n this.checkExport(exports, \"default\", this.lastTokStart);\n var isAsync;\n if (this.type === types._function || (isAsync = this.isAsyncFunction())) {\n var fNode = this.startNode();\n this.next();\n if (isAsync) { this.next(); }\n node.declaration = this.parseFunction(fNode, FUNC_STATEMENT | FUNC_NULLABLE_ID, false, isAsync);\n } else if (this.type === types._class) {\n var cNode = this.startNode();\n node.declaration = this.parseClass(cNode, \"nullableID\");\n } else {\n node.declaration = this.parseMaybeAssign();\n this.semicolon();\n }\n return this.finishNode(node, \"ExportDefaultDeclaration\")\n }\n // export var|const|let|function|class ...\n if (this.shouldParseExportStatement()) {\n node.declaration = this.parseStatement(null);\n if (node.declaration.type === \"VariableDeclaration\")\n { this.checkVariableExport(exports, node.declaration.declarations); }\n else\n { this.checkExport(exports, node.declaration.id.name, node.declaration.id.start); }\n node.specifiers = [];\n node.source = null;\n } else { // export { x, y as z } [from '...']\n node.declaration = null;\n node.specifiers = this.parseExportSpecifiers(exports);\n if (this.eatContextual(\"from\")) {\n if (this.type !== types.string) { this.unexpected(); }\n node.source = this.parseExprAtom();\n } else {\n for (var i = 0, list = node.specifiers; i < list.length; i += 1) {\n // check for keywords used as local names\n var spec = list[i];\n\n this.checkUnreserved(spec.local);\n // check if export is defined\n this.checkLocalExport(spec.local);\n }\n\n node.source = null;\n }\n this.semicolon();\n }\n return this.finishNode(node, \"ExportNamedDeclaration\")\n};\n\npp$1.checkExport = function(exports, name, pos) {\n if (!exports) { return }\n if (has(exports, name))\n { this.raiseRecoverable(pos, \"Duplicate export '\" + name + \"'\"); }\n exports[name] = true;\n};\n\npp$1.checkPatternExport = function(exports, pat) {\n var type = pat.type;\n if (type === \"Identifier\")\n { this.checkExport(exports, pat.name, pat.start); }\n else if (type === \"ObjectPattern\")\n { for (var i = 0, list = pat.properties; i < list.length; i += 1)\n {\n var prop = list[i];\n\n this.checkPatternExport(exports, prop);\n } }\n else if (type === \"ArrayPattern\")\n { for (var i$1 = 0, list$1 = pat.elements; i$1 < list$1.length; i$1 += 1) {\n var elt = list$1[i$1];\n\n if (elt) { this.checkPatternExport(exports, elt); }\n } }\n else if (type === \"Property\")\n { this.checkPatternExport(exports, pat.value); }\n else if (type === \"AssignmentPattern\")\n { this.checkPatternExport(exports, pat.left); }\n else if (type === \"RestElement\")\n { this.checkPatternExport(exports, pat.argument); }\n else if (type === \"ParenthesizedExpression\")\n { this.checkPatternExport(exports, pat.expression); }\n};\n\npp$1.checkVariableExport = function(exports, decls) {\n if (!exports) { return }\n for (var i = 0, list = decls; i < list.length; i += 1)\n {\n var decl = list[i];\n\n this.checkPatternExport(exports, decl.id);\n }\n};\n\npp$1.shouldParseExportStatement = function() {\n return this.type.keyword === \"var\" ||\n this.type.keyword === \"const\" ||\n this.type.keyword === \"class\" ||\n this.type.keyword === \"function\" ||\n this.isLet() ||\n this.isAsyncFunction()\n};\n\n// Parses a comma-separated list of module exports.\n\npp$1.parseExportSpecifiers = function(exports) {\n var nodes = [], first = true;\n // export { x, y as z } [from '...']\n this.expect(types.braceL);\n while (!this.eat(types.braceR)) {\n if (!first) {\n this.expect(types.comma);\n if (this.afterTrailingComma(types.braceR)) { break }\n } else { first = false; }\n\n var node = this.startNode();\n node.local = this.parseIdent(true);\n node.exported = this.eatContextual(\"as\") ? this.parseIdent(true) : node.local;\n this.checkExport(exports, node.exported.name, node.exported.start);\n nodes.push(this.finishNode(node, \"ExportSpecifier\"));\n }\n return nodes\n};\n\n// Parses import declaration.\n\npp$1.parseImport = function(node) {\n this.next();\n // import '...'\n if (this.type === types.string) {\n node.specifiers = empty;\n node.source = this.parseExprAtom();\n } else {\n node.specifiers = this.parseImportSpecifiers();\n this.expectContextual(\"from\");\n node.source = this.type === types.string ? this.parseExprAtom() : this.unexpected();\n }\n this.semicolon();\n return this.finishNode(node, \"ImportDeclaration\")\n};\n\n// Parses a comma-separated list of module imports.\n\npp$1.parseImportSpecifiers = function() {\n var nodes = [], first = true;\n if (this.type === types.name) {\n // import defaultObj, { x, y as z } from '...'\n var node = this.startNode();\n node.local = this.parseIdent();\n this.checkLVal(node.local, BIND_LEXICAL);\n nodes.push(this.finishNode(node, \"ImportDefaultSpecifier\"));\n if (!this.eat(types.comma)) { return nodes }\n }\n if (this.type === types.star) {\n var node$1 = this.startNode();\n this.next();\n this.expectContextual(\"as\");\n node$1.local = this.parseIdent();\n this.checkLVal(node$1.local, BIND_LEXICAL);\n nodes.push(this.finishNode(node$1, \"ImportNamespaceSpecifier\"));\n return nodes\n }\n this.expect(types.braceL);\n while (!this.eat(types.braceR)) {\n if (!first) {\n this.expect(types.comma);\n if (this.afterTrailingComma(types.braceR)) { break }\n } else { first = false; }\n\n var node$2 = this.startNode();\n node$2.imported = this.parseIdent(true);\n if (this.eatContextual(\"as\")) {\n node$2.local = this.parseIdent();\n } else {\n this.checkUnreserved(node$2.imported);\n node$2.local = node$2.imported;\n }\n this.checkLVal(node$2.local, BIND_LEXICAL);\n nodes.push(this.finishNode(node$2, \"ImportSpecifier\"));\n }\n return nodes\n};\n\n// Set `ExpressionStatement#directive` property for directive prologues.\npp$1.adaptDirectivePrologue = function(statements) {\n for (var i = 0; i < statements.length && this.isDirectiveCandidate(statements[i]); ++i) {\n statements[i].directive = statements[i].expression.raw.slice(1, -1);\n }\n};\npp$1.isDirectiveCandidate = function(statement) {\n return (\n statement.type === \"ExpressionStatement\" &&\n statement.expression.type === \"Literal\" &&\n typeof statement.expression.value === \"string\" &&\n // Reject parenthesized strings.\n (this.input[statement.start] === \"\\\"\" || this.input[statement.start] === \"'\")\n )\n};\n\nvar pp$2 = Parser.prototype;\n\n// Convert existing expression atom to assignable pattern\n// if possible.\n\npp$2.toAssignable = function(node, isBinding, refDestructuringErrors) {\n if (this.options.ecmaVersion >= 6 && node) {\n switch (node.type) {\n case \"Identifier\":\n if (this.inAsync && node.name === \"await\")\n { this.raise(node.start, \"Cannot use 'await' as identifier inside an async function\"); }\n break\n\n case \"ObjectPattern\":\n case \"ArrayPattern\":\n case \"RestElement\":\n break\n\n case \"ObjectExpression\":\n node.type = \"ObjectPattern\";\n if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); }\n for (var i = 0, list = node.properties; i < list.length; i += 1) {\n var prop = list[i];\n\n this.toAssignable(prop, isBinding);\n // Early error:\n // AssignmentRestProperty[Yield, Await] :\n // `...` DestructuringAssignmentTarget[Yield, Await]\n //\n // It is a Syntax Error if |DestructuringAssignmentTarget| is an |ArrayLiteral| or an |ObjectLiteral|.\n if (\n prop.type === \"RestElement\" &&\n (prop.argument.type === \"ArrayPattern\" || prop.argument.type === \"ObjectPattern\")\n ) {\n this.raise(prop.argument.start, \"Unexpected token\");\n }\n }\n break\n\n case \"Property\":\n // AssignmentProperty has type === \"Property\"\n if (node.kind !== \"init\") { this.raise(node.key.start, \"Object pattern can't contain getter or setter\"); }\n this.toAssignable(node.value, isBinding);\n break\n\n case \"ArrayExpression\":\n node.type = \"ArrayPattern\";\n if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); }\n this.toAssignableList(node.elements, isBinding);\n break\n\n case \"SpreadElement\":\n node.type = \"RestElement\";\n this.toAssignable(node.argument, isBinding);\n if (node.argument.type === \"AssignmentPattern\")\n { this.raise(node.argument.start, \"Rest elements cannot have a default value\"); }\n break\n\n case \"AssignmentExpression\":\n if (node.operator !== \"=\") { this.raise(node.left.end, \"Only '=' operator can be used for specifying default value.\"); }\n node.type = \"AssignmentPattern\";\n delete node.operator;\n this.toAssignable(node.left, isBinding);\n // falls through to AssignmentPattern\n\n case \"AssignmentPattern\":\n break\n\n case \"ParenthesizedExpression\":\n this.toAssignable(node.expression, isBinding, refDestructuringErrors);\n break\n\n case \"ChainExpression\":\n this.raiseRecoverable(node.start, \"Optional chaining cannot appear in left-hand side\");\n break\n\n case \"MemberExpression\":\n if (!isBinding) { break }\n\n default:\n this.raise(node.start, \"Assigning to rvalue\");\n }\n } else if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); }\n return node\n};\n\n// Convert list of expression atoms to binding list.\n\npp$2.toAssignableList = function(exprList, isBinding) {\n var end = exprList.length;\n for (var i = 0; i < end; i++) {\n var elt = exprList[i];\n if (elt) { this.toAssignable(elt, isBinding); }\n }\n if (end) {\n var last = exprList[end - 1];\n if (this.options.ecmaVersion === 6 && isBinding && last && last.type === \"RestElement\" && last.argument.type !== \"Identifier\")\n { this.unexpected(last.argument.start); }\n }\n return exprList\n};\n\n// Parses spread element.\n\npp$2.parseSpread = function(refDestructuringErrors) {\n var node = this.startNode();\n this.next();\n node.argument = this.parseMaybeAssign(false, refDestructuringErrors);\n return this.finishNode(node, \"SpreadElement\")\n};\n\npp$2.parseRestBinding = function() {\n var node = this.startNode();\n this.next();\n\n // RestElement inside of a function parameter must be an identifier\n if (this.options.ecmaVersion === 6 && this.type !== types.name)\n { this.unexpected(); }\n\n node.argument = this.parseBindingAtom();\n\n return this.finishNode(node, \"RestElement\")\n};\n\n// Parses lvalue (assignable) atom.\n\npp$2.parseBindingAtom = function() {\n if (this.options.ecmaVersion >= 6) {\n switch (this.type) {\n case types.bracketL:\n var node = this.startNode();\n this.next();\n node.elements = this.parseBindingList(types.bracketR, true, true);\n return this.finishNode(node, \"ArrayPattern\")\n\n case types.braceL:\n return this.parseObj(true)\n }\n }\n return this.parseIdent()\n};\n\npp$2.parseBindingList = function(close, allowEmpty, allowTrailingComma) {\n var elts = [], first = true;\n while (!this.eat(close)) {\n if (first) { first = false; }\n else { this.expect(types.comma); }\n if (allowEmpty && this.type === types.comma) {\n elts.push(null);\n } else if (allowTrailingComma && this.afterTrailingComma(close)) {\n break\n } else if (this.type === types.ellipsis) {\n var rest = this.parseRestBinding();\n this.parseBindingListItem(rest);\n elts.push(rest);\n if (this.type === types.comma) { this.raise(this.start, \"Comma is not permitted after the rest element\"); }\n this.expect(close);\n break\n } else {\n var elem = this.parseMaybeDefault(this.start, this.startLoc);\n this.parseBindingListItem(elem);\n elts.push(elem);\n }\n }\n return elts\n};\n\npp$2.parseBindingListItem = function(param) {\n return param\n};\n\n// Parses assignment pattern around given atom if possible.\n\npp$2.parseMaybeDefault = function(startPos, startLoc, left) {\n left = left || this.parseBindingAtom();\n if (this.options.ecmaVersion < 6 || !this.eat(types.eq)) { return left }\n var node = this.startNodeAt(startPos, startLoc);\n node.left = left;\n node.right = this.parseMaybeAssign();\n return this.finishNode(node, \"AssignmentPattern\")\n};\n\n// Verify that a node is an lval \u2014 something that can be assigned\n// to.\n// bindingType can be either:\n// 'var' indicating that the lval creates a 'var' binding\n// 'let' indicating that the lval creates a lexical ('let' or 'const') binding\n// 'none' indicating that the binding should be checked for illegal identifiers, but not for duplicate references\n\npp$2.checkLVal = function(expr, bindingType, checkClashes) {\n if ( bindingType === void 0 ) bindingType = BIND_NONE;\n\n switch (expr.type) {\n case \"Identifier\":\n if (bindingType === BIND_LEXICAL && expr.name === \"let\")\n { this.raiseRecoverable(expr.start, \"let is disallowed as a lexically bound name\"); }\n if (this.strict && this.reservedWordsStrictBind.test(expr.name))\n { this.raiseRecoverable(expr.start, (bindingType ? \"Binding \" : \"Assigning to \") + expr.name + \" in strict mode\"); }\n if (checkClashes) {\n if (has(checkClashes, expr.name))\n { this.raiseRecoverable(expr.start, \"Argument name clash\"); }\n checkClashes[expr.name] = true;\n }\n if (bindingType !== BIND_NONE && bindingType !== BIND_OUTSIDE) { this.declareName(expr.name, bindingType, expr.start); }\n break\n\n case \"ChainExpression\":\n this.raiseRecoverable(expr.start, \"Optional chaining cannot appear in left-hand side\");\n break\n\n case \"MemberExpression\":\n if (bindingType) { this.raiseRecoverable(expr.start, \"Binding member expression\"); }\n break\n\n case \"ObjectPattern\":\n for (var i = 0, list = expr.properties; i < list.length; i += 1)\n {\n var prop = list[i];\n\n this.checkLVal(prop, bindingType, checkClashes);\n }\n break\n\n case \"Property\":\n // AssignmentProperty has type === \"Property\"\n this.checkLVal(expr.value, bindingType, checkClashes);\n break\n\n case \"ArrayPattern\":\n for (var i$1 = 0, list$1 = expr.elements; i$1 < list$1.length; i$1 += 1) {\n var elem = list$1[i$1];\n\n if (elem) { this.checkLVal(elem, bindingType, checkClashes); }\n }\n break\n\n case \"AssignmentPattern\":\n this.checkLVal(expr.left, bindingType, checkClashes);\n break\n\n case \"RestElement\":\n this.checkLVal(expr.argument, bindingType, checkClashes);\n break\n\n case \"ParenthesizedExpression\":\n this.checkLVal(expr.expression, bindingType, checkClashes);\n break\n\n default:\n this.raise(expr.start, (bindingType ? \"Binding\" : \"Assigning to\") + \" rvalue\");\n }\n};\n\n// A recursive descent parser operates by defining functions for all\n\nvar pp$3 = Parser.prototype;\n\n// Check if property name clashes with already added.\n// Object/class getters and setters are not allowed to clash \u2014\n// either with each other or with an init property \u2014 and in\n// strict mode, init properties are also not allowed to be repeated.\n\npp$3.checkPropClash = function(prop, propHash, refDestructuringErrors) {\n if (this.options.ecmaVersion >= 9 && prop.type === \"SpreadElement\")\n { return }\n if (this.options.ecmaVersion >= 6 && (prop.computed || prop.method || prop.shorthand))\n { return }\n var key = prop.key;\n var name;\n switch (key.type) {\n case \"Identifier\": name = key.name; break\n case \"Literal\": name = String(key.value); break\n default: return\n }\n var kind = prop.kind;\n if (this.options.ecmaVersion >= 6) {\n if (name === \"__proto__\" && kind === \"init\") {\n if (propHash.proto) {\n if (refDestructuringErrors) {\n if (refDestructuringErrors.doubleProto < 0)\n { refDestructuringErrors.doubleProto = key.start; }\n // Backwards-compat kludge. Can be removed in version 6.0\n } else { this.raiseRecoverable(key.start, \"Redefinition of __proto__ property\"); }\n }\n propHash.proto = true;\n }\n return\n }\n name = \"$\" + name;\n var other = propHash[name];\n if (other) {\n var redefinition;\n if (kind === \"init\") {\n redefinition = this.strict && other.init || other.get || other.set;\n } else {\n redefinition = other.init || other[kind];\n }\n if (redefinition)\n { this.raiseRecoverable(key.start, \"Redefinition of property\"); }\n } else {\n other = propHash[name] = {\n init: false,\n get: false,\n set: false\n };\n }\n other[kind] = true;\n};\n\n// ### Expression parsing\n\n// These nest, from the most general expression type at the top to\n// 'atomic', nondivisible expression types at the bottom. Most of\n// the functions will simply let the function(s) below them parse,\n// and, *if* the syntactic construct they handle is present, wrap\n// the AST node that the inner parser gave them in another node.\n\n// Parse a full expression. The optional arguments are used to\n// forbid the `in` operator (in for loops initalization expressions)\n// and provide reference for storing '=' operator inside shorthand\n// property assignment in contexts where both object expression\n// and object pattern might appear (so it's possible to raise\n// delayed syntax error at correct position).\n\npp$3.parseExpression = function(noIn, refDestructuringErrors) {\n var startPos = this.start, startLoc = this.startLoc;\n var expr = this.parseMaybeAssign(noIn, refDestructuringErrors);\n if (this.type === types.comma) {\n var node = this.startNodeAt(startPos, startLoc);\n node.expressions = [expr];\n while (this.eat(types.comma)) { node.expressions.push(this.parseMaybeAssign(noIn, refDestructuringErrors)); }\n return this.finishNode(node, \"SequenceExpression\")\n }\n return expr\n};\n\n// Parse an assignment expression. This includes applications of\n// operators like `+=`.\n\npp$3.parseMaybeAssign = function(noIn, refDestructuringErrors, afterLeftParse) {\n if (this.isContextual(\"yield\")) {\n if (this.inGenerator) { return this.parseYield(noIn) }\n // The tokenizer will assume an expression is allowed after\n // `yield`, but this isn't that kind of yield\n else { this.exprAllowed = false; }\n }\n\n var ownDestructuringErrors = false, oldParenAssign = -1, oldTrailingComma = -1;\n if (refDestructuringErrors) {\n oldParenAssign = refDestructuringErrors.parenthesizedAssign;\n oldTrailingComma = refDestructuringErrors.trailingComma;\n refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = -1;\n } else {\n refDestructuringErrors = new DestructuringErrors;\n ownDestructuringErrors = true;\n }\n\n var startPos = this.start, startLoc = this.startLoc;\n if (this.type === types.parenL || this.type === types.name)\n { this.potentialArrowAt = this.start; }\n var left = this.parseMaybeConditional(noIn, refDestructuringErrors);\n if (afterLeftParse) { left = afterLeftParse.call(this, left, startPos, startLoc); }\n if (this.type.isAssign) {\n var node = this.startNodeAt(startPos, startLoc);\n node.operator = this.value;\n node.left = this.type === types.eq ? this.toAssignable(left, false, refDestructuringErrors) : left;\n if (!ownDestructuringErrors) {\n refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = refDestructuringErrors.doubleProto = -1;\n }\n if (refDestructuringErrors.shorthandAssign >= node.left.start)\n { refDestructuringErrors.shorthandAssign = -1; } // reset because shorthand default was used correctly\n this.checkLVal(left);\n this.next();\n node.right = this.parseMaybeAssign(noIn);\n return this.finishNode(node, \"AssignmentExpression\")\n } else {\n if (ownDestructuringErrors) { this.checkExpressionErrors(refDestructuringErrors, true); }\n }\n if (oldParenAssign > -1) { refDestructuringErrors.parenthesizedAssign = oldParenAssign; }\n if (oldTrailingComma > -1) { refDestructuringErrors.trailingComma = oldTrailingComma; }\n return left\n};\n\n// Parse a ternary conditional (`?:`) operator.\n\npp$3.parseMaybeConditional = function(noIn, refDestructuringErrors) {\n var startPos = this.start, startLoc = this.startLoc;\n var expr = this.parseExprOps(noIn, refDestructuringErrors);\n if (this.checkExpressionErrors(refDestructuringErrors)) { return expr }\n if (this.eat(types.question)) {\n var node = this.startNodeAt(startPos, startLoc);\n node.test = expr;\n node.consequent = this.parseMaybeAssign();\n this.expect(types.colon);\n node.alternate = this.parseMaybeAssign(noIn);\n return this.finishNode(node, \"ConditionalExpression\")\n }\n return expr\n};\n\n// Start the precedence parser.\n\npp$3.parseExprOps = function(noIn, refDestructuringErrors) {\n var startPos = this.start, startLoc = this.startLoc;\n var expr = this.parseMaybeUnary(refDestructuringErrors, false);\n if (this.checkExpressionErrors(refDestructuringErrors)) { return expr }\n return expr.start === startPos && expr.type === \"ArrowFunctionExpression\" ? expr : this.parseExprOp(expr, startPos, startLoc, -1, noIn)\n};\n\n// Parse binary operators with the operator precedence parsing\n// algorithm. `left` is the left-hand side of the operator.\n// `minPrec` provides context that allows the function to stop and\n// defer further parser to one of its callers when it encounters an\n// operator that has a lower precedence than the set it is parsing.\n\npp$3.parseExprOp = function(left, leftStartPos, leftStartLoc, minPrec, noIn) {\n var prec = this.type.binop;\n if (prec != null && (!noIn || this.type !== types._in)) {\n if (prec > minPrec) {\n var logical = this.type === types.logicalOR || this.type === types.logicalAND;\n var coalesce = this.type === types.coalesce;\n if (coalesce) {\n // Handle the precedence of `tt.coalesce` as equal to the range of logical expressions.\n // In other words, `node.right` shouldn't contain logical expressions in order to check the mixed error.\n prec = types.logicalAND.binop;\n }\n var op = this.value;\n this.next();\n var startPos = this.start, startLoc = this.startLoc;\n var right = this.parseExprOp(this.parseMaybeUnary(null, false), startPos, startLoc, prec, noIn);\n var node = this.buildBinary(leftStartPos, leftStartLoc, left, right, op, logical || coalesce);\n if ((logical && this.type === types.coalesce) || (coalesce && (this.type === types.logicalOR || this.type === types.logicalAND))) {\n this.raiseRecoverable(this.start, \"Logical expressions and coalesce expressions cannot be mixed. Wrap either by parentheses\");\n }\n return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, noIn)\n }\n }\n return left\n};\n\npp$3.buildBinary = function(startPos, startLoc, left, right, op, logical) {\n var node = this.startNodeAt(startPos, startLoc);\n node.left = left;\n node.operator = op;\n node.right = right;\n return this.finishNode(node, logical ? \"LogicalExpression\" : \"BinaryExpression\")\n};\n\n// Parse unary operators, both prefix and postfix.\n\npp$3.parseMaybeUnary = function(refDestructuringErrors, sawUnary) {\n var startPos = this.start, startLoc = this.startLoc, expr;\n if (this.isContextual(\"await\") && (this.inAsync || (!this.inFunction && this.options.allowAwaitOutsideFunction))) {\n expr = this.parseAwait();\n sawUnary = true;\n } else if (this.type.prefix) {\n var node = this.startNode(), update = this.type === types.incDec;\n node.operator = this.value;\n node.prefix = true;\n this.next();\n node.argument = this.parseMaybeUnary(null, true);\n this.checkExpressionErrors(refDestructuringErrors, true);\n if (update) { this.checkLVal(node.argument); }\n else if (this.strict && node.operator === \"delete\" &&\n node.argument.type === \"Identifier\")\n { this.raiseRecoverable(node.start, \"Deleting local variable in strict mode\"); }\n else { sawUnary = true; }\n expr = this.finishNode(node, update ? \"UpdateExpression\" : \"UnaryExpression\");\n } else {\n expr = this.parseExprSubscripts(refDestructuringErrors);\n if (this.checkExpressionErrors(refDestructuringErrors)) { return expr }\n while (this.type.postfix && !this.canInsertSemicolon()) {\n var node$1 = this.startNodeAt(startPos, startLoc);\n node$1.operator = this.value;\n node$1.prefix = false;\n node$1.argument = expr;\n this.checkLVal(expr);\n this.next();\n expr = this.finishNode(node$1, \"UpdateExpression\");\n }\n }\n\n if (!sawUnary && this.eat(types.starstar))\n { return this.buildBinary(startPos, startLoc, expr, this.parseMaybeUnary(null, false), \"**\", false) }\n else\n { return expr }\n};\n\n// Parse call, dot, and `[]`-subscript expressions.\n\npp$3.parseExprSubscripts = function(refDestructuringErrors) {\n var startPos = this.start, startLoc = this.startLoc;\n var expr = this.parseExprAtom(refDestructuringErrors);\n if (expr.type === \"ArrowFunctionExpression\" && this.input.slice(this.lastTokStart, this.lastTokEnd) !== \")\")\n { return expr }\n var result = this.parseSubscripts(expr, startPos, startLoc);\n if (refDestructuringErrors && result.type === \"MemberExpression\") {\n if (refDestructuringErrors.parenthesizedAssign >= result.start) { refDestructuringErrors.parenthesizedAssign = -1; }\n if (refDestructuringErrors.parenthesizedBind >= result.start) { refDestructuringErrors.parenthesizedBind = -1; }\n }\n return result\n};\n\npp$3.parseSubscripts = function(base, startPos, startLoc, noCalls) {\n var maybeAsyncArrow = this.options.ecmaVersion >= 8 && base.type === \"Identifier\" && base.name === \"async\" &&\n this.lastTokEnd === base.end && !this.canInsertSemicolon() && base.end - base.start === 5 &&\n this.potentialArrowAt === base.start;\n var optionalChained = false;\n\n while (true) {\n var element = this.parseSubscript(base, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained);\n\n if (element.optional) { optionalChained = true; }\n if (element === base || element.type === \"ArrowFunctionExpression\") {\n if (optionalChained) {\n var chainNode = this.startNodeAt(startPos, startLoc);\n chainNode.expression = element;\n element = this.finishNode(chainNode, \"ChainExpression\");\n }\n return element\n }\n\n base = element;\n }\n};\n\npp$3.parseSubscript = function(base, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained) {\n var optionalSupported = this.options.ecmaVersion >= 11;\n var optional = optionalSupported && this.eat(types.questionDot);\n if (noCalls && optional) { this.raise(this.lastTokStart, \"Optional chaining cannot appear in the callee of new expressions\"); }\n\n var computed = this.eat(types.bracketL);\n if (computed || (optional && this.type !== types.parenL && this.type !== types.backQuote) || this.eat(types.dot)) {\n var node = this.startNodeAt(startPos, startLoc);\n node.object = base;\n node.property = computed ? this.parseExpression() : this.parseIdent(this.options.allowReserved !== \"never\");\n node.computed = !!computed;\n if (computed) { this.expect(types.bracketR); }\n if (optionalSupported) {\n node.optional = optional;\n }\n base = this.finishNode(node, \"MemberExpression\");\n } else if (!noCalls && this.eat(types.parenL)) {\n var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;\n this.yieldPos = 0;\n this.awaitPos = 0;\n this.awaitIdentPos = 0;\n var exprList = this.parseExprList(types.parenR, this.options.ecmaVersion >= 8, false, refDestructuringErrors);\n if (maybeAsyncArrow && !optional && !this.canInsertSemicolon() && this.eat(types.arrow)) {\n this.checkPatternErrors(refDestructuringErrors, false);\n this.checkYieldAwaitInDefaultParams();\n if (this.awaitIdentPos > 0)\n { this.raise(this.awaitIdentPos, \"Cannot use 'await' as identifier inside an async function\"); }\n this.yieldPos = oldYieldPos;\n this.awaitPos = oldAwaitPos;\n this.awaitIdentPos = oldAwaitIdentPos;\n return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, true)\n }\n this.checkExpressionErrors(refDestructuringErrors, true);\n this.yieldPos = oldYieldPos || this.yieldPos;\n this.awaitPos = oldAwaitPos || this.awaitPos;\n this.awaitIdentPos = oldAwaitIdentPos || this.awaitIdentPos;\n var node$1 = this.startNodeAt(startPos, startLoc);\n node$1.callee = base;\n node$1.arguments = exprList;\n if (optionalSupported) {\n node$1.optional = optional;\n }\n base = this.finishNode(node$1, \"CallExpression\");\n } else if (this.type === types.backQuote) {\n if (optional || optionalChained) {\n this.raise(this.start, \"Optional chaining cannot appear in the tag of tagged template expressions\");\n }\n var node$2 = this.startNodeAt(startPos, startLoc);\n node$2.tag = base;\n node$2.quasi = this.parseTemplate({isTagged: true});\n base = this.finishNode(node$2, \"TaggedTemplateExpression\");\n }\n return base\n};\n\n// Parse an atomic expression \u2014 either a single token that is an\n// expression, an expression started by a keyword like `function` or\n// `new`, or an expression wrapped in punctuation like `()`, `[]`,\n// or `{}`.\n\npp$3.parseExprAtom = function(refDestructuringErrors) {\n // If a division operator appears in an expression position, the\n // tokenizer got confused, and we force it to read a regexp instead.\n if (this.type === types.slash) { this.readRegexp(); }\n\n var node, canBeArrow = this.potentialArrowAt === this.start;\n switch (this.type) {\n case types._super:\n if (!this.allowSuper)\n { this.raise(this.start, \"'super' keyword outside a method\"); }\n node = this.startNode();\n this.next();\n if (this.type === types.parenL && !this.allowDirectSuper)\n { this.raise(node.start, \"super() call outside constructor of a subclass\"); }\n // The `super` keyword can appear at below:\n // SuperProperty:\n // super [ Expression ]\n // super . IdentifierName\n // SuperCall:\n // super ( Arguments )\n if (this.type !== types.dot && this.type !== types.bracketL && this.type !== types.parenL)\n { this.unexpected(); }\n return this.finishNode(node, \"Super\")\n\n case types._this:\n node = this.startNode();\n this.next();\n return this.finishNode(node, \"ThisExpression\")\n\n case types.name:\n var startPos = this.start, startLoc = this.startLoc, containsEsc = this.containsEsc;\n var id = this.parseIdent(false);\n if (this.options.ecmaVersion >= 8 && !containsEsc && id.name === \"async\" && !this.canInsertSemicolon() && this.eat(types._function))\n { return this.parseFunction(this.startNodeAt(startPos, startLoc), 0, false, true) }\n if (canBeArrow && !this.canInsertSemicolon()) {\n if (this.eat(types.arrow))\n { return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], false) }\n if (this.options.ecmaVersion >= 8 && id.name === \"async\" && this.type === types.name && !containsEsc) {\n id = this.parseIdent(false);\n if (this.canInsertSemicolon() || !this.eat(types.arrow))\n { this.unexpected(); }\n return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], true)\n }\n }\n return id\n\n case types.regexp:\n var value = this.value;\n node = this.parseLiteral(value.value);\n node.regex = {pattern: value.pattern, flags: value.flags};\n return node\n\n case types.num: case types.string:\n return this.parseLiteral(this.value)\n\n case types._null: case types._true: case types._false:\n node = this.startNode();\n node.value = this.type === types._null ? null : this.type === types._true;\n node.raw = this.type.keyword;\n this.next();\n return this.finishNode(node, \"Literal\")\n\n case types.parenL:\n var start = this.start, expr = this.parseParenAndDistinguishExpression(canBeArrow);\n if (refDestructuringErrors) {\n if (refDestructuringErrors.parenthesizedAssign < 0 && !this.isSimpleAssignTarget(expr))\n { refDestructuringErrors.parenthesizedAssign = start; }\n if (refDestructuringErrors.parenthesizedBind < 0)\n { refDestructuringErrors.parenthesizedBind = start; }\n }\n return expr\n\n case types.bracketL:\n node = this.startNode();\n this.next();\n node.elements = this.parseExprList(types.bracketR, true, true, refDestructuringErrors);\n return this.finishNode(node, \"ArrayExpression\")\n\n case types.braceL:\n return this.parseObj(false, refDestructuringErrors)\n\n case types._function:\n node = this.startNode();\n this.next();\n return this.parseFunction(node, 0)\n\n case types._class:\n return this.parseClass(this.startNode(), false)\n\n case types._new:\n return this.parseNew()\n\n case types.backQuote:\n return this.parseTemplate()\n\n case types._import:\n if (this.options.ecmaVersion >= 11) {\n return this.parseExprImport()\n } else {\n return this.unexpected()\n }\n\n default:\n this.unexpected();\n }\n};\n\npp$3.parseExprImport = function() {\n var node = this.startNode();\n\n // Consume `import` as an identifier for `import.meta`.\n // Because `this.parseIdent(true)` doesn't check escape sequences, it needs the check of `this.containsEsc`.\n if (this.containsEsc) { this.raiseRecoverable(this.start, \"Escape sequence in keyword import\"); }\n var meta = this.parseIdent(true);\n\n switch (this.type) {\n case types.parenL:\n return this.parseDynamicImport(node)\n case types.dot:\n node.meta = meta;\n return this.parseImportMeta(node)\n default:\n this.unexpected();\n }\n};\n\npp$3.parseDynamicImport = function(node) {\n this.next(); // skip `(`\n\n // Parse node.source.\n node.source = this.parseMaybeAssign();\n\n // Verify ending.\n if (!this.eat(types.parenR)) {\n var errorPos = this.start;\n if (this.eat(types.comma) && this.eat(types.parenR)) {\n this.raiseRecoverable(errorPos, \"Trailing comma is not allowed in import()\");\n } else {\n this.unexpected(errorPos);\n }\n }\n\n return this.finishNode(node, \"ImportExpression\")\n};\n\npp$3.parseImportMeta = function(node) {\n this.next(); // skip `.`\n\n var containsEsc = this.containsEsc;\n node.property = this.parseIdent(true);\n\n if (node.property.name !== \"meta\")\n { this.raiseRecoverable(node.property.start, \"The only valid meta property for import is 'import.meta'\"); }\n if (containsEsc)\n { this.raiseRecoverable(node.start, \"'import.meta' must not contain escaped characters\"); }\n if (this.options.sourceType !== \"module\")\n { this.raiseRecoverable(node.start, \"Cannot use 'import.meta' outside a module\"); }\n\n return this.finishNode(node, \"MetaProperty\")\n};\n\npp$3.parseLiteral = function(value) {\n var node = this.startNode();\n node.value = value;\n node.raw = this.input.slice(this.start, this.end);\n if (node.raw.charCodeAt(node.raw.length - 1) === 110) { node.bigint = node.raw.slice(0, -1).replace(/_/g, \"\"); }\n this.next();\n return this.finishNode(node, \"Literal\")\n};\n\npp$3.parseParenExpression = function() {\n this.expect(types.parenL);\n var val = this.parseExpression();\n this.expect(types.parenR);\n return val\n};\n\npp$3.parseParenAndDistinguishExpression = function(canBeArrow) {\n var startPos = this.start, startLoc = this.startLoc, val, allowTrailingComma = this.options.ecmaVersion >= 8;\n if (this.options.ecmaVersion >= 6) {\n this.next();\n\n var innerStartPos = this.start, innerStartLoc = this.startLoc;\n var exprList = [], first = true, lastIsComma = false;\n var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, spreadStart;\n this.yieldPos = 0;\n this.awaitPos = 0;\n // Do not save awaitIdentPos to allow checking awaits nested in parameters\n while (this.type !== types.parenR) {\n first ? first = false : this.expect(types.comma);\n if (allowTrailingComma && this.afterTrailingComma(types.parenR, true)) {\n lastIsComma = true;\n break\n } else if (this.type === types.ellipsis) {\n spreadStart = this.start;\n exprList.push(this.parseParenItem(this.parseRestBinding()));\n if (this.type === types.comma) { this.raise(this.start, \"Comma is not permitted after the rest element\"); }\n break\n } else {\n exprList.push(this.parseMaybeAssign(false, refDestructuringErrors, this.parseParenItem));\n }\n }\n var innerEndPos = this.start, innerEndLoc = this.startLoc;\n this.expect(types.parenR);\n\n if (canBeArrow && !this.canInsertSemicolon() && this.eat(types.arrow)) {\n this.checkPatternErrors(refDestructuringErrors, false);\n this.checkYieldAwaitInDefaultParams();\n this.yieldPos = oldYieldPos;\n this.awaitPos = oldAwaitPos;\n return this.parseParenArrowList(startPos, startLoc, exprList)\n }\n\n if (!exprList.length || lastIsComma) { this.unexpected(this.lastTokStart); }\n if (spreadStart) { this.unexpected(spreadStart); }\n this.checkExpressionErrors(refDestructuringErrors, true);\n this.yieldPos = oldYieldPos || this.yieldPos;\n this.awaitPos = oldAwaitPos || this.awaitPos;\n\n if (exprList.length > 1) {\n val = this.startNodeAt(innerStartPos, innerStartLoc);\n val.expressions = exprList;\n this.finishNodeAt(val, \"SequenceExpression\", innerEndPos, innerEndLoc);\n } else {\n val = exprList[0];\n }\n } else {\n val = this.parseParenExpression();\n }\n\n if (this.options.preserveParens) {\n var par = this.startNodeAt(startPos, startLoc);\n par.expression = val;\n return this.finishNode(par, \"ParenthesizedExpression\")\n } else {\n return val\n }\n};\n\npp$3.parseParenItem = function(item) {\n return item\n};\n\npp$3.parseParenArrowList = function(startPos, startLoc, exprList) {\n return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList)\n};\n\n// New's precedence is slightly tricky. It must allow its argument to\n// be a `[]` or dot subscript expression, but not a call \u2014 at least,\n// not without wrapping it in parentheses. Thus, it uses the noCalls\n// argument to parseSubscripts to prevent it from consuming the\n// argument list.\n\nvar empty$1 = [];\n\npp$3.parseNew = function() {\n if (this.containsEsc) { this.raiseRecoverable(this.start, \"Escape sequence in keyword new\"); }\n var node = this.startNode();\n var meta = this.parseIdent(true);\n if (this.options.ecmaVersion >= 6 && this.eat(types.dot)) {\n node.meta = meta;\n var containsEsc = this.containsEsc;\n node.property = this.parseIdent(true);\n if (node.property.name !== \"target\")\n { this.raiseRecoverable(node.property.start, \"The only valid meta property for new is 'new.target'\"); }\n if (containsEsc)\n { this.raiseRecoverable(node.start, \"'new.target' must not contain escaped characters\"); }\n if (!this.inNonArrowFunction())\n { this.raiseRecoverable(node.start, \"'new.target' can only be used in functions\"); }\n return this.finishNode(node, \"MetaProperty\")\n }\n var startPos = this.start, startLoc = this.startLoc, isImport = this.type === types._import;\n node.callee = this.parseSubscripts(this.parseExprAtom(), startPos, startLoc, true);\n if (isImport && node.callee.type === \"ImportExpression\") {\n this.raise(startPos, \"Cannot use new with import()\");\n }\n if (this.eat(types.parenL)) { node.arguments = this.parseExprList(types.parenR, this.options.ecmaVersion >= 8, false); }\n else { node.arguments = empty$1; }\n return this.finishNode(node, \"NewExpression\")\n};\n\n// Parse template expression.\n\npp$3.parseTemplateElement = function(ref) {\n var isTagged = ref.isTagged;\n\n var elem = this.startNode();\n if (this.type === types.invalidTemplate) {\n if (!isTagged) {\n this.raiseRecoverable(this.start, \"Bad escape sequence in untagged template literal\");\n }\n elem.value = {\n raw: this.value,\n cooked: null\n };\n } else {\n elem.value = {\n raw: this.input.slice(this.start, this.end).replace(/\\r\\n?/g, \"\\n\"),\n cooked: this.value\n };\n }\n this.next();\n elem.tail = this.type === types.backQuote;\n return this.finishNode(elem, \"TemplateElement\")\n};\n\npp$3.parseTemplate = function(ref) {\n if ( ref === void 0 ) ref = {};\n var isTagged = ref.isTagged; if ( isTagged === void 0 ) isTagged = false;\n\n var node = this.startNode();\n this.next();\n node.expressions = [];\n var curElt = this.parseTemplateElement({isTagged: isTagged});\n node.quasis = [curElt];\n while (!curElt.tail) {\n if (this.type === types.eof) { this.raise(this.pos, \"Unterminated template literal\"); }\n this.expect(types.dollarBraceL);\n node.expressions.push(this.parseExpression());\n this.expect(types.braceR);\n node.quasis.push(curElt = this.parseTemplateElement({isTagged: isTagged}));\n }\n this.next();\n return this.finishNode(node, \"TemplateLiteral\")\n};\n\npp$3.isAsyncProp = function(prop) {\n return !prop.computed && prop.key.type === \"Identifier\" && prop.key.name === \"async\" &&\n (this.type === types.name || this.type === types.num || this.type === types.string || this.type === types.bracketL || this.type.keyword || (this.options.ecmaVersion >= 9 && this.type === types.star)) &&\n !lineBreak.test(this.input.slice(this.lastTokEnd, this.start))\n};\n\n// Parse an object literal or binding pattern.\n\npp$3.parseObj = function(isPattern, refDestructuringErrors) {\n var node = this.startNode(), first = true, propHash = {};\n node.properties = [];\n this.next();\n while (!this.eat(types.braceR)) {\n if (!first) {\n this.expect(types.comma);\n if (this.options.ecmaVersion >= 5 && this.afterTrailingComma(types.braceR)) { break }\n } else { first = false; }\n\n var prop = this.parseProperty(isPattern, refDestructuringErrors);\n if (!isPattern) { this.checkPropClash(prop, propHash, refDestructuringErrors); }\n node.properties.push(prop);\n }\n return this.finishNode(node, isPattern ? \"ObjectPattern\" : \"ObjectExpression\")\n};\n\npp$3.parseProperty = function(isPattern, refDestructuringErrors) {\n var prop = this.startNode(), isGenerator, isAsync, startPos, startLoc;\n if (this.options.ecmaVersion >= 9 && this.eat(types.ellipsis)) {\n if (isPattern) {\n prop.argument = this.parseIdent(false);\n if (this.type === types.comma) {\n this.raise(this.start, \"Comma is not permitted after the rest element\");\n }\n return this.finishNode(prop, \"RestElement\")\n }\n // To disallow parenthesized identifier via `this.toAssignable()`.\n if (this.type === types.parenL && refDestructuringErrors) {\n if (refDestructuringErrors.parenthesizedAssign < 0) {\n refDestructuringErrors.parenthesizedAssign = this.start;\n }\n if (refDestructuringErrors.parenthesizedBind < 0) {\n refDestructuringErrors.parenthesizedBind = this.start;\n }\n }\n // Parse argument.\n prop.argument = this.parseMaybeAssign(false, refDestructuringErrors);\n // To disallow trailing comma via `this.toAssignable()`.\n if (this.type === types.comma && refDestructuringErrors && refDestructuringErrors.trailingComma < 0) {\n refDestructuringErrors.trailingComma = this.start;\n }\n // Finish\n return this.finishNode(prop, \"SpreadElement\")\n }\n if (this.options.ecmaVersion >= 6) {\n prop.method = false;\n prop.shorthand = false;\n if (isPattern || refDestructuringErrors) {\n startPos = this.start;\n startLoc = this.startLoc;\n }\n if (!isPattern)\n { isGenerator = this.eat(types.star); }\n }\n var containsEsc = this.containsEsc;\n this.parsePropertyName(prop);\n if (!isPattern && !containsEsc && this.options.ecmaVersion >= 8 && !isGenerator && this.isAsyncProp(prop)) {\n isAsync = true;\n isGenerator = this.options.ecmaVersion >= 9 && this.eat(types.star);\n this.parsePropertyName(prop, refDestructuringErrors);\n } else {\n isAsync = false;\n }\n this.parsePropertyValue(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc);\n return this.finishNode(prop, \"Property\")\n};\n\npp$3.parsePropertyValue = function(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc) {\n if ((isGenerator || isAsync) && this.type === types.colon)\n { this.unexpected(); }\n\n if (this.eat(types.colon)) {\n prop.value = isPattern ? this.parseMaybeDefault(this.start, this.startLoc) : this.parseMaybeAssign(false, refDestructuringErrors);\n prop.kind = \"init\";\n } else if (this.options.ecmaVersion >= 6 && this.type === types.parenL) {\n if (isPattern) { this.unexpected(); }\n prop.kind = \"init\";\n prop.method = true;\n prop.value = this.parseMethod(isGenerator, isAsync);\n } else if (!isPattern && !containsEsc &&\n this.options.ecmaVersion >= 5 && !prop.computed && prop.key.type === \"Identifier\" &&\n (prop.key.name === \"get\" || prop.key.name === \"set\") &&\n (this.type !== types.comma && this.type !== types.braceR && this.type !== types.eq)) {\n if (isGenerator || isAsync) { this.unexpected(); }\n prop.kind = prop.key.name;\n this.parsePropertyName(prop);\n prop.value = this.parseMethod(false);\n var paramCount = prop.kind === \"get\" ? 0 : 1;\n if (prop.value.params.length !== paramCount) {\n var start = prop.value.start;\n if (prop.kind === \"get\")\n { this.raiseRecoverable(start, \"getter should have no params\"); }\n else\n { this.raiseRecoverable(start, \"setter should have exactly one param\"); }\n } else {\n if (prop.kind === \"set\" && prop.value.params[0].type === \"RestElement\")\n { this.raiseRecoverable(prop.value.params[0].start, \"Setter cannot use rest params\"); }\n }\n } else if (this.options.ecmaVersion >= 6 && !prop.computed && prop.key.type === \"Identifier\") {\n if (isGenerator || isAsync) { this.unexpected(); }\n this.checkUnreserved(prop.key);\n if (prop.key.name === \"await\" && !this.awaitIdentPos)\n { this.awaitIdentPos = startPos; }\n prop.kind = \"init\";\n if (isPattern) {\n prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key);\n } else if (this.type === types.eq && refDestructuringErrors) {\n if (refDestructuringErrors.shorthandAssign < 0)\n { refDestructuringErrors.shorthandAssign = this.start; }\n prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key);\n } else {\n prop.value = prop.key;\n }\n prop.shorthand = true;\n } else { this.unexpected(); }\n};\n\npp$3.parsePropertyName = function(prop) {\n if (this.options.ecmaVersion >= 6) {\n if (this.eat(types.bracketL)) {\n prop.computed = true;\n prop.key = this.parseMaybeAssign();\n this.expect(types.bracketR);\n return prop.key\n } else {\n prop.computed = false;\n }\n }\n return prop.key = this.type === types.num || this.type === types.string ? this.parseExprAtom() : this.parseIdent(this.options.allowReserved !== \"never\")\n};\n\n// Initialize empty function node.\n\npp$3.initFunction = function(node) {\n node.id = null;\n if (this.options.ecmaVersion >= 6) { node.generator = node.expression = false; }\n if (this.options.ecmaVersion >= 8) { node.async = false; }\n};\n\n// Parse object or class method.\n\npp$3.parseMethod = function(isGenerator, isAsync, allowDirectSuper) {\n var node = this.startNode(), oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;\n\n this.initFunction(node);\n if (this.options.ecmaVersion >= 6)\n { node.generator = isGenerator; }\n if (this.options.ecmaVersion >= 8)\n { node.async = !!isAsync; }\n\n this.yieldPos = 0;\n this.awaitPos = 0;\n this.awaitIdentPos = 0;\n this.enterScope(functionFlags(isAsync, node.generator) | SCOPE_SUPER | (allowDirectSuper ? SCOPE_DIRECT_SUPER : 0));\n\n this.expect(types.parenL);\n node.params = this.parseBindingList(types.parenR, false, this.options.ecmaVersion >= 8);\n this.checkYieldAwaitInDefaultParams();\n this.parseFunctionBody(node, false, true);\n\n this.yieldPos = oldYieldPos;\n this.awaitPos = oldAwaitPos;\n this.awaitIdentPos = oldAwaitIdentPos;\n return this.finishNode(node, \"FunctionExpression\")\n};\n\n// Parse arrow function expression with given parameters.\n\npp$3.parseArrowExpression = function(node, params, isAsync) {\n var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;\n\n this.enterScope(functionFlags(isAsync, false) | SCOPE_ARROW);\n this.initFunction(node);\n if (this.options.ecmaVersion >= 8) { node.async = !!isAsync; }\n\n this.yieldPos = 0;\n this.awaitPos = 0;\n this.awaitIdentPos = 0;\n\n node.params = this.toAssignableList(params, true);\n this.parseFunctionBody(node, true, false);\n\n this.yieldPos = oldYieldPos;\n this.awaitPos = oldAwaitPos;\n this.awaitIdentPos = oldAwaitIdentPos;\n return this.finishNode(node, \"ArrowFunctionExpression\")\n};\n\n// Parse function body and check parameters.\n\npp$3.parseFunctionBody = function(node, isArrowFunction, isMethod) {\n var isExpression = isArrowFunction && this.type !== types.braceL;\n var oldStrict = this.strict, useStrict = false;\n\n if (isExpression) {\n node.body = this.parseMaybeAssign();\n node.expression = true;\n this.checkParams(node, false);\n } else {\n var nonSimple = this.options.ecmaVersion >= 7 && !this.isSimpleParamList(node.params);\n if (!oldStrict || nonSimple) {\n useStrict = this.strictDirective(this.end);\n // If this is a strict mode function, verify that argument names\n // are not repeated, and it does not try to bind the words `eval`\n // or `arguments`.\n if (useStrict && nonSimple)\n { this.raiseRecoverable(node.start, \"Illegal 'use strict' directive in function with non-simple parameter list\"); }\n }\n // Start a new scope with regard to labels and the `inFunction`\n // flag (restore them to their old value afterwards).\n var oldLabels = this.labels;\n this.labels = [];\n if (useStrict) { this.strict = true; }\n\n // Add the params to varDeclaredNames to ensure that an error is thrown\n // if a let/const declaration in the function clashes with one of the params.\n this.checkParams(node, !oldStrict && !useStrict && !isArrowFunction && !isMethod && this.isSimpleParamList(node.params));\n // Ensure the function name isn't a forbidden identifier in strict mode, e.g. 'eval'\n if (this.strict && node.id) { this.checkLVal(node.id, BIND_OUTSIDE); }\n node.body = this.parseBlock(false, undefined, useStrict && !oldStrict);\n node.expression = false;\n this.adaptDirectivePrologue(node.body.body);\n this.labels = oldLabels;\n }\n this.exitScope();\n};\n\npp$3.isSimpleParamList = function(params) {\n for (var i = 0, list = params; i < list.length; i += 1)\n {\n var param = list[i];\n\n if (param.type !== \"Identifier\") { return false\n } }\n return true\n};\n\n// Checks function params for various disallowed patterns such as using \"eval\"\n// or \"arguments\" and duplicate parameters.\n\npp$3.checkParams = function(node, allowDuplicates) {\n var nameHash = {};\n for (var i = 0, list = node.params; i < list.length; i += 1)\n {\n var param = list[i];\n\n this.checkLVal(param, BIND_VAR, allowDuplicates ? null : nameHash);\n }\n};\n\n// Parses a comma-separated list of expressions, and returns them as\n// an array. `close` is the token type that ends the list, and\n// `allowEmpty` can be turned on to allow subsequent commas with\n// nothing in between them to be parsed as `null` (which is needed\n// for array literals).\n\npp$3.parseExprList = function(close, allowTrailingComma, allowEmpty, refDestructuringErrors) {\n var elts = [], first = true;\n while (!this.eat(close)) {\n if (!first) {\n this.expect(types.comma);\n if (allowTrailingComma && this.afterTrailingComma(close)) { break }\n } else { first = false; }\n\n var elt = (void 0);\n if (allowEmpty && this.type === types.comma)\n { elt = null; }\n else if (this.type === types.ellipsis) {\n elt = this.parseSpread(refDestructuringErrors);\n if (refDestructuringErrors && this.type === types.comma && refDestructuringErrors.trailingComma < 0)\n { refDestructuringErrors.trailingComma = this.start; }\n } else {\n elt = this.parseMaybeAssign(false, refDestructuringErrors);\n }\n elts.push(elt);\n }\n return elts\n};\n\npp$3.checkUnreserved = function(ref) {\n var start = ref.start;\n var end = ref.end;\n var name = ref.name;\n\n if (this.inGenerator && name === \"yield\")\n { this.raiseRecoverable(start, \"Cannot use 'yield' as identifier inside a generator\"); }\n if (this.inAsync && name === \"await\")\n { this.raiseRecoverable(start, \"Cannot use 'await' as identifier inside an async function\"); }\n if (this.keywords.test(name))\n { this.raise(start, (\"Unexpected keyword '\" + name + \"'\")); }\n if (this.options.ecmaVersion < 6 &&\n this.input.slice(start, end).indexOf(\"\\\\\") !== -1) { return }\n var re = this.strict ? this.reservedWordsStrict : this.reservedWords;\n if (re.test(name)) {\n if (!this.inAsync && name === \"await\")\n { this.raiseRecoverable(start, \"Cannot use keyword 'await' outside an async function\"); }\n this.raiseRecoverable(start, (\"The keyword '\" + name + \"' is reserved\"));\n }\n};\n\n// Parse the next token as an identifier. If `liberal` is true (used\n// when parsing properties), it will also convert keywords into\n// identifiers.\n\npp$3.parseIdent = function(liberal, isBinding) {\n var node = this.startNode();\n if (this.type === types.name) {\n node.name = this.value;\n } else if (this.type.keyword) {\n node.name = this.type.keyword;\n\n // To fix https://github.com/acornjs/acorn/issues/575\n // `class` and `function` keywords push new context into this.context.\n // But there is no chance to pop the context if the keyword is consumed as an identifier such as a property name.\n // If the previous token is a dot, this does not apply because the context-managing code already ignored the keyword\n if ((node.name === \"class\" || node.name === \"function\") &&\n (this.lastTokEnd !== this.lastTokStart + 1 || this.input.charCodeAt(this.lastTokStart) !== 46)) {\n this.context.pop();\n }\n } else {\n this.unexpected();\n }\n this.next(!!liberal);\n this.finishNode(node, \"Identifier\");\n if (!liberal) {\n this.checkUnreserved(node);\n if (node.name === \"await\" && !this.awaitIdentPos)\n { this.awaitIdentPos = node.start; }\n }\n return node\n};\n\n// Parses yield expression inside generator.\n\npp$3.parseYield = function(noIn) {\n if (!this.yieldPos) { this.yieldPos = this.start; }\n\n var node = this.startNode();\n this.next();\n if (this.type === types.semi || this.canInsertSemicolon() || (this.type !== types.star && !this.type.startsExpr)) {\n node.delegate = false;\n node.argument = null;\n } else {\n node.delegate = this.eat(types.star);\n node.argument = this.parseMaybeAssign(noIn);\n }\n return this.finishNode(node, \"YieldExpression\")\n};\n\npp$3.parseAwait = function() {\n if (!this.awaitPos) { this.awaitPos = this.start; }\n\n var node = this.startNode();\n this.next();\n node.argument = this.parseMaybeUnary(null, false);\n return this.finishNode(node, \"AwaitExpression\")\n};\n\nvar pp$4 = Parser.prototype;\n\n// This function is used to raise exceptions on parse errors. It\n// takes an offset integer (into the current `input`) to indicate\n// the location of the error, attaches the position to the end\n// of the error message, and then raises a `SyntaxError` with that\n// message.\n\npp$4.raise = function(pos, message) {\n var loc = getLineInfo(this.input, pos);\n message += \" (\" + loc.line + \":\" + loc.column + \")\";\n var err = new SyntaxError(message);\n err.pos = pos; err.loc = loc; err.raisedAt = this.pos;\n throw err\n};\n\npp$4.raiseRecoverable = pp$4.raise;\n\npp$4.curPosition = function() {\n if (this.options.locations) {\n return new Position(this.curLine, this.pos - this.lineStart)\n }\n};\n\nvar pp$5 = Parser.prototype;\n\nvar Scope = function Scope(flags) {\n this.flags = flags;\n // A list of var-declared names in the current lexical scope\n this.var = [];\n // A list of lexically-declared names in the current lexical scope\n this.lexical = [];\n // A list of lexically-declared FunctionDeclaration names in the current lexical scope\n this.functions = [];\n};\n\n// The functions in this module keep track of declared variables in the current scope in order to detect duplicate variable names.\n\npp$5.enterScope = function(flags) {\n this.scopeStack.push(new Scope(flags));\n};\n\npp$5.exitScope = function() {\n this.scopeStack.pop();\n};\n\n// The spec says:\n// > At the top level of a function, or script, function declarations are\n// > treated like var declarations rather than like lexical declarations.\npp$5.treatFunctionsAsVarInScope = function(scope) {\n return (scope.flags & SCOPE_FUNCTION) || !this.inModule && (scope.flags & SCOPE_TOP)\n};\n\npp$5.declareName = function(name, bindingType, pos) {\n var redeclared = false;\n if (bindingType === BIND_LEXICAL) {\n var scope = this.currentScope();\n redeclared = scope.lexical.indexOf(name) > -1 || scope.functions.indexOf(name) > -1 || scope.var.indexOf(name) > -1;\n scope.lexical.push(name);\n if (this.inModule && (scope.flags & SCOPE_TOP))\n { delete this.undefinedExports[name]; }\n } else if (bindingType === BIND_SIMPLE_CATCH) {\n var scope$1 = this.currentScope();\n scope$1.lexical.push(name);\n } else if (bindingType === BIND_FUNCTION) {\n var scope$2 = this.currentScope();\n if (this.treatFunctionsAsVar)\n { redeclared = scope$2.lexical.indexOf(name) > -1; }\n else\n { redeclared = scope$2.lexical.indexOf(name) > -1 || scope$2.var.indexOf(name) > -1; }\n scope$2.functions.push(name);\n } else {\n for (var i = this.scopeStack.length - 1; i >= 0; --i) {\n var scope$3 = this.scopeStack[i];\n if (scope$3.lexical.indexOf(name) > -1 && !((scope$3.flags & SCOPE_SIMPLE_CATCH) && scope$3.lexical[0] === name) ||\n !this.treatFunctionsAsVarInScope(scope$3) && scope$3.functions.indexOf(name) > -1) {\n redeclared = true;\n break\n }\n scope$3.var.push(name);\n if (this.inModule && (scope$3.flags & SCOPE_TOP))\n { delete this.undefinedExports[name]; }\n if (scope$3.flags & SCOPE_VAR) { break }\n }\n }\n if (redeclared) { this.raiseRecoverable(pos, (\"Identifier '\" + name + \"' has already been declared\")); }\n};\n\npp$5.checkLocalExport = function(id) {\n // scope.functions must be empty as Module code is always strict.\n if (this.scopeStack[0].lexical.indexOf(id.name) === -1 &&\n this.scopeStack[0].var.indexOf(id.name) === -1) {\n this.undefinedExports[id.name] = id;\n }\n};\n\npp$5.currentScope = function() {\n return this.scopeStack[this.scopeStack.length - 1]\n};\n\npp$5.currentVarScope = function() {\n for (var i = this.scopeStack.length - 1;; i--) {\n var scope = this.scopeStack[i];\n if (scope.flags & SCOPE_VAR) { return scope }\n }\n};\n\n// Could be useful for `this`, `new.target`, `super()`, `super.property`, and `super[property]`.\npp$5.currentThisScope = function() {\n for (var i = this.scopeStack.length - 1;; i--) {\n var scope = this.scopeStack[i];\n if (scope.flags & SCOPE_VAR && !(scope.flags & SCOPE_ARROW)) { return scope }\n }\n};\n\nvar Node = function Node(parser, pos, loc) {\n this.type = \"\";\n this.start = pos;\n this.end = 0;\n if (parser.options.locations)\n { this.loc = new SourceLocation(parser, loc); }\n if (parser.options.directSourceFile)\n { this.sourceFile = parser.options.directSourceFile; }\n if (parser.options.ranges)\n { this.range = [pos, 0]; }\n};\n\n// Start an AST node, attaching a start offset.\n\nvar pp$6 = Parser.prototype;\n\npp$6.startNode = function() {\n return new Node(this, this.start, this.startLoc)\n};\n\npp$6.startNodeAt = function(pos, loc) {\n return new Node(this, pos, loc)\n};\n\n// Finish an AST node, adding `type` and `end` properties.\n\nfunction finishNodeAt(node, type, pos, loc) {\n node.type = type;\n node.end = pos;\n if (this.options.locations)\n { node.loc.end = loc; }\n if (this.options.ranges)\n { node.range[1] = pos; }\n return node\n}\n\npp$6.finishNode = function(node, type) {\n return finishNodeAt.call(this, node, type, this.lastTokEnd, this.lastTokEndLoc)\n};\n\n// Finish node at given position\n\npp$6.finishNodeAt = function(node, type, pos, loc) {\n return finishNodeAt.call(this, node, type, pos, loc)\n};\n\n// The algorithm used to determine whether a regexp can appear at a\n\nvar TokContext = function TokContext(token, isExpr, preserveSpace, override, generator) {\n this.token = token;\n this.isExpr = !!isExpr;\n this.preserveSpace = !!preserveSpace;\n this.override = override;\n this.generator = !!generator;\n};\n\nvar types$1 = {\n b_stat: new TokContext(\"{\", false),\n b_expr: new TokContext(\"{\", true),\n b_tmpl: new TokContext(\"${\", false),\n p_stat: new TokContext(\"(\", false),\n p_expr: new TokContext(\"(\", true),\n q_tmpl: new TokContext(\"`\", true, true, function (p) { return p.tryReadTemplateToken(); }),\n f_stat: new TokContext(\"function\", false),\n f_expr: new TokContext(\"function\", true),\n f_expr_gen: new TokContext(\"function\", true, false, null, true),\n f_gen: new TokContext(\"function\", false, false, null, true)\n};\n\nvar pp$7 = Parser.prototype;\n\npp$7.initialContext = function() {\n return [types$1.b_stat]\n};\n\npp$7.braceIsBlock = function(prevType) {\n var parent = this.curContext();\n if (parent === types$1.f_expr || parent === types$1.f_stat)\n { return true }\n if (prevType === types.colon && (parent === types$1.b_stat || parent === types$1.b_expr))\n { return !parent.isExpr }\n\n // The check for `tt.name && exprAllowed` detects whether we are\n // after a `yield` or `of` construct. See the `updateContext` for\n // `tt.name`.\n if (prevType === types._return || prevType === types.name && this.exprAllowed)\n { return lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) }\n if (prevType === types._else || prevType === types.semi || prevType === types.eof || prevType === types.parenR || prevType === types.arrow)\n { return true }\n if (prevType === types.braceL)\n { return parent === types$1.b_stat }\n if (prevType === types._var || prevType === types._const || prevType === types.name)\n { return false }\n return !this.exprAllowed\n};\n\npp$7.inGeneratorContext = function() {\n for (var i = this.context.length - 1; i >= 1; i--) {\n var context = this.context[i];\n if (context.token === \"function\")\n { return context.generator }\n }\n return false\n};\n\npp$7.updateContext = function(prevType) {\n var update, type = this.type;\n if (type.keyword && prevType === types.dot)\n { this.exprAllowed = false; }\n else if (update = type.updateContext)\n { update.call(this, prevType); }\n else\n { this.exprAllowed = type.beforeExpr; }\n};\n\n// Token-specific context update code\n\ntypes.parenR.updateContext = types.braceR.updateContext = function() {\n if (this.context.length === 1) {\n this.exprAllowed = true;\n return\n }\n var out = this.context.pop();\n if (out === types$1.b_stat && this.curContext().token === \"function\") {\n out = this.context.pop();\n }\n this.exprAllowed = !out.isExpr;\n};\n\ntypes.braceL.updateContext = function(prevType) {\n this.context.push(this.braceIsBlock(prevType) ? types$1.b_stat : types$1.b_expr);\n this.exprAllowed = true;\n};\n\ntypes.dollarBraceL.updateContext = function() {\n this.context.push(types$1.b_tmpl);\n this.exprAllowed = true;\n};\n\ntypes.parenL.updateContext = function(prevType) {\n var statementParens = prevType === types._if || prevType === types._for || prevType === types._with || prevType === types._while;\n this.context.push(statementParens ? types$1.p_stat : types$1.p_expr);\n this.exprAllowed = true;\n};\n\ntypes.incDec.updateContext = function() {\n // tokExprAllowed stays unchanged\n};\n\ntypes._function.updateContext = types._class.updateContext = function(prevType) {\n if (prevType.beforeExpr && prevType !== types.semi && prevType !== types._else &&\n !(prevType === types._return && lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) &&\n !((prevType === types.colon || prevType === types.braceL) && this.curContext() === types$1.b_stat))\n { this.context.push(types$1.f_expr); }\n else\n { this.context.push(types$1.f_stat); }\n this.exprAllowed = false;\n};\n\ntypes.backQuote.updateContext = function() {\n if (this.curContext() === types$1.q_tmpl)\n { this.context.pop(); }\n else\n { this.context.push(types$1.q_tmpl); }\n this.exprAllowed = false;\n};\n\ntypes.star.updateContext = function(prevType) {\n if (prevType === types._function) {\n var index = this.context.length - 1;\n if (this.context[index] === types$1.f_expr)\n { this.context[index] = types$1.f_expr_gen; }\n else\n { this.context[index] = types$1.f_gen; }\n }\n this.exprAllowed = true;\n};\n\ntypes.name.updateContext = function(prevType) {\n var allowed = false;\n if (this.options.ecmaVersion >= 6 && prevType !== types.dot) {\n if (this.value === \"of\" && !this.exprAllowed ||\n this.value === \"yield\" && this.inGeneratorContext())\n { allowed = true; }\n }\n this.exprAllowed = allowed;\n};\n\n// This file contains Unicode properties extracted from the ECMAScript\n// specification. The lists are extracted like so:\n// $$('#table-binary-unicode-properties > figure > table > tbody > tr > td:nth-child(1) code').map(el => el.innerText)\n\n// #table-binary-unicode-properties\nvar ecma9BinaryProperties = \"ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS\";\nvar ecma10BinaryProperties = ecma9BinaryProperties + \" Extended_Pictographic\";\nvar ecma11BinaryProperties = ecma10BinaryProperties;\nvar unicodeBinaryProperties = {\n 9: ecma9BinaryProperties,\n 10: ecma10BinaryProperties,\n 11: ecma11BinaryProperties\n};\n\n// #table-unicode-general-category-values\nvar unicodeGeneralCategoryValues = \"Cased_Letter LC Close_Punctuation Pe Connector_Punctuation Pc Control Cc cntrl Currency_Symbol Sc Dash_Punctuation Pd Decimal_Number Nd digit Enclosing_Mark Me Final_Punctuation Pf Format Cf Initial_Punctuation Pi Letter L Letter_Number Nl Line_Separator Zl Lowercase_Letter Ll Mark M Combining_Mark Math_Symbol Sm Modifier_Letter Lm Modifier_Symbol Sk Nonspacing_Mark Mn Number N Open_Punctuation Ps Other C Other_Letter Lo Other_Number No Other_Punctuation Po Other_Symbol So Paragraph_Separator Zp Private_Use Co Punctuation P punct Separator Z Space_Separator Zs Spacing_Mark Mc Surrogate Cs Symbol S Titlecase_Letter Lt Unassigned Cn Uppercase_Letter Lu\";\n\n// #table-unicode-script-values\nvar ecma9ScriptValues = \"Adlam Adlm Ahom Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb\";\nvar ecma10ScriptValues = ecma9ScriptValues + \" Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd\";\nvar ecma11ScriptValues = ecma10ScriptValues + \" Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho\";\nvar unicodeScriptValues = {\n 9: ecma9ScriptValues,\n 10: ecma10ScriptValues,\n 11: ecma11ScriptValues\n};\n\nvar data = {};\nfunction buildUnicodeData(ecmaVersion) {\n var d = data[ecmaVersion] = {\n binary: wordsRegexp(unicodeBinaryProperties[ecmaVersion] + \" \" + unicodeGeneralCategoryValues),\n nonBinary: {\n General_Category: wordsRegexp(unicodeGeneralCategoryValues),\n Script: wordsRegexp(unicodeScriptValues[ecmaVersion])\n }\n };\n d.nonBinary.Script_Extensions = d.nonBinary.Script;\n\n d.nonBinary.gc = d.nonBinary.General_Category;\n d.nonBinary.sc = d.nonBinary.Script;\n d.nonBinary.scx = d.nonBinary.Script_Extensions;\n}\nbuildUnicodeData(9);\nbuildUnicodeData(10);\nbuildUnicodeData(11);\n\nvar pp$8 = Parser.prototype;\n\nvar RegExpValidationState = function RegExpValidationState(parser) {\n this.parser = parser;\n this.validFlags = \"gim\" + (parser.options.ecmaVersion >= 6 ? \"uy\" : \"\") + (parser.options.ecmaVersion >= 9 ? \"s\" : \"\");\n this.unicodeProperties = data[parser.options.ecmaVersion >= 11 ? 11 : parser.options.ecmaVersion];\n this.source = \"\";\n this.flags = \"\";\n this.start = 0;\n this.switchU = false;\n this.switchN = false;\n this.pos = 0;\n this.lastIntValue = 0;\n this.lastStringValue = \"\";\n this.lastAssertionIsQuantifiable = false;\n this.numCapturingParens = 0;\n this.maxBackReference = 0;\n this.groupNames = [];\n this.backReferenceNames = [];\n};\n\nRegExpValidationState.prototype.reset = function reset (start, pattern, flags) {\n var unicode = flags.indexOf(\"u\") !== -1;\n this.start = start | 0;\n this.source = pattern + \"\";\n this.flags = flags;\n this.switchU = unicode && this.parser.options.ecmaVersion >= 6;\n this.switchN = unicode && this.parser.options.ecmaVersion >= 9;\n};\n\nRegExpValidationState.prototype.raise = function raise (message) {\n this.parser.raiseRecoverable(this.start, (\"Invalid regular expression: /\" + (this.source) + \"/: \" + message));\n};\n\n// If u flag is given, this returns the code point at the index (it combines a surrogate pair).\n// Otherwise, this returns the code unit of the index (can be a part of a surrogate pair).\nRegExpValidationState.prototype.at = function at (i, forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n var s = this.source;\n var l = s.length;\n if (i >= l) {\n return -1\n }\n var c = s.charCodeAt(i);\n if (!(forceU || this.switchU) || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l) {\n return c\n }\n var next = s.charCodeAt(i + 1);\n return next >= 0xDC00 && next <= 0xDFFF ? (c << 10) + next - 0x35FDC00 : c\n};\n\nRegExpValidationState.prototype.nextIndex = function nextIndex (i, forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n var s = this.source;\n var l = s.length;\n if (i >= l) {\n return l\n }\n var c = s.charCodeAt(i), next;\n if (!(forceU || this.switchU) || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l ||\n (next = s.charCodeAt(i + 1)) < 0xDC00 || next > 0xDFFF) {\n return i + 1\n }\n return i + 2\n};\n\nRegExpValidationState.prototype.current = function current (forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n return this.at(this.pos, forceU)\n};\n\nRegExpValidationState.prototype.lookahead = function lookahead (forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n return this.at(this.nextIndex(this.pos, forceU), forceU)\n};\n\nRegExpValidationState.prototype.advance = function advance (forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n this.pos = this.nextIndex(this.pos, forceU);\n};\n\nRegExpValidationState.prototype.eat = function eat (ch, forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n if (this.current(forceU) === ch) {\n this.advance(forceU);\n return true\n }\n return false\n};\n\nfunction codePointToString(ch) {\n if (ch <= 0xFFFF) { return String.fromCharCode(ch) }\n ch -= 0x10000;\n return String.fromCharCode((ch >> 10) + 0xD800, (ch & 0x03FF) + 0xDC00)\n}\n\n/**\n * Validate the flags part of a given RegExpLiteral.\n *\n * @param {RegExpValidationState} state The state to validate RegExp.\n * @returns {void}\n */\npp$8.validateRegExpFlags = function(state) {\n var validFlags = state.validFlags;\n var flags = state.flags;\n\n for (var i = 0; i < flags.length; i++) {\n var flag = flags.charAt(i);\n if (validFlags.indexOf(flag) === -1) {\n this.raise(state.start, \"Invalid regular expression flag\");\n }\n if (flags.indexOf(flag, i + 1) > -1) {\n this.raise(state.start, \"Duplicate regular expression flag\");\n }\n }\n};\n\n/**\n * Validate the pattern part of a given RegExpLiteral.\n *\n * @param {RegExpValidationState} state The state to validate RegExp.\n * @returns {void}\n */\npp$8.validateRegExpPattern = function(state) {\n this.regexp_pattern(state);\n\n // The goal symbol for the parse is |Pattern[~U, ~N]|. If the result of\n // parsing contains a |GroupName|, reparse with the goal symbol\n // |Pattern[~U, +N]| and use this result instead. Throw a *SyntaxError*\n // exception if _P_ did not conform to the grammar, if any elements of _P_\n // were not matched by the parse, or if any Early Error conditions exist.\n if (!state.switchN && this.options.ecmaVersion >= 9 && state.groupNames.length > 0) {\n state.switchN = true;\n this.regexp_pattern(state);\n }\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-Pattern\npp$8.regexp_pattern = function(state) {\n state.pos = 0;\n state.lastIntValue = 0;\n state.lastStringValue = \"\";\n state.lastAssertionIsQuantifiable = false;\n state.numCapturingParens = 0;\n state.maxBackReference = 0;\n state.groupNames.length = 0;\n state.backReferenceNames.length = 0;\n\n this.regexp_disjunction(state);\n\n if (state.pos !== state.source.length) {\n // Make the same messages as V8.\n if (state.eat(0x29 /* ) */)) {\n state.raise(\"Unmatched ')'\");\n }\n if (state.eat(0x5D /* ] */) || state.eat(0x7D /* } */)) {\n state.raise(\"Lone quantifier brackets\");\n }\n }\n if (state.maxBackReference > state.numCapturingParens) {\n state.raise(\"Invalid escape\");\n }\n for (var i = 0, list = state.backReferenceNames; i < list.length; i += 1) {\n var name = list[i];\n\n if (state.groupNames.indexOf(name) === -1) {\n state.raise(\"Invalid named capture referenced\");\n }\n }\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-Disjunction\npp$8.regexp_disjunction = function(state) {\n this.regexp_alternative(state);\n while (state.eat(0x7C /* | */)) {\n this.regexp_alternative(state);\n }\n\n // Make the same message as V8.\n if (this.regexp_eatQuantifier(state, true)) {\n state.raise(\"Nothing to repeat\");\n }\n if (state.eat(0x7B /* { */)) {\n state.raise(\"Lone quantifier brackets\");\n }\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-Alternative\npp$8.regexp_alternative = function(state) {\n while (state.pos < state.source.length && this.regexp_eatTerm(state))\n { }\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Term\npp$8.regexp_eatTerm = function(state) {\n if (this.regexp_eatAssertion(state)) {\n // Handle `QuantifiableAssertion Quantifier` alternative.\n // `state.lastAssertionIsQuantifiable` is true if the last eaten Assertion\n // is a QuantifiableAssertion.\n if (state.lastAssertionIsQuantifiable && this.regexp_eatQuantifier(state)) {\n // Make the same message as V8.\n if (state.switchU) {\n state.raise(\"Invalid quantifier\");\n }\n }\n return true\n }\n\n if (state.switchU ? this.regexp_eatAtom(state) : this.regexp_eatExtendedAtom(state)) {\n this.regexp_eatQuantifier(state);\n return true\n }\n\n return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Assertion\npp$8.regexp_eatAssertion = function(state) {\n var start = state.pos;\n state.lastAssertionIsQuantifiable = false;\n\n // ^, $\n if (state.eat(0x5E /* ^ */) || state.eat(0x24 /* $ */)) {\n return true\n }\n\n // \\b \\B\n if (state.eat(0x5C /* \\ */)) {\n if (state.eat(0x42 /* B */) || state.eat(0x62 /* b */)) {\n return true\n }\n state.pos = start;\n }\n\n // Lookahead / Lookbehind\n if (state.eat(0x28 /* ( */) && state.eat(0x3F /* ? */)) {\n var lookbehind = false;\n if (this.options.ecmaVersion >= 9) {\n lookbehind = state.eat(0x3C /* < */);\n }\n if (state.eat(0x3D /* = */) || state.eat(0x21 /* ! */)) {\n this.regexp_disjunction(state);\n if (!state.eat(0x29 /* ) */)) {\n state.raise(\"Unterminated group\");\n }\n state.lastAssertionIsQuantifiable = !lookbehind;\n return true\n }\n }\n\n state.pos = start;\n return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-Quantifier\npp$8.regexp_eatQuantifier = function(state, noError) {\n if ( noError === void 0 ) noError = false;\n\n if (this.regexp_eatQuantifierPrefix(state, noError)) {\n state.eat(0x3F /* ? */);\n return true\n }\n return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-QuantifierPrefix\npp$8.regexp_eatQuantifierPrefix = function(state, noError) {\n return (\n state.eat(0x2A /* * */) ||\n state.eat(0x2B /* + */) ||\n state.eat(0x3F /* ? */) ||\n this.regexp_eatBracedQuantifier(state, noError)\n )\n};\npp$8.regexp_eatBracedQuantifier = function(state, noError) {\n var start = state.pos;\n if (state.eat(0x7B /* { */)) {\n var min = 0, max = -1;\n if (this.regexp_eatDecimalDigits(state)) {\n min = state.lastIntValue;\n if (state.eat(0x2C /* , */) && this.regexp_eatDecimalDigits(state)) {\n max = state.lastIntValue;\n }\n if (state.eat(0x7D /* } */)) {\n // SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-term\n if (max !== -1 && max < min && !noError) {\n state.raise(\"numbers out of order in {} quantifier\");\n }\n return true\n }\n }\n if (state.switchU && !noError) {\n state.raise(\"Incomplete quantifier\");\n }\n state.pos = start;\n }\n return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-Atom\npp$8.regexp_eatAtom = function(state) {\n return (\n this.regexp_eatPatternCharacters(state) ||\n state.eat(0x2E /* . */) ||\n this.regexp_eatReverseSolidusAtomEscape(state) ||\n this.regexp_eatCharacterClass(state) ||\n this.regexp_eatUncapturingGroup(state) ||\n this.regexp_eatCapturingGroup(state)\n )\n};\npp$8.regexp_eatReverseSolidusAtomEscape = function(state) {\n var start = state.pos;\n if (state.eat(0x5C /* \\ */)) {\n if (this.regexp_eatAtomEscape(state)) {\n return true\n }\n state.pos = start;\n }\n return false\n};\npp$8.regexp_eatUncapturingGroup = function(state) {\n var start = state.pos;\n if (state.eat(0x28 /* ( */)) {\n if (state.eat(0x3F /* ? */) && state.eat(0x3A /* : */)) {\n this.regexp_disjunction(state);\n if (state.eat(0x29 /* ) */)) {\n return true\n }\n state.raise(\"Unterminated group\");\n }\n state.pos = start;\n }\n return false\n};\npp$8.regexp_eatCapturingGroup = function(state) {\n if (state.eat(0x28 /* ( */)) {\n if (this.options.ecmaVersion >= 9) {\n this.regexp_groupSpecifier(state);\n } else if (state.current() === 0x3F /* ? */) {\n state.raise(\"Invalid group\");\n }\n this.regexp_disjunction(state);\n if (state.eat(0x29 /* ) */)) {\n state.numCapturingParens += 1;\n return true\n }\n state.raise(\"Unterminated group\");\n }\n return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedAtom\npp$8.regexp_eatExtendedAtom = function(state) {\n return (\n state.eat(0x2E /* . */) ||\n this.regexp_eatReverseSolidusAtomEscape(state) ||\n this.regexp_eatCharacterClass(state) ||\n this.regexp_eatUncapturingGroup(state) ||\n this.regexp_eatCapturingGroup(state) ||\n this.regexp_eatInvalidBracedQuantifier(state) ||\n this.regexp_eatExtendedPatternCharacter(state)\n )\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-InvalidBracedQuantifier\npp$8.regexp_eatInvalidBracedQuantifier = function(state) {\n if (this.regexp_eatBracedQuantifier(state, true)) {\n state.raise(\"Nothing to repeat\");\n }\n return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-SyntaxCharacter\npp$8.regexp_eatSyntaxCharacter = function(state) {\n var ch = state.current();\n if (isSyntaxCharacter(ch)) {\n state.lastIntValue = ch;\n state.advance();\n return true\n }\n return false\n};\nfunction isSyntaxCharacter(ch) {\n return (\n ch === 0x24 /* $ */ ||\n ch >= 0x28 /* ( */ && ch <= 0x2B /* + */ ||\n ch === 0x2E /* . */ ||\n ch === 0x3F /* ? */ ||\n ch >= 0x5B /* [ */ && ch <= 0x5E /* ^ */ ||\n ch >= 0x7B /* { */ && ch <= 0x7D /* } */\n )\n}\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-PatternCharacter\n// But eat eager.\npp$8.regexp_eatPatternCharacters = function(state) {\n var start = state.pos;\n var ch = 0;\n while ((ch = state.current()) !== -1 && !isSyntaxCharacter(ch)) {\n state.advance();\n }\n return state.pos !== start\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedPatternCharacter\npp$8.regexp_eatExtendedPatternCharacter = function(state) {\n var ch = state.current();\n if (\n ch !== -1 &&\n ch !== 0x24 /* $ */ &&\n !(ch >= 0x28 /* ( */ && ch <= 0x2B /* + */) &&\n ch !== 0x2E /* . */ &&\n ch !== 0x3F /* ? */ &&\n ch !== 0x5B /* [ */ &&\n ch !== 0x5E /* ^ */ &&\n ch !== 0x7C /* | */\n ) {\n state.advance();\n return true\n }\n return false\n};\n\n// GroupSpecifier ::\n// [empty]\n// `?` GroupName\npp$8.regexp_groupSpecifier = function(state) {\n if (state.eat(0x3F /* ? */)) {\n if (this.regexp_eatGroupName(state)) {\n if (state.groupNames.indexOf(state.lastStringValue) !== -1) {\n state.raise(\"Duplicate capture group name\");\n }\n state.groupNames.push(state.lastStringValue);\n return\n }\n state.raise(\"Invalid group\");\n }\n};\n\n// GroupName ::\n// `<` RegExpIdentifierName `>`\n// Note: this updates `state.lastStringValue` property with the eaten name.\npp$8.regexp_eatGroupName = function(state) {\n state.lastStringValue = \"\";\n if (state.eat(0x3C /* < */)) {\n if (this.regexp_eatRegExpIdentifierName(state) && state.eat(0x3E /* > */)) {\n return true\n }\n state.raise(\"Invalid capture group name\");\n }\n return false\n};\n\n// RegExpIdentifierName ::\n// RegExpIdentifierStart\n// RegExpIdentifierName RegExpIdentifierPart\n// Note: this updates `state.lastStringValue` property with the eaten name.\npp$8.regexp_eatRegExpIdentifierName = function(state) {\n state.lastStringValue = \"\";\n if (this.regexp_eatRegExpIdentifierStart(state)) {\n state.lastStringValue += codePointToString(state.lastIntValue);\n while (this.regexp_eatRegExpIdentifierPart(state)) {\n state.lastStringValue += codePointToString(state.lastIntValue);\n }\n return true\n }\n return false\n};\n\n// RegExpIdentifierStart ::\n// UnicodeIDStart\n// `$`\n// `_`\n// `\\` RegExpUnicodeEscapeSequence[+U]\npp$8.regexp_eatRegExpIdentifierStart = function(state) {\n var start = state.pos;\n var forceU = this.options.ecmaVersion >= 11;\n var ch = state.current(forceU);\n state.advance(forceU);\n\n if (ch === 0x5C /* \\ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state, forceU)) {\n ch = state.lastIntValue;\n }\n if (isRegExpIdentifierStart(ch)) {\n state.lastIntValue = ch;\n return true\n }\n\n state.pos = start;\n return false\n};\nfunction isRegExpIdentifierStart(ch) {\n return isIdentifierStart(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */\n}\n\n// RegExpIdentifierPart ::\n// UnicodeIDContinue\n// `$`\n// `_`\n// `\\` RegExpUnicodeEscapeSequence[+U]\n// <ZWNJ>\n// <ZWJ>\npp$8.regexp_eatRegExpIdentifierPart = function(state) {\n var start = state.pos;\n var forceU = this.options.ecmaVersion >= 11;\n var ch = state.current(forceU);\n state.advance(forceU);\n\n if (ch === 0x5C /* \\ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state, forceU)) {\n ch = state.lastIntValue;\n }\n if (isRegExpIdentifierPart(ch)) {\n state.lastIntValue = ch;\n return true\n }\n\n state.pos = start;\n return false\n};\nfunction isRegExpIdentifierPart(ch) {\n return isIdentifierChar(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */ || ch === 0x200C /* <ZWNJ> */ || ch === 0x200D /* <ZWJ> */\n}\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-AtomEscape\npp$8.regexp_eatAtomEscape = function(state) {\n if (\n this.regexp_eatBackReference(state) ||\n this.regexp_eatCharacterClassEscape(state) ||\n this.regexp_eatCharacterEscape(state) ||\n (state.switchN && this.regexp_eatKGroupName(state))\n ) {\n return true\n }\n if (state.switchU) {\n // Make the same message as V8.\n if (state.current() === 0x63 /* c */) {\n state.raise(\"Invalid unicode escape\");\n }\n state.raise(\"Invalid escape\");\n }\n return false\n};\npp$8.regexp_eatBackReference = function(state) {\n var start = state.pos;\n if (this.regexp_eatDecimalEscape(state)) {\n var n = state.lastIntValue;\n if (state.switchU) {\n // For SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-atomescape\n if (n > state.maxBackReference) {\n state.maxBackReference = n;\n }\n return true\n }\n if (n <= state.numCapturingParens) {\n return true\n }\n state.pos = start;\n }\n return false\n};\npp$8.regexp_eatKGroupName = function(state) {\n if (state.eat(0x6B /* k */)) {\n if (this.regexp_eatGroupName(state)) {\n state.backReferenceNames.push(state.lastStringValue);\n return true\n }\n state.raise(\"Invalid named reference\");\n }\n return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-CharacterEscape\npp$8.regexp_eatCharacterEscape = function(state) {\n return (\n this.regexp_eatControlEscape(state) ||\n this.regexp_eatCControlLetter(state) ||\n this.regexp_eatZero(state) ||\n this.regexp_eatHexEscapeSequence(state) ||\n this.regexp_eatRegExpUnicodeEscapeSequence(state, false) ||\n (!state.switchU && this.regexp_eatLegacyOctalEscapeSequence(state)) ||\n this.regexp_eatIdentityEscape(state)\n )\n};\npp$8.regexp_eatCControlLetter = function(state) {\n var start = state.pos;\n if (state.eat(0x63 /* c */)) {\n if (this.regexp_eatControlLetter(state)) {\n return true\n }\n state.pos = start;\n }\n return false\n};\npp$8.regexp_eatZero = function(state) {\n if (state.current() === 0x30 /* 0 */ && !isDecimalDigit(state.lookahead())) {\n state.lastIntValue = 0;\n state.advance();\n return true\n }\n return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-ControlEscape\npp$8.regexp_eatControlEscape = function(state) {\n var ch = state.current();\n if (ch === 0x74 /* t */) {\n state.lastIntValue = 0x09; /* \\t */\n state.advance();\n return true\n }\n if (ch === 0x6E /* n */) {\n state.lastIntValue = 0x0A; /* \\n */\n state.advance();\n return true\n }\n if (ch === 0x76 /* v */) {\n state.lastIntValue = 0x0B; /* \\v */\n state.advance();\n return true\n }\n if (ch === 0x66 /* f */) {\n state.lastIntValue = 0x0C; /* \\f */\n state.advance();\n return true\n }\n if (ch === 0x72 /* r */) {\n state.lastIntValue = 0x0D; /* \\r */\n state.advance();\n return true\n }\n return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-ControlLetter\npp$8.regexp_eatControlLetter = function(state) {\n var ch = state.current();\n if (isControlLetter(ch)) {\n state.lastIntValue = ch % 0x20;\n state.advance();\n return true\n }\n return false\n};\nfunction isControlLetter(ch) {\n return (\n (ch >= 0x41 /* A */ && ch <= 0x5A /* Z */) ||\n (ch >= 0x61 /* a */ && ch <= 0x7A /* z */)\n )\n}\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-RegExpUnicodeEscapeSequence\npp$8.regexp_eatRegExpUnicodeEscapeSequence = function(state, forceU) {\n if ( forceU === void 0 ) forceU = false;\n\n var start = state.pos;\n var switchU = forceU || state.switchU;\n\n if (state.eat(0x75 /* u */)) {\n if (this.regexp_eatFixedHexDigits(state, 4)) {\n var lead = state.lastIntValue;\n if (switchU && lead >= 0xD800 && lead <= 0xDBFF) {\n var leadSurrogateEnd = state.pos;\n if (state.eat(0x5C /* \\ */) && state.eat(0x75 /* u */) && this.regexp_eatFixedHexDigits(state, 4)) {\n var trail = state.lastIntValue;\n if (trail >= 0xDC00 && trail <= 0xDFFF) {\n state.lastIntValue = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;\n return true\n }\n }\n state.pos = leadSurrogateEnd;\n state.lastIntValue = lead;\n }\n return true\n }\n if (\n switchU &&\n state.eat(0x7B /* { */) &&\n this.regexp_eatHexDigits(state) &&\n state.eat(0x7D /* } */) &&\n isValidUnicode(state.lastIntValue)\n ) {\n return true\n }\n if (switchU) {\n state.raise(\"Invalid unicode escape\");\n }\n state.pos = start;\n }\n\n return false\n};\nfunction isValidUnicode(ch) {\n return ch >= 0 && ch <= 0x10FFFF\n}\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-IdentityEscape\npp$8.regexp_eatIdentityEscape = function(state) {\n if (state.switchU) {\n if (this.regexp_eatSyntaxCharacter(state)) {\n return true\n }\n if (state.eat(0x2F /* / */)) {\n state.lastIntValue = 0x2F; /* / */\n return true\n }\n return false\n }\n\n var ch = state.current();\n if (ch !== 0x63 /* c */ && (!state.switchN || ch !== 0x6B /* k */)) {\n state.lastIntValue = ch;\n state.advance();\n return true\n }\n\n return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalEscape\npp$8.regexp_eatDecimalEscape = function(state) {\n state.lastIntValue = 0;\n var ch = state.current();\n if (ch >= 0x31 /* 1 */ && ch <= 0x39 /* 9 */) {\n do {\n state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */);\n state.advance();\n } while ((ch = state.current()) >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */)\n return true\n }\n return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClassEscape\npp$8.regexp_eatCharacterClassEscape = function(state) {\n var ch = state.current();\n\n if (isCharacterClassEscape(ch)) {\n state.lastIntValue = -1;\n state.advance();\n return true\n }\n\n if (\n state.switchU &&\n this.options.ecmaVersion >= 9 &&\n (ch === 0x50 /* P */ || ch === 0x70 /* p */)\n ) {\n state.lastIntValue = -1;\n state.advance();\n if (\n state.eat(0x7B /* { */) &&\n this.regexp_eatUnicodePropertyValueExpression(state) &&\n state.eat(0x7D /* } */)\n ) {\n return true\n }\n state.raise(\"Invalid property name\");\n }\n\n return false\n};\nfunction isCharacterClassEscape(ch) {\n return (\n ch === 0x64 /* d */ ||\n ch === 0x44 /* D */ ||\n ch === 0x73 /* s */ ||\n ch === 0x53 /* S */ ||\n ch === 0x77 /* w */ ||\n ch === 0x57 /* W */\n )\n}\n\n// UnicodePropertyValueExpression ::\n// UnicodePropertyName `=` UnicodePropertyValue\n// LoneUnicodePropertyNameOrValue\npp$8.regexp_eatUnicodePropertyValueExpression = function(state) {\n var start = state.pos;\n\n // UnicodePropertyName `=` UnicodePropertyValue\n if (this.regexp_eatUnicodePropertyName(state) && state.eat(0x3D /* = */)) {\n var name = state.lastStringValue;\n if (this.regexp_eatUnicodePropertyValue(state)) {\n var value = state.lastStringValue;\n this.regexp_validateUnicodePropertyNameAndValue(state, name, value);\n return true\n }\n }\n state.pos = start;\n\n // LoneUnicodePropertyNameOrValue\n if (this.regexp_eatLoneUnicodePropertyNameOrValue(state)) {\n var nameOrValue = state.lastStringValue;\n this.regexp_validateUnicodePropertyNameOrValue(state, nameOrValue);\n return true\n }\n return false\n};\npp$8.regexp_validateUnicodePropertyNameAndValue = function(state, name, value) {\n if (!has(state.unicodeProperties.nonBinary, name))\n { state.raise(\"Invalid property name\"); }\n if (!state.unicodeProperties.nonBinary[name].test(value))\n { state.raise(\"Invalid property value\"); }\n};\npp$8.regexp_validateUnicodePropertyNameOrValue = function(state, nameOrValue) {\n if (!state.unicodeProperties.binary.test(nameOrValue))\n { state.raise(\"Invalid property name\"); }\n};\n\n// UnicodePropertyName ::\n// UnicodePropertyNameCharacters\npp$8.regexp_eatUnicodePropertyName = function(state) {\n var ch = 0;\n state.lastStringValue = \"\";\n while (isUnicodePropertyNameCharacter(ch = state.current())) {\n state.lastStringValue += codePointToString(ch);\n state.advance();\n }\n return state.lastStringValue !== \"\"\n};\nfunction isUnicodePropertyNameCharacter(ch) {\n return isControlLetter(ch) || ch === 0x5F /* _ */\n}\n\n// UnicodePropertyValue ::\n// UnicodePropertyValueCharacters\npp$8.regexp_eatUnicodePropertyValue = function(state) {\n var ch = 0;\n state.lastStringValue = \"\";\n while (isUnicodePropertyValueCharacter(ch = state.current())) {\n state.lastStringValue += codePointToString(ch);\n state.advance();\n }\n return state.lastStringValue !== \"\"\n};\nfunction isUnicodePropertyValueCharacter(ch) {\n return isUnicodePropertyNameCharacter(ch) || isDecimalDigit(ch)\n}\n\n// LoneUnicodePropertyNameOrValue ::\n// UnicodePropertyValueCharacters\npp$8.regexp_eatLoneUnicodePropertyNameOrValue = function(state) {\n return this.regexp_eatUnicodePropertyValue(state)\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClass\npp$8.regexp_eatCharacterClass = function(state) {\n if (state.eat(0x5B /* [ */)) {\n state.eat(0x5E /* ^ */);\n this.regexp_classRanges(state);\n if (state.eat(0x5D /* ] */)) {\n return true\n }\n // Unreachable since it threw \"unterminated regular expression\" error before.\n state.raise(\"Unterminated character class\");\n }\n return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-ClassRanges\n// https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRanges\n// https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRangesNoDash\npp$8.regexp_classRanges = function(state) {\n while (this.regexp_eatClassAtom(state)) {\n var left = state.lastIntValue;\n if (state.eat(0x2D /* - */) && this.regexp_eatClassAtom(state)) {\n var right = state.lastIntValue;\n if (state.switchU && (left === -1 || right === -1)) {\n state.raise(\"Invalid character class\");\n }\n if (left !== -1 && right !== -1 && left > right) {\n state.raise(\"Range out of order in character class\");\n }\n }\n }\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtom\n// https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtomNoDash\npp$8.regexp_eatClassAtom = function(state) {\n var start = state.pos;\n\n if (state.eat(0x5C /* \\ */)) {\n if (this.regexp_eatClassEscape(state)) {\n return true\n }\n if (state.switchU) {\n // Make the same message as V8.\n var ch$1 = state.current();\n if (ch$1 === 0x63 /* c */ || isOctalDigit(ch$1)) {\n state.raise(\"Invalid class escape\");\n }\n state.raise(\"Invalid escape\");\n }\n state.pos = start;\n }\n\n var ch = state.current();\n if (ch !== 0x5D /* ] */) {\n state.lastIntValue = ch;\n state.advance();\n return true\n }\n\n return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassEscape\npp$8.regexp_eatClassEscape = function(state) {\n var start = state.pos;\n\n if (state.eat(0x62 /* b */)) {\n state.lastIntValue = 0x08; /* <BS> */\n return true\n }\n\n if (state.switchU && state.eat(0x2D /* - */)) {\n state.lastIntValue = 0x2D; /* - */\n return true\n }\n\n if (!state.switchU && state.eat(0x63 /* c */)) {\n if (this.regexp_eatClassControlLetter(state)) {\n return true\n }\n state.pos = start;\n }\n\n return (\n this.regexp_eatCharacterClassEscape(state) ||\n this.regexp_eatCharacterEscape(state)\n )\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassControlLetter\npp$8.regexp_eatClassControlLetter = function(state) {\n var ch = state.current();\n if (isDecimalDigit(ch) || ch === 0x5F /* _ */) {\n state.lastIntValue = ch % 0x20;\n state.advance();\n return true\n }\n return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence\npp$8.regexp_eatHexEscapeSequence = function(state) {\n var start = state.pos;\n if (state.eat(0x78 /* x */)) {\n if (this.regexp_eatFixedHexDigits(state, 2)) {\n return true\n }\n if (state.switchU) {\n state.raise(\"Invalid escape\");\n }\n state.pos = start;\n }\n return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalDigits\npp$8.regexp_eatDecimalDigits = function(state) {\n var start = state.pos;\n var ch = 0;\n state.lastIntValue = 0;\n while (isDecimalDigit(ch = state.current())) {\n state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */);\n state.advance();\n }\n return state.pos !== start\n};\nfunction isDecimalDigit(ch) {\n return ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */\n}\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigits\npp$8.regexp_eatHexDigits = function(state) {\n var start = state.pos;\n var ch = 0;\n state.lastIntValue = 0;\n while (isHexDigit(ch = state.current())) {\n state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch);\n state.advance();\n }\n return state.pos !== start\n};\nfunction isHexDigit(ch) {\n return (\n (ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */) ||\n (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) ||\n (ch >= 0x61 /* a */ && ch <= 0x66 /* f */)\n )\n}\nfunction hexToInt(ch) {\n if (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) {\n return 10 + (ch - 0x41 /* A */)\n }\n if (ch >= 0x61 /* a */ && ch <= 0x66 /* f */) {\n return 10 + (ch - 0x61 /* a */)\n }\n return ch - 0x30 /* 0 */\n}\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-LegacyOctalEscapeSequence\n// Allows only 0-377(octal) i.e. 0-255(decimal).\npp$8.regexp_eatLegacyOctalEscapeSequence = function(state) {\n if (this.regexp_eatOctalDigit(state)) {\n var n1 = state.lastIntValue;\n if (this.regexp_eatOctalDigit(state)) {\n var n2 = state.lastIntValue;\n if (n1 <= 3 && this.regexp_eatOctalDigit(state)) {\n state.lastIntValue = n1 * 64 + n2 * 8 + state.lastIntValue;\n } else {\n state.lastIntValue = n1 * 8 + n2;\n }\n } else {\n state.lastIntValue = n1;\n }\n return true\n }\n return false\n};\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-OctalDigit\npp$8.regexp_eatOctalDigit = function(state) {\n var ch = state.current();\n if (isOctalDigit(ch)) {\n state.lastIntValue = ch - 0x30; /* 0 */\n state.advance();\n return true\n }\n state.lastIntValue = 0;\n return false\n};\nfunction isOctalDigit(ch) {\n return ch >= 0x30 /* 0 */ && ch <= 0x37 /* 7 */\n}\n\n// https://www.ecma-international.org/ecma-262/8.0/#prod-Hex4Digits\n// https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigit\n// And HexDigit HexDigit in https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence\npp$8.regexp_eatFixedHexDigits = function(state, length) {\n var start = state.pos;\n state.lastIntValue = 0;\n for (var i = 0; i < length; ++i) {\n var ch = state.current();\n if (!isHexDigit(ch)) {\n state.pos = start;\n return false\n }\n state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch);\n state.advance();\n }\n return true\n};\n\n// Object type used to represent tokens. Note that normally, tokens\n// simply exist as properties on the parser object. This is only\n// used for the onToken callback and the external tokenizer.\n\nvar Token = function Token(p) {\n this.type = p.type;\n this.value = p.value;\n this.start = p.start;\n this.end = p.end;\n if (p.options.locations)\n { this.loc = new SourceLocation(p, p.startLoc, p.endLoc); }\n if (p.options.ranges)\n { this.range = [p.start, p.end]; }\n};\n\n// ## Tokenizer\n\nvar pp$9 = Parser.prototype;\n\n// Move to the next token\n\npp$9.next = function(ignoreEscapeSequenceInKeyword) {\n if (!ignoreEscapeSequenceInKeyword && this.type.keyword && this.containsEsc)\n { this.raiseRecoverable(this.start, \"Escape sequence in keyword \" + this.type.keyword); }\n if (this.options.onToken)\n { this.options.onToken(new Token(this)); }\n\n this.lastTokEnd = this.end;\n this.lastTokStart = this.start;\n this.lastTokEndLoc = this.endLoc;\n this.lastTokStartLoc = this.startLoc;\n this.nextToken();\n};\n\npp$9.getToken = function() {\n this.next();\n return new Token(this)\n};\n\n// If we're in an ES6 environment, make parsers iterable\nif (typeof Symbol !== \"undefined\")\n { pp$9[Symbol.iterator] = function() {\n var this$1 = this;\n\n return {\n next: function () {\n var token = this$1.getToken();\n return {\n done: token.type === types.eof,\n value: token\n }\n }\n }\n }; }\n\n// Toggle strict mode. Re-reads the next number or string to please\n// pedantic tests (`\"use strict\"; 010;` should fail).\n\npp$9.curContext = function() {\n return this.context[this.context.length - 1]\n};\n\n// Read a single token, updating the parser object's token-related\n// properties.\n\npp$9.nextToken = function() {\n var curContext = this.curContext();\n if (!curContext || !curContext.preserveSpace) { this.skipSpace(); }\n\n this.start = this.pos;\n if (this.options.locations) { this.startLoc = this.curPosition(); }\n if (this.pos >= this.input.length) { return this.finishToken(types.eof) }\n\n if (curContext.override) { return curContext.override(this) }\n else { this.readToken(this.fullCharCodeAtPos()); }\n};\n\npp$9.readToken = function(code) {\n // Identifier or keyword. '\\uXXXX' sequences are allowed in\n // identifiers, so '\\' also dispatches to that.\n if (isIdentifierStart(code, this.options.ecmaVersion >= 6) || code === 92 /* '\\' */)\n { return this.readWord() }\n\n return this.getTokenFromCode(code)\n};\n\npp$9.fullCharCodeAtPos = function() {\n var code = this.input.charCodeAt(this.pos);\n if (code <= 0xd7ff || code >= 0xe000) { return code }\n var next = this.input.charCodeAt(this.pos + 1);\n return (code << 10) + next - 0x35fdc00\n};\n\npp$9.skipBlockComment = function() {\n var startLoc = this.options.onComment && this.curPosition();\n var start = this.pos, end = this.input.indexOf(\"*/\", this.pos += 2);\n if (end === -1) { this.raise(this.pos - 2, \"Unterminated comment\"); }\n this.pos = end + 2;\n if (this.options.locations) {\n lineBreakG.lastIndex = start;\n var match;\n while ((match = lineBreakG.exec(this.input)) && match.index < this.pos) {\n ++this.curLine;\n this.lineStart = match.index + match[0].length;\n }\n }\n if (this.options.onComment)\n { this.options.onComment(true, this.input.slice(start + 2, end), start, this.pos,\n startLoc, this.curPosition()); }\n};\n\npp$9.skipLineComment = function(startSkip) {\n var start = this.pos;\n var startLoc = this.options.onComment && this.curPosition();\n var ch = this.input.charCodeAt(this.pos += startSkip);\n while (this.pos < this.input.length && !isNewLine(ch)) {\n ch = this.input.charCodeAt(++this.pos);\n }\n if (this.options.onComment)\n { this.options.onComment(false, this.input.slice(start + startSkip, this.pos), start, this.pos,\n startLoc, this.curPosition()); }\n};\n\n// Called at the start of the parse and after every token. Skips\n// whitespace and comments, and.\n\npp$9.skipSpace = function() {\n loop: while (this.pos < this.input.length) {\n var ch = this.input.charCodeAt(this.pos);\n switch (ch) {\n case 32: case 160: // ' '\n ++this.pos;\n break\n case 13:\n if (this.input.charCodeAt(this.pos + 1) === 10) {\n ++this.pos;\n }\n case 10: case 8232: case 8233:\n ++this.pos;\n if (this.options.locations) {\n ++this.curLine;\n this.lineStart = this.pos;\n }\n break\n case 47: // '/'\n switch (this.input.charCodeAt(this.pos + 1)) {\n case 42: // '*'\n this.skipBlockComment();\n break\n case 47:\n this.skipLineComment(2);\n break\n default:\n break loop\n }\n break\n default:\n if (ch > 8 && ch < 14 || ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) {\n ++this.pos;\n } else {\n break loop\n }\n }\n }\n};\n\n// Called at the end of every token. Sets `end`, `val`, and\n// maintains `context` and `exprAllowed`, and skips the space after\n// the token, so that the next one's `start` will point at the\n// right position.\n\npp$9.finishToken = function(type, val) {\n this.end = this.pos;\n if (this.options.locations) { this.endLoc = this.curPosition(); }\n var prevType = this.type;\n this.type = type;\n this.value = val;\n\n this.updateContext(prevType);\n};\n\n// ### Token reading\n\n// This is the function that is called to fetch the next token. It\n// is somewhat obscure, because it works in character codes rather\n// than characters, and because operator parsing has been inlined\n// into it.\n//\n// All in the name of speed.\n//\npp$9.readToken_dot = function() {\n var next = this.input.charCodeAt(this.pos + 1);\n if (next >= 48 && next <= 57) { return this.readNumber(true) }\n var next2 = this.input.charCodeAt(this.pos + 2);\n if (this.options.ecmaVersion >= 6 && next === 46 && next2 === 46) { // 46 = dot '.'\n this.pos += 3;\n return this.finishToken(types.ellipsis)\n } else {\n ++this.pos;\n return this.finishToken(types.dot)\n }\n};\n\npp$9.readToken_slash = function() { // '/'\n var next = this.input.charCodeAt(this.pos + 1);\n if (this.exprAllowed) { ++this.pos; return this.readRegexp() }\n if (next === 61) { return this.finishOp(types.assign, 2) }\n return this.finishOp(types.slash, 1)\n};\n\npp$9.readToken_mult_modulo_exp = function(code) { // '%*'\n var next = this.input.charCodeAt(this.pos + 1);\n var size = 1;\n var tokentype = code === 42 ? types.star : types.modulo;\n\n // exponentiation operator ** and **=\n if (this.options.ecmaVersion >= 7 && code === 42 && next === 42) {\n ++size;\n tokentype = types.starstar;\n next = this.input.charCodeAt(this.pos + 2);\n }\n\n if (next === 61) { return this.finishOp(types.assign, size + 1) }\n return this.finishOp(tokentype, size)\n};\n\npp$9.readToken_pipe_amp = function(code) { // '|&'\n var next = this.input.charCodeAt(this.pos + 1);\n if (next === code) {\n if (this.options.ecmaVersion >= 12) {\n var next2 = this.input.charCodeAt(this.pos + 2);\n if (next2 === 61) { return this.finishOp(types.assign, 3) }\n }\n return this.finishOp(code === 124 ? types.logicalOR : types.logicalAND, 2)\n }\n if (next === 61) { return this.finishOp(types.assign, 2) }\n return this.finishOp(code === 124 ? types.bitwiseOR : types.bitwiseAND, 1)\n};\n\npp$9.readToken_caret = function() { // '^'\n var next = this.input.charCodeAt(this.pos + 1);\n if (next === 61) { return this.finishOp(types.assign, 2) }\n return this.finishOp(types.bitwiseXOR, 1)\n};\n\npp$9.readToken_plus_min = function(code) { // '+-'\n var next = this.input.charCodeAt(this.pos + 1);\n if (next === code) {\n if (next === 45 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 62 &&\n (this.lastTokEnd === 0 || lineBreak.test(this.input.slice(this.lastTokEnd, this.pos)))) {\n // A `-->` line comment\n this.skipLineComment(3);\n this.skipSpace();\n return this.nextToken()\n }\n return this.finishOp(types.incDec, 2)\n }\n if (next === 61) { return this.finishOp(types.assign, 2) }\n return this.finishOp(types.plusMin, 1)\n};\n\npp$9.readToken_lt_gt = function(code) { // '<>'\n var next = this.input.charCodeAt(this.pos + 1);\n var size = 1;\n if (next === code) {\n size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2;\n if (this.input.charCodeAt(this.pos + size) === 61) { return this.finishOp(types.assign, size + 1) }\n return this.finishOp(types.bitShift, size)\n }\n if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 &&\n this.input.charCodeAt(this.pos + 3) === 45) {\n // `<!--`, an XML-style comment that should be interpreted as a line comment\n this.skipLineComment(4);\n this.skipSpace();\n return this.nextToken()\n }\n if (next === 61) { size = 2; }\n return this.finishOp(types.relational, size)\n};\n\npp$9.readToken_eq_excl = function(code) { // '=!'\n var next = this.input.charCodeAt(this.pos + 1);\n if (next === 61) { return this.finishOp(types.equality, this.input.charCodeAt(this.pos + 2) === 61 ? 3 : 2) }\n if (code === 61 && next === 62 && this.options.ecmaVersion >= 6) { // '=>'\n this.pos += 2;\n return this.finishToken(types.arrow)\n }\n return this.finishOp(code === 61 ? types.eq : types.prefix, 1)\n};\n\npp$9.readToken_question = function() { // '?'\n var ecmaVersion = this.options.ecmaVersion;\n if (ecmaVersion >= 11) {\n var next = this.input.charCodeAt(this.pos + 1);\n if (next === 46) {\n var next2 = this.input.charCodeAt(this.pos + 2);\n if (next2 < 48 || next2 > 57) { return this.finishOp(types.questionDot, 2) }\n }\n if (next === 63) {\n if (ecmaVersion >= 12) {\n var next2$1 = this.input.charCodeAt(this.pos + 2);\n if (next2$1 === 61) { return this.finishOp(types.assign, 3) }\n }\n return this.finishOp(types.coalesce, 2)\n }\n }\n return this.finishOp(types.question, 1)\n};\n\npp$9.getTokenFromCode = function(code) {\n switch (code) {\n // The interpretation of a dot depends on whether it is followed\n // by a digit or another two dots.\n case 46: // '.'\n return this.readToken_dot()\n\n // Punctuation tokens.\n case 40: ++this.pos; return this.finishToken(types.parenL)\n case 41: ++this.pos; return this.finishToken(types.parenR)\n case 59: ++this.pos; return this.finishToken(types.semi)\n case 44: ++this.pos; return this.finishToken(types.comma)\n case 91: ++this.pos; return this.finishToken(types.bracketL)\n case 93: ++this.pos; return this.finishToken(types.bracketR)\n case 123: ++this.pos; return this.finishToken(types.braceL)\n case 125: ++this.pos; return this.finishToken(types.braceR)\n case 58: ++this.pos; return this.finishToken(types.colon)\n\n case 96: // '`'\n if (this.options.ecmaVersion < 6) { break }\n ++this.pos;\n return this.finishToken(types.backQuote)\n\n case 48: // '0'\n var next = this.input.charCodeAt(this.pos + 1);\n if (next === 120 || next === 88) { return this.readRadixNumber(16) } // '0x', '0X' - hex number\n if (this.options.ecmaVersion >= 6) {\n if (next === 111 || next === 79) { return this.readRadixNumber(8) } // '0o', '0O' - octal number\n if (next === 98 || next === 66) { return this.readRadixNumber(2) } // '0b', '0B' - binary number\n }\n\n // Anything else beginning with a digit is an integer, octal\n // number, or float.\n case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: // 1-9\n return this.readNumber(false)\n\n // Quotes produce strings.\n case 34: case 39: // '\"', \"'\"\n return this.readString(code)\n\n // Operators are parsed inline in tiny state machines. '=' (61) is\n // often referred to. `finishOp` simply skips the amount of\n // characters it is given as second argument, and returns a token\n // of the type given by its first argument.\n\n case 47: // '/'\n return this.readToken_slash()\n\n case 37: case 42: // '%*'\n return this.readToken_mult_modulo_exp(code)\n\n case 124: case 38: // '|&'\n return this.readToken_pipe_amp(code)\n\n case 94: // '^'\n return this.readToken_caret()\n\n case 43: case 45: // '+-'\n return this.readToken_plus_min(code)\n\n case 60: case 62: // '<>'\n return this.readToken_lt_gt(code)\n\n case 61: case 33: // '=!'\n return this.readToken_eq_excl(code)\n\n case 63: // '?'\n return this.readToken_question()\n\n case 126: // '~'\n return this.finishOp(types.prefix, 1)\n }\n\n this.raise(this.pos, \"Unexpected character '\" + codePointToString$1(code) + \"'\");\n};\n\npp$9.finishOp = function(type, size) {\n var str = this.input.slice(this.pos, this.pos + size);\n this.pos += size;\n return this.finishToken(type, str)\n};\n\npp$9.readRegexp = function() {\n var escaped, inClass, start = this.pos;\n for (;;) {\n if (this.pos >= this.input.length) { this.raise(start, \"Unterminated regular expression\"); }\n var ch = this.input.charAt(this.pos);\n if (lineBreak.test(ch)) { this.raise(start, \"Unterminated regular expression\"); }\n if (!escaped) {\n if (ch === \"[\") { inClass = true; }\n else if (ch === \"]\" && inClass) { inClass = false; }\n else if (ch === \"/\" && !inClass) { break }\n escaped = ch === \"\\\\\";\n } else { escaped = false; }\n ++this.pos;\n }\n var pattern = this.input.slice(start, this.pos);\n ++this.pos;\n var flagsStart = this.pos;\n var flags = this.readWord1();\n if (this.containsEsc) { this.unexpected(flagsStart); }\n\n // Validate pattern\n var state = this.regexpState || (this.regexpState = new RegExpValidationState(this));\n state.reset(start, pattern, flags);\n this.validateRegExpFlags(state);\n this.validateRegExpPattern(state);\n\n // Create Literal#value property value.\n var value = null;\n try {\n value = new RegExp(pattern, flags);\n } catch (e) {\n // ESTree requires null if it failed to instantiate RegExp object.\n // https://github.com/estree/estree/blob/a27003adf4fd7bfad44de9cef372a2eacd527b1c/es5.md#regexpliteral\n }\n\n return this.finishToken(types.regexp, {pattern: pattern, flags: flags, value: value})\n};\n\n// Read an integer in the given radix. Return null if zero digits\n// were read, the integer value otherwise. When `len` is given, this\n// will return `null` unless the integer has exactly `len` digits.\n\npp$9.readInt = function(radix, len, maybeLegacyOctalNumericLiteral) {\n // `len` is used for character escape sequences. In that case, disallow separators.\n var allowSeparators = this.options.ecmaVersion >= 12 && len === undefined;\n\n // `maybeLegacyOctalNumericLiteral` is true if it doesn't have prefix (0x,0o,0b)\n // and isn't fraction part nor exponent part. In that case, if the first digit\n // is zero then disallow separators.\n var isLegacyOctalNumericLiteral = maybeLegacyOctalNumericLiteral && this.input.charCodeAt(this.pos) === 48;\n\n var start = this.pos, total = 0, lastCode = 0;\n for (var i = 0, e = len == null ? Infinity : len; i < e; ++i, ++this.pos) {\n var code = this.input.charCodeAt(this.pos), val = (void 0);\n\n if (allowSeparators && code === 95) {\n if (isLegacyOctalNumericLiteral) { this.raiseRecoverable(this.pos, \"Numeric separator is not allowed in legacy octal numeric literals\"); }\n if (lastCode === 95) { this.raiseRecoverable(this.pos, \"Numeric separator must be exactly one underscore\"); }\n if (i === 0) { this.raiseRecoverable(this.pos, \"Numeric separator is not allowed at the first of digits\"); }\n lastCode = code;\n continue\n }\n\n if (code >= 97) { val = code - 97 + 10; } // a\n else if (code >= 65) { val = code - 65 + 10; } // A\n else if (code >= 48 && code <= 57) { val = code - 48; } // 0-9\n else { val = Infinity; }\n if (val >= radix) { break }\n lastCode = code;\n total = total * radix + val;\n }\n\n if (allowSeparators && lastCode === 95) { this.raiseRecoverable(this.pos - 1, \"Numeric separator is not allowed at the last of digits\"); }\n if (this.pos === start || len != null && this.pos - start !== len) { return null }\n\n return total\n};\n\nfunction stringToNumber(str, isLegacyOctalNumericLiteral) {\n if (isLegacyOctalNumericLiteral) {\n return parseInt(str, 8)\n }\n\n // `parseFloat(value)` stops parsing at the first numeric separator then returns a wrong value.\n return parseFloat(str.replace(/_/g, \"\"))\n}\n\nfunction stringToBigInt(str) {\n if (typeof BigInt !== \"function\") {\n return null\n }\n\n // `BigInt(value)` throws syntax error if the string contains numeric separators.\n return BigInt(str.replace(/_/g, \"\"))\n}\n\npp$9.readRadixNumber = function(radix) {\n var start = this.pos;\n this.pos += 2; // 0x\n var val = this.readInt(radix);\n if (val == null) { this.raise(this.start + 2, \"Expected number in radix \" + radix); }\n if (this.options.ecmaVersion >= 11 && this.input.charCodeAt(this.pos) === 110) {\n val = stringToBigInt(this.input.slice(start, this.pos));\n ++this.pos;\n } else if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, \"Identifier directly after number\"); }\n return this.finishToken(types.num, val)\n};\n\n// Read an integer, octal integer, or floating-point number.\n\npp$9.readNumber = function(startsWithDot) {\n var start = this.pos;\n if (!startsWithDot && this.readInt(10, undefined, true) === null) { this.raise(start, \"Invalid number\"); }\n var octal = this.pos - start >= 2 && this.input.charCodeAt(start) === 48;\n if (octal && this.strict) { this.raise(start, \"Invalid number\"); }\n var next = this.input.charCodeAt(this.pos);\n if (!octal && !startsWithDot && this.options.ecmaVersion >= 11 && next === 110) {\n var val$1 = stringToBigInt(this.input.slice(start, this.pos));\n ++this.pos;\n if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, \"Identifier directly after number\"); }\n return this.finishToken(types.num, val$1)\n }\n if (octal && /[89]/.test(this.input.slice(start, this.pos))) { octal = false; }\n if (next === 46 && !octal) { // '.'\n ++this.pos;\n this.readInt(10);\n next = this.input.charCodeAt(this.pos);\n }\n if ((next === 69 || next === 101) && !octal) { // 'eE'\n next = this.input.charCodeAt(++this.pos);\n if (next === 43 || next === 45) { ++this.pos; } // '+-'\n if (this.readInt(10) === null) { this.raise(start, \"Invalid number\"); }\n }\n if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, \"Identifier directly after number\"); }\n\n var val = stringToNumber(this.input.slice(start, this.pos), octal);\n return this.finishToken(types.num, val)\n};\n\n// Read a string value, interpreting backslash-escapes.\n\npp$9.readCodePoint = function() {\n var ch = this.input.charCodeAt(this.pos), code;\n\n if (ch === 123) { // '{'\n if (this.options.ecmaVersion < 6) { this.unexpected(); }\n var codePos = ++this.pos;\n code = this.readHexChar(this.input.indexOf(\"}\", this.pos) - this.pos);\n ++this.pos;\n if (code > 0x10FFFF) { this.invalidStringToken(codePos, \"Code point out of bounds\"); }\n } else {\n code = this.readHexChar(4);\n }\n return code\n};\n\nfunction codePointToString$1(code) {\n // UTF-16 Decoding\n if (code <= 0xFFFF) { return String.fromCharCode(code) }\n code -= 0x10000;\n return String.fromCharCode((code >> 10) + 0xD800, (code & 1023) + 0xDC00)\n}\n\npp$9.readString = function(quote) {\n var out = \"\", chunkStart = ++this.pos;\n for (;;) {\n if (this.pos >= this.input.length) { this.raise(this.start, \"Unterminated string constant\"); }\n var ch = this.input.charCodeAt(this.pos);\n if (ch === quote) { break }\n if (ch === 92) { // '\\'\n out += this.input.slice(chunkStart, this.pos);\n out += this.readEscapedChar(false);\n chunkStart = this.pos;\n } else {\n if (isNewLine(ch, this.options.ecmaVersion >= 10)) { this.raise(this.start, \"Unterminated string constant\"); }\n ++this.pos;\n }\n }\n out += this.input.slice(chunkStart, this.pos++);\n return this.finishToken(types.string, out)\n};\n\n// Reads template string tokens.\n\nvar INVALID_TEMPLATE_ESCAPE_ERROR = {};\n\npp$9.tryReadTemplateToken = function() {\n this.inTemplateElement = true;\n try {\n this.readTmplToken();\n } catch (err) {\n if (err === INVALID_TEMPLATE_ESCAPE_ERROR) {\n this.readInvalidTemplateToken();\n } else {\n throw err\n }\n }\n\n this.inTemplateElement = false;\n};\n\npp$9.invalidStringToken = function(position, message) {\n if (this.inTemplateElement && this.options.ecmaVersion >= 9) {\n throw INVALID_TEMPLATE_ESCAPE_ERROR\n } else {\n this.raise(position, message);\n }\n};\n\npp$9.readTmplToken = function() {\n var out = \"\", chunkStart = this.pos;\n for (;;) {\n if (this.pos >= this.input.length) { this.raise(this.start, \"Unterminated template\"); }\n var ch = this.input.charCodeAt(this.pos);\n if (ch === 96 || ch === 36 && this.input.charCodeAt(this.pos + 1) === 123) { // '`', '${'\n if (this.pos === this.start && (this.type === types.template || this.type === types.invalidTemplate)) {\n if (ch === 36) {\n this.pos += 2;\n return this.finishToken(types.dollarBraceL)\n } else {\n ++this.pos;\n return this.finishToken(types.backQuote)\n }\n }\n out += this.input.slice(chunkStart, this.pos);\n return this.finishToken(types.template, out)\n }\n if (ch === 92) { // '\\'\n out += this.input.slice(chunkStart, this.pos);\n out += this.readEscapedChar(true);\n chunkStart = this.pos;\n } else if (isNewLine(ch)) {\n out += this.input.slice(chunkStart, this.pos);\n ++this.pos;\n switch (ch) {\n case 13:\n if (this.input.charCodeAt(this.pos) === 10) { ++this.pos; }\n case 10:\n out += \"\\n\";\n break\n default:\n out += String.fromCharCode(ch);\n break\n }\n if (this.options.locations) {\n ++this.curLine;\n this.lineStart = this.pos;\n }\n chunkStart = this.pos;\n } else {\n ++this.pos;\n }\n }\n};\n\n// Reads a template token to search for the end, without validating any escape sequences\npp$9.readInvalidTemplateToken = function() {\n for (; this.pos < this.input.length; this.pos++) {\n switch (this.input[this.pos]) {\n case \"\\\\\":\n ++this.pos;\n break\n\n case \"$\":\n if (this.input[this.pos + 1] !== \"{\") {\n break\n }\n // falls through\n\n case \"`\":\n return this.finishToken(types.invalidTemplate, this.input.slice(this.start, this.pos))\n\n // no default\n }\n }\n this.raise(this.start, \"Unterminated template\");\n};\n\n// Used to read escaped characters\n\npp$9.readEscapedChar = function(inTemplate) {\n var ch = this.input.charCodeAt(++this.pos);\n ++this.pos;\n switch (ch) {\n case 110: return \"\\n\" // 'n' -> '\\n'\n case 114: return \"\\r\" // 'r' -> '\\r'\n case 120: return String.fromCharCode(this.readHexChar(2)) // 'x'\n case 117: return codePointToString$1(this.readCodePoint()) // 'u'\n case 116: return \"\\t\" // 't' -> '\\t'\n case 98: return \"\\b\" // 'b' -> '\\b'\n case 118: return \"\\u000b\" // 'v' -> '\\u000b'\n case 102: return \"\\f\" // 'f' -> '\\f'\n case 13: if (this.input.charCodeAt(this.pos) === 10) { ++this.pos; } // '\\r\\n'\n case 10: // ' \\n'\n if (this.options.locations) { this.lineStart = this.pos; ++this.curLine; }\n return \"\"\n case 56:\n case 57:\n if (inTemplate) {\n var codePos = this.pos - 1;\n\n this.invalidStringToken(\n codePos,\n \"Invalid escape sequence in template string\"\n );\n\n return null\n }\n default:\n if (ch >= 48 && ch <= 55) {\n var octalStr = this.input.substr(this.pos - 1, 3).match(/^[0-7]+/)[0];\n var octal = parseInt(octalStr, 8);\n if (octal > 255) {\n octalStr = octalStr.slice(0, -1);\n octal = parseInt(octalStr, 8);\n }\n this.pos += octalStr.length - 1;\n ch = this.input.charCodeAt(this.pos);\n if ((octalStr !== \"0\" || ch === 56 || ch === 57) && (this.strict || inTemplate)) {\n this.invalidStringToken(\n this.pos - 1 - octalStr.length,\n inTemplate\n ? \"Octal literal in template string\"\n : \"Octal literal in strict mode\"\n );\n }\n return String.fromCharCode(octal)\n }\n if (isNewLine(ch)) {\n // Unicode new line characters after \\ get removed from output in both\n // template literals and strings\n return \"\"\n }\n return String.fromCharCode(ch)\n }\n};\n\n// Used to read character escape sequences ('\\x', '\\u', '\\U').\n\npp$9.readHexChar = function(len) {\n var codePos = this.pos;\n var n = this.readInt(16, len);\n if (n === null) { this.invalidStringToken(codePos, \"Bad character escape sequence\"); }\n return n\n};\n\n// Read an identifier, and return it as a string. Sets `this.containsEsc`\n// to whether the word contained a '\\u' escape.\n//\n// Incrementally adds only escaped chars, adding other chunks as-is\n// as a micro-optimization.\n\npp$9.readWord1 = function() {\n this.containsEsc = false;\n var word = \"\", first = true, chunkStart = this.pos;\n var astral = this.options.ecmaVersion >= 6;\n while (this.pos < this.input.length) {\n var ch = this.fullCharCodeAtPos();\n if (isIdentifierChar(ch, astral)) {\n this.pos += ch <= 0xffff ? 1 : 2;\n } else if (ch === 92) { // \"\\\"\n this.containsEsc = true;\n word += this.input.slice(chunkStart, this.pos);\n var escStart = this.pos;\n if (this.input.charCodeAt(++this.pos) !== 117) // \"u\"\n { this.invalidStringToken(this.pos, \"Expecting Unicode escape sequence \\\\uXXXX\"); }\n ++this.pos;\n var esc = this.readCodePoint();\n if (!(first ? isIdentifierStart : isIdentifierChar)(esc, astral))\n { this.invalidStringToken(escStart, \"Invalid Unicode escape\"); }\n word += codePointToString$1(esc);\n chunkStart = this.pos;\n } else {\n break\n }\n first = false;\n }\n return word + this.input.slice(chunkStart, this.pos)\n};\n\n// Read an identifier or keyword token. Will check for reserved\n// words when necessary.\n\npp$9.readWord = function() {\n var word = this.readWord1();\n var type = types.name;\n if (this.keywords.test(word)) {\n type = keywords$1[word];\n }\n return this.finishToken(type, word)\n};\n\n// Acorn is a tiny, fast JavaScript parser written in JavaScript.\n\nvar version = \"7.4.1\";\n\nParser.acorn = {\n Parser: Parser,\n version: version,\n defaultOptions: defaultOptions,\n Position: Position,\n SourceLocation: SourceLocation,\n getLineInfo: getLineInfo,\n Node: Node,\n TokenType: TokenType,\n tokTypes: types,\n keywordTypes: keywords$1,\n TokContext: TokContext,\n tokContexts: types$1,\n isIdentifierChar: isIdentifierChar,\n isIdentifierStart: isIdentifierStart,\n Token: Token,\n isNewLine: isNewLine,\n lineBreak: lineBreak,\n lineBreakG: lineBreakG,\n nonASCIIwhitespace: nonASCIIwhitespace\n};\n\n// The main exported interface (under `self.acorn` when in the\n// browser) is a `parse` function that takes a code string and\n// returns an abstract syntax tree as specified by [Mozilla parser\n// API][api].\n//\n// [api]: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API\n\nfunction parse(input, options) {\n return Parser.parse(input, options)\n}\n\n// This function tries to parse a single expression at a given\n// offset in a string. Useful for parsing mixed-language formats\n// that embed JavaScript expressions.\n\nfunction parseExpressionAt(input, pos, options) {\n return Parser.parseExpressionAt(input, pos, options)\n}\n\n// Acorn is organized as a tokenizer and a recursive-descent parser.\n// The `tokenizer` export provides an interface to the tokenizer.\n\nfunction tokenizer(input, options) {\n return Parser.tokenizer(input, options)\n}\n\nexport { Node, Parser, Position, SourceLocation, TokContext, Token, TokenType, defaultOptions, getLineInfo, isIdentifierChar, isIdentifierStart, isNewLine, keywords$1 as keywordTypes, lineBreak, lineBreakG, nonASCIIwhitespace, parse, parseExpressionAt, types$1 as tokContexts, types as tokTypes, tokenizer, version };\n", "/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n", "'use strict';\n\nvar acorn = require('acorn');\nvar objectAssign = require('object-assign');\n\nmodule.exports = isExpression;\n\nvar DEFAULT_OPTIONS = {\n throw: false,\n strict: false,\n lineComment: false\n};\n\nfunction isExpression(src, options) {\n options = objectAssign({}, DEFAULT_OPTIONS, options);\n\n try {\n var parser = new acorn.Parser(options, src, 0);\n\n if (options.strict) {\n parser.strict = true;\n }\n\n if (!options.lineComment) {\n parser.skipLineComment = function (startSkip) {\n this.raise(this.pos, 'Line comments not allowed in an expression');\n };\n }\n\n parser.nextToken();\n parser.parseExpression();\n\n if (parser.type !== acorn.tokTypes.eof) {\n parser.unexpected();\n }\n } catch (ex) {\n if (!options.throw) {\n return false;\n }\n\n throw ex;\n }\n\n return true;\n}\n", "'use strict';\n\n/* eslint complexity: [2, 18], max-statements: [2, 33] */\nmodule.exports = function hasSymbols() {\n\tif (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }\n\tif (typeof Symbol.iterator === 'symbol') { return true; }\n\n\tvar obj = {};\n\tvar sym = Symbol('test');\n\tvar symObj = Object(sym);\n\tif (typeof sym === 'string') { return false; }\n\n\tif (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }\n\tif (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }\n\n\t// temp disabled per https://github.com/ljharb/object.assign/issues/17\n\t// if (sym instanceof Symbol) { return false; }\n\t// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4\n\t// if (!(symObj instanceof Symbol)) { return false; }\n\n\t// if (typeof Symbol.prototype.toString !== 'function') { return false; }\n\t// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }\n\n\tvar symVal = 42;\n\tobj[sym] = symVal;\n\tfor (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop\n\tif (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }\n\n\tif (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }\n\n\tvar syms = Object.getOwnPropertySymbols(obj);\n\tif (syms.length !== 1 || syms[0] !== sym) { return false; }\n\n\tif (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }\n\n\tif (typeof Object.getOwnPropertyDescriptor === 'function') {\n\t\tvar descriptor = Object.getOwnPropertyDescriptor(obj, sym);\n\t\tif (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }\n\t}\n\n\treturn true;\n};\n", "'use strict';\n\nvar origSymbol = typeof Symbol !== 'undefined' && Symbol;\nvar hasSymbolSham = require('./shams');\n\nmodule.exports = function hasNativeSymbols() {\n\tif (typeof origSymbol !== 'function') { return false; }\n\tif (typeof Symbol !== 'function') { return false; }\n\tif (typeof origSymbol('foo') !== 'symbol') { return false; }\n\tif (typeof Symbol('bar') !== 'symbol') { return false; }\n\n\treturn hasSymbolSham();\n};\n", "'use strict';\n\n/* eslint no-invalid-this: 1 */\n\nvar ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';\nvar slice = Array.prototype.slice;\nvar toStr = Object.prototype.toString;\nvar funcType = '[object Function]';\n\nmodule.exports = function bind(that) {\n var target = this;\n if (typeof target !== 'function' || toStr.call(target) !== funcType) {\n throw new TypeError(ERROR_MESSAGE + target);\n }\n var args = slice.call(arguments, 1);\n\n var bound;\n var binder = function () {\n if (this instanceof bound) {\n var result = target.apply(\n this,\n args.concat(slice.call(arguments))\n );\n if (Object(result) === result) {\n return result;\n }\n return this;\n } else {\n return target.apply(\n that,\n args.concat(slice.call(arguments))\n );\n }\n };\n\n var boundLength = Math.max(0, target.length - args.length);\n var boundArgs = [];\n for (var i = 0; i < boundLength; i++) {\n boundArgs.push('$' + i);\n }\n\n bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);\n\n if (target.prototype) {\n var Empty = function Empty() {};\n Empty.prototype = target.prototype;\n bound.prototype = new Empty();\n Empty.prototype = null;\n }\n\n return bound;\n};\n", "'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = Function.prototype.bind || implementation;\n", "'use strict';\n\nvar bind = require('function-bind');\n\nmodule.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);\n", "'use strict';\n\nvar undefined;\n\nvar $SyntaxError = SyntaxError;\nvar $Function = Function;\nvar $TypeError = TypeError;\n\n// eslint-disable-next-line consistent-return\nvar getEvalledConstructor = function (expressionSyntax) {\n\ttry {\n\t\treturn $Function('\"use strict\"; return (' + expressionSyntax + ').constructor;')();\n\t} catch (e) {}\n};\n\nvar $gOPD = Object.getOwnPropertyDescriptor;\nif ($gOPD) {\n\ttry {\n\t\t$gOPD({}, '');\n\t} catch (e) {\n\t\t$gOPD = null; // this is IE 8, which has a broken gOPD\n\t}\n}\n\nvar throwTypeError = function () {\n\tthrow new $TypeError();\n};\nvar ThrowTypeError = $gOPD\n\t? (function () {\n\t\ttry {\n\t\t\t// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties\n\t\t\targuments.callee; // IE 8 does not throw here\n\t\t\treturn throwTypeError;\n\t\t} catch (calleeThrows) {\n\t\t\ttry {\n\t\t\t\t// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')\n\t\t\t\treturn $gOPD(arguments, 'callee').get;\n\t\t\t} catch (gOPDthrows) {\n\t\t\t\treturn throwTypeError;\n\t\t\t}\n\t\t}\n\t}())\n\t: throwTypeError;\n\nvar hasSymbols = require('has-symbols')();\n\nvar getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto\n\nvar needsEval = {};\n\nvar TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);\n\nvar INTRINSICS = {\n\t'%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,\n\t'%Array%': Array,\n\t'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,\n\t'%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,\n\t'%AsyncFromSyncIteratorPrototype%': undefined,\n\t'%AsyncFunction%': needsEval,\n\t'%AsyncGenerator%': needsEval,\n\t'%AsyncGeneratorFunction%': needsEval,\n\t'%AsyncIteratorPrototype%': needsEval,\n\t'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,\n\t'%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,\n\t'%Boolean%': Boolean,\n\t'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,\n\t'%Date%': Date,\n\t'%decodeURI%': decodeURI,\n\t'%decodeURIComponent%': decodeURIComponent,\n\t'%encodeURI%': encodeURI,\n\t'%encodeURIComponent%': encodeURIComponent,\n\t'%Error%': Error,\n\t'%eval%': eval, // eslint-disable-line no-eval\n\t'%EvalError%': EvalError,\n\t'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,\n\t'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,\n\t'%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,\n\t'%Function%': $Function,\n\t'%GeneratorFunction%': needsEval,\n\t'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,\n\t'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,\n\t'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,\n\t'%isFinite%': isFinite,\n\t'%isNaN%': isNaN,\n\t'%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,\n\t'%JSON%': typeof JSON === 'object' ? JSON : undefined,\n\t'%Map%': typeof Map === 'undefined' ? undefined : Map,\n\t'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),\n\t'%Math%': Math,\n\t'%Number%': Number,\n\t'%Object%': Object,\n\t'%parseFloat%': parseFloat,\n\t'%parseInt%': parseInt,\n\t'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,\n\t'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,\n\t'%RangeError%': RangeError,\n\t'%ReferenceError%': ReferenceError,\n\t'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,\n\t'%RegExp%': RegExp,\n\t'%Set%': typeof Set === 'undefined' ? undefined : Set,\n\t'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),\n\t'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,\n\t'%String%': String,\n\t'%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,\n\t'%Symbol%': hasSymbols ? Symbol : undefined,\n\t'%SyntaxError%': $SyntaxError,\n\t'%ThrowTypeError%': ThrowTypeError,\n\t'%TypedArray%': TypedArray,\n\t'%TypeError%': $TypeError,\n\t'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,\n\t'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,\n\t'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,\n\t'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,\n\t'%URIError%': URIError,\n\t'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,\n\t'%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,\n\t'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet\n};\n\nvar doEval = function doEval(name) {\n\tvar value;\n\tif (name === '%AsyncFunction%') {\n\t\tvalue = getEvalledConstructor('async function () {}');\n\t} else if (name === '%GeneratorFunction%') {\n\t\tvalue = getEvalledConstructor('function* () {}');\n\t} else if (name === '%AsyncGeneratorFunction%') {\n\t\tvalue = getEvalledConstructor('async function* () {}');\n\t} else if (name === '%AsyncGenerator%') {\n\t\tvar fn = doEval('%AsyncGeneratorFunction%');\n\t\tif (fn) {\n\t\t\tvalue = fn.prototype;\n\t\t}\n\t} else if (name === '%AsyncIteratorPrototype%') {\n\t\tvar gen = doEval('%AsyncGenerator%');\n\t\tif (gen) {\n\t\t\tvalue = getProto(gen.prototype);\n\t\t}\n\t}\n\n\tINTRINSICS[name] = value;\n\n\treturn value;\n};\n\nvar LEGACY_ALIASES = {\n\t'%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],\n\t'%ArrayPrototype%': ['Array', 'prototype'],\n\t'%ArrayProto_entries%': ['Array', 'prototype', 'entries'],\n\t'%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],\n\t'%ArrayProto_keys%': ['Array', 'prototype', 'keys'],\n\t'%ArrayProto_values%': ['Array', 'prototype', 'values'],\n\t'%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],\n\t'%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],\n\t'%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],\n\t'%BooleanPrototype%': ['Boolean', 'prototype'],\n\t'%DataViewPrototype%': ['DataView', 'prototype'],\n\t'%DatePrototype%': ['Date', 'prototype'],\n\t'%ErrorPrototype%': ['Error', 'prototype'],\n\t'%EvalErrorPrototype%': ['EvalError', 'prototype'],\n\t'%Float32ArrayPrototype%': ['Float32Array', 'prototype'],\n\t'%Float64ArrayPrototype%': ['Float64Array', 'prototype'],\n\t'%FunctionPrototype%': ['Function', 'prototype'],\n\t'%Generator%': ['GeneratorFunction', 'prototype'],\n\t'%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],\n\t'%Int8ArrayPrototype%': ['Int8Array', 'prototype'],\n\t'%Int16ArrayPrototype%': ['Int16Array', 'prototype'],\n\t'%Int32ArrayPrototype%': ['Int32Array', 'prototype'],\n\t'%JSONParse%': ['JSON', 'parse'],\n\t'%JSONStringify%': ['JSON', 'stringify'],\n\t'%MapPrototype%': ['Map', 'prototype'],\n\t'%NumberPrototype%': ['Number', 'prototype'],\n\t'%ObjectPrototype%': ['Object', 'prototype'],\n\t'%ObjProto_toString%': ['Object', 'prototype', 'toString'],\n\t'%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],\n\t'%PromisePrototype%': ['Promise', 'prototype'],\n\t'%PromiseProto_then%': ['Promise', 'prototype', 'then'],\n\t'%Promise_all%': ['Promise', 'all'],\n\t'%Promise_reject%': ['Promise', 'reject'],\n\t'%Promise_resolve%': ['Promise', 'resolve'],\n\t'%RangeErrorPrototype%': ['RangeError', 'prototype'],\n\t'%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],\n\t'%RegExpPrototype%': ['RegExp', 'prototype'],\n\t'%SetPrototype%': ['Set', 'prototype'],\n\t'%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],\n\t'%StringPrototype%': ['String', 'prototype'],\n\t'%SymbolPrototype%': ['Symbol', 'prototype'],\n\t'%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],\n\t'%TypedArrayPrototype%': ['TypedArray', 'prototype'],\n\t'%TypeErrorPrototype%': ['TypeError', 'prototype'],\n\t'%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],\n\t'%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],\n\t'%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],\n\t'%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],\n\t'%URIErrorPrototype%': ['URIError', 'prototype'],\n\t'%WeakMapPrototype%': ['WeakMap', 'prototype'],\n\t'%WeakSetPrototype%': ['WeakSet', 'prototype']\n};\n\nvar bind = require('function-bind');\nvar hasOwn = require('has');\nvar $concat = bind.call(Function.call, Array.prototype.concat);\nvar $spliceApply = bind.call(Function.apply, Array.prototype.splice);\nvar $replace = bind.call(Function.call, String.prototype.replace);\nvar $strSlice = bind.call(Function.call, String.prototype.slice);\nvar $exec = bind.call(Function.call, RegExp.prototype.exec);\n\n/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */\nvar rePropName = /[^%.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|%$))/g;\nvar reEscapeChar = /\\\\(\\\\)?/g; /** Used to match backslashes in property paths. */\nvar stringToPath = function stringToPath(string) {\n\tvar first = $strSlice(string, 0, 1);\n\tvar last = $strSlice(string, -1);\n\tif (first === '%' && last !== '%') {\n\t\tthrow new $SyntaxError('invalid intrinsic syntax, expected closing `%`');\n\t} else if (last === '%' && first !== '%') {\n\t\tthrow new $SyntaxError('invalid intrinsic syntax, expected opening `%`');\n\t}\n\tvar result = [];\n\t$replace(string, rePropName, function (match, number, quote, subString) {\n\t\tresult[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;\n\t});\n\treturn result;\n};\n/* end adaptation */\n\nvar getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {\n\tvar intrinsicName = name;\n\tvar alias;\n\tif (hasOwn(LEGACY_ALIASES, intrinsicName)) {\n\t\talias = LEGACY_ALIASES[intrinsicName];\n\t\tintrinsicName = '%' + alias[0] + '%';\n\t}\n\n\tif (hasOwn(INTRINSICS, intrinsicName)) {\n\t\tvar value = INTRINSICS[intrinsicName];\n\t\tif (value === needsEval) {\n\t\t\tvalue = doEval(intrinsicName);\n\t\t}\n\t\tif (typeof value === 'undefined' && !allowMissing) {\n\t\t\tthrow new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');\n\t\t}\n\n\t\treturn {\n\t\t\talias: alias,\n\t\t\tname: intrinsicName,\n\t\t\tvalue: value\n\t\t};\n\t}\n\n\tthrow new $SyntaxError('intrinsic ' + name + ' does not exist!');\n};\n\nmodule.exports = function GetIntrinsic(name, allowMissing) {\n\tif (typeof name !== 'string' || name.length === 0) {\n\t\tthrow new $TypeError('intrinsic name must be a non-empty string');\n\t}\n\tif (arguments.length > 1 && typeof allowMissing !== 'boolean') {\n\t\tthrow new $TypeError('\"allowMissing\" argument must be a boolean');\n\t}\n\n\tif ($exec(/^%?[^%]*%?$/, name) === null) {\n\t\tthrow new $SyntaxError('`%` may not be present anywhere but at the beginning and end of the intrinsic name');\n\t}\n\tvar parts = stringToPath(name);\n\tvar intrinsicBaseName = parts.length > 0 ? parts[0] : '';\n\n\tvar intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);\n\tvar intrinsicRealName = intrinsic.name;\n\tvar value = intrinsic.value;\n\tvar skipFurtherCaching = false;\n\n\tvar alias = intrinsic.alias;\n\tif (alias) {\n\t\tintrinsicBaseName = alias[0];\n\t\t$spliceApply(parts, $concat([0, 1], alias));\n\t}\n\n\tfor (var i = 1, isOwn = true; i < parts.length; i += 1) {\n\t\tvar part = parts[i];\n\t\tvar first = $strSlice(part, 0, 1);\n\t\tvar last = $strSlice(part, -1);\n\t\tif (\n\t\t\t(\n\t\t\t\t(first === '\"' || first === \"'\" || first === '`')\n\t\t\t\t|| (last === '\"' || last === \"'\" || last === '`')\n\t\t\t)\n\t\t\t&& first !== last\n\t\t) {\n\t\t\tthrow new $SyntaxError('property names with quotes must have matching quotes');\n\t\t}\n\t\tif (part === 'constructor' || !isOwn) {\n\t\t\tskipFurtherCaching = true;\n\t\t}\n\n\t\tintrinsicBaseName += '.' + part;\n\t\tintrinsicRealName = '%' + intrinsicBaseName + '%';\n\n\t\tif (hasOwn(INTRINSICS, intrinsicRealName)) {\n\t\t\tvalue = INTRINSICS[intrinsicRealName];\n\t\t} else if (value != null) {\n\t\t\tif (!(part in value)) {\n\t\t\t\tif (!allowMissing) {\n\t\t\t\t\tthrow new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');\n\t\t\t\t}\n\t\t\t\treturn void undefined;\n\t\t\t}\n\t\t\tif ($gOPD && (i + 1) >= parts.length) {\n\t\t\t\tvar desc = $gOPD(value, part);\n\t\t\t\tisOwn = !!desc;\n\n\t\t\t\t// By convention, when a data property is converted to an accessor\n\t\t\t\t// property to emulate a data property that does not suffer from\n\t\t\t\t// the override mistake, that accessor's getter is marked with\n\t\t\t\t// an `originalValue` property. Here, when we detect this, we\n\t\t\t\t// uphold the illusion by pretending to see that original data\n\t\t\t\t// property, i.e., returning the value rather than the getter\n\t\t\t\t// itself.\n\t\t\t\tif (isOwn && 'get' in desc && !('originalValue' in desc.get)) {\n\t\t\t\t\tvalue = desc.get;\n\t\t\t\t} else {\n\t\t\t\t\tvalue = value[part];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tisOwn = hasOwn(value, part);\n\t\t\t\tvalue = value[part];\n\t\t\t}\n\n\t\t\tif (isOwn && !skipFurtherCaching) {\n\t\t\t\tINTRINSICS[intrinsicRealName] = value;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n", "'use strict';\n\nvar bind = require('function-bind');\nvar GetIntrinsic = require('get-intrinsic');\n\nvar $apply = GetIntrinsic('%Function.prototype.apply%');\nvar $call = GetIntrinsic('%Function.prototype.call%');\nvar $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply);\n\nvar $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true);\nvar $defineProperty = GetIntrinsic('%Object.defineProperty%', true);\nvar $max = GetIntrinsic('%Math.max%');\n\nif ($defineProperty) {\n\ttry {\n\t\t$defineProperty({}, 'a', { value: 1 });\n\t} catch (e) {\n\t\t// IE 8 has a broken defineProperty\n\t\t$defineProperty = null;\n\t}\n}\n\nmodule.exports = function callBind(originalFunction) {\n\tvar func = $reflectApply(bind, $call, arguments);\n\tif ($gOPD && $defineProperty) {\n\t\tvar desc = $gOPD(func, 'length');\n\t\tif (desc.configurable) {\n\t\t\t// original length, plus the receiver, minus any additional arguments (after the receiver)\n\t\t\t$defineProperty(\n\t\t\t\tfunc,\n\t\t\t\t'length',\n\t\t\t\t{ value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) }\n\t\t\t);\n\t\t}\n\t}\n\treturn func;\n};\n\nvar applyBind = function applyBind() {\n\treturn $reflectApply(bind, $apply, arguments);\n};\n\nif ($defineProperty) {\n\t$defineProperty(module.exports, 'apply', { value: applyBind });\n} else {\n\tmodule.exports.apply = applyBind;\n}\n", "'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\n\nvar callBind = require('./');\n\nvar $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));\n\nmodule.exports = function callBoundIntrinsic(name, allowMissing) {\n\tvar intrinsic = GetIntrinsic(name, !!allowMissing);\n\tif (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {\n\t\treturn callBind(intrinsic);\n\t}\n\treturn intrinsic;\n};\n", "'use strict';\n\nvar hasSymbols = require('has-symbols/shams');\n\nmodule.exports = function hasToStringTagShams() {\n\treturn hasSymbols() && !!Symbol.toStringTag;\n};\n", "'use strict';\n\nvar callBound = require('call-bind/callBound');\nvar hasToStringTag = require('has-tostringtag/shams')();\nvar has;\nvar $exec;\nvar isRegexMarker;\nvar badStringifier;\n\nif (hasToStringTag) {\n\thas = callBound('Object.prototype.hasOwnProperty');\n\t$exec = callBound('RegExp.prototype.exec');\n\tisRegexMarker = {};\n\n\tvar throwRegexMarker = function () {\n\t\tthrow isRegexMarker;\n\t};\n\tbadStringifier = {\n\t\ttoString: throwRegexMarker,\n\t\tvalueOf: throwRegexMarker\n\t};\n\n\tif (typeof Symbol.toPrimitive === 'symbol') {\n\t\tbadStringifier[Symbol.toPrimitive] = throwRegexMarker;\n\t}\n}\n\nvar $toString = callBound('Object.prototype.toString');\nvar gOPD = Object.getOwnPropertyDescriptor;\nvar regexClass = '[object RegExp]';\n\nmodule.exports = hasToStringTag\n\t// eslint-disable-next-line consistent-return\n\t? function isRegex(value) {\n\t\tif (!value || typeof value !== 'object') {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar descriptor = gOPD(value, 'lastIndex');\n\t\tvar hasLastIndexDataProperty = descriptor && has(descriptor, 'value');\n\t\tif (!hasLastIndexDataProperty) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t$exec(value, badStringifier);\n\t\t} catch (e) {\n\t\t\treturn e === isRegexMarker;\n\t\t}\n\t}\n\t: function isRegex(value) {\n\t\t// In older browsers, typeof regex incorrectly returns 'function'\n\t\tif (!value || (typeof value !== 'object' && typeof value !== 'function')) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn $toString(value) === regexClass;\n\t};\n", "'use strict';\n\nvar objIsRegex = require('is-regex');\n\nexports = (module.exports = parse);\n\nvar TOKEN_TYPES = exports.TOKEN_TYPES = {\n LINE_COMMENT: '//',\n BLOCK_COMMENT: '/**/',\n SINGLE_QUOTE: '\\'',\n DOUBLE_QUOTE: '\"',\n TEMPLATE_QUOTE: '`',\n REGEXP: '//g'\n}\n\nvar BRACKETS = exports.BRACKETS = {\n '(': ')',\n '{': '}',\n '[': ']'\n};\nvar BRACKETS_REVERSED = {\n ')': '(',\n '}': '{',\n ']': '['\n};\n\nexports.parse = parse;\nfunction parse(src, state, options) {\n options = options || {};\n state = state || exports.defaultState();\n var start = options.start || 0;\n var end = options.end || src.length;\n var index = start;\n while (index < end) {\n try {\n parseChar(src[index], state);\n } catch (ex) {\n ex.index = index;\n throw ex;\n }\n index++;\n }\n return state;\n}\n\nexports.parseUntil = parseUntil;\nfunction parseUntil(src, delimiter, options) {\n options = options || {};\n var start = options.start || 0;\n var index = start;\n var state = exports.defaultState();\n while (index < src.length) {\n if ((options.ignoreNesting || !state.isNesting(options)) && matches(src, delimiter, index)) {\n var end = index;\n return {\n start: start,\n end: end,\n src: src.substring(start, end)\n };\n }\n try {\n parseChar(src[index], state);\n } catch (ex) {\n ex.index = index;\n throw ex;\n }\n index++;\n }\n var err = new Error('The end of the string was reached with no closing bracket found.');\n err.code = 'CHARACTER_PARSER:END_OF_STRING_REACHED';\n err.index = index;\n throw err;\n}\n\nexports.parseChar = parseChar;\nfunction parseChar(character, state) {\n if (character.length !== 1) {\n var err = new Error('Character must be a string of length 1');\n err.name = 'InvalidArgumentError';\n err.code = 'CHARACTER_PARSER:CHAR_LENGTH_NOT_ONE';\n throw err;\n }\n state = state || exports.defaultState();\n state.src += character;\n var wasComment = state.isComment();\n var lastChar = state.history ? state.history[0] : '';\n\n\n if (state.regexpStart) {\n if (character === '/' || character == '*') {\n state.stack.pop();\n }\n state.regexpStart = false;\n }\n switch (state.current()) {\n case TOKEN_TYPES.LINE_COMMENT:\n if (character === '\\n') {\n state.stack.pop();\n }\n break;\n case TOKEN_TYPES.BLOCK_COMMENT:\n if (state.lastChar === '*' && character === '/') {\n state.stack.pop();\n }\n break;\n case TOKEN_TYPES.SINGLE_QUOTE:\n if (character === '\\'' && !state.escaped) {\n state.stack.pop();\n } else if (character === '\\\\' && !state.escaped) {\n state.escaped = true;\n } else {\n state.escaped = false;\n }\n break;\n case TOKEN_TYPES.DOUBLE_QUOTE:\n if (character === '\"' && !state.escaped) {\n state.stack.pop();\n } else if (character === '\\\\' && !state.escaped) {\n state.escaped = true;\n } else {\n state.escaped = false;\n }\n break;\n case TOKEN_TYPES.TEMPLATE_QUOTE:\n if (character === '`' && !state.escaped) {\n state.stack.pop();\n state.hasDollar = false;\n } else if (character === '\\\\' && !state.escaped) {\n state.escaped = true;\n state.hasDollar = false;\n } else if (character === '$' && !state.escaped) {\n state.hasDollar = true;\n } else if (character === '{' && state.hasDollar) {\n state.stack.push(BRACKETS[character]);\n } else {\n state.escaped = false;\n state.hasDollar = false;\n }\n break;\n case TOKEN_TYPES.REGEXP:\n if (character === '/' && !state.escaped) {\n state.stack.pop();\n } else if (character === '\\\\' && !state.escaped) {\n state.escaped = true;\n } else {\n state.escaped = false;\n }\n break;\n default:\n if (character in BRACKETS) {\n state.stack.push(BRACKETS[character]);\n } else if (character in BRACKETS_REVERSED) {\n if (state.current() !== character) {\n var err = new SyntaxError('Mismatched Bracket: ' + character);\n err.code = 'CHARACTER_PARSER:MISMATCHED_BRACKET';\n throw err;\n };\n state.stack.pop();\n } else if (lastChar === '/' && character === '/') {\n // Don't include comments in history\n state.history = state.history.substr(1);\n state.stack.push(TOKEN_TYPES.LINE_COMMENT);\n } else if (lastChar === '/' && character === '*') {\n // Don't include comment in history\n state.history = state.history.substr(1);\n state.stack.push(TOKEN_TYPES.BLOCK_COMMENT);\n } else if (character === '/' && isRegexp(state.history)) {\n state.stack.push(TOKEN_TYPES.REGEXP);\n // N.B. if the next character turns out to be a `*` or a `/`\n // then this isn't actually a regexp\n state.regexpStart = true;\n } else if (character === '\\'') {\n state.stack.push(TOKEN_TYPES.SINGLE_QUOTE);\n } else if (character === '\"') {\n state.stack.push(TOKEN_TYPES.DOUBLE_QUOTE);\n } else if (character === '`') {\n state.stack.push(TOKEN_TYPES.TEMPLATE_QUOTE);\n }\n break;\n }\n if (!state.isComment() && !wasComment) {\n state.history = character + state.history;\n }\n state.lastChar = character; // store last character for ending block comments\n return state;\n}\n\nexports.defaultState = function () { return new State() };\nfunction State() {\n this.stack = [];\n\n this.regexpStart = false;\n this.escaped = false;\n this.hasDollar = false;\n\n this.src = '';\n this.history = ''\n this.lastChar = ''\n}\nState.prototype.current = function () {\n return this.stack[this.stack.length - 1];\n};\nState.prototype.isString = function () {\n return (\n this.current() === TOKEN_TYPES.SINGLE_QUOTE ||\n this.current() === TOKEN_TYPES.DOUBLE_QUOTE ||\n this.current() === TOKEN_TYPES.TEMPLATE_QUOTE\n );\n}\nState.prototype.isComment = function () {\n return this.current() === TOKEN_TYPES.LINE_COMMENT || this.current() === TOKEN_TYPES.BLOCK_COMMENT;\n}\nState.prototype.isNesting = function (opts) {\n if (\n opts && opts.ignoreLineComment &&\n this.stack.length === 1 && this.stack[0] === TOKEN_TYPES.LINE_COMMENT\n ) {\n // if we are only inside a line comment, and line comments are ignored\n // don't count it as nesting\n return false;\n }\n return !!this.stack.length;\n}\n\nfunction matches(str, matcher, i) {\n if (objIsRegex(matcher)) {\n return matcher.test(str.substr(i || 0));\n } else {\n return str.substr(i || 0, matcher.length) === matcher;\n }\n}\n\nexports.isPunctuator = isPunctuator\nfunction isPunctuator(c) {\n if (!c) return true; // the start of a string is a punctuator\n var code = c.charCodeAt(0)\n\n switch (code) {\n case 46: // . dot\n case 40: // ( open bracket\n case 41: // ) close bracket\n case 59: // ; semicolon\n case 44: // , comma\n case 123: // { open curly brace\n case 125: // } close curly brace\n case 91: // [\n case 93: // ]\n case 58: // :\n case 63: // ?\n case 126: // ~\n case 37: // %\n case 38: // &\n case 42: // *:\n case 43: // +\n case 45: // -\n case 47: // /\n case 60: // <\n case 62: // >\n case 94: // ^\n case 124: // |\n case 33: // !\n case 61: // =\n return true;\n default:\n return false;\n }\n}\n\nexports.isKeyword = isKeyword\nfunction isKeyword(id) {\n return (id === 'if') || (id === 'in') || (id === 'do') || (id === 'var') || (id === 'for') || (id === 'new') ||\n (id === 'try') || (id === 'let') || (id === 'this') || (id === 'else') || (id === 'case') ||\n (id === 'void') || (id === 'with') || (id === 'enum') || (id === 'while') || (id === 'break') || (id === 'catch') ||\n (id === 'throw') || (id === 'const') || (id === 'yield') || (id === 'class') || (id === 'super') ||\n (id === 'return') || (id === 'typeof') || (id === 'delete') || (id === 'switch') || (id === 'export') ||\n (id === 'import') || (id === 'default') || (id === 'finally') || (id === 'extends') || (id === 'function') ||\n (id === 'continue') || (id === 'debugger') || (id === 'package') || (id === 'private') || (id === 'interface') ||\n (id === 'instanceof') || (id === 'implements') || (id === 'protected') || (id === 'public') || (id === 'static');\n}\n\nfunction isRegexp(history) {\n //could be start of regexp or divide sign\n\n history = history.replace(/^\\s*/, '');\n\n //unless its an `if`, `while`, `for` or `with` it's a divide, so we assume it's a divide\n if (history[0] === ')') return false;\n //unless it's a function expression, it's a regexp, so we assume it's a regexp\n if (history[0] === '}') return true;\n //any punctuation means it's a regexp\n if (isPunctuator(history[0])) return true;\n //if the last thing was a keyword then it must be a regexp (e.g. `typeof /foo/`)\n if (/^\\w+\\b/.test(history) && isKeyword(/^\\w+\\b/.exec(history)[0].split('').reverse().join(''))) return true;\n\n return false;\n}\n", "'use strict';\n\nmodule.exports = makeError;\nfunction makeError(code, message, options) {\n var line = options.line;\n var column = options.column;\n var filename = options.filename;\n var src = options.src;\n var fullMessage;\n var location = line + (column ? ':' + column : '');\n if (src && line >= 1 && line <= src.split('\\n').length) {\n var lines = src.split('\\n');\n var start = Math.max(line - 3, 0);\n var end = Math.min(lines.length, line + 3);\n // Error context\n var context = lines\n .slice(start, end)\n .map(function(text, i) {\n var curr = i + start + 1;\n var preamble = (curr == line ? ' > ' : ' ') + curr + '| ';\n var out = preamble + text;\n if (curr === line && column > 0) {\n out += '\\n';\n out += Array(preamble.length + column).join('-') + '^';\n }\n return out;\n })\n .join('\\n');\n fullMessage =\n (filename || 'Pug') + ':' + location + '\\n' + context + '\\n\\n' + message;\n } else {\n fullMessage = (filename || 'Pug') + ':' + location + '\\n\\n' + message;\n }\n var err = new Error(fullMessage);\n err.code = 'PUG:' + code;\n err.msg = message;\n err.line = line;\n err.column = column;\n err.filename = filename;\n err.src = src;\n err.toJSON = function() {\n return {\n code: this.code,\n msg: this.msg,\n line: this.line,\n column: this.column,\n filename: this.filename,\n };\n };\n return err;\n}\n", "'use strict';\n\nvar assert = require('assert');\nvar isExpression = require('is-expression');\nvar characterParser = require('character-parser');\nvar error = require('pug-error');\n\nmodule.exports = lex;\nmodule.exports.Lexer = Lexer;\nfunction lex(str, options) {\n var lexer = new Lexer(str, options);\n return JSON.parse(JSON.stringify(lexer.getTokens()));\n}\n\n/**\n * Initialize `Lexer` with the given `str`.\n *\n * @param {String} str\n * @param {String} filename\n * @api private\n */\n\nfunction Lexer(str, options) {\n options = options || {};\n if (typeof str !== 'string') {\n throw new Error(\n 'Expected source code to be a string but got \"' + typeof str + '\"'\n );\n }\n if (typeof options !== 'object') {\n throw new Error(\n 'Expected \"options\" to be an object but got \"' + typeof options + '\"'\n );\n }\n //Strip any UTF-8 BOM off of the start of `str`, if it exists.\n str = str.replace(/^\\uFEFF/, '');\n this.input = str.replace(/\\r\\n|\\r/g, '\\n');\n this.originalInput = this.input;\n this.filename = options.filename;\n this.interpolated = options.interpolated || false;\n this.lineno = options.startingLine || 1;\n this.colno = options.startingColumn || 1;\n this.plugins = options.plugins || [];\n this.indentStack = [0];\n this.indentRe = null;\n // If #{}, !{} or #[] syntax is allowed when adding text\n this.interpolationAllowed = true;\n this.whitespaceRe = /[ \\n\\t]/;\n\n this.tokens = [];\n this.ended = false;\n}\n\n/**\n * Lexer prototype.\n */\n\nLexer.prototype = {\n constructor: Lexer,\n\n error: function(code, message) {\n var err = error(code, message, {\n line: this.lineno,\n column: this.colno,\n filename: this.filename,\n src: this.originalInput,\n });\n throw err;\n },\n\n assert: function(value, message) {\n if (!value) this.error('ASSERT_FAILED', message);\n },\n\n isExpression: function(exp) {\n return isExpression(exp, {\n throw: true,\n });\n },\n\n assertExpression: function(exp, noThrow) {\n //this verifies that a JavaScript expression is valid\n try {\n this.callLexerFunction('isExpression', exp);\n return true;\n } catch (ex) {\n if (noThrow) return false;\n\n // not coming from acorn\n if (!ex.loc) throw ex;\n\n this.incrementLine(ex.loc.line - 1);\n this.incrementColumn(ex.loc.column);\n var msg =\n 'Syntax Error: ' + ex.message.replace(/ \\([0-9]+:[0-9]+\\)$/, '');\n this.error('SYNTAX_ERROR', msg);\n }\n },\n\n assertNestingCorrect: function(exp) {\n //this verifies that code is properly nested, but allows\n //invalid JavaScript such as the contents of `attributes`\n var res = characterParser(exp);\n if (res.isNesting()) {\n this.error(\n 'INCORRECT_NESTING',\n 'Nesting must match on expression `' + exp + '`'\n );\n }\n },\n\n /**\n * Construct a token with the given `type` and `val`.\n *\n * @param {String} type\n * @param {String} val\n * @return {Object}\n * @api private\n */\n\n tok: function(type, val) {\n var res = {\n type: type,\n loc: {\n start: {\n line: this.lineno,\n column: this.colno,\n },\n filename: this.filename,\n },\n };\n\n if (val !== undefined) res.val = val;\n\n return res;\n },\n\n /**\n * Set the token's `loc.end` value.\n *\n * @param {Object} tok\n * @returns {Object}\n * @api private\n */\n\n tokEnd: function(tok) {\n tok.loc.end = {\n line: this.lineno,\n column: this.colno,\n };\n return tok;\n },\n\n /**\n * Increment `this.lineno` and reset `this.colno`.\n *\n * @param {Number} increment\n * @api private\n */\n\n incrementLine: function(increment) {\n this.lineno += increment;\n if (increment) this.colno = 1;\n },\n\n /**\n * Increment `this.colno`.\n *\n * @param {Number} increment\n * @api private\n */\n\n incrementColumn: function(increment) {\n this.colno += increment;\n },\n\n /**\n * Consume the given `len` of input.\n *\n * @param {Number} len\n * @api private\n */\n\n consume: function(len) {\n this.input = this.input.substr(len);\n },\n\n /**\n * Scan for `type` with the given `regexp`.\n *\n * @param {String} type\n * @param {RegExp} regexp\n * @return {Object}\n * @api private\n */\n\n scan: function(regexp, type) {\n var captures;\n if ((captures = regexp.exec(this.input))) {\n var len = captures[0].length;\n var val = captures[1];\n var diff = len - (val ? val.length : 0);\n var tok = this.tok(type, val);\n this.consume(len);\n this.incrementColumn(diff);\n return tok;\n }\n },\n scanEndOfLine: function(regexp, type) {\n var captures;\n if ((captures = regexp.exec(this.input))) {\n var whitespaceLength = 0;\n var whitespace;\n var tok;\n if ((whitespace = /^([ ]+)([^ ]*)/.exec(captures[0]))) {\n whitespaceLength = whitespace[1].length;\n this.incrementColumn(whitespaceLength);\n }\n var newInput = this.input.substr(captures[0].length);\n if (newInput[0] === ':') {\n this.input = newInput;\n tok = this.tok(type, captures[1]);\n this.incrementColumn(captures[0].length - whitespaceLength);\n return tok;\n }\n if (/^[ \\t]*(\\n|$)/.test(newInput)) {\n this.input = newInput.substr(/^[ \\t]*/.exec(newInput)[0].length);\n tok = this.tok(type, captures[1]);\n this.incrementColumn(captures[0].length - whitespaceLength);\n return tok;\n }\n }\n },\n\n /**\n * Return the indexOf `(` or `{` or `[` / `)` or `}` or `]` delimiters.\n *\n * Make sure that when calling this function, colno is at the character\n * immediately before the beginning.\n *\n * @return {Number}\n * @api private\n */\n\n bracketExpression: function(skip) {\n skip = skip || 0;\n var start = this.input[skip];\n assert(\n start === '(' || start === '{' || start === '[',\n 'The start character should be \"(\", \"{\" or \"[\"'\n );\n var end = characterParser.BRACKETS[start];\n var range;\n try {\n range = characterParser.parseUntil(this.input, end, {start: skip + 1});\n } catch (ex) {\n if (ex.index !== undefined) {\n var idx = ex.index;\n // starting from this.input[skip]\n var tmp = this.input.substr(skip).indexOf('\\n');\n // starting from this.input[0]\n var nextNewline = tmp + skip;\n var ptr = 0;\n while (idx > nextNewline && tmp !== -1) {\n this.incrementLine(1);\n idx -= nextNewline + 1;\n ptr += nextNewline + 1;\n tmp = nextNewline = this.input.substr(ptr).indexOf('\\n');\n }\n\n this.incrementColumn(idx);\n }\n if (ex.code === 'CHARACTER_PARSER:END_OF_STRING_REACHED') {\n this.error(\n 'NO_END_BRACKET',\n 'The end of the string reached with no closing bracket ' +\n end +\n ' found.'\n );\n } else if (ex.code === 'CHARACTER_PARSER:MISMATCHED_BRACKET') {\n this.error('BRACKET_MISMATCH', ex.message);\n }\n throw ex;\n }\n return range;\n },\n\n scanIndentation: function() {\n var captures, re;\n\n // established regexp\n if (this.indentRe) {\n captures = this.indentRe.exec(this.input);\n // determine regexp\n } else {\n // tabs\n re = /^\\n(\\t*) */;\n captures = re.exec(this.input);\n\n // spaces\n if (captures && !captures[1].length) {\n re = /^\\n( *)/;\n captures = re.exec(this.input);\n }\n\n // established\n if (captures && captures[1].length) this.indentRe = re;\n }\n\n return captures;\n },\n\n /**\n * end-of-source.\n */\n\n eos: function() {\n if (this.input.length) return;\n if (this.interpolated) {\n this.error(\n 'NO_END_BRACKET',\n 'End of line was reached with no closing bracket for interpolation.'\n );\n }\n for (var i = 0; this.indentStack[i]; i++) {\n this.tokens.push(this.tokEnd(this.tok('outdent')));\n }\n this.tokens.push(this.tokEnd(this.tok('eos')));\n this.ended = true;\n return true;\n },\n\n /**\n * Blank line.\n */\n\n blank: function() {\n var captures;\n if ((captures = /^\\n[ \\t]*\\n/.exec(this.input))) {\n this.consume(captures[0].length - 1);\n this.incrementLine(1);\n return true;\n }\n },\n\n /**\n * Comment.\n */\n\n comment: function() {\n var captures;\n if ((captures = /^\\/\\/(-)?([^\\n]*)/.exec(this.input))) {\n this.consume(captures[0].length);\n var tok = this.tok('comment', captures[2]);\n tok.buffer = '-' != captures[1];\n this.interpolationAllowed = tok.buffer;\n this.tokens.push(tok);\n this.incrementColumn(captures[0].length);\n this.tokEnd(tok);\n this.callLexerFunction('pipelessText');\n return true;\n }\n },\n\n /**\n * Interpolated tag.\n */\n\n interpolation: function() {\n if (/^#\\{/.test(this.input)) {\n var match = this.bracketExpression(1);\n this.consume(match.end + 1);\n var tok = this.tok('interpolation', match.src);\n this.tokens.push(tok);\n this.incrementColumn(2); // '#{'\n this.assertExpression(match.src);\n\n var splitted = match.src.split('\\n');\n var lines = splitted.length - 1;\n this.incrementLine(lines);\n this.incrementColumn(splitted[lines].length + 1); // + 1 \u2192 '}'\n this.tokEnd(tok);\n return true;\n }\n },\n\n /**\n * Tag.\n */\n\n tag: function() {\n var captures;\n\n if ((captures = /^(\\w(?:[-:\\w]*\\w)?)/.exec(this.input))) {\n var tok,\n name = captures[1],\n len = captures[0].length;\n this.consume(len);\n tok = this.tok('tag', name);\n this.tokens.push(tok);\n this.incrementColumn(len);\n this.tokEnd(tok);\n return true;\n }\n },\n\n /**\n * Filter.\n */\n\n filter: function(opts) {\n var tok = this.scan(/^:([\\w\\-]+)/, 'filter');\n var inInclude = opts && opts.inInclude;\n if (tok) {\n this.tokens.push(tok);\n this.incrementColumn(tok.val.length);\n this.tokEnd(tok);\n this.callLexerFunction('attrs');\n if (!inInclude) {\n this.interpolationAllowed = false;\n this.callLexerFunction('pipelessText');\n }\n return true;\n }\n },\n\n /**\n * Doctype.\n */\n\n doctype: function() {\n var node = this.scanEndOfLine(/^doctype *([^\\n]*)/, 'doctype');\n if (node) {\n this.tokens.push(this.tokEnd(node));\n return true;\n }\n },\n\n /**\n * Id.\n */\n\n id: function() {\n var tok = this.scan(/^#([\\w-]+)/, 'id');\n if (tok) {\n this.tokens.push(tok);\n this.incrementColumn(tok.val.length);\n this.tokEnd(tok);\n return true;\n }\n if (/^#/.test(this.input)) {\n this.error(\n 'INVALID_ID',\n '\"' +\n /.[^ \\t\\(\\#\\.\\:]*/.exec(this.input.substr(1))[0] +\n '\" is not a valid ID.'\n );\n }\n },\n\n /**\n * Class.\n */\n\n className: function() {\n var tok = this.scan(/^\\.([_a-z0-9\\-]*[_a-z][_a-z0-9\\-]*)/i, 'class');\n if (tok) {\n this.tokens.push(tok);\n this.incrementColumn(tok.val.length);\n this.tokEnd(tok);\n return true;\n }\n if (/^\\.[_a-z0-9\\-]+/i.test(this.input)) {\n this.error(\n 'INVALID_CLASS_NAME',\n 'Class names must contain at least one letter or underscore.'\n );\n }\n if (/^\\./.test(this.input)) {\n this.error(\n 'INVALID_CLASS_NAME',\n '\"' +\n /.[^ \\t\\(\\#\\.\\:]*/.exec(this.input.substr(1))[0] +\n '\" is not a valid class name. Class names can only contain \"_\", \"-\", a-z and 0-9, and must contain at least one of \"_\", or a-z'\n );\n }\n },\n\n /**\n * Text.\n */\n endInterpolation: function() {\n if (this.interpolated && this.input[0] === ']') {\n this.input = this.input.substr(1);\n this.ended = true;\n return true;\n }\n },\n addText: function(type, value, prefix, escaped) {\n var tok;\n if (value + prefix === '') return;\n prefix = prefix || '';\n escaped = escaped || 0;\n var indexOfEnd = this.interpolated ? value.indexOf(']') : -1;\n var indexOfStart = this.interpolationAllowed ? value.indexOf('#[') : -1;\n var indexOfEscaped = this.interpolationAllowed ? value.indexOf('\\\\#[') : -1;\n var matchOfStringInterp = /(\\\\)?([#!]){((?:.|\\n)*)$/.exec(value);\n var indexOfStringInterp =\n this.interpolationAllowed && matchOfStringInterp\n ? matchOfStringInterp.index\n : Infinity;\n\n if (indexOfEnd === -1) indexOfEnd = Infinity;\n if (indexOfStart === -1) indexOfStart = Infinity;\n if (indexOfEscaped === -1) indexOfEscaped = Infinity;\n\n if (\n indexOfEscaped !== Infinity &&\n indexOfEscaped < indexOfEnd &&\n indexOfEscaped < indexOfStart &&\n indexOfEscaped < indexOfStringInterp\n ) {\n prefix = prefix + value.substring(0, indexOfEscaped) + '#[';\n return this.addText(\n type,\n value.substring(indexOfEscaped + 3),\n prefix,\n escaped + 1\n );\n }\n if (\n indexOfStart !== Infinity &&\n indexOfStart < indexOfEnd &&\n indexOfStart < indexOfEscaped &&\n indexOfStart < indexOfStringInterp\n ) {\n tok = this.tok(type, prefix + value.substring(0, indexOfStart));\n this.incrementColumn(prefix.length + indexOfStart + escaped);\n this.tokens.push(this.tokEnd(tok));\n tok = this.tok('start-pug-interpolation');\n this.incrementColumn(2);\n this.tokens.push(this.tokEnd(tok));\n var child = new this.constructor(value.substr(indexOfStart + 2), {\n filename: this.filename,\n interpolated: true,\n startingLine: this.lineno,\n startingColumn: this.colno,\n plugins: this.plugins,\n });\n var interpolated;\n try {\n interpolated = child.getTokens();\n } catch (ex) {\n if (ex.code && /^PUG:/.test(ex.code)) {\n this.colno = ex.column;\n this.error(ex.code.substr(4), ex.msg);\n }\n throw ex;\n }\n this.colno = child.colno;\n this.tokens = this.tokens.concat(interpolated);\n tok = this.tok('end-pug-interpolation');\n this.incrementColumn(1);\n this.tokens.push(this.tokEnd(tok));\n this.addText(type, child.input);\n return;\n }\n if (\n indexOfEnd !== Infinity &&\n indexOfEnd < indexOfStart &&\n indexOfEnd < indexOfEscaped &&\n indexOfEnd < indexOfStringInterp\n ) {\n if (prefix + value.substring(0, indexOfEnd)) {\n this.addText(type, value.substring(0, indexOfEnd), prefix);\n }\n this.ended = true;\n this.input = value.substr(value.indexOf(']') + 1) + this.input;\n return;\n }\n if (indexOfStringInterp !== Infinity) {\n if (matchOfStringInterp[1]) {\n prefix =\n prefix +\n value.substring(0, indexOfStringInterp) +\n matchOfStringInterp[2] +\n '{';\n return this.addText(\n type,\n value.substring(indexOfStringInterp + 3),\n prefix,\n escaped + 1\n );\n }\n var before = value.substr(0, indexOfStringInterp);\n if (prefix || before) {\n before = prefix + before;\n tok = this.tok(type, before);\n this.incrementColumn(before.length + escaped);\n this.tokens.push(this.tokEnd(tok));\n }\n\n var rest = matchOfStringInterp[3];\n var range;\n tok = this.tok('interpolated-code');\n this.incrementColumn(2);\n try {\n range = characterParser.parseUntil(rest, '}');\n } catch (ex) {\n if (ex.index !== undefined) {\n this.incrementColumn(ex.index);\n }\n if (ex.code === 'CHARACTER_PARSER:END_OF_STRING_REACHED') {\n this.error(\n 'NO_END_BRACKET',\n 'End of line was reached with no closing bracket for interpolation.'\n );\n } else if (ex.code === 'CHARACTER_PARSER:MISMATCHED_BRACKET') {\n this.error('BRACKET_MISMATCH', ex.message);\n } else {\n throw ex;\n }\n }\n tok.mustEscape = matchOfStringInterp[2] === '#';\n tok.buffer = true;\n tok.val = range.src;\n this.assertExpression(range.src);\n\n if (range.end + 1 < rest.length) {\n rest = rest.substr(range.end + 1);\n this.incrementColumn(range.end + 1);\n this.tokens.push(this.tokEnd(tok));\n this.addText(type, rest);\n } else {\n this.incrementColumn(rest.length);\n this.tokens.push(this.tokEnd(tok));\n }\n return;\n }\n\n value = prefix + value;\n tok = this.tok(type, value);\n this.incrementColumn(value.length + escaped);\n this.tokens.push(this.tokEnd(tok));\n },\n\n text: function() {\n var tok =\n this.scan(/^(?:\\| ?| )([^\\n]+)/, 'text') ||\n this.scan(/^( )/, 'text') ||\n this.scan(/^\\|( ?)/, 'text');\n if (tok) {\n this.addText('text', tok.val);\n return true;\n }\n },\n\n textHtml: function() {\n var tok = this.scan(/^(<[^\\n]*)/, 'text-html');\n if (tok) {\n this.addText('text-html', tok.val);\n return true;\n }\n },\n\n /**\n * Dot.\n */\n\n dot: function() {\n var tok;\n if ((tok = this.scanEndOfLine(/^\\./, 'dot'))) {\n this.tokens.push(this.tokEnd(tok));\n this.callLexerFunction('pipelessText');\n return true;\n }\n },\n\n /**\n * Extends.\n */\n\n extends: function() {\n var tok = this.scan(/^extends?(?= |$|\\n)/, 'extends');\n if (tok) {\n this.tokens.push(this.tokEnd(tok));\n if (!this.callLexerFunction('path')) {\n this.error('NO_EXTENDS_PATH', 'missing path for extends');\n }\n return true;\n }\n if (this.scan(/^extends?\\b/)) {\n this.error('MALFORMED_EXTENDS', 'malformed extends');\n }\n },\n\n /**\n * Block prepend.\n */\n\n prepend: function() {\n var captures;\n if ((captures = /^(?:block +)?prepend +([^\\n]+)/.exec(this.input))) {\n var name = captures[1].trim();\n var comment = '';\n if (name.indexOf('//') !== -1) {\n comment =\n '//' +\n name\n .split('//')\n .slice(1)\n .join('//');\n name = name.split('//')[0].trim();\n }\n if (!name) return;\n var tok = this.tok('block', name);\n var len = captures[0].length - comment.length;\n while (this.whitespaceRe.test(this.input.charAt(len - 1))) len--;\n this.incrementColumn(len);\n tok.mode = 'prepend';\n this.tokens.push(this.tokEnd(tok));\n this.consume(captures[0].length - comment.length);\n this.incrementColumn(captures[0].length - comment.length - len);\n return true;\n }\n },\n\n /**\n * Block append.\n */\n\n append: function() {\n var captures;\n if ((captures = /^(?:block +)?append +([^\\n]+)/.exec(this.input))) {\n var name = captures[1].trim();\n var comment = '';\n if (name.indexOf('//') !== -1) {\n comment =\n '//' +\n name\n .split('//')\n .slice(1)\n .join('//');\n name = name.split('//')[0].trim();\n }\n if (!name) return;\n var tok = this.tok('block', name);\n var len = captures[0].length - comment.length;\n while (this.whitespaceRe.test(this.input.charAt(len - 1))) len--;\n this.incrementColumn(len);\n tok.mode = 'append';\n this.tokens.push(this.tokEnd(tok));\n this.consume(captures[0].length - comment.length);\n this.incrementColumn(captures[0].length - comment.length - len);\n return true;\n }\n },\n\n /**\n * Block.\n */\n\n block: function() {\n var captures;\n if ((captures = /^block +([^\\n]+)/.exec(this.input))) {\n var name = captures[1].trim();\n var comment = '';\n if (name.indexOf('//') !== -1) {\n comment =\n '//' +\n name\n .split('//')\n .slice(1)\n .join('//');\n name = name.split('//')[0].trim();\n }\n if (!name) return;\n var tok = this.tok('block', name);\n var len = captures[0].length - comment.length;\n while (this.whitespaceRe.test(this.input.charAt(len - 1))) len--;\n this.incrementColumn(len);\n tok.mode = 'replace';\n this.tokens.push(this.tokEnd(tok));\n this.consume(captures[0].length - comment.length);\n this.incrementColumn(captures[0].length - comment.length - len);\n return true;\n }\n },\n\n /**\n * Mixin Block.\n */\n\n mixinBlock: function() {\n var tok;\n if ((tok = this.scanEndOfLine(/^block/, 'mixin-block'))) {\n this.tokens.push(this.tokEnd(tok));\n return true;\n }\n },\n\n /**\n * Yield.\n */\n\n yield: function() {\n var tok = this.scanEndOfLine(/^yield/, 'yield');\n if (tok) {\n this.tokens.push(this.tokEnd(tok));\n return true;\n }\n },\n\n /**\n * Include.\n */\n\n include: function() {\n var tok = this.scan(/^include(?=:| |$|\\n)/, 'include');\n if (tok) {\n this.tokens.push(this.tokEnd(tok));\n while (this.callLexerFunction('filter', {inInclude: true}));\n if (!this.callLexerFunction('path')) {\n if (/^[^ \\n]+/.test(this.input)) {\n // if there is more text\n this.fail();\n } else {\n // if not\n this.error('NO_INCLUDE_PATH', 'missing path for include');\n }\n }\n return true;\n }\n if (this.scan(/^include\\b/)) {\n this.error('MALFORMED_INCLUDE', 'malformed include');\n }\n },\n\n /**\n * Path\n */\n\n path: function() {\n var tok = this.scanEndOfLine(/^ ([^\\n]+)/, 'path');\n if (tok && (tok.val = tok.val.trim())) {\n this.tokens.push(this.tokEnd(tok));\n return true;\n }\n },\n\n /**\n * Case.\n */\n\n case: function() {\n var tok = this.scanEndOfLine(/^case +([^\\n]+)/, 'case');\n if (tok) {\n this.incrementColumn(-tok.val.length);\n this.assertExpression(tok.val);\n this.incrementColumn(tok.val.length);\n this.tokens.push(this.tokEnd(tok));\n return true;\n }\n if (this.scan(/^case\\b/)) {\n this.error('NO_CASE_EXPRESSION', 'missing expression for case');\n }\n },\n\n /**\n * When.\n */\n\n when: function() {\n var tok = this.scanEndOfLine(/^when +([^:\\n]+)/, 'when');\n if (tok) {\n var parser = characterParser(tok.val);\n while (parser.isNesting() || parser.isString()) {\n var rest = /:([^:\\n]+)/.exec(this.input);\n if (!rest) break;\n\n tok.val += rest[0];\n this.consume(rest[0].length);\n this.incrementColumn(rest[0].length);\n parser = characterParser(tok.val);\n }\n\n this.incrementColumn(-tok.val.length);\n this.assertExpression(tok.val);\n this.incrementColumn(tok.val.length);\n this.tokens.push(this.tokEnd(tok));\n return true;\n }\n if (this.scan(/^when\\b/)) {\n this.error('NO_WHEN_EXPRESSION', 'missing expression for when');\n }\n },\n\n /**\n * Default.\n */\n\n default: function() {\n var tok = this.scanEndOfLine(/^default/, 'default');\n if (tok) {\n this.tokens.push(this.tokEnd(tok));\n return true;\n }\n if (this.scan(/^default\\b/)) {\n this.error(\n 'DEFAULT_WITH_EXPRESSION',\n 'default should not have an expression'\n );\n }\n },\n\n /**\n * Call mixin.\n */\n\n call: function() {\n var tok, captures, increment;\n if ((captures = /^\\+(\\s*)(([-\\w]+)|(#\\{))/.exec(this.input))) {\n // try to consume simple or interpolated call\n if (captures[3]) {\n // simple call\n increment = captures[0].length;\n this.consume(increment);\n tok = this.tok('call', captures[3]);\n } else {\n // interpolated call\n var match = this.bracketExpression(2 + captures[1].length);\n increment = match.end + 1;\n this.consume(increment);\n this.assertExpression(match.src);\n tok = this.tok('call', '#{' + match.src + '}');\n }\n\n this.incrementColumn(increment);\n\n tok.args = null;\n // Check for args (not attributes)\n if ((captures = /^ *\\(/.exec(this.input))) {\n var range = this.bracketExpression(captures[0].length - 1);\n if (!/^\\s*[-\\w]+ *=/.test(range.src)) {\n // not attributes\n this.incrementColumn(1);\n this.consume(range.end + 1);\n tok.args = range.src;\n this.assertExpression('[' + tok.args + ']');\n for (var i = 0; i <= tok.args.length; i++) {\n if (tok.args[i] === '\\n') {\n this.incrementLine(1);\n } else {\n this.incrementColumn(1);\n }\n }\n }\n }\n this.tokens.push(this.tokEnd(tok));\n return true;\n }\n },\n\n /**\n * Mixin.\n */\n\n mixin: function() {\n var captures;\n if ((captures = /^mixin +([-\\w]+)(?: *\\((.*)\\))? */.exec(this.input))) {\n this.consume(captures[0].length);\n var tok = this.tok('mixin', captures[1]);\n tok.args = captures[2] || null;\n this.incrementColumn(captures[0].length);\n this.tokens.push(this.tokEnd(tok));\n return true;\n }\n },\n\n /**\n * Conditional.\n */\n\n conditional: function() {\n var captures;\n if ((captures = /^(if|unless|else if|else)\\b([^\\n]*)/.exec(this.input))) {\n this.consume(captures[0].length);\n var type = captures[1].replace(/ /g, '-');\n var js = captures[2] && captures[2].trim();\n // type can be \"if\", \"else-if\" and \"else\"\n var tok = this.tok(type, js);\n this.incrementColumn(captures[0].length - js.length);\n\n switch (type) {\n case 'if':\n case 'else-if':\n this.assertExpression(js);\n break;\n case 'unless':\n this.assertExpression(js);\n tok.val = '!(' + js + ')';\n tok.type = 'if';\n break;\n case 'else':\n if (js) {\n this.error(\n 'ELSE_CONDITION',\n '`else` cannot have a condition, perhaps you meant `else if`'\n );\n }\n break;\n }\n this.incrementColumn(js.length);\n this.tokens.push(this.tokEnd(tok));\n return true;\n }\n },\n\n /**\n * While.\n */\n\n while: function() {\n var captures, tok;\n if ((captures = /^while +([^\\n]+)/.exec(this.input))) {\n this.consume(captures[0].length);\n this.assertExpression(captures[1]);\n tok = this.tok('while', captures[1]);\n this.incrementColumn(captures[0].length);\n this.tokens.push(this.tokEnd(tok));\n return true;\n }\n if (this.scan(/^while\\b/)) {\n this.error('NO_WHILE_EXPRESSION', 'missing expression for while');\n }\n },\n\n /**\n * Each.\n */\n\n each: function() {\n var captures;\n if (\n (captures = /^(?:each|for) +([a-zA-Z_$][\\w$]*)(?: *, *([a-zA-Z_$][\\w$]*))? * in *([^\\n]+)/.exec(\n this.input\n ))\n ) {\n this.consume(captures[0].length);\n var tok = this.tok('each', captures[1]);\n tok.key = captures[2] || null;\n this.incrementColumn(captures[0].length - captures[3].length);\n this.assertExpression(captures[3]);\n tok.code = captures[3];\n this.incrementColumn(captures[3].length);\n this.tokens.push(this.tokEnd(tok));\n return true;\n }\n const name = /^each\\b/.exec(this.input) ? 'each' : 'for';\n if (this.scan(/^(?:each|for)\\b/)) {\n this.error(\n 'MALFORMED_EACH',\n 'This `' +\n name +\n '` has a syntax error. `' +\n name +\n '` statements should be of the form: `' +\n name +\n ' VARIABLE_NAME of JS_EXPRESSION`'\n );\n }\n if (\n (captures = /^- *(?:each|for) +([a-zA-Z_$][\\w$]*)(?: *, *([a-zA-Z_$][\\w$]*))? +in +([^\\n]+)/.exec(\n this.input\n ))\n ) {\n this.error(\n 'MALFORMED_EACH',\n 'Pug each and for should no longer be prefixed with a dash (\"-\"). They are pug keywords and not part of JavaScript.'\n );\n }\n },\n\n /**\n * EachOf.\n */\n\n eachOf: function() {\n var captures;\n if ((captures = /^(?:each|for) (.*?) of *([^\\n]+)/.exec(this.input))) {\n this.consume(captures[0].length);\n var tok = this.tok('eachOf', captures[1]);\n tok.value = captures[1];\n this.incrementColumn(captures[0].length - captures[2].length);\n this.assertExpression(captures[2]);\n tok.code = captures[2];\n this.incrementColumn(captures[2].length);\n this.tokens.push(this.tokEnd(tok));\n\n if (\n !(\n /^[a-zA-Z_$][\\w$]*$/.test(tok.value.trim()) ||\n /^\\[ *[a-zA-Z_$][\\w$]* *\\, *[a-zA-Z_$][\\w$]* *\\]$/.test(\n tok.value.trim()\n )\n )\n ) {\n this.error(\n 'MALFORMED_EACH_OF_LVAL',\n 'The value variable for each must either be a valid identifier (e.g. `item`) or a pair of identifiers in square brackets (e.g. `[key, value]`).'\n );\n }\n\n return true;\n }\n if (\n (captures = /^- *(?:each|for) +([a-zA-Z_$][\\w$]*)(?: *, *([a-zA-Z_$][\\w$]*))? +of +([^\\n]+)/.exec(\n this.input\n ))\n ) {\n this.error(\n 'MALFORMED_EACH',\n 'Pug each and for should not be prefixed with a dash (\"-\"). They are pug keywords and not part of JavaScript.'\n );\n }\n },\n\n /**\n * Code.\n */\n\n code: function() {\n var captures;\n if ((captures = /^(!?=|-)[ \\t]*([^\\n]+)/.exec(this.input))) {\n var flags = captures[1];\n var code = captures[2];\n var shortened = 0;\n if (this.interpolated) {\n var parsed;\n try {\n parsed = characterParser.parseUntil(code, ']');\n } catch (err) {\n if (err.index !== undefined) {\n this.incrementColumn(captures[0].length - code.length + err.index);\n }\n if (err.code === 'CHARACTER_PARSER:END_OF_STRING_REACHED') {\n this.error(\n 'NO_END_BRACKET',\n 'End of line was reached with no closing bracket for interpolation.'\n );\n } else if (err.code === 'CHARACTER_PARSER:MISMATCHED_BRACKET') {\n this.error('BRACKET_MISMATCH', err.message);\n } else {\n throw err;\n }\n }\n shortened = code.length - parsed.end;\n code = parsed.src;\n }\n var consumed = captures[0].length - shortened;\n this.consume(consumed);\n var tok = this.tok('code', code);\n tok.mustEscape = flags.charAt(0) === '=';\n tok.buffer = flags.charAt(0) === '=' || flags.charAt(1) === '=';\n\n // p #[!= abc] hey\n // ^ original colno\n // -------------- captures[0]\n // -------- captures[2]\n // ------ captures[0] - captures[2]\n // ^ after colno\n\n // = abc\n // ^ original colno\n // ------- captures[0]\n // --- captures[2]\n // ---- captures[0] - captures[2]\n // ^ after colno\n this.incrementColumn(captures[0].length - captures[2].length);\n if (tok.buffer) this.assertExpression(code);\n this.tokens.push(tok);\n\n // p #[!= abc] hey\n // ^ original colno\n // ----- shortened\n // --- code\n // ^ after colno\n\n // = abc\n // ^ original colno\n // shortened\n // --- code\n // ^ after colno\n this.incrementColumn(code.length);\n this.tokEnd(tok);\n return true;\n }\n },\n\n /**\n * Block code.\n */\n blockCode: function() {\n var tok;\n if ((tok = this.scanEndOfLine(/^-/, 'blockcode'))) {\n this.tokens.push(this.tokEnd(tok));\n this.interpolationAllowed = false;\n this.callLexerFunction('pipelessText');\n return true;\n }\n },\n\n /**\n * Attribute Name.\n */\n attribute: function(str) {\n var quote = '';\n var quoteRe = /['\"]/;\n var key = '';\n var i;\n\n // consume all whitespace before the key\n for (i = 0; i < str.length; i++) {\n if (!this.whitespaceRe.test(str[i])) break;\n if (str[i] === '\\n') {\n this.incrementLine(1);\n } else {\n this.incrementColumn(1);\n }\n }\n\n if (i === str.length) {\n return '';\n }\n\n var tok = this.tok('attribute');\n\n // quote?\n if (quoteRe.test(str[i])) {\n quote = str[i];\n this.incrementColumn(1);\n i++;\n }\n\n // start looping through the key\n for (; i < str.length; i++) {\n if (quote) {\n if (str[i] === quote) {\n this.incrementColumn(1);\n i++;\n break;\n }\n } else {\n if (\n this.whitespaceRe.test(str[i]) ||\n str[i] === '!' ||\n str[i] === '=' ||\n str[i] === ','\n ) {\n break;\n }\n }\n\n key += str[i];\n\n if (str[i] === '\\n') {\n this.incrementLine(1);\n } else {\n this.incrementColumn(1);\n }\n }\n\n tok.name = key;\n\n var valueResponse = this.attributeValue(str.substr(i));\n\n if (valueResponse.val) {\n tok.val = valueResponse.val;\n tok.mustEscape = valueResponse.mustEscape;\n } else {\n // was a boolean attribute (ex: `input(disabled)`)\n tok.val = true;\n tok.mustEscape = true;\n }\n\n str = valueResponse.remainingSource;\n\n this.tokens.push(this.tokEnd(tok));\n\n for (i = 0; i < str.length; i++) {\n if (!this.whitespaceRe.test(str[i])) {\n break;\n }\n if (str[i] === '\\n') {\n this.incrementLine(1);\n } else {\n this.incrementColumn(1);\n }\n }\n\n if (str[i] === ',') {\n this.incrementColumn(1);\n i++;\n }\n\n return str.substr(i);\n },\n\n /**\n * Attribute Value.\n */\n attributeValue: function(str) {\n var quoteRe = /['\"]/;\n var val = '';\n var done, i, x;\n var escapeAttr = true;\n var state = characterParser.defaultState();\n var col = this.colno;\n var line = this.lineno;\n\n // consume all whitespace before the equals sign\n for (i = 0; i < str.length; i++) {\n if (!this.whitespaceRe.test(str[i])) break;\n if (str[i] === '\\n') {\n line++;\n col = 1;\n } else {\n col++;\n }\n }\n\n if (i === str.length) {\n return {remainingSource: str};\n }\n\n if (str[i] === '!') {\n escapeAttr = false;\n col++;\n i++;\n if (str[i] !== '=')\n this.error(\n 'INVALID_KEY_CHARACTER',\n 'Unexpected character ' + str[i] + ' expected `=`'\n );\n }\n\n if (str[i] !== '=') {\n // check for anti-pattern `div(\"foo\"bar)`\n if (i === 0 && str && !this.whitespaceRe.test(str[0]) && str[0] !== ',') {\n this.error(\n 'INVALID_KEY_CHARACTER',\n 'Unexpected character ' + str[0] + ' expected `=`'\n );\n } else {\n return {remainingSource: str};\n }\n }\n\n this.lineno = line;\n this.colno = col + 1;\n i++;\n\n // consume all whitespace before the value\n for (; i < str.length; i++) {\n if (!this.whitespaceRe.test(str[i])) break;\n if (str[i] === '\\n') {\n this.incrementLine(1);\n } else {\n this.incrementColumn(1);\n }\n }\n\n line = this.lineno;\n col = this.colno;\n\n // start looping through the value\n for (; i < str.length; i++) {\n // if the character is in a string or in parentheses/brackets/braces\n if (!(state.isNesting() || state.isString())) {\n if (this.whitespaceRe.test(str[i])) {\n done = false;\n\n // find the first non-whitespace character\n for (x = i; x < str.length; x++) {\n if (!this.whitespaceRe.test(str[x])) {\n // if it is a JavaScript punctuator, then assume that it is\n // a part of the value\n const isNotPunctuator = !characterParser.isPunctuator(str[x]);\n const isQuote = quoteRe.test(str[x]);\n const isColon = str[x] === ':';\n const isSpreadOperator =\n str[x] + str[x + 1] + str[x + 2] === '...';\n if (\n (isNotPunctuator || isQuote || isColon || isSpreadOperator) &&\n this.assertExpression(val, true)\n ) {\n done = true;\n }\n break;\n }\n }\n\n // if everything else is whitespace, return now so last attribute\n // does not include trailing whitespace\n if (done || x === str.length) {\n break;\n }\n }\n\n // if there's no whitespace and the character is not ',', the\n // attribute did not end.\n if (str[i] === ',' && this.assertExpression(val, true)) {\n break;\n }\n }\n\n state = characterParser.parseChar(str[i], state);\n val += str[i];\n\n if (str[i] === '\\n') {\n line++;\n col = 1;\n } else {\n col++;\n }\n }\n\n this.assertExpression(val);\n\n this.lineno = line;\n this.colno = col;\n\n return {val: val, mustEscape: escapeAttr, remainingSource: str.substr(i)};\n },\n\n /**\n * Attributes.\n */\n\n attrs: function() {\n var tok;\n\n if ('(' == this.input.charAt(0)) {\n tok = this.tok('start-attributes');\n var index = this.bracketExpression().end;\n var str = this.input.substr(1, index - 1);\n\n this.incrementColumn(1);\n this.tokens.push(this.tokEnd(tok));\n this.assertNestingCorrect(str);\n this.consume(index + 1);\n\n while (str) {\n str = this.attribute(str);\n }\n\n tok = this.tok('end-attributes');\n this.incrementColumn(1);\n this.tokens.push(this.tokEnd(tok));\n return true;\n }\n },\n\n /**\n * &attributes block\n */\n attributesBlock: function() {\n if (/^&attributes\\b/.test(this.input)) {\n var consumed = 11;\n this.consume(consumed);\n var tok = this.tok('&attributes');\n this.incrementColumn(consumed);\n var args = this.bracketExpression();\n consumed = args.end + 1;\n this.consume(consumed);\n tok.val = args.src;\n this.incrementColumn(consumed);\n this.tokens.push(this.tokEnd(tok));\n return true;\n }\n },\n\n /**\n * Indent | Outdent | Newline.\n */\n\n indent: function() {\n var captures = this.scanIndentation();\n var tok;\n\n if (captures) {\n var indents = captures[1].length;\n\n this.incrementLine(1);\n this.consume(indents + 1);\n\n if (' ' == this.input[0] || '\\t' == this.input[0]) {\n this.error(\n 'INVALID_INDENTATION',\n 'Invalid indentation, you can use tabs or spaces but not both'\n );\n }\n\n // blank line\n if ('\\n' == this.input[0]) {\n this.interpolationAllowed = true;\n return this.tokEnd(this.tok('newline'));\n }\n\n // outdent\n if (indents < this.indentStack[0]) {\n var outdent_count = 0;\n while (this.indentStack[0] > indents) {\n if (this.indentStack[1] < indents) {\n this.error(\n 'INCONSISTENT_INDENTATION',\n 'Inconsistent indentation. Expecting either ' +\n this.indentStack[1] +\n ' or ' +\n this.indentStack[0] +\n ' spaces/tabs.'\n );\n }\n outdent_count++;\n this.indentStack.shift();\n }\n while (outdent_count--) {\n this.colno = 1;\n tok = this.tok('outdent');\n this.colno = this.indentStack[0] + 1;\n this.tokens.push(this.tokEnd(tok));\n }\n // indent\n } else if (indents && indents != this.indentStack[0]) {\n tok = this.tok('indent', indents);\n this.colno = 1 + indents;\n this.tokens.push(this.tokEnd(tok));\n this.indentStack.unshift(indents);\n // newline\n } else {\n tok = this.tok('newline');\n this.colno = 1 + Math.min(this.indentStack[0] || 0, indents);\n this.tokens.push(this.tokEnd(tok));\n }\n\n this.interpolationAllowed = true;\n return true;\n }\n },\n\n pipelessText: function pipelessText(indents) {\n while (this.callLexerFunction('blank'));\n\n var captures = this.scanIndentation();\n\n indents = indents || (captures && captures[1].length);\n if (indents > this.indentStack[0]) {\n this.tokens.push(this.tokEnd(this.tok('start-pipeless-text')));\n var tokens = [];\n var token_indent = [];\n var isMatch;\n // Index in this.input. Can't use this.consume because we might need to\n // retry lexing the block.\n var stringPtr = 0;\n do {\n // text has `\\n` as a prefix\n var i = this.input.substr(stringPtr + 1).indexOf('\\n');\n if (-1 == i) i = this.input.length - stringPtr - 1;\n var str = this.input.substr(stringPtr + 1, i);\n var lineCaptures = this.indentRe.exec('\\n' + str);\n var lineIndents = lineCaptures && lineCaptures[1].length;\n isMatch = lineIndents >= indents;\n token_indent.push(isMatch);\n isMatch = isMatch || !str.trim();\n if (isMatch) {\n // consume test along with `\\n` prefix if match\n stringPtr += str.length + 1;\n tokens.push(str.substr(indents));\n } else if (lineIndents > this.indentStack[0]) {\n // line is indented less than the first line but is still indented\n // need to retry lexing the text block\n this.tokens.pop();\n return pipelessText.call(this, lineCaptures[1].length);\n }\n } while (this.input.length - stringPtr && isMatch);\n this.consume(stringPtr);\n while (this.input.length === 0 && tokens[tokens.length - 1] === '')\n tokens.pop();\n tokens.forEach(\n function(token, i) {\n var tok;\n this.incrementLine(1);\n if (i !== 0) tok = this.tok('newline');\n if (token_indent[i]) this.incrementColumn(indents);\n if (tok) this.tokens.push(this.tokEnd(tok));\n this.addText('text', token);\n }.bind(this)\n );\n this.tokens.push(this.tokEnd(this.tok('end-pipeless-text')));\n return true;\n }\n },\n\n /**\n * Slash.\n */\n\n slash: function() {\n var tok = this.scan(/^\\//, 'slash');\n if (tok) {\n this.tokens.push(this.tokEnd(tok));\n return true;\n }\n },\n\n /**\n * ':'\n */\n\n colon: function() {\n var tok = this.scan(/^: +/, ':');\n if (tok) {\n this.tokens.push(this.tokEnd(tok));\n return true;\n }\n },\n\n fail: function() {\n this.error(\n 'UNEXPECTED_TEXT',\n 'unexpected text \"' + this.input.substr(0, 5) + '\"'\n );\n },\n\n callLexerFunction: function(func) {\n var rest = [];\n for (var i = 1; i < arguments.length; i++) {\n rest.push(arguments[i]);\n }\n var pluginArgs = [this].concat(rest);\n for (var i = 0; i < this.plugins.length; i++) {\n var plugin = this.plugins[i];\n if (plugin[func] && plugin[func].apply(plugin, pluginArgs)) {\n return true;\n }\n }\n return this[func].apply(this, rest);\n },\n\n /**\n * Move to the next token\n *\n * @api private\n */\n\n advance: function() {\n return (\n this.callLexerFunction('blank') ||\n this.callLexerFunction('eos') ||\n this.callLexerFunction('endInterpolation') ||\n this.callLexerFunction('yield') ||\n this.callLexerFunction('doctype') ||\n this.callLexerFunction('interpolation') ||\n this.callLexerFunction('case') ||\n this.callLexerFunction('when') ||\n this.callLexerFunction('default') ||\n this.callLexerFunction('extends') ||\n this.callLexerFunction('append') ||\n this.callLexerFunction('prepend') ||\n this.callLexerFunction('block') ||\n this.callLexerFunction('mixinBlock') ||\n this.callLexerFunction('include') ||\n this.callLexerFunction('mixin') ||\n this.callLexerFunction('call') ||\n this.callLexerFunction('conditional') ||\n this.callLexerFunction('eachOf') ||\n this.callLexerFunction('each') ||\n this.callLexerFunction('while') ||\n this.callLexerFunction('tag') ||\n this.callLexerFunction('filter') ||\n this.callLexerFunction('blockCode') ||\n this.callLexerFunction('code') ||\n this.callLexerFunction('id') ||\n this.callLexerFunction('dot') ||\n this.callLexerFunction('className') ||\n this.callLexerFunction('attrs') ||\n this.callLexerFunction('attributesBlock') ||\n this.callLexerFunction('indent') ||\n this.callLexerFunction('text') ||\n this.callLexerFunction('textHtml') ||\n this.callLexerFunction('comment') ||\n this.callLexerFunction('slash') ||\n this.callLexerFunction('colon') ||\n this.fail()\n );\n },\n\n /**\n * Return an array of tokens for the current file\n *\n * @returns {Array.<Token>}\n * @api public\n */\n getTokens: function() {\n while (!this.ended) {\n this.callLexerFunction('advance');\n }\n return this.tokens;\n },\n};\n", "'use strict'\n\nvar own = {}.hasOwnProperty\n\nmodule.exports = stringify\n\nfunction stringify(value) {\n // Nothing.\n if (!value || typeof value !== 'object') {\n return ''\n }\n\n // Node.\n if (own.call(value, 'position') || own.call(value, 'type')) {\n return position(value.position)\n }\n\n // Position.\n if (own.call(value, 'start') || own.call(value, 'end')) {\n return position(value)\n }\n\n // Point.\n if (own.call(value, 'line') || own.call(value, 'column')) {\n return point(value)\n }\n\n // ?\n return ''\n}\n\nfunction point(point) {\n if (!point || typeof point !== 'object') {\n point = {}\n }\n\n return index(point.line) + ':' + index(point.column)\n}\n\nfunction position(pos) {\n if (!pos || typeof pos !== 'object') {\n pos = {}\n }\n\n return point(pos.start) + '-' + point(pos.end)\n}\n\nfunction index(value) {\n return value && typeof value === 'number' ? value : 1\n}\n", "'use strict'\n\nvar stringify = require('unist-util-stringify-position')\n\nmodule.exports = VMessage\n\n// Inherit from `Error#`.\nfunction VMessagePrototype() {}\nVMessagePrototype.prototype = Error.prototype\nVMessage.prototype = new VMessagePrototype()\n\n// Message properties.\nvar proto = VMessage.prototype\n\nproto.file = ''\nproto.name = ''\nproto.reason = ''\nproto.message = ''\nproto.stack = ''\nproto.fatal = null\nproto.column = null\nproto.line = null\n\n// Construct a new VMessage.\n//\n// Note: We cannot invoke `Error` on the created context, as that adds readonly\n// `line` and `column` attributes on Safari 9, thus throwing and failing the\n// data.\nfunction VMessage(reason, position, origin) {\n var parts\n var range\n var location\n\n if (typeof position === 'string') {\n origin = position\n position = null\n }\n\n parts = parseOrigin(origin)\n range = stringify(position) || '1:1'\n\n location = {\n start: {line: null, column: null},\n end: {line: null, column: null}\n }\n\n // Node.\n if (position && position.position) {\n position = position.position\n }\n\n if (position) {\n // Position.\n if (position.start) {\n location = position\n position = position.start\n } else {\n // Point.\n location.start = position\n }\n }\n\n if (reason.stack) {\n this.stack = reason.stack\n reason = reason.message\n }\n\n this.message = reason\n this.name = range\n this.reason = reason\n this.line = position ? position.line : null\n this.column = position ? position.column : null\n this.location = location\n this.source = parts[0]\n this.ruleId = parts[1]\n}\n\nfunction parseOrigin(origin) {\n var result = [null, null]\n var index\n\n if (typeof origin === 'string') {\n index = origin.indexOf(':')\n\n if (index === -1) {\n result[1] = origin\n } else {\n result[0] = origin.slice(0, index)\n result[1] = origin.slice(index + 1)\n }\n }\n\n return result\n}\n", "'use strict';\n\nvar path = require('path');\n\nfunction replaceExt(npath, ext) {\n if (typeof npath !== 'string') {\n return npath;\n }\n\n if (npath.length === 0) {\n return npath;\n }\n\n var nFileName = path.basename(npath, path.extname(npath)) + ext;\n return path.join(path.dirname(npath), nFileName);\n}\n\nmodule.exports = replaceExt;\n", "/*!\n * Determine if an object is a Buffer\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n\nmodule.exports = function isBuffer (obj) {\n return obj != null && obj.constructor != null &&\n typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n", "'use strict'\n\nvar path = require('path')\nvar replace = require('replace-ext')\nvar buffer = require('is-buffer')\n\nmodule.exports = VFile\n\nvar own = {}.hasOwnProperty\nvar proto = VFile.prototype\n\n// Order of setting (least specific to most), we need this because otherwise\n// `{stem: 'a', path: '~/b.js'}` would throw, as a path is needed before a\n// stem can be set.\nvar order = ['history', 'path', 'basename', 'stem', 'extname', 'dirname']\n\nproto.toString = toString\n\n// Access full path (`~/index.min.js`).\nObject.defineProperty(proto, 'path', {get: getPath, set: setPath})\n\n// Access parent path (`~`).\nObject.defineProperty(proto, 'dirname', {get: getDirname, set: setDirname})\n\n// Access basename (`index.min.js`).\nObject.defineProperty(proto, 'basename', {get: getBasename, set: setBasename})\n\n// Access extname (`.js`).\nObject.defineProperty(proto, 'extname', {get: getExtname, set: setExtname})\n\n// Access stem (`index.min`).\nObject.defineProperty(proto, 'stem', {get: getStem, set: setStem})\n\n// Construct a new file.\nfunction VFile(options) {\n var prop\n var index\n var length\n\n if (!options) {\n options = {}\n } else if (typeof options === 'string' || buffer(options)) {\n options = {contents: options}\n } else if ('message' in options && 'messages' in options) {\n return options\n }\n\n if (!(this instanceof VFile)) {\n return new VFile(options)\n }\n\n this.data = {}\n this.messages = []\n this.history = []\n this.cwd = process.cwd()\n\n // Set path related properties in the correct order.\n index = -1\n length = order.length\n\n while (++index < length) {\n prop = order[index]\n\n if (own.call(options, prop)) {\n this[prop] = options[prop]\n }\n }\n\n // Set non-path related properties.\n for (prop in options) {\n if (order.indexOf(prop) === -1) {\n this[prop] = options[prop]\n }\n }\n}\n\nfunction getPath() {\n return this.history[this.history.length - 1]\n}\n\nfunction setPath(path) {\n assertNonEmpty(path, 'path')\n\n if (path !== this.path) {\n this.history.push(path)\n }\n}\n\nfunction getDirname() {\n return typeof this.path === 'string' ? path.dirname(this.path) : undefined\n}\n\nfunction setDirname(dirname) {\n assertPath(this.path, 'dirname')\n this.path = path.join(dirname || '', this.basename)\n}\n\nfunction getBasename() {\n return typeof this.path === 'string' ? path.basename(this.path) : undefined\n}\n\nfunction setBasename(basename) {\n assertNonEmpty(basename, 'basename')\n assertPart(basename, 'basename')\n this.path = path.join(this.dirname || '', basename)\n}\n\nfunction getExtname() {\n return typeof this.path === 'string' ? path.extname(this.path) : undefined\n}\n\nfunction setExtname(extname) {\n var ext = extname || ''\n\n assertPart(ext, 'extname')\n assertPath(this.path, 'extname')\n\n if (ext) {\n if (ext.charAt(0) !== '.') {\n throw new Error('`extname` must start with `.`')\n }\n\n if (ext.indexOf('.', 1) !== -1) {\n throw new Error('`extname` cannot contain multiple dots')\n }\n }\n\n this.path = replace(this.path, ext)\n}\n\nfunction getStem() {\n return typeof this.path === 'string'\n ? path.basename(this.path, this.extname)\n : undefined\n}\n\nfunction setStem(stem) {\n assertNonEmpty(stem, 'stem')\n assertPart(stem, 'stem')\n this.path = path.join(this.dirname || '', stem + (this.extname || ''))\n}\n\n// Get the value of the file.\nfunction toString(encoding) {\n var value = this.contents || ''\n return buffer(value) ? value.toString(encoding) : String(value)\n}\n\n// Assert that `part` is not a path (i.e., does not contain `path.sep`).\nfunction assertPart(part, name) {\n if (part.indexOf(path.sep) !== -1) {\n throw new Error(\n '`' + name + '` cannot be a path: did not expect `' + path.sep + '`'\n )\n }\n}\n\n// Assert that `part` is not empty.\nfunction assertNonEmpty(part, name) {\n if (!part) {\n throw new Error('`' + name + '` cannot be empty')\n }\n}\n\n// Assert `path` exists.\nfunction assertPath(path, name) {\n if (!path) {\n throw new Error('Setting `' + name + '` requires `path` to be set too')\n }\n}\n", "'use strict'\n\nvar VMessage = require('vfile-message')\nvar VFile = require('./core.js')\n\nmodule.exports = VFile\n\nvar proto = VFile.prototype\n\nproto.message = message\nproto.info = info\nproto.fail = fail\n\n// Create a message with `reason` at `position`.\n// When an error is passed in as `reason`, copies the stack.\nfunction message(reason, position, origin) {\n var filePath = this.path\n var message = new VMessage(reason, position, origin)\n\n if (filePath) {\n message.name = filePath + ':' + message.name\n message.file = filePath\n }\n\n message.fatal = false\n\n this.messages.push(message)\n\n return message\n}\n\n// Fail: creates a vmessage, associates it with the file, and throws it.\nfunction fail() {\n var message = this.message.apply(this, arguments)\n\n message.fatal = true\n\n throw message\n}\n\n// Info: creates a vmessage, associates it with the file, and marks the fatality\n// as null.\nfunction info() {\n var message = this.message.apply(this, arguments)\n\n message.fatal = null\n\n return message\n}\n", "'use strict';\n\nvar hasOwn = Object.prototype.hasOwnProperty;\nvar toStr = Object.prototype.toString;\nvar defineProperty = Object.defineProperty;\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nvar isArray = function isArray(arr) {\n\tif (typeof Array.isArray === 'function') {\n\t\treturn Array.isArray(arr);\n\t}\n\n\treturn toStr.call(arr) === '[object Array]';\n};\n\nvar isPlainObject = function isPlainObject(obj) {\n\tif (!obj || toStr.call(obj) !== '[object Object]') {\n\t\treturn false;\n\t}\n\n\tvar hasOwnConstructor = hasOwn.call(obj, 'constructor');\n\tvar hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf');\n\t// Not own constructor property must be Object\n\tif (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {\n\t\treturn false;\n\t}\n\n\t// Own properties are enumerated firstly, so to speed up,\n\t// if last one is own, then all properties are own.\n\tvar key;\n\tfor (key in obj) { /**/ }\n\n\treturn typeof key === 'undefined' || hasOwn.call(obj, key);\n};\n\n// If name is '__proto__', and Object.defineProperty is available, define __proto__ as an own property on target\nvar setProperty = function setProperty(target, options) {\n\tif (defineProperty && options.name === '__proto__') {\n\t\tdefineProperty(target, options.name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\tvalue: options.newValue,\n\t\t\twritable: true\n\t\t});\n\t} else {\n\t\ttarget[options.name] = options.newValue;\n\t}\n};\n\n// Return undefined instead of __proto__ if '__proto__' is not an own property\nvar getProperty = function getProperty(obj, name) {\n\tif (name === '__proto__') {\n\t\tif (!hasOwn.call(obj, name)) {\n\t\t\treturn void 0;\n\t\t} else if (gOPD) {\n\t\t\t// In early versions of node, obj['__proto__'] is buggy when obj has\n\t\t\t// __proto__ as an own property. Object.getOwnPropertyDescriptor() works.\n\t\t\treturn gOPD(obj, name).value;\n\t\t}\n\t}\n\n\treturn obj[name];\n};\n\nmodule.exports = function extend() {\n\tvar options, name, src, copy, copyIsArray, clone;\n\tvar target = arguments[0];\n\tvar i = 1;\n\tvar length = arguments.length;\n\tvar deep = false;\n\n\t// Handle a deep copy situation\n\tif (typeof target === 'boolean') {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\tif (target == null || (typeof target !== 'object' && typeof target !== 'function')) {\n\t\ttarget = {};\n\t}\n\n\tfor (; i < length; ++i) {\n\t\toptions = arguments[i];\n\t\t// Only deal with non-null/undefined values\n\t\tif (options != null) {\n\t\t\t// Extend the base object\n\t\t\tfor (name in options) {\n\t\t\t\tsrc = getProperty(target, name);\n\t\t\t\tcopy = getProperty(options, name);\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif (target !== copy) {\n\t\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\t\tif (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {\n\t\t\t\t\t\tif (copyIsArray) {\n\t\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\t\tclone = src && isArray(src) ? src : [];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tclone = src && isPlainObject(src) ? src : {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\t\tsetProperty(target, { name: name, newValue: extend(deep, clone, copy) });\n\n\t\t\t\t\t// Don't bring in undefined values\n\t\t\t\t\t} else if (typeof copy !== 'undefined') {\n\t\t\t\t\t\tsetProperty(target, { name: name, newValue: copy });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n", "'use strict'\n\nmodule.exports = bail\n\nfunction bail(err) {\n if (err) {\n throw err\n }\n}\n", "'use strict'\n\nvar own = {}.hasOwnProperty\n\nmodule.exports = stringify\n\nfunction stringify(value) {\n /* Nothing. */\n if (!value || typeof value !== 'object') {\n return null\n }\n\n /* Node. */\n if (own.call(value, 'position') || own.call(value, 'type')) {\n return position(value.position)\n }\n\n /* Position. */\n if (own.call(value, 'start') || own.call(value, 'end')) {\n return position(value)\n }\n\n /* Point. */\n if (own.call(value, 'line') || own.call(value, 'column')) {\n return point(value)\n }\n\n /* ? */\n return null\n}\n\nfunction point(point) {\n if (!point || typeof point !== 'object') {\n point = {}\n }\n\n return index(point.line) + ':' + index(point.column)\n}\n\nfunction position(pos) {\n if (!pos || typeof pos !== 'object') {\n pos = {}\n }\n\n return point(pos.start) + '-' + point(pos.end)\n}\n\nfunction index(value) {\n return value && typeof value === 'number' ? value : 1\n}\n", "'use strict'\n\nvar stringify = require('unist-util-stringify-position')\n\nmodule.exports = VMessage\n\n// Inherit from `Error#`.\nfunction VMessagePrototype() {}\nVMessagePrototype.prototype = Error.prototype\nVMessage.prototype = new VMessagePrototype()\n\n// Message properties.\nvar proto = VMessage.prototype\n\nproto.file = ''\nproto.name = ''\nproto.reason = ''\nproto.message = ''\nproto.stack = ''\nproto.fatal = null\nproto.column = null\nproto.line = null\n\n// Construct a new VMessage.\n//\n// Note: We cannot invoke `Error` on the created context, as that adds readonly\n// `line` and `column` attributes on Safari 9, thus throwing and failing the\n// data.\nfunction VMessage(reason, position, origin) {\n var parts\n var range\n var location\n\n if (typeof position === 'string') {\n origin = position\n position = null\n }\n\n parts = parseOrigin(origin)\n range = stringify(position) || '1:1'\n\n location = {\n start: {line: null, column: null},\n end: {line: null, column: null}\n }\n\n // Node.\n if (position && position.position) {\n position = position.position\n }\n\n if (position) {\n // Position.\n if (position.start) {\n location = position\n position = position.start\n } else {\n // Point.\n location.start = position\n }\n }\n\n if (reason.stack) {\n this.stack = reason.stack\n reason = reason.message\n }\n\n this.message = reason\n this.name = range\n this.reason = reason\n this.line = position ? position.line : null\n this.column = position ? position.column : null\n this.location = location\n this.source = parts[0]\n this.ruleId = parts[1]\n}\n\nfunction parseOrigin(origin) {\n var result = [null, null]\n var index\n\n if (typeof origin === 'string') {\n index = origin.indexOf(':')\n\n if (index === -1) {\n result[1] = origin\n } else {\n result[0] = origin.slice(0, index)\n result[1] = origin.slice(index + 1)\n }\n }\n\n return result\n}\n", "'use strict'\n\nvar path = require('path')\nvar replace = require('replace-ext')\nvar buffer = require('is-buffer')\n\nmodule.exports = VFile\n\nvar own = {}.hasOwnProperty\nvar proto = VFile.prototype\n\nproto.toString = toString\n\n// Order of setting (least specific to most), we need this because otherwise\n// `{stem: 'a', path: '~/b.js'}` would throw, as a path is needed before a\n// stem can be set.\nvar order = ['history', 'path', 'basename', 'stem', 'extname', 'dirname']\n\n// Construct a new file.\nfunction VFile(options) {\n var prop\n var index\n var length\n\n if (!options) {\n options = {}\n } else if (typeof options === 'string' || buffer(options)) {\n options = {contents: options}\n } else if ('message' in options && 'messages' in options) {\n return options\n }\n\n if (!(this instanceof VFile)) {\n return new VFile(options)\n }\n\n this.data = {}\n this.messages = []\n this.history = []\n this.cwd = process.cwd()\n\n // Set path related properties in the correct order.\n index = -1\n length = order.length\n\n while (++index < length) {\n prop = order[index]\n\n if (own.call(options, prop)) {\n this[prop] = options[prop]\n }\n }\n\n // Set non-path related properties.\n for (prop in options) {\n if (order.indexOf(prop) === -1) {\n this[prop] = options[prop]\n }\n }\n}\n\n// Access full path (`~/index.min.js`).\nObject.defineProperty(proto, 'path', {\n get: function() {\n return this.history[this.history.length - 1]\n },\n set: function(path) {\n assertNonEmpty(path, 'path')\n\n if (path !== this.path) {\n this.history.push(path)\n }\n }\n})\n\n// Access parent path (`~`).\nObject.defineProperty(proto, 'dirname', {\n get: function() {\n return typeof this.path === 'string' ? path.dirname(this.path) : undefined\n },\n set: function(dirname) {\n assertPath(this.path, 'dirname')\n this.path = path.join(dirname || '', this.basename)\n }\n})\n\n// Access basename (`index.min.js`).\nObject.defineProperty(proto, 'basename', {\n get: function() {\n return typeof this.path === 'string' ? path.basename(this.path) : undefined\n },\n set: function(basename) {\n assertNonEmpty(basename, 'basename')\n assertPart(basename, 'basename')\n this.path = path.join(this.dirname || '', basename)\n }\n})\n\n// Access extname (`.js`).\nObject.defineProperty(proto, 'extname', {\n get: function() {\n return typeof this.path === 'string' ? path.extname(this.path) : undefined\n },\n set: function(extname) {\n var ext = extname || ''\n\n assertPart(ext, 'extname')\n assertPath(this.path, 'extname')\n\n if (ext) {\n if (ext.charAt(0) !== '.') {\n throw new Error('`extname` must start with `.`')\n }\n\n if (ext.indexOf('.', 1) !== -1) {\n throw new Error('`extname` cannot contain multiple dots')\n }\n }\n\n this.path = replace(this.path, ext)\n }\n})\n\n// Access stem (`index.min`).\nObject.defineProperty(proto, 'stem', {\n get: function() {\n return typeof this.path === 'string'\n ? path.basename(this.path, this.extname)\n : undefined\n },\n set: function(stem) {\n assertNonEmpty(stem, 'stem')\n assertPart(stem, 'stem')\n this.path = path.join(this.dirname || '', stem + (this.extname || ''))\n }\n})\n\n// Get the value of the file.\nfunction toString(encoding) {\n var value = this.contents || ''\n return buffer(value) ? value.toString(encoding) : String(value)\n}\n\n// Assert that `part` is not a path (i.e., does not contain `path.sep`).\nfunction assertPart(part, name) {\n if (part.indexOf(path.sep) !== -1) {\n throw new Error(\n '`' + name + '` cannot be a path: did not expect `' + path.sep + '`'\n )\n }\n}\n\n// Assert that `part` is not empty.\nfunction assertNonEmpty(part, name) {\n if (!part) {\n throw new Error('`' + name + '` cannot be empty')\n }\n}\n\n// Assert `path` exists.\nfunction assertPath(path, name) {\n if (!path) {\n throw new Error('Setting `' + name + '` requires `path` to be set too')\n }\n}\n", "'use strict'\n\nvar VMessage = require('vfile-message')\nvar VFile = require('./core.js')\n\nmodule.exports = VFile\n\nvar proto = VFile.prototype\n\nproto.message = message\nproto.info = info\nproto.fail = fail\n\n// Slight backwards compatibility. Remove in the future.\nproto.warn = message\n\n// Create a message with `reason` at `position`. When an error is passed in as\n// `reason`, copies the stack.\nfunction message(reason, position, origin) {\n var filePath = this.path\n var message = new VMessage(reason, position, origin)\n\n if (filePath) {\n message.name = filePath + ':' + message.name\n message.file = filePath\n }\n\n message.fatal = false\n\n this.messages.push(message)\n\n return message\n}\n\n// Fail. Creates a vmessage, associates it with the file, and throws it.\nfunction fail() {\n var message = this.message.apply(this, arguments)\n\n message.fatal = true\n\n throw message\n}\n\n// Info. Creates a vmessage, associates it with the file, and marks the\n// fatality as null.\nfunction info() {\n var message = this.message.apply(this, arguments)\n\n message.fatal = null\n\n return message\n}\n", "'use strict'\n\nvar slice = [].slice\n\nmodule.exports = wrap\n\n/* Wrap `fn`. Can be sync or async; return a promise,\n * receive a completion handler, return new values and\n * errors. */\nfunction wrap(fn, callback) {\n var invoked\n\n return wrapped\n\n function wrapped() {\n var params = slice.call(arguments, 0)\n var callback = fn.length > params.length\n var result\n\n if (callback) {\n params.push(done)\n }\n\n try {\n result = fn.apply(null, params)\n } catch (err) {\n /* Well, this is quite the pickle. `fn` received\n * a callback and invoked it (thus continuing the\n * pipeline), but later also threw an error.\n * We\u2019re not about to restart the pipeline again,\n * so the only thing left to do is to throw the\n * thing instea. */\n if (callback && invoked) {\n throw err\n }\n\n return done(err)\n }\n\n if (!callback) {\n if (result && typeof result.then === 'function') {\n result.then(then, done)\n } else if (result instanceof Error) {\n done(result)\n } else {\n then(result)\n }\n }\n }\n\n /* Invoke `next`, only once. */\n function done() {\n if (!invoked) {\n invoked = true\n\n callback.apply(null, arguments)\n }\n }\n\n /* Invoke `done` with one value.\n * Tracks if an error is passed, too. */\n function then(value) {\n done(null, value)\n }\n}\n", "'use strict'\n\nvar wrap = require('./wrap.js')\n\nmodule.exports = trough\n\ntrough.wrap = wrap\n\nvar slice = [].slice\n\n/* Create new middleware. */\nfunction trough() {\n var fns = []\n var middleware = {}\n\n middleware.run = run\n middleware.use = use\n\n return middleware\n\n /* Run `fns`. Last argument must be\n * a completion handler. */\n function run() {\n var index = -1\n var input = slice.call(arguments, 0, -1)\n var done = arguments[arguments.length - 1]\n\n if (typeof done !== 'function') {\n throw new Error('Expected function as last argument, not ' + done)\n }\n\n next.apply(null, [null].concat(input))\n\n /* Run the next `fn`, if any. */\n function next(err) {\n var fn = fns[++index]\n var params = slice.call(arguments, 0)\n var values = params.slice(1)\n var length = input.length\n var pos = -1\n\n if (err) {\n done(err)\n return\n }\n\n /* Copy non-nully input into values. */\n while (++pos < length) {\n if (values[pos] === null || values[pos] === undefined) {\n values[pos] = input[pos]\n }\n }\n\n input = values\n\n /* Next or done. */\n if (fn) {\n wrap(fn, next).apply(null, input)\n } else {\n done.apply(null, [null].concat(input))\n }\n }\n }\n\n /* Add `fn` to the list. */\n function use(fn) {\n if (typeof fn !== 'function') {\n throw new Error('Expected `fn` to be a function, not ' + fn)\n }\n\n fns.push(fn)\n\n return middleware\n }\n}\n", "var toString = Object.prototype.toString\n\nmodule.exports = isString\n\nfunction isString(obj) {\n return toString.call(obj) === \"[object String]\"\n}\n", "'use strict';\nvar toString = Object.prototype.toString;\n\nmodule.exports = function (x) {\n\tvar prototype;\n\treturn toString.call(x) === '[object Object]' && (prototype = Object.getPrototypeOf(x), prototype === null || prototype === Object.getPrototypeOf({}));\n};\n", "'use strict'\n\nvar extend = require('extend')\nvar bail = require('bail')\nvar vfile = require('vfile')\nvar trough = require('trough')\nvar string = require('x-is-string')\nvar plain = require('is-plain-obj')\n\n// Expose a frozen processor.\nmodule.exports = unified().freeze()\n\nvar slice = [].slice\nvar own = {}.hasOwnProperty\n\n// Process pipeline.\nvar pipeline = trough()\n .use(pipelineParse)\n .use(pipelineRun)\n .use(pipelineStringify)\n\nfunction pipelineParse(p, ctx) {\n ctx.tree = p.parse(ctx.file)\n}\n\nfunction pipelineRun(p, ctx, next) {\n p.run(ctx.tree, ctx.file, done)\n\n function done(err, tree, file) {\n if (err) {\n next(err)\n } else {\n ctx.tree = tree\n ctx.file = file\n next()\n }\n }\n}\n\nfunction pipelineStringify(p, ctx) {\n ctx.file.contents = p.stringify(ctx.tree, ctx.file)\n}\n\n// Function to create the first processor.\nfunction unified() {\n var attachers = []\n var transformers = trough()\n var namespace = {}\n var frozen = false\n var freezeIndex = -1\n\n // Data management.\n processor.data = data\n\n // Lock.\n processor.freeze = freeze\n\n // Plugins.\n processor.attachers = attachers\n processor.use = use\n\n // API.\n processor.parse = parse\n processor.stringify = stringify\n processor.run = run\n processor.runSync = runSync\n processor.process = process\n processor.processSync = processSync\n\n // Expose.\n return processor\n\n // Create a new processor based on the processor in the current scope.\n function processor() {\n var destination = unified()\n var length = attachers.length\n var index = -1\n\n while (++index < length) {\n destination.use.apply(null, attachers[index])\n }\n\n destination.data(extend(true, {}, namespace))\n\n return destination\n }\n\n // Freeze: used to signal a processor that has finished configuration.\n //\n // For example, take unified itself. It\u2019s frozen. Plugins should not be\n // added to it. Rather, it should be extended, by invoking it, before\n // modifying it.\n //\n // In essence, always invoke this when exporting a processor.\n function freeze() {\n var values\n var plugin\n var options\n var transformer\n\n if (frozen) {\n return processor\n }\n\n while (++freezeIndex < attachers.length) {\n values = attachers[freezeIndex]\n plugin = values[0]\n options = values[1]\n transformer = null\n\n if (options === false) {\n continue\n }\n\n if (options === true) {\n values[1] = undefined\n }\n\n transformer = plugin.apply(processor, values.slice(1))\n\n if (typeof transformer === 'function') {\n transformers.use(transformer)\n }\n }\n\n frozen = true\n freezeIndex = Infinity\n\n return processor\n }\n\n // Data management. Getter / setter for processor-specific informtion.\n function data(key, value) {\n if (string(key)) {\n // Set `key`.\n if (arguments.length === 2) {\n assertUnfrozen('data', frozen)\n\n namespace[key] = value\n\n return processor\n }\n\n // Get `key`.\n return (own.call(namespace, key) && namespace[key]) || null\n }\n\n // Set space.\n if (key) {\n assertUnfrozen('data', frozen)\n namespace = key\n return processor\n }\n\n // Get space.\n return namespace\n }\n\n // Plugin management.\n //\n // Pass it:\n // * an attacher and options,\n // * a preset,\n // * a list of presets, attachers, and arguments (list of attachers and\n // options).\n function use(value) {\n var settings\n\n assertUnfrozen('use', frozen)\n\n if (value === null || value === undefined) {\n // Empty.\n } else if (typeof value === 'function') {\n addPlugin.apply(null, arguments)\n } else if (typeof value === 'object') {\n if ('length' in value) {\n addList(value)\n } else {\n addPreset(value)\n }\n } else {\n throw new Error('Expected usable value, not `' + value + '`')\n }\n\n if (settings) {\n namespace.settings = extend(namespace.settings || {}, settings)\n }\n\n return processor\n\n function addPreset(result) {\n addList(result.plugins)\n\n if (result.settings) {\n settings = extend(settings || {}, result.settings)\n }\n }\n\n function add(value) {\n if (typeof value === 'function') {\n addPlugin(value)\n } else if (typeof value === 'object') {\n if ('length' in value) {\n addPlugin.apply(null, value)\n } else {\n addPreset(value)\n }\n } else {\n throw new Error('Expected usable value, not `' + value + '`')\n }\n }\n\n function addList(plugins) {\n var length\n var index\n\n if (plugins === null || plugins === undefined) {\n // Empty.\n } else if (typeof plugins === 'object' && 'length' in plugins) {\n length = plugins.length\n index = -1\n\n while (++index < length) {\n add(plugins[index])\n }\n } else {\n throw new Error('Expected a list of plugins, not `' + plugins + '`')\n }\n }\n\n function addPlugin(plugin, value) {\n var entry = find(plugin)\n\n if (entry) {\n if (plain(entry[1]) && plain(value)) {\n value = extend(entry[1], value)\n }\n\n entry[1] = value\n } else {\n attachers.push(slice.call(arguments))\n }\n }\n }\n\n function find(plugin) {\n var length = attachers.length\n var index = -1\n var entry\n\n while (++index < length) {\n entry = attachers[index]\n\n if (entry[0] === plugin) {\n return entry\n }\n }\n }\n\n // Parse a file (in string or vfile representation) into a unist node using\n // the `Parser` on the processor.\n function parse(doc) {\n var file = vfile(doc)\n var Parser\n\n freeze()\n Parser = processor.Parser\n assertParser('parse', Parser)\n\n if (newable(Parser)) {\n return new Parser(String(file), file).parse()\n }\n\n return Parser(String(file), file) // eslint-disable-line new-cap\n }\n\n // Run transforms on a unist node representation of a file (in string or\n // vfile representation), async.\n function run(node, file, cb) {\n assertNode(node)\n freeze()\n\n if (!cb && typeof file === 'function') {\n cb = file\n file = null\n }\n\n if (!cb) {\n return new Promise(executor)\n }\n\n executor(null, cb)\n\n function executor(resolve, reject) {\n transformers.run(node, vfile(file), done)\n\n function done(err, tree, file) {\n tree = tree || node\n if (err) {\n reject(err)\n } else if (resolve) {\n resolve(tree)\n } else {\n cb(null, tree, file)\n }\n }\n }\n }\n\n // Run transforms on a unist node representation of a file (in string or\n // vfile representation), sync.\n function runSync(node, file) {\n var complete = false\n var result\n\n run(node, file, done)\n\n assertDone('runSync', 'run', complete)\n\n return result\n\n function done(err, tree) {\n complete = true\n bail(err)\n result = tree\n }\n }\n\n // Stringify a unist node representation of a file (in string or vfile\n // representation) into a string using the `Compiler` on the processor.\n function stringify(node, doc) {\n var file = vfile(doc)\n var Compiler\n\n freeze()\n Compiler = processor.Compiler\n assertCompiler('stringify', Compiler)\n assertNode(node)\n\n if (newable(Compiler)) {\n return new Compiler(node, file).compile()\n }\n\n return Compiler(node, file) // eslint-disable-line new-cap\n }\n\n // Parse a file (in string or vfile representation) into a unist node using\n // the `Parser` on the processor, then run transforms on that node, and\n // compile the resulting node using the `Compiler` on the processor, and\n // store that result on the vfile.\n function process(doc, cb) {\n freeze()\n assertParser('process', processor.Parser)\n assertCompiler('process', processor.Compiler)\n\n if (!cb) {\n return new Promise(executor)\n }\n\n executor(null, cb)\n\n function executor(resolve, reject) {\n var file = vfile(doc)\n\n pipeline.run(processor, {file: file}, done)\n\n function done(err) {\n if (err) {\n reject(err)\n } else if (resolve) {\n resolve(file)\n } else {\n cb(null, file)\n }\n }\n }\n }\n\n // Process the given document (in string or vfile representation), sync.\n function processSync(doc) {\n var complete = false\n var file\n\n freeze()\n assertParser('processSync', processor.Parser)\n assertCompiler('processSync', processor.Compiler)\n file = vfile(doc)\n\n process(file, done)\n\n assertDone('processSync', 'process', complete)\n\n return file\n\n function done(err) {\n complete = true\n bail(err)\n }\n }\n}\n\n// Check if `func` is a constructor.\nfunction newable(value) {\n return typeof value === 'function' && keys(value.prototype)\n}\n\n// Check if `value` is an object with keys.\nfunction keys(value) {\n var key\n for (key in value) {\n return true\n }\n return false\n}\n\n// Assert a parser is available.\nfunction assertParser(name, Parser) {\n if (typeof Parser !== 'function') {\n throw new Error('Cannot `' + name + '` without `Parser`')\n }\n}\n\n// Assert a compiler is available.\nfunction assertCompiler(name, Compiler) {\n if (typeof Compiler !== 'function') {\n throw new Error('Cannot `' + name + '` without `Compiler`')\n }\n}\n\n// Assert the processor is not frozen.\nfunction assertUnfrozen(name, frozen) {\n if (frozen) {\n throw new Error(\n 'Cannot invoke `' +\n name +\n '` on a frozen processor.\\nCreate a new processor first, by invoking it: use `processor()` instead of `processor`.'\n )\n }\n}\n\n// Assert `node` is a unist node.\nfunction assertNode(node) {\n if (!node || !string(node.type)) {\n throw new Error('Expected node, got `' + node + '`')\n }\n}\n\n// Assert that `complete` is `true`.\nfunction assertDone(name, asyncName, complete) {\n if (!complete) {\n throw new Error(\n '`' + name + '` finished async. Use `' + asyncName + '` instead'\n )\n }\n}\n", null, null, null, null, null, null, null, null, null, null, null, null, "module.exports = extend\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction extend() {\n var target = {}\n\n for (var i = 0; i < arguments.length; i++) {\n var source = arguments[i]\n\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n target[key] = source[key]\n }\n }\n }\n\n return target\n}\n", "'use strict'\n\nmodule.exports = Schema\n\nvar proto = Schema.prototype\n\nproto.space = null\nproto.normal = {}\nproto.property = {}\n\nfunction Schema(property, normal, space) {\n this.property = property\n this.normal = normal\n\n if (space) {\n this.space = space\n }\n}\n", "'use strict'\n\nvar xtend = require('xtend')\nvar Schema = require('./schema')\n\nmodule.exports = merge\n\nfunction merge(definitions) {\n var length = definitions.length\n var property = []\n var normal = []\n var index = -1\n var info\n var space\n\n while (++index < length) {\n info = definitions[index]\n property.push(info.property)\n normal.push(info.normal)\n space = info.space\n }\n\n return new Schema(\n xtend.apply(null, property),\n xtend.apply(null, normal),\n space\n )\n}\n", "'use strict'\n\nmodule.exports = normalize\n\nfunction normalize(value) {\n return value.toLowerCase()\n}\n", "'use strict'\n\nmodule.exports = Info\n\nvar proto = Info.prototype\n\nproto.space = null\nproto.attribute = null\nproto.property = null\nproto.boolean = false\nproto.booleanish = false\nproto.overloadedBoolean = false\nproto.number = false\nproto.commaSeparated = false\nproto.spaceSeparated = false\nproto.commaOrSpaceSeparated = false\nproto.mustUseProperty = false\nproto.defined = false\n\nfunction Info(property, attribute) {\n this.property = property\n this.attribute = attribute\n}\n", "'use strict'\n\nvar powers = 0\n\nexports.boolean = increment()\nexports.booleanish = increment()\nexports.overloadedBoolean = increment()\nexports.number = increment()\nexports.spaceSeparated = increment()\nexports.commaSeparated = increment()\nexports.commaOrSpaceSeparated = increment()\n\nfunction increment() {\n return Math.pow(2, ++powers)\n}\n", "'use strict'\n\nvar Info = require('./info')\nvar types = require('./types')\n\nmodule.exports = DefinedInfo\n\nDefinedInfo.prototype = new Info()\nDefinedInfo.prototype.defined = true\n\nvar checks = [\n 'boolean',\n 'booleanish',\n 'overloadedBoolean',\n 'number',\n 'commaSeparated',\n 'spaceSeparated',\n 'commaOrSpaceSeparated'\n]\nvar checksLength = checks.length\n\nfunction DefinedInfo(property, attribute, mask, space) {\n var index = -1\n var check\n\n mark(this, 'space', space)\n\n Info.call(this, property, attribute)\n\n while (++index < checksLength) {\n check = checks[index]\n mark(this, check, (mask & types[check]) === types[check])\n }\n}\n\nfunction mark(values, key, value) {\n if (value) {\n values[key] = value\n }\n}\n", "'use strict'\n\nvar normalize = require('../../normalize')\nvar Schema = require('./schema')\nvar DefinedInfo = require('./defined-info')\n\nmodule.exports = create\n\nfunction create(definition) {\n var space = definition.space\n var mustUseProperty = definition.mustUseProperty || []\n var attributes = definition.attributes || {}\n var props = definition.properties\n var transform = definition.transform\n var property = {}\n var normal = {}\n var prop\n var info\n\n for (prop in props) {\n info = new DefinedInfo(\n prop,\n transform(attributes, prop),\n props[prop],\n space\n )\n\n if (mustUseProperty.indexOf(prop) !== -1) {\n info.mustUseProperty = true\n }\n\n property[prop] = info\n\n normal[normalize(prop)] = prop\n normal[normalize(info.attribute)] = prop\n }\n\n return new Schema(property, normal, space)\n}\n", "'use strict'\n\nvar create = require('./util/create')\n\nmodule.exports = create({\n space: 'xlink',\n transform: xlinkTransform,\n properties: {\n xLinkActuate: null,\n xLinkArcRole: null,\n xLinkHref: null,\n xLinkRole: null,\n xLinkShow: null,\n xLinkTitle: null,\n xLinkType: null\n }\n})\n\nfunction xlinkTransform(_, prop) {\n return 'xlink:' + prop.slice(5).toLowerCase()\n}\n", "'use strict'\n\nvar create = require('./util/create')\n\nmodule.exports = create({\n space: 'xml',\n transform: xmlTransform,\n properties: {\n xmlLang: null,\n xmlBase: null,\n xmlSpace: null\n }\n})\n\nfunction xmlTransform(_, prop) {\n return 'xml:' + prop.slice(3).toLowerCase()\n}\n", "'use strict'\n\nmodule.exports = caseSensitiveTransform\n\nfunction caseSensitiveTransform(attributes, attribute) {\n return attribute in attributes ? attributes[attribute] : attribute\n}\n", "'use strict'\n\nvar caseSensitiveTransform = require('./case-sensitive-transform')\n\nmodule.exports = caseInsensitiveTransform\n\nfunction caseInsensitiveTransform(attributes, property) {\n return caseSensitiveTransform(attributes, property.toLowerCase())\n}\n", "'use strict'\n\nvar create = require('./util/create')\nvar caseInsensitiveTransform = require('./util/case-insensitive-transform')\n\nmodule.exports = create({\n space: 'xmlns',\n attributes: {\n xmlnsxlink: 'xmlns:xlink'\n },\n transform: caseInsensitiveTransform,\n properties: {\n xmlns: null,\n xmlnsXLink: null\n }\n})\n", "'use strict'\n\nvar types = require('./util/types')\nvar create = require('./util/create')\n\nvar booleanish = types.booleanish\nvar number = types.number\nvar spaceSeparated = types.spaceSeparated\n\nmodule.exports = create({\n transform: ariaTransform,\n properties: {\n ariaActiveDescendant: null,\n ariaAtomic: booleanish,\n ariaAutoComplete: null,\n ariaBusy: booleanish,\n ariaChecked: booleanish,\n ariaColCount: number,\n ariaColIndex: number,\n ariaColSpan: number,\n ariaControls: spaceSeparated,\n ariaCurrent: null,\n ariaDescribedBy: spaceSeparated,\n ariaDetails: null,\n ariaDisabled: booleanish,\n ariaDropEffect: spaceSeparated,\n ariaErrorMessage: null,\n ariaExpanded: booleanish,\n ariaFlowTo: spaceSeparated,\n ariaGrabbed: booleanish,\n ariaHasPopup: null,\n ariaHidden: booleanish,\n ariaInvalid: null,\n ariaKeyShortcuts: null,\n ariaLabel: null,\n ariaLabelledBy: spaceSeparated,\n ariaLevel: number,\n ariaLive: null,\n ariaModal: booleanish,\n ariaMultiLine: booleanish,\n ariaMultiSelectable: booleanish,\n ariaOrientation: null,\n ariaOwns: spaceSeparated,\n ariaPlaceholder: null,\n ariaPosInSet: number,\n ariaPressed: booleanish,\n ariaReadOnly: booleanish,\n ariaRelevant: null,\n ariaRequired: booleanish,\n ariaRoleDescription: spaceSeparated,\n ariaRowCount: number,\n ariaRowIndex: number,\n ariaRowSpan: number,\n ariaSelected: booleanish,\n ariaSetSize: number,\n ariaSort: null,\n ariaValueMax: number,\n ariaValueMin: number,\n ariaValueNow: number,\n ariaValueText: null,\n role: null\n }\n})\n\nfunction ariaTransform(_, prop) {\n return prop === 'role' ? prop : 'aria-' + prop.slice(4).toLowerCase()\n}\n", "'use strict'\n\nvar types = require('./util/types')\nvar create = require('./util/create')\nvar caseInsensitiveTransform = require('./util/case-insensitive-transform')\n\nvar boolean = types.boolean\nvar overloadedBoolean = types.overloadedBoolean\nvar booleanish = types.booleanish\nvar number = types.number\nvar spaceSeparated = types.spaceSeparated\nvar commaSeparated = types.commaSeparated\n\nmodule.exports = create({\n space: 'html',\n attributes: {\n acceptcharset: 'accept-charset',\n classname: 'class',\n htmlfor: 'for',\n httpequiv: 'http-equiv'\n },\n transform: caseInsensitiveTransform,\n mustUseProperty: ['checked', 'multiple', 'muted', 'selected'],\n properties: {\n // Standard Properties.\n abbr: null,\n accept: commaSeparated,\n acceptCharset: spaceSeparated,\n accessKey: spaceSeparated,\n action: null,\n allow: null,\n allowFullScreen: boolean,\n allowPaymentRequest: boolean,\n allowUserMedia: boolean,\n alt: null,\n as: null,\n async: boolean,\n autoCapitalize: null,\n autoComplete: spaceSeparated,\n autoFocus: boolean,\n autoPlay: boolean,\n capture: boolean,\n charSet: null,\n checked: boolean,\n cite: null,\n className: spaceSeparated,\n cols: number,\n colSpan: null,\n content: null,\n contentEditable: booleanish,\n controls: boolean,\n controlsList: spaceSeparated,\n coords: number | commaSeparated,\n crossOrigin: null,\n data: null,\n dateTime: null,\n decoding: null,\n default: boolean,\n defer: boolean,\n dir: null,\n dirName: null,\n disabled: boolean,\n download: overloadedBoolean,\n draggable: booleanish,\n encType: null,\n enterKeyHint: null,\n form: null,\n formAction: null,\n formEncType: null,\n formMethod: null,\n formNoValidate: boolean,\n formTarget: null,\n headers: spaceSeparated,\n height: number,\n hidden: boolean,\n high: number,\n href: null,\n hrefLang: null,\n htmlFor: spaceSeparated,\n httpEquiv: spaceSeparated,\n id: null,\n imageSizes: null,\n imageSrcSet: commaSeparated,\n inputMode: null,\n integrity: null,\n is: null,\n isMap: boolean,\n itemId: null,\n itemProp: spaceSeparated,\n itemRef: spaceSeparated,\n itemScope: boolean,\n itemType: spaceSeparated,\n kind: null,\n label: null,\n lang: null,\n language: null,\n list: null,\n loop: boolean,\n low: number,\n manifest: null,\n max: null,\n maxLength: number,\n media: null,\n method: null,\n min: null,\n minLength: number,\n multiple: boolean,\n muted: boolean,\n name: null,\n nonce: null,\n noModule: boolean,\n noValidate: boolean,\n onAbort: null,\n onAfterPrint: null,\n onAuxClick: null,\n onBeforePrint: null,\n onBeforeUnload: null,\n onBlur: null,\n onCancel: null,\n onCanPlay: null,\n onCanPlayThrough: null,\n onChange: null,\n onClick: null,\n onClose: null,\n onContextMenu: null,\n onCopy: null,\n onCueChange: null,\n onCut: null,\n onDblClick: null,\n onDrag: null,\n onDragEnd: null,\n onDragEnter: null,\n onDragExit: null,\n onDragLeave: null,\n onDragOver: null,\n onDragStart: null,\n onDrop: null,\n onDurationChange: null,\n onEmptied: null,\n onEnded: null,\n onError: null,\n onFocus: null,\n onFormData: null,\n onHashChange: null,\n onInput: null,\n onInvalid: null,\n onKeyDown: null,\n onKeyPress: null,\n onKeyUp: null,\n onLanguageChange: null,\n onLoad: null,\n onLoadedData: null,\n onLoadedMetadata: null,\n onLoadEnd: null,\n onLoadStart: null,\n onMessage: null,\n onMessageError: null,\n onMouseDown: null,\n onMouseEnter: null,\n onMouseLeave: null,\n onMouseMove: null,\n onMouseOut: null,\n onMouseOver: null,\n onMouseUp: null,\n onOffline: null,\n onOnline: null,\n onPageHide: null,\n onPageShow: null,\n onPaste: null,\n onPause: null,\n onPlay: null,\n onPlaying: null,\n onPopState: null,\n onProgress: null,\n onRateChange: null,\n onRejectionHandled: null,\n onReset: null,\n onResize: null,\n onScroll: null,\n onSecurityPolicyViolation: null,\n onSeeked: null,\n onSeeking: null,\n onSelect: null,\n onStalled: null,\n onStorage: null,\n onSubmit: null,\n onSuspend: null,\n onTimeUpdate: null,\n onToggle: null,\n onUnhandledRejection: null,\n onUnload: null,\n onVolumeChange: null,\n onWaiting: null,\n onWheel: null,\n open: boolean,\n optimum: number,\n pattern: null,\n ping: spaceSeparated,\n placeholder: null,\n playsInline: boolean,\n poster: null,\n preload: null,\n readOnly: boolean,\n referrerPolicy: null,\n rel: spaceSeparated,\n required: boolean,\n reversed: boolean,\n rows: number,\n rowSpan: number,\n sandbox: spaceSeparated,\n scope: null,\n scoped: boolean,\n seamless: boolean,\n selected: boolean,\n shape: null,\n size: number,\n sizes: null,\n slot: null,\n span: number,\n spellCheck: booleanish,\n src: null,\n srcDoc: null,\n srcLang: null,\n srcSet: commaSeparated,\n start: number,\n step: null,\n style: null,\n tabIndex: number,\n target: null,\n title: null,\n translate: null,\n type: null,\n typeMustMatch: boolean,\n useMap: null,\n value: booleanish,\n width: number,\n wrap: null,\n\n // Legacy.\n // See: https://html.spec.whatwg.org/#other-elements,-attributes-and-apis\n align: null, // Several. Use CSS `text-align` instead,\n aLink: null, // `<body>`. Use CSS `a:active {color}` instead\n archive: spaceSeparated, // `<object>`. List of URIs to archives\n axis: null, // `<td>` and `<th>`. Use `scope` on `<th>`\n background: null, // `<body>`. Use CSS `background-image` instead\n bgColor: null, // `<body>` and table elements. Use CSS `background-color` instead\n border: number, // `<table>`. Use CSS `border-width` instead,\n borderColor: null, // `<table>`. Use CSS `border-color` instead,\n bottomMargin: number, // `<body>`\n cellPadding: null, // `<table>`\n cellSpacing: null, // `<table>`\n char: null, // Several table elements. When `align=char`, sets the character to align on\n charOff: null, // Several table elements. When `char`, offsets the alignment\n classId: null, // `<object>`\n clear: null, // `<br>`. Use CSS `clear` instead\n code: null, // `<object>`\n codeBase: null, // `<object>`\n codeType: null, // `<object>`\n color: null, // `<font>` and `<hr>`. Use CSS instead\n compact: boolean, // Lists. Use CSS to reduce space between items instead\n declare: boolean, // `<object>`\n event: null, // `<script>`\n face: null, // `<font>`. Use CSS instead\n frame: null, // `<table>`\n frameBorder: null, // `<iframe>`. Use CSS `border` instead\n hSpace: number, // `<img>` and `<object>`\n leftMargin: number, // `<body>`\n link: null, // `<body>`. Use CSS `a:link {color: *}` instead\n longDesc: null, // `<frame>`, `<iframe>`, and `<img>`. Use an `<a>`\n lowSrc: null, // `<img>`. Use a `<picture>`\n marginHeight: number, // `<body>`\n marginWidth: number, // `<body>`\n noResize: boolean, // `<frame>`\n noHref: boolean, // `<area>`. Use no href instead of an explicit `nohref`\n noShade: boolean, // `<hr>`. Use background-color and height instead of borders\n noWrap: boolean, // `<td>` and `<th>`\n object: null, // `<applet>`\n profile: null, // `<head>`\n prompt: null, // `<isindex>`\n rev: null, // `<link>`\n rightMargin: number, // `<body>`\n rules: null, // `<table>`\n scheme: null, // `<meta>`\n scrolling: booleanish, // `<frame>`. Use overflow in the child context\n standby: null, // `<object>`\n summary: null, // `<table>`\n text: null, // `<body>`. Use CSS `color` instead\n topMargin: number, // `<body>`\n valueType: null, // `<param>`\n version: null, // `<html>`. Use a doctype.\n vAlign: null, // Several. Use CSS `vertical-align` instead\n vLink: null, // `<body>`. Use CSS `a:visited {color}` instead\n vSpace: number, // `<img>` and `<object>`\n\n // Non-standard Properties.\n allowTransparency: null,\n autoCorrect: null,\n autoSave: null,\n disablePictureInPicture: boolean,\n prefix: null,\n property: null,\n results: number,\n security: null,\n unselectable: null\n }\n})\n", "'use strict'\n\nvar merge = require('./lib/util/merge')\nvar xlink = require('./lib/xlink')\nvar xml = require('./lib/xml')\nvar xmlns = require('./lib/xmlns')\nvar aria = require('./lib/aria')\nvar html = require('./lib/html')\n\nmodule.exports = merge([xml, xlink, xmlns, aria, html])\n", "'use strict'\n\nvar types = require('./util/types')\nvar create = require('./util/create')\nvar caseSensitiveTransform = require('./util/case-sensitive-transform')\n\nvar boolean = types.boolean\nvar number = types.number\nvar spaceSeparated = types.spaceSeparated\nvar commaSeparated = types.commaSeparated\nvar commaOrSpaceSeparated = types.commaOrSpaceSeparated\n\nmodule.exports = create({\n space: 'svg',\n attributes: {\n accentHeight: 'accent-height',\n alignmentBaseline: 'alignment-baseline',\n arabicForm: 'arabic-form',\n baselineShift: 'baseline-shift',\n capHeight: 'cap-height',\n className: 'class',\n clipPath: 'clip-path',\n clipRule: 'clip-rule',\n colorInterpolation: 'color-interpolation',\n colorInterpolationFilters: 'color-interpolation-filters',\n colorProfile: 'color-profile',\n colorRendering: 'color-rendering',\n crossOrigin: 'crossorigin',\n dataType: 'datatype',\n dominantBaseline: 'dominant-baseline',\n enableBackground: 'enable-background',\n fillOpacity: 'fill-opacity',\n fillRule: 'fill-rule',\n floodColor: 'flood-color',\n floodOpacity: 'flood-opacity',\n fontFamily: 'font-family',\n fontSize: 'font-size',\n fontSizeAdjust: 'font-size-adjust',\n fontStretch: 'font-stretch',\n fontStyle: 'font-style',\n fontVariant: 'font-variant',\n fontWeight: 'font-weight',\n glyphName: 'glyph-name',\n glyphOrientationHorizontal: 'glyph-orientation-horizontal',\n glyphOrientationVertical: 'glyph-orientation-vertical',\n hrefLang: 'hreflang',\n horizAdvX: 'horiz-adv-x',\n horizOriginX: 'horiz-origin-x',\n horizOriginY: 'horiz-origin-y',\n imageRendering: 'image-rendering',\n letterSpacing: 'letter-spacing',\n lightingColor: 'lighting-color',\n markerEnd: 'marker-end',\n markerMid: 'marker-mid',\n markerStart: 'marker-start',\n navDown: 'nav-down',\n navDownLeft: 'nav-down-left',\n navDownRight: 'nav-down-right',\n navLeft: 'nav-left',\n navNext: 'nav-next',\n navPrev: 'nav-prev',\n navRight: 'nav-right',\n navUp: 'nav-up',\n navUpLeft: 'nav-up-left',\n navUpRight: 'nav-up-right',\n onAbort: 'onabort',\n onActivate: 'onactivate',\n onAfterPrint: 'onafterprint',\n onBeforePrint: 'onbeforeprint',\n onBegin: 'onbegin',\n onCancel: 'oncancel',\n onCanPlay: 'oncanplay',\n onCanPlayThrough: 'oncanplaythrough',\n onChange: 'onchange',\n onClick: 'onclick',\n onClose: 'onclose',\n onCopy: 'oncopy',\n onCueChange: 'oncuechange',\n onCut: 'oncut',\n onDblClick: 'ondblclick',\n onDrag: 'ondrag',\n onDragEnd: 'ondragend',\n onDragEnter: 'ondragenter',\n onDragExit: 'ondragexit',\n onDragLeave: 'ondragleave',\n onDragOver: 'ondragover',\n onDragStart: 'ondragstart',\n onDrop: 'ondrop',\n onDurationChange: 'ondurationchange',\n onEmptied: 'onemptied',\n onEnd: 'onend',\n onEnded: 'onended',\n onError: 'onerror',\n onFocus: 'onfocus',\n onFocusIn: 'onfocusin',\n onFocusOut: 'onfocusout',\n onHashChange: 'onhashchange',\n onInput: 'oninput',\n onInvalid: 'oninvalid',\n onKeyDown: 'onkeydown',\n onKeyPress: 'onkeypress',\n onKeyUp: 'onkeyup',\n onLoad: 'onload',\n onLoadedData: 'onloadeddata',\n onLoadedMetadata: 'onloadedmetadata',\n onLoadStart: 'onloadstart',\n onMessage: 'onmessage',\n onMouseDown: 'onmousedown',\n onMouseEnter: 'onmouseenter',\n onMouseLeave: 'onmouseleave',\n onMouseMove: 'onmousemove',\n onMouseOut: 'onmouseout',\n onMouseOver: 'onmouseover',\n onMouseUp: 'onmouseup',\n onMouseWheel: 'onmousewheel',\n onOffline: 'onoffline',\n onOnline: 'ononline',\n onPageHide: 'onpagehide',\n onPageShow: 'onpageshow',\n onPaste: 'onpaste',\n onPause: 'onpause',\n onPlay: 'onplay',\n onPlaying: 'onplaying',\n onPopState: 'onpopstate',\n onProgress: 'onprogress',\n onRateChange: 'onratechange',\n onRepeat: 'onrepeat',\n onReset: 'onreset',\n onResize: 'onresize',\n onScroll: 'onscroll',\n onSeeked: 'onseeked',\n onSeeking: 'onseeking',\n onSelect: 'onselect',\n onShow: 'onshow',\n onStalled: 'onstalled',\n onStorage: 'onstorage',\n onSubmit: 'onsubmit',\n onSuspend: 'onsuspend',\n onTimeUpdate: 'ontimeupdate',\n onToggle: 'ontoggle',\n onUnload: 'onunload',\n onVolumeChange: 'onvolumechange',\n onWaiting: 'onwaiting',\n onZoom: 'onzoom',\n overlinePosition: 'overline-position',\n overlineThickness: 'overline-thickness',\n paintOrder: 'paint-order',\n panose1: 'panose-1',\n pointerEvents: 'pointer-events',\n referrerPolicy: 'referrerpolicy',\n renderingIntent: 'rendering-intent',\n shapeRendering: 'shape-rendering',\n stopColor: 'stop-color',\n stopOpacity: 'stop-opacity',\n strikethroughPosition: 'strikethrough-position',\n strikethroughThickness: 'strikethrough-thickness',\n strokeDashArray: 'stroke-dasharray',\n strokeDashOffset: 'stroke-dashoffset',\n strokeLineCap: 'stroke-linecap',\n strokeLineJoin: 'stroke-linejoin',\n strokeMiterLimit: 'stroke-miterlimit',\n strokeOpacity: 'stroke-opacity',\n strokeWidth: 'stroke-width',\n tabIndex: 'tabindex',\n textAnchor: 'text-anchor',\n textDecoration: 'text-decoration',\n textRendering: 'text-rendering',\n typeOf: 'typeof',\n underlinePosition: 'underline-position',\n underlineThickness: 'underline-thickness',\n unicodeBidi: 'unicode-bidi',\n unicodeRange: 'unicode-range',\n unitsPerEm: 'units-per-em',\n vAlphabetic: 'v-alphabetic',\n vHanging: 'v-hanging',\n vIdeographic: 'v-ideographic',\n vMathematical: 'v-mathematical',\n vectorEffect: 'vector-effect',\n vertAdvY: 'vert-adv-y',\n vertOriginX: 'vert-origin-x',\n vertOriginY: 'vert-origin-y',\n wordSpacing: 'word-spacing',\n writingMode: 'writing-mode',\n xHeight: 'x-height',\n // These were camelcased in Tiny. Now lowercased in SVG 2\n playbackOrder: 'playbackorder',\n timelineBegin: 'timelinebegin'\n },\n transform: caseSensitiveTransform,\n properties: {\n about: commaOrSpaceSeparated,\n accentHeight: number,\n accumulate: null,\n additive: null,\n alignmentBaseline: null,\n alphabetic: number,\n amplitude: number,\n arabicForm: null,\n ascent: number,\n attributeName: null,\n attributeType: null,\n azimuth: number,\n bandwidth: null,\n baselineShift: null,\n baseFrequency: null,\n baseProfile: null,\n bbox: null,\n begin: null,\n bias: number,\n by: null,\n calcMode: null,\n capHeight: number,\n className: spaceSeparated,\n clip: null,\n clipPath: null,\n clipPathUnits: null,\n clipRule: null,\n color: null,\n colorInterpolation: null,\n colorInterpolationFilters: null,\n colorProfile: null,\n colorRendering: null,\n content: null,\n contentScriptType: null,\n contentStyleType: null,\n crossOrigin: null,\n cursor: null,\n cx: null,\n cy: null,\n d: null,\n dataType: null,\n defaultAction: null,\n descent: number,\n diffuseConstant: number,\n direction: null,\n display: null,\n dur: null,\n divisor: number,\n dominantBaseline: null,\n download: boolean,\n dx: null,\n dy: null,\n edgeMode: null,\n editable: null,\n elevation: number,\n enableBackground: null,\n end: null,\n event: null,\n exponent: number,\n externalResourcesRequired: null,\n fill: null,\n fillOpacity: number,\n fillRule: null,\n filter: null,\n filterRes: null,\n filterUnits: null,\n floodColor: null,\n floodOpacity: null,\n focusable: null,\n focusHighlight: null,\n fontFamily: null,\n fontSize: null,\n fontSizeAdjust: null,\n fontStretch: null,\n fontStyle: null,\n fontVariant: null,\n fontWeight: null,\n format: null,\n fr: null,\n from: null,\n fx: null,\n fy: null,\n g1: commaSeparated,\n g2: commaSeparated,\n glyphName: commaSeparated,\n glyphOrientationHorizontal: null,\n glyphOrientationVertical: null,\n glyphRef: null,\n gradientTransform: null,\n gradientUnits: null,\n handler: null,\n hanging: number,\n hatchContentUnits: null,\n hatchUnits: null,\n height: null,\n href: null,\n hrefLang: null,\n horizAdvX: number,\n horizOriginX: number,\n horizOriginY: number,\n id: null,\n ideographic: number,\n imageRendering: null,\n initialVisibility: null,\n in: null,\n in2: null,\n intercept: number,\n k: number,\n k1: number,\n k2: number,\n k3: number,\n k4: number,\n kernelMatrix: commaOrSpaceSeparated,\n kernelUnitLength: null,\n keyPoints: null, // SEMI_COLON_SEPARATED\n keySplines: null, // SEMI_COLON_SEPARATED\n keyTimes: null, // SEMI_COLON_SEPARATED\n kerning: null,\n lang: null,\n lengthAdjust: null,\n letterSpacing: null,\n lightingColor: null,\n limitingConeAngle: number,\n local: null,\n markerEnd: null,\n markerMid: null,\n markerStart: null,\n markerHeight: null,\n markerUnits: null,\n markerWidth: null,\n mask: null,\n maskContentUnits: null,\n maskUnits: null,\n mathematical: null,\n max: null,\n media: null,\n mediaCharacterEncoding: null,\n mediaContentEncodings: null,\n mediaSize: number,\n mediaTime: null,\n method: null,\n min: null,\n mode: null,\n name: null,\n navDown: null,\n navDownLeft: null,\n navDownRight: null,\n navLeft: null,\n navNext: null,\n navPrev: null,\n navRight: null,\n navUp: null,\n navUpLeft: null,\n navUpRight: null,\n numOctaves: null,\n observer: null,\n offset: null,\n onAbort: null,\n onActivate: null,\n onAfterPrint: null,\n onBeforePrint: null,\n onBegin: null,\n onCancel: null,\n onCanPlay: null,\n onCanPlayThrough: null,\n onChange: null,\n onClick: null,\n onClose: null,\n onCopy: null,\n onCueChange: null,\n onCut: null,\n onDblClick: null,\n onDrag: null,\n onDragEnd: null,\n onDragEnter: null,\n onDragExit: null,\n onDragLeave: null,\n onDragOver: null,\n onDragStart: null,\n onDrop: null,\n onDurationChange: null,\n onEmptied: null,\n onEnd: null,\n onEnded: null,\n onError: null,\n onFocus: null,\n onFocusIn: null,\n onFocusOut: null,\n onHashChange: null,\n onInput: null,\n onInvalid: null,\n onKeyDown: null,\n onKeyPress: null,\n onKeyUp: null,\n onLoad: null,\n onLoadedData: null,\n onLoadedMetadata: null,\n onLoadStart: null,\n onMessage: null,\n onMouseDown: null,\n onMouseEnter: null,\n onMouseLeave: null,\n onMouseMove: null,\n onMouseOut: null,\n onMouseOver: null,\n onMouseUp: null,\n onMouseWheel: null,\n onOffline: null,\n onOnline: null,\n onPageHide: null,\n onPageShow: null,\n onPaste: null,\n onPause: null,\n onPlay: null,\n onPlaying: null,\n onPopState: null,\n onProgress: null,\n onRateChange: null,\n onRepeat: null,\n onReset: null,\n onResize: null,\n onScroll: null,\n onSeeked: null,\n onSeeking: null,\n onSelect: null,\n onShow: null,\n onStalled: null,\n onStorage: null,\n onSubmit: null,\n onSuspend: null,\n onTimeUpdate: null,\n onToggle: null,\n onUnload: null,\n onVolumeChange: null,\n onWaiting: null,\n onZoom: null,\n opacity: null,\n operator: null,\n order: null,\n orient: null,\n orientation: null,\n origin: null,\n overflow: null,\n overlay: null,\n overlinePosition: number,\n overlineThickness: number,\n paintOrder: null,\n panose1: null,\n path: null,\n pathLength: number,\n patternContentUnits: null,\n patternTransform: null,\n patternUnits: null,\n phase: null,\n ping: spaceSeparated,\n pitch: null,\n playbackOrder: null,\n pointerEvents: null,\n points: null,\n pointsAtX: number,\n pointsAtY: number,\n pointsAtZ: number,\n preserveAlpha: null,\n preserveAspectRatio: null,\n primitiveUnits: null,\n propagate: null,\n property: commaOrSpaceSeparated,\n r: null,\n radius: null,\n referrerPolicy: null,\n refX: null,\n refY: null,\n rel: commaOrSpaceSeparated,\n rev: commaOrSpaceSeparated,\n renderingIntent: null,\n repeatCount: null,\n repeatDur: null,\n requiredExtensions: commaOrSpaceSeparated,\n requiredFeatures: commaOrSpaceSeparated,\n requiredFonts: commaOrSpaceSeparated,\n requiredFormats: commaOrSpaceSeparated,\n resource: null,\n restart: null,\n result: null,\n rotate: null,\n rx: null,\n ry: null,\n scale: null,\n seed: null,\n shapeRendering: null,\n side: null,\n slope: null,\n snapshotTime: null,\n specularConstant: number,\n specularExponent: number,\n spreadMethod: null,\n spacing: null,\n startOffset: null,\n stdDeviation: null,\n stemh: null,\n stemv: null,\n stitchTiles: null,\n stopColor: null,\n stopOpacity: null,\n strikethroughPosition: number,\n strikethroughThickness: number,\n string: null,\n stroke: null,\n strokeDashArray: commaOrSpaceSeparated,\n strokeDashOffset: null,\n strokeLineCap: null,\n strokeLineJoin: null,\n strokeMiterLimit: number,\n strokeOpacity: number,\n strokeWidth: null,\n style: null,\n surfaceScale: number,\n syncBehavior: null,\n syncBehaviorDefault: null,\n syncMaster: null,\n syncTolerance: null,\n syncToleranceDefault: null,\n systemLanguage: commaOrSpaceSeparated,\n tabIndex: number,\n tableValues: null,\n target: null,\n targetX: number,\n targetY: number,\n textAnchor: null,\n textDecoration: null,\n textRendering: null,\n textLength: null,\n timelineBegin: null,\n title: null,\n transformBehavior: null,\n type: null,\n typeOf: commaOrSpaceSeparated,\n to: null,\n transform: null,\n u1: null,\n u2: null,\n underlinePosition: number,\n underlineThickness: number,\n unicode: null,\n unicodeBidi: null,\n unicodeRange: null,\n unitsPerEm: number,\n values: null,\n vAlphabetic: number,\n vMathematical: number,\n vectorEffect: null,\n vHanging: number,\n vIdeographic: number,\n version: null,\n vertAdvY: number,\n vertOriginX: number,\n vertOriginY: number,\n viewBox: null,\n viewTarget: null,\n visibility: null,\n width: null,\n widths: null,\n wordSpacing: null,\n writingMode: null,\n x: null,\n x1: null,\n x2: null,\n xChannelSelector: null,\n xHeight: number,\n y: null,\n y1: null,\n y2: null,\n yChannelSelector: null,\n z: null,\n zoomAndPan: null\n }\n})\n", "'use strict'\n\nvar merge = require('./lib/util/merge')\nvar xlink = require('./lib/xlink')\nvar xml = require('./lib/xml')\nvar xmlns = require('./lib/xmlns')\nvar aria = require('./lib/aria')\nvar svg = require('./lib/svg')\n\nmodule.exports = merge([xml, xlink, xmlns, aria, svg])\n", "'use strict'\n\nvar normalize = require('./normalize')\nvar DefinedInfo = require('./lib/util/defined-info')\nvar Info = require('./lib/util/info')\n\nvar data = 'data'\n\nmodule.exports = find\n\nvar valid = /^data[-a-z0-9.:_]+$/i\nvar dash = /-[a-z]/g\nvar cap = /[A-Z]/g\n\nfunction find(schema, value) {\n var normal = normalize(value)\n var prop = value\n var Type = Info\n\n if (normal in schema.normal) {\n return schema.property[schema.normal[normal]]\n }\n\n if (normal.length > 4 && normal.slice(0, 4) === data && valid.test(value)) {\n // Attribute or property.\n if (value.charAt(4) === '-') {\n prop = datasetToProperty(value)\n } else {\n value = datasetToAttribute(value)\n }\n\n Type = DefinedInfo\n }\n\n return new Type(prop, value)\n}\n\nfunction datasetToProperty(attribute) {\n var value = attribute.slice(5).replace(dash, camelcase)\n return data + value.charAt(0).toUpperCase() + value.slice(1)\n}\n\nfunction datasetToAttribute(property) {\n var value = property.slice(4)\n\n if (dash.test(value)) {\n return property\n }\n\n value = value.replace(cap, kebab)\n\n if (value.charAt(0) !== '-') {\n value = '-' + value\n }\n\n return data + value\n}\n\nfunction kebab($0) {\n return '-' + $0.toLowerCase()\n}\n\nfunction camelcase($0) {\n return $0.charAt(1).toUpperCase()\n}\n", "'use strict'\n\nmodule.exports = parse\n\nvar numberSign = 35 // '#'\nvar dot = 46 // '.'\n\n// Create a hast element from a simple CSS selector.\nfunction parse(selector, defaultTagName) {\n var value = selector || ''\n var name = defaultTagName || 'div'\n var props = {}\n var index = -1\n var length = value.length\n var className\n var type\n var code\n var subvalue\n var lastIndex\n\n while (++index <= length) {\n code = value.charCodeAt(index)\n\n if (!code || code === dot || code === numberSign) {\n subvalue = value.slice(lastIndex, index)\n\n if (subvalue) {\n if (type === dot) {\n // eslint-disable-next-line max-depth\n if (className) {\n className.push(subvalue)\n } else {\n className = [subvalue]\n props.className = className\n }\n } else if (type === numberSign) {\n props.id = subvalue\n } else {\n name = subvalue\n }\n }\n\n lastIndex = index + 1\n type = code\n }\n }\n\n return {\n type: 'element',\n tagName: name,\n properties: props,\n children: []\n }\n}\n", "'use strict'\n\nexports.parse = parse\nexports.stringify = stringify\n\nvar empty = ''\nvar space = ' '\nvar whiteSpace = /[ \\t\\n\\r\\f]+/g\n\nfunction parse(value) {\n var input = String(value || empty).trim()\n return input === empty ? [] : input.split(whiteSpace)\n}\n\nfunction stringify(values) {\n return values.join(space).trim()\n}\n", "'use strict'\n\nexports.parse = parse\nexports.stringify = stringify\n\nvar comma = ','\nvar space = ' '\nvar empty = ''\n\n// Parse comma-separated tokens to an array.\nfunction parse(value) {\n var values = []\n var input = String(value || empty)\n var index = input.indexOf(comma)\n var lastIndex = 0\n var end = false\n var val\n\n while (!end) {\n if (index === -1) {\n index = input.length\n end = true\n }\n\n val = input.slice(lastIndex, index).trim()\n\n if (val || !end) {\n values.push(val)\n }\n\n lastIndex = index + 1\n index = input.indexOf(comma, lastIndex)\n }\n\n return values\n}\n\n// Compile an array to comma-separated tokens.\n// `options.padLeft` (default: `true`) pads a space left of each token, and\n// `options.padRight` (default: `false`) pads a space to the right of each token.\nfunction stringify(values, options) {\n var settings = options || {}\n var left = settings.padLeft === false ? empty : space\n var right = settings.padRight ? space : empty\n\n // Ensure the last empty entry is seen.\n if (values[values.length - 1] === empty) {\n values = values.concat(empty)\n }\n\n return values.join(right + comma + left).trim()\n}\n", "'use strict'\n\nvar find = require('property-information/find')\nvar parseSelector = require('hast-util-parse-selector')\nvar spaces = require('space-separated-tokens').parse\nvar commas = require('comma-separated-tokens').parse\n\nmodule.exports = factory\n\nfunction factory(schema, defaultTagName) {\n return h\n\n /* Hyperscript compatible DSL for creating virtual HAST trees. */\n function h(selector, properties, children) {\n var node = parseSelector(selector, defaultTagName)\n var property\n\n if (!children && properties && !properties[Symbol.for('hast.isProp')] && isChildren(properties, node)) {\n children = properties\n properties = null\n }\n\n if (properties) {\n for (property in properties) {\n addProperty(node.properties, property, properties[property])\n }\n }\n\n addChild(node.children, children)\n\n return node\n }\n\n function addProperty(properties, key, value) {\n var info\n var property\n var result\n\n /* Ignore nully and NaN values. */\n // eslint-disable-next-line no-self-compare\n if (value === null || value === undefined || value !== value) {\n return\n }\n\n info = find(schema, key)\n property = info.property\n result = value\n\n /* Handle list values. */\n if (typeof result === 'string') {\n if (info.spaceSeparated) {\n result = spaces(result)\n } else if (info.commaSeparated) {\n result = commas(result)\n } else if (info.commaOrSpaceSeparated) {\n result = spaces(commas(result).join(' '))\n }\n }\n\n /* Accept `object` on style. */\n if (property === 'style' && typeof value !== 'string') {\n result = style(result)\n }\n\n /* Class-names (which can be added both on the `selector` and here). */\n if (property === 'className' && properties.className) {\n result = properties.className.concat(result)\n }\n\n properties[property] = parsePrimitives(info, property, result)\n }\n}\n\n// Value can be: string for text node, array for chilNodes\nfunction isChildren(value, node) {\n return typeof value === 'string' || 'length' in value || isNode(node.tagName, value)\n}\n\nfunction isNode(tagName, value) {\n var type = value.type\n\n if (tagName === 'input' || !type || typeof type !== 'string') {\n return false\n }\n\n if (typeof value.children === 'object' && 'length' in value.children) {\n return true\n }\n\n type = type.toLowerCase()\n\n if (tagName === 'button') {\n return type !== 'menu' && type !== 'submit' && type !== 'reset' && type !== 'button'\n }\n\n return 'value' in value\n}\n\nfunction addChild(nodes, value) {\n var index\n var length\n\n if (value === null || value === undefined) {\n return\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n nodes.push({ type: 'text', value: String(value) })\n return\n }\n\n if (typeof value === 'object' && 'length' in value) {\n index = -1\n length = value.length\n\n while (++index < length) {\n addChild(nodes, value[index])\n }\n\n return\n }\n\n if (typeof value !== 'object' || !('type' in value)) {\n throw new Error('Expected node, nodes, or string, got `' + value + '`')\n }\n\n nodes.push(value)\n}\n\n/* Parse a (list of) primitives. */\nfunction parsePrimitives(info, name, value) {\n var index\n var length\n var result\n\n if (typeof value !== 'object' || !('length' in value)) {\n return parsePrimitive(info, name, value)\n }\n\n length = value.length\n index = -1\n result = []\n\n while (++index < length) {\n result[index] = parsePrimitive(info, name, value[index])\n }\n\n return result\n}\n\n/* Parse a single primitives. */\nfunction parsePrimitive(info, name, value) {\n var result = value\n\n if (info.number || info.positiveNumber) {\n if (!isNaN(result) && result !== '') {\n result = Number(result)\n }\n } else if (info.boolean || info.overloadedBoolean) {\n /* Accept `boolean` and `string`. */\n if (typeof result === 'string' && result === '') {\n result = true\n }\n }\n\n return result\n}\n\nfunction style(value) {\n var result = []\n var key\n\n for (key in value) {\n result.push([key, value[key]].join(': '))\n }\n\n return result.join('; ')\n}\n", "'use strict'\n\nvar schema = require('property-information/svg')\nvar factory = require('./factory')\n\nvar svg = factory(schema, 'g')\nsvg.displayName = 'svg'\n\nmodule.exports = svg\n", "'use strict'\n\nvar schema = require('property-information/html')\nvar factory = require('./factory')\n\nvar html = factory(schema, 'div')\nhtml.displayName = 'html'\n\nmodule.exports = html\n", "'use strict'\n\nmodule.exports = require('./html')\n", "import {\n ParseSourceSpan,\n splitNsName,\n Element,\n Comment,\n Text,\n Node,\n Doctype,\n Attribute\n} from '@starptech/webparser'\n\nconst htmlSchema = require('property-information/html')\nconst svgSchema = require('property-information/svg')\nconst hastSvg = require('@starptech/prettyhtml-hastscript/svg')\nconst hast = require('@starptech/prettyhtml-hastscript')\n\nconst GAP_REGEX = /\\n\\s*?\\n\\s*?$/\n\nfunction isFakeRoot(obj: Element): boolean {\n return obj.name === ':webparser:root'\n}\n\ntype Options = {}\n\ntype TransformOptions = {\n schema?: { space: string }\n}\n\ntype HastNode = {\n name?: string\n type: string\n tagName?: string\n properties?: Array<Object>\n position?: { start: any; end: any }\n children?: HastNode[]\n public?: string\n system?: string\n value?: string\n data?: { [name: string]: any }\n}\n\n/* Wrapper to normalise options. */\nexport = function from(rootNodes: Node[], options: Options = {}) {\n const sourceSpan = new ParseSourceSpan(null, null)\n const fakeRoot = new Element(':webparser:root', [], rootNodes, false, sourceSpan)\n const result = transform(fakeRoot, null, {\n schema: htmlSchema\n })\n\n return result\n}\n\n/* Transform a node. */\nfunction transform(ast: Node, nextAst: Node | null, config: TransformOptions): HastNode {\n const schema = config.schema\n let node: HastNode\n\n if (ast instanceof Element) {\n let children: HastNode[]\n config.schema = getElementNameAndNS(ast.name).ns === 'svg' ? svgSchema : htmlSchema\n if (ast.children && ast.children.length) {\n children = nodes(ast.children, config)\n }\n\n if (isFakeRoot(ast)) {\n node = root(ast, children)\n } else {\n node = element(ast, children, config)\n }\n\n node.data = node.data || {}\n node.data.selfClosing =\n ast.startSourceSpan === ast.endSourceSpan && ast.startSourceSpan !== null && ast.endSourceSpan !== null\n if (isGap(nextAst)) node.data.gapAfter = true\n } else if (ast instanceof Text) {\n node = text(ast)\n } else if (ast instanceof Comment) {\n node = comment(ast)\n if (isGap(nextAst)) {\n node.data = node.data || {}\n node.data.gapAfter = true\n }\n } else if (ast instanceof Doctype) {\n node = {\n type: 'doctype',\n name: 'html',\n public: null,\n system: null\n }\n }\n\n if (ast instanceof Element) {\n if (ast.startSourceSpan && ast.endSourceSpan) {\n node.position = {\n start: {\n // webparser format counts lines beginning from zero\n line: ++ast.startSourceSpan.start.line,\n column: ast.startSourceSpan.start.col,\n offset: ast.startSourceSpan.start.offset\n },\n end: {\n line: ++ast.endSourceSpan.end.line,\n column: ast.endSourceSpan.end.col,\n offset: ast.endSourceSpan.end.offset\n }\n }\n }\n } else {\n node.position = {\n start: {\n line: ++ast.sourceSpan.start.line,\n column: ast.sourceSpan.start.col,\n offset: ast.sourceSpan.start.offset\n },\n end: {\n line: ++ast.sourceSpan.end.line,\n column: ast.sourceSpan.end.col,\n offset: ast.sourceSpan.end.offset\n }\n }\n }\n\n config.schema = schema\n\n return node\n}\n\n/* Transform children. */\nfunction nodes(children: Node[], config: TransformOptions): HastNode[] {\n const length = children.length\n let index = -1\n const result: HastNode[] = []\n\n while (++index < length) {\n const nextChildren = index + 1 < length ? children[index + 1] : null\n result[index] = transform(children[index], nextChildren, config)\n }\n\n return result\n}\n\nfunction root(ast: Node, children: HastNode[]): HastNode {\n return { type: 'root', children, data: {} }\n}\n\n/* Transform a text. */\nfunction text(ast: Text): HastNode {\n return { type: 'text', value: ast.value }\n}\n\n/* Transform a comment. */\nfunction comment(ast: Comment): HastNode {\n return { type: 'comment', value: ast.value }\n}\n\nfunction getAttributeName(attribute: Attribute) {\n const colons = attribute.name.split(':')\n\n // attrName from webparser: \":xmlns:xlink\"\n // remove first colon because it was added by webparser\n if (attribute.implicitNs === true && colons.length >= 3) {\n return colons.slice(1).join(':')\n }\n\n return attribute.name\n}\n\nfunction getElementNameAndNS(name: string, implicitNs = false) {\n const info = splitNsName(name)\n\n // when a ns was set but no implicit was propagated\n if (implicitNs == false && info[0]) {\n return { ns: info[0], name: info[0] + ':' + info[1] }\n }\n\n return { ns: info[0], name: info[1] }\n}\n\nfunction isGap(el: Node): boolean {\n return el instanceof Text && el.value && GAP_REGEX.test(el.value)\n}\n\n/* Transform an element. */\nfunction element(ast: Element, children: HastNode[], config: TransformOptions): HastNode {\n const fn = config.schema.space === 'svg' ? hastSvg : hast\n const nameInfo = getElementNameAndNS(ast.name, ast.implicitNs)\n const props: any = {}\n let node\n\n for (const attr of ast.attrs) {\n props[getAttributeName(attr)] = attr.value\n }\n\n // hastscript interpret any object with a \"value\" attribute as\n // unist node. This is a workaround to explicity express it as property.\n if (props.value) {\n props[Symbol.for('hast.isProp')] = true\n }\n\n node = fn(nameInfo.name, props, children)\n\n return node\n}\n", "import { HtmlParser, ParseErrorLevel, TreeError } from '@starptech/webparser'\nimport fromWebparser from '@starptech/hast-util-from-webparser'\n\ninterface ParseOptions {\n ignoreFirstLf?: boolean\n decodeEntities?: boolean\n selfClosingCustomElements?: boolean\n}\ninterface VFile {\n path: string\n message(reason: string, position: any, origin: string): void\n fail(reason: string, position: any, origin: string): void\n}\n\nexport = function parse(options: ParseOptions = {}): any {\n this.Parser = parser\n\n function parser(doc: string, file: VFile) {\n const parseResult = new HtmlParser(options).parse(doc, file.path)\n const lexerErrors = parseResult.errors.filter(e => !(e instanceof TreeError))\n const parserErrors = parseResult.errors.filter(e => e instanceof TreeError)\n const parserWarnings = parserErrors.filter(e => e.level === ParseErrorLevel.WARNING)\n\n for (const err of parserWarnings) {\n file.message(\n err.msg,\n {\n start: {\n // webparser format counts lines beginning from zero\n line: ++err.span.start.line,\n offset: err.span.start.offset,\n column: err.span.start.col\n },\n end: {\n line: ++err.span.end.line,\n offset: err.span.end.offset,\n column: err.span.end.col\n }\n },\n 'ParseError'\n )\n }\n\n // log the first error which is related to the parser not lexer\n const parserFatalErrors = parserErrors.filter(e => e.level === ParseErrorLevel.ERROR)\n\n for (const err of parserFatalErrors) {\n file.fail(\n err.msg,\n {\n start: {\n // webparser format counts lines beginning from zero\n line: ++err.span.start.line,\n offset: err.span.start.offset,\n column: err.span.start.col\n },\n end: {\n line: ++err.span.end.line,\n offset: err.span.end.offset,\n column: err.span.end.col\n }\n },\n 'ParseError'\n )\n }\n\n // when lexer error don't produce a parser error we still need to fail with the lexer error\n if (parserFatalErrors.length === 0 && lexerErrors.length > 0) {\n const err = lexerErrors[0]\n file.fail(\n err.msg,\n {\n start: {\n // webparser format counts lines beginning from zero\n line: ++err.span.start.line,\n offset: err.span.start.offset,\n column: err.span.start.col\n },\n end: {\n line: ++err.span.end.line,\n offset: err.span.end.offset,\n column: err.span.end.col\n }\n },\n 'LexerError'\n )\n }\n\n return fromWebparser(parseResult.rootNodes, options)\n }\n}\n", "[\n \"area\",\n \"base\",\n \"basefont\",\n \"bgsound\",\n \"br\",\n \"col\",\n \"command\",\n \"embed\",\n \"frame\",\n \"hr\",\n \"image\",\n \"img\",\n \"input\",\n \"isindex\",\n \"keygen\",\n \"link\",\n \"menuitem\",\n \"meta\",\n \"nextid\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\"\n]\n", "'use strict'\n\nmodule.exports = is\n\n// Assert if `test` passes for `node`. When a `parent` node is known the\n// `index` of node.\n// eslint-disable-next-line max-params\nfunction is(test, node, index, parent, context) {\n var hasParent = parent !== null && parent !== undefined\n var hasIndex = index !== null && index !== undefined\n var check = convert(test)\n\n if (\n hasIndex &&\n (typeof index !== 'number' || index < 0 || index === Infinity)\n ) {\n throw new Error('Expected positive finite index or child node')\n }\n\n if (hasParent && (!is(null, parent) || !parent.children)) {\n throw new Error('Expected parent node')\n }\n\n if (!node || !node.type || typeof node.type !== 'string') {\n return false\n }\n\n if (hasParent !== hasIndex) {\n throw new Error('Expected both parent and index')\n }\n\n return Boolean(check.call(context, node, index, parent))\n}\n\nfunction convert(test) {\n if (typeof test === 'string') {\n return typeFactory(test)\n }\n\n if (test === null || test === undefined) {\n return ok\n }\n\n if (typeof test === 'object') {\n return ('length' in test ? anyFactory : matchesFactory)(test)\n }\n\n if (typeof test === 'function') {\n return test\n }\n\n throw new Error('Expected function, string, or object as test')\n}\n\nfunction convertAll(tests) {\n var results = []\n var length = tests.length\n var index = -1\n\n while (++index < length) {\n results[index] = convert(tests[index])\n }\n\n return results\n}\n\n// Utility assert each property in `test` is represented in `node`, and each\n// values are strictly equal.\nfunction matchesFactory(test) {\n return matches\n\n function matches(node) {\n var key\n\n for (key in test) {\n if (node[key] !== test[key]) {\n return false\n }\n }\n\n return true\n }\n}\n\nfunction anyFactory(tests) {\n var checks = convertAll(tests)\n var length = checks.length\n\n return matches\n\n function matches() {\n var index = -1\n\n while (++index < length) {\n if (checks[index].apply(this, arguments)) {\n return true\n }\n }\n\n return false\n }\n}\n\n// Utility to convert a string into a function which checks a given node\u2019s type\n// for said string.\nfunction typeFactory(test) {\n return type\n\n function type(node) {\n return Boolean(node && node.type === test)\n }\n}\n\n// Utility to return true.\nfunction ok() {\n return true\n}\n", "'use strict'\n\nmodule.exports = isElement\n\n// Check if if `node` is an `element` and, if `tagNames` is given, `node`\n// matches them `tagNames`.\nfunction isElement(node, tagNames) {\n var name\n\n if (\n !(\n tagNames === null ||\n tagNames === undefined ||\n typeof tagNames === 'string' ||\n (typeof tagNames === 'object' && tagNames.length !== 0)\n )\n ) {\n throw new Error(\n 'Expected `string` or `Array.<string>` for `tagNames`, not `' +\n tagNames +\n '`'\n )\n }\n\n if (\n !node ||\n typeof node !== 'object' ||\n node.type !== 'element' ||\n typeof node.tagName !== 'string'\n ) {\n return false\n }\n\n if (tagNames === null || tagNames === undefined) {\n return true\n }\n\n name = node.tagName\n\n if (typeof tagNames === 'string') {\n return name === tagNames\n }\n\n return tagNames.indexOf(name) !== -1\n}\n", "'use strict'\n\nmodule.exports = interElementWhiteSpace\n\n// HTML white-space expression.\n// See <https://html.spec.whatwg.org/#space-character>.\nvar re = /[ \\t\\n\\f\\r]/g\n\nfunction interElementWhiteSpace(node) {\n var value\n\n if (node && typeof node === 'object' && node.type === 'text') {\n value = node.value || ''\n } else if (typeof node === 'string') {\n value = node\n } else {\n return false\n }\n\n return value.replace(re, '') === ''\n}\n", "'use strict'\n\nvar whiteSpace = require('hast-util-whitespace')\n\nexports.before = siblings(-1)\nexports.after = siblings(1)\n\n/* Factory to check siblings in a direction. */\nfunction siblings(increment) {\n return sibling\n\n /* Find applicable siblings in a direction. */\n function sibling(parent, index, includeWhiteSpace) {\n var siblings = parent && parent.children\n var next\n\n index += increment\n next = siblings && siblings[index]\n\n if (!includeWhiteSpace) {\n while (next && whiteSpace(next)) {\n index += increment\n next = siblings[index]\n }\n }\n\n return next\n }\n}\n", "'use strict'\n\nvar after = require('./siblings').after\n\nmodule.exports = first\n\n/* Get the first child in `parent`. */\nfunction first(parent, includeWhiteSpace) {\n return after(parent, -1, includeWhiteSpace)\n}\n", "'use strict'\n\nmodule.exports = place\n\n/* Get the position of `node` in `parent`. */\nfunction place(parent, child) {\n return parent && parent.children && parent.children.indexOf(child)\n}\n", "'use strict'\n\nvar is = require('unist-util-is')\nvar whiteSpace = require('hast-util-whitespace')\n\nmodule.exports = whiteSpaceLeft\n\n/* Check if `node` starts with white-space. */\nfunction whiteSpaceLeft(node) {\n return is('text', node) && whiteSpace(node.value.charAt(0))\n}\n", "'use strict'\n\nmodule.exports = omission\n\nvar own = {}.hasOwnProperty\n\n/* Factory to check if a given node can have a tag omitted. */\nfunction omission(handlers) {\n return omit\n\n /* Check if a given node can have a tag omitted. */\n function omit(node, index, parent) {\n var name = node.tagName\n var fn = own.call(handlers, name) ? handlers[name] : false\n\n return fn ? fn(node, index, parent) : false\n }\n}\n", "'use strict'\n\nvar is = require('unist-util-is')\nvar element = require('hast-util-is-element')\nvar whiteSpaceLeft = require('./util/white-space-left')\nvar after = require('./util/siblings').after\nvar omission = require('./omission')\n\nvar optionGroup = 'optgroup'\nvar options = ['option'].concat(optionGroup)\nvar dataListItem = ['dt', 'dd']\nvar listItem = 'li'\nvar menuContent = ['menuitem', 'hr', 'menu']\nvar ruby = ['rp', 'rt']\nvar tableContainer = ['tbody', 'tfoot']\nvar tableRow = 'tr'\nvar tableCell = ['td', 'th']\n\nvar confusingParagraphParent = ['a', 'audio', 'del', 'ins', 'map', 'noscript', 'video']\n\nvar clearParagraphSibling = [\n 'address',\n 'article',\n 'aside',\n 'blockquote',\n 'details',\n 'div',\n 'dl',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'header',\n 'hgroup',\n 'hr',\n 'main',\n 'menu',\n 'nav',\n 'ol',\n 'p',\n 'pre',\n 'section',\n 'table',\n 'ul'\n]\n\nmodule.exports = omission({\n html: html,\n head: headOrColgroupOrCaption,\n body: body,\n p: p,\n li: li,\n dt: dt,\n dd: dd,\n rt: rubyElement,\n rp: rubyElement,\n optgroup: optgroup,\n option: option,\n menuitem: menuitem,\n colgroup: headOrColgroupOrCaption,\n caption: headOrColgroupOrCaption,\n thead: thead,\n tbody: tbody,\n tfoot: tfoot,\n tr: tr,\n td: cells,\n th: cells\n})\n\n/* Macro for `</head>`, `</colgroup>`, and `</caption>`. */\nfunction headOrColgroupOrCaption(node, index, parent) {\n var next = after(parent, index, true)\n return !next || (!is('comment', next) && !whiteSpaceLeft(next))\n}\n\n/* Whether to omit `</html>`. */\nfunction html(node, index, parent) {\n var next = after(parent, index)\n return !next || !is('comment', next)\n}\n\n/* Whether to omit `</body>`. */\nfunction body(node, index, parent) {\n var next = after(parent, index)\n return !next || !is('comment', next)\n}\n\n/* Whether to omit `</p>`. */\nfunction p(node, index, parent) {\n var next = after(parent, index)\n return next ? element(next, clearParagraphSibling) : !parent || !element(parent, confusingParagraphParent)\n}\n\n/* Whether to omit `</li>`. */\nfunction li(node, index, parent) {\n var next = after(parent, index)\n return !next || element(next, listItem)\n}\n\n/* Whether to omit `</dt>`. */\nfunction dt(node, index, parent) {\n var next = after(parent, index)\n return next && element(next, dataListItem)\n}\n\n/* Whether to omit `</dd>`. */\nfunction dd(node, index, parent) {\n var next = after(parent, index)\n return !next || element(next, dataListItem)\n}\n\n/* Whether to omit `</rt>` or `</rp>`. */\nfunction rubyElement(node, index, parent) {\n var next = after(parent, index)\n return !next || element(next, ruby)\n}\n\n/* Whether to omit `</optgroup>`. */\nfunction optgroup(node, index, parent) {\n var next = after(parent, index)\n return !next || element(next, optionGroup)\n}\n\n/* Whether to omit `</option>`. */\nfunction option(node, index, parent) {\n var next = after(parent, index)\n return !next || element(next, options)\n}\n\n/* Whether to omit `</menuitem>`. */\nfunction menuitem(node, index, parent) {\n var next = after(parent, index)\n return !next || element(next, menuContent)\n}\n\n/* Whether to omit `</thead>`. */\nfunction thead(node, index, parent) {\n var next = after(parent, index)\n return next && element(next, tableContainer)\n}\n\n/* Whether to omit `</tbody>`. */\nfunction tbody(node, index, parent) {\n var next = after(parent, index)\n return !next || element(next, tableContainer)\n}\n\n/* Whether to omit `</tfoot>`. */\nfunction tfoot(node, index, parent) {\n return !after(parent, index)\n}\n\n/* Whether to omit `</tr>`. */\nfunction tr(node, index, parent) {\n var next = after(parent, index)\n return !next || element(next, tableRow)\n}\n\n/* Whether to omit `</td>` or `</th>`. */\nfunction cells(node, index, parent) {\n var next = after(parent, index)\n return !next || element(next, tableCell)\n}\n", "'use strict'\n\nvar is = require('unist-util-is')\nvar element = require('hast-util-is-element')\nvar before = require('./util/siblings').before\nvar first = require('./util/first')\nvar place = require('./util/place')\nvar whiteSpaceLeft = require('./util/white-space-left')\nvar closing = require('./closing')\nvar omission = require('./omission')\n\nvar own = {}.hasOwnProperty\n\nvar uniqueHeadMetadata = ['title', 'base']\nvar meta = ['meta', 'link', 'script', 'style', 'template']\nvar tableContainers = ['thead', 'tbody']\nvar tableRow = 'tr'\n\nmodule.exports = omission({\n html: html,\n head: head,\n body: body,\n colgroup: colgroup,\n tbody: tbody\n})\n\n/* Whether to omit `<html>`. */\nfunction html(node) {\n var head = first(node)\n return !head || !is('comment', head)\n}\n\n/* Whether to omit `<head>`. */\nfunction head(node) {\n var children = node.children\n var length = children.length\n var map = {}\n var index = -1\n var child\n var name\n\n while (++index < length) {\n child = children[index]\n name = child.tagName\n\n if (element(child, uniqueHeadMetadata)) {\n if (own.call(map, name)) {\n return false\n }\n\n map[name] = true\n }\n }\n\n return Boolean(length)\n}\n\n/* Whether to omit `<body>`. */\nfunction body(node) {\n var head = first(node, true)\n\n return !head || (!is('comment', head) && !whiteSpaceLeft(head) && !element(head, meta))\n}\n\n/* Whether to omit `<colgroup>`.\n * The spec describes some logic for the opening tag,\n * but it\u2019s easier to implement in the closing tag, to\n * the same effect, so we handle it there instead. */\nfunction colgroup(node, index, parent) {\n var prev = before(parent, index)\n var head = first(node, true)\n\n /* Previous colgroup was already omitted. */\n if (element(prev, 'colgroup') && closing(prev, place(parent, prev), parent)) {\n return false\n }\n\n return head && element(head, 'col')\n}\n\n/* Whether to omit `<tbody>`. */\nfunction tbody(node, index, parent) {\n var prev = before(parent, index)\n var head = first(node)\n\n /* Previous table section was already omitted. */\n if (element(prev, tableContainers) && closing(prev, place(parent, prev), parent)) {\n return false\n }\n\n return head && element(head, tableRow)\n}\n", "'use strict'\nexports.opening = require('./opening')\nexports.closing = require('./closing')\n", "[\n \"script\",\n \"style\",\n \"pre\",\n \"textarea\"\n]\n", "'use strict'\n\nvar one = require('./one')\nvar sensitive = require('html-whitespace-sensitive-tag-names')\n\nmodule.exports = all\n\n/* Stringify all children of `parent`. */\nfunction all(ctx, parent) {\n var children = parent && parent.children\n var length = children && children.length\n var index = -1\n var results = []\n\n let printWidthOffset = 0\n let innerTextLength = 0\n while (++index < length) {\n innerTextLength = getInnerTextLength(children[index])\n results[index] = one(ctx, children[index], index, parent, printWidthOffset, innerTextLength)\n printWidthOffset = results[index].replace(/\\n+/g, '').length\n }\n\n return results.join('')\n}\n\n/**\n * Returns the text lenght of the first line of the first child.\n * Whitespace sensitive elements are ignored.\n * @param {*} node\n */\nfunction getInnerTextLength(node) {\n // ignore style, script, pre, textarea elements\n if (sensitive.indexOf(node.tagName) !== -1) {\n return 0\n }\n\n if (!node.children || !node.children.length) {\n return 0\n }\n\n var child = node.children[0]\n\n if (child.type === 'text' || child.type === 'comment') {\n return child.value.split('\\n')[0].length\n }\n\n return 0\n}\n", "'use strict'\n\nmodule.exports = text\n\n/* Stringify `text`. */\nfunction text(ctx, node, index, parent) {\n var value = node.value\n\n return value\n}\n", "{\n \"nbsp\": \"\u00A0\",\n \"iexcl\": \"\u00A1\",\n \"cent\": \"\u00A2\",\n \"pound\": \"\u00A3\",\n \"curren\": \"\u00A4\",\n \"yen\": \"\u00A5\",\n \"brvbar\": \"\u00A6\",\n \"sect\": \"\u00A7\",\n \"uml\": \"\u00A8\",\n \"copy\": \"\u00A9\",\n \"ordf\": \"\u00AA\",\n \"laquo\": \"\u00AB\",\n \"not\": \"\u00AC\",\n \"shy\": \"\u00AD\",\n \"reg\": \"\u00AE\",\n \"macr\": \"\u00AF\",\n \"deg\": \"\u00B0\",\n \"plusmn\": \"\u00B1\",\n \"sup2\": \"\u00B2\",\n \"sup3\": \"\u00B3\",\n \"acute\": \"\u00B4\",\n \"micro\": \"\u00B5\",\n \"para\": \"\u00B6\",\n \"middot\": \"\u00B7\",\n \"cedil\": \"\u00B8\",\n \"sup1\": \"\u00B9\",\n \"ordm\": \"\u00BA\",\n \"raquo\": \"\u00BB\",\n \"frac14\": \"\u00BC\",\n \"frac12\": \"\u00BD\",\n \"frac34\": \"\u00BE\",\n \"iquest\": \"\u00BF\",\n \"Agrave\": \"\u00C0\",\n \"Aacute\": \"\u00C1\",\n \"Acirc\": \"\u00C2\",\n \"Atilde\": \"\u00C3\",\n \"Auml\": \"\u00C4\",\n \"Aring\": \"\u00C5\",\n \"AElig\": \"\u00C6\",\n \"Ccedil\": \"\u00C7\",\n \"Egrave\": \"\u00C8\",\n \"Eacute\": \"\u00C9\",\n \"Ecirc\": \"\u00CA\",\n \"Euml\": \"\u00CB\",\n \"Igrave\": \"\u00CC\",\n \"Iacute\": \"\u00CD\",\n \"Icirc\": \"\u00CE\",\n \"Iuml\": \"\u00CF\",\n \"ETH\": \"\u00D0\",\n \"Ntilde\": \"\u00D1\",\n \"Ograve\": \"\u00D2\",\n \"Oacute\": \"\u00D3\",\n \"Ocirc\": \"\u00D4\",\n \"Otilde\": \"\u00D5\",\n \"Ouml\": \"\u00D6\",\n \"times\": \"\u00D7\",\n \"Oslash\": \"\u00D8\",\n \"Ugrave\": \"\u00D9\",\n \"Uacute\": \"\u00DA\",\n \"Ucirc\": \"\u00DB\",\n \"Uuml\": \"\u00DC\",\n \"Yacute\": \"\u00DD\",\n \"THORN\": \"\u00DE\",\n \"szlig\": \"\u00DF\",\n \"agrave\": \"\u00E0\",\n \"aacute\": \"\u00E1\",\n \"acirc\": \"\u00E2\",\n \"atilde\": \"\u00E3\",\n \"auml\": \"\u00E4\",\n \"aring\": \"\u00E5\",\n \"aelig\": \"\u00E6\",\n \"ccedil\": \"\u00E7\",\n \"egrave\": \"\u00E8\",\n \"eacute\": \"\u00E9\",\n \"ecirc\": \"\u00EA\",\n \"euml\": \"\u00EB\",\n \"igrave\": \"\u00EC\",\n \"iacute\": \"\u00ED\",\n \"icirc\": \"\u00EE\",\n \"iuml\": \"\u00EF\",\n \"eth\": \"\u00F0\",\n \"ntilde\": \"\u00F1\",\n \"ograve\": \"\u00F2\",\n \"oacute\": \"\u00F3\",\n \"ocirc\": \"\u00F4\",\n \"otilde\": \"\u00F5\",\n \"ouml\": \"\u00F6\",\n \"divide\": \"\u00F7\",\n \"oslash\": \"\u00F8\",\n \"ugrave\": \"\u00F9\",\n \"uacute\": \"\u00FA\",\n \"ucirc\": \"\u00FB\",\n \"uuml\": \"\u00FC\",\n \"yacute\": \"\u00FD\",\n \"thorn\": \"\u00FE\",\n \"yuml\": \"\u00FF\",\n \"fnof\": \"\u0192\",\n \"Alpha\": \"\u0391\",\n \"Beta\": \"\u0392\",\n \"Gamma\": \"\u0393\",\n \"Delta\": \"\u0394\",\n \"Epsilon\": \"\u0395\",\n \"Zeta\": \"\u0396\",\n \"Eta\": \"\u0397\",\n \"Theta\": \"\u0398\",\n \"Iota\": \"\u0399\",\n \"Kappa\": \"\u039A\",\n \"Lambda\": \"\u039B\",\n \"Mu\": \"\u039C\",\n \"Nu\": \"\u039D\",\n \"Xi\": \"\u039E\",\n \"Omicron\": \"\u039F\",\n \"Pi\": \"\u03A0\",\n \"Rho\": \"\u03A1\",\n \"Sigma\": \"\u03A3\",\n \"Tau\": \"\u03A4\",\n \"Upsilon\": \"\u03A5\",\n \"Phi\": \"\u03A6\",\n \"Chi\": \"\u03A7\",\n \"Psi\": \"\u03A8\",\n \"Omega\": \"\u03A9\",\n \"alpha\": \"\u03B1\",\n \"beta\": \"\u03B2\",\n \"gamma\": \"\u03B3\",\n \"delta\": \"\u03B4\",\n \"epsilon\": \"\u03B5\",\n \"zeta\": \"\u03B6\",\n \"eta\": \"\u03B7\",\n \"theta\": \"\u03B8\",\n \"iota\": \"\u03B9\",\n \"kappa\": \"\u03BA\",\n \"lambda\": \"\u03BB\",\n \"mu\": \"\u03BC\",\n \"nu\": \"\u03BD\",\n \"xi\": \"\u03BE\",\n \"omicron\": \"\u03BF\",\n \"pi\": \"\u03C0\",\n \"rho\": \"\u03C1\",\n \"sigmaf\": \"\u03C2\",\n \"sigma\": \"\u03C3\",\n \"tau\": \"\u03C4\",\n \"upsilon\": \"\u03C5\",\n \"phi\": \"\u03C6\",\n \"chi\": \"\u03C7\",\n \"psi\": \"\u03C8\",\n \"omega\": \"\u03C9\",\n \"thetasym\": \"\u03D1\",\n \"upsih\": \"\u03D2\",\n \"piv\": \"\u03D6\",\n \"bull\": \"\u2022\",\n \"hellip\": \"\u2026\",\n \"prime\": \"\u2032\",\n \"Prime\": \"\u2033\",\n \"oline\": \"\u203E\",\n \"frasl\": \"\u2044\",\n \"weierp\": \"\u2118\",\n \"image\": \"\u2111\",\n \"real\": \"\u211C\",\n \"trade\": \"\u2122\",\n \"alefsym\": \"\u2135\",\n \"larr\": \"\u2190\",\n \"uarr\": \"\u2191\",\n \"rarr\": \"\u2192\",\n \"darr\": \"\u2193\",\n \"harr\": \"\u2194\",\n \"crarr\": \"\u21B5\",\n \"lArr\": \"\u21D0\",\n \"uArr\": \"\u21D1\",\n \"rArr\": \"\u21D2\",\n \"dArr\": \"\u21D3\",\n \"hArr\": \"\u21D4\",\n \"forall\": \"\u2200\",\n \"part\": \"\u2202\",\n \"exist\": \"\u2203\",\n \"empty\": \"\u2205\",\n \"nabla\": \"\u2207\",\n \"isin\": \"\u2208\",\n \"notin\": \"\u2209\",\n \"ni\": \"\u220B\",\n \"prod\": \"\u220F\",\n \"sum\": \"\u2211\",\n \"minus\": \"\u2212\",\n \"lowast\": \"\u2217\",\n \"radic\": \"\u221A\",\n \"prop\": \"\u221D\",\n \"infin\": \"\u221E\",\n \"ang\": \"\u2220\",\n \"and\": \"\u2227\",\n \"or\": \"\u2228\",\n \"cap\": \"\u2229\",\n \"cup\": \"\u222A\",\n \"int\": \"\u222B\",\n \"there4\": \"\u2234\",\n \"sim\": \"\u223C\",\n \"cong\": \"\u2245\",\n \"asymp\": \"\u2248\",\n \"ne\": \"\u2260\",\n \"equiv\": \"\u2261\",\n \"le\": \"\u2264\",\n \"ge\": \"\u2265\",\n \"sub\": \"\u2282\",\n \"sup\": \"\u2283\",\n \"nsub\": \"\u2284\",\n \"sube\": \"\u2286\",\n \"supe\": \"\u2287\",\n \"oplus\": \"\u2295\",\n \"otimes\": \"\u2297\",\n \"perp\": \"\u22A5\",\n \"sdot\": \"\u22C5\",\n \"lceil\": \"\u2308\",\n \"rceil\": \"\u2309\",\n \"lfloor\": \"\u230A\",\n \"rfloor\": \"\u230B\",\n \"lang\": \"\u2329\",\n \"rang\": \"\u232A\",\n \"loz\": \"\u25CA\",\n \"spades\": \"\u2660\",\n \"clubs\": \"\u2663\",\n \"hearts\": \"\u2665\",\n \"diams\": \"\u2666\",\n \"quot\": \"\\\"\",\n \"amp\": \"&\",\n \"lt\": \"<\",\n \"gt\": \">\",\n \"OElig\": \"\u0152\",\n \"oelig\": \"\u0153\",\n \"Scaron\": \"\u0160\",\n \"scaron\": \"\u0161\",\n \"Yuml\": \"\u0178\",\n \"circ\": \"\u02C6\",\n \"tilde\": \"\u02DC\",\n \"ensp\": \"\u2002\",\n \"emsp\": \"\u2003\",\n \"thinsp\": \"\u2009\",\n \"zwnj\": \"\u200C\",\n \"zwj\": \"\u200D\",\n \"lrm\": \"\u200E\",\n \"rlm\": \"\u200F\",\n \"ndash\": \"\u2013\",\n \"mdash\": \"\u2014\",\n \"lsquo\": \"\u2018\",\n \"rsquo\": \"\u2019\",\n \"sbquo\": \"\u201A\",\n \"ldquo\": \"\u201C\",\n \"rdquo\": \"\u201D\",\n \"bdquo\": \"\u201E\",\n \"dagger\": \"\u2020\",\n \"Dagger\": \"\u2021\",\n \"permil\": \"\u2030\",\n \"lsaquo\": \"\u2039\",\n \"rsaquo\": \"\u203A\",\n \"euro\": \"\u20AC\"\n}\n", "{\n \"AElig\": \"\u00C6\",\n \"AMP\": \"&\",\n \"Aacute\": \"\u00C1\",\n \"Acirc\": \"\u00C2\",\n \"Agrave\": \"\u00C0\",\n \"Aring\": \"\u00C5\",\n \"Atilde\": \"\u00C3\",\n \"Auml\": \"\u00C4\",\n \"COPY\": \"\u00A9\",\n \"Ccedil\": \"\u00C7\",\n \"ETH\": \"\u00D0\",\n \"Eacute\": \"\u00C9\",\n \"Ecirc\": \"\u00CA\",\n \"Egrave\": \"\u00C8\",\n \"Euml\": \"\u00CB\",\n \"GT\": \">\",\n \"Iacute\": \"\u00CD\",\n \"Icirc\": \"\u00CE\",\n \"Igrave\": \"\u00CC\",\n \"Iuml\": \"\u00CF\",\n \"LT\": \"<\",\n \"Ntilde\": \"\u00D1\",\n \"Oacute\": \"\u00D3\",\n \"Ocirc\": \"\u00D4\",\n \"Ograve\": \"\u00D2\",\n \"Oslash\": \"\u00D8\",\n \"Otilde\": \"\u00D5\",\n \"Ouml\": \"\u00D6\",\n \"QUOT\": \"\\\"\",\n \"REG\": \"\u00AE\",\n \"THORN\": \"\u00DE\",\n \"Uacute\": \"\u00DA\",\n \"Ucirc\": \"\u00DB\",\n \"Ugrave\": \"\u00D9\",\n \"Uuml\": \"\u00DC\",\n \"Yacute\": \"\u00DD\",\n \"aacute\": \"\u00E1\",\n \"acirc\": \"\u00E2\",\n \"acute\": \"\u00B4\",\n \"aelig\": \"\u00E6\",\n \"agrave\": \"\u00E0\",\n \"amp\": \"&\",\n \"aring\": \"\u00E5\",\n \"atilde\": \"\u00E3\",\n \"auml\": \"\u00E4\",\n \"brvbar\": \"\u00A6\",\n \"ccedil\": \"\u00E7\",\n \"cedil\": \"\u00B8\",\n \"cent\": \"\u00A2\",\n \"copy\": \"\u00A9\",\n \"curren\": \"\u00A4\",\n \"deg\": \"\u00B0\",\n \"divide\": \"\u00F7\",\n \"eacute\": \"\u00E9\",\n \"ecirc\": \"\u00EA\",\n \"egrave\": \"\u00E8\",\n \"eth\": \"\u00F0\",\n \"euml\": \"\u00EB\",\n \"frac12\": \"\u00BD\",\n \"frac14\": \"\u00BC\",\n \"frac34\": \"\u00BE\",\n \"gt\": \">\",\n \"iacute\": \"\u00ED\",\n \"icirc\": \"\u00EE\",\n \"iexcl\": \"\u00A1\",\n \"igrave\": \"\u00EC\",\n \"iquest\": \"\u00BF\",\n \"iuml\": \"\u00EF\",\n \"laquo\": \"\u00AB\",\n \"lt\": \"<\",\n \"macr\": \"\u00AF\",\n \"micro\": \"\u00B5\",\n \"middot\": \"\u00B7\",\n \"nbsp\": \"\u00A0\",\n \"not\": \"\u00AC\",\n \"ntilde\": \"\u00F1\",\n \"oacute\": \"\u00F3\",\n \"ocirc\": \"\u00F4\",\n \"ograve\": \"\u00F2\",\n \"ordf\": \"\u00AA\",\n \"ordm\": \"\u00BA\",\n \"oslash\": \"\u00F8\",\n \"otilde\": \"\u00F5\",\n \"ouml\": \"\u00F6\",\n \"para\": \"\u00B6\",\n \"plusmn\": \"\u00B1\",\n \"pound\": \"\u00A3\",\n \"quot\": \"\\\"\",\n \"raquo\": \"\u00BB\",\n \"reg\": \"\u00AE\",\n \"sect\": \"\u00A7\",\n \"shy\": \"\u00AD\",\n \"sup1\": \"\u00B9\",\n \"sup2\": \"\u00B2\",\n \"sup3\": \"\u00B3\",\n \"szlig\": \"\u00DF\",\n \"thorn\": \"\u00FE\",\n \"times\": \"\u00D7\",\n \"uacute\": \"\u00FA\",\n \"ucirc\": \"\u00FB\",\n \"ugrave\": \"\u00F9\",\n \"uml\": \"\u00A8\",\n \"uuml\": \"\u00FC\",\n \"yacute\": \"\u00FD\",\n \"yen\": \"\u00A5\",\n \"yuml\": \"\u00FF\"\n}\n", "'use strict'\n\nmodule.exports = hexadecimal\n\n/* Check if the given character code, or the character\n * code at the first character, is hexadecimal. */\nfunction hexadecimal(character) {\n var code = typeof character === 'string' ? character.charCodeAt(0) : character\n\n return (\n (code >= 97 /* a */ && code <= 102) /* z */ ||\n (code >= 65 /* A */ && code <= 70) /* Z */ ||\n (code >= 48 /* A */ && code <= 57) /* Z */\n )\n}\n", "'use strict'\n\nmodule.exports = decimal\n\n// Check if the given character code, or the character code at the first\n// character, is decimal.\nfunction decimal(character) {\n var code = typeof character === 'string' ? character.charCodeAt(0) : character\n\n return code >= 48 && code <= 57 /* 0-9 */\n}\n", "'use strict'\n\nmodule.exports = alphabetical\n\n/* Check if the given character code, or the character\n * code at the first character, is alphabetical. */\nfunction alphabetical(character) {\n var code = typeof character === 'string' ? character.charCodeAt(0) : character\n\n return (\n (code >= 97 && code <= 122) /* a-z */ ||\n (code >= 65 && code <= 90) /* A-Z */\n )\n}\n", "'use strict'\n\nvar alphabetical = require('is-alphabetical')\nvar decimal = require('is-decimal')\n\nmodule.exports = alphanumerical\n\n/* Check if the given character code, or the character\n * code at the first character, is alphanumerical. */\nfunction alphanumerical(character) {\n return alphabetical(character) || decimal(character)\n}\n", "[\n \"cent\",\n \"copy\",\n \"divide\",\n \"gt\",\n \"lt\",\n \"not\",\n \"para\",\n \"times\"\n]\n", "'use strict'\n\nvar entities = require('character-entities-html4')\nvar legacy = require('character-entities-legacy')\nvar hexadecimal = require('is-hexadecimal')\nvar decimal = require('is-decimal')\nvar alphanumerical = require('is-alphanumerical')\nvar dangerous = require('./dangerous.json')\n\nmodule.exports = encode\nencode.escape = escape\n\nvar own = {}.hasOwnProperty\n\n// List of enforced escapes.\nvar escapes = ['\"', \"'\", '<', '>', '&', '`']\n\n// Map of characters to names.\nvar characters = construct()\n\n// Default escapes.\nvar defaultEscapes = toExpression(escapes)\n\n// Surrogate pairs.\nvar surrogatePair = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g\n\n// Non-ASCII characters.\n// eslint-disable-next-line no-control-regex, unicorn/no-hex-escape\nvar bmp = /[\\x01-\\t\\x0B\\f\\x0E-\\x1F\\x7F\\x81\\x8D\\x8F\\x90\\x9D\\xA0-\\uFFFF]/g\n\n// Encode special characters in `value`.\nfunction encode(value, options) {\n var settings = options || {}\n var subset = settings.subset\n var set = subset ? toExpression(subset) : defaultEscapes\n var escapeOnly = settings.escapeOnly\n var omit = settings.omitOptionalSemicolons\n\n value = value.replace(set, replace)\n\n if (subset || escapeOnly) {\n return value\n }\n\n return value\n .replace(surrogatePair, replaceSurrogatePair)\n .replace(bmp, replace)\n\n function replaceSurrogatePair(pair, pos, val) {\n return toHexReference(\n (pair.charCodeAt(0) - 0xd800) * 0x400 +\n pair.charCodeAt(1) -\n 0xdc00 +\n 0x10000,\n val.charAt(pos + 2),\n omit\n )\n }\n\n function replace(char, pos, val) {\n return one(char, val.charAt(pos + 1), settings)\n }\n}\n\n// Shortcut to escape special characters in HTML.\nfunction escape(value) {\n return encode(value, {escapeOnly: true, useNamedReferences: true})\n}\n\n// Encode `char` according to `options`.\nfunction one(char, next, options) {\n var shortest = options.useShortestReferences\n var omit = options.omitOptionalSemicolons\n var named\n var code\n var numeric\n var decimal\n\n if ((shortest || options.useNamedReferences) && own.call(characters, char)) {\n named = toNamed(characters[char], next, omit, options.attribute)\n }\n\n if (shortest || !named) {\n code = char.charCodeAt(0)\n numeric = toHexReference(code, next, omit)\n\n // Use the shortest numeric reference when requested.\n // A simple algorithm would use decimal for all code points under 100, as\n // those are shorter than hexadecimal:\n //\n // * `c` vs `c` (decimal shorter)\n // * `d` vs `d` (equal)\n //\n // However, because we take `next` into consideration when `omit` is used,\n // And it would be possible that decimals are shorter on bigger values as\n // well if `next` is hexadecimal but not decimal, we instead compare both.\n if (shortest) {\n decimal = toDecimalReference(code, next, omit)\n\n if (decimal.length < numeric.length) {\n numeric = decimal\n }\n }\n }\n\n if (named && (!shortest || named.length < numeric.length)) {\n return named\n }\n\n return numeric\n}\n\n// Transform `code` into an entity.\nfunction toNamed(name, next, omit, attribute) {\n var value = '&' + name\n\n if (\n omit &&\n own.call(legacy, name) &&\n dangerous.indexOf(name) === -1 &&\n (!attribute || (next && next !== '=' && !alphanumerical(next)))\n ) {\n return value\n }\n\n return value + ';'\n}\n\n// Transform `code` into a hexadecimal character reference.\nfunction toHexReference(code, next, omit) {\n var value = '&#x' + code.toString(16).toUpperCase()\n return omit && next && !hexadecimal(next) ? value : value + ';'\n}\n\n// Transform `code` into a decimal character reference.\nfunction toDecimalReference(code, next, omit) {\n var value = '&#' + String(code)\n return omit && next && !decimal(next) ? value : value + ';'\n}\n\n// Create an expression for `characters`.\nfunction toExpression(characters) {\n return new RegExp('[' + characters.join('') + ']', 'g')\n}\n\n// Construct the map.\nfunction construct() {\n var chars = {}\n var name\n\n for (name in entities) {\n chars[entities[name]] = name\n }\n\n return chars\n}\n", "'use strict'\n\n// Characters.\nvar NULL = '\\0'\nvar AMP = '&'\nvar SP = ' '\nvar TB = '\\t'\nvar GR = '`'\nvar DQ = '\"'\nvar SQ = \"'\"\nvar EQ = '='\nvar LT = '<'\nvar GT = '>'\nvar SO = '/'\nvar LF = '\\n'\nvar CR = '\\r'\nvar FF = '\\f'\n\nvar whitespace = [SP, TB, LF, CR, FF]\n// https://html.spec.whatwg.org/#attribute-name-state\nvar name = whitespace.concat(AMP, SO, GT, EQ)\n// https://html.spec.whatwg.org/#attribute-value-(unquoted)-state\nvar unquoted = whitespace.concat(AMP, GT)\nvar unquotedSafe = unquoted.concat(NULL, DQ, SQ, LT, EQ, GR)\n// https://html.spec.whatwg.org/#attribute-value-(single-quoted)-state\nvar singleQuoted = [AMP, SQ]\n// https://html.spec.whatwg.org/#attribute-value-(double-quoted)-state\nvar doubleQuoted = [AMP, DQ]\n\n// Maps of subsets. Each value is a matrix of tuples.\n// The first value causes parse errors, the second is valid.\n// Of both values, the first value is unsafe, and the second is safe.\nmodule.exports = {\n name: [[name, name.concat(DQ, SQ, GR)], [name.concat(NULL, DQ, SQ, LT), name.concat(NULL, DQ, SQ, LT, GR)]],\n unquoted: [[unquoted, unquotedSafe], [unquotedSafe, unquotedSafe]],\n single: [\n [singleQuoted, singleQuoted.concat(DQ, GR)],\n [singleQuoted.concat(NULL), singleQuoted.concat(NULL, DQ, GR)]\n ],\n double: [\n [doubleQuoted, doubleQuoted.concat(SQ, GR)],\n [doubleQuoted.concat(NULL), doubleQuoted.concat(NULL, SQ, GR)]\n ]\n}\n", "/*!\n * repeat-string <https://github.com/jonschlinkert/repeat-string>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\n/**\n * Results cache\n */\n\nvar res = '';\nvar cache;\n\n/**\n * Expose `repeat`\n */\n\nmodule.exports = repeat;\n\n/**\n * Repeat the given `string` the specified `number`\n * of times.\n *\n * **Example:**\n *\n * ```js\n * var repeat = require('repeat-string');\n * repeat('A', 5);\n * //=> AAAAA\n * ```\n *\n * @param {String} `string` The string to repeat\n * @param {Number} `number` The number of times to repeat the string\n * @return {String} Repeated string\n * @api public\n */\n\nfunction repeat(str, num) {\n if (typeof str !== 'string') {\n throw new TypeError('expected a string');\n }\n\n // cover common, quick use cases\n if (num === 1) return str;\n if (num === 2) return str + str;\n\n var max = str.length * num;\n if (cache !== str || typeof cache === 'undefined') {\n cache = str;\n res = '';\n } else if (res.length >= max) {\n return res.substr(0, max);\n }\n\n while (max > res.length && num > 1) {\n if (num & 1) {\n res += str;\n }\n\n num >>= 1;\n str += str;\n }\n\n res += str;\n res = res.substr(0, max);\n return res;\n}\n", "'use strict'\n\nvar xtend = require('xtend')\nvar svg = require('property-information/svg')\nvar find = require('property-information/find')\nvar spaces = require('space-separated-tokens').stringify\nvar commas = require('comma-separated-tokens').stringify\nvar entities = require('stringify-entities')\nvar all = require('./all')\nvar constants = require('./constants')\nconst repeat = require('repeat-string')\n\nmodule.exports = element\n\n/* Constants. */\nvar emptyString = ''\n\n/* Characters. */\nvar space = ' '\nvar quotationMark = '\"'\nvar apostrophe = \"'\"\nvar equalsTo = '='\nvar lessThan = '<'\nvar greaterThan = '>'\nvar slash = '/'\nvar newLine = '\\n'\n\n/* Stringify an element `node`. */\nfunction element(ctx, node, index, parent, printWidthOffset, innerTextLength) {\n var parentSchema = ctx.schema\n var name = node.tagName\n var value = ''\n var selfClosing\n var close\n var omit\n var root = node\n var content\n var attrs\n var indentLevel = getNodeData(node, 'indentLevel', 0)\n var printContext = {\n offset: printWidthOffset,\n wrapAttributes: false,\n indentLevel\n }\n var isVoid = ctx.voids.indexOf(name) !== -1\n var ignoreAttrCollapsing =\n getNodeData(node, 'ignore', false) || getNodeData(node, 'preserveAttrWrapping', false)\n\n if (parentSchema.space === 'html' && name === 'svg') {\n ctx.schema = svg\n }\n\n if (ctx.schema.space === 'svg') {\n omit = false\n close = true\n selfClosing = ctx.closeEmpty\n } else {\n omit = ctx.omit\n close = ctx.close\n selfClosing = isVoid\n }\n\n // check for 'selfClosing' property set by hast-util-from-webparser package\n // in order to support custom self-closing elements\n if (selfClosing === false) {\n selfClosing = getNodeData(node, 'selfClosing', false)\n }\n\n // <\n printContext.offset += lessThan.length\n\n // tagName length\n printContext.offset += node.tagName.length\n\n // / closing tag\n if (selfClosing && !isVoid) {\n printContext.offset += slash.length\n }\n\n // >\n printContext.offset += greaterThan.length\n\n const propertyCount = Object.keys(node.properties).length\n\n // force to wrap attributes on multiple lines when the node contains\n // more than one attribute\n if (propertyCount > 1 && ctx.wrapAttributes) {\n printContext.wrapAttributes = true\n }\n\n // one space before each attribute\n if (propertyCount) {\n printContext.offset += propertyCount * space.length\n }\n\n // represent the length of the inner text of the node\n printContext.offset += innerTextLength\n\n attrs = attributes(ctx, node.properties, printContext, ignoreAttrCollapsing)\n\n const shouldCollapse = ignoreAttrCollapsing === false && printContext.wrapAttributes\n\n content = all(ctx, root)\n\n /* If the node is categorised as void, but it has\n * children, remove the categorisation. This\n * enables for example `menuitem`s, which are\n * void in W3C HTML but not void in WHATWG HTML, to\n * be stringified properly. */\n selfClosing = content ? false : selfClosing\n\n if (attrs || !omit || !omit.opening(node, index, parent)) {\n value = lessThan + name\n\n if (attrs) {\n // add no space after tagName when element is collapsed\n if (shouldCollapse) {\n value += attrs\n } else {\n value += space + attrs\n }\n }\n\n let selfClosed = false\n\n // check if the should close self-closing elements\n if (selfClosing && close) {\n if ((!ctx.tightClose || attrs.charAt(attrs.length - 1) === slash) && !shouldCollapse) {\n value += space\n }\n\n if (shouldCollapse) {\n value += newLine + repeat(ctx.tabWidth, printContext.indentLevel)\n }\n\n selfClosed = true\n value += slash\n }\n\n // allow any element to self close itself except known HTML void elements\n else if (selfClosing && !isVoid) {\n if (shouldCollapse) {\n value += newLine + repeat(ctx.tabWidth, printContext.indentLevel)\n }\n\n selfClosed = true\n value += slash\n }\n\n // add newline when element should be wrappend on multiple lines and when\n // it's no self-closing element because in that case the newline was already added before the slash (/)\n if (shouldCollapse && !selfClosed) {\n value += newLine + repeat(ctx.tabWidth, printContext.indentLevel)\n }\n\n value += greaterThan\n }\n\n value += content\n\n if (!selfClosing && (!omit || !omit.closing(node, index, parent))) {\n value += lessThan + slash + name + greaterThan\n }\n\n ctx.schema = parentSchema\n\n return value\n}\n\n/* Stringify all attributes. */\nfunction attributes(ctx, props, printContext, ignoreIndent) {\n var values = []\n var key\n var value\n var result\n var length\n var index\n var last\n\n for (key in props) {\n value = props[key]\n\n if (value == null) {\n continue\n }\n\n result = attribute(ctx, key, value)\n\n printContext.offset += result.length\n\n if (ignoreIndent === false && printContext.offset > ctx.printWidth) {\n printContext.wrapAttributes = true\n }\n\n if (result) {\n values.push(result)\n }\n }\n\n length = values.length\n index = -1\n\n while (++index < length) {\n result = values[index]\n last = null\n\n /* In tight mode, don\u2019t add a space after quoted attributes. */\n if (last !== quotationMark && last !== apostrophe) {\n if (printContext.wrapAttributes) {\n values[index] = newLine + repeat(ctx.tabWidth, printContext.indentLevel + 1) + result\n } else if (index !== length - 1) {\n values[index] = result + space\n } else {\n values[index] = result\n }\n }\n }\n\n return values.join(emptyString)\n}\n\n/* Stringify one attribute. */\nfunction attribute(ctx, key, value) {\n var schema = ctx.schema\n var info = find(schema, key)\n var name = info.attribute\n\n if (value == null || (typeof value === 'number' && isNaN(value)) || (value === false && info.boolean)) {\n return emptyString\n }\n\n name = attributeName(ctx, name)\n\n if ((value === true && info.boolean) || (value === true && info.overloadedBoolean)) {\n return name\n }\n\n return name + attributeValue(ctx, key, value, info)\n}\n\n/* Stringify the attribute name. */\nfunction attributeName(ctx, name) {\n // Always encode without parse errors in non-HTML.\n var valid = ctx.schema.space === 'html' ? ctx.valid : 1\n var subset = constants.name[valid][ctx.safe]\n\n return entities(name, xtend(ctx.entities, { subset: subset }))\n}\n\n/* Stringify the attribute value. */\nfunction attributeValue(ctx, key, value, info) {\n var quote = ctx.quote\n\n if (typeof value === 'object' && 'length' in value) {\n /* `spaces` doesn\u2019t accept a second argument, but it\u2019s\n * given here just to keep the code cleaner. */\n value = (info.commaSeparated ? commas : spaces)(value, {\n padLeft: !ctx.tightLists\n })\n }\n\n value = String(value)\n\n // When attr has no value we avoid quoting\n if (value === '') {\n return value\n } else {\n value = equalsTo + quote + value + quote\n }\n\n return value\n}\n\nfunction getNodeData(node, key, defaultValue) {\n let data = node.data || {}\n return data[key] || defaultValue\n}\n", "'use strict'\n\nmodule.exports = doctype\n\n/* Stringify a doctype `node`. */\nfunction doctype(ctx, node) {\n var sep = ctx.tightDoctype ? '' : ' '\n var name = node.name\n var pub = node.public\n var sys = node.system\n var val = ['<!doctype']\n\n if (name) {\n val.push(sep, name)\n\n if (pub != null) {\n val.push(' public', sep, smart(pub))\n } else if (sys != null) {\n val.push(' system')\n }\n\n if (sys != null) {\n val.push(sep, smart(sys))\n }\n }\n\n return val.join('') + '>'\n}\n\nfunction smart(value) {\n var quote = value.indexOf('\"') === -1 ? '\"' : \"'\"\n return quote + value + quote\n}\n", "'use strict'\n\nmodule.exports = comment\n\n/* Stringify a comment `node`. */\nfunction comment(ctx, node) {\n return '<!--' + node.value + '-->'\n}\n", "'use strict'\n\nmodule.exports = raw\n\n/* Stringify `raw`. */\nfunction raw(ctx, node) {\n return node.value\n}\n", "'use strict'\n\nmodule.exports = one\n\nvar own = {}.hasOwnProperty\n\nvar handlers = {}\n\nhandlers.root = require('./all')\nhandlers.text = require('./text')\nhandlers.element = require('./element')\nhandlers.doctype = require('./doctype')\nhandlers.comment = require('./comment')\nhandlers.raw = require('./raw')\n\n/* Stringify `node`. */\nfunction one(ctx, node, index, parent, printWidthOffset, innerTextLength) {\n var type = node && node.type\n\n if (!type) {\n throw new Error('Expected node, not `' + node + '`')\n }\n\n if (!own.call(handlers, type)) {\n throw new Error('Cannot compile unknown node `' + type + '`')\n }\n\n return handlers[type](ctx, node, index, parent, printWidthOffset, innerTextLength)\n}\n", "'use strict'\n\nvar html = require('property-information/html')\nvar svg = require('property-information/svg')\nvar voids = require('html-void-elements')\nvar omission = require('./omission')\nvar one = require('./one')\nconst repeat = require('repeat-string')\n\nmodule.exports = toHTML\n\n/* Characters. */\nvar DQ = '\"'\nvar SQ = \"'\"\n\n/* Stringify the given HAST node. */\nfunction toHTML(node, options) {\n var settings = options || {}\n var quote = settings.singleQuote ? SQ : DQ\n var printWidth = settings.printWidth === undefined ? 80 : settings.printWidth\n var useTabs = settings.useTabs\n var tabWidth = settings.tabWidth || 2\n var wrapAttributes = settings.wrapAttributes\n\n if (useTabs) {\n tabWidth = '\\t'\n } else if (typeof tabWidth === 'number') {\n tabWidth = repeat(' ', tabWidth)\n }\n\n return one(\n {\n valid: settings.allowParseErrors ? 0 : 1,\n safe: settings.allowDangerousCharacters ? 0 : 1,\n schema: settings.space === 'svg' ? svg : html,\n omit: settings.omitOptionalTags && omission,\n quote: quote,\n printWidth: printWidth,\n tabWidth: tabWidth,\n wrapAttributes: wrapAttributes,\n tightDoctype: Boolean(settings.tightDoctype),\n tightLists: settings.tightCommaSeparatedLists,\n voids: settings.voids || voids.concat(),\n entities: settings.entities || {},\n close: settings.closeSelfClosing,\n tightClose: settings.tightSelfClosing,\n closeEmpty: settings.closeEmptyElements\n },\n node\n )\n}\n", "'use strict'\nmodule.exports = require('./lib')\n", "'use strict'\n\nconst xtend = require('xtend')\nconst toHTML = require('@starptech/prettyhtml-hast-to-html')\n\nmodule.exports = stringify\n\nfunction stringify(config) {\n const settings = xtend(config, this.data('settings'))\n\n this.Compiler = compiler\n\n function compiler(tree) {\n return toHTML(tree, settings)\n }\n}\n", "'use strict'\n\nmodule.exports = collapse\n\n// `collapse(' \\t\\nbar \\nbaz\\t') // ' bar baz '`\nfunction collapse(value) {\n return String(value).replace(/\\s+/g, ' ')\n}\n", "'use strict'\n\nmodule.exports = iterate\n\nvar own = {}.hasOwnProperty\n\nfunction iterate(values, callback, context) {\n var index = -1\n var result\n\n if (!values) {\n throw new Error('Iterate requires that |this| not be ' + values)\n }\n\n if (!own.call(values, 'length')) {\n throw new Error('Iterate requires that |this| has a `length`')\n }\n\n if (typeof callback !== 'function') {\n throw new Error('`callback` must be a function')\n }\n\n /* The length might change, so we do not cache it. */\n while (++index < values.length) {\n /* Skip missing values. */\n if (!(index in values)) {\n continue\n }\n\n result = callback.call(context, values[index], index, values)\n\n /* If `callback` returns a `number`, move `index` over to\n * `number`. */\n if (typeof result === 'number') {\n /* Make sure that negative numbers do not break the loop. */\n if (result < 0) {\n index = 0\n }\n\n index = result - 1\n }\n }\n}\n", "'use strict'\n\nvar iterate = require('array-iterate')\n\nmodule.exports = modifierFactory\n\n// Turn `callback` into a child-modifier accepting a parent. See\n// `array-iterate` for more info.\nfunction modifierFactory(callback) {\n return iteratorFactory(wrapperFactory(callback))\n}\n\n// Turn `callback` into a `iterator' accepting a parent.\nfunction iteratorFactory(callback) {\n return iterator\n\n function iterator(parent) {\n var children = parent && parent.children\n\n if (!children) {\n throw new Error('Missing children in `parent` for `modifier`')\n }\n\n return iterate(children, callback, parent)\n }\n}\n\n// Pass the context as the third argument to `callback`.\nfunction wrapperFactory(callback) {\n return wrapper\n\n function wrapper(value, index) {\n return callback(value, index, this)\n }\n}\n", "'use strict'\n\nvar own = {}.hasOwnProperty\n\nmodule.exports = hasProperty\n\n// Check if `node` has a set `name` property.\nfunction hasProperty(node, name) {\n var props\n var value\n\n if (!node || !name || typeof node !== 'object' || node.type !== 'element') {\n return false\n }\n\n props = node.properties\n value = props && own.call(props, name) && props[name]\n\n return value !== null && value !== undefined && value !== false\n}\n", "'use strict'\n\nvar is = require('hast-util-is-element')\n\nmodule.exports = embedded\n\nvar names = [\n 'audio',\n 'canvas',\n 'embed',\n 'iframe',\n 'img',\n 'math',\n 'object',\n 'picture',\n 'svg',\n 'video'\n]\n\nfunction embedded(node) {\n return is(node, names)\n}\n", "/**\n * @fileoverview\n * Check if a `link` element is \u201CBody OK\u201D.\n * @longdescription\n * ## Use\n *\n * ```js\n * var h = require('hastscript')\n * var ok = require('hast-util-is-body-ok-link')\n *\n * ok(h('link', {itemProp: 'foo'})) //=> true\n * ok(h('link', {rel: ['stylesheet'], href: 'index.css'})) //=> true\n * ok(h('link', {rel: ['author'], href: 'index.css'})) //=> false\n * ```\n *\n * ## API\n *\n * ### `isBodyOkLink(node)`\n *\n * * Return `true` for `link` elements with an `itemProp`\n * * Return `true` for `link` elements with a `rel` list where one or more\n * entries are `pingback`, `prefetch`, or `stylesheet`.\n */\n\n'use strict'\n\nvar is = require('hast-util-is-element')\nvar has = require('hast-util-has-property')\n\nmodule.exports = ok\n\nvar list = ['pingback', 'prefetch', 'stylesheet']\n\nfunction ok(node) {\n var length\n var index\n var rel\n\n if (!is(node, 'link')) {\n return false\n }\n\n if (has(node, 'itemProp')) {\n return true\n }\n\n rel = (node.properties || {}).rel || []\n length = rel.length\n index = -1\n\n if (rel.length === 0) {\n return false\n }\n\n while (++index < length) {\n if (list.indexOf(rel[index]) === -1) {\n return false\n }\n }\n\n return true\n}\n", "module.exports = [\n 'a',\n 'abbr',\n 'acronym',\n 'b',\n 'basefont',\n 'big',\n 'bdi',\n 'bdo',\n 'blink',\n 'button',\n 'cite',\n 'code',\n 'data',\n 'del',\n 'dfn',\n 'em',\n 'font',\n 'i',\n 'input',\n 'ins',\n 'kbd',\n 'keygen',\n 'label',\n 'mark',\n 'marquee',\n 'meter',\n 'nobr',\n 'output',\n 'progress',\n 'q',\n 'ruby',\n 's',\n 'samp',\n 'select',\n 'small',\n 'spacer',\n 'span',\n 'strong',\n 'sub',\n 'sup',\n 'textarea',\n 'time',\n 'tt',\n 'u',\n 'var',\n // vue\n 'template',\n // angular\n 'ng-container',\n 'ng-template'\n]\n", "/**\n * @fileoverview\n * Collapse whitespace.\n *\n * Normally, collapses to a single space. If `newlines: true`,\n * collapses white-space containing newlines to `'\\n'` instead\n * of `' '`.\n * @example\n * <h1>Heading</h1>\n * <p><strong>This</strong> and <em>that</em></p>\n */\n\n'use strict'\n\nvar collapseWhiteSpace = require('collapse-white-space')\nvar whitespaceSensitive = require('html-whitespace-sensitive-tag-names')\nvar is = require('unist-util-is')\nvar modify = require('unist-util-modify-children')\nvar element = require('hast-util-is-element')\nvar has = require('hast-util-has-property')\nvar embedded = require('hast-util-embedded')\nvar bodyOK = require('hast-util-is-body-ok-link')\nvar list = require('./list')\n\nmodule.exports = collapse\n\nfunction collapse(options) {\n return transform\n function transform(tree) {\n return minify(tree, options || {})\n }\n}\n\nfunction minify(tree, options) {\n var whitespace = options.newlines ? collapseToNewLines : collapseWhiteSpace\n var modifier = modify(visitor)\n var inside = false\n var seen = false\n\n visitor(tree)\n\n return tree\n\n function visitor(node, index, parent) {\n var head\n var prev\n var next\n var value\n var start\n var end\n\n // don't collpase when ignore or preserve-whitespace flag was set\n if (node.data && (node.data.ignore || node.data.preserveWhitespace)) {\n return\n }\n\n if (is('text', node)) {\n prev = parent.children[index - 1]\n next = parent.children[index + 1]\n\n value = whitespace(node.value)\n end = value.length\n start = 0\n\n if (empty(value.charAt(0)) && viable(prev)) {\n start++\n }\n\n if (empty(value.charAt(end - 1)) && viable(next)) {\n end--\n }\n\n value = value.slice(start, end)\n\n /* Remove the node if it\u2019s collapsed entirely. */\n if (!value) {\n parent.children.splice(index, 1)\n\n return index\n }\n\n node.value = value\n }\n\n if (!seen && !inside) {\n head = element(node, 'head')\n inside = head\n seen = head\n }\n\n if (node.children && !element(node, whitespaceSensitive)) {\n modifier(node)\n }\n\n if (head) {\n inside = false\n }\n }\n\n function viable(node) {\n return !node || inside || !collapsable(node)\n }\n}\n\n/* Check if `node` is collapsable. */\nfunction collapsable(node) {\n return (\n is('text', node) ||\n element(node, list) ||\n embedded(node) ||\n bodyOK(node) ||\n (element(node, 'meta') && has(node, 'itemProp'))\n )\n}\n\n/* Collapse to spaces, or newlines if they\u2019re in a run. */\nfunction collapseToNewLines(value) {\n var result = String(value).replace(/\\s+/g, function($0) {\n return $0.indexOf('\\n') === -1 ? ' ' : '\\n'\n })\n\n return result\n}\n\nfunction empty(character) {\n return character === ' ' || character === '\\n'\n}\n", "'use strict'\n\nmodule.exports = convert\n\nfunction convert(test) {\n if (typeof test === 'string') {\n return typeFactory(test)\n }\n\n if (test === null || test === undefined) {\n return ok\n }\n\n if (typeof test === 'object') {\n return ('length' in test ? anyFactory : matchesFactory)(test)\n }\n\n if (typeof test === 'function') {\n return test\n }\n\n throw new Error('Expected function, string, or object as test')\n}\n\nfunction convertAll(tests) {\n var results = []\n var length = tests.length\n var index = -1\n\n while (++index < length) {\n results[index] = convert(tests[index])\n }\n\n return results\n}\n\n// Utility assert each property in `test` is represented in `node`, and each\n// values are strictly equal.\nfunction matchesFactory(test) {\n return matches\n\n function matches(node) {\n var key\n\n for (key in test) {\n if (node[key] !== test[key]) {\n return false\n }\n }\n\n return true\n }\n}\n\nfunction anyFactory(tests) {\n var checks = convertAll(tests)\n var length = checks.length\n\n return matches\n\n function matches() {\n var index = -1\n\n while (++index < length) {\n if (checks[index].apply(this, arguments)) {\n return true\n }\n }\n\n return false\n }\n}\n\n// Utility to convert a string into a function which checks a given node\u2019s type\n// for said string.\nfunction typeFactory(test) {\n return type\n\n function type(node) {\n return Boolean(node && node.type === test)\n }\n}\n\n// Utility to return true.\nfunction ok() {\n return true\n}\n", "'use strict'\n\nmodule.exports = visitParents\n\nvar convert = require('unist-util-is/convert')\n\nvar CONTINUE = true\nvar SKIP = 'skip'\nvar EXIT = false\n\nvisitParents.CONTINUE = CONTINUE\nvisitParents.SKIP = SKIP\nvisitParents.EXIT = EXIT\n\nfunction visitParents(tree, test, visitor, reverse) {\n var is\n\n if (typeof test === 'function' && typeof visitor !== 'function') {\n reverse = visitor\n visitor = test\n test = null\n }\n\n is = convert(test)\n\n one(tree, null, [])\n\n // Visit a single node.\n function one(node, index, parents) {\n var result = []\n var subresult\n\n if (!test || is(node, index, parents[parents.length - 1] || null)) {\n result = toResult(visitor(node, parents))\n\n if (result[0] === EXIT) {\n return result\n }\n }\n\n if (node.children && result[0] !== SKIP) {\n subresult = toResult(all(node.children, parents.concat(node)))\n return subresult[0] === EXIT ? subresult : result\n }\n\n return result\n }\n\n // Visit children in `parent`.\n function all(children, parents) {\n var min = -1\n var step = reverse ? -1 : 1\n var index = (reverse ? children.length : min) + step\n var result\n\n while (index > min && index < children.length) {\n result = one(children[index], index, parents)\n\n if (result[0] === EXIT) {\n return result\n }\n\n index = typeof result[1] === 'number' ? result[1] : index + step\n }\n }\n}\n\nfunction toResult(value) {\n if (value !== null && typeof value === 'object' && 'length' in value) {\n return value\n }\n\n if (typeof value === 'number') {\n return [CONTINUE, value]\n }\n\n return [value]\n}\n", "'use strict'\n\nmodule.exports = visit\n\nvar visitParents = require('unist-util-visit-parents')\n\nvar CONTINUE = visitParents.CONTINUE\nvar SKIP = visitParents.SKIP\nvar EXIT = visitParents.EXIT\n\nvisit.CONTINUE = CONTINUE\nvisit.SKIP = SKIP\nvisit.EXIT = EXIT\n\nfunction visit(tree, test, visitor, reverse) {\n if (typeof test === 'function' && typeof visitor !== 'function') {\n reverse = visitor\n visitor = test\n test = null\n }\n\n visitParents(tree, test, overload, reverse)\n\n function overload(node, parents) {\n var parent = parents[parents.length - 1]\n var index = parent ? parent.children.indexOf(node) : null\n return visitor(node, index, parent)\n }\n}\n", "/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used to compose bitmasks for comparison styles. */\nvar UNORDERED_COMPARE_FLAG = 1,\n PARTIAL_COMPARE_FLAG = 2;\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/,\n reLeadingDot = /^\\./,\n rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n return freeProcess && freeProcess.binding('util');\n } catch (e) {}\n}());\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Adds the key-value `pair` to `map`.\n *\n * @private\n * @param {Object} map The map to modify.\n * @param {Array} pair The key-value pair to add.\n * @returns {Object} Returns `map`.\n */\nfunction addMapEntry(map, pair) {\n // Don't return `map.set` because it's not chainable in IE 11.\n map.set(pair[0], pair[1]);\n return map;\n}\n\n/**\n * Adds `value` to `set`.\n *\n * @private\n * @param {Object} set The set to modify.\n * @param {*} value The value to add.\n * @returns {Object} Returns `set`.\n */\nfunction addSetEntry(set, value) {\n // Don't return `set.add` because it's not chainable in IE 11.\n set.add(value);\n return set;\n}\n\n/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array ? array.length : 0;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\n/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array ? array.length : 0;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\n/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array ? array.length : 0;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n // Many host objects are `Object` objects that can coerce to strings\n // despite having improperly defined `toString` methods.\n var result = false;\n if (value != null && typeof value.toString != 'function') {\n try {\n result = !!(value + '');\n } catch (e) {}\n }\n return result;\n}\n\n/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n Symbol = root.Symbol,\n Uint8Array = root.Uint8Array,\n getPrototype = overArg(Object.getPrototypeOf, Object),\n objectCreate = Object.create,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols,\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n nativeKeys = overArg(Object.keys, Object);\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView'),\n Map = getNative(root, 'Map'),\n Promise = getNative(root, 'Promise'),\n Set = getNative(root, 'Set'),\n WeakMap = getNative(root, 'WeakMap'),\n nativeCreate = getNative(Object, 'create');\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n return this.has(key) && delete this.__data__[key];\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries ? entries.length : 0;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n return getMapData(this, key)['delete'](key);\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n getMapData(this, key).set(key, value);\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values ? values.length : 0;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\n/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n this.__data__ = new ListCache(entries);\n}\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n}\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n return this.__data__['delete'](key);\n}\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var cache = this.__data__;\n if (cache instanceof ListCache) {\n var pairs = cache.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n return this;\n }\n cache = this.__data__ = new MapCache(pairs);\n }\n cache.set(key, value);\n return this;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n // Safari 9 makes `arguments.length` enumerable in strict mode.\n var result = (isArray(value) || isArguments(value))\n ? baseTimes(value.length, String)\n : [];\n\n var length = result.length,\n skipIndexes = !!length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n object[key] = value;\n }\n}\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n}\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @param {boolean} [isFull] Specify a clone including symbols.\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, isDeep, isFull, customizer, key, object, stack) {\n var result;\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n if (isHostObject(value)) {\n return object ? value : {};\n }\n result = initCloneObject(isFunc ? {} : value);\n if (!isDeep) {\n return copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, baseClone, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (!isArr) {\n var props = isFull ? getAllKeys(value) : keys(value);\n }\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, isDeep, isFull, customizer, key, value, stack));\n });\n return result;\n}\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} prototype The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nfunction baseCreate(proto) {\n return isObject(proto) ? objectCreate(proto) : {};\n}\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = isKey(path, object) ? [path] : castPath(path);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\n/**\n * The base implementation of `getTag`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n return objectToString.call(value);\n}\n\n/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {boolean} [bitmask] The bitmask of comparison flags.\n * The bitmask may be composed of the following flags:\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, customizer, bitmask, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack);\n}\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {number} [bitmask] The bitmask of comparison flags. See `baseIsEqual`\n * for more details.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = arrayTag,\n othTag = arrayTag;\n\n if (!objIsArr) {\n objTag = getTag(object);\n objTag = objTag == argsTag ? objectTag : objTag;\n }\n if (!othIsArr) {\n othTag = getTag(other);\n othTag = othTag == argsTag ? objectTag : othTag;\n }\n var objIsObj = objTag == objectTag && !isHostObject(object),\n othIsObj = othTag == objectTag && !isHostObject(other),\n isSameTag = objTag == othTag;\n\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, equalFunc, customizer, bitmask, stack)\n : equalByTag(object, other, objTag, equalFunc, customizer, bitmask, stack);\n }\n if (!(bitmask & PARTIAL_COMPARE_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, customizer, bitmask, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, equalFunc, customizer, bitmask, stack);\n}\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[objectToString.call(value)];\n}\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, undefined, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG);\n };\n}\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value) {\n return isArray(value) ? value : stringToPath(value);\n}\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var result = new buffer.constructor(buffer.length);\n buffer.copy(result);\n return result;\n}\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\n/**\n * Creates a clone of `map`.\n *\n * @private\n * @param {Object} map The map to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned map.\n */\nfunction cloneMap(map, isDeep, cloneFunc) {\n var array = isDeep ? cloneFunc(mapToArray(map), true) : mapToArray(map);\n return arrayReduce(array, addMapEntry, new map.constructor);\n}\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\n/**\n * Creates a clone of `set`.\n *\n * @private\n * @param {Object} set The set to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned set.\n */\nfunction cloneSet(set, isDeep, cloneFunc) {\n var array = isDeep ? cloneFunc(setToArray(set), true) : setToArray(set);\n return arrayReduce(array, addSetEntry, new set.constructor);\n}\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\n/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n assignValue(object, key, newValue === undefined ? source[key] : newValue);\n }\n return object;\n}\n\n/**\n * Copies own symbol properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} customizer The function to customize comparisons.\n * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`\n * for more details.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, equalFunc, customizer, bitmask, stack) {\n var isPartial = bitmask & PARTIAL_COMPARE_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & UNORDERED_COMPARE_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!seen.has(othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) {\n return seen.add(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, customizer, bitmask, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} customizer The function to customize comparisons.\n * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`\n * for more details.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & PARTIAL_COMPARE_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= UNORDERED_COMPARE_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Function} customizer The function to customize comparisons.\n * @param {number} bitmask The bitmask of comparison flags. See `baseIsEqual`\n * for more details.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, equalFunc, customizer, bitmask, stack) {\n var isPartial = bitmask & PARTIAL_COMPARE_FLAG,\n objProps = keys(object),\n objLength = objProps.length,\n othProps = keys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, customizer, bitmask, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * Creates an array of the own enumerable symbol properties of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = nativeGetSymbols ? overArg(nativeGetSymbols, Object) : stubArray;\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11,\n// for data views in Edge < 14, and promises in Node.js.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = objectToString.call(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : undefined;\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = isKey(path, object) ? [path] : castPath(path);\n\n var result,\n index = -1,\n length = path.length;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result) {\n return result;\n }\n var length = object ? object.length : 0;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, cloneFunc, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return cloneMap(object, isDeep, cloneFunc);\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return cloneSet(object, isDeep, cloneFunc);\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\n/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoize(function(string) {\n string = toString(string);\n\n var result = [];\n if (reLeadingDot.test(string)) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, string) {\n result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result);\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Assign cache to `_.memoize`.\nmemoize.Cache = MapCache;\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\n/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\n/**\n * Creates a function that invokes `func` with the arguments of the created\n * function. If `func` is a property name, the created function returns the\n * property value for a given element. If `func` is an array or object, the\n * created function returns `true` for elements that contain the equivalent\n * source properties, otherwise it returns `false`.\n *\n * @static\n * @since 4.0.0\n * @memberOf _\n * @category Util\n * @param {*} [func=_.identity] The value to convert to a callback.\n * @returns {Function} Returns the callback.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, _.iteratee(['user', 'fred']));\n * // => [{ 'user': 'fred', 'age': 40 }]\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, _.iteratee('user'));\n * // => ['barney', 'fred']\n *\n * // Create custom iteratee shorthands.\n * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n * return !_.isRegExp(func) ? iteratee(func) : function(string) {\n * return func.test(string);\n * };\n * });\n *\n * _.filter(['abc', 'def'], /ef/);\n * // => ['def']\n */\nfunction iteratee(func) {\n return baseIteratee(typeof func == 'function' ? func : baseClone(func, true));\n}\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\n/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\n/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = iteratee;\n", "/**\n * @author Richard Smith-Unna\n * @copyright 2016 Richard Smith-Unnar\n * @license MIT\n * @module unist:find\n * @fileoverview Unist node finder\n */\n\n'use strict'\n\nvar visit = require('unist-util-visit')\nvar iteratee = require('lodash.iteratee')\n\n/**\n * Find\n *\n * @param {Node} tree - Root node\n * @param {string|object|function} [condition] - Condition to match node.\n */\nfunction find (tree, condition) {\n if (!tree) throw new Error('unist-find requires a tree to search')\n if (!condition) throw new Error('unist-find requires a condition')\n\n var predicate = iteratee(condition)\n var result\n\n visit(tree, function (node) {\n if (predicate(node)) {\n result = node\n return false\n }\n })\n\n return result\n}\n\n/*\n * Expose.\n */\nmodule.exports = find\n", "/**\n * @fileoverview\n * Get the plain-text value of a hast node.\n * @longdescription\n * ## Use\n *\n * ```js\n * var h = require('hastscript')\n * var toString = require('hast-util-to-string')\n *\n * toString(h('p', 'Alpha'))\n * //=> 'Alpha'\n * toString(h('div', [h('b', 'Bold'), ' and ', h('i', 'italic'), '.']))\n * //=> 'Bold and italic.'\n * ```\n *\n * ## API\n *\n * ### `toString(node)`\n *\n * Transform a node to a string.\n */\n\n'use strict'\n\nmodule.exports = toString\n\nfunction toString(node) {\n // \u201CThe concatenation of data of all the Text node descendants of the context\n // object, in tree order.\u201D\n if ('children' in node) {\n return all(node)\n }\n\n // \u201CContext object\u2019s data.\u201D\n return 'value' in node ? node.value : ''\n}\n\nfunction one(node) {\n if (node.type === 'text') {\n return node.value\n }\n\n return node.children ? all(node) : ''\n}\n\nfunction all(node) {\n var children = node.children\n var length = children.length\n var index = -1\n var result = []\n\n while (++index < length) {\n result[index] = one(children[index])\n }\n\n return result.join('')\n}\n", "'use strict'\n\nconst unclosedExpression = 'Unclosed expression.'\nconst unclosedTemplateLiteral = 'Unclosed ES6 template literal.'\nconst unexpectedCharInExpression = 'Unexpected character %1.'\n\n/**\n * Escape special characters in a given string, in preparation to create a regex.\n *\n * @param {string} str - Raw string\n * @returns {string} Escaped string.\n */\nconst escapeStr = str => str.replace(/(?=[-[\\](){^*+?.$|\\\\])/g, '\\\\')\n\nconst $_ES6_BQ = '`'\n\n/*\n * Mini-parser for expressions.\n * The main pourpose of this module is to find the end of an expression\n * and return its text without the enclosing brackets.\n * Does not works with comments, but supports ES6 template strings.\n */\n/**\n * @exports exprExtr\n */\nconst S_SQ_STR = /'[^'\\n\\r\\\\]*(?:\\\\(?:\\r\\n?|[\\S\\s])[^'\\n\\r\\\\]*)*'/.source\n/**\n * Matches double quoted JS strings taking care about nested quotes\n * and EOLs (escaped EOLs are Ok).\n *\n * @const\n * @private\n */\nconst S_STRING = `${S_SQ_STR}|${S_SQ_STR.replace(/'/g, '\"')}`\n/**\n * Regex cache\n *\n * @type {Object.<string, RegExp>}\n * @const\n * @private\n */\nconst reBr = {}\n/**\n * Makes an optimal regex that matches quoted strings, brackets, backquotes\n * and the closing brackets of an expression.\n *\n * @param {string} b - Closing brackets\n * @returns {RegExp}\n */\nfunction _regex(b) {\n let re = reBr[b]\n if (!re) {\n let s = escapeStr(b)\n if (b.length > 1) {\n s = s + '|['\n } else {\n s = /[{}[\\]()]/.test(b) ? '[' : `[${s}`\n }\n reBr[b] = re = new RegExp(`${S_STRING}|${s}\\`/\\\\{}[\\\\]()]`, 'g')\n }\n return re\n}\n\n/**\n * Searches the next backquote that signals the end of the ES6 Template Literal\n * or the \"${\" sequence that starts a JS expression, skipping any escaped\n * character.\n *\n * @param {string} code - Whole code\n * @param {number} pos - The start position of the template\n * @param {string[]} stack - To save nested ES6 TL count\n * @returns {number} The end of the string (-1 if not found)\n */\nfunction skipES6TL(code, pos, stack) {\n // we are in the char following the backquote (`),\n // find the next unescaped backquote or the sequence \"${\"\n const re = /[`$\\\\]/g\n let c\n while (((re.lastIndex = pos), re.exec(code))) {\n pos = re.lastIndex\n c = code[pos - 1]\n if (c === '`') {\n return pos\n }\n if (c === '$' && code[pos++] === '{') {\n stack.push($_ES6_BQ, '}')\n return pos\n }\n // else this is an escaped char\n }\n throw formatError(code, unclosedTemplateLiteral, pos)\n}\n\n// safe characters to precced a regex (including `=>`, `**`, and `...`)\nconst beforeReChars = '[{(,;:?=|&!^~>%*/'\nconst beforeReSign = beforeReChars + '+-'\n\n// keyword that can preceed a regex (`in` is handled as special case)\nconst beforeReWords = [\n 'case',\n 'default',\n 'do',\n 'else',\n 'in',\n 'instanceof',\n 'prefix',\n 'return',\n 'typeof',\n 'void',\n 'yield'\n]\n\n// Last chars of all the beforeReWords elements to speed up the process.\nconst wordsEndChar = beforeReWords.reduce((s, w) => s + w.slice(-1), '')\n\n// Matches literal regex from the start of the buffer.\n// The buffer to search must not include line-endings.\nconst RE_LIT_REGEX = /^\\/(?=[^*>/])[^[/\\\\]*(?:(?:\\\\.|\\[(?:\\\\.|[^\\]\\\\]*)*\\])[^[\\\\/]*)*?\\/[gimuy]*/\n\n// Valid characters for JavaScript variable names and literal numbers.\nconst RE_JS_VCHAR = /[$\\w]/\n\n// Match dot characters that could be part of tricky regex\nconst RE_DOT_CHAR = /.*/g\n\n/**\n * Searches the position of the previous non-blank character inside `code`,\n * starting with `pos - 1`.\n *\n * @param {string} code - Buffer to search\n * @param {number} pos - Starting position\n * @returns {number} Position of the first non-blank character to the left.\n * @private\n */\nfunction _prev(code, pos) {\n while (--pos >= 0 && /\\s/.test(code[pos]));\n return pos\n}\n\n/**\n * Check if the character in the `start` position within `code` can be a regex\n * and returns the position following this regex or `start+1` if this is not\n * one.\n *\n * NOTE: Ensure `start` points to a slash (this is not checked).\n *\n * @function skipRegex\n * @param {string} code - Buffer to test in\n * @param {number} start - Position the first slash inside `code`\n * @returns {number} Position of the char following the regex.\n *\n */\n/* istanbul ignore next */\nfunction skipRegex(code, start) {\n let pos = (RE_DOT_CHAR.lastIndex = start++)\n\n // `exec()` will extract from the slash to the end of the line\n // and the chained `match()` will match the possible regex.\n const match = (RE_DOT_CHAR.exec(code) || ' ')[0].match(RE_LIT_REGEX)\n\n if (match) {\n const next = pos + match[0].length // result comes from `re.match`\n\n pos = _prev(code, pos)\n let c = code[pos]\n\n // start of buffer or safe prefix?\n if (pos < 0 || beforeReChars.includes(c)) {\n return next\n }\n\n // from here, `pos` is >= 0 and `c` is code[pos]\n if (c === '.') {\n // can be `...` or something silly like 5./2\n if (code[pos - 1] === '.') {\n start = next\n }\n } else {\n if (c === '+' || c === '-') {\n // tricky case\n if (\n code[--pos] !== c || // if have a single operator or\n (pos = _prev(code, pos)) < 0 || // ...have `++` and no previous token\n beforeReSign.includes((c = code[pos]))\n ) {\n return next // ...this is a regex\n }\n }\n\n if (wordsEndChar.includes(c)) {\n // looks like a keyword?\n const end = pos + 1\n\n // get the complete (previous) keyword\n while (--pos >= 0 && RE_JS_VCHAR.test(code[pos]));\n\n // it is in the allowed keywords list?\n if (beforeReWords.includes(code.slice(pos + 1, end))) {\n start = next\n }\n }\n }\n }\n\n return start\n}\n\n/**\n * Update the scopes stack removing or adding closures to it\n * @param {array} stack - array stacking the expression closures\n * @param {string} char - current char to add or remove from the stack\n * @param {string} idx - matching index\n * @param {string} code - expression code\n * @returns {object} result\n * @returns {object} result.char - either the char received or the closing braces\n * @returns {object} result.index - either a new index to skip part of the source code,\n * or 0 to keep from parsing from the old position\n */\nfunction updateStack(stack, char, idx, code) {\n let index = 0\n\n switch (char) {\n case '[':\n case '(':\n case '{':\n stack.push(char === '[' ? ']' : char === '(' ? ')' : '}')\n break\n case ')':\n case ']':\n case '}':\n if (char !== stack.pop()) {\n panic(code, unexpectedCharInExpression.replace('%1', char), index)\n }\n\n if (char === '}' && stack[stack.length - 1] === $_ES6_BQ) {\n char = stack.pop()\n }\n\n index = idx + 1\n break\n case '/':\n index = skipRegex(code, idx)\n }\n\n return { char, index }\n}\n\n/**\n * Parses the code string searching the end of the expression.\n * It skips braces, quoted strings, regexes, and ES6 template literals.\n *\n * @function exprExtr\n * @param {string} code - Buffer to parse\n * @param {number} start - Position of the opening brace\n * @param {[string,string]} bp - Brackets pair\n * @returns {Object} Expression's end (after the closing brace) or -1\n * if it is not an expr.\n */\nfunction exprExtr(code, start, bp) {\n const [openingBraces, closingBraces] = bp\n const offset = start + openingBraces.length // skips the opening brace\n const stack = [] // expected closing braces ('`' for ES6 TL)\n const re = _regex(closingBraces)\n\n re.lastIndex = offset // begining of the expression\n\n let end\n let match\n\n while ((match = re.exec(code))) {\n const idx = match.index\n const str = match[0]\n end = re.lastIndex\n\n // end the iteration\n if (str === closingBraces && !stack.length) {\n return {\n text: code.slice(offset, idx),\n start,\n end\n }\n }\n\n const { char, index } = updateStack(stack, str[0], idx, code)\n // update the end value depending on the new index received\n end = index || end\n // update the regex last index\n re.lastIndex = char === $_ES6_BQ ? skipES6TL(code, end, stack) : end\n }\n\n if (stack.length) {\n panic(code, unclosedExpression, end)\n }\n}\n\n/**\n * Creates a regex for the given string and the left bracket.\n * The string is captured in $1.\n *\n * @param {ParserState} state - Parser state\n * @param {string} str - String to search\n * @returns {RegExp} Resulting regex.\n * @private\n */\nfunction b0re(state, str) {\n const { brackets } = state\n\n const b0 = escapeStr(brackets[0])\n const b1 = escapeStr(str)\n\n return new RegExp(`(${b1})|${b0}`, 'g')\n}\n\n/**\n * Find the end of the attribute value or text node\n * Extract expressions.\n * Detect if value have escaped brackets.\n *\n * @param {ParserState} state - Parser state\n * @returns {number} Ending position\n * @private\n */\nfunction expr(state) {\n const re = b0re(state, state.brackets[1])\n const node = {}\n\n const { unescape, expressions } = parseExpressions(state, re)\n\n if (node) {\n if (unescape) {\n node.unescape = unescape\n }\n if (expressions.length) {\n node.expressions = expressions\n }\n }\n\n return node\n}\n\n/**\n * Parse a text chunk finding all the expressions in it\n * @param {ParserState} state - Parser state\n * @param {RegExp} re - regex to match the expressions contents\n * @returns {object} result containing the expression found, the string to unescape and the end position\n */\nfunction parseExpressions(state, re) {\n const { data, brackets } = state\n const expressions = []\n let unescape, pos, match\n\n // Anything captured in $1 (closing quote or character) ends the loop...\n while ((match = re.exec(data))) {\n // ...else, we have an opening bracket and maybe an expression.\n pos = match.index\n if (data[pos - 1] === '\\\\') {\n unescape = match[0] // it is an escaped opening brace\n } else {\n const tmpExpr = exprExtr(data, pos, brackets)\n if (tmpExpr) {\n expressions.push(tmpExpr)\n re.lastIndex = tmpExpr.end\n }\n }\n }\n\n return {\n unescape,\n expressions\n }\n}\n\nfunction formatError(data, message, pos) {\n if (!pos) {\n pos = data.length\n }\n // count unix/mac/win eols\n const line = (data.slice(0, pos).match(/\\r\\n?|\\n/g) || '').length + 1\n let col = 0\n while (--pos >= 0 && !/[\\r\\n]/.test(data[pos])) {\n ++col\n }\n return `[${line},${col}]: ${message}`\n}\n\n/**\n * Custom error handler can be implemented replacing this method.\n * The `state` object includes the buffer (`data`)\n * The error position (`loc`) contains line (base 1) and col (base 0).\n *\n * @param {string} msg - Error message\n * @param {pos} [number] - Position of the error\n */\nfunction panic(data, msg, pos) {\n const message = formatError(data, msg, pos)\n throw new Error(message)\n}\n\nfunction parse(data, state) {\n return expr({ ...state, data })\n}\n\nmodule.exports = parse\n", "/* eslint no-param-reassign: [\"error\", { \"props\": true, \"ignorePropertyModificationsFor\": [\"node\"] }] */\n\n'use strict'\n\nconst minify = require('@starptech/rehype-minify-whitespace')({\n newlines: true\n})\nconst sensitive = require('html-whitespace-sensitive-tag-names')\nconst is = require('unist-util-is')\nconst isElement = require('hast-util-is-element')\nconst repeat = require('repeat-string')\nconst visit = require('unist-util-visit-parents')\nconst voids = require('html-void-elements')\nconst find = require('unist-util-find')\nconst toString = require('hast-util-to-string')\nconst prettier = require('prettier')\nconst expressionParser = require('@starptech/expression-parser')\n\nmodule.exports = format\n\n/* Constants. */\nconst single = '\\n'\nconst tab = '\\t'\nconst double = '\\n\\n'\nconst space = ' '\nconst re = /\\n/g\n\nconst CONDITIONAL_COMMENT_REGEXP = /^\\s*\\[if .*/\n\n/* Format white-space. */\nfunction format(options) {\n const settings = options || {}\n const tabWidth = settings.tabWidth || 2\n const { useTabs } = settings\n let { indentInitial } = settings\n const usePrettier = settings.usePrettier !== false\n const prettierOpts = settings.prettier\n let indent\n\n if (useTabs) {\n indent = tab\n } else {\n indent = repeat(space, tabWidth)\n }\n\n return transform\n\n function markIgnoreVisitor(node, parents) {\n /**\n * Handle special prettyhtml flags to ignore attribute wrapping and/or whitespace handling\n */\n if (is('comment', node)) {\n if (node.value.indexOf('prettyhtml-ignore') !== -1) {\n return setAttributeOnChildren(node, parents, 'ignore', true)\n }\n if (node.value.indexOf('prettyhtml-preserve-whitespace') !== -1) {\n return setAttributeOnChildren(node, parents, 'preserveWhitespace', true)\n }\n if (node.value.indexOf('prettyhtml-preserve-attribute-wrapping') !== -1) {\n return setAttributeOnChildren(node, parents, 'preserveAttrWrapping', true)\n }\n }\n }\n\n function setAttributeOnChildren(node, parents, attributeName, attributeValue) {\n const parent = parents[parents.length - 1]\n const nodeIndex = parent ? parent.children.indexOf(node) : null\n if (nodeIndex !== null) {\n for (let i = nodeIndex; i < parent.children.length; i++) {\n const child = parent.children[i]\n if (isElement(child)) {\n setNodeData(child, attributeName, attributeValue)\n return visit.SKIP\n }\n }\n }\n }\n\n function transform(tree) {\n // check if we are in page mode to indent the first level\n indentInitial = isPageMode(tree)\n\n visit(tree, markIgnoreVisitor)\n\n const root = minify(tree)\n\n visit(root, visitor)\n\n return root\n\n function visitor(node, parents) {\n // holds a copy of the children\n const children = node.children || []\n const { length } = children\n let index = -1\n let child\n let level = parents.length\n\n if (indentInitial === false) {\n level--\n }\n\n if (node.data && (node.data.ignore || node.data.preserveWhitespace)) {\n return visit.SKIP\n }\n\n if (is('comment', node)) {\n indentComment(node, indent, level)\n }\n\n /**\n * If we find whitespace-sensitive nodes / inlines we skip it\n * e.g pre, textarea\n */\n if (ignore(parents.concat(node))) {\n setNodeData(node, 'indentLevel', level - 1)\n\n // clear empty script, textarea, pre, style tags\n if (length) {\n const empty = hasOnlyEmptyTextChildren(node)\n const isEmbeddedContent = isElement(node, 'style') || isElement(node, 'script')\n if (empty) {\n // eslint-disable-next-line no-param-reassign\n node.children = []\n }\n if (usePrettier && !empty && isEmbeddedContent) {\n prettierEmbeddedContent(node, level, indent, prettierOpts)\n }\n }\n\n return visit.SKIP\n }\n\n let newline = false\n // we have to look in the future because we indent leading text\n // on a newline when a child text node contains a newline. If we wouldn't do this\n // the formatter could produce an unstable result because in the next step we could produce newlines.\n const collpased = peekCollpase(node, children)\n\n /**\n * Indent children\n */\n index = -1\n while (++index < length) {\n // eslint-disable-next-line no-shadow\n const child = children[index]\n\n // only indent text in nodes\n // root text nodes should't influence other root nodes^^\n if (node.type === 'root') {\n break\n }\n\n if (is('text', child)) {\n if (containsNewline(child) || collpased) {\n newline = true\n }\n\n child.value = child.value\n // reduce newlines to one newline\n // $& contains the lastMatch\n .replace(re, `$&${repeat(indent, level)}`)\n }\n }\n\n // reset\n const result = []\n index = -1\n node.children = result\n\n let prevChild = null\n if (length) {\n // walk through children\n // hint: a child has no children informations we already walking through\n // the tree\n while (++index < length) {\n child = children[index]\n\n const indentLevel = level\n\n setNodeData(child, 'indentLevel', indentLevel)\n\n if (elementHasGap(prevChild)) {\n result.push({\n type: 'text',\n value: single\n })\n }\n\n if (\n isElementAfterConditionalComment(node, child, index, prevChild) ||\n isConCommentFollowedByComment(node, child, index, prevChild)\n ) {\n result.push({\n type: 'text',\n value: double + repeat(indent, indentLevel)\n })\n } else if (\n insertNewlineBeforeNode(node, children, child, index, prevChild) ||\n (newline && index === 0)\n ) {\n // only necessary because we are trying to indent tags on newlines\n // even when in inline context when possible\n if (is('text', prevChild)) {\n // remove trailing whitespaces and tabs because a newline is inserted before\n prevChild.value = prevChild.value.replace(/[ \\t]+$/, '')\n }\n // remove leading whitespaces and tabs because a newline is inserted before\n if (is('text', child)) {\n child.value = child.value.replace(/^[ \\t]+/, '')\n }\n\n result.push({\n type: 'text',\n value: single + repeat(indent, indentLevel)\n })\n }\n\n prevChild = child\n\n result.push(child)\n }\n }\n\n if (insertNewlineAfterNode(node, prevChild) || newline) {\n result.push({\n type: 'text',\n value: single + repeat(indent, level - 1)\n })\n }\n }\n }\n}\n\nfunction endsWithNewline(node) {\n return is('text', node) && node.value && /\\s*\\n\\s*$/.test(node.value)\n}\n\nfunction startsWithNewline(node) {\n return is('text', node) && node.value && /^\\s*\\n/.test(node.value)\n}\n\nfunction containsNewline(node) {\n return node.value.indexOf(single) !== -1\n}\n\n/**\n * indent last line of comment\n * e.g\n * <!--\n * foo\n * -->\n * to\n * <!--\n * foo\n * -->\n */\nfunction indentComment(node, indent, level) {\n const commentLines = node.value.split(single)\n if (commentLines.length > 1) {\n commentLines[commentLines.length - 1] =\n repeat(indent, level - 1) + commentLines[commentLines.length - 1].trim()\n node.value = commentLines.join(single)\n }\n}\n\nfunction handleTemplateExpression(child, children) {\n const brackets = checkForTemplateExpression(child.value)\n if (brackets) {\n // dont touch nodes with single text element\n if (\n hasOnlyTextChildren({\n children\n })\n ) {\n return false\n }\n\n // dont add newline when newline is already in text\n if (startsWithNewline(child)) {\n return false\n }\n\n return true\n }\n}\n\n/**\n * Check if any children will be wrapped on a newline\n * @param {*} node\n * @param {*} children\n */\nfunction peekCollpase(node, children) {\n let index = -1\n let prevChild = false\n while (++index < children.length) {\n const child = children[index]\n if (insertNewlineBeforeNode(node, children, child, index, prevChild)) {\n return true\n }\n prevChild = child\n }\n}\n\nfunction insertNewlineBeforeNode(node, children, child, index, prev) {\n // don't add newline when prev child already has one\n if (endsWithNewline(prev)) {\n return false\n }\n\n // every template expression is indented on a newline\n if (is('text', child) && handleTemplateExpression(child, children)) {\n return true\n }\n\n // insert newline when tag is on the same line as the comment\n if (is('comment', prev)) {\n return true\n }\n\n // embedded content is indented on newlines\n if (isElement(child, ['script', 'style']) && index !== 0) {\n return true\n }\n\n // don't add newline on the first element of the page\n const isRootElement = node.type === 'root' && index === 0\n if (isRootElement) {\n return false\n }\n const isChildTextElement = is('text', child)\n\n return !isChildTextElement\n}\n\nfunction insertNewlineAfterNode(node, prev) {\n // Add newline on the close tag after root element\n const isRootElement = node.type === 'root'\n if (isRootElement) {\n return true\n }\n\n const hasChilds = node.children.length > 0\n\n /**\n * e.g <label><input/>foo</label>\n */\n if (hasChilds && !hasOnlyTextChildren(node) && !isVoid(node)) {\n return true\n }\n\n /**\n * e.g <label>foo</label>\n */\n const isPrevTextNode = is('text', prev)\n return hasChilds && !isVoid(node) && !isPrevTextNode\n}\n\nfunction checkForTemplateExpression(value) {\n let result = expressionParser(value, { brackets: ['{{', '}}'] })\n // e.g angular, vue\n if (result.expressions && result.expressions.length) {\n return ['{{', '}}']\n }\n\n result = expressionParser(value, { brackets: ['{', '}'] })\n // e.g svelte, riotjs\n if (result.expressions && result.expressions.length) {\n return ['{', '}']\n }\n\n return null\n}\n\nfunction hasOnlyTextChildren(node) {\n const children = node.children || []\n\n if (children.length === 0) {\n return false\n }\n\n return children.every(n => is('text', n))\n}\n\nfunction hasOnlyEmptyTextChildren(node) {\n const children = node.children || []\n\n if (children.length === 0) {\n return false\n }\n\n return children.every(n => is('text', n) && /^\\s+$/.test(n.value))\n}\n\nfunction isElementAfterConditionalComment(node, child, index, prev) {\n // insert double newline when conditional comment is before element\n if (is('comment', prev) && CONDITIONAL_COMMENT_REGEXP.test(prev.value) && isElement(child)) {\n return true\n }\n return false\n}\n\nfunction isConCommentFollowedByComment(node, child, index, prev) {\n // insert double newline when conditional comment is before a non conditional comment\n if (\n is('comment', prev) &&\n CONDITIONAL_COMMENT_REGEXP.test(prev.value) &&\n is('comment', child) &&\n !CONDITIONAL_COMMENT_REGEXP.test(child.value)\n ) {\n return true\n }\n return false\n}\n\nfunction elementHasGap(prev) {\n // insert double newline when there was an intended gap before the element in original document\n return prev && prev.data.gapAfter\n}\n\nfunction isVoid(node) {\n return voids.indexOf(node.tagName) !== -1\n}\n\nfunction ignore(nodes) {\n let index = nodes.length\n\n while (index--) {\n if (sensitive.indexOf(nodes[index].tagName) !== -1) {\n return true\n }\n }\n\n return false\n}\n\nfunction prettierEmbeddedContent(node, level, indent, prettierOpts) {\n const isStyleTag = isElement(node, 'style')\n const isScriptTag = isElement(node, 'script')\n let content = toString(node)\n const type = node.properties.type ? `type=\"${node.properties.type}\"` : ''\n\n if (isScriptTag) {\n content = `<script ${type}>${content}</script>`\n } else if (isStyleTag) {\n content = `<style ${type}>${content}</style>`\n }\n\n let formattedText = prettier.format(\n content,\n Object.assign({}, prettierOpts, {\n parser: 'html'\n })\n )\n\n if (isScriptTag) {\n formattedText = formattedText.replace(/^<script.*>\\n*/, '').replace(/<\\/script\\s*>\\s*$/, '')\n } else if (isStyleTag) {\n formattedText = formattedText.replace(/^<style.*>\\n*/, '').replace(/<\\/style\\s*>\\s*$/, '')\n }\n\n node.children = [\n {\n type: 'text',\n value: single\n },\n {\n type: 'text',\n value: formattedText\n },\n {\n type: 'text',\n value: repeat(indent, level - 1)\n }\n ]\n return formattedText\n}\n\nfunction setNodeData(node, key, value) {\n const data = node.data || {}\n node.data = data\n node.data[key] = value\n}\n\nfunction isPageMode(ast) {\n return !find(ast, function findCondition(node) {\n return isElement(node, ['html', 'body', 'head'])\n })\n}\n", "'use strict'\n\nvar visit = require('unist-util-visit')\nvar has = require('hast-util-has-property')\n\nmodule.exports = sort\n\nfunction sort() {\n return transform\n}\n\nfunction transform(tree) {\n visit(tree, 'element', reorder)\n\n function reorder(node) {\n var props = node.properties\n var index = -1\n var result = {}\n var prop\n\n var all = Object.keys(props).sort((left, right) => left.localeCompare(right))\n\n while (++index < all.length) {\n prop = all[index]\n\n if (has(node, prop)) {\n result[prop] = props[prop]\n }\n }\n\n node.properties = result\n }\n}\n", "'use strict'\n\nconst VFile = require('vfile')\nconst unified = require('unified')\nconst parse = require('@starptech/rehype-webparser')\nconst stringify = require('@starptech/prettyhtml-formatter/stringify')\nconst format = require('@starptech/prettyhtml-formatter')\nconst sortAttributes = require('@starptech/prettyhtml-sort-attributes')\n\nmodule.exports = prettyhtml\n\nfunction core(value, processor, options) {\n const file = new VFile(value)\n let proc = processor().use(format, {\n tabWidth: options.tabWidth,\n useTabs: options.useTabs,\n usePrettier: options.usePrettier,\n prettier: options.prettier\n })\n\n if (options.sortAttributes) {\n proc = proc.use(sortAttributes)\n }\n\n return proc\n .use(stringify, {\n wrapAttributes: options.wrapAttributes,\n printWidth: options.printWidth,\n tabWidth: options.tabWidth,\n useTabs: options.useTabs,\n singleQuote: options.singleQuote,\n closeSelfClosing: true,\n closeEmptyElements: true\n })\n .processSync(file)\n}\n\nfunction prettyhtml(value, options) {\n const opt = Object.assign({}, options)\n return core(\n value,\n unified()\n .use(parse, {\n ignoreFirstLf: false,\n decodeEntities: false,\n selfClosingCustomElements: true,\n selfClosingElements: true\n })\n .freeze(),\n opt\n )\n}\n", "/*\nrelative require\n*/'use strict';\n\nvar path = require('path');\nvar Module = require('module');\n\nvar modules = {};\n\nvar getModule = function(dir) {\n var rootPath = dir ? path.resolve(dir) : process.cwd();\n var rootName = path.join(rootPath, '@root');\n var root = modules[rootName];\n if (!root) {\n root = new Module(rootName);\n root.filename = rootName;\n root.paths = Module._nodeModulePaths(rootPath);\n modules[rootName] = root;\n }\n return root;\n};\n\nvar requireRelative = function(requested, relativeTo) {\n var root = getModule(relativeTo);\n return root.require(requested);\n};\n\nrequireRelative.resolve = function(requested, relativeTo) {\n var root = getModule(relativeTo);\n return Module._resolveFilename(requested, root);\n};\n\nmodule.exports = requireRelative;\n", "'use strict'\r\n\r\nmodule.exports = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\r\n", "/* MIT license */\nvar cssKeywords = require('color-name');\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n// values that give correct `typeof` results).\n// do not use box values types (i.e. Number(), String(), etc.)\n\nvar reverseKeywords = {};\nfor (var key in cssKeywords) {\n\tif (cssKeywords.hasOwnProperty(key)) {\n\t\treverseKeywords[cssKeywords[key]] = key;\n\t}\n}\n\nvar convert = module.exports = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\n// hide .channels and .labels properties\nfor (var model in convert) {\n\tif (convert.hasOwnProperty(model)) {\n\t\tif (!('channels' in convert[model])) {\n\t\t\tthrow new Error('missing channels property: ' + model);\n\t\t}\n\n\t\tif (!('labels' in convert[model])) {\n\t\t\tthrow new Error('missing channel labels property: ' + model);\n\t\t}\n\n\t\tif (convert[model].labels.length !== convert[model].channels) {\n\t\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t\t}\n\n\t\tvar channels = convert[model].channels;\n\t\tvar labels = convert[model].labels;\n\t\tdelete convert[model].channels;\n\t\tdelete convert[model].labels;\n\t\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\t\tObject.defineProperty(convert[model], 'labels', {value: labels});\n\t}\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar min = Math.min(r, g, b);\n\tvar max = Math.max(r, g, b);\n\tvar delta = max - min;\n\tvar h;\n\tvar s;\n\tvar l;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tl = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tvar rdif;\n\tvar gdif;\n\tvar bdif;\n\tvar h;\n\tvar s;\n\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar v = Math.max(r, g, b);\n\tvar diff = v - Math.min(r, g, b);\n\tvar diffc = function (c) {\n\t\treturn (v - c) / 6 / diff + 1 / 2;\n\t};\n\n\tif (diff === 0) {\n\t\th = s = 0;\n\t} else {\n\t\ts = diff / v;\n\t\trdif = diffc(r);\n\t\tgdif = diffc(g);\n\t\tbdif = diffc(b);\n\n\t\tif (r === v) {\n\t\t\th = bdif - gdif;\n\t\t} else if (g === v) {\n\t\t\th = (1 / 3) + rdif - bdif;\n\t\t} else if (b === v) {\n\t\t\th = (2 / 3) + gdif - rdif;\n\t\t}\n\t\tif (h < 0) {\n\t\t\th += 1;\n\t\t} else if (h > 1) {\n\t\t\th -= 1;\n\t\t}\n\t}\n\n\treturn [\n\t\th * 360,\n\t\ts * 100,\n\t\tv * 100\n\t];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tvar r = rgb[0];\n\tvar g = rgb[1];\n\tvar b = rgb[2];\n\tvar h = convert.rgb.hsl(rgb)[0];\n\tvar w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar c;\n\tvar m;\n\tvar y;\n\tvar k;\n\n\tk = Math.min(1 - r, 1 - g, 1 - b);\n\tc = (1 - r - k) / (1 - k) || 0;\n\tm = (1 - g - k) / (1 - k) || 0;\n\ty = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\n/**\n * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n * */\nfunction comparativeDistance(x, y) {\n\treturn (\n\t\tMath.pow(x[0] - y[0], 2) +\n\t\tMath.pow(x[1] - y[1], 2) +\n\t\tMath.pow(x[2] - y[2], 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tvar reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tvar currentClosestDistance = Infinity;\n\tvar currentClosestKeyword;\n\n\tfor (var keyword in cssKeywords) {\n\t\tif (cssKeywords.hasOwnProperty(keyword)) {\n\t\t\tvar value = cssKeywords[keyword];\n\n\t\t\t// Compute comparative distance\n\t\t\tvar distance = comparativeDistance(rgb, value);\n\n\t\t\t// Check if its less, if so set as closest\n\t\t\tif (distance < currentClosestDistance) {\n\t\t\t\tcurrentClosestDistance = distance;\n\t\t\t\tcurrentClosestKeyword = keyword;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn cssKeywords[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\n\t// assume sRGB\n\tr = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n\tvar x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tvar y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tvar z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tvar xyz = convert.rgb.xyz(rgb);\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tvar h = hsl[0] / 360;\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar t1;\n\tvar t2;\n\tvar t3;\n\tvar rgb;\n\tvar val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tt1 = 2 * l - t2;\n\n\trgb = [0, 0, 0];\n\tfor (var i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tvar h = hsl[0];\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar smin = s;\n\tvar lmin = Math.max(l, 0.01);\n\tvar sv;\n\tvar v;\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tv = (l + s) / 2;\n\tsv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tvar h = hsv[0] / 60;\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar hi = Math.floor(h) % 6;\n\n\tvar f = h - Math.floor(h);\n\tvar p = 255 * v * (1 - s);\n\tvar q = 255 * v * (1 - (s * f));\n\tvar t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tvar h = hsv[0];\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar vmin = Math.max(v, 0.01);\n\tvar lmin;\n\tvar sl;\n\tvar l;\n\n\tl = (2 - s) * v;\n\tlmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tvar h = hwb[0] / 360;\n\tvar wh = hwb[1] / 100;\n\tvar bl = hwb[2] / 100;\n\tvar ratio = wh + bl;\n\tvar i;\n\tvar v;\n\tvar f;\n\tvar n;\n\n\t// wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\ti = Math.floor(6 * h);\n\tv = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tn = wh + f * (v - wh); // linear interpolation\n\n\tvar r;\n\tvar g;\n\tvar b;\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v; g = n; b = wh; break;\n\t\tcase 1: r = n; g = v; b = wh; break;\n\t\tcase 2: r = wh; g = v; b = n; break;\n\t\tcase 3: r = wh; g = n; b = v; break;\n\t\tcase 4: r = n; g = wh; b = v; break;\n\t\tcase 5: r = v; g = wh; b = n; break;\n\t}\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tvar c = cmyk[0] / 100;\n\tvar m = cmyk[1] / 100;\n\tvar y = cmyk[2] / 100;\n\tvar k = cmyk[3] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = 1 - Math.min(1, c * (1 - k) + k);\n\tg = 1 - Math.min(1, m * (1 - k) + k);\n\tb = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tvar x = xyz[0] / 100;\n\tvar y = xyz[1] / 100;\n\tvar z = xyz[2] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar x;\n\tvar y;\n\tvar z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tvar y2 = Math.pow(y, 3);\n\tvar x2 = Math.pow(x, 3);\n\tvar z2 = Math.pow(z, 3);\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar hr;\n\tvar h;\n\tvar c;\n\n\thr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tc = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tvar l = lch[0];\n\tvar c = lch[1];\n\tvar h = lch[2];\n\tvar a;\n\tvar b;\n\tvar hr;\n\n\thr = h / 360 * 2 * Math.PI;\n\ta = c * Math.cos(hr);\n\tb = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\tvar value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tvar ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\n\t// we use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tvar ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tvar color = args % 10;\n\n\t// handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tvar mult = (~~(args > 50) + 1) * 0.5;\n\tvar r = ((color & 1) * mult) * 255;\n\tvar g = (((color >> 1) & 1) * mult) * 255;\n\tvar b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// handle greyscale\n\tif (args >= 232) {\n\t\tvar c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tvar rem;\n\tvar r = Math.floor(args / 36) / 5 * 255;\n\tvar g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tvar b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tvar integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tvar string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tvar match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tvar colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(function (char) {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tvar integer = parseInt(colorString, 16);\n\tvar r = (integer >> 16) & 0xFF;\n\tvar g = (integer >> 8) & 0xFF;\n\tvar b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar max = Math.max(Math.max(r, g), b);\n\tvar min = Math.min(Math.min(r, g), b);\n\tvar chroma = (max - min);\n\tvar grayscale;\n\tvar hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma + 4;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar c = 1;\n\tvar f = 0;\n\n\tif (l < 0.5) {\n\t\tc = 2.0 * s * l;\n\t} else {\n\t\tc = 2.0 * s * (1.0 - l);\n\t}\n\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\n\tvar c = s * v;\n\tvar f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tvar h = hcg[0] / 360;\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tvar pure = [0, 0, 0];\n\tvar hi = (h % 1) * 6;\n\tvar v = hi % 1;\n\tvar w = 1 - v;\n\tvar mg = 0;\n\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tvar v = c + g * (1.0 - c);\n\tvar f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tvar l = g * (1.0 - c) + 0.5 * c;\n\tvar s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\tvar v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tvar w = hwb[1] / 100;\n\tvar b = hwb[2] / 100;\n\tvar v = 1 - b;\n\tvar c = v - w;\n\tvar g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = convert.gray.hsv = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tvar val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tvar integer = (val << 16) + (val << 8) + val;\n\n\tvar string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tvar val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n", "var conversions = require('./conversions');\n\n/*\n\tthis function routes a model to all other models.\n\n\tall functions that are routed have a property `.conversion` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\nfunction buildGraph() {\n\tvar graph = {};\n\t// https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\tvar models = Object.keys(conversions);\n\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tvar graph = buildGraph();\n\tvar queue = [fromModel]; // unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tvar current = queue.pop();\n\t\tvar adjacents = Object.keys(conversions[current]);\n\n\t\tfor (var len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tvar adjacent = adjacents[i];\n\t\t\tvar node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tvar path = [graph[toModel].parent, toModel];\n\tvar fn = conversions[graph[toModel].parent][toModel];\n\n\tvar cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nmodule.exports = function (fromModel) {\n\tvar graph = deriveBFS(fromModel);\n\tvar conversion = {};\n\n\tvar models = Object.keys(graph);\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tvar toModel = models[i];\n\t\tvar node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// no possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\n", "var conversions = require('./conversions');\nvar route = require('./route');\n\nvar convert = {};\n\nvar models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\tvar result = fn(args);\n\n\t\t// we're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (var len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(function (fromModel) {\n\tconvert[fromModel] = {};\n\n\tObject.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});\n\tObject.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});\n\n\tvar routes = route(fromModel);\n\tvar routeModels = Object.keys(routes);\n\n\trouteModels.forEach(function (toModel) {\n\t\tvar fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nmodule.exports = convert;\n", "'use strict';\nconst colorConvert = require('color-convert');\n\nconst wrapAnsi16 = (fn, offset) => function () {\n\tconst code = fn.apply(colorConvert, arguments);\n\treturn `\\u001B[${code + offset}m`;\n};\n\nconst wrapAnsi256 = (fn, offset) => function () {\n\tconst code = fn.apply(colorConvert, arguments);\n\treturn `\\u001B[${38 + offset};5;${code}m`;\n};\n\nconst wrapAnsi16m = (fn, offset) => function () {\n\tconst rgb = fn.apply(colorConvert, arguments);\n\treturn `\\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`;\n};\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\tconst styles = {\n\t\tmodifier: {\n\t\t\treset: [0, 0],\n\t\t\t// 21 isn't widely supported and 22 does the same thing\n\t\t\tbold: [1, 22],\n\t\t\tdim: [2, 22],\n\t\t\titalic: [3, 23],\n\t\t\tunderline: [4, 24],\n\t\t\tinverse: [7, 27],\n\t\t\thidden: [8, 28],\n\t\t\tstrikethrough: [9, 29]\n\t\t},\n\t\tcolor: {\n\t\t\tblack: [30, 39],\n\t\t\tred: [31, 39],\n\t\t\tgreen: [32, 39],\n\t\t\tyellow: [33, 39],\n\t\t\tblue: [34, 39],\n\t\t\tmagenta: [35, 39],\n\t\t\tcyan: [36, 39],\n\t\t\twhite: [37, 39],\n\t\t\tgray: [90, 39],\n\n\t\t\t// Bright color\n\t\t\tredBright: [91, 39],\n\t\t\tgreenBright: [92, 39],\n\t\t\tyellowBright: [93, 39],\n\t\t\tblueBright: [94, 39],\n\t\t\tmagentaBright: [95, 39],\n\t\t\tcyanBright: [96, 39],\n\t\t\twhiteBright: [97, 39]\n\t\t},\n\t\tbgColor: {\n\t\t\tbgBlack: [40, 49],\n\t\t\tbgRed: [41, 49],\n\t\t\tbgGreen: [42, 49],\n\t\t\tbgYellow: [43, 49],\n\t\t\tbgBlue: [44, 49],\n\t\t\tbgMagenta: [45, 49],\n\t\t\tbgCyan: [46, 49],\n\t\t\tbgWhite: [47, 49],\n\n\t\t\t// Bright color\n\t\t\tbgBlackBright: [100, 49],\n\t\t\tbgRedBright: [101, 49],\n\t\t\tbgGreenBright: [102, 49],\n\t\t\tbgYellowBright: [103, 49],\n\t\t\tbgBlueBright: [104, 49],\n\t\t\tbgMagentaBright: [105, 49],\n\t\t\tbgCyanBright: [106, 49],\n\t\t\tbgWhiteBright: [107, 49]\n\t\t}\n\t};\n\n\t// Fix humans\n\tstyles.color.grey = styles.color.gray;\n\n\tfor (const groupName of Object.keys(styles)) {\n\t\tconst group = styles[groupName];\n\n\t\tfor (const styleName of Object.keys(group)) {\n\t\t\tconst style = group[styleName];\n\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false\n\t\t});\n\n\t\tObject.defineProperty(styles, 'codes', {\n\t\t\tvalue: codes,\n\t\t\tenumerable: false\n\t\t});\n\t}\n\n\tconst ansi2ansi = n => n;\n\tconst rgb2rgb = (r, g, b) => [r, g, b];\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = {\n\t\tansi: wrapAnsi16(ansi2ansi, 0)\n\t};\n\tstyles.color.ansi256 = {\n\t\tansi256: wrapAnsi256(ansi2ansi, 0)\n\t};\n\tstyles.color.ansi16m = {\n\t\trgb: wrapAnsi16m(rgb2rgb, 0)\n\t};\n\n\tstyles.bgColor.ansi = {\n\t\tansi: wrapAnsi16(ansi2ansi, 10)\n\t};\n\tstyles.bgColor.ansi256 = {\n\t\tansi256: wrapAnsi256(ansi2ansi, 10)\n\t};\n\tstyles.bgColor.ansi16m = {\n\t\trgb: wrapAnsi16m(rgb2rgb, 10)\n\t};\n\n\tfor (let key of Object.keys(colorConvert)) {\n\t\tif (typeof colorConvert[key] !== 'object') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst suite = colorConvert[key];\n\n\t\tif (key === 'ansi16') {\n\t\t\tkey = 'ansi';\n\t\t}\n\n\t\tif ('ansi16' in suite) {\n\t\t\tstyles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0);\n\t\t\tstyles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10);\n\t\t}\n\n\t\tif ('ansi256' in suite) {\n\t\t\tstyles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0);\n\t\t\tstyles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10);\n\t\t}\n\n\t\tif ('rgb' in suite) {\n\t\t\tstyles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0);\n\t\t\tstyles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10);\n\t\t}\n\t}\n\n\treturn styles;\n}\n\n// Make the export immutable\nObject.defineProperty(module, 'exports', {\n\tenumerable: true,\n\tget: assembleStyles\n});\n", "'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nexports.printIteratorEntries = printIteratorEntries;\nexports.printIteratorValues = printIteratorValues;\nexports.printListItems = printListItems;\nexports.printObjectProperties = printObjectProperties;\n\nconst getSymbols = Object.getOwnPropertySymbols || (obj => []);\n/**\n * Copyright (c) 2014-present, Facebook, Inc. All rights reserved.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n *\n */\n\nconst isSymbol = key =>\n // $FlowFixMe string literal `symbol`. This value is not a valid `typeof` return value\n typeof key === 'symbol' || toString.call(key) === '[object Symbol]';\n\n// Return entries (for example, of a map)\n// with spacing, indentation, and comma\n// without surrounding punctuation (for example, braces)\nfunction printIteratorEntries(\n // Flow 0.51.0: property `@@iterator` of $Iterator not found in Object\n // To allow simplistic getRecordIterator in immutable.js\n iterator,\n config,\n indentation,\n depth,\n refs,\n printer\n) {\n let separator =\n arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : ': ';\n\n let result = '';\n let current = iterator.next();\n\n if (!current.done) {\n result += config.spacingOuter;\n\n const indentationNext = indentation + config.indent;\n\n while (!current.done) {\n const name = printer(\n current.value[0],\n config,\n indentationNext,\n depth,\n refs\n );\n const value = printer(\n current.value[1],\n config,\n indentationNext,\n depth,\n refs\n );\n\n result += indentationNext + name + separator + value;\n\n current = iterator.next();\n\n if (!current.done) {\n result += ',' + config.spacingInner;\n } else if (!config.min) {\n result += ',';\n }\n }\n\n result += config.spacingOuter + indentation;\n }\n\n return result;\n}\n\n// Return values (for example, of a set)\n// with spacing, indentation, and comma\n// without surrounding punctuation (braces or brackets)\nfunction printIteratorValues(\n iterator,\n config,\n indentation,\n depth,\n refs,\n printer\n) {\n let result = '';\n let current = iterator.next();\n\n if (!current.done) {\n result += config.spacingOuter;\n\n const indentationNext = indentation + config.indent;\n\n while (!current.done) {\n result +=\n indentationNext +\n printer(current.value, config, indentationNext, depth, refs);\n\n current = iterator.next();\n\n if (!current.done) {\n result += ',' + config.spacingInner;\n } else if (!config.min) {\n result += ',';\n }\n }\n\n result += config.spacingOuter + indentation;\n }\n\n return result;\n}\n\n// Return items (for example, of an array)\n// with spacing, indentation, and comma\n// without surrounding punctuation (for example, brackets)\nfunction printListItems(list, config, indentation, depth, refs, printer) {\n let result = '';\n\n if (list.length) {\n result += config.spacingOuter;\n\n const indentationNext = indentation + config.indent;\n\n for (let i = 0; i < list.length; i++) {\n result +=\n indentationNext +\n printer(list[i], config, indentationNext, depth, refs);\n\n if (i < list.length - 1) {\n result += ',' + config.spacingInner;\n } else if (!config.min) {\n result += ',';\n }\n }\n\n result += config.spacingOuter + indentation;\n }\n\n return result;\n}\n\n// Return properties of an object\n// with spacing, indentation, and comma\n// without surrounding punctuation (for example, braces)\nfunction printObjectProperties(val, config, indentation, depth, refs, printer) {\n let result = '';\n let keys = Object.keys(val).sort();\n const symbols = getSymbols(val);\n\n if (symbols.length) {\n keys = keys.filter(key => !isSymbol(key)).concat(symbols);\n }\n\n if (keys.length) {\n result += config.spacingOuter;\n\n const indentationNext = indentation + config.indent;\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const name = printer(key, config, indentationNext, depth, refs);\n const value = printer(val[key], config, indentationNext, depth, refs);\n\n result += indentationNext + name + ': ' + value;\n\n if (i < keys.length - 1) {\n result += ',' + config.spacingInner;\n } else if (!config.min) {\n result += ',';\n }\n }\n\n result += config.spacingOuter + indentation;\n }\n\n return result;\n}\n", "'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nexports.test = exports.serialize = undefined;\n\nvar _collections = require('../collections');\n\n/**\n * Copyright (c) 2014-present, Facebook, Inc. All rights reserved.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n *\n */\n\nconst asymmetricMatcher = Symbol.for('jest.asymmetricMatcher');\nconst SPACE = ' ';\n\nconst serialize = (exports.serialize = (\n val,\n config,\n indentation,\n depth,\n refs,\n printer\n) => {\n const stringedValue = val.toString();\n\n if (\n stringedValue === 'ArrayContaining' ||\n stringedValue === 'ArrayNotContaining'\n ) {\n if (++depth > config.maxDepth) {\n return '[' + stringedValue + ']';\n }\n return (\n stringedValue +\n SPACE +\n '[' +\n (0, _collections.printListItems)(\n val.sample,\n config,\n indentation,\n depth,\n refs,\n printer\n ) +\n ']'\n );\n }\n\n if (\n stringedValue === 'ObjectContaining' ||\n stringedValue === 'ObjectNotContaining'\n ) {\n if (++depth > config.maxDepth) {\n return '[' + stringedValue + ']';\n }\n return (\n stringedValue +\n SPACE +\n '{' +\n (0, _collections.printObjectProperties)(\n val.sample,\n config,\n indentation,\n depth,\n refs,\n printer\n ) +\n '}'\n );\n }\n\n if (\n stringedValue === 'StringMatching' ||\n stringedValue === 'StringNotMatching'\n ) {\n return (\n stringedValue +\n SPACE +\n printer(val.sample, config, indentation, depth, refs)\n );\n }\n\n if (\n stringedValue === 'StringContaining' ||\n stringedValue === 'StringNotContaining'\n ) {\n return (\n stringedValue +\n SPACE +\n printer(val.sample, config, indentation, depth, refs)\n );\n }\n\n return val.toAsymmetricMatcher();\n});\n\nconst test = (exports.test = val => val && val.$$typeof === asymmetricMatcher);\n\nexports.default = {serialize: serialize, test: test};\n", "'use strict';\n\nmodule.exports = () => {\n\tconst pattern = [\n\t\t'[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:[a-zA-Z\\\\d]*(?:;[a-zA-Z\\\\d]*)*)?\\\\u0007)',\n\t\t'(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PRZcf-ntqry=><~]))'\n\t].join('|');\n\n\treturn new RegExp(pattern, 'g');\n};\n", "'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nexports.serialize = exports.test = undefined;\n\nvar _ansiRegex = require('ansi-regex');\n\nvar _ansiRegex2 = _interopRequireDefault(_ansiRegex);\n\nvar _ansiStyles = require('ansi-styles');\n\nvar _ansiStyles2 = _interopRequireDefault(_ansiStyles);\n\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {default: obj};\n}\n\nconst toHumanReadableAnsi = text =>\n text.replace((0, _ansiRegex2.default)(), (match, offset, string) => {\n switch (match) {\n case _ansiStyles2.default.red.close:\n case _ansiStyles2.default.green.close:\n case _ansiStyles2.default.cyan.close:\n case _ansiStyles2.default.gray.close:\n case _ansiStyles2.default.white.close:\n case _ansiStyles2.default.yellow.close:\n case _ansiStyles2.default.bgRed.close:\n case _ansiStyles2.default.bgGreen.close:\n case _ansiStyles2.default.bgYellow.close:\n case _ansiStyles2.default.inverse.close:\n case _ansiStyles2.default.dim.close:\n case _ansiStyles2.default.bold.close:\n case _ansiStyles2.default.reset.open:\n case _ansiStyles2.default.reset.close:\n return '</>';\n case _ansiStyles2.default.red.open:\n return '<red>';\n case _ansiStyles2.default.green.open:\n return '<green>';\n case _ansiStyles2.default.cyan.open:\n return '<cyan>';\n case _ansiStyles2.default.gray.open:\n return '<gray>';\n case _ansiStyles2.default.white.open:\n return '<white>';\n case _ansiStyles2.default.yellow.open:\n return '<yellow>';\n case _ansiStyles2.default.bgRed.open:\n return '<bgRed>';\n case _ansiStyles2.default.bgGreen.open:\n return '<bgGreen>';\n case _ansiStyles2.default.bgYellow.open:\n return '<bgYellow>';\n case _ansiStyles2.default.inverse.open:\n return '<inverse>';\n case _ansiStyles2.default.dim.open:\n return '<dim>';\n case _ansiStyles2.default.bold.open:\n return '<bold>';\n default:\n return '';\n }\n });\n/**\n * Copyright (c) 2014-present, Facebook, Inc. All rights reserved.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n *\n */\n\nconst test = (exports.test = val =>\n typeof val === 'string' && val.match((0, _ansiRegex2.default)()));\n\nconst serialize = (exports.serialize = (\n val,\n config,\n indentation,\n depth,\n refs,\n printer\n) => printer(toHumanReadableAnsi(val), config, indentation, depth, refs));\n\nexports.default = {serialize: serialize, test: test};\n", "'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nexports.serialize = exports.test = undefined;\n\nvar _collections = require('../collections');\n\n/**\n * Copyright (c) 2014-present, Facebook, Inc. All rights reserved.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n *\n */\n\nconst SPACE = ' ';\n\nconst COLLECTION_NAMES = ['DOMStringMap', 'NamedNodeMap'];\n\nconst test = (exports.test = val =>\n val &&\n val.constructor &&\n COLLECTION_NAMES.indexOf(val.constructor.name) !== -1);\n\nconst convertCollectionToObject = collection => {\n let result = {};\n\n if (collection.constructor.name === 'NamedNodeMap') {\n for (let i = 0; i < collection.length; i++) {\n result[collection[i].name] = collection[i].value;\n }\n } else {\n result = Object.assign({}, collection);\n }\n\n return result;\n};\n\nconst serialize = (exports.serialize = (\n collection,\n config,\n indentation,\n depth,\n refs,\n printer\n) => {\n if (++depth > config.maxDepth) {\n return '[' + collection.constructor.name + ']';\n }\n\n return (\n collection.constructor.name +\n SPACE +\n '{' +\n (0, _collections.printObjectProperties)(\n convertCollectionToObject(collection),\n config,\n indentation,\n depth,\n refs,\n printer\n ) +\n '}'\n );\n});\n\nexports.default = {serialize: serialize, test: test};\n", "'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nexports.default = escapeHTML;\n/**\n * Copyright (c) 2014-present, Facebook, Inc. All rights reserved.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n *\n */\n\nfunction escapeHTML(str) {\n return str.replace(/</g, '<').replace(/>/g, '>');\n}\n", "'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nexports.printElementAsLeaf = exports.printElement = exports.printComment = exports.printText = exports.printChildren = exports.printProps = undefined;\n\nvar _escape_html = require('./escape_html');\n\nvar _escape_html2 = _interopRequireDefault(_escape_html);\n\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {default: obj};\n}\n\n// Return empty string if keys is empty.\n/**\n * Copyright (c) 2014-present, Facebook, Inc. All rights reserved.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n *\n */\n\nconst printProps = (exports.printProps = (\n keys,\n props,\n config,\n indentation,\n depth,\n refs,\n printer\n) => {\n const indentationNext = indentation + config.indent;\n const colors = config.colors;\n return keys\n .map(key => {\n const value = props[key];\n let printed = printer(value, config, indentationNext, depth, refs);\n\n if (typeof value !== 'string') {\n if (printed.indexOf('\\n') !== -1) {\n printed =\n config.spacingOuter +\n indentationNext +\n printed +\n config.spacingOuter +\n indentation;\n }\n printed = '{' + printed + '}';\n }\n\n return (\n config.spacingInner +\n indentation +\n colors.prop.open +\n key +\n colors.prop.close +\n '=' +\n colors.value.open +\n printed +\n colors.value.close\n );\n })\n .join('');\n});\n\n// Return empty string if children is empty.\nconst printChildren = (exports.printChildren = (\n children,\n config,\n indentation,\n depth,\n refs,\n printer\n) =>\n children\n .map(\n child =>\n config.spacingOuter +\n indentation +\n (typeof child === 'string'\n ? printText(child, config)\n : printer(child, config, indentation, depth, refs))\n )\n .join(''));\n\nconst printText = (exports.printText = (text, config) => {\n const contentColor = config.colors.content;\n return (\n contentColor.open + (0, _escape_html2.default)(text) + contentColor.close\n );\n});\n\nconst printComment = (exports.printComment = (comment, config) => {\n const commentColor = config.colors.comment;\n return (\n commentColor.open +\n '<!--' +\n (0, _escape_html2.default)(comment) +\n '-->' +\n commentColor.close\n );\n});\n\n// Separate the functions to format props, children, and element,\n// so a plugin could override a particular function, if needed.\n// Too bad, so sad: the traditional (but unnecessary) space\n// in a self-closing tagColor requires a second test of printedProps.\nconst printElement = (exports.printElement = (\n type,\n printedProps,\n printedChildren,\n config,\n indentation\n) => {\n const tagColor = config.colors.tag;\n return (\n tagColor.open +\n '<' +\n type +\n (printedProps &&\n tagColor.close +\n printedProps +\n config.spacingOuter +\n indentation +\n tagColor.open) +\n (printedChildren\n ? '>' +\n tagColor.close +\n printedChildren +\n config.spacingOuter +\n indentation +\n tagColor.open +\n '</' +\n type\n : (printedProps && !config.min ? '' : ' ') + '/') +\n '>' +\n tagColor.close\n );\n});\n\nconst printElementAsLeaf = (exports.printElementAsLeaf = (type, config) => {\n const tagColor = config.colors.tag;\n return (\n tagColor.open +\n '<' +\n type +\n tagColor.close +\n ' \u2026' +\n tagColor.open +\n ' />' +\n tagColor.close\n );\n});\n", "'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nexports.serialize = exports.test = undefined;\n\nvar _markup = require('./lib/markup');\n\n/**\n * Copyright (c) 2014-present, Facebook, Inc. All rights reserved.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n *\n */\n\nconst ELEMENT_NODE = 1;\nconst TEXT_NODE = 3;\nconst COMMENT_NODE = 8;\nconst FRAGMENT_NODE = 11;\n\nconst ELEMENT_REGEXP = /^((HTML|SVG)\\w*)?Element$/;\n\nconst testNode = (nodeType, name) =>\n (nodeType === ELEMENT_NODE && ELEMENT_REGEXP.test(name)) ||\n (nodeType === TEXT_NODE && name === 'Text') ||\n (nodeType === COMMENT_NODE && name === 'Comment') ||\n (nodeType === FRAGMENT_NODE && name === 'DocumentFragment');\n\nconst test = (exports.test = val =>\n val &&\n val.constructor &&\n val.constructor.name &&\n testNode(val.nodeType, val.constructor.name));\n\n// Convert array of attribute objects to keys array and props object.\nconst keysMapper = attribute => attribute.name;\nconst propsReducer = (props, attribute) => {\n props[attribute.name] = attribute.value;\n return props;\n};\n\nconst serialize = (exports.serialize = (\n node,\n config,\n indentation,\n depth,\n refs,\n printer\n) => {\n if (node.nodeType === TEXT_NODE) {\n return (0, _markup.printText)(node.data, config);\n }\n\n if (node.nodeType === COMMENT_NODE) {\n return (0, _markup.printComment)(node.data, config);\n }\n\n const type =\n node.nodeType === FRAGMENT_NODE\n ? `DocumentFragment`\n : node.tagName.toLowerCase();\n\n if (++depth > config.maxDepth) {\n return (0, _markup.printElementAsLeaf)(type, config);\n }\n\n return (0, _markup.printElement)(\n type,\n (0, _markup.printProps)(\n Array.prototype.map.call(node.attributes || [], keysMapper).sort(),\n Array.prototype.reduce.call(node.attributes || [], propsReducer, {}),\n config,\n indentation + config.indent,\n depth,\n refs,\n printer\n ),\n (0, _markup.printChildren)(\n Array.prototype.slice.call(node.childNodes || node.children),\n config,\n indentation + config.indent,\n depth,\n refs,\n printer\n ),\n config,\n indentation\n );\n});\n\nexports.default = {serialize: serialize, test: test};\n", "'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nexports.test = exports.serialize = undefined;\n\nvar _collections = require('../collections');\n\n// SENTINEL constants are from https://github.com/facebook/immutable-js\n/**\n * Copyright (c) 2014-present, Facebook, Inc. All rights reserved.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n *\n */\n\nconst IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@';\nconst IS_LIST_SENTINEL = '@@__IMMUTABLE_LIST__@@';\nconst IS_KEYED_SENTINEL = '@@__IMMUTABLE_KEYED__@@';\nconst IS_MAP_SENTINEL = '@@__IMMUTABLE_MAP__@@';\nconst IS_ORDERED_SENTINEL = '@@__IMMUTABLE_ORDERED__@@';\nconst IS_RECORD_SENTINEL = '@@__IMMUTABLE_RECORD__@@'; // immutable v4\nconst IS_SEQ_SENTINEL = '@@__IMMUTABLE_SEQ__@@';\nconst IS_SET_SENTINEL = '@@__IMMUTABLE_SET__@@';\nconst IS_STACK_SENTINEL = '@@__IMMUTABLE_STACK__@@';\n\nconst getImmutableName = name => 'Immutable.' + name;\nconst printAsLeaf = name => '[' + name + ']';\nconst SPACE = ' ';\nconst LAZY = '\u2026'; // Seq is lazy if it calls a method like filter\n\nconst printImmutableEntries = (\n val,\n config,\n indentation,\n depth,\n refs,\n printer,\n type\n) =>\n ++depth > config.maxDepth\n ? printAsLeaf(getImmutableName(type))\n : getImmutableName(type) +\n SPACE +\n '{' +\n (0, _collections.printIteratorEntries)(\n val.entries(),\n config,\n indentation,\n depth,\n refs,\n printer\n ) +\n '}';\n\n// Record has an entries method because it is a collection in immutable v3.\n// Return an iterator for Immutable Record from version v3 or v4.\nconst getRecordEntries = val => {\n let i = 0;\n return {\n next: function() {\n if (i < val._keys.length) {\n const key = val._keys[i++];\n return {done: false, value: [key, val.get(key)]};\n }\n return {done: true};\n }\n };\n};\n\nconst printImmutableRecord = (\n val,\n config,\n indentation,\n depth,\n refs,\n printer\n) => {\n // _name property is defined only for an Immutable Record instance\n // which was constructed with a second optional descriptive name arg\n const name = getImmutableName(val._name || 'Record');\n return ++depth > config.maxDepth\n ? printAsLeaf(name)\n : name +\n SPACE +\n '{' +\n (0, _collections.printIteratorEntries)(\n getRecordEntries(val),\n config,\n indentation,\n depth,\n refs,\n printer\n ) +\n '}';\n};\n\nconst printImmutableSeq = (val, config, indentation, depth, refs, printer) => {\n const name = getImmutableName('Seq');\n\n if (++depth > config.maxDepth) {\n return printAsLeaf(name);\n }\n\n if (val[IS_KEYED_SENTINEL]) {\n return (\n name +\n SPACE +\n '{' +\n // from Immutable collection of entries or from ECMAScript object\n (val._iter || val._object\n ? (0, _collections.printIteratorEntries)(\n val.entries(),\n config,\n indentation,\n depth,\n refs,\n printer\n )\n : LAZY) +\n '}'\n );\n }\n\n return (\n name +\n SPACE +\n '[' +\n (val._iter || // from Immutable collection of values\n val._array || // from ECMAScript array\n val._collection || // from ECMAScript collection in immutable v4\n val._iterable // from ECMAScript collection in immutable v3\n ? (0, _collections.printIteratorValues)(\n val.values(),\n config,\n indentation,\n depth,\n refs,\n printer\n )\n : LAZY) +\n ']'\n );\n};\n\nconst printImmutableValues = (\n val,\n config,\n indentation,\n depth,\n refs,\n printer,\n type\n) =>\n ++depth > config.maxDepth\n ? printAsLeaf(getImmutableName(type))\n : getImmutableName(type) +\n SPACE +\n '[' +\n (0, _collections.printIteratorValues)(\n val.values(),\n config,\n indentation,\n depth,\n refs,\n printer\n ) +\n ']';\n\nconst serialize = (exports.serialize = (\n val,\n config,\n indentation,\n depth,\n refs,\n printer\n) => {\n if (val[IS_MAP_SENTINEL]) {\n return printImmutableEntries(\n val,\n config,\n indentation,\n depth,\n refs,\n printer,\n val[IS_ORDERED_SENTINEL] ? 'OrderedMap' : 'Map'\n );\n }\n\n if (val[IS_LIST_SENTINEL]) {\n return printImmutableValues(\n val,\n config,\n indentation,\n depth,\n refs,\n printer,\n 'List'\n );\n }\n if (val[IS_SET_SENTINEL]) {\n return printImmutableValues(\n val,\n config,\n indentation,\n depth,\n refs,\n printer,\n val[IS_ORDERED_SENTINEL] ? 'OrderedSet' : 'Set'\n );\n }\n if (val[IS_STACK_SENTINEL]) {\n return printImmutableValues(\n val,\n config,\n indentation,\n depth,\n refs,\n printer,\n 'Stack'\n );\n }\n\n if (val[IS_SEQ_SENTINEL]) {\n return printImmutableSeq(val, config, indentation, depth, refs, printer);\n }\n\n // For compatibility with immutable v3 and v4, let record be the default.\n return printImmutableRecord(val, config, indentation, depth, refs, printer);\n});\n\n// Explicitly comparing sentinel properties to true avoids false positive\n// when mock identity-obj-proxy returns the key as the value for any key.\nconst test = (exports.test = val =>\n val &&\n (val[IS_ITERABLE_SENTINEL] === true || val[IS_RECORD_SENTINEL] === true));\n\nexports.default = {serialize: serialize, test: test};\n", "'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nexports.test = exports.serialize = undefined;\n\nvar _markup = require('./lib/markup');\n\n/**\n * Copyright (c) 2014-present, Facebook, Inc. All rights reserved.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n *\n */\n\nconst elementSymbol = Symbol.for('react.element');\nconst fragmentSymbol = Symbol.for('react.fragment');\nconst forwardRefSymbol = Symbol.for('react.forward_ref');\nconst providerSymbol = Symbol.for('react.provider');\nconst contextSymbol = Symbol.for('react.context');\n\n// Given element.props.children, or subtree during recursive traversal,\n// return flattened array of children.\nconst getChildren = function(arg) {\n let children =\n arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n\n if (Array.isArray(arg)) {\n arg.forEach(item => {\n getChildren(item, children);\n });\n } else if (arg != null && arg !== false) {\n children.push(arg);\n }\n return children;\n};\n\nconst getType = element => {\n const type = element.type;\n if (typeof type === 'string') {\n return type;\n }\n if (typeof type === 'function') {\n return type.displayName || type.name || 'Unknown';\n }\n if (type === fragmentSymbol) {\n return 'React.Fragment';\n }\n if (typeof type === 'object' && type !== null) {\n if (type.$$typeof === providerSymbol) {\n return 'Context.Provider';\n }\n\n if (type.$$typeof === contextSymbol) {\n return 'Context.Consumer';\n }\n\n if (type.$$typeof === forwardRefSymbol) {\n const functionName = type.render.displayName || type.render.name || '';\n\n return functionName !== ''\n ? 'ForwardRef(' + functionName + ')'\n : 'ForwardRef';\n }\n }\n return 'UNDEFINED';\n};\n\nconst getPropKeys = element => {\n const props = element.props;\n\n return Object.keys(props)\n .filter(key => key !== 'children' && props[key] !== undefined)\n .sort();\n};\n\nconst serialize = (exports.serialize = (\n element,\n config,\n indentation,\n depth,\n refs,\n printer\n) =>\n ++depth > config.maxDepth\n ? (0, _markup.printElementAsLeaf)(getType(element), config)\n : (0, _markup.printElement)(\n getType(element),\n (0, _markup.printProps)(\n getPropKeys(element),\n element.props,\n config,\n indentation + config.indent,\n depth,\n refs,\n printer\n ),\n (0, _markup.printChildren)(\n getChildren(element.props.children),\n config,\n indentation + config.indent,\n depth,\n refs,\n printer\n ),\n config,\n indentation\n ));\n\nconst test = (exports.test = val => val && val.$$typeof === elementSymbol);\n\nexports.default = {serialize: serialize, test: test};\n", "'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nexports.test = exports.serialize = undefined;\n\nvar _markup = require('./lib/markup');\n\n/**\n * Copyright (c) 2014-present, Facebook, Inc. All rights reserved.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n *\n */\n\nconst testSymbol = Symbol.for('react.test.json');\n\nconst getPropKeys = object => {\n const props = object.props;\n\n return props\n ? Object.keys(props)\n .filter(key => props[key] !== undefined)\n .sort()\n : [];\n};\n\nconst serialize = (exports.serialize = (\n object,\n config,\n indentation,\n depth,\n refs,\n printer\n) =>\n ++depth > config.maxDepth\n ? (0, _markup.printElementAsLeaf)(object.type, config)\n : (0, _markup.printElement)(\n object.type,\n object.props\n ? (0, _markup.printProps)(\n getPropKeys(object),\n // Despite ternary expression, Flow 0.51.0 found incorrect error:\n // undefined is incompatible with the expected param type of Object\n // $FlowFixMe\n object.props,\n config,\n indentation + config.indent,\n depth,\n refs,\n printer\n )\n : '',\n object.children\n ? (0, _markup.printChildren)(\n object.children,\n config,\n indentation + config.indent,\n depth,\n refs,\n printer\n )\n : '',\n config,\n indentation\n ));\n\nconst test = (exports.test = val => val && val.$$typeof === testSymbol);\n\nexports.default = {serialize: serialize, test: test};\n", "'use strict';\n\nvar _ansiStyles = require('ansi-styles');\n\nvar _ansiStyles2 = _interopRequireDefault(_ansiStyles);\n\nvar _collections = require('./collections');\n\nvar _asymmetric_matcher = require('./plugins/asymmetric_matcher');\n\nvar _asymmetric_matcher2 = _interopRequireDefault(_asymmetric_matcher);\n\nvar _convert_ansi = require('./plugins/convert_ansi');\n\nvar _convert_ansi2 = _interopRequireDefault(_convert_ansi);\n\nvar _dom_collection = require('./plugins/dom_collection');\n\nvar _dom_collection2 = _interopRequireDefault(_dom_collection);\n\nvar _dom_element = require('./plugins/dom_element');\n\nvar _dom_element2 = _interopRequireDefault(_dom_element);\n\nvar _immutable = require('./plugins/immutable');\n\nvar _immutable2 = _interopRequireDefault(_immutable);\n\nvar _react_element = require('./plugins/react_element');\n\nvar _react_element2 = _interopRequireDefault(_react_element);\n\nvar _react_test_component = require('./plugins/react_test_component');\n\nvar _react_test_component2 = _interopRequireDefault(_react_test_component);\n\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {default: obj};\n}\n\n/**\n * Copyright (c) 2014-present, Facebook, Inc. All rights reserved.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n *\n */\n\nconst toString = Object.prototype.toString;\nconst toISOString = Date.prototype.toISOString;\nconst errorToString = Error.prototype.toString;\nconst regExpToString = RegExp.prototype.toString;\nconst symbolToString = Symbol.prototype.toString;\n\n// Explicitly comparing typeof constructor to function avoids undefined as name\n// when mock identity-obj-proxy returns the key as the value for any key.\nconst getConstructorName = val =>\n (typeof val.constructor === 'function' && val.constructor.name) || 'Object';\n\n// Is val is equal to global window object? Works even if it does not exist :)\n/* global window */\nconst isWindow = val => typeof window !== 'undefined' && val === window;\n\nconst SYMBOL_REGEXP = /^Symbol\\((.*)\\)(.*)$/;\nconst NEWLINE_REGEXP = /\\n/gi;\n\nclass PrettyFormatPluginError extends Error {\n constructor(message, stack) {\n super(message);\n this.stack = stack;\n this.name = this.constructor.name;\n }\n}\n\nfunction isToStringedArrayType(toStringed) {\n return (\n toStringed === '[object Array]' ||\n toStringed === '[object ArrayBuffer]' ||\n toStringed === '[object DataView]' ||\n toStringed === '[object Float32Array]' ||\n toStringed === '[object Float64Array]' ||\n toStringed === '[object Int8Array]' ||\n toStringed === '[object Int16Array]' ||\n toStringed === '[object Int32Array]' ||\n toStringed === '[object Uint8Array]' ||\n toStringed === '[object Uint8ClampedArray]' ||\n toStringed === '[object Uint16Array]' ||\n toStringed === '[object Uint32Array]'\n );\n}\n\nfunction printNumber(val) {\n return Object.is(val, -0) ? '-0' : String(val);\n}\n\nfunction printFunction(val, printFunctionName) {\n if (!printFunctionName) {\n return '[Function]';\n }\n return '[Function ' + (val.name || 'anonymous') + ']';\n}\n\nfunction printSymbol(val) {\n return symbolToString.call(val).replace(SYMBOL_REGEXP, 'Symbol($1)');\n}\n\nfunction printError(val) {\n return '[' + errorToString.call(val) + ']';\n}\n\nfunction printBasicValue(val, printFunctionName, escapeRegex) {\n if (val === true || val === false) {\n return '' + val;\n }\n if (val === undefined) {\n return 'undefined';\n }\n if (val === null) {\n return 'null';\n }\n\n const typeOf = typeof val;\n\n if (typeOf === 'number') {\n return printNumber(val);\n }\n if (typeOf === 'string') {\n return '\"' + val.replace(/\"|\\\\/g, '\\\\$&') + '\"';\n }\n if (typeOf === 'function') {\n return printFunction(val, printFunctionName);\n }\n if (typeOf === 'symbol') {\n return printSymbol(val);\n }\n\n const toStringed = toString.call(val);\n\n if (toStringed === '[object WeakMap]') {\n return 'WeakMap {}';\n }\n if (toStringed === '[object WeakSet]') {\n return 'WeakSet {}';\n }\n if (\n toStringed === '[object Function]' ||\n toStringed === '[object GeneratorFunction]'\n ) {\n return printFunction(val, printFunctionName);\n }\n if (toStringed === '[object Symbol]') {\n return printSymbol(val);\n }\n if (toStringed === '[object Date]') {\n return isNaN(+val) ? 'Date { NaN }' : toISOString.call(val);\n }\n if (toStringed === '[object Error]') {\n return printError(val);\n }\n if (toStringed === '[object RegExp]') {\n if (escapeRegex) {\n // https://github.com/benjamingr/RegExp.escape/blob/master/polyfill.js\n return regExpToString.call(val).replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n }\n return regExpToString.call(val);\n }\n\n if (val instanceof Error) {\n return printError(val);\n }\n\n return null;\n}\n\nfunction printComplexValue(\n val,\n config,\n indentation,\n depth,\n refs,\n hasCalledToJSON\n) {\n if (refs.indexOf(val) !== -1) {\n return '[Circular]';\n }\n refs = refs.slice();\n refs.push(val);\n\n const hitMaxDepth = ++depth > config.maxDepth;\n const min = config.min;\n\n if (\n config.callToJSON &&\n !hitMaxDepth &&\n val.toJSON &&\n typeof val.toJSON === 'function' &&\n !hasCalledToJSON\n ) {\n return printer(val.toJSON(), config, indentation, depth, refs, true);\n }\n\n const toStringed = toString.call(val);\n if (toStringed === '[object Arguments]') {\n return hitMaxDepth\n ? '[Arguments]'\n : (min ? '' : 'Arguments ') +\n '[' +\n (0, _collections.printListItems)(\n val,\n config,\n indentation,\n depth,\n refs,\n printer\n ) +\n ']';\n }\n if (isToStringedArrayType(toStringed)) {\n return hitMaxDepth\n ? '[' + val.constructor.name + ']'\n : (min ? '' : val.constructor.name + ' ') +\n '[' +\n (0, _collections.printListItems)(\n val,\n config,\n indentation,\n depth,\n refs,\n printer\n ) +\n ']';\n }\n if (toStringed === '[object Map]') {\n return hitMaxDepth\n ? '[Map]'\n : 'Map {' +\n (0, _collections.printIteratorEntries)(\n val.entries(),\n config,\n indentation,\n depth,\n refs,\n printer,\n ' => '\n ) +\n '}';\n }\n if (toStringed === '[object Set]') {\n return hitMaxDepth\n ? '[Set]'\n : 'Set {' +\n (0, _collections.printIteratorValues)(\n val.values(),\n config,\n indentation,\n depth,\n refs,\n printer\n ) +\n '}';\n }\n\n // Avoid failure to serialize global window object in jsdom test environment.\n // For example, not even relevant if window is prop of React element.\n return hitMaxDepth || isWindow(val)\n ? '[' + getConstructorName(val) + ']'\n : (min ? '' : getConstructorName(val) + ' ') +\n '{' +\n (0, _collections.printObjectProperties)(\n val,\n config,\n indentation,\n depth,\n refs,\n printer\n ) +\n '}';\n}\n\nfunction printPlugin(plugin, val, config, indentation, depth, refs) {\n let printed;\n\n try {\n printed = plugin.serialize\n ? plugin.serialize(val, config, indentation, depth, refs, printer)\n : plugin.print(\n val,\n valChild => printer(valChild, config, indentation, depth, refs),\n str => {\n const indentationNext = indentation + config.indent;\n return (\n indentationNext +\n str.replace(NEWLINE_REGEXP, '\\n' + indentationNext)\n );\n },\n {\n edgeSpacing: config.spacingOuter,\n min: config.min,\n spacing: config.spacingInner\n },\n config.colors\n );\n } catch (error) {\n throw new PrettyFormatPluginError(error.message, error.stack);\n }\n if (typeof printed !== 'string') {\n throw new Error(\n `pretty-format: Plugin must return type \"string\" but instead returned \"${typeof printed}\".`\n );\n }\n return printed;\n}\n\nfunction findPlugin(plugins, val) {\n for (let p = 0; p < plugins.length; p++) {\n try {\n if (plugins[p].test(val)) {\n return plugins[p];\n }\n } catch (error) {\n throw new PrettyFormatPluginError(error.message, error.stack);\n }\n }\n\n return null;\n}\n\nfunction printer(val, config, indentation, depth, refs, hasCalledToJSON) {\n const plugin = findPlugin(config.plugins, val);\n if (plugin !== null) {\n return printPlugin(plugin, val, config, indentation, depth, refs);\n }\n\n const basicResult = printBasicValue(\n val,\n config.printFunctionName,\n config.escapeRegex\n );\n if (basicResult !== null) {\n return basicResult;\n }\n\n return printComplexValue(\n val,\n config,\n indentation,\n depth,\n refs,\n hasCalledToJSON\n );\n}\n\nconst DEFAULT_THEME = {\n comment: 'gray',\n content: 'reset',\n prop: 'yellow',\n tag: 'cyan',\n value: 'green'\n};\n\nconst DEFAULT_THEME_KEYS = Object.keys(DEFAULT_THEME);\n\nconst DEFAULT_OPTIONS = {\n callToJSON: true,\n escapeRegex: false,\n highlight: false,\n indent: 2,\n maxDepth: Infinity,\n min: false,\n plugins: [],\n printFunctionName: true,\n theme: DEFAULT_THEME\n};\n\nfunction validateOptions(options) {\n Object.keys(options).forEach(key => {\n if (!DEFAULT_OPTIONS.hasOwnProperty(key)) {\n throw new Error(`pretty-format: Unknown option \"${key}\".`);\n }\n });\n\n if (options.min && options.indent !== undefined && options.indent !== 0) {\n throw new Error(\n 'pretty-format: Options \"min\" and \"indent\" cannot be used together.'\n );\n }\n\n if (options.theme !== undefined) {\n if (options.theme === null) {\n throw new Error(`pretty-format: Option \"theme\" must not be null.`);\n }\n\n if (typeof options.theme !== 'object') {\n throw new Error(\n `pretty-format: Option \"theme\" must be of type \"object\" but instead received \"${typeof options.theme}\".`\n );\n }\n }\n}\n\nconst getColorsHighlight = (\n options\n // $FlowFixMe: Flow thinks keys from `Colors` are missing from `DEFAULT_THEME_KEYS`\n) =>\n DEFAULT_THEME_KEYS.reduce((colors, key) => {\n const value =\n options.theme && options.theme[key] !== undefined\n ? options.theme[key]\n : DEFAULT_THEME[key];\n const color = _ansiStyles2.default[value];\n if (\n color &&\n typeof color.close === 'string' &&\n typeof color.open === 'string'\n ) {\n colors[key] = color;\n } else {\n throw new Error(\n `pretty-format: Option \"theme\" has a key \"${key}\" whose value \"${value}\" is undefined in ansi-styles.`\n );\n }\n return colors;\n }, Object.create(null));\n\nconst getColorsEmpty = () =>\n // $FlowFixMe: Flow thinks keys from `Colors` are missing from `DEFAULT_THEME_KEYS`\n DEFAULT_THEME_KEYS.reduce((colors, key) => {\n colors[key] = {close: '', open: ''};\n return colors;\n }, Object.create(null));\n\nconst getPrintFunctionName = options =>\n options && options.printFunctionName !== undefined\n ? options.printFunctionName\n : DEFAULT_OPTIONS.printFunctionName;\n\nconst getEscapeRegex = options =>\n options && options.escapeRegex !== undefined\n ? options.escapeRegex\n : DEFAULT_OPTIONS.escapeRegex;\n\nconst getConfig = options => ({\n callToJSON:\n options && options.callToJSON !== undefined\n ? options.callToJSON\n : DEFAULT_OPTIONS.callToJSON,\n colors:\n options && options.highlight\n ? getColorsHighlight(options)\n : getColorsEmpty(),\n escapeRegex: getEscapeRegex(options),\n indent:\n options && options.min\n ? ''\n : createIndent(\n options && options.indent !== undefined\n ? options.indent\n : DEFAULT_OPTIONS.indent\n ),\n maxDepth:\n options && options.maxDepth !== undefined\n ? options.maxDepth\n : DEFAULT_OPTIONS.maxDepth,\n min: options && options.min !== undefined ? options.min : DEFAULT_OPTIONS.min,\n plugins:\n options && options.plugins !== undefined\n ? options.plugins\n : DEFAULT_OPTIONS.plugins,\n printFunctionName: getPrintFunctionName(options),\n spacingInner: options && options.min ? ' ' : '\\n',\n spacingOuter: options && options.min ? '' : '\\n'\n});\n\nfunction createIndent(indent) {\n return new Array(indent + 1).join(' ');\n}\n\nfunction prettyFormat(val, options) {\n if (options) {\n validateOptions(options);\n if (options.plugins) {\n const plugin = findPlugin(options.plugins, val);\n if (plugin !== null) {\n return printPlugin(plugin, val, getConfig(options), '', 0, []);\n }\n }\n }\n\n const basicResult = printBasicValue(\n val,\n getPrintFunctionName(options),\n getEscapeRegex(options)\n );\n if (basicResult !== null) {\n return basicResult;\n }\n\n return printComplexValue(val, getConfig(options), '', 0, []);\n}\n\nprettyFormat.plugins = {\n AsymmetricMatcher: _asymmetric_matcher2.default,\n ConvertAnsi: _convert_ansi2.default,\n DOMCollection: _dom_collection2.default,\n DOMElement: _dom_element2.default,\n Immutable: _immutable2.default,\n ReactElement: _react_element2.default,\n ReactTestComponent: _react_test_component2.default\n};\n\nmodule.exports = prettyFormat;\n", "/**\n * @class TemplateTag\n * @classdesc Consumes a pipeline of composable transformer plugins and produces a template tag.\n */\nexport default class TemplateTag {\n /**\n * constructs a template tag\n * @constructs TemplateTag\n * @param {...Object} [...transformers] - an array or arguments list of transformers\n * @return {Function} - a template tag\n */\n constructor(...transformers) {\n // if first argument is an array, extrude it as a list of transformers\n if (transformers.length > 0 && Array.isArray(transformers[0])) {\n transformers = transformers[0];\n }\n\n // if any transformers are functions, this means they are not initiated - automatically initiate them\n this.transformers = transformers.map(transformer => {\n return typeof transformer === 'function' ? transformer() : transformer;\n });\n\n // return an ES2015 template tag\n return this.tag;\n }\n\n /**\n * Applies all transformers to a template literal tagged with this method.\n * If a function is passed as the first argument, assumes the function is a template tag\n * and applies it to the template, returning a template tag.\n * @param {(Function|String|Array<String>)} strings - Either a template tag or an array containing template strings separated by identifier\n * @param {...*} ...expressions - Optional list of substitution values.\n * @return {(String|Function)} - Either an intermediary tag function or the results of processing the template.\n */\n tag = (strings, ...expressions) => {\n if (typeof strings === 'function') {\n // if the first argument passed is a function, assume it is a template tag and return\n // an intermediary tag that processes the template using the aforementioned tag, passing the\n // result to our tag\n return this.interimTag.bind(this, strings);\n }\n\n if (typeof strings === 'string') {\n // if the first argument passed is a string, just transform it\n return this.transformEndResult(strings);\n }\n\n // else, return a transformed end result of processing the template with our tag\n strings = strings.map(this.transformString.bind(this));\n return this.transformEndResult(\n strings.reduce(this.processSubstitutions.bind(this, expressions)),\n );\n };\n\n /**\n * An intermediary template tag that receives a template tag and passes the result of calling the template with the received\n * template tag to our own template tag.\n * @param {Function} nextTag - the received template tag\n * @param {Array<String>} template - the template to process\n * @param {...*} ...substitutions - `substitutions` is an array of all substitutions in the template\n * @return {*} - the final processed value\n */\n interimTag(previousTag, template, ...substitutions) {\n return this.tag`${previousTag(template, ...substitutions)}`;\n }\n\n /**\n * Performs bulk processing on the tagged template, transforming each substitution and then\n * concatenating the resulting values into a string.\n * @param {Array<*>} substitutions - an array of all remaining substitutions present in this template\n * @param {String} resultSoFar - this iteration's result string so far\n * @param {String} remainingPart - the template chunk after the current substitution\n * @return {String} - the result of joining this iteration's processed substitution with the result\n */\n processSubstitutions(substitutions, resultSoFar, remainingPart) {\n const substitution = this.transformSubstitution(\n substitutions.shift(),\n resultSoFar,\n );\n return ''.concat(resultSoFar, substitution, remainingPart);\n }\n\n /**\n * Iterate through each transformer, applying the transformer's `onString` method to the template\n * strings before all substitutions are processed.\n * @param {String} str - The input string\n * @return {String} - The final results of processing each transformer\n */\n transformString(str) {\n const cb = (res, transform) =>\n transform.onString ? transform.onString(res) : res;\n return this.transformers.reduce(cb, str);\n }\n\n /**\n * When a substitution is encountered, iterates through each transformer and applies the transformer's\n * `onSubstitution` method to the substitution.\n * @param {*} substitution - The current substitution\n * @param {String} resultSoFar - The result up to and excluding this substitution.\n * @return {*} - The final result of applying all substitution transformations.\n */\n transformSubstitution(substitution, resultSoFar) {\n const cb = (res, transform) =>\n transform.onSubstitution\n ? transform.onSubstitution(res, resultSoFar)\n : res;\n return this.transformers.reduce(cb, substitution);\n }\n\n /**\n * Iterates through each transformer, applying the transformer's `onEndResult` method to the\n * template literal after all substitutions have finished processing.\n * @param {String} endResult - The processed template, just before it is returned from the tag\n * @return {String} - The final results of processing each transformer\n */\n transformEndResult(endResult) {\n const cb = (res, transform) =>\n transform.onEndResult ? transform.onEndResult(res) : res;\n return this.transformers.reduce(cb, endResult);\n }\n}\n", "/**\n * TemplateTag transformer that trims whitespace on the end result of a tagged template\n * @param {String} side = '' - The side of the string to trim. Can be 'start' or 'end' (alternatively 'left' or 'right')\n * @return {Object} - a TemplateTag transformer\n */\nconst trimResultTransformer = (side = '') => ({\n onEndResult(endResult) {\n if (side === '') {\n return endResult.trim();\n }\n\n side = side.toLowerCase();\n\n if (side === 'start' || side === 'left') {\n return endResult.replace(/^\\s*/, '');\n }\n\n if (side === 'end' || side === 'right') {\n return endResult.replace(/\\s*$/, '');\n }\n\n throw new Error(`Side not supported: ${side}`);\n },\n});\n\nexport default trimResultTransformer;\n", "/**\n * strips indentation from a template literal\n * @param {String} type = 'initial' - whether to remove all indentation or just leading indentation. can be 'all' or 'initial'\n * @return {Object} - a TemplateTag transformer\n */\nconst stripIndentTransformer = (type = 'initial') => ({\n onEndResult(endResult) {\n if (type === 'initial') {\n // remove the shortest leading indentation from each line\n const match = endResult.match(/^[^\\S\\n]*(?=\\S)/gm);\n const indent = match && Math.min(...match.map(el => el.length));\n if (indent) {\n const regexp = new RegExp(`^.{${indent}}`, 'gm');\n return endResult.replace(regexp, '');\n }\n return endResult;\n }\n if (type === 'all') {\n // remove all indentation from each line\n return endResult.replace(/^[^\\S\\n]+/gm, '');\n }\n throw new Error(`Unknown type: ${type}`);\n },\n});\n\nexport default stripIndentTransformer;\n", "/**\n * Replaces tabs, newlines and spaces with the chosen value when they occur in sequences\n * @param {(String|RegExp)} replaceWhat - the value or pattern that should be replaced\n * @param {*} replaceWith - the replacement value\n * @return {Object} - a TemplateTag transformer\n */\nconst replaceResultTransformer = (replaceWhat, replaceWith) => ({\n onEndResult(endResult) {\n if (replaceWhat == null || replaceWith == null) {\n throw new Error(\n 'replaceResultTransformer requires at least 2 arguments.',\n );\n }\n return endResult.replace(replaceWhat, replaceWith);\n },\n});\n\nexport default replaceResultTransformer;\n", "const replaceSubstitutionTransformer = (replaceWhat, replaceWith) => ({\n onSubstitution(substitution, resultSoFar) {\n if (replaceWhat == null || replaceWith == null) {\n throw new Error(\n 'replaceSubstitutionTransformer requires at least 2 arguments.',\n );\n }\n\n // Do not touch if null or undefined\n if (substitution == null) {\n return substitution;\n } else {\n return substitution.toString().replace(replaceWhat, replaceWith);\n }\n },\n});\n\nexport default replaceSubstitutionTransformer;\n", "const replaceStringTransformer = (replaceWhat, replaceWith) => ({\n onString(str) {\n if (replaceWhat == null || replaceWith == null) {\n throw new Error(\n 'replaceStringTransformer requires at least 2 arguments.',\n );\n }\n\n return str.replace(replaceWhat, replaceWith);\n },\n});\n\nexport default replaceStringTransformer;\n", "const defaults = {\n separator: '',\n conjunction: '',\n serial: false,\n};\n\n/**\n * Converts an array substitution to a string containing a list\n * @param {String} [opts.separator = ''] - the character that separates each item\n * @param {String} [opts.conjunction = ''] - replace the last separator with this\n * @param {Boolean} [opts.serial = false] - include the separator before the conjunction? (Oxford comma use-case)\n *\n * @return {Object} - a TemplateTag transformer\n */\nconst inlineArrayTransformer = (opts = defaults) => ({\n onSubstitution(substitution, resultSoFar) {\n // only operate on arrays\n if (Array.isArray(substitution)) {\n const arrayLength = substitution.length;\n const separator = opts.separator;\n const conjunction = opts.conjunction;\n const serial = opts.serial;\n // join each item in the array into a string where each item is separated by separator\n // be sure to maintain indentation\n const indent = resultSoFar.match(/(\\n?[^\\S\\n]+)$/);\n if (indent) {\n substitution = substitution.join(separator + indent[1]);\n } else {\n substitution = substitution.join(separator + ' ');\n }\n // if conjunction is set, replace the last separator with conjunction, but only if there is more than one substitution\n if (conjunction && arrayLength > 1) {\n const separatorIndex = substitution.lastIndexOf(separator);\n substitution =\n substitution.slice(0, separatorIndex) +\n (serial ? separator : '') +\n ' ' +\n conjunction +\n substitution.slice(separatorIndex + 1);\n }\n }\n return substitution;\n },\n});\n\nexport default inlineArrayTransformer;\n", "const splitStringTransformer = splitBy => ({\n onSubstitution(substitution, resultSoFar) {\n if (splitBy != null && typeof splitBy === 'string') {\n if (typeof substitution === 'string' && substitution.includes(splitBy)) {\n substitution = substitution.split(splitBy);\n }\n } else {\n throw new Error('You need to specify a string character to split by.');\n }\n return substitution;\n },\n});\n\nexport default splitStringTransformer;\n", "const isValidValue = x =>\n x != null && !Number.isNaN(x) && typeof x !== 'boolean';\n\nconst removeNonPrintingValuesTransformer = () => ({\n onSubstitution(substitution) {\n if (Array.isArray(substitution)) {\n return substitution.filter(isValidValue);\n }\n if (isValidValue(substitution)) {\n return substitution;\n }\n return '';\n },\n});\n\nexport default removeNonPrintingValuesTransformer;\n", "import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nconst commaLists = new TemplateTag(\n inlineArrayTransformer({ separator: ',' }),\n stripIndentTransformer,\n trimResultTransformer,\n);\n\nexport default commaLists;\n", "import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nconst commaListsAnd = new TemplateTag(\n inlineArrayTransformer({ separator: ',', conjunction: 'and' }),\n stripIndentTransformer,\n trimResultTransformer,\n);\n\nexport default commaListsAnd;\n", "import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nconst commaListsOr = new TemplateTag(\n inlineArrayTransformer({ separator: ',', conjunction: 'or' }),\n stripIndentTransformer,\n trimResultTransformer,\n);\n\nexport default commaListsOr;\n", "import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport splitStringTransformer from '../splitStringTransformer';\nimport removeNonPrintingValuesTransformer from '../removeNonPrintingValuesTransformer';\n\nconst html = new TemplateTag(\n splitStringTransformer('\\n'),\n removeNonPrintingValuesTransformer,\n inlineArrayTransformer,\n stripIndentTransformer,\n trimResultTransformer,\n);\n\nexport default html;\n", "import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport splitStringTransformer from '../splitStringTransformer';\nimport replaceSubstitutionTransformer from '../replaceSubstitutionTransformer';\n\nconst safeHtml = new TemplateTag(\n splitStringTransformer('\\n'),\n inlineArrayTransformer,\n stripIndentTransformer,\n trimResultTransformer,\n replaceSubstitutionTransformer(/&/g, '&'),\n replaceSubstitutionTransformer(/</g, '<'),\n replaceSubstitutionTransformer(/>/g, '>'),\n replaceSubstitutionTransformer(/\"/g, '"'),\n replaceSubstitutionTransformer(/'/g, '''),\n replaceSubstitutionTransformer(/`/g, '`'),\n);\n\nexport default safeHtml;\n", "import TemplateTag from '../TemplateTag';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nconst oneLine = new TemplateTag(\n replaceResultTransformer(/(?:\\n(?:\\s*))+/g, ' '),\n trimResultTransformer,\n);\n\nexport default oneLine;\n", "import TemplateTag from '../TemplateTag';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nconst oneLineTrim = new TemplateTag(\n replaceResultTransformer(/(?:\\n\\s*)/g, ''),\n trimResultTransformer,\n);\n\nexport default oneLineTrim;\n", "import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nconst oneLineCommaLists = new TemplateTag(\n inlineArrayTransformer({ separator: ',' }),\n replaceResultTransformer(/(?:\\s+)/g, ' '),\n trimResultTransformer,\n);\n\nexport default oneLineCommaLists;\n", "import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nconst oneLineCommaListsOr = new TemplateTag(\n inlineArrayTransformer({ separator: ',', conjunction: 'or' }),\n replaceResultTransformer(/(?:\\s+)/g, ' '),\n trimResultTransformer,\n);\n\nexport default oneLineCommaListsOr;\n", "import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nconst oneLineCommaListsAnd = new TemplateTag(\n inlineArrayTransformer({ separator: ',', conjunction: 'and' }),\n replaceResultTransformer(/(?:\\s+)/g, ' '),\n trimResultTransformer,\n);\n\nexport default oneLineCommaListsAnd;\n", "import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nconst inlineLists = new TemplateTag(\n inlineArrayTransformer,\n stripIndentTransformer,\n trimResultTransformer,\n);\n\nexport default inlineLists;\n", "import TemplateTag from '../TemplateTag';\nimport inlineArrayTransformer from '../inlineArrayTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\nimport replaceResultTransformer from '../replaceResultTransformer';\n\nconst oneLineInlineLists = new TemplateTag(\n inlineArrayTransformer,\n replaceResultTransformer(/(?:\\s+)/g, ' '),\n trimResultTransformer,\n);\n\nexport default oneLineInlineLists;\n", "import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nconst stripIndent = new TemplateTag(\n stripIndentTransformer,\n trimResultTransformer,\n);\n\nexport default stripIndent;\n", "import TemplateTag from '../TemplateTag';\nimport stripIndentTransformer from '../stripIndentTransformer';\nimport trimResultTransformer from '../trimResultTransformer';\n\nconst stripIndents = new TemplateTag(\n stripIndentTransformer('all'),\n trimResultTransformer,\n);\n\nexport default stripIndents;\n", "// core\nexport TemplateTag from './TemplateTag';\n\n// transformers\nexport trimResultTransformer from './trimResultTransformer';\nexport stripIndentTransformer from './stripIndentTransformer';\nexport replaceResultTransformer from './replaceResultTransformer';\nexport replaceSubstitutionTransformer from './replaceSubstitutionTransformer';\nexport replaceStringTransformer from './replaceStringTransformer';\nexport inlineArrayTransformer from './inlineArrayTransformer';\nexport splitStringTransformer from './splitStringTransformer';\nexport removeNonPrintingValuesTransformer from './removeNonPrintingValuesTransformer';\n\n// tags\nexport commaLists from './commaLists';\nexport commaListsAnd from './commaListsAnd';\nexport commaListsOr from './commaListsOr';\nexport html from './html';\nexport codeBlock from './codeBlock';\nexport source from './source';\nexport safeHtml from './safeHtml';\nexport oneLine from './oneLine';\nexport oneLineTrim from './oneLineTrim';\nexport oneLineCommaLists from './oneLineCommaLists';\nexport oneLineCommaListsOr from './oneLineCommaListsOr';\nexport oneLineCommaListsAnd from './oneLineCommaListsAnd';\nexport inlineLists from './inlineLists';\nexport oneLineInlineLists from './oneLineInlineLists';\nexport stripIndent from './stripIndent';\nexport stripIndents from './stripIndents';\n", "'use strict';\n\nmodule.exports = (string, count = 1, options) => {\n\toptions = {\n\t\tindent: ' ',\n\t\tincludeEmptyLines: false,\n\t\t...options\n\t};\n\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError(\n\t\t\t`Expected \\`input\\` to be a \\`string\\`, got \\`${typeof string}\\``\n\t\t);\n\t}\n\n\tif (typeof count !== 'number') {\n\t\tthrow new TypeError(\n\t\t\t`Expected \\`count\\` to be a \\`number\\`, got \\`${typeof count}\\``\n\t\t);\n\t}\n\n\tif (typeof options.indent !== 'string') {\n\t\tthrow new TypeError(\n\t\t\t`Expected \\`options.indent\\` to be a \\`string\\`, got \\`${typeof options.indent}\\``\n\t\t);\n\t}\n\n\tif (count === 0) {\n\t\treturn string;\n\t}\n\n\tconst regex = options.includeEmptyLines ? /^/gm : /^(?!\\s*$)/gm;\n\n\treturn string.replace(regex, options.indent.repeat(count));\n};\n", "/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n \"use strict\";\n if (typeof define === 'function' && define.amd) {\n define(definition);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = definition();\n } else {\n root.log = definition();\n }\n}(this, function () {\n \"use strict\";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = \"undefined\";\n var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n /Trident\\/|MSIE /.test(window.navigator.userAgent)\n );\n\n var logMethods = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n ];\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\n function traceForIE() {\n if (console.log) {\n if (console.log.apply) {\n console.log.apply(console, arguments);\n } else {\n // In old IE, native console methods themselves don't have apply().\n Function.prototype.apply.apply(console.log, [console, arguments]);\n }\n }\n if (console.trace) console.trace();\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (methodName === 'trace' && isIE) {\n return traceForIE;\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods(level, loggerName) {\n /*jshint validthis:true */\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, loggerName);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName, level, loggerName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this, level, loggerName);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, level, loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, defaultLevel, factory) {\n var self = this;\n var currentLevel;\n var storageKey = \"loglevel\";\n if (name) {\n storageKey += \":\" + name;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n if (typeof window === undefinedType) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var location = cookie.indexOf(\n encodeURIComponent(storageKey) + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n \"ERROR\": 4, \"SILENT\": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n return currentLevel;\n };\n\n self.setLevel = function (level, persist) {\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n currentLevel = level;\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(level);\n }\n replaceLoggingMethods.call(self, level, name);\n if (typeof console === undefinedType && level < self.levels.SILENT) {\n return \"No console available for logging\";\n }\n } else {\n throw \"log.setLevel() called with invalid level: \" + level;\n }\n };\n\n self.setDefaultLevel = function (level) {\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n // Initialize with the right level\n var initialLevel = getPersistedLevel();\n if (initialLevel == null) {\n initialLevel = defaultLevel == null ? \"WARN\" : defaultLevel;\n }\n self.setLevel(initialLevel, false);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n var defaultLogger = new Logger();\n\n var _loggersByName = {};\n defaultLogger.getLogger = function getLogger(name) {\n if (typeof name !== \"string\" || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name, defaultLogger.getLevel(), defaultLogger.methodFactory);\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n return defaultLogger;\n}));\n", "'use strict';\n\nvar matchOperatorsRe = /[|\\\\{}()[\\]^$+*?.]/g;\n\nmodule.exports = function (str) {\n\tif (typeof str !== 'string') {\n\t\tthrow new TypeError('Expected a string');\n\t}\n\n\treturn str.replace(matchOperatorsRe, '\\\\$&');\n};\n", "'use strict';\n\nfunction assembleStyles () {\n\tvar styles = {\n\t\tmodifiers: {\n\t\t\treset: [0, 0],\n\t\t\tbold: [1, 22], // 21 isn't widely supported and 22 does the same thing\n\t\t\tdim: [2, 22],\n\t\t\titalic: [3, 23],\n\t\t\tunderline: [4, 24],\n\t\t\tinverse: [7, 27],\n\t\t\thidden: [8, 28],\n\t\t\tstrikethrough: [9, 29]\n\t\t},\n\t\tcolors: {\n\t\t\tblack: [30, 39],\n\t\t\tred: [31, 39],\n\t\t\tgreen: [32, 39],\n\t\t\tyellow: [33, 39],\n\t\t\tblue: [34, 39],\n\t\t\tmagenta: [35, 39],\n\t\t\tcyan: [36, 39],\n\t\t\twhite: [37, 39],\n\t\t\tgray: [90, 39]\n\t\t},\n\t\tbgColors: {\n\t\t\tbgBlack: [40, 49],\n\t\t\tbgRed: [41, 49],\n\t\t\tbgGreen: [42, 49],\n\t\t\tbgYellow: [43, 49],\n\t\t\tbgBlue: [44, 49],\n\t\t\tbgMagenta: [45, 49],\n\t\t\tbgCyan: [46, 49],\n\t\t\tbgWhite: [47, 49]\n\t\t}\n\t};\n\n\t// fix humans\n\tstyles.colors.grey = styles.colors.gray;\n\n\tObject.keys(styles).forEach(function (groupName) {\n\t\tvar group = styles[groupName];\n\n\t\tObject.keys(group).forEach(function (styleName) {\n\t\t\tvar style = group[styleName];\n\n\t\t\tstyles[styleName] = group[styleName] = {\n\t\t\t\topen: '\\u001b[' + style[0] + 'm',\n\t\t\t\tclose: '\\u001b[' + style[1] + 'm'\n\t\t\t};\n\t\t});\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false\n\t\t});\n\t});\n\n\treturn styles;\n}\n\nObject.defineProperty(module, 'exports', {\n\tenumerable: true,\n\tget: assembleStyles\n});\n", "'use strict';\nmodule.exports = function () {\n\treturn /[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-PRZcf-nqry=><]/g;\n};\n", "'use strict';\nvar ansiRegex = require('ansi-regex')();\n\nmodule.exports = function (str) {\n\treturn typeof str === 'string' ? str.replace(ansiRegex, '') : str;\n};\n", "'use strict';\nvar ansiRegex = require('ansi-regex');\nvar re = new RegExp(ansiRegex().source); // remove the `g` flag\nmodule.exports = re.test.bind(re);\n", "'use strict';\nvar argv = process.argv;\n\nvar terminator = argv.indexOf('--');\nvar hasFlag = function (flag) {\n\tflag = '--' + flag;\n\tvar pos = argv.indexOf(flag);\n\treturn pos !== -1 && (terminator !== -1 ? pos < terminator : true);\n};\n\nmodule.exports = (function () {\n\tif ('FORCE_COLOR' in process.env) {\n\t\treturn true;\n\t}\n\n\tif (hasFlag('no-color') ||\n\t\thasFlag('no-colors') ||\n\t\thasFlag('color=false')) {\n\t\treturn false;\n\t}\n\n\tif (hasFlag('color') ||\n\t\thasFlag('colors') ||\n\t\thasFlag('color=true') ||\n\t\thasFlag('color=always')) {\n\t\treturn true;\n\t}\n\n\tif (process.stdout && !process.stdout.isTTY) {\n\t\treturn false;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\treturn true;\n\t}\n\n\tif ('COLORTERM' in process.env) {\n\t\treturn true;\n\t}\n\n\tif (process.env.TERM === 'dumb') {\n\t\treturn false;\n\t}\n\n\tif (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(process.env.TERM)) {\n\t\treturn true;\n\t}\n\n\treturn false;\n})();\n", "'use strict';\nvar escapeStringRegexp = require('escape-string-regexp');\nvar ansiStyles = require('ansi-styles');\nvar stripAnsi = require('strip-ansi');\nvar hasAnsi = require('has-ansi');\nvar supportsColor = require('supports-color');\nvar defineProps = Object.defineProperties;\nvar isSimpleWindowsTerm = process.platform === 'win32' && !/^xterm/i.test(process.env.TERM);\n\nfunction Chalk(options) {\n\t// detect mode if not set manually\n\tthis.enabled = !options || options.enabled === undefined ? supportsColor : options.enabled;\n}\n\n// use bright blue on Windows as the normal blue color is illegible\nif (isSimpleWindowsTerm) {\n\tansiStyles.blue.open = '\\u001b[94m';\n}\n\nvar styles = (function () {\n\tvar ret = {};\n\n\tObject.keys(ansiStyles).forEach(function (key) {\n\t\tansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');\n\n\t\tret[key] = {\n\t\t\tget: function () {\n\t\t\t\treturn build.call(this, this._styles.concat(key));\n\t\t\t}\n\t\t};\n\t});\n\n\treturn ret;\n})();\n\nvar proto = defineProps(function chalk() {}, styles);\n\nfunction build(_styles) {\n\tvar builder = function () {\n\t\treturn applyStyle.apply(builder, arguments);\n\t};\n\n\tbuilder._styles = _styles;\n\tbuilder.enabled = this.enabled;\n\t// __proto__ is used because we must return a function, but there is\n\t// no way to create a function with a different prototype.\n\t/* eslint-disable no-proto */\n\tbuilder.__proto__ = proto;\n\n\treturn builder;\n}\n\nfunction applyStyle() {\n\t// support varags, but simply cast to string in case there's only one arg\n\tvar args = arguments;\n\tvar argsLen = args.length;\n\tvar str = argsLen !== 0 && String(arguments[0]);\n\n\tif (argsLen > 1) {\n\t\t// don't slice `arguments`, it prevents v8 optimizations\n\t\tfor (var a = 1; a < argsLen; a++) {\n\t\t\tstr += ' ' + args[a];\n\t\t}\n\t}\n\n\tif (!this.enabled || !str) {\n\t\treturn str;\n\t}\n\n\tvar nestedStyles = this._styles;\n\tvar i = nestedStyles.length;\n\n\t// Turns out that on Windows dimmed gray text becomes invisible in cmd.exe,\n\t// see https://github.com/chalk/chalk/issues/58\n\t// If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop.\n\tvar originalDim = ansiStyles.dim.open;\n\tif (isSimpleWindowsTerm && (nestedStyles.indexOf('gray') !== -1 || nestedStyles.indexOf('grey') !== -1)) {\n\t\tansiStyles.dim.open = '';\n\t}\n\n\twhile (i--) {\n\t\tvar code = ansiStyles[nestedStyles[i]];\n\n\t\t// Replace any instances already present with a re-opening code\n\t\t// otherwise only the part of the string until said closing code\n\t\t// will be colored, and the rest will simply be 'plain'.\n\t\tstr = code.open + str.replace(code.closeRe, code.open) + code.close;\n\t}\n\n\t// Reset the original 'dim' if we changed it to work around the Windows dimmed gray issue.\n\tansiStyles.dim.open = originalDim;\n\n\treturn str;\n}\n\nfunction init() {\n\tvar ret = {};\n\n\tObject.keys(styles).forEach(function (name) {\n\t\tret[name] = {\n\t\t\tget: function () {\n\t\t\t\treturn build.call(this, [name]);\n\t\t\t}\n\t\t};\n\t});\n\n\treturn ret;\n}\n\ndefineProps(Chalk.prototype, init());\n\nmodule.exports = new Chalk();\nmodule.exports.styles = ansiStyles;\nmodule.exports.hasColor = hasAnsi;\nmodule.exports.stripColor = stripAnsi;\nmodule.exports.supportsColor = supportsColor;\n", "'use strict';\n\nvar loglevel = require('loglevel');\nvar chalk = require('chalk');\n\nvar loggers = {};\n\nmodule.exports = getLogger;\n\nfunction getLogger() {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n _ref$level = _ref.level,\n level = _ref$level === undefined ? getDefaultLevel() : _ref$level,\n _ref$prefix = _ref.prefix,\n prefix = _ref$prefix === undefined ? '' : _ref$prefix;\n\n if (loggers[prefix]) {\n return loggers[prefix];\n }\n var coloredPrefix = prefix ? `${chalk.dim(prefix)} ` : '';\n var levelPrefix = {\n TRACE: chalk.dim('[TRACE]'),\n DEBUG: chalk.cyan('[DEBUG]'),\n INFO: chalk.blue('[INFO]'),\n WARN: chalk.yellow('[WARN]'),\n ERROR: chalk.red('[ERROR]')\n };\n\n var logger = loglevel.getLogger(`${prefix}-logger`);\n\n // this is the plugin \"api\"\n var originalFactory = logger.methodFactory;\n logger.methodFactory = methodFactory;\n\n var originalSetLevel = logger.setLevel;\n logger.setLevel = setLevel;\n logger.setLevel(level);\n loggers[prefix] = logger;\n return logger;\n\n function methodFactory() {\n for (var _len = arguments.length, factoryArgs = Array(_len), _key = 0; _key < _len; _key++) {\n factoryArgs[_key] = arguments[_key];\n }\n\n var logLevel = factoryArgs[0];\n\n var rawMethod = originalFactory.apply(undefined, factoryArgs);\n return function () {\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return rawMethod.apply(undefined, [`${coloredPrefix}${levelPrefix[logLevel.toUpperCase()]}:`].concat(args));\n };\n }\n\n function setLevel(levelToSetTo) {\n var persist = false; // uses browser localStorage\n return originalSetLevel.call(logger, levelToSetTo, persist);\n }\n}\n\nfunction getDefaultLevel() {\n var logLevel = process.env.LOG_LEVEL;\n\n if (logLevel === 'undefined' || !logLevel) {\n return 'warn';\n }\n return logLevel;\n}", "/**\n * Lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n asyncTag = '[object AsyncFunction]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n nullTag = '[object Null]',\n objectTag = '[object Object]',\n proxyTag = '[object Proxy]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n undefinedTag = '[object Undefined]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n Symbol = root.Symbol,\n Uint8Array = root.Uint8Array,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n getPrototype = overArg(Object.getPrototypeOf, Object),\n objectCreate = Object.create,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice,\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n nativeMax = Math.max,\n nativeNow = Date.now;\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map'),\n nativeCreate = getNative(Object, 'create');\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n}\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n}\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\n/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\n/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\n/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n if (key === 'constructor' && typeof object[key] === 'function') {\n return;\n }\n\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n}\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n return copyObject(value, keysIn(value));\n}\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n});\n\n/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\n/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\n/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = merge;\n", "export default function dlv(obj, key, def, p, undef) {\n\tkey = key.split ? key.split('.') : key;\n\tfor (p = 0; p < key.length; p++) {\n\t\tobj = obj ? obj[key[p]] : undef;\n\t}\n\treturn obj === undef ? def : obj;\n}\n", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getESLint = getESLint;\nexports.getOptionsForFormatting = getOptionsForFormatting;\nexports.requireModule = requireModule;\n\nvar _commonTags = require(\"common-tags\");\n\nvar _dlv = _interopRequireDefault(require(\"dlv\"));\n\nvar _loglevelColoredLevelPrefix = _interopRequireDefault(require(\"loglevel-colored-level-prefix\"));\n\nvar _eslint = require(\"eslint\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint import/no-dynamic-require:0 */\nconst logger = (0, _loglevelColoredLevelPrefix.default)({\n prefix: 'prettier-eslint'\n});\nconst RULE_DISABLED = {};\nconst RULE_NOT_CONFIGURED = 'RULE_NOT_CONFIGURED';\n\nconst ruleValueExists = prettierRuleValue => prettierRuleValue !== RULE_NOT_CONFIGURED && prettierRuleValue !== RULE_DISABLED && typeof prettierRuleValue !== 'undefined';\n\nconst OPTION_GETTERS = {\n printWidth: {\n ruleValue: rules => getRuleValue(rules, 'max-len', 'code'),\n ruleValueToPrettierOption: getPrintWidth\n },\n tabWidth: {\n ruleValue: rules => {\n let value = getRuleValue(rules, 'indent');\n\n if (value === 'tab') {\n value = getRuleValue(rules, 'max-len', 'tabWidth');\n }\n\n return value;\n },\n ruleValueToPrettierOption: getTabWidth\n },\n singleQuote: {\n ruleValue: rules => getRuleValue(rules, 'quotes'),\n ruleValueToPrettierOption: getSingleQuote\n },\n trailingComma: {\n ruleValue: rules => getRuleValue(rules, 'comma-dangle', []),\n ruleValueToPrettierOption: getTrailingComma\n },\n bracketSpacing: {\n ruleValue: rules => getRuleValue(rules, 'object-curly-spacing'),\n ruleValueToPrettierOption: getBracketSpacing\n },\n semi: {\n ruleValue: rules => getRuleValue(rules, 'semi'),\n ruleValueToPrettierOption: getSemi\n },\n useTabs: {\n ruleValue: rules => getRuleValue(rules, 'indent'),\n ruleValueToPrettierOption: getUseTabs\n },\n bracketSameLine: {\n ruleValue: rules => getRuleValue(rules, 'react/jsx-closing-bracket-location', 'nonEmpty'),\n ruleValueToPrettierOption: getBracketSameLine\n },\n arrowParens: {\n ruleValue: rules => getRuleValue(rules, 'arrow-parens'),\n ruleValueToPrettierOption: getArrowParens\n }\n};\n/* eslint import/prefer-default-export:0 */\n\nfunction getOptionsForFormatting(eslintConfig, prettierOptions = {}, fallbackPrettierOptions = {}) {\n const eslint = getRelevantESLintConfig(eslintConfig);\n const prettier = getPrettierOptionsFromESLintRules(eslintConfig, prettierOptions, fallbackPrettierOptions);\n return {\n eslint,\n prettier\n };\n}\n\nfunction getRelevantESLintConfig(eslintConfig) {\n const linter = new _eslint.Linter();\n const rules = linter.getRules();\n logger.debug('turning off unfixable rules');\n const relevantRules = {};\n rules.forEach((rule, name) => {\n const {\n meta: {\n fixable\n }\n } = rule;\n\n if (!fixable) {\n logger.trace('turning off rule:', JSON.stringify({\n [name]: rule\n }));\n rule = ['off'];\n relevantRules[name] = rule;\n }\n }, {});\n return {\n // defaults\n useEslintrc: false,\n ...eslintConfig,\n // overrides\n rules: { ...eslintConfig.rules,\n ...relevantRules\n },\n fix: true,\n globals: eslintConfig.globals || {}\n };\n}\n/**\n * This accepts an eslintConfig object and converts\n * it to the `prettier` options object\n */\n\n\nfunction getPrettierOptionsFromESLintRules(eslintConfig, prettierOptions, fallbackPrettierOptions) {\n const {\n rules\n } = eslintConfig;\n const prettierPluginOptions = getRuleValue(rules, 'prettier/prettier', []);\n\n if (ruleValueExists(prettierPluginOptions)) {\n prettierOptions = { ...prettierPluginOptions,\n ...prettierOptions\n };\n }\n\n return Object.keys(OPTION_GETTERS).reduce((options, key) => configureOptions(prettierOptions, fallbackPrettierOptions, key, options, rules), prettierOptions);\n} // If an ESLint rule that prettier can be configured with is enabled create a\n// prettier configuration object that reflects the ESLint rule configuration.\n\n\nfunction configureOptions(prettierOptions, fallbackPrettierOptions, key, options, rules) {\n const givenOption = prettierOptions[key];\n const optionIsGiven = givenOption !== undefined;\n\n if (optionIsGiven) {\n options[key] = givenOption;\n } else {\n const {\n ruleValue,\n ruleValueToPrettierOption\n } = OPTION_GETTERS[key];\n const eslintRuleValue = ruleValue(rules);\n const option = ruleValueToPrettierOption(eslintRuleValue, fallbackPrettierOptions, rules);\n\n if (option !== undefined) {\n options[key] = option;\n }\n }\n\n return options;\n}\n\nfunction getPrintWidth(eslintValue, fallbacks) {\n return makePrettierOption('printWidth', eslintValue, fallbacks);\n}\n\nfunction getTabWidth(eslintValue, fallbacks) {\n return makePrettierOption('tabWidth', eslintValue, fallbacks);\n}\n\nfunction getSingleQuote(eslintValue, fallbacks) {\n let prettierValue;\n\n if (eslintValue === 'single') {\n prettierValue = true;\n } else if (eslintValue === 'double') {\n prettierValue = false;\n } else if (eslintValue === 'backtick') {\n prettierValue = false;\n } else {\n prettierValue = eslintValue;\n }\n\n return makePrettierOption('singleQuote', prettierValue, fallbacks);\n}\n\nfunction getTrailingComma(eslintValue, fallbacks) {\n let prettierValue;\n\n if (eslintValue === 'never') {\n prettierValue = 'none';\n } else if (typeof eslintValue === 'string' && eslintValue.indexOf('always') === 0) {\n prettierValue = 'es5';\n } else if (typeof eslintValue === 'object') {\n prettierValue = getValFromTrailingCommaConfig(eslintValue);\n } else {\n prettierValue = RULE_NOT_CONFIGURED;\n }\n\n return makePrettierOption('trailingComma', prettierValue, fallbacks);\n}\n\nfunction getValFromTrailingCommaConfig(objectConfig) {\n const {\n arrays = '',\n objects = '',\n functions = ''\n } = objectConfig;\n const fns = isAlways(functions);\n const es5 = [arrays, objects].some(isAlways);\n\n if (fns) {\n return 'all';\n } else if (es5) {\n return 'es5';\n } else {\n return 'none';\n }\n}\n\nfunction getBracketSpacing(eslintValue, fallbacks) {\n let prettierValue;\n\n if (eslintValue === 'never') {\n prettierValue = false;\n } else if (eslintValue === 'always') {\n prettierValue = true;\n } else {\n prettierValue = eslintValue;\n }\n\n return makePrettierOption('bracketSpacing', prettierValue, fallbacks);\n}\n\nfunction getSemi(eslintValue, fallbacks) {\n let prettierValue;\n\n if (eslintValue === 'never') {\n prettierValue = false;\n } else if (eslintValue === 'always') {\n prettierValue = true;\n } else {\n prettierValue = eslintValue;\n }\n\n return makePrettierOption('semi', prettierValue, fallbacks);\n}\n\nfunction getUseTabs(eslintValue, fallbacks) {\n let prettierValue;\n\n if (eslintValue === 'tab') {\n prettierValue = true;\n } else {\n prettierValue = RULE_NOT_CONFIGURED;\n }\n\n return makePrettierOption('useTabs', prettierValue, fallbacks);\n}\n\nfunction getBracketSameLine(eslintValue, fallbacks) {\n let prettierValue;\n\n if (eslintValue === 'after-props') {\n prettierValue = true;\n } else if (eslintValue === 'tag-aligned' || eslintValue === 'line-aligned' || eslintValue === 'props-aligned') {\n prettierValue = false;\n } else {\n prettierValue = eslintValue;\n }\n\n return makePrettierOption('bracketSameLine', prettierValue, fallbacks);\n}\n\nfunction getArrowParens(eslintValue, fallbacks) {\n let prettierValue;\n\n if (eslintValue === 'as-needed') {\n prettierValue = 'avoid';\n } else {\n prettierValue = eslintValue;\n }\n\n return makePrettierOption('arrowParens', prettierValue, fallbacks);\n}\n\nfunction extractRuleValue(objPath, name, value) {\n // XXX: Ignore code coverage for the following else case\n // There are currently no eslint rules which we can infer prettier\n // options from, that have an object option which we don't know how\n // to infer from.\n // istanbul ignore else\n if (objPath) {\n logger.trace((0, _commonTags.oneLine)`\n Getting the value from object configuration of ${name}.\n delving into ${JSON.stringify(value)} with path \"${objPath}\"\n `);\n return (0, _dlv.default)(value, objPath, RULE_NOT_CONFIGURED);\n } // istanbul ignore next\n\n\n logger.debug((0, _commonTags.oneLine)`\n The ${name} rule is using an object configuration\n of ${JSON.stringify(value)} but prettier-eslint is\n not currently capable of getting the prettier value\n based on an object configuration for ${name}.\n Please file an issue (and make a pull request?)\n `); // istanbul ignore next\n\n return undefined;\n}\n\nfunction getRuleValue(rules, name, objPath) {\n const ruleConfig = rules[name];\n\n if (Array.isArray(ruleConfig)) {\n const [ruleSetting, value] = ruleConfig; // If `ruleSetting` is set to disable the ESLint rule don't use `value` as\n // it might be a value provided by an overriden config package e.g. airbnb\n // overriden by config-prettier. The airbnb values are provided even though\n // config-prettier disables the rule. Instead use fallback or prettier\n // default.\n\n if (ruleSetting === 0 || ruleSetting === 'off') {\n return RULE_DISABLED;\n }\n\n if (typeof value === 'object') {\n return extractRuleValue(objPath, name, value);\n } else {\n logger.trace((0, _commonTags.oneLine)`\n The ${name} rule is configured with a\n non-object value of ${value}. Using that value.\n `);\n return value;\n }\n }\n\n return RULE_NOT_CONFIGURED;\n}\n\nfunction isAlways(val) {\n return val.indexOf('always') === 0;\n}\n\nfunction makePrettierOption(prettierRuleName, prettierRuleValue, fallbacks) {\n if (ruleValueExists(prettierRuleValue)) {\n return prettierRuleValue;\n }\n\n const fallback = fallbacks[prettierRuleName];\n\n if (typeof fallback !== 'undefined') {\n logger.debug((0, _commonTags.oneLine)`\n The ${prettierRuleName} rule is not configured,\n using provided fallback of ${fallback}\n `);\n return fallback;\n }\n\n logger.debug((0, _commonTags.oneLine)`\n The ${prettierRuleName} rule is not configured,\n let prettier decide\n `);\n return undefined;\n}\n\nfunction requireModule(modulePath, name) {\n try {\n logger.trace(`requiring \"${name}\" module at \"${modulePath}\"`);\n return require(modulePath);\n } catch (error) {\n logger.error((0, _commonTags.oneLine)`\n There was trouble getting \"${name}\".\n Is \"${modulePath}\" a correct path to the \"${name}\" module?\n `);\n throw error;\n }\n}\n\nfunction getESLint(eslintPath, eslintOptions) {\n const {\n ESLint\n } = requireModule(eslintPath, 'eslint');\n\n try {\n return new ESLint(eslintOptions);\n } catch (error) {\n logger.error('There was trouble creating the ESLint CLIEngine.');\n throw error;\n }\n}", "\"use strict\";\n\nvar _fs = _interopRequireDefault(require(\"fs\"));\n\nvar _path = _interopRequireDefault(require(\"path\"));\n\nvar _requireRelative = _interopRequireDefault(require(\"require-relative\"));\n\nvar _prettyFormat = _interopRequireDefault(require(\"pretty-format\"));\n\nvar _commonTags = require(\"common-tags\");\n\nvar _indentString = _interopRequireDefault(require(\"indent-string\"));\n\nvar _loglevelColoredLevelPrefix = _interopRequireDefault(require(\"loglevel-colored-level-prefix\"));\n\nvar _lodash = _interopRequireDefault(require(\"lodash.merge\"));\n\nvar _utils = require(\"./utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint no-console:0, global-require:0, import/no-dynamic-require:0 */\n\n/* eslint complexity: [1, 13] */\nconst logger = (0, _loglevelColoredLevelPrefix.default)({\n prefix: 'prettier-eslint'\n}); // CommonJS + ES6 modules... is it worth it? Probably not...\n\nmodule.exports = format;\n/**\n * Formats the text with prettier and then eslint based on the given options\n * @param {String} options.filePath - the path of the file being formatted\n * can be used in leu of `eslintConfig` (eslint will be used to find the\n * relevant config for the file). Will also be used to load the `text` if\n * `text` is not provided.\n * @param {String} options.text - the text (JavaScript code) to format\n * @param {String} options.eslintPath - the path to the eslint module to use.\n * Will default to require.resolve('eslint')\n * @param {String} options.prettierPath - the path to the prettier module.\n * Will default to require.resovlve('prettier')\n * @param {Object} options.eslintConfig - the config to use for formatting\n * with ESLint.\n * @param {Object} options.prettierOptions - the options to pass for\n * formatting with `prettier`. If not provided, prettier-eslint will attempt\n * to create the options based on the eslintConfig\n * @param {Object} options.fallbackPrettierOptions - the options to pass for\n * formatting with `prettier` if the given option is not inferrable from the\n * eslintConfig.\n * @param {String} options.logLevel - the level for the logs\n * (error, warn, info, debug, trace)\n * @param {Boolean} options.prettierLast - Run Prettier Last\n * @return {Promise<String>} - the formatted string\n */\n\nasync function format(options) {\n const {\n logLevel = getDefaultLogLevel()\n } = options;\n logger.setLevel(logLevel);\n logger.trace('called format with options:', (0, _prettyFormat.default)(options));\n const {\n filePath,\n text = getTextFromFilePath(filePath),\n eslintPath = getModulePath(filePath, 'eslint'),\n prettierPath = getModulePath(filePath, 'prettier'),\n prettierLast,\n fallbackPrettierOptions\n } = options;\n const eslintConfig = (0, _lodash.default)({}, options.eslintConfig, await getESLintConfig(filePath, eslintPath, options.eslintConfig || {}));\n const prettierOptions = (0, _lodash.default)({}, filePath && {\n filepath: filePath\n }, getPrettierConfig(filePath, prettierPath), options.prettierOptions);\n const formattingOptions = (0, _utils.getOptionsForFormatting)(eslintConfig, prettierOptions, fallbackPrettierOptions, eslintPath);\n logger.debug('inferred options:', (0, _prettyFormat.default)({\n filePath,\n text,\n eslintPath,\n prettierPath,\n eslintConfig: formattingOptions.eslint,\n prettierOptions: formattingOptions.prettier,\n logLevel,\n prettierLast\n }));\n const eslintExtensions = eslintConfig.extensions || ['.js', '.jsx', '.ts', '.tsx', '.mjs', '.vue'];\n\n const fileExtension = _path.default.extname(filePath || ''); // If we don't get filePath run eslint on text, otherwise only run eslint\n // if it's a configured extension or fall back to a \"supported\" file type.\n\n\n const onlyPrettier = filePath ? !eslintExtensions.includes(fileExtension) : false;\n const prettify = createPrettify(formattingOptions.prettier, prettierPath);\n\n if (onlyPrettier) {\n return prettify(text);\n }\n\n if (['.ts', '.tsx'].includes(fileExtension)) {\n formattingOptions.eslint.parser = formattingOptions.eslint.parser || require.resolve('@typescript-eslint/parser');\n }\n\n if (['.vue'].includes(fileExtension)) {\n formattingOptions.eslint.parser = formattingOptions.eslint.parser || require.resolve('vue-eslint-parser');\n }\n\n const eslintFix = await createEslintFix(formattingOptions.eslint, eslintPath);\n\n if (prettierLast) {\n const eslintFixed = await eslintFix(text, filePath);\n return prettify(eslintFixed);\n }\n\n return eslintFix(prettify(text), filePath);\n}\n\nfunction createPrettify(formatOptions, prettierPath) {\n return function prettify(text) {\n logger.debug('calling prettier on text');\n logger.trace((0, _commonTags.stripIndent)`\n prettier input:\n\n ${(0, _indentString.default)(text, 2)}\n `);\n const prettier = (0, _utils.requireModule)(prettierPath, 'prettier');\n\n try {\n logger.trace('calling prettier.format with the text and prettierOptions');\n const output = prettier.format(text, formatOptions);\n logger.trace('prettier: output === input', output === text);\n logger.trace((0, _commonTags.stripIndent)`\n prettier output:\n\n ${(0, _indentString.default)(output, 2)}\n `);\n return output;\n } catch (error) {\n logger.error('prettier formatting failed due to a prettier error');\n throw error;\n }\n };\n}\n\nfunction createEslintFix(eslintConfig, eslintPath) {\n return async function eslintFix(text, filePath) {\n if (Array.isArray(eslintConfig.globals)) {\n const tempGlobals = {};\n eslintConfig.globals.forEach(g => {\n const [key, value] = g.split(':');\n tempGlobals[key] = value;\n });\n eslintConfig.globals = tempGlobals;\n }\n\n eslintConfig.overrideConfig = {\n rules: eslintConfig.rules,\n parser: eslintConfig.parser,\n globals: eslintConfig.globals,\n parserOptions: eslintConfig.parserOptions,\n ignorePatterns: eslintConfig.ignorePatterns || eslintConfig.ignorePattern,\n plugins: eslintConfig.plugins,\n env: eslintConfig.env,\n settings: eslintConfig.settings,\n noInlineConfig: eslintConfig.noInlineConfig,\n ...eslintConfig.overrideConfig\n };\n delete eslintConfig.rules;\n delete eslintConfig.parser;\n delete eslintConfig.parserOptions;\n delete eslintConfig.globals;\n delete eslintConfig.ignorePatterns;\n delete eslintConfig.ignorePattern;\n delete eslintConfig.plugins;\n delete eslintConfig.env;\n delete eslintConfig.noInlineConfig;\n delete eslintConfig.settings;\n const eslint = (0, _utils.getESLint)(eslintPath, eslintConfig);\n\n try {\n logger.trace('calling cliEngine.executeOnText with the text');\n const report = await eslint.lintText(text, {\n filePath,\n warnIgnored: true\n });\n logger.trace('executeOnText returned the following report:', (0, _prettyFormat.default)(report)); // default the output to text because if there's nothing\n // to fix, eslint doesn't provide `output`\n\n const [{\n output = text\n }] = await report;\n logger.trace('eslint --fix: output === input', output === text); // NOTE: We're ignoring linting errors/warnings here and\n // defaulting to the given text if there are any\n // because all we're trying to do is fix what we can.\n // We don't care about what we can't\n\n logger.trace((0, _commonTags.stripIndent)`\n eslint --fix output:\n\n ${(0, _indentString.default)(output, 2)}\n `);\n return output;\n } catch (error) {\n logger.error('eslint fix failed due to an eslint error');\n throw error;\n }\n };\n}\n\nfunction getTextFromFilePath(filePath) {\n try {\n logger.trace((0, _commonTags.oneLine)`\n attempting fs.readFileSync to get\n the text for file at \"${filePath}\"\n `);\n return _fs.default.readFileSync(filePath, 'utf8');\n } catch (error) {\n logger.error((0, _commonTags.oneLine)`\n failed to get the text to format\n from the given filePath: \"${filePath}\"\n `);\n throw error;\n }\n}\n\nfunction getESLintApiOptions(eslintConfig) {\n // https://eslint.org/docs/developer-guide/nodejs-api\n // these options affect what calculateConfigForFile produces\n return {\n ignore: eslintConfig.ignore || true,\n ignorePath: eslintConfig.ignorePath || null,\n allowInlineConfig: eslintConfig.allowInlineConfig || true,\n baseConfig: eslintConfig.baseConfig || null,\n overrideConfig: eslintConfig.overrideConfig || null,\n overrideConfigFile: eslintConfig.overrideConfigFile || null,\n plugins: eslintConfig.plugins || null,\n resolvePluginsRelativeTo: eslintConfig.resolvePluginsRelativeTo || null,\n rulePaths: eslintConfig.rulePaths || [],\n useEslintrc: eslintConfig.useEslintrc || true\n };\n}\n\nasync function getESLintConfig(filePath, eslintPath, eslintOptions) {\n if (filePath) {\n eslintOptions.cwd = _path.default.dirname(filePath);\n }\n\n logger.trace((0, _commonTags.oneLine)`\n creating ESLint CLI Engine to get the config for\n \"${filePath || process.cwd()}\"\n `);\n const eslint = (0, _utils.getESLint)(eslintPath, getESLintApiOptions(eslintOptions));\n\n try {\n logger.debug(`getting eslint config for file at \"${filePath}\"`);\n const config = await eslint.calculateConfigForFile(filePath);\n logger.trace(`eslint config for \"${filePath}\" received`, (0, _prettyFormat.default)(config));\n return { ...eslintOptions,\n ...config\n };\n } catch (error) {\n // is this noisy? Try setting options.disableLog to false\n logger.debug('Unable to find config');\n return {\n rules: {}\n };\n }\n}\n\nfunction getPrettierConfig(filePath, prettierPath) {\n const prettier = (0, _utils.requireModule)(prettierPath, 'prettier');\n return prettier.resolveConfig && prettier.resolveConfig.sync && prettier.resolveConfig.sync(filePath) || {};\n}\n\nfunction getModulePath(filePath = __filename, moduleName) {\n try {\n return _requireRelative.default.resolve(moduleName, filePath);\n } catch (error) {\n logger.debug((0, _commonTags.oneLine)`\n There was a problem finding the ${moduleName}\n module. Using prettier-eslint's version.\n `, error.message, error.stack);\n return require.resolve(moduleName);\n }\n}\n\nfunction getDefaultLogLevel() {\n return process.env.LOG_LEVEL || 'warn';\n}", "'use strict'\r\n\r\nmodule.exports = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\r\n", "/* MIT license */\nvar cssKeywords = require('color-name');\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n// values that give correct `typeof` results).\n// do not use box values types (i.e. Number(), String(), etc.)\n\nvar reverseKeywords = {};\nfor (var key in cssKeywords) {\n\tif (cssKeywords.hasOwnProperty(key)) {\n\t\treverseKeywords[cssKeywords[key]] = key;\n\t}\n}\n\nvar convert = module.exports = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\n// hide .channels and .labels properties\nfor (var model in convert) {\n\tif (convert.hasOwnProperty(model)) {\n\t\tif (!('channels' in convert[model])) {\n\t\t\tthrow new Error('missing channels property: ' + model);\n\t\t}\n\n\t\tif (!('labels' in convert[model])) {\n\t\t\tthrow new Error('missing channel labels property: ' + model);\n\t\t}\n\n\t\tif (convert[model].labels.length !== convert[model].channels) {\n\t\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t\t}\n\n\t\tvar channels = convert[model].channels;\n\t\tvar labels = convert[model].labels;\n\t\tdelete convert[model].channels;\n\t\tdelete convert[model].labels;\n\t\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\t\tObject.defineProperty(convert[model], 'labels', {value: labels});\n\t}\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar min = Math.min(r, g, b);\n\tvar max = Math.max(r, g, b);\n\tvar delta = max - min;\n\tvar h;\n\tvar s;\n\tvar l;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tl = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tvar rdif;\n\tvar gdif;\n\tvar bdif;\n\tvar h;\n\tvar s;\n\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar v = Math.max(r, g, b);\n\tvar diff = v - Math.min(r, g, b);\n\tvar diffc = function (c) {\n\t\treturn (v - c) / 6 / diff + 1 / 2;\n\t};\n\n\tif (diff === 0) {\n\t\th = s = 0;\n\t} else {\n\t\ts = diff / v;\n\t\trdif = diffc(r);\n\t\tgdif = diffc(g);\n\t\tbdif = diffc(b);\n\n\t\tif (r === v) {\n\t\t\th = bdif - gdif;\n\t\t} else if (g === v) {\n\t\t\th = (1 / 3) + rdif - bdif;\n\t\t} else if (b === v) {\n\t\t\th = (2 / 3) + gdif - rdif;\n\t\t}\n\t\tif (h < 0) {\n\t\t\th += 1;\n\t\t} else if (h > 1) {\n\t\t\th -= 1;\n\t\t}\n\t}\n\n\treturn [\n\t\th * 360,\n\t\ts * 100,\n\t\tv * 100\n\t];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tvar r = rgb[0];\n\tvar g = rgb[1];\n\tvar b = rgb[2];\n\tvar h = convert.rgb.hsl(rgb)[0];\n\tvar w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar c;\n\tvar m;\n\tvar y;\n\tvar k;\n\n\tk = Math.min(1 - r, 1 - g, 1 - b);\n\tc = (1 - r - k) / (1 - k) || 0;\n\tm = (1 - g - k) / (1 - k) || 0;\n\ty = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\n/**\n * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n * */\nfunction comparativeDistance(x, y) {\n\treturn (\n\t\tMath.pow(x[0] - y[0], 2) +\n\t\tMath.pow(x[1] - y[1], 2) +\n\t\tMath.pow(x[2] - y[2], 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tvar reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tvar currentClosestDistance = Infinity;\n\tvar currentClosestKeyword;\n\n\tfor (var keyword in cssKeywords) {\n\t\tif (cssKeywords.hasOwnProperty(keyword)) {\n\t\t\tvar value = cssKeywords[keyword];\n\n\t\t\t// Compute comparative distance\n\t\t\tvar distance = comparativeDistance(rgb, value);\n\n\t\t\t// Check if its less, if so set as closest\n\t\t\tif (distance < currentClosestDistance) {\n\t\t\t\tcurrentClosestDistance = distance;\n\t\t\t\tcurrentClosestKeyword = keyword;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn cssKeywords[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\n\t// assume sRGB\n\tr = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n\tvar x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tvar y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tvar z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tvar xyz = convert.rgb.xyz(rgb);\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tvar h = hsl[0] / 360;\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar t1;\n\tvar t2;\n\tvar t3;\n\tvar rgb;\n\tvar val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tt1 = 2 * l - t2;\n\n\trgb = [0, 0, 0];\n\tfor (var i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tvar h = hsl[0];\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar smin = s;\n\tvar lmin = Math.max(l, 0.01);\n\tvar sv;\n\tvar v;\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tv = (l + s) / 2;\n\tsv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tvar h = hsv[0] / 60;\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar hi = Math.floor(h) % 6;\n\n\tvar f = h - Math.floor(h);\n\tvar p = 255 * v * (1 - s);\n\tvar q = 255 * v * (1 - (s * f));\n\tvar t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tvar h = hsv[0];\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar vmin = Math.max(v, 0.01);\n\tvar lmin;\n\tvar sl;\n\tvar l;\n\n\tl = (2 - s) * v;\n\tlmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tvar h = hwb[0] / 360;\n\tvar wh = hwb[1] / 100;\n\tvar bl = hwb[2] / 100;\n\tvar ratio = wh + bl;\n\tvar i;\n\tvar v;\n\tvar f;\n\tvar n;\n\n\t// wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\ti = Math.floor(6 * h);\n\tv = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tn = wh + f * (v - wh); // linear interpolation\n\n\tvar r;\n\tvar g;\n\tvar b;\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v; g = n; b = wh; break;\n\t\tcase 1: r = n; g = v; b = wh; break;\n\t\tcase 2: r = wh; g = v; b = n; break;\n\t\tcase 3: r = wh; g = n; b = v; break;\n\t\tcase 4: r = n; g = wh; b = v; break;\n\t\tcase 5: r = v; g = wh; b = n; break;\n\t}\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tvar c = cmyk[0] / 100;\n\tvar m = cmyk[1] / 100;\n\tvar y = cmyk[2] / 100;\n\tvar k = cmyk[3] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = 1 - Math.min(1, c * (1 - k) + k);\n\tg = 1 - Math.min(1, m * (1 - k) + k);\n\tb = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tvar x = xyz[0] / 100;\n\tvar y = xyz[1] / 100;\n\tvar z = xyz[2] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar x;\n\tvar y;\n\tvar z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tvar y2 = Math.pow(y, 3);\n\tvar x2 = Math.pow(x, 3);\n\tvar z2 = Math.pow(z, 3);\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar hr;\n\tvar h;\n\tvar c;\n\n\thr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tc = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tvar l = lch[0];\n\tvar c = lch[1];\n\tvar h = lch[2];\n\tvar a;\n\tvar b;\n\tvar hr;\n\n\thr = h / 360 * 2 * Math.PI;\n\ta = c * Math.cos(hr);\n\tb = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\tvar value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tvar ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\n\t// we use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tvar ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tvar color = args % 10;\n\n\t// handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tvar mult = (~~(args > 50) + 1) * 0.5;\n\tvar r = ((color & 1) * mult) * 255;\n\tvar g = (((color >> 1) & 1) * mult) * 255;\n\tvar b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// handle greyscale\n\tif (args >= 232) {\n\t\tvar c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tvar rem;\n\tvar r = Math.floor(args / 36) / 5 * 255;\n\tvar g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tvar b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tvar integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tvar string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tvar match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tvar colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(function (char) {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tvar integer = parseInt(colorString, 16);\n\tvar r = (integer >> 16) & 0xFF;\n\tvar g = (integer >> 8) & 0xFF;\n\tvar b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar max = Math.max(Math.max(r, g), b);\n\tvar min = Math.min(Math.min(r, g), b);\n\tvar chroma = (max - min);\n\tvar grayscale;\n\tvar hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma + 4;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar c = 1;\n\tvar f = 0;\n\n\tif (l < 0.5) {\n\t\tc = 2.0 * s * l;\n\t} else {\n\t\tc = 2.0 * s * (1.0 - l);\n\t}\n\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\n\tvar c = s * v;\n\tvar f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tvar h = hcg[0] / 360;\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tvar pure = [0, 0, 0];\n\tvar hi = (h % 1) * 6;\n\tvar v = hi % 1;\n\tvar w = 1 - v;\n\tvar mg = 0;\n\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tvar v = c + g * (1.0 - c);\n\tvar f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tvar l = g * (1.0 - c) + 0.5 * c;\n\tvar s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\tvar v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tvar w = hwb[1] / 100;\n\tvar b = hwb[2] / 100;\n\tvar v = 1 - b;\n\tvar c = v - w;\n\tvar g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = convert.gray.hsv = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tvar val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tvar integer = (val << 16) + (val << 8) + val;\n\n\tvar string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tvar val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n", "var conversions = require('./conversions');\n\n/*\n\tthis function routes a model to all other models.\n\n\tall functions that are routed have a property `.conversion` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\nfunction buildGraph() {\n\tvar graph = {};\n\t// https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\tvar models = Object.keys(conversions);\n\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tvar graph = buildGraph();\n\tvar queue = [fromModel]; // unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tvar current = queue.pop();\n\t\tvar adjacents = Object.keys(conversions[current]);\n\n\t\tfor (var len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tvar adjacent = adjacents[i];\n\t\t\tvar node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tvar path = [graph[toModel].parent, toModel];\n\tvar fn = conversions[graph[toModel].parent][toModel];\n\n\tvar cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nmodule.exports = function (fromModel) {\n\tvar graph = deriveBFS(fromModel);\n\tvar conversion = {};\n\n\tvar models = Object.keys(graph);\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tvar toModel = models[i];\n\t\tvar node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// no possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\n", "var conversions = require('./conversions');\nvar route = require('./route');\n\nvar convert = {};\n\nvar models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\tvar result = fn(args);\n\n\t\t// we're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (var len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(function (fromModel) {\n\tconvert[fromModel] = {};\n\n\tObject.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});\n\tObject.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});\n\n\tvar routes = route(fromModel);\n\tvar routeModels = Object.keys(routes);\n\n\trouteModels.forEach(function (toModel) {\n\t\tvar fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nmodule.exports = convert;\n", "'use strict';\nconst colorConvert = require('color-convert');\n\nconst wrapAnsi16 = (fn, offset) => function () {\n\tconst code = fn.apply(colorConvert, arguments);\n\treturn `\\u001B[${code + offset}m`;\n};\n\nconst wrapAnsi256 = (fn, offset) => function () {\n\tconst code = fn.apply(colorConvert, arguments);\n\treturn `\\u001B[${38 + offset};5;${code}m`;\n};\n\nconst wrapAnsi16m = (fn, offset) => function () {\n\tconst rgb = fn.apply(colorConvert, arguments);\n\treturn `\\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`;\n};\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\tconst styles = {\n\t\tmodifier: {\n\t\t\treset: [0, 0],\n\t\t\t// 21 isn't widely supported and 22 does the same thing\n\t\t\tbold: [1, 22],\n\t\t\tdim: [2, 22],\n\t\t\titalic: [3, 23],\n\t\t\tunderline: [4, 24],\n\t\t\tinverse: [7, 27],\n\t\t\thidden: [8, 28],\n\t\t\tstrikethrough: [9, 29]\n\t\t},\n\t\tcolor: {\n\t\t\tblack: [30, 39],\n\t\t\tred: [31, 39],\n\t\t\tgreen: [32, 39],\n\t\t\tyellow: [33, 39],\n\t\t\tblue: [34, 39],\n\t\t\tmagenta: [35, 39],\n\t\t\tcyan: [36, 39],\n\t\t\twhite: [37, 39],\n\t\t\tgray: [90, 39],\n\n\t\t\t// Bright color\n\t\t\tredBright: [91, 39],\n\t\t\tgreenBright: [92, 39],\n\t\t\tyellowBright: [93, 39],\n\t\t\tblueBright: [94, 39],\n\t\t\tmagentaBright: [95, 39],\n\t\t\tcyanBright: [96, 39],\n\t\t\twhiteBright: [97, 39]\n\t\t},\n\t\tbgColor: {\n\t\t\tbgBlack: [40, 49],\n\t\t\tbgRed: [41, 49],\n\t\t\tbgGreen: [42, 49],\n\t\t\tbgYellow: [43, 49],\n\t\t\tbgBlue: [44, 49],\n\t\t\tbgMagenta: [45, 49],\n\t\t\tbgCyan: [46, 49],\n\t\t\tbgWhite: [47, 49],\n\n\t\t\t// Bright color\n\t\t\tbgBlackBright: [100, 49],\n\t\t\tbgRedBright: [101, 49],\n\t\t\tbgGreenBright: [102, 49],\n\t\t\tbgYellowBright: [103, 49],\n\t\t\tbgBlueBright: [104, 49],\n\t\t\tbgMagentaBright: [105, 49],\n\t\t\tbgCyanBright: [106, 49],\n\t\t\tbgWhiteBright: [107, 49]\n\t\t}\n\t};\n\n\t// Fix humans\n\tstyles.color.grey = styles.color.gray;\n\n\tfor (const groupName of Object.keys(styles)) {\n\t\tconst group = styles[groupName];\n\n\t\tfor (const styleName of Object.keys(group)) {\n\t\t\tconst style = group[styleName];\n\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false\n\t\t});\n\n\t\tObject.defineProperty(styles, 'codes', {\n\t\t\tvalue: codes,\n\t\t\tenumerable: false\n\t\t});\n\t}\n\n\tconst ansi2ansi = n => n;\n\tconst rgb2rgb = (r, g, b) => [r, g, b];\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = {\n\t\tansi: wrapAnsi16(ansi2ansi, 0)\n\t};\n\tstyles.color.ansi256 = {\n\t\tansi256: wrapAnsi256(ansi2ansi, 0)\n\t};\n\tstyles.color.ansi16m = {\n\t\trgb: wrapAnsi16m(rgb2rgb, 0)\n\t};\n\n\tstyles.bgColor.ansi = {\n\t\tansi: wrapAnsi16(ansi2ansi, 10)\n\t};\n\tstyles.bgColor.ansi256 = {\n\t\tansi256: wrapAnsi256(ansi2ansi, 10)\n\t};\n\tstyles.bgColor.ansi16m = {\n\t\trgb: wrapAnsi16m(rgb2rgb, 10)\n\t};\n\n\tfor (let key of Object.keys(colorConvert)) {\n\t\tif (typeof colorConvert[key] !== 'object') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst suite = colorConvert[key];\n\n\t\tif (key === 'ansi16') {\n\t\t\tkey = 'ansi';\n\t\t}\n\n\t\tif ('ansi16' in suite) {\n\t\t\tstyles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0);\n\t\t\tstyles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10);\n\t\t}\n\n\t\tif ('ansi256' in suite) {\n\t\t\tstyles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0);\n\t\t\tstyles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10);\n\t\t}\n\n\t\tif ('rgb' in suite) {\n\t\t\tstyles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0);\n\t\t\tstyles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10);\n\t\t}\n\t}\n\n\treturn styles;\n}\n\n// Make the export immutable\nObject.defineProperty(module, 'exports', {\n\tenumerable: true,\n\tget: assembleStyles\n});\n", "'use strict';\nmodule.exports = (flag, argv) => {\n\targv = argv || process.argv;\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst pos = argv.indexOf(prefix + flag);\n\tconst terminatorPos = argv.indexOf('--');\n\treturn pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos);\n};\n", "'use strict';\nconst os = require('os');\nconst hasFlag = require('has-flag');\n\nconst env = process.env;\n\nlet forceColor;\nif (hasFlag('no-color') ||\n\thasFlag('no-colors') ||\n\thasFlag('color=false')) {\n\tforceColor = false;\n} else if (hasFlag('color') ||\n\thasFlag('colors') ||\n\thasFlag('color=true') ||\n\thasFlag('color=always')) {\n\tforceColor = true;\n}\nif ('FORCE_COLOR' in env) {\n\tforceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0;\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3\n\t};\n}\n\nfunction supportsColor(stream) {\n\tif (forceColor === false) {\n\t\treturn 0;\n\t}\n\n\tif (hasFlag('color=16m') ||\n\t\thasFlag('color=full') ||\n\t\thasFlag('color=truecolor')) {\n\t\treturn 3;\n\t}\n\n\tif (hasFlag('color=256')) {\n\t\treturn 2;\n\t}\n\n\tif (stream && !stream.isTTY && forceColor !== true) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor ? 1 : 0;\n\n\tif (process.platform === 'win32') {\n\t\t// Node.js 7.5.0 is the first version of Node.js to include a patch to\n\t\t// libuv that enables 256 color output on Windows. Anything earlier and it\n\t\t// won't work. However, here we target Node.js 8 at minimum as it is an LTS\n\t\t// release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows\n\t\t// release that supports 256 colors. Windows 10 build 14931 is the first release\n\t\t// that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(process.versions.node.split('.')[0]) >= 8 &&\n\t\t\tNumber(osRelease[0]) >= 10 &&\n\t\t\tNumber(osRelease[2]) >= 10586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app':\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\tcase 'Apple_Terminal':\n\t\t\t\treturn 2;\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\treturn min;\n}\n\nfunction getSupportLevel(stream) {\n\tconst level = supportsColor(stream);\n\treturn translateLevel(level);\n}\n\nmodule.exports = {\n\tsupportsColor: getSupportLevel,\n\tstdout: getSupportLevel(process.stdout),\n\tstderr: getSupportLevel(process.stderr)\n};\n", "'use strict';\nconst TEMPLATE_REGEX = /(?:\\\\(u[a-f\\d]{4}|x[a-f\\d]{2}|.))|(?:\\{(~)?(\\w+(?:\\([^)]*\\))?(?:\\.\\w+(?:\\([^)]*\\))?)*)(?:[ \\t]|(?=\\r?\\n)))|(\\})|((?:.|[\\r\\n\\f])+?)/gi;\nconst STYLE_REGEX = /(?:^|\\.)(\\w+)(?:\\(([^)]*)\\))?/g;\nconst STRING_REGEX = /^(['\"])((?:\\\\.|(?!\\1)[^\\\\])*)\\1$/;\nconst ESCAPE_REGEX = /\\\\(u[a-f\\d]{4}|x[a-f\\d]{2}|.)|([^\\\\])/gi;\n\nconst ESCAPES = new Map([\n\t['n', '\\n'],\n\t['r', '\\r'],\n\t['t', '\\t'],\n\t['b', '\\b'],\n\t['f', '\\f'],\n\t['v', '\\v'],\n\t['0', '\\0'],\n\t['\\\\', '\\\\'],\n\t['e', '\\u001B'],\n\t['a', '\\u0007']\n]);\n\nfunction unescape(c) {\n\tif ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) {\n\t\treturn String.fromCharCode(parseInt(c.slice(1), 16));\n\t}\n\n\treturn ESCAPES.get(c) || c;\n}\n\nfunction parseArguments(name, args) {\n\tconst results = [];\n\tconst chunks = args.trim().split(/\\s*,\\s*/g);\n\tlet matches;\n\n\tfor (const chunk of chunks) {\n\t\tif (!isNaN(chunk)) {\n\t\t\tresults.push(Number(chunk));\n\t\t} else if ((matches = chunk.match(STRING_REGEX))) {\n\t\t\tresults.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr));\n\t\t} else {\n\t\t\tthrow new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`);\n\t\t}\n\t}\n\n\treturn results;\n}\n\nfunction parseStyle(style) {\n\tSTYLE_REGEX.lastIndex = 0;\n\n\tconst results = [];\n\tlet matches;\n\n\twhile ((matches = STYLE_REGEX.exec(style)) !== null) {\n\t\tconst name = matches[1];\n\n\t\tif (matches[2]) {\n\t\t\tconst args = parseArguments(name, matches[2]);\n\t\t\tresults.push([name].concat(args));\n\t\t} else {\n\t\t\tresults.push([name]);\n\t\t}\n\t}\n\n\treturn results;\n}\n\nfunction buildStyle(chalk, styles) {\n\tconst enabled = {};\n\n\tfor (const layer of styles) {\n\t\tfor (const style of layer.styles) {\n\t\t\tenabled[style[0]] = layer.inverse ? null : style.slice(1);\n\t\t}\n\t}\n\n\tlet current = chalk;\n\tfor (const styleName of Object.keys(enabled)) {\n\t\tif (Array.isArray(enabled[styleName])) {\n\t\t\tif (!(styleName in current)) {\n\t\t\t\tthrow new Error(`Unknown Chalk style: ${styleName}`);\n\t\t\t}\n\n\t\t\tif (enabled[styleName].length > 0) {\n\t\t\t\tcurrent = current[styleName].apply(current, enabled[styleName]);\n\t\t\t} else {\n\t\t\t\tcurrent = current[styleName];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn current;\n}\n\nmodule.exports = (chalk, tmp) => {\n\tconst styles = [];\n\tconst chunks = [];\n\tlet chunk = [];\n\n\t// eslint-disable-next-line max-params\n\ttmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => {\n\t\tif (escapeChar) {\n\t\t\tchunk.push(unescape(escapeChar));\n\t\t} else if (style) {\n\t\t\tconst str = chunk.join('');\n\t\t\tchunk = [];\n\t\t\tchunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str));\n\t\t\tstyles.push({inverse, styles: parseStyle(style)});\n\t\t} else if (close) {\n\t\t\tif (styles.length === 0) {\n\t\t\t\tthrow new Error('Found extraneous } in Chalk template literal');\n\t\t\t}\n\n\t\t\tchunks.push(buildStyle(chalk, styles)(chunk.join('')));\n\t\t\tchunk = [];\n\t\t\tstyles.pop();\n\t\t} else {\n\t\t\tchunk.push(chr);\n\t\t}\n\t});\n\n\tchunks.push(chunk.join(''));\n\n\tif (styles.length > 0) {\n\t\tconst errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\\`}\\`)`;\n\t\tthrow new Error(errMsg);\n\t}\n\n\treturn chunks.join('');\n};\n", "'use strict';\nconst escapeStringRegexp = require('escape-string-regexp');\nconst ansiStyles = require('ansi-styles');\nconst stdoutColor = require('supports-color').stdout;\n\nconst template = require('./templates.js');\n\nconst isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm');\n\n// `supportsColor.level` \u2192 `ansiStyles.color[name]` mapping\nconst levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m'];\n\n// `color-convert` models to exclude from the Chalk API due to conflicts and such\nconst skipModels = new Set(['gray']);\n\nconst styles = Object.create(null);\n\nfunction applyOptions(obj, options) {\n\toptions = options || {};\n\n\t// Detect level if not set manually\n\tconst scLevel = stdoutColor ? stdoutColor.level : 0;\n\tobj.level = options.level === undefined ? scLevel : options.level;\n\tobj.enabled = 'enabled' in options ? options.enabled : obj.level > 0;\n}\n\nfunction Chalk(options) {\n\t// We check for this.template here since calling `chalk.constructor()`\n\t// by itself will have a `this` of a previously constructed chalk object\n\tif (!this || !(this instanceof Chalk) || this.template) {\n\t\tconst chalk = {};\n\t\tapplyOptions(chalk, options);\n\n\t\tchalk.template = function () {\n\t\t\tconst args = [].slice.call(arguments);\n\t\t\treturn chalkTag.apply(null, [chalk.template].concat(args));\n\t\t};\n\n\t\tObject.setPrototypeOf(chalk, Chalk.prototype);\n\t\tObject.setPrototypeOf(chalk.template, chalk);\n\n\t\tchalk.template.constructor = Chalk;\n\n\t\treturn chalk.template;\n\t}\n\n\tapplyOptions(this, options);\n}\n\n// Use bright blue on Windows as the normal blue color is illegible\nif (isSimpleWindowsTerm) {\n\tansiStyles.blue.open = '\\u001B[94m';\n}\n\nfor (const key of Object.keys(ansiStyles)) {\n\tansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');\n\n\tstyles[key] = {\n\t\tget() {\n\t\t\tconst codes = ansiStyles[key];\n\t\t\treturn build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key);\n\t\t}\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\treturn build.call(this, this._styles || [], true, 'visible');\n\t}\n};\n\nansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g');\nfor (const model of Object.keys(ansiStyles.color.ansi)) {\n\tif (skipModels.has(model)) {\n\t\tcontinue;\n\t}\n\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst level = this.level;\n\t\t\treturn function () {\n\t\t\t\tconst open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments);\n\t\t\t\tconst codes = {\n\t\t\t\t\topen,\n\t\t\t\t\tclose: ansiStyles.color.close,\n\t\t\t\t\tcloseRe: ansiStyles.color.closeRe\n\t\t\t\t};\n\t\t\t\treturn build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model);\n\t\t\t};\n\t\t}\n\t};\n}\n\nansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g');\nfor (const model of Object.keys(ansiStyles.bgColor.ansi)) {\n\tif (skipModels.has(model)) {\n\t\tcontinue;\n\t}\n\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst level = this.level;\n\t\t\treturn function () {\n\t\t\t\tconst open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments);\n\t\t\t\tconst codes = {\n\t\t\t\t\topen,\n\t\t\t\t\tclose: ansiStyles.bgColor.close,\n\t\t\t\t\tcloseRe: ansiStyles.bgColor.closeRe\n\t\t\t\t};\n\t\t\t\treturn build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model);\n\t\t\t};\n\t\t}\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, styles);\n\nfunction build(_styles, _empty, key) {\n\tconst builder = function () {\n\t\treturn applyStyle.apply(builder, arguments);\n\t};\n\n\tbuilder._styles = _styles;\n\tbuilder._empty = _empty;\n\n\tconst self = this;\n\n\tObject.defineProperty(builder, 'level', {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn self.level;\n\t\t},\n\t\tset(level) {\n\t\t\tself.level = level;\n\t\t}\n\t});\n\n\tObject.defineProperty(builder, 'enabled', {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn self.enabled;\n\t\t},\n\t\tset(enabled) {\n\t\t\tself.enabled = enabled;\n\t\t}\n\t});\n\n\t// See below for fix regarding invisible grey/dim combination on Windows\n\tbuilder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey';\n\n\t// `__proto__` is used because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tbuilder.__proto__ = proto; // eslint-disable-line no-proto\n\n\treturn builder;\n}\n\nfunction applyStyle() {\n\t// Support varags, but simply cast to string in case there's only one arg\n\tconst args = arguments;\n\tconst argsLen = args.length;\n\tlet str = String(arguments[0]);\n\n\tif (argsLen === 0) {\n\t\treturn '';\n\t}\n\n\tif (argsLen > 1) {\n\t\t// Don't slice `arguments`, it prevents V8 optimizations\n\t\tfor (let a = 1; a < argsLen; a++) {\n\t\t\tstr += ' ' + args[a];\n\t\t}\n\t}\n\n\tif (!this.enabled || this.level <= 0 || !str) {\n\t\treturn this._empty ? '' : str;\n\t}\n\n\t// Turns out that on Windows dimmed gray text becomes invisible in cmd.exe,\n\t// see https://github.com/chalk/chalk/issues/58\n\t// If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop.\n\tconst originalDim = ansiStyles.dim.open;\n\tif (isSimpleWindowsTerm && this.hasGrey) {\n\t\tansiStyles.dim.open = '';\n\t}\n\n\tfor (const code of this._styles.slice().reverse()) {\n\t\t// Replace any instances already present with a re-opening code\n\t\t// otherwise only the part of the string until said closing code\n\t\t// will be colored, and the rest will simply be 'plain'.\n\t\tstr = code.open + str.replace(code.closeRe, code.open) + code.close;\n\n\t\t// Close the styling before a linebreak and reopen\n\t\t// after next line to fix a bleed issue on macOS\n\t\t// https://github.com/chalk/chalk/pull/92\n\t\tstr = str.replace(/\\r?\\n/g, `${code.close}$&${code.open}`);\n\t}\n\n\t// Reset the original `dim` if we changed it to work around the Windows dimmed gray issue\n\tansiStyles.dim.open = originalDim;\n\n\treturn str;\n}\n\nfunction chalkTag(chalk, strings) {\n\tif (!Array.isArray(strings)) {\n\t\t// If chalk() was called by itself or with a string,\n\t\t// return the string itself as a string.\n\t\treturn [].slice.call(arguments, 1).join(' ');\n\t}\n\n\tconst args = [].slice.call(arguments, 2);\n\tconst parts = [strings.raw[0]];\n\n\tfor (let i = 1; i < strings.length; i++) {\n\t\tparts.push(String(args[i - 1]).replace(/[{}\\\\]/g, '\\\\$&'));\n\t\tparts.push(String(strings.raw[i]));\n\t}\n\n\treturn template(chalk, parts.join(''));\n}\n\nObject.defineProperties(Chalk.prototype, styles);\n\nmodule.exports = Chalk(); // eslint-disable-line new-cap\nmodule.exports.supportsColor = stdoutColor;\nmodule.exports.default = module.exports; // For TypeScript\n", "'use strict';\n\nfunction preserveCamelCase(str) {\n\tlet isLastCharLower = false;\n\tlet isLastCharUpper = false;\n\tlet isLastLastCharUpper = false;\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\tconst c = str[i];\n\n\t\tif (isLastCharLower && /[a-zA-Z]/.test(c) && c.toUpperCase() === c) {\n\t\t\tstr = str.substr(0, i) + '-' + str.substr(i);\n\t\t\tisLastCharLower = false;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = true;\n\t\t\ti++;\n\t\t} else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(c) && c.toLowerCase() === c) {\n\t\t\tstr = str.substr(0, i - 1) + '-' + str.substr(i - 1);\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = false;\n\t\t\tisLastCharLower = true;\n\t\t} else {\n\t\t\tisLastCharLower = c.toLowerCase() === c;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = c.toUpperCase() === c;\n\t\t}\n\t}\n\n\treturn str;\n}\n\nmodule.exports = function (str) {\n\tif (arguments.length > 1) {\n\t\tstr = Array.from(arguments)\n\t\t\t.map(x => x.trim())\n\t\t\t.filter(x => x.length)\n\t\t\t.join('-');\n\t} else {\n\t\tstr = str.trim();\n\t}\n\n\tif (str.length === 0) {\n\t\treturn '';\n\t}\n\n\tif (str.length === 1) {\n\t\treturn str.toLowerCase();\n\t}\n\n\tif (/^[a-z0-9]+$/.test(str)) {\n\t\treturn str;\n\t}\n\n\tconst hasUpperCase = str !== str.toLowerCase();\n\n\tif (hasUpperCase) {\n\t\tstr = preserveCamelCase(str);\n\t}\n\n\treturn str\n\t\t.replace(/^[_.\\- ]+/, '')\n\t\t.toLowerCase()\n\t\t.replace(/[_.\\- ]+(\\w|$)/g, (m, p1) => p1.toUpperCase());\n};\n", "// take an un-split argv string and tokenize it.\nmodule.exports = function (argString) {\n if (Array.isArray(argString)) return argString\n\n argString = argString.trim()\n\n var i = 0\n var prevC = null\n var c = null\n var opening = null\n var args = []\n\n for (var ii = 0; ii < argString.length; ii++) {\n prevC = c\n c = argString.charAt(ii)\n\n // split on spaces unless we're in quotes.\n if (c === ' ' && !opening) {\n if (!(prevC === ' ')) {\n i++\n }\n continue\n }\n\n // don't split the string if we're in matching\n // opening or closing single and double quotes.\n if (c === opening) {\n opening = null\n continue\n } else if ((c === \"'\" || c === '\"') && !opening) {\n opening = c\n continue\n }\n\n if (!args[i]) args[i] = ''\n args[i] += c\n }\n\n return args\n}\n", "var camelCase = require('camelcase')\nvar path = require('path')\nvar tokenizeArgString = require('./lib/tokenize-arg-string')\nvar util = require('util')\n\nfunction parse (args, opts) {\n if (!opts) opts = {}\n // allow a string argument to be passed in rather\n // than an argv array.\n args = tokenizeArgString(args)\n // aliases might have transitive relationships, normalize this.\n var aliases = combineAliases(opts.alias || {})\n var configuration = assign({\n 'short-option-groups': true,\n 'camel-case-expansion': true,\n 'dot-notation': true,\n 'parse-numbers': true,\n 'boolean-negation': true,\n 'negation-prefix': 'no-',\n 'duplicate-arguments-array': true,\n 'flatten-duplicate-arrays': true,\n 'populate--': false,\n 'combine-arrays': false\n }, opts.configuration)\n var defaults = opts.default || {}\n var configObjects = opts.configObjects || []\n var envPrefix = opts.envPrefix\n var notFlagsOption = configuration['populate--']\n var notFlagsArgv = notFlagsOption ? '--' : '_'\n var newAliases = {}\n // allow a i18n handler to be passed in, default to a fake one (util.format).\n var __ = opts.__ || function (str) {\n return util.format.apply(util, Array.prototype.slice.call(arguments))\n }\n var error = null\n var flags = {\n aliases: {},\n arrays: {},\n bools: {},\n strings: {},\n numbers: {},\n counts: {},\n normalize: {},\n configs: {},\n defaulted: {},\n nargs: {},\n coercions: {}\n }\n var negative = /^-[0-9]+(\\.[0-9]+)?/\n var negatedBoolean = new RegExp('^--' + configuration['negation-prefix'] + '(.+)')\n\n ;[].concat(opts.array).filter(Boolean).forEach(function (key) {\n flags.arrays[key] = true\n })\n\n ;[].concat(opts.boolean).filter(Boolean).forEach(function (key) {\n flags.bools[key] = true\n })\n\n ;[].concat(opts.string).filter(Boolean).forEach(function (key) {\n flags.strings[key] = true\n })\n\n ;[].concat(opts.number).filter(Boolean).forEach(function (key) {\n flags.numbers[key] = true\n })\n\n ;[].concat(opts.count).filter(Boolean).forEach(function (key) {\n flags.counts[key] = true\n })\n\n ;[].concat(opts.normalize).filter(Boolean).forEach(function (key) {\n flags.normalize[key] = true\n })\n\n Object.keys(opts.narg || {}).forEach(function (k) {\n flags.nargs[k] = opts.narg[k]\n })\n\n Object.keys(opts.coerce || {}).forEach(function (k) {\n flags.coercions[k] = opts.coerce[k]\n })\n\n if (Array.isArray(opts.config) || typeof opts.config === 'string') {\n ;[].concat(opts.config).filter(Boolean).forEach(function (key) {\n flags.configs[key] = true\n })\n } else {\n Object.keys(opts.config || {}).forEach(function (k) {\n flags.configs[k] = opts.config[k]\n })\n }\n\n // create a lookup table that takes into account all\n // combinations of aliases: {f: ['foo'], foo: ['f']}\n extendAliases(opts.key, aliases, opts.default, flags.arrays)\n\n // apply default values to all aliases.\n Object.keys(defaults).forEach(function (key) {\n (flags.aliases[key] || []).forEach(function (alias) {\n defaults[alias] = defaults[key]\n })\n })\n\n var argv = { _: [] }\n\n Object.keys(flags.bools).forEach(function (key) {\n setArg(key, !(key in defaults) ? false : defaults[key])\n setDefaulted(key)\n })\n\n var notFlags = []\n if (args.indexOf('--') !== -1) {\n notFlags = args.slice(args.indexOf('--') + 1)\n args = args.slice(0, args.indexOf('--'))\n }\n\n for (var i = 0; i < args.length; i++) {\n var arg = args[i]\n var broken\n var key\n var letters\n var m\n var next\n var value\n\n // -- seperated by =\n if (arg.match(/^--.+=/) || (\n !configuration['short-option-groups'] && arg.match(/^-.+=/)\n )) {\n // Using [\\s\\S] instead of . because js doesn't support the\n // 'dotall' regex modifier. See:\n // http://stackoverflow.com/a/1068308/13216\n m = arg.match(/^--?([^=]+)=([\\s\\S]*)$/)\n\n // nargs format = '--f=monkey washing cat'\n if (checkAllAliases(m[1], flags.nargs)) {\n args.splice(i + 1, 0, m[2])\n i = eatNargs(i, m[1], args)\n // arrays format = '--f=a b c'\n } else if (checkAllAliases(m[1], flags.arrays) && args.length > i + 1) {\n args.splice(i + 1, 0, m[2])\n i = eatArray(i, m[1], args)\n } else {\n setArg(m[1], m[2])\n }\n } else if (arg.match(negatedBoolean) && configuration['boolean-negation']) {\n key = arg.match(negatedBoolean)[1]\n setArg(key, false)\n\n // -- seperated by space.\n } else if (arg.match(/^--.+/) || (\n !configuration['short-option-groups'] && arg.match(/^-.+/)\n )) {\n key = arg.match(/^--?(.+)/)[1]\n\n // nargs format = '--foo a b c'\n if (checkAllAliases(key, flags.nargs)) {\n i = eatNargs(i, key, args)\n // array format = '--foo a b c'\n } else if (checkAllAliases(key, flags.arrays) && args.length > i + 1) {\n i = eatArray(i, key, args)\n } else {\n next = args[i + 1]\n\n if (next !== undefined && (!next.match(/^-/) ||\n next.match(negative)) &&\n !checkAllAliases(key, flags.bools) &&\n !checkAllAliases(key, flags.counts)) {\n setArg(key, next)\n i++\n } else if (/^(true|false)$/.test(next)) {\n setArg(key, next)\n i++\n } else {\n setArg(key, defaultForType(guessType(key, flags)))\n }\n }\n\n // dot-notation flag seperated by '='.\n } else if (arg.match(/^-.\\..+=/)) {\n m = arg.match(/^-([^=]+)=([\\s\\S]*)$/)\n setArg(m[1], m[2])\n\n // dot-notation flag seperated by space.\n } else if (arg.match(/^-.\\..+/)) {\n next = args[i + 1]\n key = arg.match(/^-(.\\..+)/)[1]\n\n if (next !== undefined && !next.match(/^-/) &&\n !checkAllAliases(key, flags.bools) &&\n !checkAllAliases(key, flags.counts)) {\n setArg(key, next)\n i++\n } else {\n setArg(key, defaultForType(guessType(key, flags)))\n }\n } else if (arg.match(/^-[^-]+/) && !arg.match(negative)) {\n letters = arg.slice(1, -1).split('')\n broken = false\n\n for (var j = 0; j < letters.length; j++) {\n next = arg.slice(j + 2)\n\n if (letters[j + 1] && letters[j + 1] === '=') {\n value = arg.slice(j + 3)\n key = letters[j]\n\n // nargs format = '-f=monkey washing cat'\n if (checkAllAliases(key, flags.nargs)) {\n args.splice(i + 1, 0, value)\n i = eatNargs(i, key, args)\n // array format = '-f=a b c'\n } else if (checkAllAliases(key, flags.arrays) && args.length > i + 1) {\n args.splice(i + 1, 0, value)\n i = eatArray(i, key, args)\n } else {\n setArg(key, value)\n }\n\n broken = true\n break\n }\n\n if (next === '-') {\n setArg(letters[j], next)\n continue\n }\n\n // current letter is an alphabetic character and next value is a number\n if (/[A-Za-z]/.test(letters[j]) &&\n /^-?\\d+(\\.\\d*)?(e-?\\d+)?$/.test(next)) {\n setArg(letters[j], next)\n broken = true\n break\n }\n\n if (letters[j + 1] && letters[j + 1].match(/\\W/)) {\n setArg(letters[j], next)\n broken = true\n break\n } else {\n setArg(letters[j], defaultForType(guessType(letters[j], flags)))\n }\n }\n\n key = arg.slice(-1)[0]\n\n if (!broken && key !== '-') {\n // nargs format = '-f a b c'\n if (checkAllAliases(key, flags.nargs)) {\n i = eatNargs(i, key, args)\n // array format = '-f a b c'\n } else if (checkAllAliases(key, flags.arrays) && args.length > i + 1) {\n i = eatArray(i, key, args)\n } else {\n next = args[i + 1]\n\n if (next !== undefined && (!/^(-|--)[^-]/.test(next) ||\n next.match(negative)) &&\n !checkAllAliases(key, flags.bools) &&\n !checkAllAliases(key, flags.counts)) {\n setArg(key, next)\n i++\n } else if (/^(true|false)$/.test(next)) {\n setArg(key, next)\n i++\n } else {\n setArg(key, defaultForType(guessType(key, flags)))\n }\n }\n }\n } else {\n argv._.push(maybeCoerceNumber('_', arg))\n }\n }\n\n // order of precedence:\n // 1. command line arg\n // 2. value from env var\n // 3. value from config file\n // 4. value from config objects\n // 5. configured default value\n applyEnvVars(argv, true) // special case: check env vars that point to config file\n applyEnvVars(argv, false)\n setConfig(argv)\n setConfigObjects()\n applyDefaultsAndAliases(argv, flags.aliases, defaults)\n applyCoercions(argv)\n\n // for any counts either not in args or without an explicit default, set to 0\n Object.keys(flags.counts).forEach(function (key) {\n if (!hasKey(argv, key.split('.'))) setArg(key, 0)\n })\n\n // '--' defaults to undefined.\n if (notFlagsOption && notFlags.length) argv[notFlagsArgv] = []\n notFlags.forEach(function (key) {\n argv[notFlagsArgv].push(key)\n })\n\n // how many arguments should we consume, based\n // on the nargs option?\n function eatNargs (i, key, args) {\n var ii\n const toEat = checkAllAliases(key, flags.nargs)\n\n // nargs will not consume flag arguments, e.g., -abc, --foo,\n // and terminates when one is observed.\n var available = 0\n for (ii = i + 1; ii < args.length; ii++) {\n if (!args[ii].match(/^-[^0-9]/)) available++\n else break\n }\n\n if (available < toEat) error = Error(__('Not enough arguments following: %s', key))\n\n const consumed = Math.min(available, toEat)\n for (ii = i + 1; ii < (consumed + i + 1); ii++) {\n setArg(key, args[ii])\n }\n\n return (i + consumed)\n }\n\n // if an option is an array, eat all non-hyphenated arguments\n // following it... YUM!\n // e.g., --foo apple banana cat becomes [\"apple\", \"banana\", \"cat\"]\n function eatArray (i, key, args) {\n var start = i + 1\n var argsToSet = []\n var multipleArrayFlag = i > 0\n for (var ii = i + 1; ii < args.length; ii++) {\n if (/^-/.test(args[ii]) && !negative.test(args[ii])) {\n if (ii === start) {\n setArg(key, defaultForType('array'))\n }\n multipleArrayFlag = true\n break\n }\n i = ii\n argsToSet.push(args[ii])\n }\n if (multipleArrayFlag) {\n setArg(key, argsToSet.map(function (arg) {\n return processValue(key, arg)\n }))\n } else {\n argsToSet.forEach(function (arg) {\n setArg(key, arg)\n })\n }\n\n return i\n }\n\n function setArg (key, val) {\n unsetDefaulted(key)\n\n if (/-/.test(key) && configuration['camel-case-expansion']) {\n addNewAlias(key, camelCase(key))\n }\n\n var value = processValue(key, val)\n\n var splitKey = key.split('.')\n setKey(argv, splitKey, value)\n\n // handle populating aliases of the full key\n if (flags.aliases[key]) {\n flags.aliases[key].forEach(function (x) {\n x = x.split('.')\n setKey(argv, x, value)\n })\n }\n\n // handle populating aliases of the first element of the dot-notation key\n if (splitKey.length > 1 && configuration['dot-notation']) {\n ;(flags.aliases[splitKey[0]] || []).forEach(function (x) {\n x = x.split('.')\n\n // expand alias with nested objects in key\n var a = [].concat(splitKey)\n a.shift() // nuke the old key.\n x = x.concat(a)\n\n setKey(argv, x, value)\n })\n }\n\n // Set normalize getter and setter when key is in 'normalize' but isn't an array\n if (checkAllAliases(key, flags.normalize) && !checkAllAliases(key, flags.arrays)) {\n var keys = [key].concat(flags.aliases[key] || [])\n keys.forEach(function (key) {\n argv.__defineSetter__(key, function (v) {\n val = path.normalize(v)\n })\n\n argv.__defineGetter__(key, function () {\n return typeof val === 'string' ? path.normalize(val) : val\n })\n })\n }\n }\n\n function addNewAlias (key, alias) {\n if (!(flags.aliases[key] && flags.aliases[key].length)) {\n flags.aliases[key] = [alias]\n newAliases[alias] = true\n }\n if (!(flags.aliases[alias] && flags.aliases[alias].length)) {\n addNewAlias(alias, key)\n }\n }\n\n function processValue (key, val) {\n // handle parsing boolean arguments --foo=true --bar false.\n if (checkAllAliases(key, flags.bools) || checkAllAliases(key, flags.counts)) {\n if (typeof val === 'string') val = val === 'true'\n }\n\n var value = maybeCoerceNumber(key, val)\n\n // increment a count given as arg (either no value or value parsed as boolean)\n if (checkAllAliases(key, flags.counts) && (isUndefined(value) || typeof value === 'boolean')) {\n value = increment\n }\n\n // Set normalized value when key is in 'normalize' and in 'arrays'\n if (checkAllAliases(key, flags.normalize) && checkAllAliases(key, flags.arrays)) {\n if (Array.isArray(val)) value = val.map(path.normalize)\n else value = path.normalize(val)\n }\n return value\n }\n\n function maybeCoerceNumber (key, value) {\n if (!checkAllAliases(key, flags.strings) && !checkAllAliases(key, flags.coercions)) {\n const shouldCoerceNumber = isNumber(value) && configuration['parse-numbers'] && (\n Number.isSafeInteger(Math.floor(value))\n )\n if (shouldCoerceNumber || (!isUndefined(value) && checkAllAliases(key, flags.numbers))) value = Number(value)\n }\n return value\n }\n\n // set args from config.json file, this should be\n // applied last so that defaults can be applied.\n function setConfig (argv) {\n var configLookup = {}\n\n // expand defaults/aliases, in-case any happen to reference\n // the config.json file.\n applyDefaultsAndAliases(configLookup, flags.aliases, defaults)\n\n Object.keys(flags.configs).forEach(function (configKey) {\n var configPath = argv[configKey] || configLookup[configKey]\n if (configPath) {\n try {\n var config = null\n var resolvedConfigPath = path.resolve(process.cwd(), configPath)\n\n if (typeof flags.configs[configKey] === 'function') {\n try {\n config = flags.configs[configKey](resolvedConfigPath)\n } catch (e) {\n config = e\n }\n if (config instanceof Error) {\n error = config\n return\n }\n } else {\n config = require(resolvedConfigPath)\n }\n\n setConfigObject(config)\n } catch (ex) {\n if (argv[configKey]) error = Error(__('Invalid JSON config file: %s', configPath))\n }\n }\n })\n }\n\n // set args from config object.\n // it recursively checks nested objects.\n function setConfigObject (config, prev) {\n Object.keys(config).forEach(function (key) {\n var value = config[key]\n var fullKey = prev ? prev + '.' + key : key\n\n // if the value is an inner object and we have dot-notation\n // enabled, treat inner objects in config the same as\n // heavily nested dot notations (foo.bar.apple).\n if (typeof value === 'object' && value !== null && !Array.isArray(value) && configuration['dot-notation']) {\n // if the value is an object but not an array, check nested object\n setConfigObject(value, fullKey)\n } else {\n // setting arguments via CLI takes precedence over\n // values within the config file.\n if (!hasKey(argv, fullKey.split('.')) || (flags.defaulted[fullKey]) || (flags.arrays[fullKey] && configuration['combine-arrays'])) {\n setArg(fullKey, value)\n }\n }\n })\n }\n\n // set all config objects passed in opts\n function setConfigObjects () {\n if (typeof configObjects === 'undefined') return\n configObjects.forEach(function (configObject) {\n setConfigObject(configObject)\n })\n }\n\n function applyEnvVars (argv, configOnly) {\n if (typeof envPrefix === 'undefined') return\n\n var prefix = typeof envPrefix === 'string' ? envPrefix : ''\n Object.keys(process.env).forEach(function (envVar) {\n if (prefix === '' || envVar.lastIndexOf(prefix, 0) === 0) {\n // get array of nested keys and convert them to camel case\n var keys = envVar.split('__').map(function (key, i) {\n if (i === 0) {\n key = key.substring(prefix.length)\n }\n return camelCase(key)\n })\n\n if (((configOnly && flags.configs[keys.join('.')]) || !configOnly) && (!hasKey(argv, keys) || flags.defaulted[keys.join('.')])) {\n setArg(keys.join('.'), process.env[envVar])\n }\n }\n })\n }\n\n function applyCoercions (argv) {\n var coerce\n var applied = {}\n Object.keys(argv).forEach(function (key) {\n if (!applied.hasOwnProperty(key)) { // If we haven't already coerced this option via one of its aliases\n coerce = checkAllAliases(key, flags.coercions)\n if (typeof coerce === 'function') {\n try {\n var value = coerce(argv[key])\n ;([].concat(flags.aliases[key] || [], key)).forEach(ali => {\n applied[ali] = argv[ali] = value\n })\n } catch (err) {\n error = err\n }\n }\n }\n })\n }\n\n function applyDefaultsAndAliases (obj, aliases, defaults) {\n Object.keys(defaults).forEach(function (key) {\n if (!hasKey(obj, key.split('.'))) {\n setKey(obj, key.split('.'), defaults[key])\n\n ;(aliases[key] || []).forEach(function (x) {\n if (hasKey(obj, x.split('.'))) return\n setKey(obj, x.split('.'), defaults[key])\n })\n }\n })\n }\n\n function hasKey (obj, keys) {\n var o = obj\n\n if (!configuration['dot-notation']) keys = [keys.join('.')]\n\n keys.slice(0, -1).forEach(function (key) {\n o = (o[key] || {})\n })\n\n var key = keys[keys.length - 1]\n\n if (typeof o !== 'object') return false\n else return key in o\n }\n\n function setKey (obj, keys, value) {\n var o = obj\n\n if (!configuration['dot-notation']) keys = [keys.join('.')]\n\n keys.slice(0, -1).forEach(function (key, index) {\n if (typeof o === 'object' && o[key] === undefined) {\n o[key] = {}\n }\n\n if (typeof o[key] !== 'object' || Array.isArray(o[key])) {\n // ensure that o[key] is an array, and that the last item is an empty object.\n if (Array.isArray(o[key])) {\n o[key].push({})\n } else {\n o[key] = [o[key], {}]\n }\n\n // we want to update the empty object at the end of the o[key] array, so set o to that object\n o = o[key][o[key].length - 1]\n } else {\n o = o[key]\n }\n })\n\n var key = keys[keys.length - 1]\n\n var isTypeArray = checkAllAliases(keys.join('.'), flags.arrays)\n var isValueArray = Array.isArray(value)\n var duplicate = configuration['duplicate-arguments-array']\n\n if (value === increment) {\n o[key] = increment(o[key])\n } else if (Array.isArray(o[key])) {\n if (duplicate && isTypeArray && isValueArray) {\n o[key] = configuration['flatten-duplicate-arrays'] ? o[key].concat(value) : [o[key]].concat([value])\n } else if (!duplicate && Boolean(isTypeArray) === Boolean(isValueArray)) {\n o[key] = value\n } else {\n o[key] = o[key].concat([value])\n }\n } else if (o[key] === undefined && isTypeArray) {\n o[key] = isValueArray ? value : [value]\n } else if (duplicate && !(o[key] === undefined || checkAllAliases(key, flags.bools) || checkAllAliases(keys.join('.'), flags.bools) || checkAllAliases(key, flags.counts))) {\n o[key] = [ o[key], value ]\n } else {\n o[key] = value\n }\n }\n\n // extend the aliases list with inferred aliases.\n function extendAliases () {\n Array.prototype.slice.call(arguments).forEach(function (obj) {\n Object.keys(obj || {}).forEach(function (key) {\n // short-circuit if we've already added a key\n // to the aliases array, for example it might\n // exist in both 'opts.default' and 'opts.key'.\n if (flags.aliases[key]) return\n\n flags.aliases[key] = [].concat(aliases[key] || [])\n // For \"--option-name\", also set argv.optionName\n flags.aliases[key].concat(key).forEach(function (x) {\n if (/-/.test(x) && configuration['camel-case-expansion']) {\n var c = camelCase(x)\n if (c !== key && flags.aliases[key].indexOf(c) === -1) {\n flags.aliases[key].push(c)\n newAliases[c] = true\n }\n }\n })\n flags.aliases[key].forEach(function (x) {\n flags.aliases[x] = [key].concat(flags.aliases[key].filter(function (y) {\n return x !== y\n }))\n })\n })\n })\n }\n\n // check if a flag is set for any of a key's aliases.\n function checkAllAliases (key, flag) {\n var isSet = false\n var toCheck = [].concat(flags.aliases[key] || [], key)\n\n toCheck.forEach(function (key) {\n if (flag[key]) isSet = flag[key]\n })\n\n return isSet\n }\n\n function setDefaulted (key) {\n [].concat(flags.aliases[key] || [], key).forEach(function (k) {\n flags.defaulted[k] = true\n })\n }\n\n function unsetDefaulted (key) {\n [].concat(flags.aliases[key] || [], key).forEach(function (k) {\n delete flags.defaulted[k]\n })\n }\n\n // return a default value, given the type of a flag.,\n // e.g., key of type 'string' will default to '', rather than 'true'.\n function defaultForType (type) {\n var def = {\n boolean: true,\n string: '',\n number: undefined,\n array: []\n }\n\n return def[type]\n }\n\n // given a flag, enforce a default type.\n function guessType (key, flags) {\n var type = 'boolean'\n\n if (checkAllAliases(key, flags.strings)) type = 'string'\n else if (checkAllAliases(key, flags.numbers)) type = 'number'\n else if (checkAllAliases(key, flags.arrays)) type = 'array'\n\n return type\n }\n\n function isNumber (x) {\n if (typeof x === 'number') return true\n if (/^0x[0-9a-f]+$/i.test(x)) return true\n return /^[-+]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(e[-+]?\\d+)?$/.test(x)\n }\n\n function isUndefined (num) {\n return num === undefined\n }\n\n return {\n argv: argv,\n error: error,\n aliases: flags.aliases,\n newAliases: newAliases,\n configuration: configuration\n }\n}\n\n// if any aliases reference each other, we should\n// merge them together.\nfunction combineAliases (aliases) {\n var aliasArrays = []\n var change = true\n var combined = {}\n\n // turn alias lookup hash {key: ['alias1', 'alias2']} into\n // a simple array ['key', 'alias1', 'alias2']\n Object.keys(aliases).forEach(function (key) {\n aliasArrays.push(\n [].concat(aliases[key], key)\n )\n })\n\n // combine arrays until zero changes are\n // made in an iteration.\n while (change) {\n change = false\n for (var i = 0; i < aliasArrays.length; i++) {\n for (var ii = i + 1; ii < aliasArrays.length; ii++) {\n var intersect = aliasArrays[i].filter(function (v) {\n return aliasArrays[ii].indexOf(v) !== -1\n })\n\n if (intersect.length) {\n aliasArrays[i] = aliasArrays[i].concat(aliasArrays[ii])\n aliasArrays.splice(ii, 1)\n change = true\n break\n }\n }\n }\n }\n\n // map arrays back to the hash-lookup (de-dupe while\n // we're at it).\n aliasArrays.forEach(function (aliasArray) {\n aliasArray = aliasArray.filter(function (v, i, self) {\n return self.indexOf(v) === i\n })\n combined[aliasArray.pop()] = aliasArray\n })\n\n return combined\n}\n\nfunction assign (defaults, configuration) {\n var o = {}\n configuration = configuration || {}\n\n Object.keys(defaults).forEach(function (k) {\n o[k] = defaults[k]\n })\n Object.keys(configuration).forEach(function (k) {\n o[k] = configuration[k]\n })\n\n return o\n}\n\n// this function should only be called when a count is given as an arg\n// it is NOT called to set a default value\n// thus we can start the count at 1 instead of 0\nfunction increment (orig) {\n return orig !== undefined ? orig + 1 : 1\n}\n\nfunction Parser (args, opts) {\n var result = parse(args.slice(), opts)\n\n return result.argv\n}\n\n// parse arguments and return detailed\n// meta information, aliases, etc.\nParser.detailed = function (args, opts) {\n return parse(args.slice(), opts)\n}\n\nmodule.exports = Parser\n", "'use strict';\n\nvar fs = require('fs'),\n join = require('path').join,\n resolve = require('path').resolve,\n dirname = require('path').dirname,\n defaultOptions = {\n extensions: ['js', 'json', 'coffee'],\n recurse: true,\n rename: function (name) {\n return name;\n },\n visit: function (obj) {\n return obj;\n }\n };\n\nfunction checkFileInclusion(path, filename, options) {\n return (\n // verify file has valid extension\n (new RegExp('\\\\.(' + options.extensions.join('|') + ')$', 'i').test(filename)) &&\n\n // if options.include is a RegExp, evaluate it and make sure the path passes\n !(options.include && options.include instanceof RegExp && !options.include.test(path)) &&\n\n // if options.include is a function, evaluate it and make sure the path passes\n !(options.include && typeof options.include === 'function' && !options.include(path, filename)) &&\n\n // if options.exclude is a RegExp, evaluate it and make sure the path doesn't pass\n !(options.exclude && options.exclude instanceof RegExp && options.exclude.test(path)) &&\n\n // if options.exclude is a function, evaluate it and make sure the path doesn't pass\n !(options.exclude && typeof options.exclude === 'function' && options.exclude(path, filename))\n );\n}\n\nfunction requireDirectory(m, path, options) {\n var retval = {};\n\n // path is optional\n if (path && !options && typeof path !== 'string') {\n options = path;\n path = null;\n }\n\n // default options\n options = options || {};\n for (var prop in defaultOptions) {\n if (typeof options[prop] === 'undefined') {\n options[prop] = defaultOptions[prop];\n }\n }\n\n // if no path was passed in, assume the equivelant of __dirname from caller\n // otherwise, resolve path relative to the equivalent of __dirname\n path = !path ? dirname(m.filename) : resolve(dirname(m.filename), path);\n\n // get the path of each file in specified directory, append to current tree node, recurse\n fs.readdirSync(path).forEach(function (filename) {\n var joined = join(path, filename),\n files,\n key,\n obj;\n\n if (fs.statSync(joined).isDirectory() && options.recurse) {\n // this node is a directory; recurse\n files = requireDirectory(m, joined, options);\n // exclude empty directories\n if (Object.keys(files).length) {\n retval[options.rename(filename, joined, filename)] = files;\n }\n } else {\n if (joined !== m.filename && checkFileInclusion(joined, filename, options)) {\n // hash node key shouldn't include file extension\n key = filename.substring(0, filename.lastIndexOf('.'));\n obj = m.require(joined);\n retval[options.rename(key, joined, filename)] = options.visit(obj, joined, filename) || obj;\n }\n }\n });\n\n return retval;\n}\n\nmodule.exports = requireDirectory;\nmodule.exports.defaults = defaultOptions;\n", "'use strict'\n\nmodule.exports = function whichModule (exported) {\n for (var i = 0, files = Object.keys(require.cache), mod; i < files.length; i++) {\n mod = require.cache[files[i]]\n if (mod.exports === exported) return mod\n }\n return null\n}\n", "'use strict'\n\nconst inspect = require('util').inspect\nconst path = require('path')\nconst Parser = require('yargs-parser')\n\nconst DEFAULT_MARKER = /(^\\*)|(^\\$0)/\n\n// handles parsing positional arguments,\n// and populating argv with said positional\n// arguments.\nmodule.exports = function command (yargs, usage, validation) {\n const self = {}\n let handlers = {}\n let aliasMap = {}\n let defaultCommand\n self.addHandler = function addHandler (cmd, description, builder, handler, middlewares) {\n let aliases = []\n handler = handler || (() => {})\n middlewares = middlewares || []\n if (Array.isArray(cmd)) {\n aliases = cmd.slice(1)\n cmd = cmd[0]\n } else if (typeof cmd === 'object') {\n let command = (Array.isArray(cmd.command) || typeof cmd.command === 'string') ? cmd.command : moduleName(cmd)\n if (cmd.aliases) command = [].concat(command).concat(cmd.aliases)\n self.addHandler(command, extractDesc(cmd), cmd.builder, cmd.handler, cmd.middlewares)\n return\n }\n\n // allow a module to be provided instead of separate builder and handler\n if (typeof builder === 'object' && builder.builder && typeof builder.handler === 'function') {\n self.addHandler([cmd].concat(aliases), description, builder.builder, builder.handler, builder.middlewares)\n return\n }\n\n // parse positionals out of cmd string\n const parsedCommand = self.parseCommand(cmd)\n\n // remove positional args from aliases only\n aliases = aliases.map(alias => self.parseCommand(alias).cmd)\n\n // check for default and filter out '*''\n let isDefault = false\n const parsedAliases = [parsedCommand.cmd].concat(aliases).filter((c) => {\n if (DEFAULT_MARKER.test(c)) {\n isDefault = true\n return false\n }\n return true\n })\n\n // standardize on $0 for default command.\n if (parsedAliases.length === 0 && isDefault) parsedAliases.push('$0')\n\n // shift cmd and aliases after filtering out '*'\n if (isDefault) {\n parsedCommand.cmd = parsedAliases[0]\n aliases = parsedAliases.slice(1)\n cmd = cmd.replace(DEFAULT_MARKER, parsedCommand.cmd)\n }\n\n // populate aliasMap\n aliases.forEach((alias) => {\n aliasMap[alias] = parsedCommand.cmd\n })\n\n if (description !== false) {\n usage.command(cmd, description, isDefault, aliases)\n }\n\n handlers[parsedCommand.cmd] = {\n original: cmd,\n description: description,\n handler,\n builder: builder || {},\n middlewares: middlewares || [],\n demanded: parsedCommand.demanded,\n optional: parsedCommand.optional\n }\n\n if (isDefault) defaultCommand = handlers[parsedCommand.cmd]\n }\n\n self.addDirectory = function addDirectory (dir, context, req, callerFile, opts) {\n opts = opts || {}\n // disable recursion to support nested directories of subcommands\n if (typeof opts.recurse !== 'boolean') opts.recurse = false\n // exclude 'json', 'coffee' from require-directory defaults\n if (!Array.isArray(opts.extensions)) opts.extensions = ['js']\n // allow consumer to define their own visitor function\n const parentVisit = typeof opts.visit === 'function' ? opts.visit : o => o\n // call addHandler via visitor function\n opts.visit = function visit (obj, joined, filename) {\n const visited = parentVisit(obj, joined, filename)\n // allow consumer to skip modules with their own visitor\n if (visited) {\n // check for cyclic reference\n // each command file path should only be seen once per execution\n if (~context.files.indexOf(joined)) return visited\n // keep track of visited files in context.files\n context.files.push(joined)\n self.addHandler(visited)\n }\n return visited\n }\n require('require-directory')({ require: req, filename: callerFile }, dir, opts)\n }\n\n // lookup module object from require()d command and derive name\n // if module was not require()d and no name given, throw error\n function moduleName (obj) {\n const mod = require('which-module')(obj)\n if (!mod) throw new Error(`No command name given for module: ${inspect(obj)}`)\n return commandFromFilename(mod.filename)\n }\n\n // derive command name from filename\n function commandFromFilename (filename) {\n return path.basename(filename, path.extname(filename))\n }\n\n function extractDesc (obj) {\n for (let keys = ['describe', 'description', 'desc'], i = 0, l = keys.length, test; i < l; i++) {\n test = obj[keys[i]]\n if (typeof test === 'string' || typeof test === 'boolean') return test\n }\n return false\n }\n\n self.parseCommand = function parseCommand (cmd) {\n const extraSpacesStrippedCommand = cmd.replace(/\\s{2,}/g, ' ')\n const splitCommand = extraSpacesStrippedCommand.split(/\\s+(?![^[]*]|[^<]*>)/)\n const bregex = /\\.*[\\][<>]/g\n const parsedCommand = {\n cmd: (splitCommand.shift()).replace(bregex, ''),\n demanded: [],\n optional: []\n }\n splitCommand.forEach((cmd, i) => {\n let variadic = false\n cmd = cmd.replace(/\\s/g, '')\n if (/\\.+[\\]>]/.test(cmd) && i === splitCommand.length - 1) variadic = true\n if (/^\\[/.test(cmd)) {\n parsedCommand.optional.push({\n cmd: cmd.replace(bregex, '').split('|'),\n variadic\n })\n } else {\n parsedCommand.demanded.push({\n cmd: cmd.replace(bregex, '').split('|'),\n variadic\n })\n }\n })\n return parsedCommand\n }\n\n self.getCommands = () => Object.keys(handlers).concat(Object.keys(aliasMap))\n\n self.getCommandHandlers = () => handlers\n\n self.hasDefaultCommand = () => !!defaultCommand\n\n self.runCommand = function runCommand (command, yargs, parsed, commandIndex) {\n let aliases = parsed.aliases\n const commandHandler = handlers[command] || handlers[aliasMap[command]] || defaultCommand\n const currentContext = yargs.getContext()\n let numFiles = currentContext.files.length\n const parentCommands = currentContext.commands.slice()\n\n // what does yargs look like after the buidler is run?\n let innerArgv = parsed.argv\n let innerYargs = null\n let positionalMap = {}\n if (command) {\n currentContext.commands.push(command)\n currentContext.fullCommands.push(commandHandler.original)\n }\n if (typeof commandHandler.builder === 'function') {\n // a function can be provided, which builds\n // up a yargs chain and possibly returns it.\n innerYargs = commandHandler.builder(yargs.reset(parsed.aliases))\n // if the builder function did not yet parse argv with reset yargs\n // and did not explicitly set a usage() string, then apply the\n // original command string as usage() for consistent behavior with\n // options object below.\n if (yargs.parsed === false) {\n if (shouldUpdateUsage(yargs)) {\n yargs.getUsageInstance().usage(\n usageFromParentCommandsCommandHandler(parentCommands, commandHandler),\n commandHandler.description\n )\n }\n innerArgv = innerYargs ? innerYargs._parseArgs(null, null, true, commandIndex) : yargs._parseArgs(null, null, true, commandIndex)\n } else {\n innerArgv = yargs.parsed.argv\n }\n\n if (innerYargs && yargs.parsed === false) aliases = innerYargs.parsed.aliases\n else aliases = yargs.parsed.aliases\n } else if (typeof commandHandler.builder === 'object') {\n // as a short hand, an object can instead be provided, specifying\n // the options that a command takes.\n innerYargs = yargs.reset(parsed.aliases)\n if (shouldUpdateUsage(innerYargs)) {\n innerYargs.getUsageInstance().usage(\n usageFromParentCommandsCommandHandler(parentCommands, commandHandler),\n commandHandler.description\n )\n }\n Object.keys(commandHandler.builder).forEach((key) => {\n innerYargs.option(key, commandHandler.builder[key])\n })\n innerArgv = innerYargs._parseArgs(null, null, true, commandIndex)\n aliases = innerYargs.parsed.aliases\n }\n\n if (!yargs._hasOutput()) {\n positionalMap = populatePositionals(commandHandler, innerArgv, currentContext, yargs)\n }\n\n // we apply validation post-hoc, so that custom\n // checks get passed populated positional arguments.\n if (!yargs._hasOutput()) yargs._runValidation(innerArgv, aliases, positionalMap, yargs.parsed.error)\n\n if (commandHandler.handler && !yargs._hasOutput()) {\n yargs._setHasOutput()\n if (commandHandler.middlewares.length > 0) {\n const middlewareArgs = commandHandler.middlewares.reduce(function (initialObj, middleware) {\n return Object.assign(initialObj, middleware(innerArgv))\n }, {})\n Object.assign(innerArgv, middlewareArgs)\n }\n const handlerResult = commandHandler.handler(innerArgv)\n if (handlerResult && typeof handlerResult.then === 'function') {\n handlerResult.then(\n null,\n (error) => yargs.getUsageInstance().fail(null, error)\n )\n }\n }\n\n if (command) {\n currentContext.commands.pop()\n currentContext.fullCommands.pop()\n }\n numFiles = currentContext.files.length - numFiles\n if (numFiles > 0) currentContext.files.splice(numFiles * -1, numFiles)\n\n return innerArgv\n }\n\n function shouldUpdateUsage (yargs) {\n return !yargs.getUsageInstance().getUsageDisabled() &&\n yargs.getUsageInstance().getUsage().length === 0\n }\n\n function usageFromParentCommandsCommandHandler (parentCommands, commandHandler) {\n const c = DEFAULT_MARKER.test(commandHandler.original) ? commandHandler.original.replace(DEFAULT_MARKER, '').trim() : commandHandler.original\n const pc = parentCommands.filter((c) => { return !DEFAULT_MARKER.test(c) })\n pc.push(c)\n return `$0 ${pc.join(' ')}`\n }\n\n self.runDefaultBuilderOn = function (yargs) {\n if (shouldUpdateUsage(yargs)) {\n // build the root-level command string from the default string.\n const commandString = DEFAULT_MARKER.test(defaultCommand.original)\n ? defaultCommand.original : defaultCommand.original.replace(/^[^[\\]<>]*/, '$0 ')\n yargs.getUsageInstance().usage(\n commandString,\n defaultCommand.description\n )\n }\n const builder = defaultCommand.builder\n if (typeof builder === 'function') {\n builder(yargs)\n } else {\n Object.keys(builder).forEach((key) => {\n yargs.option(key, builder[key])\n })\n }\n }\n\n // transcribe all positional arguments \"command <foo> <bar> [apple]\"\n // onto argv.\n function populatePositionals (commandHandler, argv, context, yargs) {\n argv._ = argv._.slice(context.commands.length) // nuke the current commands\n const demanded = commandHandler.demanded.slice(0)\n const optional = commandHandler.optional.slice(0)\n const positionalMap = {}\n\n validation.positionalCount(demanded.length, argv._.length)\n\n while (demanded.length) {\n const demand = demanded.shift()\n populatePositional(demand, argv, positionalMap)\n }\n\n while (optional.length) {\n const maybe = optional.shift()\n populatePositional(maybe, argv, positionalMap)\n }\n\n argv._ = context.commands.concat(argv._)\n\n postProcessPositionals(argv, positionalMap, self.cmdToParseOptions(commandHandler.original))\n\n return positionalMap\n }\n\n function populatePositional (positional, argv, positionalMap, parseOptions) {\n const cmd = positional.cmd[0]\n if (positional.variadic) {\n positionalMap[cmd] = argv._.splice(0).map(String)\n } else {\n if (argv._.length) positionalMap[cmd] = [String(argv._.shift())]\n }\n }\n\n // we run yargs-parser against the positional arguments\n // applying the same parsing logic used for flags.\n function postProcessPositionals (argv, positionalMap, parseOptions) {\n // combine the parsing hints we've inferred from the command\n // string with explicitly configured parsing hints.\n const options = Object.assign({}, yargs.getOptions())\n options.default = Object.assign(parseOptions.default, options.default)\n options.alias = Object.assign(parseOptions.alias, options.alias)\n options.array = options.array.concat(parseOptions.array)\n\n const unparsed = []\n Object.keys(positionalMap).forEach((key) => {\n positionalMap[key].map((value) => {\n unparsed.push(`--${key}`)\n unparsed.push(value)\n })\n })\n\n // short-circuit parse.\n if (!unparsed.length) return\n\n const parsed = Parser.detailed(unparsed, options)\n\n if (parsed.error) {\n yargs.getUsageInstance().fail(parsed.error.message, parsed.error)\n } else {\n // only copy over positional keys (don't overwrite\n // flag arguments that were already parsed).\n const positionalKeys = Object.keys(positionalMap)\n Object.keys(positionalMap).forEach((key) => {\n [].push.apply(positionalKeys, parsed.aliases[key])\n })\n\n Object.keys(parsed.argv).forEach((key) => {\n if (positionalKeys.indexOf(key) !== -1) {\n argv[key] = parsed.argv[key]\n }\n })\n }\n }\n\n self.cmdToParseOptions = function (cmdString) {\n const parseOptions = {\n array: [],\n default: {},\n alias: {},\n demand: {}\n }\n\n const parsed = self.parseCommand(cmdString)\n parsed.demanded.forEach((d) => {\n const cmds = d.cmd.slice(0)\n const cmd = cmds.shift()\n if (d.variadic) {\n parseOptions.array.push(cmd)\n parseOptions.default[cmd] = []\n }\n cmds.forEach((c) => {\n parseOptions.alias[cmd] = c\n })\n parseOptions.demand[cmd] = true\n })\n\n parsed.optional.forEach((o) => {\n const cmds = o.cmd.slice(0)\n const cmd = cmds.shift()\n if (o.variadic) {\n parseOptions.array.push(cmd)\n parseOptions.default[cmd] = []\n }\n cmds.forEach((c) => {\n parseOptions.alias[cmd] = c\n })\n })\n\n return parseOptions\n }\n\n self.reset = () => {\n handlers = {}\n aliasMap = {}\n defaultCommand = undefined\n return self\n }\n\n // used by yargs.parse() to freeze\n // the state of commands such that\n // we can apply .parse() multiple times\n // with the same yargs instance.\n let frozen\n self.freeze = () => {\n frozen = {}\n frozen.handlers = handlers\n frozen.aliasMap = aliasMap\n frozen.defaultCommand = defaultCommand\n }\n self.unfreeze = () => {\n handlers = frozen.handlers\n aliasMap = frozen.aliasMap\n defaultCommand = frozen.defaultCommand\n frozen = undefined\n }\n\n return self\n}\n", "'use strict'\nfunction YError (msg) {\n this.name = 'YError'\n this.message = msg || 'yargs error'\n Error.captureStackTrace(this, YError)\n}\n\nYError.prototype = Object.create(Error.prototype)\nYError.prototype.constructor = YError\n\nmodule.exports = YError\n", "'use strict'\nconst command = require('./command')()\nconst YError = require('./yerror')\n\nconst positionName = ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']\n\nmodule.exports = function argsert (expected, callerArguments, length) {\n // TODO: should this eventually raise an exception.\n try {\n // preface the argument description with \"cmd\", so\n // that we can run it through yargs' command parser.\n let position = 0\n let parsed = {demanded: [], optional: []}\n if (typeof expected === 'object') {\n length = callerArguments\n callerArguments = expected\n } else {\n parsed = command.parseCommand(`cmd ${expected}`)\n }\n const args = [].slice.call(callerArguments)\n\n while (args.length && args[args.length - 1] === undefined) args.pop()\n length = length || args.length\n\n if (length < parsed.demanded.length) {\n throw new YError(`Not enough arguments provided. Expected ${parsed.demanded.length} but received ${args.length}.`)\n }\n\n const totalCommands = parsed.demanded.length + parsed.optional.length\n if (length > totalCommands) {\n throw new YError(`Too many arguments provided. Expected max ${totalCommands} but received ${length}.`)\n }\n\n parsed.demanded.forEach((demanded) => {\n const arg = args.shift()\n const observedType = guessType(arg)\n const matchingTypes = demanded.cmd.filter(type => type === observedType || type === '*')\n if (matchingTypes.length === 0) argumentTypeError(observedType, demanded.cmd, position, false)\n position += 1\n })\n\n parsed.optional.forEach((optional) => {\n if (args.length === 0) return\n const arg = args.shift()\n const observedType = guessType(arg)\n const matchingTypes = optional.cmd.filter(type => type === observedType || type === '*')\n if (matchingTypes.length === 0) argumentTypeError(observedType, optional.cmd, position, true)\n position += 1\n })\n } catch (err) {\n console.warn(err.stack)\n }\n}\n\nfunction guessType (arg) {\n if (Array.isArray(arg)) {\n return 'array'\n } else if (arg === null) {\n return 'null'\n }\n return typeof arg\n}\n\nfunction argumentTypeError (observedType, allowedTypes, position, optional) {\n throw new YError(`Invalid ${positionName[position] || 'manyith'} argument. Expected ${allowedTypes.join(' or ')} but received ${observedType}.`)\n}\n", "'use strict'\nconst fs = require('fs')\nconst path = require('path')\n\n// add bash completions to your\n// yargs-powered applications.\nmodule.exports = function completion (yargs, usage, command) {\n const self = {\n completionKey: 'get-yargs-completions'\n }\n\n // get a list of completion commands.\n // 'args' is the array of strings from the line to be completed\n self.getCompletion = function getCompletion (args, done) {\n const completions = []\n const current = args.length ? args[args.length - 1] : ''\n const argv = yargs.parse(args, true)\n const aliases = yargs.parsed.aliases\n\n // a custom completion function can be provided\n // to completion().\n if (completionFunction) {\n if (completionFunction.length < 3) {\n const result = completionFunction(current, argv)\n\n // promise based completion function.\n if (typeof result.then === 'function') {\n return result.then((list) => {\n process.nextTick(() => { done(list) })\n }).catch((err) => {\n process.nextTick(() => { throw err })\n })\n }\n\n // synchronous completion function.\n return done(result)\n } else {\n // asynchronous completion function\n return completionFunction(current, argv, (completions) => {\n done(completions)\n })\n }\n }\n\n const handlers = command.getCommandHandlers()\n for (let i = 0, ii = args.length; i < ii; ++i) {\n if (handlers[args[i]] && handlers[args[i]].builder) {\n const builder = handlers[args[i]].builder\n if (typeof builder === 'function') {\n const y = yargs.reset()\n builder(y)\n return y.argv\n }\n }\n }\n\n if (!current.match(/^-/)) {\n usage.getCommands().forEach((usageCommand) => {\n const commandName = command.parseCommand(usageCommand[0]).cmd\n if (args.indexOf(commandName) === -1) {\n completions.push(commandName)\n }\n })\n }\n\n if (current.match(/^-/)) {\n Object.keys(yargs.getOptions().key).forEach((key) => {\n // If the key and its aliases aren't in 'args', add the key to 'completions'\n const keyAndAliases = [key].concat(aliases[key] || [])\n const notInArgs = keyAndAliases.every(val => args.indexOf(`--${val}`) === -1)\n if (notInArgs) {\n completions.push(`--${key}`)\n }\n })\n }\n\n done(completions)\n }\n\n // generate the completion script to add to your .bashrc.\n self.generateCompletionScript = function generateCompletionScript ($0, cmd) {\n let script = fs.readFileSync(\n path.resolve(__dirname, '../completion.sh.hbs'),\n 'utf-8'\n )\n const name = path.basename($0)\n\n // add ./to applications not yet installed as bin.\n if ($0.match(/\\.js$/)) $0 = `./${$0}`\n\n script = script.replace(/{{app_name}}/g, name)\n script = script.replace(/{{completion_command}}/g, cmd)\n return script.replace(/{{app_path}}/g, $0)\n }\n\n // register a function to perform your own custom\n // completions., this function can be either\n // synchrnous or asynchronous.\n let completionFunction = null\n self.registerFunction = (fn) => {\n completionFunction = fn\n }\n\n return self\n}\n", "'use strict';\n\nmodule.exports = () => {\n\tconst pattern = [\n\t\t'[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:[a-zA-Z\\\\d]*(?:;[a-zA-Z\\\\d]*)*)?\\\\u0007)',\n\t\t'(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PRZcf-ntqry=><~]))'\n\t].join('|');\n\n\treturn new RegExp(pattern, 'g');\n};\n", "'use strict';\nconst ansiRegex = require('ansi-regex');\n\nmodule.exports = input => typeof input === 'string' ? input.replace(ansiRegex(), '') : input;\n", "'use strict';\n/* eslint-disable yoda */\nmodule.exports = x => {\n\tif (Number.isNaN(x)) {\n\t\treturn false;\n\t}\n\n\t// code points are derived from:\n\t// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt\n\tif (\n\t\tx >= 0x1100 && (\n\t\t\tx <= 0x115f || // Hangul Jamo\n\t\t\tx === 0x2329 || // LEFT-POINTING ANGLE BRACKET\n\t\t\tx === 0x232a || // RIGHT-POINTING ANGLE BRACKET\n\t\t\t// CJK Radicals Supplement .. Enclosed CJK Letters and Months\n\t\t\t(0x2e80 <= x && x <= 0x3247 && x !== 0x303f) ||\n\t\t\t// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A\n\t\t\t(0x3250 <= x && x <= 0x4dbf) ||\n\t\t\t// CJK Unified Ideographs .. Yi Radicals\n\t\t\t(0x4e00 <= x && x <= 0xa4c6) ||\n\t\t\t// Hangul Jamo Extended-A\n\t\t\t(0xa960 <= x && x <= 0xa97c) ||\n\t\t\t// Hangul Syllables\n\t\t\t(0xac00 <= x && x <= 0xd7a3) ||\n\t\t\t// CJK Compatibility Ideographs\n\t\t\t(0xf900 <= x && x <= 0xfaff) ||\n\t\t\t// Vertical Forms\n\t\t\t(0xfe10 <= x && x <= 0xfe19) ||\n\t\t\t// CJK Compatibility Forms .. Small Form Variants\n\t\t\t(0xfe30 <= x && x <= 0xfe6b) ||\n\t\t\t// Halfwidth and Fullwidth Forms\n\t\t\t(0xff01 <= x && x <= 0xff60) ||\n\t\t\t(0xffe0 <= x && x <= 0xffe6) ||\n\t\t\t// Kana Supplement\n\t\t\t(0x1b000 <= x && x <= 0x1b001) ||\n\t\t\t// Enclosed Ideographic Supplement\n\t\t\t(0x1f200 <= x && x <= 0x1f251) ||\n\t\t\t// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane\n\t\t\t(0x20000 <= x && x <= 0x3fffd)\n\t\t)\n\t) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n", "'use strict';\nconst stripAnsi = require('strip-ansi');\nconst isFullwidthCodePoint = require('is-fullwidth-code-point');\n\nmodule.exports = str => {\n\tif (typeof str !== 'string' || str.length === 0) {\n\t\treturn 0;\n\t}\n\n\tstr = stripAnsi(str);\n\n\tlet width = 0;\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\tconst code = str.codePointAt(i);\n\n\t\t// Ignore control characters\n\t\tif (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore combining characters\n\t\tif (code >= 0x300 && code <= 0x36F) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Surrogates\n\t\tif (code > 0xFFFF) {\n\t\t\ti++;\n\t\t}\n\n\t\twidth += isFullwidthCodePoint(code) ? 2 : 1;\n\t}\n\n\treturn width;\n};\n", "'use strict'\nmodule.exports = function objFilter (original, filter) {\n const obj = {}\n filter = filter || ((k, v) => true)\n Object.keys(original || {}).forEach((key) => {\n if (filter(key, original[key])) {\n obj[key] = original[key]\n }\n })\n return obj\n}\n", "module.exports = function (blocking) {\n [process.stdout, process.stderr].forEach(function (stream) {\n if (stream._handle && stream.isTTY && typeof stream._handle.setBlocking === 'function') {\n stream._handle.setBlocking(blocking)\n }\n })\n}\n", "'use strict';\n\nmodule.exports = () => {\n\tconst pattern = [\n\t\t'[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:[a-zA-Z\\\\d]*(?:;[a-zA-Z\\\\d]*)*)?\\\\u0007)',\n\t\t'(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PRZcf-ntqry=><~]))'\n\t].join('|');\n\n\treturn new RegExp(pattern, 'g');\n};\n", "'use strict';\nconst ansiRegex = require('ansi-regex');\n\nmodule.exports = input => typeof input === 'string' ? input.replace(ansiRegex(), '') : input;\n", "'use strict';\nconst stripAnsi = require('strip-ansi');\nconst isFullwidthCodePoint = require('is-fullwidth-code-point');\n\nmodule.exports = str => {\n\tif (typeof str !== 'string' || str.length === 0) {\n\t\treturn 0;\n\t}\n\n\tstr = stripAnsi(str);\n\n\tlet width = 0;\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\tconst code = str.codePointAt(i);\n\n\t\t// Ignore control characters\n\t\tif (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore combining characters\n\t\tif (code >= 0x300 && code <= 0x36F) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Surrogates\n\t\tif (code > 0xFFFF) {\n\t\t\ti++;\n\t\t}\n\n\t\twidth += isFullwidthCodePoint(code) ? 2 : 1;\n\t}\n\n\treturn width;\n};\n", "/* eslint-disable babel/new-cap, xo/throw-new-error */\n'use strict';\nmodule.exports = function (str, pos) {\n\tif (str === null || str === undefined) {\n\t\tthrow TypeError();\n\t}\n\n\tstr = String(str);\n\n\tvar size = str.length;\n\tvar i = pos ? Number(pos) : 0;\n\n\tif (Number.isNaN(i)) {\n\t\ti = 0;\n\t}\n\n\tif (i < 0 || i >= size) {\n\t\treturn undefined;\n\t}\n\n\tvar first = str.charCodeAt(i);\n\n\tif (first >= 0xD800 && first <= 0xDBFF && size > i + 1) {\n\t\tvar second = str.charCodeAt(i + 1);\n\n\t\tif (second >= 0xDC00 && second <= 0xDFFF) {\n\t\t\treturn ((first - 0xD800) * 0x400) + second - 0xDC00 + 0x10000;\n\t\t}\n\t}\n\n\treturn first;\n};\n", "'use strict';\nmodule.exports = Number.isNaN || function (x) {\n\treturn x !== x;\n};\n", "'use strict';\nvar numberIsNan = require('number-is-nan');\n\nmodule.exports = function (x) {\n\tif (numberIsNan(x)) {\n\t\treturn false;\n\t}\n\n\t// https://github.com/nodejs/io.js/blob/cff7300a578be1b10001f2d967aaedc88aee6402/lib/readline.js#L1369\n\n\t// code points are derived from:\n\t// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt\n\tif (x >= 0x1100 && (\n\t\tx <= 0x115f || // Hangul Jamo\n\t\t0x2329 === x || // LEFT-POINTING ANGLE BRACKET\n\t\t0x232a === x || // RIGHT-POINTING ANGLE BRACKET\n\t\t// CJK Radicals Supplement .. Enclosed CJK Letters and Months\n\t\t(0x2e80 <= x && x <= 0x3247 && x !== 0x303f) ||\n\t\t// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A\n\t\t0x3250 <= x && x <= 0x4dbf ||\n\t\t// CJK Unified Ideographs .. Yi Radicals\n\t\t0x4e00 <= x && x <= 0xa4c6 ||\n\t\t// Hangul Jamo Extended-A\n\t\t0xa960 <= x && x <= 0xa97c ||\n\t\t// Hangul Syllables\n\t\t0xac00 <= x && x <= 0xd7a3 ||\n\t\t// CJK Compatibility Ideographs\n\t\t0xf900 <= x && x <= 0xfaff ||\n\t\t// Vertical Forms\n\t\t0xfe10 <= x && x <= 0xfe19 ||\n\t\t// CJK Compatibility Forms .. Small Form Variants\n\t\t0xfe30 <= x && x <= 0xfe6b ||\n\t\t// Halfwidth and Fullwidth Forms\n\t\t0xff01 <= x && x <= 0xff60 ||\n\t\t0xffe0 <= x && x <= 0xffe6 ||\n\t\t// Kana Supplement\n\t\t0x1b000 <= x && x <= 0x1b001 ||\n\t\t// Enclosed Ideographic Supplement\n\t\t0x1f200 <= x && x <= 0x1f251 ||\n\t\t// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane\n\t\t0x20000 <= x && x <= 0x3fffd)) {\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n", "'use strict';\nvar stripAnsi = require('strip-ansi');\nvar codePointAt = require('code-point-at');\nvar isFullwidthCodePoint = require('is-fullwidth-code-point');\n\n// https://github.com/nodejs/io.js/blob/cff7300a578be1b10001f2d967aaedc88aee6402/lib/readline.js#L1345\nmodule.exports = function (str) {\n\tif (typeof str !== 'string' || str.length === 0) {\n\t\treturn 0;\n\t}\n\n\tvar width = 0;\n\n\tstr = stripAnsi(str);\n\n\tfor (var i = 0; i < str.length; i++) {\n\t\tvar code = codePointAt(str, i);\n\n\t\t// ignore control characters\n\t\tif (code <= 0x1f || (code >= 0x7f && code <= 0x9f)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// surrogates\n\t\tif (code >= 0x10000) {\n\t\t\ti++;\n\t\t}\n\n\t\tif (isFullwidthCodePoint(code)) {\n\t\t\twidth += 2;\n\t\t} else {\n\t\t\twidth++;\n\t\t}\n\t}\n\n\treturn width;\n};\n", "'use strict';\nvar stringWidth = require('string-width');\nvar stripAnsi = require('strip-ansi');\n\nvar ESCAPES = [\n\t'\\u001b',\n\t'\\u009b'\n];\n\nvar END_CODE = 39;\n\nvar ESCAPE_CODES = {\n\t0: 0,\n\t1: 22,\n\t2: 22,\n\t3: 23,\n\t4: 24,\n\t7: 27,\n\t8: 28,\n\t9: 29,\n\t30: 39,\n\t31: 39,\n\t32: 39,\n\t33: 39,\n\t34: 39,\n\t35: 39,\n\t36: 39,\n\t37: 39,\n\t90: 39,\n\t40: 49,\n\t41: 49,\n\t42: 49,\n\t43: 49,\n\t44: 49,\n\t45: 49,\n\t46: 49,\n\t47: 49\n};\n\nfunction wrapAnsi(code) {\n\treturn ESCAPES[0] + '[' + code + 'm';\n}\n\n// calculate the length of words split on ' ', ignoring\n// the extra characters added by ansi escape codes.\nfunction wordLengths(str) {\n\treturn str.split(' ').map(function (s) {\n\t\treturn stringWidth(s);\n\t});\n}\n\n// wrap a long word across multiple rows.\n// ansi escape codes do not count towards length.\nfunction wrapWord(rows, word, cols) {\n\tvar insideEscape = false;\n\tvar visible = stripAnsi(rows[rows.length - 1]).length;\n\n\tfor (var i = 0; i < word.length; i++) {\n\t\tvar x = word[i];\n\n\t\trows[rows.length - 1] += x;\n\n\t\tif (ESCAPES.indexOf(x) !== -1) {\n\t\t\tinsideEscape = true;\n\t\t} else if (insideEscape && x === 'm') {\n\t\t\tinsideEscape = false;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (insideEscape) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvisible++;\n\n\t\tif (visible >= cols && i < word.length - 1) {\n\t\t\trows.push('');\n\t\t\tvisible = 0;\n\t\t}\n\t}\n\n\t// it's possible that the last row we copy over is only\n\t// ansi escape characters, handle this edge-case.\n\tif (!visible && rows[rows.length - 1].length > 0 && rows.length > 1) {\n\t\trows[rows.length - 2] += rows.pop();\n\t}\n}\n\n// the wrap-ansi module can be invoked\n// in either 'hard' or 'soft' wrap mode.\n//\n// 'hard' will never allow a string to take up more\n// than cols characters.\n//\n// 'soft' allows long words to expand past the column length.\nfunction exec(str, cols, opts) {\n\tvar options = opts || {};\n\n\tvar pre = '';\n\tvar ret = '';\n\tvar escapeCode;\n\n\tvar lengths = wordLengths(str);\n\tvar words = str.split(' ');\n\tvar rows = [''];\n\n\tfor (var i = 0, word; (word = words[i]) !== undefined; i++) {\n\t\tvar rowLength = stringWidth(rows[rows.length - 1]);\n\n\t\tif (rowLength) {\n\t\t\trows[rows.length - 1] += ' ';\n\t\t\trowLength++;\n\t\t}\n\n\t\t// in 'hard' wrap mode, the length of a line is\n\t\t// never allowed to extend past 'cols'.\n\t\tif (lengths[i] > cols && options.hard) {\n\t\t\tif (rowLength) {\n\t\t\t\trows.push('');\n\t\t\t}\n\t\t\twrapWord(rows, word, cols);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (rowLength + lengths[i] > cols && rowLength > 0) {\n\t\t\tif (options.wordWrap === false && rowLength < cols) {\n\t\t\t\twrapWord(rows, word, cols);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\trows.push('');\n\t\t}\n\n\t\trows[rows.length - 1] += word;\n\t}\n\n\tpre = rows.map(function (r) {\n\t\treturn r.trim();\n\t}).join('\\n');\n\n\tfor (var j = 0; j < pre.length; j++) {\n\t\tvar y = pre[j];\n\n\t\tret += y;\n\n\t\tif (ESCAPES.indexOf(y) !== -1) {\n\t\t\tvar code = parseFloat(/[0-9][^m]*/.exec(pre.slice(j, j + 4)));\n\t\t\tescapeCode = code === END_CODE ? null : code;\n\t\t}\n\n\t\tif (escapeCode && ESCAPE_CODES[escapeCode]) {\n\t\t\tif (pre[j + 1] === '\\n') {\n\t\t\t\tret += wrapAnsi(ESCAPE_CODES[escapeCode]);\n\t\t\t} else if (y === '\\n') {\n\t\t\t\tret += wrapAnsi(escapeCode);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn ret;\n}\n\n// for each line break, invoke the method separately.\nmodule.exports = function (str, cols, opts) {\n\treturn String(str).split('\\n').map(function (substr) {\n\t\treturn exec(substr, cols, opts);\n\t}).join('\\n');\n};\n", "var stringWidth = require('string-width')\nvar stripAnsi = require('strip-ansi')\nvar wrap = require('wrap-ansi')\nvar align = {\n right: alignRight,\n center: alignCenter\n}\nvar top = 0\nvar right = 1\nvar bottom = 2\nvar left = 3\n\nfunction UI (opts) {\n this.width = opts.width\n this.wrap = opts.wrap\n this.rows = []\n}\n\nUI.prototype.span = function () {\n var cols = this.div.apply(this, arguments)\n cols.span = true\n}\n\nUI.prototype.resetOutput = function () {\n this.rows = []\n}\n\nUI.prototype.div = function () {\n if (arguments.length === 0) this.div('')\n if (this.wrap && this._shouldApplyLayoutDSL.apply(this, arguments)) {\n return this._applyLayoutDSL(arguments[0])\n }\n\n var cols = []\n\n for (var i = 0, arg; (arg = arguments[i]) !== undefined; i++) {\n if (typeof arg === 'string') cols.push(this._colFromString(arg))\n else cols.push(arg)\n }\n\n this.rows.push(cols)\n return cols\n}\n\nUI.prototype._shouldApplyLayoutDSL = function () {\n return arguments.length === 1 && typeof arguments[0] === 'string' &&\n /[\\t\\n]/.test(arguments[0])\n}\n\nUI.prototype._applyLayoutDSL = function (str) {\n var _this = this\n var rows = str.split('\\n')\n var leftColumnWidth = 0\n\n // simple heuristic for layout, make sure the\n // second column lines up along the left-hand.\n // don't allow the first column to take up more\n // than 50% of the screen.\n rows.forEach(function (row) {\n var columns = row.split('\\t')\n if (columns.length > 1 && stringWidth(columns[0]) > leftColumnWidth) {\n leftColumnWidth = Math.min(\n Math.floor(_this.width * 0.5),\n stringWidth(columns[0])\n )\n }\n })\n\n // generate a table:\n // replacing ' ' with padding calculations.\n // using the algorithmically generated width.\n rows.forEach(function (row) {\n var columns = row.split('\\t')\n _this.div.apply(_this, columns.map(function (r, i) {\n return {\n text: r.trim(),\n padding: _this._measurePadding(r),\n width: (i === 0 && columns.length > 1) ? leftColumnWidth : undefined\n }\n }))\n })\n\n return this.rows[this.rows.length - 1]\n}\n\nUI.prototype._colFromString = function (str) {\n return {\n text: str,\n padding: this._measurePadding(str)\n }\n}\n\nUI.prototype._measurePadding = function (str) {\n // measure padding without ansi escape codes\n var noAnsi = stripAnsi(str)\n return [0, noAnsi.match(/\\s*$/)[0].length, 0, noAnsi.match(/^\\s*/)[0].length]\n}\n\nUI.prototype.toString = function () {\n var _this = this\n var lines = []\n\n _this.rows.forEach(function (row, i) {\n _this.rowToString(row, lines)\n })\n\n // don't display any lines with the\n // hidden flag set.\n lines = lines.filter(function (line) {\n return !line.hidden\n })\n\n return lines.map(function (line) {\n return line.text\n }).join('\\n')\n}\n\nUI.prototype.rowToString = function (row, lines) {\n var _this = this\n var padding\n var rrows = this._rasterize(row)\n var str = ''\n var ts\n var width\n var wrapWidth\n\n rrows.forEach(function (rrow, r) {\n str = ''\n rrow.forEach(function (col, c) {\n ts = '' // temporary string used during alignment/padding.\n width = row[c].width // the width with padding.\n wrapWidth = _this._negatePadding(row[c]) // the width without padding.\n\n ts += col\n\n for (var i = 0; i < wrapWidth - stringWidth(col); i++) {\n ts += ' '\n }\n\n // align the string within its column.\n if (row[c].align && row[c].align !== 'left' && _this.wrap) {\n ts = align[row[c].align](ts, wrapWidth)\n if (stringWidth(ts) < wrapWidth) ts += new Array(width - stringWidth(ts)).join(' ')\n }\n\n // apply border and padding to string.\n padding = row[c].padding || [0, 0, 0, 0]\n if (padding[left]) str += new Array(padding[left] + 1).join(' ')\n str += addBorder(row[c], ts, '| ')\n str += ts\n str += addBorder(row[c], ts, ' |')\n if (padding[right]) str += new Array(padding[right] + 1).join(' ')\n\n // if prior row is span, try to render the\n // current row on the prior line.\n if (r === 0 && lines.length > 0) {\n str = _this._renderInline(str, lines[lines.length - 1])\n }\n })\n\n // remove trailing whitespace.\n lines.push({\n text: str.replace(/ +$/, ''),\n span: row.span\n })\n })\n\n return lines\n}\n\nfunction addBorder (col, ts, style) {\n if (col.border) {\n if (/[.']-+[.']/.test(ts)) return ''\n else if (ts.trim().length) return style\n else return ' '\n }\n return ''\n}\n\n// if the full 'source' can render in\n// the target line, do so.\nUI.prototype._renderInline = function (source, previousLine) {\n var leadingWhitespace = source.match(/^ */)[0].length\n var target = previousLine.text\n var targetTextWidth = stringWidth(target.trimRight())\n\n if (!previousLine.span) return source\n\n // if we're not applying wrapping logic,\n // just always append to the span.\n if (!this.wrap) {\n previousLine.hidden = true\n return target + source\n }\n\n if (leadingWhitespace < targetTextWidth) return source\n\n previousLine.hidden = true\n\n return target.trimRight() + new Array(leadingWhitespace - targetTextWidth + 1).join(' ') + source.trimLeft()\n}\n\nUI.prototype._rasterize = function (row) {\n var _this = this\n var i\n var rrow\n var rrows = []\n var widths = this._columnWidths(row)\n var wrapped\n\n // word wrap all columns, and create\n // a data-structure that is easy to rasterize.\n row.forEach(function (col, c) {\n // leave room for left and right padding.\n col.width = widths[c]\n if (_this.wrap) wrapped = wrap(col.text, _this._negatePadding(col), { hard: true }).split('\\n')\n else wrapped = col.text.split('\\n')\n\n if (col.border) {\n wrapped.unshift('.' + new Array(_this._negatePadding(col) + 3).join('-') + '.')\n wrapped.push(\"'\" + new Array(_this._negatePadding(col) + 3).join('-') + \"'\")\n }\n\n // add top and bottom padding.\n if (col.padding) {\n for (i = 0; i < (col.padding[top] || 0); i++) wrapped.unshift('')\n for (i = 0; i < (col.padding[bottom] || 0); i++) wrapped.push('')\n }\n\n wrapped.forEach(function (str, r) {\n if (!rrows[r]) rrows.push([])\n\n rrow = rrows[r]\n\n for (var i = 0; i < c; i++) {\n if (rrow[i] === undefined) rrow.push('')\n }\n rrow.push(str)\n })\n })\n\n return rrows\n}\n\nUI.prototype._negatePadding = function (col) {\n var wrapWidth = col.width\n if (col.padding) wrapWidth -= (col.padding[left] || 0) + (col.padding[right] || 0)\n if (col.border) wrapWidth -= 4\n return wrapWidth\n}\n\nUI.prototype._columnWidths = function (row) {\n var _this = this\n var widths = []\n var unset = row.length\n var unsetWidth\n var remainingWidth = this.width\n\n // column widths can be set in config.\n row.forEach(function (col, i) {\n if (col.width) {\n unset--\n widths[i] = col.width\n remainingWidth -= col.width\n } else {\n widths[i] = undefined\n }\n })\n\n // any unset widths should be calculated.\n if (unset) unsetWidth = Math.floor(remainingWidth / unset)\n widths.forEach(function (w, i) {\n if (!_this.wrap) widths[i] = row[i].width || stringWidth(row[i].text)\n else if (w === undefined) widths[i] = Math.max(unsetWidth, _minWidth(row[i]))\n })\n\n return widths\n}\n\n// calculates the minimum width of\n// a column, based on padding preferences.\nfunction _minWidth (col) {\n var padding = col.padding || []\n var minWidth = 1 + (padding[left] || 0) + (padding[right] || 0)\n if (col.border) minWidth += 4\n return minWidth\n}\n\nfunction getWindowWidth () {\n if (typeof process === 'object' && process.stdout && process.stdout.columns) return process.stdout.columns\n}\n\nfunction alignRight (str, width) {\n str = str.trim()\n var padding = ''\n var strWidth = stringWidth(str)\n\n if (strWidth < width) {\n padding = new Array(width - strWidth + 1).join(' ')\n }\n\n return padding + str\n}\n\nfunction alignCenter (str, width) {\n str = str.trim()\n var padding = ''\n var strWidth = stringWidth(str.trim())\n\n if (strWidth < width) {\n padding = new Array(parseInt((width - strWidth) / 2, 10) + 1).join(' ')\n }\n\n return padding + str\n}\n\nmodule.exports = function (opts) {\n opts = opts || {}\n\n return new UI({\n width: (opts || {}).width || getWindowWidth() || 80,\n wrap: typeof opts.wrap === 'boolean' ? opts.wrap : true\n })\n}\n", "'use strict';\nmodule.exports = function (str, sep) {\n\tif (typeof str !== 'string') {\n\t\tthrow new TypeError('Expected a string');\n\t}\n\n\tsep = typeof sep === 'undefined' ? '_' : sep;\n\n\treturn str\n\t\t.replace(/([a-z\\d])([A-Z])/g, '$1' + sep + '$2')\n\t\t.replace(/([A-Z]+)([A-Z][a-z\\d]+)/g, '$1' + sep + '$2')\n\t\t.toLowerCase();\n};\n", "'use strict'\n// this file handles outputting usage instructions,\n// failures, etc. keeps logging in one place.\nconst stringWidth = require('string-width')\nconst objFilter = require('./obj-filter')\nconst path = require('path')\nconst setBlocking = require('set-blocking')\nconst YError = require('./yerror')\n\nmodule.exports = function usage (yargs, y18n) {\n const __ = y18n.__\n const self = {}\n\n // methods for ouputting/building failure message.\n const fails = []\n self.failFn = function failFn (f) {\n fails.push(f)\n }\n\n let failMessage = null\n let showHelpOnFail = true\n self.showHelpOnFail = function showHelpOnFailFn (enabled, message) {\n if (typeof enabled === 'string') {\n message = enabled\n enabled = true\n } else if (typeof enabled === 'undefined') {\n enabled = true\n }\n failMessage = message\n showHelpOnFail = enabled\n return self\n }\n\n let failureOutput = false\n self.fail = function fail (msg, err) {\n const logger = yargs._getLoggerInstance()\n\n if (fails.length) {\n for (let i = fails.length - 1; i >= 0; --i) {\n fails[i](msg, err, self)\n }\n } else {\n if (yargs.getExitProcess()) setBlocking(true)\n\n // don't output failure message more than once\n if (!failureOutput) {\n failureOutput = true\n if (showHelpOnFail) yargs.showHelp('error')\n if (msg || err) logger.error(msg || err)\n if (failMessage) {\n if (msg || err) logger.error('')\n logger.error(failMessage)\n }\n }\n\n err = err || new YError(msg)\n if (yargs.getExitProcess()) {\n return yargs.exit(1)\n } else if (yargs._hasParseCallback()) {\n return yargs.exit(1, err)\n } else {\n throw err\n }\n }\n }\n\n // methods for ouputting/building help (usage) message.\n let usages = []\n let usageDisabled = false\n self.usage = (msg, description) => {\n if (msg === null) {\n usageDisabled = true\n usages = []\n return\n }\n usageDisabled = false\n usages.push([msg, description || ''])\n return self\n }\n self.getUsage = () => {\n return usages\n }\n self.getUsageDisabled = () => {\n return usageDisabled\n }\n\n self.getPositionalGroupName = () => {\n return __('Positionals:')\n }\n\n let examples = []\n self.example = (cmd, description) => {\n examples.push([cmd, description || ''])\n }\n\n let commands = []\n self.command = function command (cmd, description, isDefault, aliases) {\n // the last default wins, so cancel out any previously set default\n if (isDefault) {\n commands = commands.map((cmdArray) => {\n cmdArray[2] = false\n return cmdArray\n })\n }\n commands.push([cmd, description || '', isDefault, aliases])\n }\n self.getCommands = () => commands\n\n let descriptions = {}\n self.describe = function describe (key, desc) {\n if (typeof key === 'object') {\n Object.keys(key).forEach((k) => {\n self.describe(k, key[k])\n })\n } else {\n descriptions[key] = desc\n }\n }\n self.getDescriptions = () => descriptions\n\n let epilog\n self.epilog = (msg) => {\n epilog = msg\n }\n\n let wrapSet = false\n let wrap\n self.wrap = (cols) => {\n wrapSet = true\n wrap = cols\n }\n\n function getWrap () {\n if (!wrapSet) {\n wrap = windowWidth()\n wrapSet = true\n }\n\n return wrap\n }\n\n const deferY18nLookupPrefix = '__yargsString__:'\n self.deferY18nLookup = str => deferY18nLookupPrefix + str\n\n const defaultGroup = 'Options:'\n self.help = function help () {\n normalizeAliases()\n\n // handle old demanded API\n const base$0 = path.basename(yargs.$0)\n const demandedOptions = yargs.getDemandedOptions()\n const demandedCommands = yargs.getDemandedCommands()\n const groups = yargs.getGroups()\n const options = yargs.getOptions()\n\n let keys = []\n keys = keys.concat(Object.keys(descriptions))\n keys = keys.concat(Object.keys(demandedOptions))\n keys = keys.concat(Object.keys(demandedCommands))\n keys = keys.concat(Object.keys(options.default))\n keys = keys.filter(key => {\n if (options.hiddenOptions.indexOf(key) < 0) {\n return true\n } else if (yargs.parsed.argv[options.showHiddenOpt]) {\n return true\n }\n })\n keys = Object.keys(keys.reduce((acc, key) => {\n if (key !== '_') acc[key] = true\n return acc\n }, {}))\n\n const theWrap = getWrap()\n const ui = require('cliui')({\n width: theWrap,\n wrap: !!theWrap\n })\n\n // the usage string.\n if (!usageDisabled) {\n if (usages.length) {\n // user-defined usage.\n usages.forEach((usage) => {\n ui.div(`${usage[0].replace(/\\$0/g, base$0)}`)\n if (usage[1]) {\n ui.div({text: `${usage[1]}`, padding: [1, 0, 0, 0]})\n }\n })\n ui.div()\n } else if (commands.length) {\n let u = null\n // demonstrate how commands are used.\n if (demandedCommands._) {\n u = `${base$0} <${__('command')}>\\n`\n } else {\n u = `${base$0} [${__('command')}]\\n`\n }\n ui.div(`${u}`)\n }\n }\n\n // your application's commands, i.e., non-option\n // arguments populated in '_'.\n if (commands.length) {\n ui.div(__('Commands:'))\n\n const context = yargs.getContext()\n const parentCommands = context.commands.length ? `${context.commands.join(' ')} ` : ''\n\n commands.forEach((command) => {\n const commandString = `${base$0} ${parentCommands}${command[0].replace(/^\\$0 ?/, '')}` // drop $0 from default commands.\n ui.span(\n {\n text: commandString,\n padding: [0, 2, 0, 2],\n width: maxWidth(commands, theWrap, `${base$0}${parentCommands}`) + 4\n },\n {text: command[1]}\n )\n const hints = []\n if (command[2]) hints.push(`[${__('default:').slice(0, -1)}]`) // TODO hacking around i18n here\n if (command[3] && command[3].length) {\n hints.push(`[${__('aliases:')} ${command[3].join(', ')}]`)\n }\n if (hints.length) {\n ui.div({text: hints.join(' '), padding: [0, 0, 0, 2], align: 'right'})\n } else {\n ui.div()\n }\n })\n\n ui.div()\n }\n\n // perform some cleanup on the keys array, making it\n // only include top-level keys not their aliases.\n const aliasKeys = (Object.keys(options.alias) || [])\n .concat(Object.keys(yargs.parsed.newAliases) || [])\n\n keys = keys.filter(key => !yargs.parsed.newAliases[key] && aliasKeys.every(alias => (options.alias[alias] || []).indexOf(key) === -1))\n\n // populate 'Options:' group with any keys that have not\n // explicitly had a group set.\n if (!groups[defaultGroup]) groups[defaultGroup] = []\n addUngroupedKeys(keys, options.alias, groups)\n\n // display 'Options:' table along with any custom tables:\n Object.keys(groups).forEach((groupName) => {\n if (!groups[groupName].length) return\n\n ui.div(__(groupName))\n\n // if we've grouped the key 'f', but 'f' aliases 'foobar',\n // normalizedKeys should contain only 'foobar'.\n const normalizedKeys = groups[groupName].map((key) => {\n if (~aliasKeys.indexOf(key)) return key\n for (let i = 0, aliasKey; (aliasKey = aliasKeys[i]) !== undefined; i++) {\n if (~(options.alias[aliasKey] || []).indexOf(key)) return aliasKey\n }\n return key\n })\n\n // actually generate the switches string --foo, -f, --bar.\n const switches = normalizedKeys.reduce((acc, key) => {\n acc[key] = [ key ].concat(options.alias[key] || [])\n .map(sw => {\n // for the special positional group don't\n // add '--' or '-' prefix.\n if (groupName === self.getPositionalGroupName()) return sw\n else return (sw.length > 1 ? '--' : '-') + sw\n })\n .join(', ')\n\n return acc\n }, {})\n\n normalizedKeys.forEach((key) => {\n const kswitch = switches[key]\n let desc = descriptions[key] || ''\n let type = null\n\n if (~desc.lastIndexOf(deferY18nLookupPrefix)) desc = __(desc.substring(deferY18nLookupPrefix.length))\n\n if (~options.boolean.indexOf(key)) type = `[${__('boolean')}]`\n if (~options.count.indexOf(key)) type = `[${__('count')}]`\n if (~options.string.indexOf(key)) type = `[${__('string')}]`\n if (~options.normalize.indexOf(key)) type = `[${__('string')}]`\n if (~options.array.indexOf(key)) type = `[${__('array')}]`\n if (~options.number.indexOf(key)) type = `[${__('number')}]`\n\n const extra = [\n type,\n (key in demandedOptions) ? `[${__('required')}]` : null,\n options.choices && options.choices[key] ? `[${__('choices:')} ${\n self.stringifiedValues(options.choices[key])}]` : null,\n defaultString(options.default[key], options.defaultDescription[key])\n ].filter(Boolean).join(' ')\n\n ui.span(\n {text: kswitch, padding: [0, 2, 0, 2], width: maxWidth(switches, theWrap) + 4},\n desc\n )\n\n if (extra) ui.div({text: extra, padding: [0, 0, 0, 2], align: 'right'})\n else ui.div()\n })\n\n ui.div()\n })\n\n // describe some common use-cases for your application.\n if (examples.length) {\n ui.div(__('Examples:'))\n\n examples.forEach((example) => {\n example[0] = example[0].replace(/\\$0/g, base$0)\n })\n\n examples.forEach((example) => {\n if (example[1] === '') {\n ui.div(\n {\n text: example[0],\n padding: [0, 2, 0, 2]\n }\n )\n } else {\n ui.div(\n {\n text: example[0],\n padding: [0, 2, 0, 2],\n width: maxWidth(examples, theWrap) + 4\n }, {\n text: example[1]\n }\n )\n }\n })\n\n ui.div()\n }\n\n // the usage string.\n if (epilog) {\n const e = epilog.replace(/\\$0/g, base$0)\n ui.div(`${e}\\n`)\n }\n\n return ui.toString()\n }\n\n // return the maximum width of a string\n // in the left-hand column of a table.\n function maxWidth (table, theWrap, modifier) {\n let width = 0\n\n // table might be of the form [leftColumn],\n // or {key: leftColumn}\n if (!Array.isArray(table)) {\n table = Object.keys(table).map(key => [table[key]])\n }\n\n table.forEach((v) => {\n width = Math.max(\n stringWidth(modifier ? `${modifier} ${v[0]}` : v[0]),\n width\n )\n })\n\n // if we've enabled 'wrap' we should limit\n // the max-width of the left-column.\n if (theWrap) width = Math.min(width, parseInt(theWrap * 0.5, 10))\n\n return width\n }\n\n // make sure any options set for aliases,\n // are copied to the keys being aliased.\n function normalizeAliases () {\n // handle old demanded API\n const demandedOptions = yargs.getDemandedOptions()\n const options = yargs.getOptions()\n\n ;(Object.keys(options.alias) || []).forEach((key) => {\n options.alias[key].forEach((alias) => {\n // copy descriptions.\n if (descriptions[alias]) self.describe(key, descriptions[alias])\n // copy demanded.\n if (alias in demandedOptions) yargs.demandOption(key, demandedOptions[alias])\n // type messages.\n if (~options.boolean.indexOf(alias)) yargs.boolean(key)\n if (~options.count.indexOf(alias)) yargs.count(key)\n if (~options.string.indexOf(alias)) yargs.string(key)\n if (~options.normalize.indexOf(alias)) yargs.normalize(key)\n if (~options.array.indexOf(alias)) yargs.array(key)\n if (~options.number.indexOf(alias)) yargs.number(key)\n })\n })\n }\n\n // given a set of keys, place any keys that are\n // ungrouped under the 'Options:' grouping.\n function addUngroupedKeys (keys, aliases, groups) {\n let groupedKeys = []\n let toCheck = null\n Object.keys(groups).forEach((group) => {\n groupedKeys = groupedKeys.concat(groups[group])\n })\n\n keys.forEach((key) => {\n toCheck = [key].concat(aliases[key])\n if (!toCheck.some(k => groupedKeys.indexOf(k) !== -1)) {\n groups[defaultGroup].push(key)\n }\n })\n return groupedKeys\n }\n\n self.showHelp = (level) => {\n const logger = yargs._getLoggerInstance()\n if (!level) level = 'error'\n const emit = typeof level === 'function' ? level : logger[level]\n emit(self.help())\n }\n\n self.functionDescription = (fn) => {\n const description = fn.name ? require('decamelize')(fn.name, '-') : __('generated-value')\n return ['(', description, ')'].join('')\n }\n\n self.stringifiedValues = function stringifiedValues (values, separator) {\n let string = ''\n const sep = separator || ', '\n const array = [].concat(values)\n\n if (!values || !array.length) return string\n\n array.forEach((value) => {\n if (string.length) string += sep\n string += JSON.stringify(value)\n })\n\n return string\n }\n\n // format the default-value-string displayed in\n // the right-hand column.\n function defaultString (value, defaultDescription) {\n let string = `[${__('default:')} `\n\n if (value === undefined && !defaultDescription) return null\n\n if (defaultDescription) {\n string += defaultDescription\n } else {\n switch (typeof value) {\n case 'string':\n string += `\"${value}\"`\n break\n case 'object':\n string += JSON.stringify(value)\n break\n default:\n string += value\n }\n }\n\n return `${string}]`\n }\n\n // guess the width of the console window, max-width 80.\n function windowWidth () {\n const maxWidth = 80\n if (typeof process === 'object' && process.stdout && process.stdout.columns) {\n return Math.min(maxWidth, process.stdout.columns)\n } else {\n return maxWidth\n }\n }\n\n // logic for displaying application version.\n let version = null\n self.version = (ver) => {\n version = ver\n }\n\n self.showVersion = () => {\n const logger = yargs._getLoggerInstance()\n logger.log(version)\n }\n\n self.reset = function reset (localLookup) {\n // do not reset wrap here\n // do not reset fails here\n failMessage = null\n failureOutput = false\n usages = []\n usageDisabled = false\n epilog = undefined\n examples = []\n commands = []\n descriptions = objFilter(descriptions, (k, v) => !localLookup[k])\n return self\n }\n\n let frozen\n self.freeze = function freeze () {\n frozen = {}\n frozen.failMessage = failMessage\n frozen.failureOutput = failureOutput\n frozen.usages = usages\n frozen.usageDisabled = usageDisabled\n frozen.epilog = epilog\n frozen.examples = examples\n frozen.commands = commands\n frozen.descriptions = descriptions\n }\n self.unfreeze = function unfreeze () {\n failMessage = frozen.failMessage\n failureOutput = frozen.failureOutput\n usages = frozen.usages\n usageDisabled = frozen.usageDisabled\n epilog = frozen.epilog\n examples = frozen.examples\n commands = frozen.commands\n descriptions = frozen.descriptions\n frozen = undefined\n }\n\n return self\n}\n", "/*\nCopyright (c) 2011 Andrei Mackenzie\n\nPermission 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:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE 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.\n*/\n\n// levenshtein distance algorithm, pulled from Andrei Mackenzie's MIT licensed.\n// gist, which can be found here: https://gist.github.com/andrei-m/982927\n'use strict'\n// Compute the edit distance between the two given strings\nmodule.exports = function levenshtein (a, b) {\n if (a.length === 0) return b.length\n if (b.length === 0) return a.length\n\n const matrix = []\n\n // increment along the first column of each row\n let i\n for (i = 0; i <= b.length; i++) {\n matrix[i] = [i]\n }\n\n // increment each column in the first row\n let j\n for (j = 0; j <= a.length; j++) {\n matrix[0][j] = j\n }\n\n // Fill in the rest of the matrix\n for (i = 1; i <= b.length; i++) {\n for (j = 1; j <= a.length; j++) {\n if (b.charAt(i - 1) === a.charAt(j - 1)) {\n matrix[i][j] = matrix[i - 1][j - 1]\n } else {\n matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution\n Math.min(matrix[i][j - 1] + 1, // insertion\n matrix[i - 1][j] + 1)) // deletion\n }\n }\n }\n\n return matrix[b.length][a.length]\n}\n", "'use strict'\nconst argsert = require('./argsert')\nconst objFilter = require('./obj-filter')\nconst specialKeys = ['$0', '--', '_']\n\n// validation-type-stuff, missing params,\n// bad implications, custom checks.\nmodule.exports = function validation (yargs, usage, y18n) {\n const __ = y18n.__\n const __n = y18n.__n\n const self = {}\n\n // validate appropriate # of non-option\n // arguments were provided, i.e., '_'.\n self.nonOptionCount = function nonOptionCount (argv) {\n const demandedCommands = yargs.getDemandedCommands()\n // don't count currently executing commands\n const _s = argv._.length - yargs.getContext().commands.length\n\n if (demandedCommands._ && (_s < demandedCommands._.min || _s > demandedCommands._.max)) {\n if (_s < demandedCommands._.min) {\n if (demandedCommands._.minMsg !== undefined) {\n usage.fail(\n // replace $0 with observed, $1 with expected.\n demandedCommands._.minMsg ? demandedCommands._.minMsg.replace(/\\$0/g, _s).replace(/\\$1/, demandedCommands._.min) : null\n )\n } else {\n usage.fail(\n __('Not enough non-option arguments: got %s, need at least %s', _s, demandedCommands._.min)\n )\n }\n } else if (_s > demandedCommands._.max) {\n if (demandedCommands._.maxMsg !== undefined) {\n usage.fail(\n // replace $0 with observed, $1 with expected.\n demandedCommands._.maxMsg ? demandedCommands._.maxMsg.replace(/\\$0/g, _s).replace(/\\$1/, demandedCommands._.max) : null\n )\n } else {\n usage.fail(\n __('Too many non-option arguments: got %s, maximum of %s', _s, demandedCommands._.max)\n )\n }\n }\n }\n }\n\n // validate the appropriate # of <required>\n // positional arguments were provided:\n self.positionalCount = function positionalCount (required, observed) {\n if (observed < required) {\n usage.fail(\n __('Not enough non-option arguments: got %s, need at least %s', observed, required)\n )\n }\n }\n\n // make sure all the required arguments are present.\n self.requiredArguments = function requiredArguments (argv) {\n const demandedOptions = yargs.getDemandedOptions()\n let missing = null\n\n Object.keys(demandedOptions).forEach((key) => {\n if (!argv.hasOwnProperty(key) || typeof argv[key] === 'undefined') {\n missing = missing || {}\n missing[key] = demandedOptions[key]\n }\n })\n\n if (missing) {\n const customMsgs = []\n Object.keys(missing).forEach((key) => {\n const msg = missing[key]\n if (msg && customMsgs.indexOf(msg) < 0) {\n customMsgs.push(msg)\n }\n })\n\n const customMsg = customMsgs.length ? `\\n${customMsgs.join('\\n')}` : ''\n\n usage.fail(__n(\n 'Missing required argument: %s',\n 'Missing required arguments: %s',\n Object.keys(missing).length,\n Object.keys(missing).join(', ') + customMsg\n ))\n }\n }\n\n // check for unknown arguments (strict-mode).\n self.unknownArguments = function unknownArguments (argv, aliases, positionalMap) {\n const commandKeys = yargs.getCommandInstance().getCommands()\n const unknown = []\n const currentContext = yargs.getContext()\n\n Object.keys(argv).forEach((key) => {\n if (specialKeys.indexOf(key) === -1 &&\n !positionalMap.hasOwnProperty(key) &&\n !yargs._getParseContext().hasOwnProperty(key) &&\n !aliases.hasOwnProperty(key)\n ) {\n unknown.push(key)\n }\n })\n\n if (commandKeys.length > 0) {\n argv._.slice(currentContext.commands.length).forEach((key) => {\n if (commandKeys.indexOf(key) === -1) {\n unknown.push(key)\n }\n })\n }\n\n if (unknown.length > 0) {\n usage.fail(__n(\n 'Unknown argument: %s',\n 'Unknown arguments: %s',\n unknown.length,\n unknown.join(', ')\n ))\n }\n }\n\n // validate arguments limited to enumerated choices\n self.limitedChoices = function limitedChoices (argv) {\n const options = yargs.getOptions()\n const invalid = {}\n\n if (!Object.keys(options.choices).length) return\n\n Object.keys(argv).forEach((key) => {\n if (specialKeys.indexOf(key) === -1 &&\n options.choices.hasOwnProperty(key)) {\n [].concat(argv[key]).forEach((value) => {\n // TODO case-insensitive configurability\n if (options.choices[key].indexOf(value) === -1 &&\n value !== undefined) {\n invalid[key] = (invalid[key] || []).concat(value)\n }\n })\n }\n })\n\n const invalidKeys = Object.keys(invalid)\n\n if (!invalidKeys.length) return\n\n let msg = __('Invalid values:')\n invalidKeys.forEach((key) => {\n msg += `\\n ${__(\n 'Argument: %s, Given: %s, Choices: %s',\n key,\n usage.stringifiedValues(invalid[key]),\n usage.stringifiedValues(options.choices[key])\n )}`\n })\n usage.fail(msg)\n }\n\n // custom checks, added using the `check` option on yargs.\n let checks = []\n self.check = function check (f, global) {\n checks.push({\n func: f,\n global\n })\n }\n\n self.customChecks = function customChecks (argv, aliases) {\n for (let i = 0, f; (f = checks[i]) !== undefined; i++) {\n const func = f.func\n let result = null\n try {\n result = func(argv, aliases)\n } catch (err) {\n usage.fail(err.message ? err.message : err, err)\n continue\n }\n\n if (!result) {\n usage.fail(__('Argument check failed: %s', func.toString()))\n } else if (typeof result === 'string' || result instanceof Error) {\n usage.fail(result.toString(), result)\n }\n }\n }\n\n // check implications, argument foo implies => argument bar.\n let implied = {}\n self.implies = function implies (key, value) {\n argsert('<string|object> [array|number|string]', [key, value], arguments.length)\n\n if (typeof key === 'object') {\n Object.keys(key).forEach((k) => {\n self.implies(k, key[k])\n })\n } else {\n yargs.global(key)\n if (!implied[key]) {\n implied[key] = []\n }\n if (Array.isArray(value)) {\n value.forEach((i) => self.implies(key, i))\n } else {\n implied[key].push(value)\n }\n }\n }\n self.getImplied = function getImplied () {\n return implied\n }\n\n self.implications = function implications (argv) {\n const implyFail = []\n\n Object.keys(implied).forEach((key) => {\n const origKey = key\n ;(implied[key] || []).forEach((value) => {\n let num\n let key = origKey\n const origValue = value\n\n // convert string '1' to number 1\n num = Number(key)\n key = isNaN(num) ? key : num\n\n if (typeof key === 'number') {\n // check length of argv._\n key = argv._.length >= key\n } else if (key.match(/^--no-.+/)) {\n // check if key doesn't exist\n key = key.match(/^--no-(.+)/)[1]\n key = !argv[key]\n } else {\n // check if key exists\n key = argv[key]\n }\n\n num = Number(value)\n value = isNaN(num) ? value : num\n\n if (typeof value === 'number') {\n value = argv._.length >= value\n } else if (value.match(/^--no-.+/)) {\n value = value.match(/^--no-(.+)/)[1]\n value = !argv[value]\n } else {\n value = argv[value]\n }\n if (key && !value) {\n implyFail.push(` ${origKey} -> ${origValue}`)\n }\n })\n })\n\n if (implyFail.length) {\n let msg = `${__('Implications failed:')}\\n`\n\n implyFail.forEach((value) => {\n msg += (value)\n })\n\n usage.fail(msg)\n }\n }\n\n let conflicting = {}\n self.conflicts = function conflicts (key, value) {\n argsert('<string|object> [array|string]', [key, value], arguments.length)\n\n if (typeof key === 'object') {\n Object.keys(key).forEach((k) => {\n self.conflicts(k, key[k])\n })\n } else {\n yargs.global(key)\n if (!conflicting[key]) {\n conflicting[key] = []\n }\n if (Array.isArray(value)) {\n value.forEach((i) => self.conflicts(key, i))\n } else {\n conflicting[key].push(value)\n }\n }\n }\n self.getConflicting = () => conflicting\n\n self.conflicting = function conflictingFn (argv) {\n Object.keys(argv).forEach((key) => {\n if (conflicting[key]) {\n conflicting[key].forEach((value) => {\n // we default keys to 'undefined' that have been configured, we should not\n // apply conflicting check unless they are a value other than 'undefined'.\n if (value && argv[key] !== undefined && argv[value] !== undefined) {\n usage.fail(__(`Arguments ${key} and ${value} are mutually exclusive`))\n }\n })\n }\n })\n }\n\n self.recommendCommands = function recommendCommands (cmd, potentialCommands) {\n const distance = require('./levenshtein')\n const threshold = 3 // if it takes more than three edits, let's move on.\n potentialCommands = potentialCommands.sort((a, b) => b.length - a.length)\n\n let recommended = null\n let bestDistance = Infinity\n for (let i = 0, candidate; (candidate = potentialCommands[i]) !== undefined; i++) {\n const d = distance(cmd, candidate)\n if (d <= threshold && d < bestDistance) {\n bestDistance = d\n recommended = candidate\n }\n }\n if (recommended) usage.fail(__('Did you mean %s?', recommended))\n }\n\n self.reset = function reset (localLookup) {\n implied = objFilter(implied, (k, v) => !localLookup[k])\n conflicting = objFilter(conflicting, (k, v) => !localLookup[k])\n checks = checks.filter(c => c.global)\n return self\n }\n\n let frozen\n self.freeze = function freeze () {\n frozen = {}\n frozen.implied = implied\n frozen.checks = checks\n frozen.conflicting = conflicting\n }\n self.unfreeze = function unfreeze () {\n implied = frozen.implied\n checks = frozen.checks\n conflicting = frozen.conflicting\n frozen = undefined\n }\n\n return self\n}\n", "var fs = require('fs')\nvar path = require('path')\nvar util = require('util')\n\nfunction Y18N (opts) {\n // configurable options.\n opts = opts || {}\n this.directory = opts.directory || './locales'\n this.updateFiles = typeof opts.updateFiles === 'boolean' ? opts.updateFiles : true\n this.locale = opts.locale || 'en'\n this.fallbackToLanguage = typeof opts.fallbackToLanguage === 'boolean' ? opts.fallbackToLanguage : true\n\n // internal stuff.\n this.cache = Object.create(null)\n this.writeQueue = []\n}\n\nY18N.prototype.__ = function () {\n var args = Array.prototype.slice.call(arguments)\n var str = args.shift()\n var cb = function () {} // start with noop.\n\n if (typeof args[args.length - 1] === 'function') cb = args.pop()\n cb = cb || function () {} // noop.\n\n if (!this.cache[this.locale]) this._readLocaleFile()\n\n // we've observed a new string, update the language file.\n if (!this.cache[this.locale][str] && this.updateFiles) {\n this.cache[this.locale][str] = str\n\n // include the current directory and locale,\n // since these values could change before the\n // write is performed.\n this._enqueueWrite([this.directory, this.locale, cb])\n } else {\n cb()\n }\n\n return util.format.apply(util, [this.cache[this.locale][str] || str].concat(args))\n}\n\nY18N.prototype._enqueueWrite = function (work) {\n this.writeQueue.push(work)\n if (this.writeQueue.length === 1) this._processWriteQueue()\n}\n\nY18N.prototype._processWriteQueue = function () {\n var _this = this\n var work = this.writeQueue[0]\n\n // destructure the enqueued work.\n var directory = work[0]\n var locale = work[1]\n var cb = work[2]\n\n var languageFile = this._resolveLocaleFile(directory, locale)\n var serializedLocale = JSON.stringify(this.cache[locale], null, 2)\n\n fs.writeFile(languageFile, serializedLocale, 'utf-8', function (err) {\n _this.writeQueue.shift()\n if (_this.writeQueue.length > 0) _this._processWriteQueue()\n cb(err)\n })\n}\n\nY18N.prototype._readLocaleFile = function () {\n var localeLookup = {}\n var languageFile = this._resolveLocaleFile(this.directory, this.locale)\n\n try {\n localeLookup = JSON.parse(fs.readFileSync(languageFile, 'utf-8'))\n } catch (err) {\n if (err instanceof SyntaxError) {\n err.message = 'syntax error in ' + languageFile\n }\n\n if (err.code === 'ENOENT') localeLookup = {}\n else throw err\n }\n\n this.cache[this.locale] = localeLookup\n}\n\nY18N.prototype._resolveLocaleFile = function (directory, locale) {\n var file = path.resolve(directory, './', locale + '.json')\n if (this.fallbackToLanguage && !this._fileExistsSync(file) && ~locale.lastIndexOf('_')) {\n // attempt fallback to language only\n var languageFile = path.resolve(directory, './', locale.split('_')[0] + '.json')\n if (this._fileExistsSync(languageFile)) file = languageFile\n }\n return file\n}\n\n// this only exists because fs.existsSync() \"will be deprecated\"\n// see https://nodejs.org/api/fs.html#fs_fs_existssync_path\nY18N.prototype._fileExistsSync = function (file) {\n try {\n return fs.statSync(file).isFile()\n } catch (err) {\n return false\n }\n}\n\nY18N.prototype.__n = function () {\n var args = Array.prototype.slice.call(arguments)\n var singular = args.shift()\n var plural = args.shift()\n var quantity = args.shift()\n\n var cb = function () {} // start with noop.\n if (typeof args[args.length - 1] === 'function') cb = args.pop()\n\n if (!this.cache[this.locale]) this._readLocaleFile()\n\n var str = quantity === 1 ? singular : plural\n if (this.cache[this.locale][singular]) {\n str = this.cache[this.locale][singular][quantity === 1 ? 'one' : 'other']\n }\n\n // we've observed a new string, update the language file.\n if (!this.cache[this.locale][singular] && this.updateFiles) {\n this.cache[this.locale][singular] = {\n one: singular,\n other: plural\n }\n\n // include the current directory and locale,\n // since these values could change before the\n // write is performed.\n this._enqueueWrite([this.directory, this.locale, cb])\n } else {\n cb()\n }\n\n // if a %d placeholder is provided, add quantity\n // to the arguments expanded by util.format.\n var values = [str]\n if (~str.indexOf('%d')) values.push(quantity)\n\n return util.format.apply(util, values.concat(args))\n}\n\nY18N.prototype.setLocale = function (locale) {\n this.locale = locale\n}\n\nY18N.prototype.getLocale = function () {\n return this.locale\n}\n\nY18N.prototype.updateLocale = function (obj) {\n if (!this.cache[this.locale]) this._readLocaleFile()\n\n for (var key in obj) {\n this.cache[this.locale][key] = obj[key]\n }\n}\n\nmodule.exports = function (opts) {\n var y18n = new Y18N(opts)\n\n // bind all functions to y18n, so that\n // they can be used in isolation.\n for (var key in y18n) {\n if (typeof y18n[key] === 'function') {\n y18n[key] = y18n[key].bind(y18n)\n }\n }\n\n return y18n\n}\n", "\n'use strict'\nconst fs = require('fs')\nconst path = require('path')\nconst YError = require('./yerror')\n\nlet previouslyVisitedConfigs = []\n\nfunction checkForCircularExtends (cfgPath) {\n if (previouslyVisitedConfigs.indexOf(cfgPath) > -1) {\n throw new YError(`Circular extended configurations: '${cfgPath}'.`)\n }\n}\n\nfunction getPathToDefaultConfig (cwd, pathToExtend) {\n return path.resolve(cwd, pathToExtend)\n}\n\nfunction applyExtends (config, cwd) {\n let defaultConfig = {}\n\n if (config.hasOwnProperty('extends')) {\n if (typeof config.extends !== 'string') return defaultConfig\n const isPath = /\\.json|\\..*rc$/.test(config.extends)\n let pathToDefault = null\n if (!isPath) {\n try {\n pathToDefault = require.resolve(config.extends)\n } catch (err) {\n // most likely this simply isn't a module.\n }\n } else {\n pathToDefault = getPathToDefaultConfig(cwd, config.extends)\n }\n // maybe the module uses key for some other reason,\n // err on side of caution.\n if (!pathToDefault && !isPath) return config\n\n checkForCircularExtends(pathToDefault)\n\n previouslyVisitedConfigs.push(pathToDefault)\n\n defaultConfig = isPath ? JSON.parse(fs.readFileSync(pathToDefault, 'utf8')) : require(config.extends)\n delete config.extends\n defaultConfig = applyExtends(defaultConfig, path.dirname(pathToDefault))\n }\n\n previouslyVisitedConfigs = []\n\n return Object.assign({}, defaultConfig, config)\n}\n\nmodule.exports = applyExtends\n", "'use strict';\n\n// Call this function in a another function to find out the file from\n// which that function was called from. (Inspects the v8 stack trace)\n//\n// Inspired by http://stackoverflow.com/questions/13227489\n\nmodule.exports = function getCallerFile(_position) {\n var oldPrepareStackTrace = Error.prepareStackTrace;\n Error.prepareStackTrace = function(err, stack) { return stack; };\n var stack = new Error().stack;\n Error.prepareStackTrace = oldPrepareStackTrace;\n\n var position = _position ? _position : 2;\n\n // stack[0] holds this file\n // stack[1] holds where this function was called\n // stack[2] holds the file we're interested in\n return stack[position] ? stack[position].getFileName() : undefined;\n};\n", "'use strict';\nconst fs = require('fs');\n\nmodule.exports = fp => new Promise(resolve => {\n\tfs.access(fp, err => {\n\t\tresolve(!err);\n\t});\n});\n\nmodule.exports.sync = fp => {\n\ttry {\n\t\tfs.accessSync(fp);\n\t\treturn true;\n\t} catch (err) {\n\t\treturn false;\n\t}\n};\n", "'use strict';\nmodule.exports = cb => new Promise(resolve => {\n\tresolve(cb());\n});\n", "'use strict';\nconst pTry = require('p-try');\n\nmodule.exports = concurrency => {\n\tif (concurrency < 1) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n\n\tconst queue = [];\n\tlet activeCount = 0;\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tif (queue.length > 0) {\n\t\t\tqueue.shift()();\n\t\t}\n\t};\n\n\treturn fn => new Promise((resolve, reject) => {\n\t\tconst run = () => {\n\t\t\tactiveCount++;\n\n\t\t\tpTry(fn).then(\n\t\t\t\tval => {\n\t\t\t\t\tresolve(val);\n\t\t\t\t\tnext();\n\t\t\t\t},\n\t\t\t\terr => {\n\t\t\t\t\treject(err);\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t);\n\t\t};\n\n\t\tif (activeCount < concurrency) {\n\t\t\trun();\n\t\t} else {\n\t\t\tqueue.push(run);\n\t\t}\n\t});\n};\n", "'use strict';\nconst pLimit = require('p-limit');\n\nclass EndError extends Error {\n\tconstructor(value) {\n\t\tsuper();\n\t\tthis.value = value;\n\t}\n}\n\n// the input can also be a promise, so we `Promise.all()` them both\nconst finder = el => Promise.all(el).then(val => val[1] === true && Promise.reject(new EndError(val[0])));\n\nmodule.exports = (iterable, tester, opts) => {\n\topts = Object.assign({\n\t\tconcurrency: Infinity,\n\t\tpreserveOrder: true\n\t}, opts);\n\n\tconst limit = pLimit(opts.concurrency);\n\n\t// start all the promises concurrently with optional limit\n\tconst items = Array.from(iterable).map(el => [el, limit(() => Promise.resolve(el).then(tester))]);\n\n\t// check the promises either serially or concurrently\n\tconst checkLimit = pLimit(opts.preserveOrder ? 1 : Infinity);\n\n\treturn Promise.all(items.map(el => checkLimit(() => finder(el))))\n\t\t.then(() => {})\n\t\t.catch(err => err instanceof EndError ? err.value : Promise.reject(err));\n};\n", "'use strict';\nconst path = require('path');\nconst pathExists = require('path-exists');\nconst pLocate = require('p-locate');\n\nmodule.exports = (iterable, opts) => {\n\topts = Object.assign({\n\t\tcwd: process.cwd()\n\t}, opts);\n\n\treturn pLocate(iterable, el => pathExists(path.resolve(opts.cwd, el)), opts);\n};\n\nmodule.exports.sync = (iterable, opts) => {\n\topts = Object.assign({\n\t\tcwd: process.cwd()\n\t}, opts);\n\n\tfor (const el of iterable) {\n\t\tif (pathExists.sync(path.resolve(opts.cwd, el))) {\n\t\t\treturn el;\n\t\t}\n\t}\n};\n", "'use strict';\nconst path = require('path');\nconst locatePath = require('locate-path');\n\nmodule.exports = (filename, opts) => {\n\topts = opts || {};\n\n\tconst startDir = path.resolve(opts.cwd || '');\n\tconst root = path.parse(startDir).root;\n\n\tconst filenames = [].concat(filename);\n\n\treturn new Promise(resolve => {\n\t\t(function find(dir) {\n\t\t\tlocatePath(filenames, {cwd: dir}).then(file => {\n\t\t\t\tif (file) {\n\t\t\t\t\tresolve(path.join(dir, file));\n\t\t\t\t} else if (dir === root) {\n\t\t\t\t\tresolve(null);\n\t\t\t\t} else {\n\t\t\t\t\tfind(path.dirname(dir));\n\t\t\t\t}\n\t\t\t});\n\t\t})(startDir);\n\t});\n};\n\nmodule.exports.sync = (filename, opts) => {\n\topts = opts || {};\n\n\tlet dir = path.resolve(opts.cwd || '');\n\tconst root = path.parse(dir).root;\n\n\tconst filenames = [].concat(filename);\n\n\t// eslint-disable-next-line no-constant-condition\n\twhile (true) {\n\t\tconst file = locatePath.sync(filenames, {cwd: dir});\n\n\t\tif (file) {\n\t\t\treturn path.join(dir, file);\n\t\t} else if (dir === root) {\n\t\t\treturn null;\n\t\t}\n\n\t\tdir = path.dirname(dir);\n\t}\n};\n", "module.exports = function (_require) {\n _require = _require || require\n var main = _require.main\n if (main && isIISNode(main)) return handleIISNode(main)\n else return main ? main.filename : process.cwd()\n}\n\nfunction isIISNode (main) {\n return /\\\\iisnode\\\\/.test(main.filename)\n}\n\nfunction handleIISNode (main) {\n if (!main.children.length) {\n return main.filename\n } else {\n return main.children[0].filename\n }\n}\n", "module.exports = isexe\nisexe.sync = sync\n\nvar fs = require('fs')\n\nfunction checkPathExt (path, options) {\n var pathext = options.pathExt !== undefined ?\n options.pathExt : process.env.PATHEXT\n\n if (!pathext) {\n return true\n }\n\n pathext = pathext.split(';')\n if (pathext.indexOf('') !== -1) {\n return true\n }\n for (var i = 0; i < pathext.length; i++) {\n var p = pathext[i].toLowerCase()\n if (p && path.substr(-p.length).toLowerCase() === p) {\n return true\n }\n }\n return false\n}\n\nfunction checkStat (stat, path, options) {\n if (!stat.isSymbolicLink() && !stat.isFile()) {\n return false\n }\n return checkPathExt(path, options)\n}\n\nfunction isexe (path, options, cb) {\n fs.stat(path, function (er, stat) {\n cb(er, er ? false : checkStat(stat, path, options))\n })\n}\n\nfunction sync (path, options) {\n return checkStat(fs.statSync(path), path, options)\n}\n", "module.exports = isexe\nisexe.sync = sync\n\nvar fs = require('fs')\n\nfunction isexe (path, options, cb) {\n fs.stat(path, function (er, stat) {\n cb(er, er ? false : checkStat(stat, options))\n })\n}\n\nfunction sync (path, options) {\n return checkStat(fs.statSync(path), options)\n}\n\nfunction checkStat (stat, options) {\n return stat.isFile() && checkMode(stat, options)\n}\n\nfunction checkMode (stat, options) {\n var mod = stat.mode\n var uid = stat.uid\n var gid = stat.gid\n\n var myUid = options.uid !== undefined ?\n options.uid : process.getuid && process.getuid()\n var myGid = options.gid !== undefined ?\n options.gid : process.getgid && process.getgid()\n\n var u = parseInt('100', 8)\n var g = parseInt('010', 8)\n var o = parseInt('001', 8)\n var ug = u | g\n\n var ret = (mod & o) ||\n (mod & g) && gid === myGid ||\n (mod & u) && uid === myUid ||\n (mod & ug) && myUid === 0\n\n return ret\n}\n", "var fs = require('fs')\nvar core\nif (process.platform === 'win32' || global.TESTING_WINDOWS) {\n core = require('./windows.js')\n} else {\n core = require('./mode.js')\n}\n\nmodule.exports = isexe\nisexe.sync = sync\n\nfunction isexe (path, options, cb) {\n if (typeof options === 'function') {\n cb = options\n options = {}\n }\n\n if (!cb) {\n if (typeof Promise !== 'function') {\n throw new TypeError('callback not provided')\n }\n\n return new Promise(function (resolve, reject) {\n isexe(path, options || {}, function (er, is) {\n if (er) {\n reject(er)\n } else {\n resolve(is)\n }\n })\n })\n }\n\n core(path, options || {}, function (er, is) {\n // ignore EACCES because that just means we aren't allowed to run it\n if (er) {\n if (er.code === 'EACCES' || options && options.ignoreErrors) {\n er = null\n is = false\n }\n }\n cb(er, is)\n })\n}\n\nfunction sync (path, options) {\n // my kingdom for a filtered catch\n try {\n return core.sync(path, options || {})\n } catch (er) {\n if (options && options.ignoreErrors || er.code === 'EACCES') {\n return false\n } else {\n throw er\n }\n }\n}\n", "module.exports = which\nwhich.sync = whichSync\n\nvar isWindows = process.platform === 'win32' ||\n process.env.OSTYPE === 'cygwin' ||\n process.env.OSTYPE === 'msys'\n\nvar path = require('path')\nvar COLON = isWindows ? ';' : ':'\nvar isexe = require('isexe')\n\nfunction getNotFoundError (cmd) {\n var er = new Error('not found: ' + cmd)\n er.code = 'ENOENT'\n\n return er\n}\n\nfunction getPathInfo (cmd, opt) {\n var colon = opt.colon || COLON\n var pathEnv = opt.path || process.env.PATH || ''\n var pathExt = ['']\n\n pathEnv = pathEnv.split(colon)\n\n var pathExtExe = ''\n if (isWindows) {\n pathEnv.unshift(process.cwd())\n pathExtExe = (opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM')\n pathExt = pathExtExe.split(colon)\n\n\n // Always test the cmd itself first. isexe will check to make sure\n // it's found in the pathExt set.\n if (cmd.indexOf('.') !== -1 && pathExt[0] !== '')\n pathExt.unshift('')\n }\n\n // If it has a slash, then we don't bother searching the pathenv.\n // just check the file itself, and that's it.\n if (cmd.match(/\\//) || isWindows && cmd.match(/\\\\/))\n pathEnv = ['']\n\n return {\n env: pathEnv,\n ext: pathExt,\n extExe: pathExtExe\n }\n}\n\nfunction which (cmd, opt, cb) {\n if (typeof opt === 'function') {\n cb = opt\n opt = {}\n }\n\n var info = getPathInfo(cmd, opt)\n var pathEnv = info.env\n var pathExt = info.ext\n var pathExtExe = info.extExe\n var found = []\n\n ;(function F (i, l) {\n if (i === l) {\n if (opt.all && found.length)\n return cb(null, found)\n else\n return cb(getNotFoundError(cmd))\n }\n\n var pathPart = pathEnv[i]\n if (pathPart.charAt(0) === '\"' && pathPart.slice(-1) === '\"')\n pathPart = pathPart.slice(1, -1)\n\n var p = path.join(pathPart, cmd)\n if (!pathPart && (/^\\.[\\\\\\/]/).test(cmd)) {\n p = cmd.slice(0, 2) + p\n }\n ;(function E (ii, ll) {\n if (ii === ll) return F(i + 1, l)\n var ext = pathExt[ii]\n isexe(p + ext, { pathExt: pathExtExe }, function (er, is) {\n if (!er && is) {\n if (opt.all)\n found.push(p + ext)\n else\n return cb(null, p + ext)\n }\n return E(ii + 1, ll)\n })\n })(0, pathExt.length)\n })(0, pathEnv.length)\n}\n\nfunction whichSync (cmd, opt) {\n opt = opt || {}\n\n var info = getPathInfo(cmd, opt)\n var pathEnv = info.env\n var pathExt = info.ext\n var pathExtExe = info.extExe\n var found = []\n\n for (var i = 0, l = pathEnv.length; i < l; i ++) {\n var pathPart = pathEnv[i]\n if (pathPart.charAt(0) === '\"' && pathPart.slice(-1) === '\"')\n pathPart = pathPart.slice(1, -1)\n\n var p = path.join(pathPart, cmd)\n if (!pathPart && /^\\.[\\\\\\/]/.test(cmd)) {\n p = cmd.slice(0, 2) + p\n }\n for (var j = 0, ll = pathExt.length; j < ll; j ++) {\n var cur = p + pathExt[j]\n var is\n try {\n is = isexe.sync(cur, { pathExt: pathExtExe })\n if (is) {\n if (opt.all)\n found.push(cur)\n else\n return cur\n }\n } catch (ex) {}\n }\n }\n\n if (opt.all && found.length)\n return found\n\n if (opt.nothrow)\n return null\n\n throw getNotFoundError(cmd)\n}\n", "var hasOwnProperty = Object.prototype.hasOwnProperty\n\nmodule.exports = PseudoMap\n\nfunction PseudoMap (set) {\n if (!(this instanceof PseudoMap)) // whyyyyyyy\n throw new TypeError(\"Constructor PseudoMap requires 'new'\")\n\n this.clear()\n\n if (set) {\n if ((set instanceof PseudoMap) ||\n (typeof Map === 'function' && set instanceof Map))\n set.forEach(function (value, key) {\n this.set(key, value)\n }, this)\n else if (Array.isArray(set))\n set.forEach(function (kv) {\n this.set(kv[0], kv[1])\n }, this)\n else\n throw new TypeError('invalid argument')\n }\n}\n\nPseudoMap.prototype.forEach = function (fn, thisp) {\n thisp = thisp || this\n Object.keys(this._data).forEach(function (k) {\n if (k !== 'size')\n fn.call(thisp, this._data[k].value, this._data[k].key)\n }, this)\n}\n\nPseudoMap.prototype.has = function (k) {\n return !!find(this._data, k)\n}\n\nPseudoMap.prototype.get = function (k) {\n var res = find(this._data, k)\n return res && res.value\n}\n\nPseudoMap.prototype.set = function (k, v) {\n set(this._data, k, v)\n}\n\nPseudoMap.prototype.delete = function (k) {\n var res = find(this._data, k)\n if (res) {\n delete this._data[res._index]\n this._data.size--\n }\n}\n\nPseudoMap.prototype.clear = function () {\n var data = Object.create(null)\n data.size = 0\n\n Object.defineProperty(this, '_data', {\n value: data,\n enumerable: false,\n configurable: true,\n writable: false\n })\n}\n\nObject.defineProperty(PseudoMap.prototype, 'size', {\n get: function () {\n return this._data.size\n },\n set: function (n) {},\n enumerable: true,\n configurable: true\n})\n\nPseudoMap.prototype.values =\nPseudoMap.prototype.keys =\nPseudoMap.prototype.entries = function () {\n throw new Error('iterators are not implemented in this version')\n}\n\n// Either identical, or both NaN\nfunction same (a, b) {\n return a === b || a !== a && b !== b\n}\n\nfunction Entry (k, v, i) {\n this.key = k\n this.value = v\n this._index = i\n}\n\nfunction find (data, k) {\n for (var i = 0, s = '_' + k, key = s;\n hasOwnProperty.call(data, key);\n key = s + i++) {\n if (same(data[key].key, k))\n return data[key]\n }\n}\n\nfunction set (data, k, v) {\n for (var i = 0, s = '_' + k, key = s;\n hasOwnProperty.call(data, key);\n key = s + i++) {\n if (same(data[key].key, k)) {\n data[key].value = v\n return\n }\n }\n data.size++\n data[key] = new Entry(k, v, key)\n}\n", "if (process.env.npm_package_name === 'pseudomap' &&\n process.env.npm_lifecycle_script === 'test')\n process.env.TEST_PSEUDOMAP = 'true'\n\nif (typeof Map === 'function' && !process.env.TEST_PSEUDOMAP) {\n module.exports = Map\n} else {\n module.exports = require('./pseudomap')\n}\n", "module.exports = Yallist\n\nYallist.Node = Node\nYallist.create = Yallist\n\nfunction Yallist (list) {\n var self = this\n if (!(self instanceof Yallist)) {\n self = new Yallist()\n }\n\n self.tail = null\n self.head = null\n self.length = 0\n\n if (list && typeof list.forEach === 'function') {\n list.forEach(function (item) {\n self.push(item)\n })\n } else if (arguments.length > 0) {\n for (var i = 0, l = arguments.length; i < l; i++) {\n self.push(arguments[i])\n }\n }\n\n return self\n}\n\nYallist.prototype.removeNode = function (node) {\n if (node.list !== this) {\n throw new Error('removing node which does not belong to this list')\n }\n\n var next = node.next\n var prev = node.prev\n\n if (next) {\n next.prev = prev\n }\n\n if (prev) {\n prev.next = next\n }\n\n if (node === this.head) {\n this.head = next\n }\n if (node === this.tail) {\n this.tail = prev\n }\n\n node.list.length--\n node.next = null\n node.prev = null\n node.list = null\n}\n\nYallist.prototype.unshiftNode = function (node) {\n if (node === this.head) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n var head = this.head\n node.list = this\n node.next = head\n if (head) {\n head.prev = node\n }\n\n this.head = node\n if (!this.tail) {\n this.tail = node\n }\n this.length++\n}\n\nYallist.prototype.pushNode = function (node) {\n if (node === this.tail) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n var tail = this.tail\n node.list = this\n node.prev = tail\n if (tail) {\n tail.next = node\n }\n\n this.tail = node\n if (!this.head) {\n this.head = node\n }\n this.length++\n}\n\nYallist.prototype.push = function () {\n for (var i = 0, l = arguments.length; i < l; i++) {\n push(this, arguments[i])\n }\n return this.length\n}\n\nYallist.prototype.unshift = function () {\n for (var i = 0, l = arguments.length; i < l; i++) {\n unshift(this, arguments[i])\n }\n return this.length\n}\n\nYallist.prototype.pop = function () {\n if (!this.tail) {\n return undefined\n }\n\n var res = this.tail.value\n this.tail = this.tail.prev\n if (this.tail) {\n this.tail.next = null\n } else {\n this.head = null\n }\n this.length--\n return res\n}\n\nYallist.prototype.shift = function () {\n if (!this.head) {\n return undefined\n }\n\n var res = this.head.value\n this.head = this.head.next\n if (this.head) {\n this.head.prev = null\n } else {\n this.tail = null\n }\n this.length--\n return res\n}\n\nYallist.prototype.forEach = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = this.head, i = 0; walker !== null; i++) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.next\n }\n}\n\nYallist.prototype.forEachReverse = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.prev\n }\n}\n\nYallist.prototype.get = function (n) {\n for (var i = 0, walker = this.head; walker !== null && i < n; i++) {\n // abort out of the list early if we hit a cycle\n walker = walker.next\n }\n if (i === n && walker !== null) {\n return walker.value\n }\n}\n\nYallist.prototype.getReverse = function (n) {\n for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {\n // abort out of the list early if we hit a cycle\n walker = walker.prev\n }\n if (i === n && walker !== null) {\n return walker.value\n }\n}\n\nYallist.prototype.map = function (fn, thisp) {\n thisp = thisp || this\n var res = new Yallist()\n for (var walker = this.head; walker !== null;) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.next\n }\n return res\n}\n\nYallist.prototype.mapReverse = function (fn, thisp) {\n thisp = thisp || this\n var res = new Yallist()\n for (var walker = this.tail; walker !== null;) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.prev\n }\n return res\n}\n\nYallist.prototype.reduce = function (fn, initial) {\n var acc\n var walker = this.head\n if (arguments.length > 1) {\n acc = initial\n } else if (this.head) {\n walker = this.head.next\n acc = this.head.value\n } else {\n throw new TypeError('Reduce of empty list with no initial value')\n }\n\n for (var i = 0; walker !== null; i++) {\n acc = fn(acc, walker.value, i)\n walker = walker.next\n }\n\n return acc\n}\n\nYallist.prototype.reduceReverse = function (fn, initial) {\n var acc\n var walker = this.tail\n if (arguments.length > 1) {\n acc = initial\n } else if (this.tail) {\n walker = this.tail.prev\n acc = this.tail.value\n } else {\n throw new TypeError('Reduce of empty list with no initial value')\n }\n\n for (var i = this.length - 1; walker !== null; i--) {\n acc = fn(acc, walker.value, i)\n walker = walker.prev\n }\n\n return acc\n}\n\nYallist.prototype.toArray = function () {\n var arr = new Array(this.length)\n for (var i = 0, walker = this.head; walker !== null; i++) {\n arr[i] = walker.value\n walker = walker.next\n }\n return arr\n}\n\nYallist.prototype.toArrayReverse = function () {\n var arr = new Array(this.length)\n for (var i = 0, walker = this.tail; walker !== null; i++) {\n arr[i] = walker.value\n walker = walker.prev\n }\n return arr\n}\n\nYallist.prototype.slice = function (from, to) {\n to = to || this.length\n if (to < 0) {\n to += this.length\n }\n from = from || 0\n if (from < 0) {\n from += this.length\n }\n var ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n for (var i = 0, walker = this.head; walker !== null && i < from; i++) {\n walker = walker.next\n }\n for (; walker !== null && i < to; i++, walker = walker.next) {\n ret.push(walker.value)\n }\n return ret\n}\n\nYallist.prototype.sliceReverse = function (from, to) {\n to = to || this.length\n if (to < 0) {\n to += this.length\n }\n from = from || 0\n if (from < 0) {\n from += this.length\n }\n var ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {\n walker = walker.prev\n }\n for (; walker !== null && i > from; i--, walker = walker.prev) {\n ret.push(walker.value)\n }\n return ret\n}\n\nYallist.prototype.reverse = function () {\n var head = this.head\n var tail = this.tail\n for (var walker = head; walker !== null; walker = walker.prev) {\n var p = walker.prev\n walker.prev = walker.next\n walker.next = p\n }\n this.head = tail\n this.tail = head\n return this\n}\n\nfunction push (self, item) {\n self.tail = new Node(item, self.tail, null, self)\n if (!self.head) {\n self.head = self.tail\n }\n self.length++\n}\n\nfunction unshift (self, item) {\n self.head = new Node(item, null, self.head, self)\n if (!self.tail) {\n self.tail = self.head\n }\n self.length++\n}\n\nfunction Node (value, prev, next, list) {\n if (!(this instanceof Node)) {\n return new Node(value, prev, next, list)\n }\n\n this.list = list\n this.value = value\n\n if (prev) {\n prev.next = this\n this.prev = prev\n } else {\n this.prev = null\n }\n\n if (next) {\n next.prev = this\n this.next = next\n } else {\n this.next = null\n }\n}\n", "'use strict'\n\nmodule.exports = LRUCache\n\n// This will be a proper iterable 'Map' in engines that support it,\n// or a fakey-fake PseudoMap in older versions.\nvar Map = require('pseudomap')\nvar util = require('util')\n\n// A linked list to keep track of recently-used-ness\nvar Yallist = require('yallist')\n\n// use symbols if possible, otherwise just _props\nvar hasSymbol = typeof Symbol === 'function' && process.env._nodeLRUCacheForceNoSymbol !== '1'\nvar makeSymbol\nif (hasSymbol) {\n makeSymbol = function (key) {\n return Symbol(key)\n }\n} else {\n makeSymbol = function (key) {\n return '_' + key\n }\n}\n\nvar MAX = makeSymbol('max')\nvar LENGTH = makeSymbol('length')\nvar LENGTH_CALCULATOR = makeSymbol('lengthCalculator')\nvar ALLOW_STALE = makeSymbol('allowStale')\nvar MAX_AGE = makeSymbol('maxAge')\nvar DISPOSE = makeSymbol('dispose')\nvar NO_DISPOSE_ON_SET = makeSymbol('noDisposeOnSet')\nvar LRU_LIST = makeSymbol('lruList')\nvar CACHE = makeSymbol('cache')\n\nfunction naiveLength () { return 1 }\n\n// lruList is a yallist where the head is the youngest\n// item, and the tail is the oldest. the list contains the Hit\n// objects as the entries.\n// Each Hit object has a reference to its Yallist.Node. This\n// never changes.\n//\n// cache is a Map (or PseudoMap) that matches the keys to\n// the Yallist.Node object.\nfunction LRUCache (options) {\n if (!(this instanceof LRUCache)) {\n return new LRUCache(options)\n }\n\n if (typeof options === 'number') {\n options = { max: options }\n }\n\n if (!options) {\n options = {}\n }\n\n var max = this[MAX] = options.max\n // Kind of weird to have a default max of Infinity, but oh well.\n if (!max ||\n !(typeof max === 'number') ||\n max <= 0) {\n this[MAX] = Infinity\n }\n\n var lc = options.length || naiveLength\n if (typeof lc !== 'function') {\n lc = naiveLength\n }\n this[LENGTH_CALCULATOR] = lc\n\n this[ALLOW_STALE] = options.stale || false\n this[MAX_AGE] = options.maxAge || 0\n this[DISPOSE] = options.dispose\n this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false\n this.reset()\n}\n\n// resize the cache when the max changes.\nObject.defineProperty(LRUCache.prototype, 'max', {\n set: function (mL) {\n if (!mL || !(typeof mL === 'number') || mL <= 0) {\n mL = Infinity\n }\n this[MAX] = mL\n trim(this)\n },\n get: function () {\n return this[MAX]\n },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'allowStale', {\n set: function (allowStale) {\n this[ALLOW_STALE] = !!allowStale\n },\n get: function () {\n return this[ALLOW_STALE]\n },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'maxAge', {\n set: function (mA) {\n if (!mA || !(typeof mA === 'number') || mA < 0) {\n mA = 0\n }\n this[MAX_AGE] = mA\n trim(this)\n },\n get: function () {\n return this[MAX_AGE]\n },\n enumerable: true\n})\n\n// resize the cache when the lengthCalculator changes.\nObject.defineProperty(LRUCache.prototype, 'lengthCalculator', {\n set: function (lC) {\n if (typeof lC !== 'function') {\n lC = naiveLength\n }\n if (lC !== this[LENGTH_CALCULATOR]) {\n this[LENGTH_CALCULATOR] = lC\n this[LENGTH] = 0\n this[LRU_LIST].forEach(function (hit) {\n hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key)\n this[LENGTH] += hit.length\n }, this)\n }\n trim(this)\n },\n get: function () { return this[LENGTH_CALCULATOR] },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'length', {\n get: function () { return this[LENGTH] },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'itemCount', {\n get: function () { return this[LRU_LIST].length },\n enumerable: true\n})\n\nLRUCache.prototype.rforEach = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = this[LRU_LIST].tail; walker !== null;) {\n var prev = walker.prev\n forEachStep(this, fn, walker, thisp)\n walker = prev\n }\n}\n\nfunction forEachStep (self, fn, node, thisp) {\n var hit = node.value\n if (isStale(self, hit)) {\n del(self, node)\n if (!self[ALLOW_STALE]) {\n hit = undefined\n }\n }\n if (hit) {\n fn.call(thisp, hit.value, hit.key, self)\n }\n}\n\nLRUCache.prototype.forEach = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = this[LRU_LIST].head; walker !== null;) {\n var next = walker.next\n forEachStep(this, fn, walker, thisp)\n walker = next\n }\n}\n\nLRUCache.prototype.keys = function () {\n return this[LRU_LIST].toArray().map(function (k) {\n return k.key\n }, this)\n}\n\nLRUCache.prototype.values = function () {\n return this[LRU_LIST].toArray().map(function (k) {\n return k.value\n }, this)\n}\n\nLRUCache.prototype.reset = function () {\n if (this[DISPOSE] &&\n this[LRU_LIST] &&\n this[LRU_LIST].length) {\n this[LRU_LIST].forEach(function (hit) {\n this[DISPOSE](hit.key, hit.value)\n }, this)\n }\n\n this[CACHE] = new Map() // hash of items by key\n this[LRU_LIST] = new Yallist() // list of items in order of use recency\n this[LENGTH] = 0 // length of items in the list\n}\n\nLRUCache.prototype.dump = function () {\n return this[LRU_LIST].map(function (hit) {\n if (!isStale(this, hit)) {\n return {\n k: hit.key,\n v: hit.value,\n e: hit.now + (hit.maxAge || 0)\n }\n }\n }, this).toArray().filter(function (h) {\n return h\n })\n}\n\nLRUCache.prototype.dumpLru = function () {\n return this[LRU_LIST]\n}\n\n/* istanbul ignore next */\nLRUCache.prototype.inspect = function (n, opts) {\n var str = 'LRUCache {'\n var extras = false\n\n var as = this[ALLOW_STALE]\n if (as) {\n str += '\\n allowStale: true'\n extras = true\n }\n\n var max = this[MAX]\n if (max && max !== Infinity) {\n if (extras) {\n str += ','\n }\n str += '\\n max: ' + util.inspect(max, opts)\n extras = true\n }\n\n var maxAge = this[MAX_AGE]\n if (maxAge) {\n if (extras) {\n str += ','\n }\n str += '\\n maxAge: ' + util.inspect(maxAge, opts)\n extras = true\n }\n\n var lc = this[LENGTH_CALCULATOR]\n if (lc && lc !== naiveLength) {\n if (extras) {\n str += ','\n }\n str += '\\n length: ' + util.inspect(this[LENGTH], opts)\n extras = true\n }\n\n var didFirst = false\n this[LRU_LIST].forEach(function (item) {\n if (didFirst) {\n str += ',\\n '\n } else {\n if (extras) {\n str += ',\\n'\n }\n didFirst = true\n str += '\\n '\n }\n var key = util.inspect(item.key).split('\\n').join('\\n ')\n var val = { value: item.value }\n if (item.maxAge !== maxAge) {\n val.maxAge = item.maxAge\n }\n if (lc !== naiveLength) {\n val.length = item.length\n }\n if (isStale(this, item)) {\n val.stale = true\n }\n\n val = util.inspect(val, opts).split('\\n').join('\\n ')\n str += key + ' => ' + val\n })\n\n if (didFirst || extras) {\n str += '\\n'\n }\n str += '}'\n\n return str\n}\n\nLRUCache.prototype.set = function (key, value, maxAge) {\n maxAge = maxAge || this[MAX_AGE]\n\n var now = maxAge ? Date.now() : 0\n var len = this[LENGTH_CALCULATOR](value, key)\n\n if (this[CACHE].has(key)) {\n if (len > this[MAX]) {\n del(this, this[CACHE].get(key))\n return false\n }\n\n var node = this[CACHE].get(key)\n var item = node.value\n\n // dispose of the old one before overwriting\n // split out into 2 ifs for better coverage tracking\n if (this[DISPOSE]) {\n if (!this[NO_DISPOSE_ON_SET]) {\n this[DISPOSE](key, item.value)\n }\n }\n\n item.now = now\n item.maxAge = maxAge\n item.value = value\n this[LENGTH] += len - item.length\n item.length = len\n this.get(key)\n trim(this)\n return true\n }\n\n var hit = new Entry(key, value, len, now, maxAge)\n\n // oversized objects fall out of cache automatically.\n if (hit.length > this[MAX]) {\n if (this[DISPOSE]) {\n this[DISPOSE](key, value)\n }\n return false\n }\n\n this[LENGTH] += hit.length\n this[LRU_LIST].unshift(hit)\n this[CACHE].set(key, this[LRU_LIST].head)\n trim(this)\n return true\n}\n\nLRUCache.prototype.has = function (key) {\n if (!this[CACHE].has(key)) return false\n var hit = this[CACHE].get(key).value\n if (isStale(this, hit)) {\n return false\n }\n return true\n}\n\nLRUCache.prototype.get = function (key) {\n return get(this, key, true)\n}\n\nLRUCache.prototype.peek = function (key) {\n return get(this, key, false)\n}\n\nLRUCache.prototype.pop = function () {\n var node = this[LRU_LIST].tail\n if (!node) return null\n del(this, node)\n return node.value\n}\n\nLRUCache.prototype.del = function (key) {\n del(this, this[CACHE].get(key))\n}\n\nLRUCache.prototype.load = function (arr) {\n // reset the cache\n this.reset()\n\n var now = Date.now()\n // A previous serialized cache has the most recent items first\n for (var l = arr.length - 1; l >= 0; l--) {\n var hit = arr[l]\n var expiresAt = hit.e || 0\n if (expiresAt === 0) {\n // the item was created without expiration in a non aged cache\n this.set(hit.k, hit.v)\n } else {\n var maxAge = expiresAt - now\n // dont add already expired items\n if (maxAge > 0) {\n this.set(hit.k, hit.v, maxAge)\n }\n }\n }\n}\n\nLRUCache.prototype.prune = function () {\n var self = this\n this[CACHE].forEach(function (value, key) {\n get(self, key, false)\n })\n}\n\nfunction get (self, key, doUse) {\n var node = self[CACHE].get(key)\n if (node) {\n var hit = node.value\n if (isStale(self, hit)) {\n del(self, node)\n if (!self[ALLOW_STALE]) hit = undefined\n } else {\n if (doUse) {\n self[LRU_LIST].unshiftNode(node)\n }\n }\n if (hit) hit = hit.value\n }\n return hit\n}\n\nfunction isStale (self, hit) {\n if (!hit || (!hit.maxAge && !self[MAX_AGE])) {\n return false\n }\n var stale = false\n var diff = Date.now() - hit.now\n if (hit.maxAge) {\n stale = diff > hit.maxAge\n } else {\n stale = self[MAX_AGE] && (diff > self[MAX_AGE])\n }\n return stale\n}\n\nfunction trim (self) {\n if (self[LENGTH] > self[MAX]) {\n for (var walker = self[LRU_LIST].tail;\n self[LENGTH] > self[MAX] && walker !== null;) {\n // We know that we're about to delete this one, and also\n // what the next least recently used key will be, so just\n // go ahead and set it now.\n var prev = walker.prev\n del(self, walker)\n walker = prev\n }\n }\n}\n\nfunction del (self, node) {\n if (node) {\n var hit = node.value\n if (self[DISPOSE]) {\n self[DISPOSE](hit.key, hit.value)\n }\n self[LENGTH] -= hit.length\n self[CACHE].delete(hit.key)\n self[LRU_LIST].removeNode(node)\n }\n}\n\n// classy, since V8 prefers predictable objects.\nfunction Entry (key, value, length, now, maxAge) {\n this.key = key\n this.value = value\n this.length = length\n this.now = now\n this.maxAge = maxAge || 0\n}\n", "'use strict';\n\nvar path = require('path');\nvar which = require('which');\nvar LRU = require('lru-cache');\n\nvar commandCache = new LRU({ max: 50, maxAge: 30 * 1000 }); // Cache just for 30sec\n\nfunction resolveCommand(command, noExtension) {\n var resolved;\n\n noExtension = !!noExtension;\n resolved = commandCache.get(command + '!' + noExtension);\n\n // Check if its resolved in the cache\n if (commandCache.has(command)) {\n return commandCache.get(command);\n }\n\n try {\n resolved = !noExtension ?\n which.sync(command) :\n which.sync(command, { pathExt: path.delimiter + (process.env.PATHEXT || '') });\n } catch (e) { /* empty */ }\n\n commandCache.set(command + '!' + noExtension, resolved);\n\n return resolved;\n}\n\nmodule.exports = resolveCommand;\n", "'use strict';\n\n// See: https://github.com/IndigoUnited/node-cross-spawn/pull/34#issuecomment-221623455\nfunction hasEmptyArgumentBug() {\n var nodeVer;\n\n if (process.platform !== 'win32') {\n return false;\n }\n\n nodeVer = process.version.substr(1).split('.').map(function (num) {\n return parseInt(num, 10);\n });\n\n return (nodeVer[0] === 0 && nodeVer[1] < 12);\n}\n\nmodule.exports = hasEmptyArgumentBug();\n", "'use strict';\n\nfunction escapeArgument(arg, quote) {\n // Convert to string\n arg = '' + arg;\n\n // If we are not going to quote the argument,\n // escape shell metacharacters, including double and single quotes:\n if (!quote) {\n arg = arg.replace(/([()%!^<>&|;,\"'\\s])/g, '^$1');\n } else {\n // Sequence of backslashes followed by a double quote:\n // double up all the backslashes and escape the double quote\n arg = arg.replace(/(\\\\*)\"/g, '$1$1\\\\\"');\n\n // Sequence of backslashes followed by the end of the string\n // (which will become a double quote later):\n // double up all the backslashes\n arg = arg.replace(/(\\\\*)$/, '$1$1');\n\n // All other backslashes occur literally\n\n // Quote the whole thing:\n arg = '\"' + arg + '\"';\n }\n\n return arg;\n}\n\nmodule.exports = escapeArgument;\n", "'use strict';\n\nvar escapeArgument = require('./escapeArgument');\n\nfunction escapeCommand(command) {\n // Do not escape if this command is not dangerous..\n // We do this so that commands like \"echo\" or \"ifconfig\" work\n // Quoting them, will make them unaccessible\n return /^[a-z0-9_-]+$/i.test(command) ? command : escapeArgument(command, true);\n}\n\nmodule.exports = escapeCommand;\n", "'use strict';\nmodule.exports = /^#!.*/;\n", "'use strict';\nvar shebangRegex = require('shebang-regex');\n\nmodule.exports = function (str) {\n\tvar match = str.match(shebangRegex);\n\n\tif (!match) {\n\t\treturn null;\n\t}\n\n\tvar arr = match[0].replace(/#! ?/, '').split(' ');\n\tvar bin = arr[0].split('/').pop();\n\tvar arg = arr[1];\n\n\treturn (bin === 'env' ?\n\t\targ :\n\t\tbin + (arg ? ' ' + arg : '')\n\t);\n};\n", "'use strict';\n\nvar fs = require('fs');\nvar LRU = require('lru-cache');\nvar shebangCommand = require('shebang-command');\n\nvar shebangCache = new LRU({ max: 50, maxAge: 30 * 1000 }); // Cache just for 30sec\n\nfunction readShebang(command) {\n var buffer;\n var fd;\n var shebang;\n\n // Check if it is in the cache first\n if (shebangCache.has(command)) {\n return shebangCache.get(command);\n }\n\n // Read the first 150 bytes from the file\n buffer = new Buffer(150);\n\n try {\n fd = fs.openSync(command, 'r');\n fs.readSync(fd, buffer, 0, 150, 0);\n fs.closeSync(fd);\n } catch (e) { /* empty */ }\n\n // Attempt to extract shebang (null is returned if not a shebang)\n shebang = shebangCommand(buffer.toString());\n\n // Store the shebang in the cache\n shebangCache.set(command, shebang);\n\n return shebang;\n}\n\nmodule.exports = readShebang;\n", "'use strict';\n\nvar resolveCommand = require('./util/resolveCommand');\nvar hasEmptyArgumentBug = require('./util/hasEmptyArgumentBug');\nvar escapeArgument = require('./util/escapeArgument');\nvar escapeCommand = require('./util/escapeCommand');\nvar readShebang = require('./util/readShebang');\n\nvar isWin = process.platform === 'win32';\nvar skipShellRegExp = /\\.(?:com|exe)$/i;\n\n// Supported in Node >= 6 and >= 4.8\nvar supportsShellOption = parseInt(process.version.substr(1).split('.')[0], 10) >= 6 ||\n parseInt(process.version.substr(1).split('.')[0], 10) === 4 && parseInt(process.version.substr(1).split('.')[1], 10) >= 8;\n\nfunction parseNonShell(parsed) {\n var shebang;\n var needsShell;\n var applyQuotes;\n\n if (!isWin) {\n return parsed;\n }\n\n // Detect & add support for shebangs\n parsed.file = resolveCommand(parsed.command);\n parsed.file = parsed.file || resolveCommand(parsed.command, true);\n shebang = parsed.file && readShebang(parsed.file);\n\n if (shebang) {\n parsed.args.unshift(parsed.file);\n parsed.command = shebang;\n needsShell = hasEmptyArgumentBug || !skipShellRegExp.test(resolveCommand(shebang) || resolveCommand(shebang, true));\n } else {\n needsShell = hasEmptyArgumentBug || !skipShellRegExp.test(parsed.file);\n }\n\n // If a shell is required, use cmd.exe and take care of escaping everything correctly\n if (needsShell) {\n // Escape command & arguments\n applyQuotes = (parsed.command !== 'echo'); // Do not quote arguments for the special \"echo\" command\n parsed.command = escapeCommand(parsed.command);\n parsed.args = parsed.args.map(function (arg) {\n return escapeArgument(arg, applyQuotes);\n });\n\n // Make use of cmd.exe\n parsed.args = ['/d', '/s', '/c', '\"' + parsed.command + (parsed.args.length ? ' ' + parsed.args.join(' ') : '') + '\"'];\n parsed.command = process.env.comspec || 'cmd.exe';\n parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped\n }\n\n return parsed;\n}\n\nfunction parseShell(parsed) {\n var shellCommand;\n\n // If node supports the shell option, there's no need to mimic its behavior\n if (supportsShellOption) {\n return parsed;\n }\n\n // Mimic node shell option, see: https://github.com/nodejs/node/blob/b9f6a2dc059a1062776133f3d4fd848c4da7d150/lib/child_process.js#L335\n shellCommand = [parsed.command].concat(parsed.args).join(' ');\n\n if (isWin) {\n parsed.command = typeof parsed.options.shell === 'string' ? parsed.options.shell : process.env.comspec || 'cmd.exe';\n parsed.args = ['/d', '/s', '/c', '\"' + shellCommand + '\"'];\n parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped\n } else {\n if (typeof parsed.options.shell === 'string') {\n parsed.command = parsed.options.shell;\n } else if (process.platform === 'android') {\n parsed.command = '/system/bin/sh';\n } else {\n parsed.command = '/bin/sh';\n }\n\n parsed.args = ['-c', shellCommand];\n }\n\n return parsed;\n}\n\n// ------------------------------------------------\n\nfunction parse(command, args, options) {\n var parsed;\n\n // Normalize arguments, similar to nodejs\n if (args && !Array.isArray(args)) {\n options = args;\n args = null;\n }\n\n args = args ? args.slice(0) : []; // Clone array to avoid changing the original\n options = options || {};\n\n // Build our parsed object\n parsed = {\n command: command,\n args: args,\n options: options,\n file: undefined,\n original: command,\n };\n\n // Delegate further parsing to shell or non-shell\n return options.shell ? parseShell(parsed) : parseNonShell(parsed);\n}\n\nmodule.exports = parse;\n", "'use strict';\n\nvar isWin = process.platform === 'win32';\nvar resolveCommand = require('./util/resolveCommand');\n\nvar isNode10 = process.version.indexOf('v0.10.') === 0;\n\nfunction notFoundError(command, syscall) {\n var err;\n\n err = new Error(syscall + ' ' + command + ' ENOENT');\n err.code = err.errno = 'ENOENT';\n err.syscall = syscall + ' ' + command;\n\n return err;\n}\n\nfunction hookChildProcess(cp, parsed) {\n var originalEmit;\n\n if (!isWin) {\n return;\n }\n\n originalEmit = cp.emit;\n cp.emit = function (name, arg1) {\n var err;\n\n // If emitting \"exit\" event and exit code is 1, we need to check if\n // the command exists and emit an \"error\" instead\n // See: https://github.com/IndigoUnited/node-cross-spawn/issues/16\n if (name === 'exit') {\n err = verifyENOENT(arg1, parsed, 'spawn');\n\n if (err) {\n return originalEmit.call(cp, 'error', err);\n }\n }\n\n return originalEmit.apply(cp, arguments);\n };\n}\n\nfunction verifyENOENT(status, parsed) {\n if (isWin && status === 1 && !parsed.file) {\n return notFoundError(parsed.original, 'spawn');\n }\n\n return null;\n}\n\nfunction verifyENOENTSync(status, parsed) {\n if (isWin && status === 1 && !parsed.file) {\n return notFoundError(parsed.original, 'spawnSync');\n }\n\n // If we are in node 10, then we are using spawn-sync; if it exited\n // with -1 it probably means that the command does not exist\n if (isNode10 && status === -1) {\n parsed.file = isWin ? parsed.file : resolveCommand(parsed.original);\n\n if (!parsed.file) {\n return notFoundError(parsed.original, 'spawnSync');\n }\n }\n\n return null;\n}\n\nmodule.exports.hookChildProcess = hookChildProcess;\nmodule.exports.verifyENOENT = verifyENOENT;\nmodule.exports.verifyENOENTSync = verifyENOENTSync;\nmodule.exports.notFoundError = notFoundError;\n", "'use strict';\n\nvar cp = require('child_process');\nvar parse = require('./lib/parse');\nvar enoent = require('./lib/enoent');\n\nvar cpSpawnSync = cp.spawnSync;\n\nfunction spawn(command, args, options) {\n var parsed;\n var spawned;\n\n // Parse the arguments\n parsed = parse(command, args, options);\n\n // Spawn the child process\n spawned = cp.spawn(parsed.command, parsed.args, parsed.options);\n\n // Hook into child process \"exit\" event to emit an error if the command\n // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16\n enoent.hookChildProcess(spawned, parsed);\n\n return spawned;\n}\n\nfunction spawnSync(command, args, options) {\n var parsed;\n var result;\n\n if (!cpSpawnSync) {\n try {\n cpSpawnSync = require('spawn-sync'); // eslint-disable-line global-require\n } catch (ex) {\n throw new Error(\n 'In order to use spawnSync on node 0.10 or older, you must ' +\n 'install spawn-sync:\\n\\n' +\n ' npm install spawn-sync --save'\n );\n }\n }\n\n // Parse the arguments\n parsed = parse(command, args, options);\n\n // Spawn the child process\n result = cpSpawnSync(parsed.command, parsed.args, parsed.options);\n\n // Analyze if the command does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16\n result.error = result.error || enoent.verifyENOENTSync(result.status, parsed);\n\n return result;\n}\n\nmodule.exports = spawn;\nmodule.exports.spawn = spawn;\nmodule.exports.sync = spawnSync;\n\nmodule.exports._parse = parse;\nmodule.exports._enoent = enoent;\n", "'use strict';\nmodule.exports = function (x) {\n\tvar lf = typeof x === 'string' ? '\\n' : '\\n'.charCodeAt();\n\tvar cr = typeof x === 'string' ? '\\r' : '\\r'.charCodeAt();\n\n\tif (x[x.length - 1] === lf) {\n\t\tx = x.slice(0, x.length - 1);\n\t}\n\n\tif (x[x.length - 1] === cr) {\n\t\tx = x.slice(0, x.length - 1);\n\t}\n\n\treturn x;\n};\n", "'use strict';\nmodule.exports = opts => {\n\topts = opts || {};\n\n\tconst env = opts.env || process.env;\n\tconst platform = opts.platform || process.platform;\n\n\tif (platform !== 'win32') {\n\t\treturn 'PATH';\n\t}\n\n\treturn Object.keys(env).find(x => x.toUpperCase() === 'PATH') || 'Path';\n};\n", "'use strict';\nconst path = require('path');\nconst pathKey = require('path-key');\n\nmodule.exports = opts => {\n\topts = Object.assign({\n\t\tcwd: process.cwd(),\n\t\tpath: process.env[pathKey()]\n\t}, opts);\n\n\tlet prev;\n\tlet pth = path.resolve(opts.cwd);\n\tconst ret = [];\n\n\twhile (prev !== pth) {\n\t\tret.push(path.join(pth, 'node_modules/.bin'));\n\t\tprev = pth;\n\t\tpth = path.resolve(pth, '..');\n\t}\n\n\t// ensure the running `node` binary is used\n\tret.push(path.dirname(process.execPath));\n\n\treturn ret.concat(opts.path).join(path.delimiter);\n};\n\nmodule.exports.env = opts => {\n\topts = Object.assign({\n\t\tenv: process.env\n\t}, opts);\n\n\tconst env = Object.assign({}, opts.env);\n\tconst path = pathKey({env});\n\n\topts.path = env[path];\n\tenv[path] = module.exports(opts);\n\n\treturn env;\n};\n", "'use strict';\n\nvar isStream = module.exports = function (stream) {\n\treturn stream !== null && typeof stream === 'object' && typeof stream.pipe === 'function';\n};\n\nisStream.writable = function (stream) {\n\treturn isStream(stream) && stream.writable !== false && typeof stream._write === 'function' && typeof stream._writableState === 'object';\n};\n\nisStream.readable = function (stream) {\n\treturn isStream(stream) && stream.readable !== false && typeof stream._read === 'function' && typeof stream._readableState === 'object';\n};\n\nisStream.duplex = function (stream) {\n\treturn isStream.writable(stream) && isStream.readable(stream);\n};\n\nisStream.transform = function (stream) {\n\treturn isStream.duplex(stream) && typeof stream._transform === 'function' && typeof stream._transformState === 'object';\n};\n", "'use strict';\nconst PassThrough = require('stream').PassThrough;\n\nmodule.exports = opts => {\n\topts = Object.assign({}, opts);\n\n\tconst array = opts.array;\n\tlet encoding = opts.encoding;\n\tconst buffer = encoding === 'buffer';\n\tlet objectMode = false;\n\n\tif (array) {\n\t\tobjectMode = !(encoding || buffer);\n\t} else {\n\t\tencoding = encoding || 'utf8';\n\t}\n\n\tif (buffer) {\n\t\tencoding = null;\n\t}\n\n\tlet len = 0;\n\tconst ret = [];\n\tconst stream = new PassThrough({objectMode});\n\n\tif (encoding) {\n\t\tstream.setEncoding(encoding);\n\t}\n\n\tstream.on('data', chunk => {\n\t\tret.push(chunk);\n\n\t\tif (objectMode) {\n\t\t\tlen = ret.length;\n\t\t} else {\n\t\t\tlen += chunk.length;\n\t\t}\n\t});\n\n\tstream.getBufferedValue = () => {\n\t\tif (array) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn buffer ? Buffer.concat(ret, len) : ret.join('');\n\t};\n\n\tstream.getBufferedLength = () => len;\n\n\treturn stream;\n};\n", "'use strict';\nconst bufferStream = require('./buffer-stream');\n\nfunction getStream(inputStream, opts) {\n\tif (!inputStream) {\n\t\treturn Promise.reject(new Error('Expected a stream'));\n\t}\n\n\topts = Object.assign({maxBuffer: Infinity}, opts);\n\n\tconst maxBuffer = opts.maxBuffer;\n\tlet stream;\n\tlet clean;\n\n\tconst p = new Promise((resolve, reject) => {\n\t\tconst error = err => {\n\t\t\tif (err) { // null check\n\t\t\t\terr.bufferedData = stream.getBufferedValue();\n\t\t\t}\n\n\t\t\treject(err);\n\t\t};\n\n\t\tstream = bufferStream(opts);\n\t\tinputStream.once('error', error);\n\t\tinputStream.pipe(stream);\n\n\t\tstream.on('data', () => {\n\t\t\tif (stream.getBufferedLength() > maxBuffer) {\n\t\t\t\treject(new Error('maxBuffer exceeded'));\n\t\t\t}\n\t\t});\n\t\tstream.once('error', error);\n\t\tstream.on('end', resolve);\n\n\t\tclean = () => {\n\t\t\t// some streams doesn't implement the `stream.Readable` interface correctly\n\t\t\tif (inputStream.unpipe) {\n\t\t\t\tinputStream.unpipe(stream);\n\t\t\t}\n\t\t};\n\t});\n\n\tp.then(clean, clean);\n\n\treturn p.then(() => stream.getBufferedValue());\n}\n\nmodule.exports = getStream;\nmodule.exports.buffer = (stream, opts) => getStream(stream, Object.assign({}, opts, {encoding: 'buffer'}));\nmodule.exports.array = (stream, opts) => getStream(stream, Object.assign({}, opts, {array: true}));\n", "'use strict';\nmodule.exports = (promise, onFinally) => {\n\tonFinally = onFinally || (() => {});\n\n\treturn promise.then(\n\t\tval => new Promise(resolve => {\n\t\t\tresolve(onFinally());\n\t\t}).then(() => val),\n\t\terr => new Promise(resolve => {\n\t\t\tresolve(onFinally());\n\t\t}).then(() => {\n\t\t\tthrow err;\n\t\t})\n\t);\n};\n", "// This is not the set of all possible signals.\n//\n// It IS, however, the set of all signals that trigger\n// an exit on either Linux or BSD systems. Linux is a\n// superset of the signal names supported on BSD, and\n// the unknown signals just fail to register, so we can\n// catch that easily enough.\n//\n// Don't bother with SIGKILL. It's uncatchable, which\n// means that we can't fire any callbacks anyway.\n//\n// If a user does happen to register a handler on a non-\n// fatal signal like SIGWINCH or something, and then\n// exit, it'll end up firing `process.emit('exit')`, so\n// the handler will be fired anyway.\n//\n// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised\n// artificially, inherently leave the process in a\n// state from which it is not safe to try and enter JS\n// listeners.\nmodule.exports = [\n 'SIGABRT',\n 'SIGALRM',\n 'SIGHUP',\n 'SIGINT',\n 'SIGTERM'\n]\n\nif (process.platform !== 'win32') {\n module.exports.push(\n 'SIGVTALRM',\n 'SIGXCPU',\n 'SIGXFSZ',\n 'SIGUSR2',\n 'SIGTRAP',\n 'SIGSYS',\n 'SIGQUIT',\n 'SIGIOT'\n // should detect profiler and enable/disable accordingly.\n // see #21\n // 'SIGPROF'\n )\n}\n\nif (process.platform === 'linux') {\n module.exports.push(\n 'SIGIO',\n 'SIGPOLL',\n 'SIGPWR',\n 'SIGSTKFLT',\n 'SIGUNUSED'\n )\n}\n", "// Note: since nyc uses this module to output coverage, any lines\n// that are in the direct sync flow of nyc's outputCoverage are\n// ignored, since we can never get coverage for them.\nvar assert = require('assert')\nvar signals = require('./signals.js')\n\nvar EE = require('events')\n/* istanbul ignore if */\nif (typeof EE !== 'function') {\n EE = EE.EventEmitter\n}\n\nvar emitter\nif (process.__signal_exit_emitter__) {\n emitter = process.__signal_exit_emitter__\n} else {\n emitter = process.__signal_exit_emitter__ = new EE()\n emitter.count = 0\n emitter.emitted = {}\n}\n\n// Because this emitter is a global, we have to check to see if a\n// previous version of this library failed to enable infinite listeners.\n// I know what you're about to say. But literally everything about\n// signal-exit is a compromise with evil. Get used to it.\nif (!emitter.infinite) {\n emitter.setMaxListeners(Infinity)\n emitter.infinite = true\n}\n\nmodule.exports = function (cb, opts) {\n assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler')\n\n if (loaded === false) {\n load()\n }\n\n var ev = 'exit'\n if (opts && opts.alwaysLast) {\n ev = 'afterexit'\n }\n\n var remove = function () {\n emitter.removeListener(ev, cb)\n if (emitter.listeners('exit').length === 0 &&\n emitter.listeners('afterexit').length === 0) {\n unload()\n }\n }\n emitter.on(ev, cb)\n\n return remove\n}\n\nmodule.exports.unload = unload\nfunction unload () {\n if (!loaded) {\n return\n }\n loaded = false\n\n signals.forEach(function (sig) {\n try {\n process.removeListener(sig, sigListeners[sig])\n } catch (er) {}\n })\n process.emit = originalProcessEmit\n process.reallyExit = originalProcessReallyExit\n emitter.count -= 1\n}\n\nfunction emit (event, code, signal) {\n if (emitter.emitted[event]) {\n return\n }\n emitter.emitted[event] = true\n emitter.emit(event, code, signal)\n}\n\n// { <signal>: <listener fn>, ... }\nvar sigListeners = {}\nsignals.forEach(function (sig) {\n sigListeners[sig] = function listener () {\n // If there are no other listeners, an exit is coming!\n // Simplest way: remove us and then re-send the signal.\n // We know that this will kill the process, so we can\n // safely emit now.\n var listeners = process.listeners(sig)\n if (listeners.length === emitter.count) {\n unload()\n emit('exit', null, sig)\n /* istanbul ignore next */\n emit('afterexit', null, sig)\n /* istanbul ignore next */\n process.kill(process.pid, sig)\n }\n }\n})\n\nmodule.exports.signals = function () {\n return signals\n}\n\nmodule.exports.load = load\n\nvar loaded = false\n\nfunction load () {\n if (loaded) {\n return\n }\n loaded = true\n\n // This is the number of onSignalExit's that are in play.\n // It's important so that we can count the correct number of\n // listeners on signals, and don't wait for the other one to\n // handle it instead of us.\n emitter.count += 1\n\n signals = signals.filter(function (sig) {\n try {\n process.on(sig, sigListeners[sig])\n return true\n } catch (er) {\n return false\n }\n })\n\n process.emit = processEmit\n process.reallyExit = processReallyExit\n}\n\nvar originalProcessReallyExit = process.reallyExit\nfunction processReallyExit (code) {\n process.exitCode = code || 0\n emit('exit', process.exitCode, null)\n /* istanbul ignore next */\n emit('afterexit', process.exitCode, null)\n /* istanbul ignore next */\n originalProcessReallyExit.call(process, process.exitCode)\n}\n\nvar originalProcessEmit = process.emit\nfunction processEmit (ev, arg) {\n if (ev === 'exit') {\n if (arg !== undefined) {\n process.exitCode = arg\n }\n var ret = originalProcessEmit.apply(this, arguments)\n emit('exit', process.exitCode, null)\n /* istanbul ignore next */\n emit('afterexit', process.exitCode, null)\n return ret\n } else {\n return originalProcessEmit.apply(this, arguments)\n }\n}\n", "'use strict';\n// The Node team wants to deprecate `process.bind(...)`.\n// https://github.com/nodejs/node/pull/2768\n//\n// However, we need the 'uv' binding for errname support.\n// This is a defensive wrapper around it so `execa` will not fail entirely if it stops working someday.\n//\n// If this ever stops working. See: https://github.com/sindresorhus/execa/issues/31#issuecomment-215939939 for another possible solution.\nlet uv;\n\ntry {\n\tuv = process.binding('uv');\n\n\tif (typeof uv.errname !== 'function') {\n\t\tthrow new TypeError('uv.errname is not a function');\n\t}\n} catch (err) {\n\tconsole.error('execa/lib/errname: unable to establish process.binding(\\'uv\\')', err);\n\tuv = null;\n}\n\nfunction errname(uv, code) {\n\tif (uv) {\n\t\treturn uv.errname(code);\n\t}\n\n\tif (!(code < 0)) {\n\t\tthrow new Error('err >= 0');\n\t}\n\n\treturn `Unknown system error ${code}`;\n}\n\nmodule.exports = code => errname(uv, code);\n\n// Used for testing the fallback behavior\nmodule.exports.__test__ = errname;\n", "'use strict';\nconst alias = ['stdin', 'stdout', 'stderr'];\n\nconst hasAlias = opts => alias.some(x => Boolean(opts[x]));\n\nmodule.exports = opts => {\n\tif (!opts) {\n\t\treturn null;\n\t}\n\n\tif (opts.stdio && hasAlias(opts)) {\n\t\tthrow new Error(`It's not possible to provide \\`stdio\\` in combination with one of ${alias.map(x => `\\`${x}\\``).join(', ')}`);\n\t}\n\n\tif (typeof opts.stdio === 'string') {\n\t\treturn opts.stdio;\n\t}\n\n\tconst stdio = opts.stdio || [];\n\n\tif (!Array.isArray(stdio)) {\n\t\tthrow new TypeError(`Expected \\`stdio\\` to be of type \\`string\\` or \\`Array\\`, got \\`${typeof stdio}\\``);\n\t}\n\n\tconst result = [];\n\tconst len = Math.max(stdio.length, alias.length);\n\n\tfor (let i = 0; i < len; i++) {\n\t\tlet value = null;\n\n\t\tif (stdio[i] !== undefined) {\n\t\t\tvalue = stdio[i];\n\t\t} else if (opts[alias[i]] !== undefined) {\n\t\t\tvalue = opts[alias[i]];\n\t\t}\n\n\t\tresult[i] = value;\n\t}\n\n\treturn result;\n};\n", "'use strict';\nconst childProcess = require('child_process');\nconst util = require('util');\nconst crossSpawn = require('cross-spawn');\nconst stripEof = require('strip-eof');\nconst npmRunPath = require('npm-run-path');\nconst isStream = require('is-stream');\nconst _getStream = require('get-stream');\nconst pFinally = require('p-finally');\nconst onExit = require('signal-exit');\nconst errname = require('./lib/errname');\nconst stdio = require('./lib/stdio');\n\nconst TEN_MEGABYTES = 1000 * 1000 * 10;\n\nfunction handleArgs(cmd, args, opts) {\n\tlet parsed;\n\n\tif (opts && opts.env && opts.extendEnv !== false) {\n\t\topts.env = Object.assign({}, process.env, opts.env);\n\t}\n\n\tif (opts && opts.__winShell === true) {\n\t\tdelete opts.__winShell;\n\t\tparsed = {\n\t\t\tcommand: cmd,\n\t\t\targs,\n\t\t\toptions: opts,\n\t\t\tfile: cmd,\n\t\t\toriginal: cmd\n\t\t};\n\t} else {\n\t\tparsed = crossSpawn._parse(cmd, args, opts);\n\t}\n\n\topts = Object.assign({\n\t\tmaxBuffer: TEN_MEGABYTES,\n\t\tstripEof: true,\n\t\tpreferLocal: true,\n\t\tlocalDir: parsed.options.cwd || process.cwd(),\n\t\tencoding: 'utf8',\n\t\treject: true,\n\t\tcleanup: true\n\t}, parsed.options);\n\n\topts.stdio = stdio(opts);\n\n\tif (opts.preferLocal) {\n\t\topts.env = npmRunPath.env(Object.assign({}, opts, {cwd: opts.localDir}));\n\t}\n\n\treturn {\n\t\tcmd: parsed.command,\n\t\targs: parsed.args,\n\t\topts,\n\t\tparsed\n\t};\n}\n\nfunction handleInput(spawned, opts) {\n\tconst input = opts.input;\n\n\tif (input === null || input === undefined) {\n\t\treturn;\n\t}\n\n\tif (isStream(input)) {\n\t\tinput.pipe(spawned.stdin);\n\t} else {\n\t\tspawned.stdin.end(input);\n\t}\n}\n\nfunction handleOutput(opts, val) {\n\tif (val && opts.stripEof) {\n\t\tval = stripEof(val);\n\t}\n\n\treturn val;\n}\n\nfunction handleShell(fn, cmd, opts) {\n\tlet file = '/bin/sh';\n\tlet args = ['-c', cmd];\n\n\topts = Object.assign({}, opts);\n\n\tif (process.platform === 'win32') {\n\t\topts.__winShell = true;\n\t\tfile = process.env.comspec || 'cmd.exe';\n\t\targs = ['/s', '/c', `\"${cmd}\"`];\n\t\topts.windowsVerbatimArguments = true;\n\t}\n\n\tif (opts.shell) {\n\t\tfile = opts.shell;\n\t\tdelete opts.shell;\n\t}\n\n\treturn fn(file, args, opts);\n}\n\nfunction getStream(process, stream, encoding, maxBuffer) {\n\tif (!process[stream]) {\n\t\treturn null;\n\t}\n\n\tlet ret;\n\n\tif (encoding) {\n\t\tret = _getStream(process[stream], {\n\t\t\tencoding,\n\t\t\tmaxBuffer\n\t\t});\n\t} else {\n\t\tret = _getStream.buffer(process[stream], {maxBuffer});\n\t}\n\n\treturn ret.catch(err => {\n\t\terr.stream = stream;\n\t\terr.message = `${stream} ${err.message}`;\n\t\tthrow err;\n\t});\n}\n\nmodule.exports = (cmd, args, opts) => {\n\tlet joinedCmd = cmd;\n\n\tif (Array.isArray(args) && args.length > 0) {\n\t\tjoinedCmd += ' ' + args.join(' ');\n\t}\n\n\tconst parsed = handleArgs(cmd, args, opts);\n\tconst encoding = parsed.opts.encoding;\n\tconst maxBuffer = parsed.opts.maxBuffer;\n\n\tlet spawned;\n\ttry {\n\t\tspawned = childProcess.spawn(parsed.cmd, parsed.args, parsed.opts);\n\t} catch (err) {\n\t\treturn Promise.reject(err);\n\t}\n\n\tlet removeExitHandler;\n\tif (parsed.opts.cleanup) {\n\t\tremoveExitHandler = onExit(() => {\n\t\t\tspawned.kill();\n\t\t});\n\t}\n\n\tlet timeoutId = null;\n\tlet timedOut = false;\n\n\tconst cleanupTimeout = () => {\n\t\tif (timeoutId) {\n\t\t\tclearTimeout(timeoutId);\n\t\t\ttimeoutId = null;\n\t\t}\n\t};\n\n\tif (parsed.opts.timeout > 0) {\n\t\ttimeoutId = setTimeout(() => {\n\t\t\ttimeoutId = null;\n\t\t\ttimedOut = true;\n\t\t\tspawned.kill(parsed.opts.killSignal);\n\t\t}, parsed.opts.timeout);\n\t}\n\n\tconst processDone = new Promise(resolve => {\n\t\tspawned.on('exit', (code, signal) => {\n\t\t\tcleanupTimeout();\n\t\t\tresolve({code, signal});\n\t\t});\n\n\t\tspawned.on('error', err => {\n\t\t\tcleanupTimeout();\n\t\t\tresolve({err});\n\t\t});\n\n\t\tif (spawned.stdin) {\n\t\t\tspawned.stdin.on('error', err => {\n\t\t\t\tcleanupTimeout();\n\t\t\t\tresolve({err});\n\t\t\t});\n\t\t}\n\t});\n\n\tfunction destroy() {\n\t\tif (spawned.stdout) {\n\t\t\tspawned.stdout.destroy();\n\t\t}\n\n\t\tif (spawned.stderr) {\n\t\t\tspawned.stderr.destroy();\n\t\t}\n\t}\n\n\tconst promise = pFinally(Promise.all([\n\t\tprocessDone,\n\t\tgetStream(spawned, 'stdout', encoding, maxBuffer),\n\t\tgetStream(spawned, 'stderr', encoding, maxBuffer)\n\t]).then(arr => {\n\t\tconst result = arr[0];\n\t\tconst stdout = arr[1];\n\t\tconst stderr = arr[2];\n\n\t\tlet err = result.err;\n\t\tconst code = result.code;\n\t\tconst signal = result.signal;\n\n\t\tif (removeExitHandler) {\n\t\t\tremoveExitHandler();\n\t\t}\n\n\t\tif (err || code !== 0 || signal !== null) {\n\t\t\tif (!err) {\n\t\t\t\tlet output = '';\n\n\t\t\t\tif (Array.isArray(parsed.opts.stdio)) {\n\t\t\t\t\tif (parsed.opts.stdio[2] !== 'inherit') {\n\t\t\t\t\t\toutput += output.length > 0 ? stderr : `\\n${stderr}`;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (parsed.opts.stdio[1] !== 'inherit') {\n\t\t\t\t\t\toutput += `\\n${stdout}`;\n\t\t\t\t\t}\n\t\t\t\t} else if (parsed.opts.stdio !== 'inherit') {\n\t\t\t\t\toutput = `\\n${stderr}${stdout}`;\n\t\t\t\t}\n\n\t\t\t\terr = new Error(`Command failed: ${joinedCmd}${output}`);\n\t\t\t\terr.code = code < 0 ? errname(code) : code;\n\t\t\t}\n\n\t\t\t// TODO: missing some timeout logic for killed\n\t\t\t// https://github.com/nodejs/node/blob/master/lib/child_process.js#L203\n\t\t\t// err.killed = spawned.killed || killed;\n\t\t\terr.killed = err.killed || spawned.killed;\n\n\t\t\terr.stdout = stdout;\n\t\t\terr.stderr = stderr;\n\t\t\terr.failed = true;\n\t\t\terr.signal = signal || null;\n\t\t\terr.cmd = joinedCmd;\n\t\t\terr.timedOut = timedOut;\n\n\t\t\tif (!parsed.opts.reject) {\n\t\t\t\treturn err;\n\t\t\t}\n\n\t\t\tthrow err;\n\t\t}\n\n\t\treturn {\n\t\t\tstdout: handleOutput(parsed.opts, stdout),\n\t\t\tstderr: handleOutput(parsed.opts, stderr),\n\t\t\tcode: 0,\n\t\t\tfailed: false,\n\t\t\tkilled: false,\n\t\t\tsignal: null,\n\t\t\tcmd: joinedCmd,\n\t\t\ttimedOut: false\n\t\t};\n\t}), destroy);\n\n\tcrossSpawn._enoent.hookChildProcess(spawned, parsed.parsed);\n\n\thandleInput(spawned, parsed.opts);\n\n\tspawned.then = promise.then.bind(promise);\n\tspawned.catch = promise.catch.bind(promise);\n\n\treturn spawned;\n};\n\nmodule.exports.stdout = function () {\n\t// TODO: set `stderr: 'ignore'` when that option is implemented\n\treturn module.exports.apply(null, arguments).then(x => x.stdout);\n};\n\nmodule.exports.stderr = function () {\n\t// TODO: set `stdout: 'ignore'` when that option is implemented\n\treturn module.exports.apply(null, arguments).then(x => x.stderr);\n};\n\nmodule.exports.shell = (cmd, opts) => handleShell(module.exports, cmd, opts);\n\nmodule.exports.sync = (cmd, args, opts) => {\n\tconst parsed = handleArgs(cmd, args, opts);\n\n\tif (isStream(parsed.opts.input)) {\n\t\tthrow new TypeError('The `input` option cannot be a stream in sync mode');\n\t}\n\n\tconst result = childProcess.spawnSync(parsed.cmd, parsed.args, parsed.opts);\n\n\tif (result.error || result.status !== 0) {\n\t\tthrow (result.error || new Error(result.stderr === '' ? result.stdout : result.stderr));\n\t}\n\n\tresult.stdout = handleOutput(parsed.opts, result.stdout);\n\tresult.stderr = handleOutput(parsed.opts, result.stderr);\n\n\treturn result;\n};\n\nmodule.exports.shellSync = (cmd, opts) => handleShell(module.exports.sync, cmd, opts);\n\nmodule.exports.spawn = util.deprecate(module.exports, 'execa.spawn() is deprecated. Use execa() instead.');\n", "'use strict';\nmodule.exports = function (obj) {\n\tif (typeof obj !== 'object') {\n\t\tthrow new TypeError('Expected an object');\n\t}\n\n\tvar ret = {};\n\n\tfor (var key in obj) {\n\t\tvar val = obj[key];\n\t\tret[val] = key;\n\t}\n\n\treturn ret;\n};\n", "{\n\t\"af_ZA\": 1078,\n\t\"am_ET\": 1118,\n\t\"ar_AE\": 14337,\n\t\"ar_BH\": 15361,\n\t\"ar_DZ\": 5121,\n\t\"ar_EG\": 3073,\n\t\"ar_IQ\": 2049,\n\t\"ar_JO\": 11265,\n\t\"ar_KW\": 13313,\n\t\"ar_LB\": 12289,\n\t\"ar_LY\": 4097,\n\t\"ar_MA\": 6145,\n\t\"ar_OM\": 8193,\n\t\"ar_QA\": 16385,\n\t\"ar_SA\": 1025,\n\t\"ar_SY\": 10241,\n\t\"ar_TN\": 7169,\n\t\"ar_YE\": 9217,\n\t\"arn_CL\": 1146,\n\t\"as_IN\": 1101,\n\t\"az_AZ\": 2092,\n\t\"ba_RU\": 1133,\n\t\"be_BY\": 1059,\n\t\"bg_BG\": 1026,\n\t\"bn_IN\": 1093,\n\t\"bo_BT\": 2129,\n\t\"bo_CN\": 1105,\n\t\"br_FR\": 1150,\n\t\"bs_BA\": 8218,\n\t\"ca_ES\": 1027,\n\t\"co_FR\": 1155,\n\t\"cs_CZ\": 1029,\n\t\"cy_GB\": 1106,\n\t\"da_DK\": 1030,\n\t\"de_AT\": 3079,\n\t\"de_CH\": 2055,\n\t\"de_DE\": 1031,\n\t\"de_LI\": 5127,\n\t\"de_LU\": 4103,\n\t\"div_MV\": 1125,\n\t\"dsb_DE\": 2094,\n\t\"el_GR\": 1032,\n\t\"en_AU\": 3081,\n\t\"en_BZ\": 10249,\n\t\"en_CA\": 4105,\n\t\"en_CB\": 9225,\n\t\"en_GB\": 2057,\n\t\"en_IE\": 6153,\n\t\"en_IN\": 18441,\n\t\"en_JA\": 8201,\n\t\"en_MY\": 17417,\n\t\"en_NZ\": 5129,\n\t\"en_PH\": 13321,\n\t\"en_TT\": 11273,\n\t\"en_US\": 1033,\n\t\"en_ZA\": 7177,\n\t\"en_ZW\": 12297,\n\t\"es_AR\": 11274,\n\t\"es_BO\": 16394,\n\t\"es_CL\": 13322,\n\t\"es_CO\": 9226,\n\t\"es_CR\": 5130,\n\t\"es_DO\": 7178,\n\t\"es_EC\": 12298,\n\t\"es_ES\": 3082,\n\t\"es_GT\": 4106,\n\t\"es_HN\": 18442,\n\t\"es_MX\": 2058,\n\t\"es_NI\": 19466,\n\t\"es_PA\": 6154,\n\t\"es_PE\": 10250,\n\t\"es_PR\": 20490,\n\t\"es_PY\": 15370,\n\t\"es_SV\": 17418,\n\t\"es_UR\": 14346,\n\t\"es_US\": 21514,\n\t\"es_VE\": 8202,\n\t\"et_EE\": 1061,\n\t\"eu_ES\": 1069,\n\t\"fa_IR\": 1065,\n\t\"fi_FI\": 1035,\n\t\"fil_PH\": 1124,\n\t\"fo_FO\": 1080,\n\t\"fr_BE\": 2060,\n\t\"fr_CA\": 3084,\n\t\"fr_CH\": 4108,\n\t\"fr_FR\": 1036,\n\t\"fr_LU\": 5132,\n\t\"fr_MC\": 6156,\n\t\"fy_NL\": 1122,\n\t\"ga_IE\": 2108,\n\t\"gbz_AF\": 1164,\n\t\"gl_ES\": 1110,\n\t\"gsw_FR\": 1156,\n\t\"gu_IN\": 1095,\n\t\"ha_NG\": 1128,\n\t\"he_IL\": 1037,\n\t\"hi_IN\": 1081,\n\t\"hr_BA\": 4122,\n\t\"hr_HR\": 1050,\n\t\"hu_HU\": 1038,\n\t\"hy_AM\": 1067,\n\t\"id_ID\": 1057,\n\t\"ii_CN\": 1144,\n\t\"is_IS\": 1039,\n\t\"it_CH\": 2064,\n\t\"it_IT\": 1040,\n\t\"iu_CA\": 2141,\n\t\"ja_JP\": 1041,\n\t\"ka_GE\": 1079,\n\t\"kh_KH\": 1107,\n\t\"kk_KZ\": 1087,\n\t\"kl_GL\": 1135,\n\t\"kn_IN\": 1099,\n\t\"ko_KR\": 1042,\n\t\"kok_IN\": 1111,\n\t\"ky_KG\": 1088,\n\t\"lb_LU\": 1134,\n\t\"lo_LA\": 1108,\n\t\"lt_LT\": 1063,\n\t\"lv_LV\": 1062,\n\t\"mi_NZ\": 1153,\n\t\"mk_MK\": 1071,\n\t\"ml_IN\": 1100,\n\t\"mn_CN\": 2128,\n\t\"mn_MN\": 1104,\n\t\"moh_CA\": 1148,\n\t\"mr_IN\": 1102,\n\t\"ms_BN\": 2110,\n\t\"ms_MY\": 1086,\n\t\"mt_MT\": 1082,\n\t\"my_MM\": 1109,\n\t\"nb_NO\": 1044,\n\t\"ne_NP\": 1121,\n\t\"nl_BE\": 2067,\n\t\"nl_NL\": 1043,\n\t\"nn_NO\": 2068,\n\t\"ns_ZA\": 1132,\n\t\"oc_FR\": 1154,\n\t\"or_IN\": 1096,\n\t\"pa_IN\": 1094,\n\t\"pl_PL\": 1045,\n\t\"ps_AF\": 1123,\n\t\"pt_BR\": 1046,\n\t\"pt_PT\": 2070,\n\t\"qut_GT\": 1158,\n\t\"quz_BO\": 1131,\n\t\"quz_EC\": 2155,\n\t\"quz_PE\": 3179,\n\t\"rm_CH\": 1047,\n\t\"ro_RO\": 1048,\n\t\"ru_RU\": 1049,\n\t\"rw_RW\": 1159,\n\t\"sa_IN\": 1103,\n\t\"sah_RU\": 1157,\n\t\"se_FI\": 3131,\n\t\"se_NO\": 1083,\n\t\"se_SE\": 2107,\n\t\"si_LK\": 1115,\n\t\"sk_SK\": 1051,\n\t\"sl_SI\": 1060,\n\t\"sma_NO\": 6203,\n\t\"sma_SE\": 7227,\n\t\"smj_NO\": 4155,\n\t\"smj_SE\": 5179,\n\t\"smn_FI\": 9275,\n\t\"sms_FI\": 8251,\n\t\"sq_AL\": 1052,\n\t\"sr_BA\": 7194,\n\t\"sr_SP\": 3098,\n\t\"sv_FI\": 2077,\n\t\"sv_SE\": 1053,\n\t\"sw_KE\": 1089,\n\t\"syr_SY\": 1114,\n\t\"ta_IN\": 1097,\n\t\"te_IN\": 1098,\n\t\"tg_TJ\": 1064,\n\t\"th_TH\": 1054,\n\t\"tk_TM\": 1090,\n\t\"tmz_DZ\": 2143,\n\t\"tn_ZA\": 1074,\n\t\"tr_TR\": 1055,\n\t\"tt_RU\": 1092,\n\t\"ug_CN\": 1152,\n\t\"uk_UA\": 1058,\n\t\"ur_IN\": 2080,\n\t\"ur_PK\": 1056,\n\t\"uz_UZ\": 2115,\n\t\"vi_VN\": 1066,\n\t\"wen_DE\": 1070,\n\t\"wo_SN\": 1160,\n\t\"xh_ZA\": 1076,\n\t\"yo_NG\": 1130,\n\t\"zh_CHS\": 4,\n\t\"zh_CHT\": 31748,\n\t\"zh_CN\": 2052,\n\t\"zh_HK\": 3076,\n\t\"zh_MO\": 5124,\n\t\"zh_SG\": 4100,\n\t\"zh_TW\": 1028,\n\t\"zu_ZA\": 1077\n}\n", "'use strict';\nvar invertKv = require('invert-kv');\nvar all = require('./lcid.json');\nvar inverted = invertKv(all);\n\nexports.from = function (lcidCode) {\n\tif (typeof lcidCode !== 'number') {\n\t\tthrow new TypeError('Expected a number');\n\t}\n\n\treturn inverted[lcidCode];\n};\n\nexports.to = function (localeId) {\n\tif (typeof localeId !== 'string') {\n\t\tthrow new TypeError('Expected a string');\n\t}\n\n\treturn all[localeId];\n};\n\nexports.all = all;\n", "'use strict';\nmodule.exports = (to, from) => {\n\t// TODO: use `Reflect.ownKeys()` when targeting Node.js 6\n\tfor (const prop of Object.getOwnPropertyNames(from).concat(Object.getOwnPropertySymbols(from))) {\n\t\tObject.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop));\n\t}\n\n\treturn to;\n};\n", "'use strict';\nconst mimicFn = require('mimic-fn');\n\nconst cacheStore = new WeakMap();\n\nconst defaultCacheKey = function (x) {\n\tif (arguments.length === 1 && (x === null || x === undefined || (typeof x !== 'function' && typeof x !== 'object'))) {\n\t\treturn x;\n\t}\n\n\treturn JSON.stringify(arguments);\n};\n\nmodule.exports = (fn, opts) => {\n\topts = Object.assign({\n\t\tcacheKey: defaultCacheKey,\n\t\tcache: new Map()\n\t}, opts);\n\n\tconst memoized = function () {\n\t\tconst cache = cacheStore.get(memoized);\n\t\tconst key = opts.cacheKey.apply(null, arguments);\n\n\t\tif (cache.has(key)) {\n\t\t\tconst c = cache.get(key);\n\n\t\t\tif (typeof opts.maxAge !== 'number' || Date.now() < c.maxAge) {\n\t\t\t\treturn c.data;\n\t\t\t}\n\t\t}\n\n\t\tconst ret = fn.apply(null, arguments);\n\n\t\tcache.set(key, {\n\t\t\tdata: ret,\n\t\t\tmaxAge: Date.now() + (opts.maxAge || 0)\n\t\t});\n\n\t\treturn ret;\n\t};\n\n\tmimicFn(memoized, fn);\n\n\tcacheStore.set(memoized, opts.cache);\n\n\treturn memoized;\n};\n\nmodule.exports.clear = fn => {\n\tconst cache = cacheStore.get(fn);\n\n\tif (cache && typeof cache.clear === 'function') {\n\t\tcache.clear();\n\t}\n};\n", "'use strict';\nconst execa = require('execa');\nconst lcid = require('lcid');\nconst mem = require('mem');\n\nconst defaultOpts = {spawn: true};\nconst defaultLocale = 'en_US';\n\nfunction getEnvLocale(env) {\n\tenv = env || process.env;\n\treturn env.LC_ALL || env.LC_MESSAGES || env.LANG || env.LANGUAGE;\n}\n\nfunction parseLocale(x) {\n\tconst env = x.split('\\n').reduce((env, def) => {\n\t\tdef = def.split('=');\n\t\tenv[def[0]] = def[1].replace(/^\"|\"$/g, '');\n\t\treturn env;\n\t}, {});\n\treturn getEnvLocale(env);\n}\n\nfunction getLocale(str) {\n\treturn (str && str.replace(/[.:].*/, ''));\n}\n\nfunction getAppleLocale() {\n\treturn execa.stdout('defaults', ['read', '-g', 'AppleLocale']);\n}\n\nfunction getAppleLocaleSync() {\n\treturn execa.sync('defaults', ['read', '-g', 'AppleLocale']).stdout;\n}\n\nfunction getUnixLocale() {\n\tif (process.platform === 'darwin') {\n\t\treturn getAppleLocale();\n\t}\n\n\treturn execa.stdout('locale')\n\t\t.then(stdout => getLocale(parseLocale(stdout)));\n}\n\nfunction getUnixLocaleSync() {\n\tif (process.platform === 'darwin') {\n\t\treturn getAppleLocaleSync();\n\t}\n\n\treturn getLocale(parseLocale(execa.sync('locale').stdout));\n}\n\nfunction getWinLocale() {\n\treturn execa.stdout('wmic', ['os', 'get', 'locale'])\n\t\t.then(stdout => {\n\t\t\tconst lcidCode = parseInt(stdout.replace('Locale', ''), 16);\n\t\t\treturn lcid.from(lcidCode);\n\t\t});\n}\n\nfunction getWinLocaleSync() {\n\tconst stdout = execa.sync('wmic', ['os', 'get', 'locale']).stdout;\n\tconst lcidCode = parseInt(stdout.replace('Locale', ''), 16);\n\treturn lcid.from(lcidCode);\n}\n\nmodule.exports = mem(opts => {\n\topts = opts || defaultOpts;\n\tconst envLocale = getEnvLocale();\n\tlet thenable;\n\n\tif (envLocale || opts.spawn === false) {\n\t\tthenable = Promise.resolve(getLocale(envLocale));\n\t} else if (process.platform === 'win32') {\n\t\tthenable = getWinLocale();\n\t} else {\n\t\tthenable = getUnixLocale();\n\t}\n\n\treturn thenable.then(locale => locale || defaultLocale)\n\t\t.catch(() => defaultLocale);\n});\n\nmodule.exports.sync = mem(opts => {\n\topts = opts || defaultOpts;\n\tconst envLocale = getEnvLocale();\n\tlet res;\n\n\tif (envLocale || opts.spawn === false) {\n\t\tres = getLocale(envLocale);\n\t} else {\n\t\ttry {\n\t\t\tif (process.platform === 'win32') {\n\t\t\t\tres = getWinLocaleSync();\n\t\t\t} else {\n\t\t\t\tres = getUnixLocaleSync();\n\t\t\t}\n\t\t} catch (err) {}\n\t}\n\n\treturn res || defaultLocale;\n});\n", "'use strict'\nconst argsert = require('./lib/argsert')\nconst fs = require('fs')\nconst Command = require('./lib/command')\nconst Completion = require('./lib/completion')\nconst Parser = require('yargs-parser')\nconst path = require('path')\nconst Usage = require('./lib/usage')\nconst Validation = require('./lib/validation')\nconst Y18n = require('y18n')\nconst objFilter = require('./lib/obj-filter')\nconst setBlocking = require('set-blocking')\nconst applyExtends = require('./lib/apply-extends')\nconst YError = require('./lib/yerror')\n\nexports = module.exports = Yargs\nfunction Yargs (processArgs, cwd, parentRequire) {\n processArgs = processArgs || [] // handle calling yargs().\n\n const self = {}\n let command = null\n let completion = null\n let groups = {}\n let output = ''\n let preservedGroups = {}\n let usage = null\n let validation = null\n\n const y18n = Y18n({\n directory: path.resolve(__dirname, './locales'),\n updateFiles: false\n })\n\n if (!cwd) cwd = process.cwd()\n\n self.$0 = process.argv\n .slice(0, 2)\n .map((x, i) => {\n // ignore the node bin, specify this in your\n // bin file with #!/usr/bin/env node\n if (i === 0 && /\\b(node|iojs)(\\.exe)?$/.test(x)) return\n const b = rebase(cwd, x)\n return x.match(/^(\\/|([a-zA-Z]:)?\\\\)/) && b.length < x.length ? b : x\n })\n .join(' ').trim()\n\n if (process.env._ !== undefined && process.argv[1] === process.env._) {\n self.$0 = process.env._.replace(\n `${path.dirname(process.execPath)}/`, ''\n )\n }\n\n // use context object to keep track of resets, subcommand execution, etc\n // submodules should modify and check the state of context as necessary\n const context = { resets: -1, commands: [], fullCommands: [], files: [] }\n self.getContext = () => context\n\n // puts yargs back into an initial state. any keys\n // that have been set to \"global\" will not be reset\n // by this action.\n let options\n self.resetOptions = self.reset = function resetOptions (aliases) {\n context.resets++\n aliases = aliases || {}\n options = options || {}\n // put yargs back into an initial state, this\n // logic is used to build a nested command\n // hierarchy.\n const tmpOptions = {}\n tmpOptions.local = options.local ? options.local : []\n tmpOptions.configObjects = options.configObjects ? options.configObjects : []\n\n // if a key has been explicitly set as local,\n // we should reset it before passing options to command.\n const localLookup = {}\n tmpOptions.local.forEach((l) => {\n localLookup[l] = true\n ;(aliases[l] || []).forEach((a) => {\n localLookup[a] = true\n })\n })\n\n // preserve all groups not set to local.\n preservedGroups = Object.keys(groups).reduce((acc, groupName) => {\n const keys = groups[groupName].filter(key => !(key in localLookup))\n if (keys.length > 0) {\n acc[groupName] = keys\n }\n return acc\n }, {})\n // groups can now be reset\n groups = {}\n\n const arrayOptions = [\n 'array', 'boolean', 'string', 'skipValidation',\n 'count', 'normalize', 'number',\n 'hiddenOptions'\n ]\n\n const objectOptions = [\n 'narg', 'key', 'alias', 'default', 'defaultDescription',\n 'config', 'choices', 'demandedOptions', 'demandedCommands', 'coerce'\n ]\n\n arrayOptions.forEach((k) => {\n tmpOptions[k] = (options[k] || []).filter(k => !localLookup[k])\n })\n\n objectOptions.forEach((k) => {\n tmpOptions[k] = objFilter(options[k], (k, v) => !localLookup[k])\n })\n\n tmpOptions.envPrefix = options.envPrefix\n options = tmpOptions\n\n // if this is the first time being executed, create\n // instances of all our helpers -- otherwise just reset.\n usage = usage ? usage.reset(localLookup) : Usage(self, y18n)\n validation = validation ? validation.reset(localLookup) : Validation(self, usage, y18n)\n command = command ? command.reset() : Command(self, usage, validation)\n if (!completion) completion = Completion(self, usage, command)\n\n completionCommand = null\n output = ''\n exitError = null\n hasOutput = false\n self.parsed = false\n\n return self\n }\n self.resetOptions()\n\n // temporary hack: allow \"freezing\" of reset-able state for parse(msg, cb)\n let frozen\n function freeze () {\n frozen = {}\n frozen.options = options\n frozen.configObjects = options.configObjects.slice(0)\n frozen.exitProcess = exitProcess\n frozen.groups = groups\n usage.freeze()\n validation.freeze()\n command.freeze()\n frozen.strict = strict\n frozen.completionCommand = completionCommand\n frozen.output = output\n frozen.exitError = exitError\n frozen.hasOutput = hasOutput\n frozen.parsed = self.parsed\n }\n function unfreeze () {\n options = frozen.options\n options.configObjects = frozen.configObjects\n exitProcess = frozen.exitProcess\n groups = frozen.groups\n output = frozen.output\n exitError = frozen.exitError\n hasOutput = frozen.hasOutput\n self.parsed = frozen.parsed\n usage.unfreeze()\n validation.unfreeze()\n command.unfreeze()\n strict = frozen.strict\n completionCommand = frozen.completionCommand\n parseFn = null\n parseContext = null\n frozen = undefined\n }\n\n self.boolean = function (keys) {\n argsert('<array|string>', [keys], arguments.length)\n populateParserHintArray('boolean', keys)\n return self\n }\n\n self.array = function (keys) {\n argsert('<array|string>', [keys], arguments.length)\n populateParserHintArray('array', keys)\n return self\n }\n\n self.number = function (keys) {\n argsert('<array|string>', [keys], arguments.length)\n populateParserHintArray('number', keys)\n return self\n }\n\n self.normalize = function (keys) {\n argsert('<array|string>', [keys], arguments.length)\n populateParserHintArray('normalize', keys)\n return self\n }\n\n self.count = function (keys) {\n argsert('<array|string>', [keys], arguments.length)\n populateParserHintArray('count', keys)\n return self\n }\n\n self.string = function (keys) {\n argsert('<array|string>', [keys], arguments.length)\n populateParserHintArray('string', keys)\n return self\n }\n\n self.requiresArg = function (keys) {\n argsert('<array|string>', [keys], arguments.length)\n populateParserHintObject(self.nargs, false, 'narg', keys, 1)\n return self\n }\n\n self.skipValidation = function (keys) {\n argsert('<array|string>', [keys], arguments.length)\n populateParserHintArray('skipValidation', keys)\n return self\n }\n\n function populateParserHintArray (type, keys, value) {\n keys = [].concat(keys)\n keys.forEach((key) => {\n options[type].push(key)\n })\n }\n\n self.nargs = function (key, value) {\n argsert('<string|object|array> [number]', [key, value], arguments.length)\n populateParserHintObject(self.nargs, false, 'narg', key, value)\n return self\n }\n\n self.choices = function (key, value) {\n argsert('<object|string|array> [string|array]', [key, value], arguments.length)\n populateParserHintObject(self.choices, true, 'choices', key, value)\n return self\n }\n\n self.alias = function (key, value) {\n argsert('<object|string|array> [string|array]', [key, value], arguments.length)\n populateParserHintObject(self.alias, true, 'alias', key, value)\n return self\n }\n\n // TODO: actually deprecate self.defaults.\n self.default = self.defaults = function (key, value, defaultDescription) {\n argsert('<object|string|array> [*] [string]', [key, value, defaultDescription], arguments.length)\n if (defaultDescription) options.defaultDescription[key] = defaultDescription\n if (typeof value === 'function') {\n if (!options.defaultDescription[key]) options.defaultDescription[key] = usage.functionDescription(value)\n value = value.call()\n }\n populateParserHintObject(self.default, false, 'default', key, value)\n return self\n }\n\n self.describe = function (key, desc) {\n argsert('<object|string|array> [string]', [key, desc], arguments.length)\n populateParserHintObject(self.describe, false, 'key', key, true)\n usage.describe(key, desc)\n return self\n }\n\n self.demandOption = function (keys, msg) {\n argsert('<object|string|array> [string]', [keys, msg], arguments.length)\n populateParserHintObject(self.demandOption, false, 'demandedOptions', keys, msg)\n return self\n }\n\n self.coerce = function (keys, value) {\n argsert('<object|string|array> [function]', [keys, value], arguments.length)\n populateParserHintObject(self.coerce, false, 'coerce', keys, value)\n return self\n }\n\n function populateParserHintObject (builder, isArray, type, key, value) {\n if (Array.isArray(key)) {\n // an array of keys with one value ['x', 'y', 'z'], function parse () {}\n const temp = {}\n key.forEach((k) => {\n temp[k] = value\n })\n builder(temp)\n } else if (typeof key === 'object') {\n // an object of key value pairs: {'x': parse () {}, 'y': parse() {}}\n Object.keys(key).forEach((k) => {\n builder(k, key[k])\n })\n } else {\n // a single key value pair 'x', parse() {}\n if (isArray) {\n options[type][key] = (options[type][key] || []).concat(value)\n } else {\n options[type][key] = value\n }\n }\n }\n\n function deleteFromParserHintObject (optionKey) {\n // delete from all parsing hints:\n // boolean, array, key, alias, etc.\n Object.keys(options).forEach((hintKey) => {\n const hint = options[hintKey]\n if (Array.isArray(hint)) {\n if (~hint.indexOf(optionKey)) hint.splice(hint.indexOf(optionKey), 1)\n } else if (typeof hint === 'object') {\n delete hint[optionKey]\n }\n })\n // now delete the description from usage.js.\n delete usage.getDescriptions()[optionKey]\n }\n\n self.config = function config (key, msg, parseFn) {\n argsert('[object|string] [string|function] [function]', [key, msg, parseFn], arguments.length)\n // allow a config object to be provided directly.\n if (typeof key === 'object') {\n key = applyExtends(key, cwd)\n options.configObjects = (options.configObjects || []).concat(key)\n return self\n }\n\n // allow for a custom parsing function.\n if (typeof msg === 'function') {\n parseFn = msg\n msg = null\n }\n\n key = key || 'config'\n self.describe(key, msg || usage.deferY18nLookup('Path to JSON config file'))\n ;(Array.isArray(key) ? key : [key]).forEach((k) => {\n options.config[k] = parseFn || true\n })\n\n return self\n }\n\n self.example = function (cmd, description) {\n argsert('<string> [string]', [cmd, description], arguments.length)\n usage.example(cmd, description)\n return self\n }\n\n self.command = function (cmd, description, builder, handler, middlewares) {\n argsert('<string|array|object> [string|boolean] [function|object] [function] [array]', [cmd, description, builder, handler, middlewares], arguments.length)\n command.addHandler(cmd, description, builder, handler, middlewares)\n return self\n }\n\n self.commandDir = function (dir, opts) {\n argsert('<string> [object]', [dir, opts], arguments.length)\n const req = parentRequire || require\n command.addDirectory(dir, self.getContext(), req, require('get-caller-file')(), opts)\n return self\n }\n\n // TODO: deprecate self.demand in favor of\n // .demandCommand() .demandOption().\n self.demand = self.required = self.require = function demand (keys, max, msg) {\n // you can optionally provide a 'max' key,\n // which will raise an exception if too many '_'\n // options are provided.\n if (Array.isArray(max)) {\n max.forEach((key) => {\n self.demandOption(key, msg)\n })\n max = Infinity\n } else if (typeof max !== 'number') {\n msg = max\n max = Infinity\n }\n\n if (typeof keys === 'number') {\n self.demandCommand(keys, max, msg, msg)\n } else if (Array.isArray(keys)) {\n keys.forEach((key) => {\n self.demandOption(key, msg)\n })\n } else {\n if (typeof msg === 'string') {\n self.demandOption(keys, msg)\n } else if (msg === true || typeof msg === 'undefined') {\n self.demandOption(keys)\n }\n }\n\n return self\n }\n\n self.demandCommand = function demandCommand (min, max, minMsg, maxMsg) {\n argsert('[number] [number|string] [string|null|undefined] [string|null|undefined]', [min, max, minMsg, maxMsg], arguments.length)\n\n if (typeof min === 'undefined') min = 1\n\n if (typeof max !== 'number') {\n minMsg = max\n max = Infinity\n }\n\n self.global('_', false)\n\n options.demandedCommands._ = {\n min,\n max,\n minMsg,\n maxMsg\n }\n\n return self\n }\n\n self.getDemandedOptions = () => {\n argsert([], 0)\n return options.demandedOptions\n }\n\n self.getDemandedCommands = () => {\n argsert([], 0)\n return options.demandedCommands\n }\n\n self.implies = function (key, value) {\n argsert('<string|object> [number|string|array]', [key, value], arguments.length)\n validation.implies(key, value)\n return self\n }\n\n self.conflicts = function (key1, key2) {\n argsert('<string|object> [string|array]', [key1, key2], arguments.length)\n validation.conflicts(key1, key2)\n return self\n }\n\n self.usage = function (msg, description, builder, handler) {\n argsert('<string|null|undefined> [string|boolean] [function|object] [function]', [msg, description, builder, handler], arguments.length)\n\n if (description !== undefined) {\n // .usage() can be used as an alias for defining\n // a default command.\n if ((msg || '').match(/^\\$0( |$)/)) {\n return self.command(msg, description, builder, handler)\n } else {\n throw new YError('.usage() description must start with $0 if being used as alias for .command()')\n }\n } else {\n usage.usage(msg)\n return self\n }\n }\n\n self.epilogue = self.epilog = function (msg) {\n argsert('<string>', [msg], arguments.length)\n usage.epilog(msg)\n return self\n }\n\n self.fail = function (f) {\n argsert('<function>', [f], arguments.length)\n usage.failFn(f)\n return self\n }\n\n self.check = function (f, _global) {\n argsert('<function> [boolean]', [f, _global], arguments.length)\n validation.check(f, _global !== false)\n return self\n }\n\n self.global = function global (globals, global) {\n argsert('<string|array> [boolean]', [globals, global], arguments.length)\n globals = [].concat(globals)\n if (global !== false) {\n options.local = options.local.filter(l => globals.indexOf(l) === -1)\n } else {\n globals.forEach((g) => {\n if (options.local.indexOf(g) === -1) options.local.push(g)\n })\n }\n return self\n }\n\n self.pkgConf = function pkgConf (key, rootPath) {\n argsert('<string> [string]', [key, rootPath], arguments.length)\n let conf = null\n // prefer cwd to require-main-filename in this method\n // since we're looking for e.g. \"nyc\" config in nyc consumer\n // rather than \"yargs\" config in nyc (where nyc is the main filename)\n const obj = pkgUp(rootPath || cwd)\n\n // If an object exists in the key, add it to options.configObjects\n if (obj[key] && typeof obj[key] === 'object') {\n conf = applyExtends(obj[key], rootPath || cwd)\n options.configObjects = (options.configObjects || []).concat(conf)\n }\n\n return self\n }\n\n const pkgs = {}\n function pkgUp (rootPath) {\n const npath = rootPath || '*'\n if (pkgs[npath]) return pkgs[npath]\n const findUp = require('find-up')\n\n let obj = {}\n try {\n let startDir = rootPath || require('require-main-filename')(parentRequire || require)\n\n // When called in an environment that lacks require.main.filename, such as a jest test runner,\n // startDir is already process.cwd(), and should not be shortened.\n // Whether or not it is _actually_ a directory (e.g., extensionless bin) is irrelevant, find-up handles it.\n if (!rootPath && path.extname(startDir)) {\n startDir = path.dirname(startDir)\n }\n\n const pkgJsonPath = findUp.sync('package.json', {\n cwd: startDir\n })\n obj = JSON.parse(fs.readFileSync(pkgJsonPath))\n } catch (noop) {}\n\n pkgs[npath] = obj || {}\n return pkgs[npath]\n }\n\n let parseFn = null\n let parseContext = null\n self.parse = function parse (args, shortCircuit, _parseFn) {\n argsert('[string|array] [function|boolean|object] [function]', [args, shortCircuit, _parseFn], arguments.length)\n if (typeof args === 'undefined') args = processArgs\n\n // a context object can optionally be provided, this allows\n // additional information to be passed to a command handler.\n if (typeof shortCircuit === 'object') {\n parseContext = shortCircuit\n shortCircuit = _parseFn\n }\n\n // by providing a function as a second argument to\n // parse you can capture output that would otherwise\n // default to printing to stdout/stderr.\n if (typeof shortCircuit === 'function') {\n parseFn = shortCircuit\n shortCircuit = null\n }\n // completion short-circuits the parsing process,\n // skipping validation, etc.\n if (!shortCircuit) processArgs = args\n\n freeze()\n if (parseFn) exitProcess = false\n\n const parsed = self._parseArgs(args, shortCircuit)\n if (parseFn) parseFn(exitError, parsed, output)\n unfreeze()\n\n return parsed\n }\n\n self._getParseContext = () => parseContext || {}\n\n self._hasParseCallback = () => !!parseFn\n\n self.option = self.options = function option (key, opt) {\n argsert('<string|object> [object]', [key, opt], arguments.length)\n if (typeof key === 'object') {\n Object.keys(key).forEach((k) => {\n self.options(k, key[k])\n })\n } else {\n if (typeof opt !== 'object') {\n opt = {}\n }\n\n options.key[key] = true // track manually set keys.\n\n if (opt.alias) self.alias(key, opt.alias)\n\n const demand = opt.demand || opt.required || opt.require\n\n // deprecated, use 'demandOption' instead\n if (demand) {\n self.demand(key, demand)\n }\n\n if (opt.demandOption) {\n self.demandOption(key, typeof opt.demandOption === 'string' ? opt.demandOption : undefined)\n }\n\n if ('conflicts' in opt) {\n self.conflicts(key, opt.conflicts)\n }\n\n if ('default' in opt) {\n self.default(key, opt.default)\n }\n\n if ('implies' in opt) {\n self.implies(key, opt.implies)\n }\n\n if ('nargs' in opt) {\n self.nargs(key, opt.nargs)\n }\n\n if (opt.config) {\n self.config(key, opt.configParser)\n }\n\n if (opt.normalize) {\n self.normalize(key)\n }\n\n if ('choices' in opt) {\n self.choices(key, opt.choices)\n }\n\n if ('coerce' in opt) {\n self.coerce(key, opt.coerce)\n }\n\n if ('group' in opt) {\n self.group(key, opt.group)\n }\n\n if (opt.boolean || opt.type === 'boolean') {\n self.boolean(key)\n if (opt.alias) self.boolean(opt.alias)\n }\n\n if (opt.array || opt.type === 'array') {\n self.array(key)\n if (opt.alias) self.array(opt.alias)\n }\n\n if (opt.number || opt.type === 'number') {\n self.number(key)\n if (opt.alias) self.number(opt.alias)\n }\n\n if (opt.string || opt.type === 'string') {\n self.string(key)\n if (opt.alias) self.string(opt.alias)\n }\n\n if (opt.count || opt.type === 'count') {\n self.count(key)\n }\n\n if (typeof opt.global === 'boolean') {\n self.global(key, opt.global)\n }\n\n if (opt.defaultDescription) {\n options.defaultDescription[key] = opt.defaultDescription\n }\n\n if (opt.skipValidation) {\n self.skipValidation(key)\n }\n\n const desc = opt.describe || opt.description || opt.desc\n self.describe(key, desc)\n if (opt.hidden) {\n self.hide(key)\n }\n\n if (opt.requiresArg) {\n self.requiresArg(key)\n }\n }\n\n return self\n }\n self.getOptions = () => options\n\n self.positional = function (key, opts) {\n argsert('<string> <object>', [key, opts], arguments.length)\n if (context.resets === 0) {\n throw new YError(\".positional() can only be called in a command's builder function\")\n }\n\n // .positional() only supports a subset of the configuration\n // options availble to .option().\n const supportedOpts = ['default', 'implies', 'normalize',\n 'choices', 'conflicts', 'coerce', 'type', 'describe',\n 'desc', 'description', 'alias']\n opts = objFilter(opts, (k, v) => {\n let accept = supportedOpts.indexOf(k) !== -1\n // type can be one of string|number|boolean.\n if (k === 'type' && ['string', 'number', 'boolean'].indexOf(v) === -1) accept = false\n return accept\n })\n\n // copy over any settings that can be inferred from the command string.\n const fullCommand = context.fullCommands[context.fullCommands.length - 1]\n const parseOptions = fullCommand ? command.cmdToParseOptions(fullCommand) : {\n array: [],\n alias: {},\n default: {},\n demand: {}\n }\n Object.keys(parseOptions).forEach((pk) => {\n if (Array.isArray(parseOptions[pk])) {\n if (parseOptions[pk].indexOf(key) !== -1) opts[pk] = true\n } else {\n if (parseOptions[pk][key] && !(pk in opts)) opts[pk] = parseOptions[pk][key]\n }\n })\n self.group(key, usage.getPositionalGroupName())\n return self.option(key, opts)\n }\n\n self.group = function group (opts, groupName) {\n argsert('<string|array> <string>', [opts, groupName], arguments.length)\n const existing = preservedGroups[groupName] || groups[groupName]\n if (preservedGroups[groupName]) {\n // we now only need to track this group name in groups.\n delete preservedGroups[groupName]\n }\n\n const seen = {}\n groups[groupName] = (existing || []).concat(opts).filter((key) => {\n if (seen[key]) return false\n return (seen[key] = true)\n })\n return self\n }\n // combine explicit and preserved groups. explicit groups should be first\n self.getGroups = () => Object.assign({}, groups, preservedGroups)\n\n // as long as options.envPrefix is not undefined,\n // parser will apply env vars matching prefix to argv\n self.env = function (prefix) {\n argsert('[string|boolean]', [prefix], arguments.length)\n if (prefix === false) options.envPrefix = undefined\n else options.envPrefix = prefix || ''\n return self\n }\n\n self.wrap = function (cols) {\n argsert('<number|null|undefined>', [cols], arguments.length)\n usage.wrap(cols)\n return self\n }\n\n let strict = false\n self.strict = function (enabled) {\n argsert('[boolean]', [enabled], arguments.length)\n strict = enabled !== false\n return self\n }\n self.getStrict = () => strict\n\n self.showHelp = function (level) {\n argsert('[string|function]', [level], arguments.length)\n if (!self.parsed) self._parseArgs(processArgs) // run parser, if it has not already been executed.\n if (command.hasDefaultCommand()) {\n context.resets++ // override the restriction on top-level positoinals.\n command.runDefaultBuilderOn(self, true)\n }\n usage.showHelp(level)\n return self\n }\n\n let versionOpt = null\n self.version = function version (opt, msg, ver) {\n const defaultVersionOpt = 'version'\n argsert('[boolean|string] [string] [string]', [opt, msg, ver], arguments.length)\n\n // nuke the key previously configured\n // to return version #.\n if (versionOpt) {\n deleteFromParserHintObject(versionOpt)\n usage.version(undefined)\n versionOpt = null\n }\n\n if (arguments.length === 0) {\n ver = guessVersion()\n opt = defaultVersionOpt\n } else if (arguments.length === 1) {\n if (opt === false) { // disable default 'version' key.\n return self\n }\n ver = opt\n opt = defaultVersionOpt\n } else if (arguments.length === 2) {\n ver = msg\n msg = null\n }\n\n versionOpt = typeof opt === 'string' ? opt : defaultVersionOpt\n msg = msg || usage.deferY18nLookup('Show version number')\n\n usage.version(ver || undefined)\n self.boolean(versionOpt)\n self.describe(versionOpt, msg)\n return self\n }\n\n function guessVersion () {\n const obj = pkgUp()\n\n return obj.version || 'unknown'\n }\n\n let helpOpt = null\n self.addHelpOpt = self.help = function addHelpOpt (opt, msg) {\n const defaultHelpOpt = 'help'\n argsert('[string|boolean] [string]', [opt, msg], arguments.length)\n\n // nuke the key previously configured\n // to return help.\n if (helpOpt) {\n deleteFromParserHintObject(helpOpt)\n helpOpt = null\n }\n\n if (arguments.length === 1) {\n if (opt === false) return self\n }\n\n // use arguments, fallback to defaults for opt and msg\n helpOpt = typeof opt === 'string' ? opt : defaultHelpOpt\n self.boolean(helpOpt)\n self.describe(helpOpt, msg || usage.deferY18nLookup('Show help'))\n return self\n }\n\n const defaultShowHiddenOpt = 'show-hidden'\n options.showHiddenOpt = defaultShowHiddenOpt\n self.addShowHiddenOpt = self.showHidden = function addShowHiddenOpt (opt, msg) {\n argsert('[string|boolean] [string]', [opt, msg], arguments.length)\n\n if (arguments.length === 1) {\n if (opt === false) return self\n }\n\n const showHiddenOpt = typeof opt === 'string' ? opt : defaultShowHiddenOpt\n self.boolean(showHiddenOpt)\n self.describe(showHiddenOpt, msg || usage.deferY18nLookup('Show hidden options'))\n options.showHiddenOpt = showHiddenOpt\n return self\n }\n\n self.hide = function hide (key) {\n argsert('<string|object>', [key], arguments.length)\n options.hiddenOptions.push(key)\n return self\n }\n\n self.showHelpOnFail = function showHelpOnFail (enabled, message) {\n argsert('[boolean|string] [string]', [enabled, message], arguments.length)\n usage.showHelpOnFail(enabled, message)\n return self\n }\n\n var exitProcess = true\n self.exitProcess = function (enabled) {\n argsert('[boolean]', [enabled], arguments.length)\n if (typeof enabled !== 'boolean') {\n enabled = true\n }\n exitProcess = enabled\n return self\n }\n self.getExitProcess = () => exitProcess\n\n var completionCommand = null\n self.completion = function (cmd, desc, fn) {\n argsert('[string] [string|boolean|function] [function]', [cmd, desc, fn], arguments.length)\n\n // a function to execute when generating\n // completions can be provided as the second\n // or third argument to completion.\n if (typeof desc === 'function') {\n fn = desc\n desc = null\n }\n\n // register the completion command.\n completionCommand = cmd || 'completion'\n if (!desc && desc !== false) {\n desc = 'generate bash completion script'\n }\n self.command(completionCommand, desc)\n\n // a function can be provided\n if (fn) completion.registerFunction(fn)\n\n return self\n }\n\n self.showCompletionScript = function ($0) {\n argsert('[string]', [$0], arguments.length)\n $0 = $0 || self.$0\n _logger.log(completion.generateCompletionScript($0, completionCommand))\n return self\n }\n\n self.getCompletion = function (args, done) {\n argsert('<array> <function>', [args, done], arguments.length)\n completion.getCompletion(args, done)\n }\n\n self.locale = function (locale) {\n argsert('[string]', [locale], arguments.length)\n if (arguments.length === 0) {\n guessLocale()\n return y18n.getLocale()\n }\n detectLocale = false\n y18n.setLocale(locale)\n return self\n }\n\n self.updateStrings = self.updateLocale = function (obj) {\n argsert('<object>', [obj], arguments.length)\n detectLocale = false\n y18n.updateLocale(obj)\n return self\n }\n\n let detectLocale = true\n self.detectLocale = function (detect) {\n argsert('<boolean>', [detect], arguments.length)\n detectLocale = detect\n return self\n }\n self.getDetectLocale = () => detectLocale\n\n var hasOutput = false\n var exitError = null\n // maybe exit, always capture\n // context about why we wanted to exit.\n self.exit = (code, err) => {\n hasOutput = true\n exitError = err\n if (exitProcess) process.exit(code)\n }\n\n // we use a custom logger that buffers output,\n // so that we can print to non-CLIs, e.g., chat-bots.\n const _logger = {\n log () {\n const args = []\n for (let i = 0; i < arguments.length; i++) args.push(arguments[i])\n if (!self._hasParseCallback()) console.log.apply(console, args)\n hasOutput = true\n if (output.length) output += '\\n'\n output += args.join(' ')\n },\n error () {\n const args = []\n for (let i = 0; i < arguments.length; i++) args.push(arguments[i])\n if (!self._hasParseCallback()) console.error.apply(console, args)\n hasOutput = true\n if (output.length) output += '\\n'\n output += args.join(' ')\n }\n }\n self._getLoggerInstance = () => _logger\n // has yargs output an error our help\n // message in the current execution context.\n self._hasOutput = () => hasOutput\n\n self._setHasOutput = () => {\n hasOutput = true\n }\n\n let recommendCommands\n self.recommendCommands = function (recommend) {\n argsert('[boolean]', [recommend], arguments.length)\n recommendCommands = typeof recommend === 'boolean' ? recommend : true\n return self\n }\n\n self.getUsageInstance = () => usage\n\n self.getValidationInstance = () => validation\n\n self.getCommandInstance = () => command\n\n self.terminalWidth = () => {\n argsert([], 0)\n return typeof process.stdout.columns !== 'undefined' ? process.stdout.columns : null\n }\n\n Object.defineProperty(self, 'argv', {\n get: () => self._parseArgs(processArgs),\n enumerable: true\n })\n\n self._parseArgs = function parseArgs (args, shortCircuit, _skipValidation, commandIndex) {\n let skipValidation = !!_skipValidation\n args = args || processArgs\n\n options.__ = y18n.__\n options.configuration = pkgUp()['yargs'] || {}\n\n const parsed = Parser.detailed(args, options)\n let argv = parsed.argv\n if (parseContext) argv = Object.assign({}, argv, parseContext)\n const aliases = parsed.aliases\n\n argv.$0 = self.$0\n self.parsed = parsed\n\n try {\n guessLocale() // guess locale lazily, so that it can be turned off in chain.\n\n // while building up the argv object, there\n // are two passes through the parser. If completion\n // is being performed short-circuit on the first pass.\n if (shortCircuit) {\n return argv\n }\n\n // if there's a handler associated with a\n // command defer processing to it.\n if (helpOpt) {\n // consider any multi-char helpOpt alias as a valid help command\n // unless all helpOpt aliases are single-char\n // note that parsed.aliases is a normalized bidirectional map :)\n const helpCmds = [helpOpt]\n .concat(aliases[helpOpt] || [])\n .filter(k => k.length > 1)\n // check if help should trigger and strip it from _.\n if (~helpCmds.indexOf(argv._[argv._.length - 1])) {\n argv._.pop()\n argv[helpOpt] = true\n }\n }\n const handlerKeys = command.getCommands()\n const skipDefaultCommand = argv[helpOpt] && (handlerKeys.length > 1 || handlerKeys[0] !== '$0')\n\n if (argv._.length) {\n if (handlerKeys.length) {\n let firstUnknownCommand\n for (let i = (commandIndex || 0), cmd; argv._[i] !== undefined; i++) {\n cmd = String(argv._[i])\n if (~handlerKeys.indexOf(cmd) && cmd !== completionCommand) {\n setPlaceholderKeys(argv)\n // commands are executed using a recursive algorithm that executes\n // the deepest command first; we keep track of the position in the\n // argv._ array that is currently being executed.\n return command.runCommand(cmd, self, parsed, i + 1)\n } else if (!firstUnknownCommand && cmd !== completionCommand) {\n firstUnknownCommand = cmd\n break\n }\n }\n\n // run the default command, if defined\n if (command.hasDefaultCommand() && !skipDefaultCommand) {\n setPlaceholderKeys(argv)\n return command.runCommand(null, self, parsed)\n }\n\n // recommend a command if recommendCommands() has\n // been enabled, and no commands were found to execute\n if (recommendCommands && firstUnknownCommand && !argv[helpOpt]) {\n validation.recommendCommands(firstUnknownCommand, handlerKeys)\n }\n }\n\n // generate a completion script for adding to ~/.bashrc.\n if (completionCommand && ~argv._.indexOf(completionCommand) && !argv[completion.completionKey]) {\n if (exitProcess) setBlocking(true)\n self.showCompletionScript()\n self.exit(0)\n }\n } else if (command.hasDefaultCommand() && !skipDefaultCommand) {\n setPlaceholderKeys(argv)\n return command.runCommand(null, self, parsed)\n }\n\n // we must run completions first, a user might\n // want to complete the --help or --version option.\n if (completion.completionKey in argv) {\n if (exitProcess) setBlocking(true)\n\n // we allow for asynchronous completions,\n // e.g., loading in a list of commands from an API.\n const completionArgs = args.slice(args.indexOf(`--${completion.completionKey}`) + 1)\n completion.getCompletion(completionArgs, (completions) => {\n ;(completions || []).forEach((completion) => {\n _logger.log(completion)\n })\n\n self.exit(0)\n })\n return setPlaceholderKeys(argv)\n }\n\n // Handle 'help' and 'version' options\n // if we haven't already output help!\n if (!hasOutput) {\n Object.keys(argv).forEach((key) => {\n if (key === helpOpt && argv[key]) {\n if (exitProcess) setBlocking(true)\n\n skipValidation = true\n self.showHelp('log')\n self.exit(0)\n } else if (key === versionOpt && argv[key]) {\n if (exitProcess) setBlocking(true)\n\n skipValidation = true\n usage.showVersion()\n self.exit(0)\n }\n })\n }\n\n // Check if any of the options to skip validation were provided\n if (!skipValidation && options.skipValidation.length > 0) {\n skipValidation = Object.keys(argv).some(key => options.skipValidation.indexOf(key) >= 0 && argv[key] === true)\n }\n\n // If the help or version options where used and exitProcess is false,\n // or if explicitly skipped, we won't run validations.\n if (!skipValidation) {\n if (parsed.error) throw new YError(parsed.error.message)\n\n // if we're executed via bash completion, don't\n // bother with validation.\n if (!argv[completion.completionKey]) {\n self._runValidation(argv, aliases, {}, parsed.error)\n }\n }\n } catch (err) {\n if (err instanceof YError) usage.fail(err.message, err)\n else throw err\n }\n\n return setPlaceholderKeys(argv)\n }\n\n self._runValidation = function runValidation (argv, aliases, positionalMap, parseErrors) {\n if (parseErrors) throw new YError(parseErrors.message)\n validation.nonOptionCount(argv)\n validation.requiredArguments(argv)\n if (strict) validation.unknownArguments(argv, aliases, positionalMap)\n validation.customChecks(argv, aliases)\n validation.limitedChoices(argv)\n validation.implications(argv)\n validation.conflicting(argv)\n }\n\n function guessLocale () {\n if (!detectLocale) return\n\n try {\n const osLocale = require('os-locale')\n self.locale(osLocale.sync({ spawn: false }))\n } catch (err) {\n // if we explode looking up locale just noop\n // we'll keep using the default language 'en'.\n }\n }\n\n function setPlaceholderKeys (argv) {\n Object.keys(options.key).forEach((key) => {\n // don't set placeholder keys for dot\n // notation options 'foo.bar'.\n if (~key.indexOf('.')) return\n if (typeof argv[key] === 'undefined') argv[key] = undefined\n })\n return argv\n }\n\n // an app should almost always have --version and --help,\n // if you *really* want to disable this use .help(false)/.version(false).\n self.help()\n self.version()\n\n return self\n}\n\n// rebase an absolute path to a relative one with respect to a base directory\n// exported for tests\nexports.rebase = rebase\nfunction rebase (base, dir) {\n return path.relative(base, dir)\n}\n", "'use strict'\n// classic singleton yargs API, to use yargs\n// without running as a singleton do:\n// require('yargs/yargs')(process.argv.slice(2))\nconst yargs = require('./yargs')\n\nArgv(process.argv.slice(2))\n\nmodule.exports = Argv\n\nfunction Argv (processArgs, cwd) {\n const argv = yargs(processArgs, cwd, require)\n singletonify(argv)\n return argv\n}\n\n/* Hack an instance of Argv with process.argv into Argv\n so people can do\n require('yargs')(['--beeble=1','-z','zizzle']).argv\n to parse a list of args and\n require('yargs').argv\n to get a parsed version of process.argv.\n*/\nfunction singletonify (inst) {\n Object.keys(inst).forEach((key) => {\n if (key === 'argv') {\n Argv.__defineGetter__(key, inst.__lookupGetter__(key))\n } else {\n Argv[key] = typeof inst[key] === 'function' ? inst[key].bind(inst) : inst[key]\n }\n })\n}\n", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.requireModule = requireModule;\nexports.getModulePath = getModulePath;\nexports.getPrettierConfig = getPrettierConfig;\n\nvar _requireRelative = require(\"require-relative\");\n\nvar _requireRelative2 = _interopRequireDefault(_requireRelative);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction requireModule(modulePath) {\n try {\n return require(modulePath);\n } catch (error) {\n throw error;\n }\n}\n\nfunction getModulePath(filePath, moduleName) {\n try {\n return _requireRelative2.default.resolve(moduleName, filePath);\n } catch (error) {\n return require.resolve(moduleName);\n }\n}\n\nfunction getPrettierConfig(filePath) {\n var prettier = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : requireModule(getModulePath(filePath, \"prettier\"));\n\n return prettier.resolveConfig && prettier.resolveConfig.sync && prettier.resolveConfig.sync(filePath) || {};\n}", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typescript = require(\"typescript\");\n\nvar _typescript2 = _interopRequireDefault(_typescript);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar createProgram = function createProgram(filepath) {\n var program = _typescript2.default.createProgram([filepath], {\n noResolve: true,\n target: _typescript2.default.ScriptTarget.Latest,\n jsx: \"preserve\"\n });\n\n // This ensures the `parent` property of every node exists. More info here: https://github.com/Microsoft/TypeScript/issues/14464#issuecomment-284533993\n program.getTypeChecker();\n\n return program;\n};\n\nexports.default = createProgram;", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _fs = require(\"fs\");\n\nvar _utils = require(\"./utils\");\n\nvar _createProgram = require(\"./create-program\");\n\nvar _createProgram2 = _interopRequireDefault(_createProgram);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @returns true iff output === input\n */\nvar runTsLint = function runTsLint(filepath, fix) {\n var tslint = (0, _utils.requireModule)((0, _utils.getModulePath)(filepath, \"tslint\"));\n var code = (0, _fs.readFileSync)(filepath, \"utf8\");\n var config = tslint.Configuration.findConfiguration(null, filepath).results;\n\n var program = (0, _createProgram2.default)(filepath);\n\n // TODO(azz): This actually writes over the file, we don't really want that...\n var linter = new tslint.Linter({ fix }, program);\n\n linter.lint(filepath, code, config);\n var result = linter.getResult();\n if (fix) {\n // There were no fixes applied\n return result.fixes.length === 0;\n } else {\n // There were no auto-fixable problems\n return !result.failures.find(function (failure) {\n return failure.fix;\n });\n }\n};\n\nexports.default = runTsLint;", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _fs = require(\"fs\");\n\nvar _utils = require(\"./utils\");\n\n/**\n * @returns true iff output === input\n */\nvar runPrettier = function runPrettier(filepath, fix) {\n var prettier = (0, _utils.requireModule)((0, _utils.getModulePath)(filepath, \"prettier\"));\n var config = (0, _utils.getPrettierConfig)(filepath, prettier);\n var code = (0, _fs.readFileSync)(filepath, \"utf8\");\n var options = Object.assign({ filepath }, config);\n\n if (fix) {\n var output = prettier.format(code, options);\n if (output !== code) {\n (0, _fs.writeFileSync)(filepath, output);\n return false;\n }\n return true;\n } else {\n return prettier.check(code, options);\n }\n};\n\nexports.default = runPrettier;", "'use strict';\n\nvar _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nmodule.exports = function () {\n return new IgnoreBase();\n};\n\n// A simple implementation of make-array\nfunction make_array(subject) {\n return Array.isArray(subject) ? subject : [subject];\n}\n\nvar REGEX_BLANK_LINE = /^\\s+$/;\nvar REGEX_LEADING_EXCAPED_EXCLAMATION = /^\\\\\\!/;\nvar REGEX_LEADING_EXCAPED_HASH = /^\\\\#/;\nvar SLASH = '/';\nvar KEY_IGNORE = typeof Symbol !== 'undefined' ? Symbol.for('node-ignore')\n/* istanbul ignore next */\n: 'node-ignore';\n\nvar IgnoreBase = function () {\n function IgnoreBase() {\n _classCallCheck(this, IgnoreBase);\n\n this._rules = [];\n this[KEY_IGNORE] = true;\n this._initCache();\n }\n\n _createClass(IgnoreBase, [{\n key: '_initCache',\n value: function _initCache() {\n this._cache = {};\n }\n\n // @param {Array.<string>|string|Ignore} pattern\n\n }, {\n key: 'add',\n value: function add(pattern) {\n this._added = false;\n\n if (typeof pattern === 'string') {\n pattern = pattern.split(/\\r?\\n/g);\n }\n\n make_array(pattern).forEach(this._addPattern, this);\n\n // Some rules have just added to the ignore,\n // making the behavior changed.\n if (this._added) {\n this._initCache();\n }\n\n return this;\n }\n\n // legacy\n\n }, {\n key: 'addPattern',\n value: function addPattern(pattern) {\n return this.add(pattern);\n }\n }, {\n key: '_addPattern',\n value: function _addPattern(pattern) {\n // #32\n if (pattern && pattern[KEY_IGNORE]) {\n this._rules = this._rules.concat(pattern._rules);\n this._added = true;\n return;\n }\n\n if (this._checkPattern(pattern)) {\n var rule = this._createRule(pattern);\n this._added = true;\n this._rules.push(rule);\n }\n }\n }, {\n key: '_checkPattern',\n value: function _checkPattern(pattern) {\n // > A blank line matches no files, so it can serve as a separator for readability.\n return pattern && typeof pattern === 'string' && !REGEX_BLANK_LINE.test(pattern)\n\n // > A line starting with # serves as a comment.\n && pattern.indexOf('#') !== 0;\n }\n }, {\n key: 'filter',\n value: function filter(paths) {\n var _this = this;\n\n return make_array(paths).filter(function (path) {\n return _this._filter(path);\n });\n }\n }, {\n key: 'createFilter',\n value: function createFilter() {\n var _this2 = this;\n\n return function (path) {\n return _this2._filter(path);\n };\n }\n }, {\n key: 'ignores',\n value: function ignores(path) {\n return !this._filter(path);\n }\n }, {\n key: '_createRule',\n value: function _createRule(pattern) {\n var origin = pattern;\n var negative = false;\n\n // > An optional prefix \"!\" which negates the pattern;\n if (pattern.indexOf('!') === 0) {\n negative = true;\n pattern = pattern.substr(1);\n }\n\n pattern = pattern\n // > Put a backslash (\"\\\") in front of the first \"!\" for patterns that begin with a literal \"!\", for example, `\"\\!important!.txt\"`.\n .replace(REGEX_LEADING_EXCAPED_EXCLAMATION, '!')\n // > Put a backslash (\"\\\") in front of the first hash for patterns that begin with a hash.\n .replace(REGEX_LEADING_EXCAPED_HASH, '#');\n\n var regex = make_regex(pattern, negative);\n\n return {\n origin: origin,\n pattern: pattern,\n negative: negative,\n regex: regex\n };\n }\n\n // @returns `Boolean` true if the `path` is NOT ignored\n\n }, {\n key: '_filter',\n value: function _filter(path, slices) {\n if (!path) {\n return false;\n }\n\n if (path in this._cache) {\n return this._cache[path];\n }\n\n if (!slices) {\n // path/to/a.js\n // ['path', 'to', 'a.js']\n slices = path.split(SLASH);\n }\n\n slices.pop();\n\n return this._cache[path] = slices.length\n // > It is not possible to re-include a file if a parent directory of that file is excluded.\n // If the path contains a parent directory, check the parent first\n ? this._filter(slices.join(SLASH) + SLASH, slices) && this._test(path)\n\n // Or only test the path\n : this._test(path);\n }\n\n // @returns {Boolean} true if a file is NOT ignored\n\n }, {\n key: '_test',\n value: function _test(path) {\n // Explicitly define variable type by setting matched to `0`\n var matched = 0;\n\n this._rules.forEach(function (rule) {\n // if matched = true, then we only test negative rules\n // if matched = false, then we test non-negative rules\n if (!(matched ^ rule.negative)) {\n matched = rule.negative ^ rule.regex.test(path);\n }\n });\n\n return !matched;\n }\n }]);\n\n return IgnoreBase;\n}();\n\n// > If the pattern ends with a slash,\n// > it is removed for the purpose of the following description,\n// > but it would only find a match with a directory.\n// > In other words, foo/ will match a directory foo and paths underneath it,\n// > but will not match a regular file or a symbolic link foo\n// > (this is consistent with the way how pathspec works in general in Git).\n// '`foo/`' will not match regular file '`foo`' or symbolic link '`foo`'\n// -> ignore-rules will not deal with it, because it costs extra `fs.stat` call\n// you could use option `mark: true` with `glob`\n\n// '`foo/`' should not continue with the '`..`'\n\n\nvar DEFAULT_REPLACER_PREFIX = [\n\n// > Trailing spaces are ignored unless they are quoted with backslash (\"\\\")\n[\n// (a\\ ) -> (a )\n// (a ) -> (a)\n// (a \\ ) -> (a )\n/\\\\?\\s+$/, function (match) {\n return match.indexOf('\\\\') === 0 ? ' ' : '';\n}],\n\n// replace (\\ ) with ' '\n[/\\\\\\s/g, function () {\n return ' ';\n}],\n\n// Escape metacharacters\n// which is written down by users but means special for regular expressions.\n\n// > There are 12 characters with special meanings:\n// > - the backslash \\,\n// > - the caret ^,\n// > - the dollar sign $,\n// > - the period or dot .,\n// > - the vertical bar or pipe symbol |,\n// > - the question mark ?,\n// > - the asterisk or star *,\n// > - the plus sign +,\n// > - the opening parenthesis (,\n// > - the closing parenthesis ),\n// > - and the opening square bracket [,\n// > - the opening curly brace {,\n// > These special characters are often called \"metacharacters\".\n[/[\\\\\\^$.|?*+()\\[{]/g, function (match) {\n return '\\\\' + match;\n}],\n\n// leading slash\n[\n\n// > A leading slash matches the beginning of the pathname.\n// > For example, \"/*.c\" matches \"cat-file.c\" but not \"mozilla-sha1/sha1.c\".\n// A leading slash matches the beginning of the pathname\n/^\\//, function () {\n return '^';\n}],\n\n// replace special metacharacter slash after the leading slash\n[/\\//g, function () {\n return '\\\\/';\n}], [\n// > A leading \"**\" followed by a slash means match in all directories.\n// > For example, \"**/foo\" matches file or directory \"foo\" anywhere,\n// > the same as pattern \"foo\".\n// > \"**/foo/bar\" matches file or directory \"bar\" anywhere that is directly under directory \"foo\".\n// Notice that the '*'s have been replaced as '\\\\*'\n/^\\^*\\\\\\*\\\\\\*\\\\\\//,\n\n// '**/foo' <-> 'foo'\nfunction () {\n return '^(?:.*\\\\/)?';\n}]];\n\nvar DEFAULT_REPLACER_SUFFIX = [\n// starting\n[\n// there will be no leading '/' (which has been replaced by section \"leading slash\")\n// If starts with '**', adding a '^' to the regular expression also works\n/^(?=[^\\^])/, function () {\n return !/\\/(?!$)/.test(this)\n // > If the pattern does not contain a slash /, Git treats it as a shell glob pattern\n // Actually, if there is only a trailing slash, git also treats it as a shell glob pattern\n ? '(?:^|\\\\/)'\n\n // > Otherwise, Git treats the pattern as a shell glob suitable for consumption by fnmatch(3)\n : '^';\n}],\n\n// two globstars\n[\n// Use lookahead assertions so that we could match more than one `'/**'`\n/\\\\\\/\\\\\\*\\\\\\*(?=\\\\\\/|$)/g,\n\n// Zero, one or several directories\n// should not use '*', or it will be replaced by the next replacer\n\n// Check if it is not the last `'/**'`\nfunction (match, index, str) {\n return index + 6 < str.length\n\n // case: /**/\n // > A slash followed by two consecutive asterisks then a slash matches zero or more directories.\n // > For example, \"a/**/b\" matches \"a/b\", \"a/x/b\", \"a/x/y/b\" and so on.\n // '/**/'\n ? '(?:\\\\/[^\\\\/]+)*'\n\n // case: /**\n // > A trailing `\"/**\"` matches everything inside.\n\n // #21: everything inside but it should not include the current folder\n : '\\\\/.+';\n}],\n\n// intermediate wildcards\n[\n// Never replace escaped '*'\n// ignore rule '\\*' will match the path '*'\n\n// 'abc.*/' -> go\n// 'abc.*' -> skip this rule\n/(^|[^\\\\]+)\\\\\\*(?=.+)/g,\n\n// '*.js' matches '.js'\n// '*.js' doesn't match 'abc'\nfunction (match, p1) {\n return p1 + '[^\\\\/]*';\n}],\n\n// trailing wildcard\n[/(\\^|\\\\\\/)?\\\\\\*$/, function (match, p1) {\n return (p1\n // '\\^':\n // '/*' does not match ''\n // '/*' does not match everything\n\n // '\\\\\\/':\n // 'abc/*' does not match 'abc/'\n ? p1 + '[^/]+'\n\n // 'a*' matches 'a'\n // 'a*' matches 'aa'\n : '[^/]*') + '(?=$|\\\\/$)';\n}], [\n// unescape\n/\\\\\\\\\\\\/g, function () {\n return '\\\\';\n}]];\n\nvar POSITIVE_REPLACERS = [].concat(DEFAULT_REPLACER_PREFIX, [\n\n// 'f'\n// matches\n// - /f(end)\n// - /f/\n// - (start)f(end)\n// - (start)f/\n// doesn't match\n// - oof\n// - foo\n// pseudo:\n// -> (^|/)f(/|$)\n\n// ending\n[\n// 'js' will not match 'js.'\n// 'ab' will not match 'abc'\n/(?:[^*\\/])$/,\n\n// 'js*' will not match 'a.js'\n// 'js/' will not match 'a.js'\n// 'js' will match 'a.js' and 'a.js/'\nfunction (match) {\n return match + '(?=$|\\\\/)';\n}]], DEFAULT_REPLACER_SUFFIX);\n\nvar NEGATIVE_REPLACERS = [].concat(DEFAULT_REPLACER_PREFIX, [\n\n// #24, #38\n// The MISSING rule of [gitignore docs](https://git-scm.com/docs/gitignore)\n// A negative pattern without a trailing wildcard should not\n// re-include the things inside that directory.\n\n// eg:\n// ['node_modules/*', '!node_modules']\n// should ignore `node_modules/a.js`\n[/(?:[^*])$/, function (match) {\n return match + '(?=$|\\\\/$)';\n}]], DEFAULT_REPLACER_SUFFIX);\n\n// A simple cache, because an ignore rule only has only one certain meaning\nvar cache = {};\n\n// @param {pattern}\nfunction make_regex(pattern, negative) {\n var r = cache[pattern];\n if (r) {\n return r;\n }\n\n var replacers = negative ? NEGATIVE_REPLACERS : POSITIVE_REPLACERS;\n\n var source = replacers.reduce(function (prev, current) {\n return prev.replace(current[0], current[1].bind(pattern));\n }, pattern);\n\n return cache[pattern] = new RegExp(source, 'i');\n}\n\n// Windows\n// --------------------------------------------------------------\n/* istanbul ignore if */\nif (\n// Detect `process` so that it can run in browsers.\ntypeof process !== 'undefined' && (process.env && process.env.IGNORE_TEST_WIN32 || process.platform === 'win32')) {\n\n var filter = IgnoreBase.prototype._filter;\n var make_posix = function make_posix(str) {\n return (/^\\\\\\\\\\?\\\\/.test(str) || /[^\\x00-\\x80]+/.test(str) ? str : str.replace(/\\\\/g, '/')\n );\n };\n\n IgnoreBase.prototype._filter = function (path, slices) {\n path = make_posix(path);\n return filter.call(this, path, slices);\n };\n}\n", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _fs = require(\"fs\");\n\nvar _path = require(\"path\");\n\nvar _path2 = _interopRequireDefault(_path);\n\nvar _ignore = require(\"ignore\");\n\nvar _ignore2 = _interopRequireDefault(_ignore);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar createIgnorer = function createIgnorer() {\n var ignorePath = _path2.default.resolve(process.cwd(), \".prettierignore\");\n if ((0, _fs.existsSync)(ignorePath)) {\n var ignorer = (0, _ignore2.default)().add((0, _fs.readFileSync)(ignorePath, \"utf8\"));\n return function (filePath) {\n return ignorer.ignores(_path2.default.relative(process.cwd(), filePath));\n };\n }\n\n return function () {\n return false;\n };\n};\n\nexports.default = createIgnorer;", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _runTslint = require(\"./run-tslint\");\n\nvar _runTslint2 = _interopRequireDefault(_runTslint);\n\nvar _runPrettier = require(\"./run-prettier\");\n\nvar _runPrettier2 = _interopRequireDefault(_runPrettier);\n\nvar _createIgnorer = require(\"./create-ignorer\");\n\nvar _createIgnorer2 = _interopRequireDefault(_createIgnorer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar fix = function fix(filePath) {\n var isIgnored = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _createIgnorer2.default)();\n\n if (isIgnored(filePath)) {\n return null;\n }\n var prettierCheck = (0, _runPrettier2.default)(filePath, true);\n var tslintCheck = (0, _runTslint2.default)(filePath, true);\n return prettierCheck && tslintCheck;\n};\n\nexports.default = fix;", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _runTslint = require(\"./run-tslint\");\n\nvar _runTslint2 = _interopRequireDefault(_runTslint);\n\nvar _runPrettier = require(\"./run-prettier\");\n\nvar _runPrettier2 = _interopRequireDefault(_runPrettier);\n\nvar _createIgnorer = require(\"./create-ignorer\");\n\nvar _createIgnorer2 = _interopRequireDefault(_createIgnorer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar check = function check(filePath) {\n var isIgnored = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _createIgnorer2.default)();\n\n if (isIgnored(filePath)) {\n return null;\n }\n return (0, _runPrettier2.default)(filePath, false) && (0, _runTslint2.default)(filePath, false);\n};\n\nexports.default = check;", "'use strict';\n\n// there's 3 implementations written in increasing order of efficiency\n\n// 1 - no Set type is defined\nfunction uniqNoSet(arr) {\n\tvar ret = [];\n\n\tfor (var i = 0; i < arr.length; i++) {\n\t\tif (ret.indexOf(arr[i]) === -1) {\n\t\t\tret.push(arr[i]);\n\t\t}\n\t}\n\n\treturn ret;\n}\n\n// 2 - a simple Set type is defined\nfunction uniqSet(arr) {\n\tvar seen = new Set();\n\treturn arr.filter(function (el) {\n\t\tif (!seen.has(el)) {\n\t\t\tseen.add(el);\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t});\n}\n\n// 3 - a standard Set type is defined and it has a forEach method\nfunction uniqSetWithForEach(arr) {\n\tvar ret = [];\n\n\t(new Set(arr)).forEach(function (el) {\n\t\tret.push(el);\n\t});\n\n\treturn ret;\n}\n\n// V8 currently has a broken implementation\n// https://github.com/joyent/node/issues/8449\nfunction doesForEachActuallyWork() {\n\tvar ret = false;\n\n\t(new Set([true])).forEach(function (el) {\n\t\tret = el;\n\t});\n\n\treturn ret === true;\n}\n\nif ('Set' in global) {\n\tif (typeof Set.prototype.forEach === 'function' && doesForEachActuallyWork()) {\n\t\tmodule.exports = uniqSetWithForEach;\n\t} else {\n\t\tmodule.exports = uniqSet;\n\t}\n} else {\n\tmodule.exports = uniqNoSet;\n}\n", "'use strict';\nvar arrayUniq = require('array-uniq');\n\nmodule.exports = function () {\n\treturn arrayUniq([].concat.apply([], arguments));\n};\n", "exports.setopts = setopts\nexports.ownProp = ownProp\nexports.makeAbs = makeAbs\nexports.finish = finish\nexports.mark = mark\nexports.isIgnored = isIgnored\nexports.childrenIgnored = childrenIgnored\n\nfunction ownProp (obj, field) {\n return Object.prototype.hasOwnProperty.call(obj, field)\n}\n\nvar fs = require(\"fs\")\nvar path = require(\"path\")\nvar minimatch = require(\"minimatch\")\nvar isAbsolute = require(\"path-is-absolute\")\nvar Minimatch = minimatch.Minimatch\n\nfunction alphasort (a, b) {\n return a.localeCompare(b, 'en')\n}\n\nfunction setupIgnores (self, options) {\n self.ignore = options.ignore || []\n\n if (!Array.isArray(self.ignore))\n self.ignore = [self.ignore]\n\n if (self.ignore.length) {\n self.ignore = self.ignore.map(ignoreMap)\n }\n}\n\n// ignore patterns are always in dot:true mode.\nfunction ignoreMap (pattern) {\n var gmatcher = null\n if (pattern.slice(-3) === '/**') {\n var gpattern = pattern.replace(/(\\/\\*\\*)+$/, '')\n gmatcher = new Minimatch(gpattern, { dot: true })\n }\n\n return {\n matcher: new Minimatch(pattern, { dot: true }),\n gmatcher: gmatcher\n }\n}\n\nfunction setopts (self, pattern, options) {\n if (!options)\n options = {}\n\n // base-matching: just use globstar for that.\n if (options.matchBase && -1 === pattern.indexOf(\"/\")) {\n if (options.noglobstar) {\n throw new Error(\"base matching requires globstar\")\n }\n pattern = \"**/\" + pattern\n }\n\n self.silent = !!options.silent\n self.pattern = pattern\n self.strict = options.strict !== false\n self.realpath = !!options.realpath\n self.realpathCache = options.realpathCache || Object.create(null)\n self.follow = !!options.follow\n self.dot = !!options.dot\n self.mark = !!options.mark\n self.nodir = !!options.nodir\n if (self.nodir)\n self.mark = true\n self.sync = !!options.sync\n self.nounique = !!options.nounique\n self.nonull = !!options.nonull\n self.nosort = !!options.nosort\n self.nocase = !!options.nocase\n self.stat = !!options.stat\n self.noprocess = !!options.noprocess\n self.absolute = !!options.absolute\n self.fs = options.fs || fs\n\n self.maxLength = options.maxLength || Infinity\n self.cache = options.cache || Object.create(null)\n self.statCache = options.statCache || Object.create(null)\n self.symlinks = options.symlinks || Object.create(null)\n\n setupIgnores(self, options)\n\n self.changedCwd = false\n var cwd = process.cwd()\n if (!ownProp(options, \"cwd\"))\n self.cwd = cwd\n else {\n self.cwd = path.resolve(options.cwd)\n self.changedCwd = self.cwd !== cwd\n }\n\n self.root = options.root || path.resolve(self.cwd, \"/\")\n self.root = path.resolve(self.root)\n if (process.platform === \"win32\")\n self.root = self.root.replace(/\\\\/g, \"/\")\n\n // TODO: is an absolute `cwd` supposed to be resolved against `root`?\n // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test')\n self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd)\n if (process.platform === \"win32\")\n self.cwdAbs = self.cwdAbs.replace(/\\\\/g, \"/\")\n self.nomount = !!options.nomount\n\n // disable comments and negation in Minimatch.\n // Note that they are not supported in Glob itself anyway.\n options.nonegate = true\n options.nocomment = true\n // always treat \\ in patterns as escapes, not path separators\n options.allowWindowsEscape = false\n\n self.minimatch = new Minimatch(pattern, options)\n self.options = self.minimatch.options\n}\n\nfunction finish (self) {\n var nou = self.nounique\n var all = nou ? [] : Object.create(null)\n\n for (var i = 0, l = self.matches.length; i < l; i ++) {\n var matches = self.matches[i]\n if (!matches || Object.keys(matches).length === 0) {\n if (self.nonull) {\n // do like the shell, and spit out the literal glob\n var literal = self.minimatch.globSet[i]\n if (nou)\n all.push(literal)\n else\n all[literal] = true\n }\n } else {\n // had matches\n var m = Object.keys(matches)\n if (nou)\n all.push.apply(all, m)\n else\n m.forEach(function (m) {\n all[m] = true\n })\n }\n }\n\n if (!nou)\n all = Object.keys(all)\n\n if (!self.nosort)\n all = all.sort(alphasort)\n\n // at *some* point we statted all of these\n if (self.mark) {\n for (var i = 0; i < all.length; i++) {\n all[i] = self._mark(all[i])\n }\n if (self.nodir) {\n all = all.filter(function (e) {\n var notDir = !(/\\/$/.test(e))\n var c = self.cache[e] || self.cache[makeAbs(self, e)]\n if (notDir && c)\n notDir = c !== 'DIR' && !Array.isArray(c)\n return notDir\n })\n }\n }\n\n if (self.ignore.length)\n all = all.filter(function(m) {\n return !isIgnored(self, m)\n })\n\n self.found = all\n}\n\nfunction mark (self, p) {\n var abs = makeAbs(self, p)\n var c = self.cache[abs]\n var m = p\n if (c) {\n var isDir = c === 'DIR' || Array.isArray(c)\n var slash = p.slice(-1) === '/'\n\n if (isDir && !slash)\n m += '/'\n else if (!isDir && slash)\n m = m.slice(0, -1)\n\n if (m !== p) {\n var mabs = makeAbs(self, m)\n self.statCache[mabs] = self.statCache[abs]\n self.cache[mabs] = self.cache[abs]\n }\n }\n\n return m\n}\n\n// lotta situps...\nfunction makeAbs (self, f) {\n var abs = f\n if (f.charAt(0) === '/') {\n abs = path.join(self.root, f)\n } else if (isAbsolute(f) || f === '') {\n abs = f\n } else if (self.changedCwd) {\n abs = path.resolve(self.cwd, f)\n } else {\n abs = path.resolve(f)\n }\n\n if (process.platform === 'win32')\n abs = abs.replace(/\\\\/g, '/')\n\n return abs\n}\n\n\n// Return true, if pattern ends with globstar '**', for the accompanying parent directory.\n// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents\nfunction isIgnored (self, path) {\n if (!self.ignore.length)\n return false\n\n return self.ignore.some(function(item) {\n return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))\n })\n}\n\nfunction childrenIgnored (self, path) {\n if (!self.ignore.length)\n return false\n\n return self.ignore.some(function(item) {\n return !!(item.gmatcher && item.gmatcher.match(path))\n })\n}\n", "module.exports = globSync\nglobSync.GlobSync = GlobSync\n\nvar rp = require('fs.realpath')\nvar minimatch = require('minimatch')\nvar Minimatch = minimatch.Minimatch\nvar Glob = require('./glob.js').Glob\nvar util = require('util')\nvar path = require('path')\nvar assert = require('assert')\nvar isAbsolute = require('path-is-absolute')\nvar common = require('./common.js')\nvar setopts = common.setopts\nvar ownProp = common.ownProp\nvar childrenIgnored = common.childrenIgnored\nvar isIgnored = common.isIgnored\n\nfunction globSync (pattern, options) {\n if (typeof options === 'function' || arguments.length === 3)\n throw new TypeError('callback provided to sync glob\\n'+\n 'See: https://github.com/isaacs/node-glob/issues/167')\n\n return new GlobSync(pattern, options).found\n}\n\nfunction GlobSync (pattern, options) {\n if (!pattern)\n throw new Error('must provide pattern')\n\n if (typeof options === 'function' || arguments.length === 3)\n throw new TypeError('callback provided to sync glob\\n'+\n 'See: https://github.com/isaacs/node-glob/issues/167')\n\n if (!(this instanceof GlobSync))\n return new GlobSync(pattern, options)\n\n setopts(this, pattern, options)\n\n if (this.noprocess)\n return this\n\n var n = this.minimatch.set.length\n this.matches = new Array(n)\n for (var i = 0; i < n; i ++) {\n this._process(this.minimatch.set[i], i, false)\n }\n this._finish()\n}\n\nGlobSync.prototype._finish = function () {\n assert.ok(this instanceof GlobSync)\n if (this.realpath) {\n var self = this\n this.matches.forEach(function (matchset, index) {\n var set = self.matches[index] = Object.create(null)\n for (var p in matchset) {\n try {\n p = self._makeAbs(p)\n var real = rp.realpathSync(p, self.realpathCache)\n set[real] = true\n } catch (er) {\n if (er.syscall === 'stat')\n set[self._makeAbs(p)] = true\n else\n throw er\n }\n }\n })\n }\n common.finish(this)\n}\n\n\nGlobSync.prototype._process = function (pattern, index, inGlobStar) {\n assert.ok(this instanceof GlobSync)\n\n // Get the first [n] parts of pattern that are all strings.\n var n = 0\n while (typeof pattern[n] === 'string') {\n n ++\n }\n // now n is the index of the first one that is *not* a string.\n\n // See if there's anything else\n var prefix\n switch (n) {\n // if not, then this is rather simple\n case pattern.length:\n this._processSimple(pattern.join('/'), index)\n return\n\n case 0:\n // pattern *starts* with some non-trivial item.\n // going to readdir(cwd), but not include the prefix in matches.\n prefix = null\n break\n\n default:\n // pattern has some string bits in the front.\n // whatever it starts with, whether that's 'absolute' like /foo/bar,\n // or 'relative' like '../baz'\n prefix = pattern.slice(0, n).join('/')\n break\n }\n\n var remain = pattern.slice(n)\n\n // get the list of entries.\n var read\n if (prefix === null)\n read = '.'\n else if (isAbsolute(prefix) ||\n isAbsolute(pattern.map(function (p) {\n return typeof p === 'string' ? p : '[*]'\n }).join('/'))) {\n if (!prefix || !isAbsolute(prefix))\n prefix = '/' + prefix\n read = prefix\n } else\n read = prefix\n\n var abs = this._makeAbs(read)\n\n //if ignored, skip processing\n if (childrenIgnored(this, read))\n return\n\n var isGlobStar = remain[0] === minimatch.GLOBSTAR\n if (isGlobStar)\n this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)\n else\n this._processReaddir(prefix, read, abs, remain, index, inGlobStar)\n}\n\n\nGlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {\n var entries = this._readdir(abs, inGlobStar)\n\n // if the abs isn't a dir, then nothing can match!\n if (!entries)\n return\n\n // It will only match dot entries if it starts with a dot, or if\n // dot is set. Stuff like @(.foo|.bar) isn't allowed.\n var pn = remain[0]\n var negate = !!this.minimatch.negate\n var rawGlob = pn._glob\n var dotOk = this.dot || rawGlob.charAt(0) === '.'\n\n var matchedEntries = []\n for (var i = 0; i < entries.length; i++) {\n var e = entries[i]\n if (e.charAt(0) !== '.' || dotOk) {\n var m\n if (negate && !prefix) {\n m = !e.match(pn)\n } else {\n m = e.match(pn)\n }\n if (m)\n matchedEntries.push(e)\n }\n }\n\n var len = matchedEntries.length\n // If there are no matched entries, then nothing matches.\n if (len === 0)\n return\n\n // if this is the last remaining pattern bit, then no need for\n // an additional stat *unless* the user has specified mark or\n // stat explicitly. We know they exist, since readdir returned\n // them.\n\n if (remain.length === 1 && !this.mark && !this.stat) {\n if (!this.matches[index])\n this.matches[index] = Object.create(null)\n\n for (var i = 0; i < len; i ++) {\n var e = matchedEntries[i]\n if (prefix) {\n if (prefix.slice(-1) !== '/')\n e = prefix + '/' + e\n else\n e = prefix + e\n }\n\n if (e.charAt(0) === '/' && !this.nomount) {\n e = path.join(this.root, e)\n }\n this._emitMatch(index, e)\n }\n // This was the last one, and no stats were needed\n return\n }\n\n // now test all matched entries as stand-ins for that part\n // of the pattern.\n remain.shift()\n for (var i = 0; i < len; i ++) {\n var e = matchedEntries[i]\n var newPattern\n if (prefix)\n newPattern = [prefix, e]\n else\n newPattern = [e]\n this._process(newPattern.concat(remain), index, inGlobStar)\n }\n}\n\n\nGlobSync.prototype._emitMatch = function (index, e) {\n if (isIgnored(this, e))\n return\n\n var abs = this._makeAbs(e)\n\n if (this.mark)\n e = this._mark(e)\n\n if (this.absolute) {\n e = abs\n }\n\n if (this.matches[index][e])\n return\n\n if (this.nodir) {\n var c = this.cache[abs]\n if (c === 'DIR' || Array.isArray(c))\n return\n }\n\n this.matches[index][e] = true\n\n if (this.stat)\n this._stat(e)\n}\n\n\nGlobSync.prototype._readdirInGlobStar = function (abs) {\n // follow all symlinked directories forever\n // just proceed as if this is a non-globstar situation\n if (this.follow)\n return this._readdir(abs, false)\n\n var entries\n var lstat\n var stat\n try {\n lstat = this.fs.lstatSync(abs)\n } catch (er) {\n if (er.code === 'ENOENT') {\n // lstat failed, doesn't exist\n return null\n }\n }\n\n var isSym = lstat && lstat.isSymbolicLink()\n this.symlinks[abs] = isSym\n\n // If it's not a symlink or a dir, then it's definitely a regular file.\n // don't bother doing a readdir in that case.\n if (!isSym && lstat && !lstat.isDirectory())\n this.cache[abs] = 'FILE'\n else\n entries = this._readdir(abs, false)\n\n return entries\n}\n\nGlobSync.prototype._readdir = function (abs, inGlobStar) {\n var entries\n\n if (inGlobStar && !ownProp(this.symlinks, abs))\n return this._readdirInGlobStar(abs)\n\n if (ownProp(this.cache, abs)) {\n var c = this.cache[abs]\n if (!c || c === 'FILE')\n return null\n\n if (Array.isArray(c))\n return c\n }\n\n try {\n return this._readdirEntries(abs, this.fs.readdirSync(abs))\n } catch (er) {\n this._readdirError(abs, er)\n return null\n }\n}\n\nGlobSync.prototype._readdirEntries = function (abs, entries) {\n // if we haven't asked to stat everything, then just\n // assume that everything in there exists, so we can avoid\n // having to stat it a second time.\n if (!this.mark && !this.stat) {\n for (var i = 0; i < entries.length; i ++) {\n var e = entries[i]\n if (abs === '/')\n e = abs + e\n else\n e = abs + '/' + e\n this.cache[e] = true\n }\n }\n\n this.cache[abs] = entries\n\n // mark and cache dir-ness\n return entries\n}\n\nGlobSync.prototype._readdirError = function (f, er) {\n // handle errors, and cache the information\n switch (er.code) {\n case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205\n case 'ENOTDIR': // totally normal. means it *does* exist.\n var abs = this._makeAbs(f)\n this.cache[abs] = 'FILE'\n if (abs === this.cwdAbs) {\n var error = new Error(er.code + ' invalid cwd ' + this.cwd)\n error.path = this.cwd\n error.code = er.code\n throw error\n }\n break\n\n case 'ENOENT': // not terribly unusual\n case 'ELOOP':\n case 'ENAMETOOLONG':\n case 'UNKNOWN':\n this.cache[this._makeAbs(f)] = false\n break\n\n default: // some unusual error. Treat as failure.\n this.cache[this._makeAbs(f)] = false\n if (this.strict)\n throw er\n if (!this.silent)\n console.error('glob error', er)\n break\n }\n}\n\nGlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {\n\n var entries = this._readdir(abs, inGlobStar)\n\n // no entries means not a dir, so it can never have matches\n // foo.txt/** doesn't match foo.txt\n if (!entries)\n return\n\n // test without the globstar, and with every child both below\n // and replacing the globstar.\n var remainWithoutGlobStar = remain.slice(1)\n var gspref = prefix ? [ prefix ] : []\n var noGlobStar = gspref.concat(remainWithoutGlobStar)\n\n // the noGlobStar pattern exits the inGlobStar state\n this._process(noGlobStar, index, false)\n\n var len = entries.length\n var isSym = this.symlinks[abs]\n\n // If it's a symlink, and we're in a globstar, then stop\n if (isSym && inGlobStar)\n return\n\n for (var i = 0; i < len; i++) {\n var e = entries[i]\n if (e.charAt(0) === '.' && !this.dot)\n continue\n\n // these two cases enter the inGlobStar state\n var instead = gspref.concat(entries[i], remainWithoutGlobStar)\n this._process(instead, index, true)\n\n var below = gspref.concat(entries[i], remain)\n this._process(below, index, true)\n }\n}\n\nGlobSync.prototype._processSimple = function (prefix, index) {\n // XXX review this. Shouldn't it be doing the mounting etc\n // before doing stat? kinda weird?\n var exists = this._stat(prefix)\n\n if (!this.matches[index])\n this.matches[index] = Object.create(null)\n\n // If it doesn't exist, then just mark the lack of results\n if (!exists)\n return\n\n if (prefix && isAbsolute(prefix) && !this.nomount) {\n var trail = /[\\/\\\\]$/.test(prefix)\n if (prefix.charAt(0) === '/') {\n prefix = path.join(this.root, prefix)\n } else {\n prefix = path.resolve(this.root, prefix)\n if (trail)\n prefix += '/'\n }\n }\n\n if (process.platform === 'win32')\n prefix = prefix.replace(/\\\\/g, '/')\n\n // Mark this as a match\n this._emitMatch(index, prefix)\n}\n\n// Returns either 'DIR', 'FILE', or false\nGlobSync.prototype._stat = function (f) {\n var abs = this._makeAbs(f)\n var needDir = f.slice(-1) === '/'\n\n if (f.length > this.maxLength)\n return false\n\n if (!this.stat && ownProp(this.cache, abs)) {\n var c = this.cache[abs]\n\n if (Array.isArray(c))\n c = 'DIR'\n\n // It exists, but maybe not how we need it\n if (!needDir || c === 'DIR')\n return c\n\n if (needDir && c === 'FILE')\n return false\n\n // otherwise we have to stat, because maybe c=true\n // if we know it exists, but not what it is.\n }\n\n var exists\n var stat = this.statCache[abs]\n if (!stat) {\n var lstat\n try {\n lstat = this.fs.lstatSync(abs)\n } catch (er) {\n if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {\n this.statCache[abs] = false\n return false\n }\n }\n\n if (lstat && lstat.isSymbolicLink()) {\n try {\n stat = this.fs.statSync(abs)\n } catch (er) {\n stat = lstat\n }\n } else {\n stat = lstat\n }\n }\n\n this.statCache[abs] = stat\n\n var c = true\n if (stat)\n c = stat.isDirectory() ? 'DIR' : 'FILE'\n\n this.cache[abs] = this.cache[abs] || c\n\n if (needDir && c === 'FILE')\n return false\n\n return c\n}\n\nGlobSync.prototype._mark = function (p) {\n return common.mark(this, p)\n}\n\nGlobSync.prototype._makeAbs = function (f) {\n return common.makeAbs(this, f)\n}\n", "// Approach:\n//\n// 1. Get the minimatch set\n// 2. For each pattern in the set, PROCESS(pattern, false)\n// 3. Store matches per-set, then uniq them\n//\n// PROCESS(pattern, inGlobStar)\n// Get the first [n] items from pattern that are all strings\n// Join these together. This is PREFIX.\n// If there is no more remaining, then stat(PREFIX) and\n// add to matches if it succeeds. END.\n//\n// If inGlobStar and PREFIX is symlink and points to dir\n// set ENTRIES = []\n// else readdir(PREFIX) as ENTRIES\n// If fail, END\n//\n// with ENTRIES\n// If pattern[n] is GLOBSTAR\n// // handle the case where the globstar match is empty\n// // by pruning it out, and testing the resulting pattern\n// PROCESS(pattern[0..n] + pattern[n+1 .. $], false)\n// // handle other cases.\n// for ENTRY in ENTRIES (not dotfiles)\n// // attach globstar + tail onto the entry\n// // Mark that this entry is a globstar match\n// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)\n//\n// else // not globstar\n// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)\n// Test ENTRY against pattern[n]\n// If fails, continue\n// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])\n//\n// Caveat:\n// Cache all stats and readdirs results to minimize syscall. Since all\n// we ever care about is existence and directory-ness, we can just keep\n// `true` for files, and [children,...] for directories, or `false` for\n// things that don't exist.\n\nmodule.exports = glob\n\nvar rp = require('fs.realpath')\nvar minimatch = require('minimatch')\nvar Minimatch = minimatch.Minimatch\nvar inherits = require('inherits')\nvar EE = require('events').EventEmitter\nvar path = require('path')\nvar assert = require('assert')\nvar isAbsolute = require('path-is-absolute')\nvar globSync = require('./sync.js')\nvar common = require('./common.js')\nvar setopts = common.setopts\nvar ownProp = common.ownProp\nvar inflight = require('inflight')\nvar util = require('util')\nvar childrenIgnored = common.childrenIgnored\nvar isIgnored = common.isIgnored\n\nvar once = require('once')\n\nfunction glob (pattern, options, cb) {\n if (typeof options === 'function') cb = options, options = {}\n if (!options) options = {}\n\n if (options.sync) {\n if (cb)\n throw new TypeError('callback provided to sync glob')\n return globSync(pattern, options)\n }\n\n return new Glob(pattern, options, cb)\n}\n\nglob.sync = globSync\nvar GlobSync = glob.GlobSync = globSync.GlobSync\n\n// old api surface\nglob.glob = glob\n\nfunction extend (origin, add) {\n if (add === null || typeof add !== 'object') {\n return origin\n }\n\n var keys = Object.keys(add)\n var i = keys.length\n while (i--) {\n origin[keys[i]] = add[keys[i]]\n }\n return origin\n}\n\nglob.hasMagic = function (pattern, options_) {\n var options = extend({}, options_)\n options.noprocess = true\n\n var g = new Glob(pattern, options)\n var set = g.minimatch.set\n\n if (!pattern)\n return false\n\n if (set.length > 1)\n return true\n\n for (var j = 0; j < set[0].length; j++) {\n if (typeof set[0][j] !== 'string')\n return true\n }\n\n return false\n}\n\nglob.Glob = Glob\ninherits(Glob, EE)\nfunction Glob (pattern, options, cb) {\n if (typeof options === 'function') {\n cb = options\n options = null\n }\n\n if (options && options.sync) {\n if (cb)\n throw new TypeError('callback provided to sync glob')\n return new GlobSync(pattern, options)\n }\n\n if (!(this instanceof Glob))\n return new Glob(pattern, options, cb)\n\n setopts(this, pattern, options)\n this._didRealPath = false\n\n // process each pattern in the minimatch set\n var n = this.minimatch.set.length\n\n // The matches are stored as {<filename>: true,...} so that\n // duplicates are automagically pruned.\n // Later, we do an Object.keys() on these.\n // Keep them as a list so we can fill in when nonull is set.\n this.matches = new Array(n)\n\n if (typeof cb === 'function') {\n cb = once(cb)\n this.on('error', cb)\n this.on('end', function (matches) {\n cb(null, matches)\n })\n }\n\n var self = this\n this._processing = 0\n\n this._emitQueue = []\n this._processQueue = []\n this.paused = false\n\n if (this.noprocess)\n return this\n\n if (n === 0)\n return done()\n\n var sync = true\n for (var i = 0; i < n; i ++) {\n this._process(this.minimatch.set[i], i, false, done)\n }\n sync = false\n\n function done () {\n --self._processing\n if (self._processing <= 0) {\n if (sync) {\n process.nextTick(function () {\n self._finish()\n })\n } else {\n self._finish()\n }\n }\n }\n}\n\nGlob.prototype._finish = function () {\n assert(this instanceof Glob)\n if (this.aborted)\n return\n\n if (this.realpath && !this._didRealpath)\n return this._realpath()\n\n common.finish(this)\n this.emit('end', this.found)\n}\n\nGlob.prototype._realpath = function () {\n if (this._didRealpath)\n return\n\n this._didRealpath = true\n\n var n = this.matches.length\n if (n === 0)\n return this._finish()\n\n var self = this\n for (var i = 0; i < this.matches.length; i++)\n this._realpathSet(i, next)\n\n function next () {\n if (--n === 0)\n self._finish()\n }\n}\n\nGlob.prototype._realpathSet = function (index, cb) {\n var matchset = this.matches[index]\n if (!matchset)\n return cb()\n\n var found = Object.keys(matchset)\n var self = this\n var n = found.length\n\n if (n === 0)\n return cb()\n\n var set = this.matches[index] = Object.create(null)\n found.forEach(function (p, i) {\n // If there's a problem with the stat, then it means that\n // one or more of the links in the realpath couldn't be\n // resolved. just return the abs value in that case.\n p = self._makeAbs(p)\n rp.realpath(p, self.realpathCache, function (er, real) {\n if (!er)\n set[real] = true\n else if (er.syscall === 'stat')\n set[p] = true\n else\n self.emit('error', er) // srsly wtf right here\n\n if (--n === 0) {\n self.matches[index] = set\n cb()\n }\n })\n })\n}\n\nGlob.prototype._mark = function (p) {\n return common.mark(this, p)\n}\n\nGlob.prototype._makeAbs = function (f) {\n return common.makeAbs(this, f)\n}\n\nGlob.prototype.abort = function () {\n this.aborted = true\n this.emit('abort')\n}\n\nGlob.prototype.pause = function () {\n if (!this.paused) {\n this.paused = true\n this.emit('pause')\n }\n}\n\nGlob.prototype.resume = function () {\n if (this.paused) {\n this.emit('resume')\n this.paused = false\n if (this._emitQueue.length) {\n var eq = this._emitQueue.slice(0)\n this._emitQueue.length = 0\n for (var i = 0; i < eq.length; i ++) {\n var e = eq[i]\n this._emitMatch(e[0], e[1])\n }\n }\n if (this._processQueue.length) {\n var pq = this._processQueue.slice(0)\n this._processQueue.length = 0\n for (var i = 0; i < pq.length; i ++) {\n var p = pq[i]\n this._processing--\n this._process(p[0], p[1], p[2], p[3])\n }\n }\n }\n}\n\nGlob.prototype._process = function (pattern, index, inGlobStar, cb) {\n assert(this instanceof Glob)\n assert(typeof cb === 'function')\n\n if (this.aborted)\n return\n\n this._processing++\n if (this.paused) {\n this._processQueue.push([pattern, index, inGlobStar, cb])\n return\n }\n\n //console.error('PROCESS %d', this._processing, pattern)\n\n // Get the first [n] parts of pattern that are all strings.\n var n = 0\n while (typeof pattern[n] === 'string') {\n n ++\n }\n // now n is the index of the first one that is *not* a string.\n\n // see if there's anything else\n var prefix\n switch (n) {\n // if not, then this is rather simple\n case pattern.length:\n this._processSimple(pattern.join('/'), index, cb)\n return\n\n case 0:\n // pattern *starts* with some non-trivial item.\n // going to readdir(cwd), but not include the prefix in matches.\n prefix = null\n break\n\n default:\n // pattern has some string bits in the front.\n // whatever it starts with, whether that's 'absolute' like /foo/bar,\n // or 'relative' like '../baz'\n prefix = pattern.slice(0, n).join('/')\n break\n }\n\n var remain = pattern.slice(n)\n\n // get the list of entries.\n var read\n if (prefix === null)\n read = '.'\n else if (isAbsolute(prefix) ||\n isAbsolute(pattern.map(function (p) {\n return typeof p === 'string' ? p : '[*]'\n }).join('/'))) {\n if (!prefix || !isAbsolute(prefix))\n prefix = '/' + prefix\n read = prefix\n } else\n read = prefix\n\n var abs = this._makeAbs(read)\n\n //if ignored, skip _processing\n if (childrenIgnored(this, read))\n return cb()\n\n var isGlobStar = remain[0] === minimatch.GLOBSTAR\n if (isGlobStar)\n this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)\n else\n this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)\n}\n\nGlob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {\n var self = this\n this._readdir(abs, inGlobStar, function (er, entries) {\n return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)\n })\n}\n\nGlob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {\n\n // if the abs isn't a dir, then nothing can match!\n if (!entries)\n return cb()\n\n // It will only match dot entries if it starts with a dot, or if\n // dot is set. Stuff like @(.foo|.bar) isn't allowed.\n var pn = remain[0]\n var negate = !!this.minimatch.negate\n var rawGlob = pn._glob\n var dotOk = this.dot || rawGlob.charAt(0) === '.'\n\n var matchedEntries = []\n for (var i = 0; i < entries.length; i++) {\n var e = entries[i]\n if (e.charAt(0) !== '.' || dotOk) {\n var m\n if (negate && !prefix) {\n m = !e.match(pn)\n } else {\n m = e.match(pn)\n }\n if (m)\n matchedEntries.push(e)\n }\n }\n\n //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)\n\n var len = matchedEntries.length\n // If there are no matched entries, then nothing matches.\n if (len === 0)\n return cb()\n\n // if this is the last remaining pattern bit, then no need for\n // an additional stat *unless* the user has specified mark or\n // stat explicitly. We know they exist, since readdir returned\n // them.\n\n if (remain.length === 1 && !this.mark && !this.stat) {\n if (!this.matches[index])\n this.matches[index] = Object.create(null)\n\n for (var i = 0; i < len; i ++) {\n var e = matchedEntries[i]\n if (prefix) {\n if (prefix !== '/')\n e = prefix + '/' + e\n else\n e = prefix + e\n }\n\n if (e.charAt(0) === '/' && !this.nomount) {\n e = path.join(this.root, e)\n }\n this._emitMatch(index, e)\n }\n // This was the last one, and no stats were needed\n return cb()\n }\n\n // now test all matched entries as stand-ins for that part\n // of the pattern.\n remain.shift()\n for (var i = 0; i < len; i ++) {\n var e = matchedEntries[i]\n var newPattern\n if (prefix) {\n if (prefix !== '/')\n e = prefix + '/' + e\n else\n e = prefix + e\n }\n this._process([e].concat(remain), index, inGlobStar, cb)\n }\n cb()\n}\n\nGlob.prototype._emitMatch = function (index, e) {\n if (this.aborted)\n return\n\n if (isIgnored(this, e))\n return\n\n if (this.paused) {\n this._emitQueue.push([index, e])\n return\n }\n\n var abs = isAbsolute(e) ? e : this._makeAbs(e)\n\n if (this.mark)\n e = this._mark(e)\n\n if (this.absolute)\n e = abs\n\n if (this.matches[index][e])\n return\n\n if (this.nodir) {\n var c = this.cache[abs]\n if (c === 'DIR' || Array.isArray(c))\n return\n }\n\n this.matches[index][e] = true\n\n var st = this.statCache[abs]\n if (st)\n this.emit('stat', e, st)\n\n this.emit('match', e)\n}\n\nGlob.prototype._readdirInGlobStar = function (abs, cb) {\n if (this.aborted)\n return\n\n // follow all symlinked directories forever\n // just proceed as if this is a non-globstar situation\n if (this.follow)\n return this._readdir(abs, false, cb)\n\n var lstatkey = 'lstat\\0' + abs\n var self = this\n var lstatcb = inflight(lstatkey, lstatcb_)\n\n if (lstatcb)\n self.fs.lstat(abs, lstatcb)\n\n function lstatcb_ (er, lstat) {\n if (er && er.code === 'ENOENT')\n return cb()\n\n var isSym = lstat && lstat.isSymbolicLink()\n self.symlinks[abs] = isSym\n\n // If it's not a symlink or a dir, then it's definitely a regular file.\n // don't bother doing a readdir in that case.\n if (!isSym && lstat && !lstat.isDirectory()) {\n self.cache[abs] = 'FILE'\n cb()\n } else\n self._readdir(abs, false, cb)\n }\n}\n\nGlob.prototype._readdir = function (abs, inGlobStar, cb) {\n if (this.aborted)\n return\n\n cb = inflight('readdir\\0'+abs+'\\0'+inGlobStar, cb)\n if (!cb)\n return\n\n //console.error('RD %j %j', +inGlobStar, abs)\n if (inGlobStar && !ownProp(this.symlinks, abs))\n return this._readdirInGlobStar(abs, cb)\n\n if (ownProp(this.cache, abs)) {\n var c = this.cache[abs]\n if (!c || c === 'FILE')\n return cb()\n\n if (Array.isArray(c))\n return cb(null, c)\n }\n\n var self = this\n self.fs.readdir(abs, readdirCb(this, abs, cb))\n}\n\nfunction readdirCb (self, abs, cb) {\n return function (er, entries) {\n if (er)\n self._readdirError(abs, er, cb)\n else\n self._readdirEntries(abs, entries, cb)\n }\n}\n\nGlob.prototype._readdirEntries = function (abs, entries, cb) {\n if (this.aborted)\n return\n\n // if we haven't asked to stat everything, then just\n // assume that everything in there exists, so we can avoid\n // having to stat it a second time.\n if (!this.mark && !this.stat) {\n for (var i = 0; i < entries.length; i ++) {\n var e = entries[i]\n if (abs === '/')\n e = abs + e\n else\n e = abs + '/' + e\n this.cache[e] = true\n }\n }\n\n this.cache[abs] = entries\n return cb(null, entries)\n}\n\nGlob.prototype._readdirError = function (f, er, cb) {\n if (this.aborted)\n return\n\n // handle errors, and cache the information\n switch (er.code) {\n case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205\n case 'ENOTDIR': // totally normal. means it *does* exist.\n var abs = this._makeAbs(f)\n this.cache[abs] = 'FILE'\n if (abs === this.cwdAbs) {\n var error = new Error(er.code + ' invalid cwd ' + this.cwd)\n error.path = this.cwd\n error.code = er.code\n this.emit('error', error)\n this.abort()\n }\n break\n\n case 'ENOENT': // not terribly unusual\n case 'ELOOP':\n case 'ENAMETOOLONG':\n case 'UNKNOWN':\n this.cache[this._makeAbs(f)] = false\n break\n\n default: // some unusual error. Treat as failure.\n this.cache[this._makeAbs(f)] = false\n if (this.strict) {\n this.emit('error', er)\n // If the error is handled, then we abort\n // if not, we threw out of here\n this.abort()\n }\n if (!this.silent)\n console.error('glob error', er)\n break\n }\n\n return cb()\n}\n\nGlob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {\n var self = this\n this._readdir(abs, inGlobStar, function (er, entries) {\n self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)\n })\n}\n\n\nGlob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {\n //console.error('pgs2', prefix, remain[0], entries)\n\n // no entries means not a dir, so it can never have matches\n // foo.txt/** doesn't match foo.txt\n if (!entries)\n return cb()\n\n // test without the globstar, and with every child both below\n // and replacing the globstar.\n var remainWithoutGlobStar = remain.slice(1)\n var gspref = prefix ? [ prefix ] : []\n var noGlobStar = gspref.concat(remainWithoutGlobStar)\n\n // the noGlobStar pattern exits the inGlobStar state\n this._process(noGlobStar, index, false, cb)\n\n var isSym = this.symlinks[abs]\n var len = entries.length\n\n // If it's a symlink, and we're in a globstar, then stop\n if (isSym && inGlobStar)\n return cb()\n\n for (var i = 0; i < len; i++) {\n var e = entries[i]\n if (e.charAt(0) === '.' && !this.dot)\n continue\n\n // these two cases enter the inGlobStar state\n var instead = gspref.concat(entries[i], remainWithoutGlobStar)\n this._process(instead, index, true, cb)\n\n var below = gspref.concat(entries[i], remain)\n this._process(below, index, true, cb)\n }\n\n cb()\n}\n\nGlob.prototype._processSimple = function (prefix, index, cb) {\n // XXX review this. Shouldn't it be doing the mounting etc\n // before doing stat? kinda weird?\n var self = this\n this._stat(prefix, function (er, exists) {\n self._processSimple2(prefix, index, er, exists, cb)\n })\n}\nGlob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {\n\n //console.error('ps2', prefix, exists)\n\n if (!this.matches[index])\n this.matches[index] = Object.create(null)\n\n // If it doesn't exist, then just mark the lack of results\n if (!exists)\n return cb()\n\n if (prefix && isAbsolute(prefix) && !this.nomount) {\n var trail = /[\\/\\\\]$/.test(prefix)\n if (prefix.charAt(0) === '/') {\n prefix = path.join(this.root, prefix)\n } else {\n prefix = path.resolve(this.root, prefix)\n if (trail)\n prefix += '/'\n }\n }\n\n if (process.platform === 'win32')\n prefix = prefix.replace(/\\\\/g, '/')\n\n // Mark this as a match\n this._emitMatch(index, prefix)\n cb()\n}\n\n// Returns either 'DIR', 'FILE', or false\nGlob.prototype._stat = function (f, cb) {\n var abs = this._makeAbs(f)\n var needDir = f.slice(-1) === '/'\n\n if (f.length > this.maxLength)\n return cb()\n\n if (!this.stat && ownProp(this.cache, abs)) {\n var c = this.cache[abs]\n\n if (Array.isArray(c))\n c = 'DIR'\n\n // It exists, but maybe not how we need it\n if (!needDir || c === 'DIR')\n return cb(null, c)\n\n if (needDir && c === 'FILE')\n return cb()\n\n // otherwise we have to stat, because maybe c=true\n // if we know it exists, but not what it is.\n }\n\n var exists\n var stat = this.statCache[abs]\n if (stat !== undefined) {\n if (stat === false)\n return cb(null, stat)\n else {\n var type = stat.isDirectory() ? 'DIR' : 'FILE'\n if (needDir && type === 'FILE')\n return cb()\n else\n return cb(null, type, stat)\n }\n }\n\n var self = this\n var statcb = inflight('stat\\0' + abs, lstatcb_)\n if (statcb)\n self.fs.lstat(abs, statcb)\n\n function lstatcb_ (er, lstat) {\n if (lstat && lstat.isSymbolicLink()) {\n // If it's a symlink, then treat it as the target, unless\n // the target does not exist, then treat it as a file.\n return self.fs.stat(abs, function (er, stat) {\n if (er)\n self._stat2(f, abs, null, lstat, cb)\n else\n self._stat2(f, abs, er, stat, cb)\n })\n } else {\n self._stat2(f, abs, er, lstat, cb)\n }\n }\n}\n\nGlob.prototype._stat2 = function (f, abs, er, stat, cb) {\n if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {\n this.statCache[abs] = false\n return cb()\n }\n\n var needDir = f.slice(-1) === '/'\n this.statCache[abs] = stat\n\n if (abs.slice(-1) === '/' && stat && !stat.isDirectory())\n return cb(null, false, stat)\n\n var c = true\n if (stat)\n c = stat.isDirectory() ? 'DIR' : 'FILE'\n this.cache[abs] = this.cache[abs] || c\n\n if (needDir && c === 'FILE')\n return cb()\n\n return cb(null, c, stat)\n}\n", "\"use strict\";\r\nvar __assign = (this && this.__assign) || function () {\r\n __assign = Object.assign || function(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\r\n t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nfunction prepare(options) {\r\n var opts = __assign({ cwd: process.cwd(), deep: true, ignore: [], dot: false, stats: false, onlyFiles: true, onlyDirectories: false, followSymlinkedDirectories: true, unique: true, markDirectories: false, absolute: false, nobrace: false, brace: true, noglobstar: false, globstar: true, noext: false, extension: true, nocase: false, case: true, matchBase: false, transform: null }, options);\r\n if (opts.onlyDirectories) {\r\n opts.onlyFiles = false;\r\n }\r\n opts.brace = !opts.nobrace;\r\n opts.globstar = !opts.noglobstar;\r\n opts.extension = !opts.noext;\r\n opts.case = !opts.nocase;\r\n if (options) {\r\n opts.brace = ('brace' in options ? options.brace : opts.brace);\r\n opts.globstar = ('globstar' in options ? options.globstar : opts.globstar);\r\n opts.extension = ('extension' in options ? options.extension : opts.extension);\r\n opts.case = ('case' in options ? options.case : opts.case);\r\n }\r\n return opts;\r\n}\r\nexports.prepare = prepare;\r\n", "/*!\n * is-glob <https://github.com/jonschlinkert/is-glob>\n *\n * Copyright (c) 2014-2016, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\nvar isExtglob = require('is-extglob');\n\nmodule.exports = function isGlob(str) {\n if (typeof str !== 'string' || str === '') {\n return false;\n }\n\n if (isExtglob(str)) return true;\n\n var regex = /(\\\\).|([*?]|\\[.*\\]|\\{.*\\}|\\(.*\\|.*\\)|^!)/;\n var match;\n\n while ((match = regex.exec(str))) {\n if (match[2]) return true;\n str = str.slice(match.index + match[0].length);\n }\n return false;\n};\n", "'use strict';\n\nvar path = require('path');\nvar inspect = require('util').inspect;\n\nfunction assertPath(path) {\n if (typeof path !== 'string') {\n throw new TypeError('Path must be a string. Received ' + inspect(path));\n }\n}\n\nfunction posix(path) {\n assertPath(path);\n if (path.length === 0)\n return '.';\n var code = path.charCodeAt(0);\n var hasRoot = (code === 47/*/*/);\n var end = -1;\n var matchedSlash = true;\n for (var i = path.length - 1; i >= 1; --i) {\n code = path.charCodeAt(i);\n if (code === 47/*/*/) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n } else {\n // We saw the first non-path separator\n matchedSlash = false;\n }\n }\n\n if (end === -1)\n return hasRoot ? '/' : '.';\n if (hasRoot && end === 1)\n return '//';\n return path.slice(0, end);\n}\n\nfunction win32(path) {\n assertPath(path);\n var len = path.length;\n if (len === 0)\n return '.';\n var rootEnd = -1;\n var end = -1;\n var matchedSlash = true;\n var offset = 0;\n var code = path.charCodeAt(0);\n\n // Try to match a root\n if (len > 1) {\n if (code === 47/*/*/ || code === 92/*\\*/) {\n // Possible UNC root\n\n rootEnd = offset = 1;\n\n code = path.charCodeAt(1);\n if (code === 47/*/*/ || code === 92/*\\*/) {\n // Matched double path separator at beginning\n var j = 2;\n var last = j;\n // Match 1 or more non-path separators\n for (; j < len; ++j) {\n code = path.charCodeAt(j);\n if (code === 47/*/*/ || code === 92/*\\*/)\n break;\n }\n if (j < len && j !== last) {\n // Matched!\n last = j;\n // Match 1 or more path separators\n for (; j < len; ++j) {\n code = path.charCodeAt(j);\n if (code !== 47/*/*/ && code !== 92/*\\*/)\n break;\n }\n if (j < len && j !== last) {\n // Matched!\n last = j;\n // Match 1 or more non-path separators\n for (; j < len; ++j) {\n code = path.charCodeAt(j);\n if (code === 47/*/*/ || code === 92/*\\*/)\n break;\n }\n if (j === len) {\n // We matched a UNC root only\n return path;\n }\n if (j !== last) {\n // We matched a UNC root with leftovers\n\n // Offset by 1 to include the separator after the UNC root to\n // treat it as a \"normal root\" on top of a (UNC) root\n rootEnd = offset = j + 1;\n }\n }\n }\n }\n } else if ((code >= 65/*A*/ && code <= 90/*Z*/) ||\n (code >= 97/*a*/ && code <= 122/*z*/)) {\n // Possible device root\n\n code = path.charCodeAt(1);\n if (path.charCodeAt(1) === 58/*:*/) {\n rootEnd = offset = 2;\n if (len > 2) {\n code = path.charCodeAt(2);\n if (code === 47/*/*/ || code === 92/*\\*/)\n rootEnd = offset = 3;\n }\n }\n }\n } else if (code === 47/*/*/ || code === 92/*\\*/) {\n return path[0];\n }\n\n for (var i = len - 1; i >= offset; --i) {\n code = path.charCodeAt(i);\n if (code === 47/*/*/ || code === 92/*\\*/) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n } else {\n // We saw the first non-path separator\n matchedSlash = false;\n }\n }\n\n if (end === -1) {\n if (rootEnd === -1)\n return '.';\n else\n end = rootEnd;\n }\n return path.slice(0, end);\n}\n\nmodule.exports = process.platform === 'win32' ? win32 : posix;\nmodule.exports.posix = posix;\nmodule.exports.win32 = win32;\n", "'use strict';\n\nvar path = require('path');\nvar isglob = require('is-glob');\nvar pathDirname = require('path-dirname');\nvar isWin32 = require('os').platform() === 'win32';\n\nmodule.exports = function globParent(str) {\n\t// flip windows path separators\n\tif (isWin32 && str.indexOf('/') < 0) str = str.split('\\\\').join('/');\n\n\t// special case for strings ending in enclosure containing path separator\n\tif (/[\\{\\[].*[\\/]*.*[\\}\\]]$/.test(str)) str += '/';\n\n\t// preserves full path in case of trailing path separator\n\tstr += 'a';\n\n\t// remove path parts that are globby\n\tdo {str = pathDirname.posix(str)}\n\twhile (isglob(str) || /(^|[^\\\\])([\\{\\[]|\\([^\\)]+$)/.test(str));\n\n\t// remove escape chars and return result\n\treturn str.replace(/\\\\([\\*\\?\\|\\[\\]\\(\\)\\{\\}])/g, '$1');\n};\n", "/*!\n * is-glob <https://github.com/jonschlinkert/is-glob>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nvar isExtglob = require('is-extglob');\nvar chars = { '{': '}', '(': ')', '[': ']'};\nvar strictRegex = /\\\\(.)|(^!|\\*|[\\].+)]\\?|\\[[^\\\\\\]]+\\]|\\{[^\\\\}]+\\}|\\(\\?[:!=][^\\\\)]+\\)|\\([^|]+\\|[^\\\\)]+\\))/;\nvar relaxedRegex = /\\\\(.)|(^!|[*?{}()[\\]]|\\(\\?)/;\n\nmodule.exports = function isGlob(str, options) {\n if (typeof str !== 'string' || str === '') {\n return false;\n }\n\n if (isExtglob(str)) {\n return true;\n }\n\n var regex = strictRegex;\n var match;\n\n // optionally relax regex\n if (options && options.strict === false) {\n regex = relaxedRegex;\n }\n\n while ((match = regex.exec(str))) {\n if (match[2]) return true;\n var idx = match.index + match[0].length;\n\n // if an open bracket/brace/paren is escaped,\n // set the index to the next closing character\n var open = match[1];\n var close = open ? chars[open] : null;\n if (open && close) {\n var n = str.indexOf(close, idx);\n if (n !== -1) {\n idx = n + 1;\n }\n }\n\n str = str.slice(idx);\n }\n return false;\n};\n", "module.exports = {\n ROOT : 0,\n GROUP : 1,\n POSITION : 2,\n SET : 3,\n RANGE : 4,\n REPETITION : 5,\n REFERENCE : 6,\n CHAR : 7,\n};\n", "var types = require('./types');\n\nvar INTS = function() {\n return [{ type: types.RANGE , from: 48, to: 57 }];\n};\n\nvar WORDS = function() {\n return [\n { type: types.CHAR, value: 95 },\n { type: types.RANGE, from: 97, to: 122 },\n { type: types.RANGE, from: 65, to: 90 }\n ].concat(INTS());\n};\n\nvar WHITESPACE = function() {\n return [\n { type: types.CHAR, value: 9 },\n { type: types.CHAR, value: 10 },\n { type: types.CHAR, value: 11 },\n { type: types.CHAR, value: 12 },\n { type: types.CHAR, value: 13 },\n { type: types.CHAR, value: 32 },\n { type: types.CHAR, value: 160 },\n { type: types.CHAR, value: 5760 },\n { type: types.CHAR, value: 6158 },\n { type: types.CHAR, value: 8192 },\n { type: types.CHAR, value: 8193 },\n { type: types.CHAR, value: 8194 },\n { type: types.CHAR, value: 8195 },\n { type: types.CHAR, value: 8196 },\n { type: types.CHAR, value: 8197 },\n { type: types.CHAR, value: 8198 },\n { type: types.CHAR, value: 8199 },\n { type: types.CHAR, value: 8200 },\n { type: types.CHAR, value: 8201 },\n { type: types.CHAR, value: 8202 },\n { type: types.CHAR, value: 8232 },\n { type: types.CHAR, value: 8233 },\n { type: types.CHAR, value: 8239 },\n { type: types.CHAR, value: 8287 },\n { type: types.CHAR, value: 12288 },\n { type: types.CHAR, value: 65279 }\n ];\n};\n\nvar NOTANYCHAR = function() {\n return [\n { type: types.CHAR, value: 10 },\n { type: types.CHAR, value: 13 },\n { type: types.CHAR, value: 8232 },\n { type: types.CHAR, value: 8233 },\n ];\n};\n\n// Predefined class objects.\nexports.words = function() {\n return { type: types.SET, set: WORDS(), not: false };\n};\n\nexports.notWords = function() {\n return { type: types.SET, set: WORDS(), not: true };\n};\n\nexports.ints = function() {\n return { type: types.SET, set: INTS(), not: false };\n};\n\nexports.notInts = function() {\n return { type: types.SET, set: INTS(), not: true };\n};\n\nexports.whitespace = function() {\n return { type: types.SET, set: WHITESPACE(), not: false };\n};\n\nexports.notWhitespace = function() {\n return { type: types.SET, set: WHITESPACE(), not: true };\n};\n\nexports.anyChar = function() {\n return { type: types.SET, set: NOTANYCHAR(), not: true };\n};\n", "var types = require('./types');\nvar sets = require('./sets');\n\n\n// All of these are private and only used by randexp.\n// It's assumed that they will always be called with the correct input.\n\nvar CTRL = '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^ ?';\nvar SLSH = { '0': 0, 't': 9, 'n': 10, 'v': 11, 'f': 12, 'r': 13 };\n\n/**\n * Finds character representations in str and convert all to\n * their respective characters\n *\n * @param {String} str\n * @return {String}\n */\nexports.strToChars = function(str) {\n /* jshint maxlen: false */\n var chars_regex = /(\\[\\\\b\\])|(\\\\)?\\\\(?:u([A-F0-9]{4})|x([A-F0-9]{2})|(0?[0-7]{2})|c([@A-Z\\[\\\\\\]\\^?])|([0tnvfr]))/g;\n str = str.replace(chars_regex, function(s, b, lbs, a16, b16, c8, dctrl, eslsh) {\n if (lbs) {\n return s;\n }\n\n var code = b ? 8 :\n a16 ? parseInt(a16, 16) :\n b16 ? parseInt(b16, 16) :\n c8 ? parseInt(c8, 8) :\n dctrl ? CTRL.indexOf(dctrl) :\n SLSH[eslsh];\n\n var c = String.fromCharCode(code);\n\n // Escape special regex characters.\n if (/[\\[\\]{}\\^$.|?*+()]/.test(c)) {\n c = '\\\\' + c;\n }\n\n return c;\n });\n\n return str;\n};\n\n\n/**\n * turns class into tokens\n * reads str until it encounters a ] not preceeded by a \\\n *\n * @param {String} str\n * @param {String} regexpStr\n * @return {Array.<Array.<Object>, Number>}\n */\nexports.tokenizeClass = function(str, regexpStr) {\n /* jshint maxlen: false */\n var tokens = [];\n var regexp = /\\\\(?:(w)|(d)|(s)|(W)|(D)|(S))|((?:(?:\\\\)(.)|([^\\]\\\\]))-(?:\\\\)?([^\\]]))|(\\])|(?:\\\\)?(.)/g;\n var rs, c;\n\n\n while ((rs = regexp.exec(str)) != null) {\n if (rs[1]) {\n tokens.push(sets.words());\n\n } else if (rs[2]) {\n tokens.push(sets.ints());\n\n } else if (rs[3]) {\n tokens.push(sets.whitespace());\n\n } else if (rs[4]) {\n tokens.push(sets.notWords());\n\n } else if (rs[5]) {\n tokens.push(sets.notInts());\n\n } else if (rs[6]) {\n tokens.push(sets.notWhitespace());\n\n } else if (rs[7]) {\n tokens.push({\n type: types.RANGE,\n from: (rs[8] || rs[9]).charCodeAt(0),\n to: rs[10].charCodeAt(0),\n });\n\n } else if (c = rs[12]) {\n tokens.push({\n type: types.CHAR,\n value: c.charCodeAt(0),\n });\n\n } else {\n return [tokens, regexp.lastIndex];\n }\n }\n\n exports.error(regexpStr, 'Unterminated character class');\n};\n\n\n/**\n * Shortcut to throw errors.\n *\n * @param {String} regexp\n * @param {String} msg\n */\nexports.error = function(regexp, msg) {\n throw new SyntaxError('Invalid regular expression: /' + regexp + '/: ' + msg);\n};\n", "var types = require('./types');\n\nexports.wordBoundary = function() {\n return { type: types.POSITION, value: 'b' };\n};\n\nexports.nonWordBoundary = function() {\n return { type: types.POSITION, value: 'B' };\n};\n\nexports.begin = function() {\n return { type: types.POSITION, value: '^' };\n};\n\nexports.end = function() {\n return { type: types.POSITION, value: '$' };\n};\n", "var util = require('./util');\nvar types = require('./types');\nvar sets = require('./sets');\nvar positions = require('./positions');\n\n\nmodule.exports = function(regexpStr) {\n var i = 0, l, c,\n start = { type: types.ROOT, stack: []},\n\n // Keep track of last clause/group and stack.\n lastGroup = start,\n last = start.stack,\n groupStack = [];\n\n\n var repeatErr = function(i) {\n util.error(regexpStr, 'Nothing to repeat at column ' + (i - 1));\n };\n\n // Decode a few escaped characters.\n var str = util.strToChars(regexpStr);\n l = str.length;\n\n // Iterate through each character in string.\n while (i < l) {\n c = str[i++];\n\n switch (c) {\n // Handle escaped characters, inclues a few sets.\n case '\\\\':\n c = str[i++];\n\n switch (c) {\n case 'b':\n last.push(positions.wordBoundary());\n break;\n\n case 'B':\n last.push(positions.nonWordBoundary());\n break;\n\n case 'w':\n last.push(sets.words());\n break;\n\n case 'W':\n last.push(sets.notWords());\n break;\n\n case 'd':\n last.push(sets.ints());\n break;\n\n case 'D':\n last.push(sets.notInts());\n break;\n\n case 's':\n last.push(sets.whitespace());\n break;\n\n case 'S':\n last.push(sets.notWhitespace());\n break;\n\n default:\n // Check if c is integer.\n // In which case it's a reference.\n if (/\\d/.test(c)) {\n last.push({ type: types.REFERENCE, value: parseInt(c, 10) });\n\n // Escaped character.\n } else {\n last.push({ type: types.CHAR, value: c.charCodeAt(0) });\n }\n }\n\n break;\n\n\n // Positionals.\n case '^':\n last.push(positions.begin());\n break;\n\n case '$':\n last.push(positions.end());\n break;\n\n\n // Handle custom sets.\n case '[':\n // Check if this class is 'anti' i.e. [^abc].\n var not;\n if (str[i] === '^') {\n not = true;\n i++;\n } else {\n not = false;\n }\n\n // Get all the characters in class.\n var classTokens = util.tokenizeClass(str.slice(i), regexpStr);\n\n // Increase index by length of class.\n i += classTokens[1];\n last.push({\n type: types.SET,\n set: classTokens[0],\n not: not,\n });\n\n break;\n\n\n // Class of any character except \\n.\n case '.':\n last.push(sets.anyChar());\n break;\n\n\n // Push group onto stack.\n case '(':\n // Create group.\n var group = {\n type: types.GROUP,\n stack: [],\n remember: true,\n };\n\n c = str[i];\n\n // If if this is a special kind of group.\n if (c === '?') {\n c = str[i + 1];\n i += 2;\n\n // Match if followed by.\n if (c === '=') {\n group.followedBy = true;\n\n // Match if not followed by.\n } else if (c === '!') {\n group.notFollowedBy = true;\n\n } else if (c !== ':') {\n util.error(regexpStr,\n 'Invalid group, character \\'' + c +\n '\\' after \\'?\\' at column ' + (i - 1));\n }\n\n group.remember = false;\n }\n\n // Insert subgroup into current group stack.\n last.push(group);\n\n // Remember the current group for when the group closes.\n groupStack.push(lastGroup);\n\n // Make this new group the current group.\n lastGroup = group;\n last = group.stack;\n break;\n\n\n // Pop group out of stack.\n case ')':\n if (groupStack.length === 0) {\n util.error(regexpStr, 'Unmatched ) at column ' + (i - 1));\n }\n lastGroup = groupStack.pop();\n\n // Check if this group has a PIPE.\n // To get back the correct last stack.\n last = lastGroup.options ?\n lastGroup.options[lastGroup.options.length - 1] : lastGroup.stack;\n break;\n\n\n // Use pipe character to give more choices.\n case '|':\n // Create array where options are if this is the first PIPE\n // in this clause.\n if (!lastGroup.options) {\n lastGroup.options = [lastGroup.stack];\n delete lastGroup.stack;\n }\n\n // Create a new stack and add to options for rest of clause.\n var stack = [];\n lastGroup.options.push(stack);\n last = stack;\n break;\n\n\n // Repetition.\n // For every repetition, remove last element from last stack\n // then insert back a RANGE object.\n // This design is chosen because there could be more than\n // one repetition symbols in a regex i.e. `a?+{2,3}`.\n case '{':\n var rs = /^(\\d+)(,(\\d+)?)?\\}/.exec(str.slice(i)), min, max;\n if (rs !== null) {\n if (last.length === 0) {\n repeatErr(i);\n }\n min = parseInt(rs[1], 10);\n max = rs[2] ? rs[3] ? parseInt(rs[3], 10) : Infinity : min;\n i += rs[0].length;\n\n last.push({\n type: types.REPETITION,\n min: min,\n max: max,\n value: last.pop(),\n });\n } else {\n last.push({\n type: types.CHAR,\n value: 123,\n });\n }\n break;\n\n case '?':\n if (last.length === 0) {\n repeatErr(i);\n }\n last.push({\n type: types.REPETITION,\n min: 0,\n max: 1,\n value: last.pop(),\n });\n break;\n\n case '+':\n if (last.length === 0) {\n repeatErr(i);\n }\n last.push({\n type: types.REPETITION,\n min: 1,\n max: Infinity,\n value: last.pop(),\n });\n break;\n\n case '*':\n if (last.length === 0) {\n repeatErr(i);\n }\n last.push({\n type: types.REPETITION,\n min: 0,\n max: Infinity,\n value: last.pop(),\n });\n break;\n\n\n // Default is a character that is not `\\[](){}?+*^$`.\n default:\n last.push({\n type: types.CHAR,\n value: c.charCodeAt(0),\n });\n }\n\n }\n\n // Check if any groups have not been closed.\n if (groupStack.length !== 0) {\n util.error(regexpStr, 'Unterminated group');\n }\n\n return start;\n};\n\nmodule.exports.types = types;\n", "var parse = require('ret');\nvar types = parse.types;\n\nmodule.exports = function (re, opts) {\n if (!opts) opts = {};\n var replimit = opts.limit === undefined ? 25 : opts.limit;\n \n if (isRegExp(re)) re = re.source;\n else if (typeof re !== 'string') re = String(re);\n \n try { re = parse(re) }\n catch (err) { return false }\n \n var reps = 0;\n return (function walk (node, starHeight) {\n if (node.type === types.REPETITION) {\n starHeight ++;\n reps ++;\n if (starHeight > 1) return false;\n if (reps > replimit) return false;\n }\n \n if (node.options) {\n for (var i = 0, len = node.options.length; i < len; i++) {\n var ok = walk({ stack: node.options[i] }, starHeight);\n if (!ok) return false;\n }\n }\n var stack = node.stack || (node.value && node.value.stack);\n if (!stack) return true;\n \n for (var i = 0; i < stack.length; i++) {\n var ok = walk(stack[i], starHeight);\n if (!ok) return false;\n }\n \n return true;\n })(re, 0);\n};\n\nfunction isRegExp (x) {\n return {}.toString.call(x) === '[object RegExp]';\n}\n", "/*!\n * isobject <https://github.com/jonschlinkert/isobject>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function isObject(val) {\n return val != null && typeof val === 'object' && Array.isArray(val) === false;\n};\n", "var toString = Object.prototype.toString;\n\nmodule.exports = function kindOf(val) {\n if (val === void 0) return 'undefined';\n if (val === null) return 'null';\n\n var type = typeof val;\n if (type === 'boolean') return 'boolean';\n if (type === 'string') return 'string';\n if (type === 'number') return 'number';\n if (type === 'symbol') return 'symbol';\n if (type === 'function') {\n return isGeneratorFn(val) ? 'generatorfunction' : 'function';\n }\n\n if (isArray(val)) return 'array';\n if (isBuffer(val)) return 'buffer';\n if (isArguments(val)) return 'arguments';\n if (isDate(val)) return 'date';\n if (isError(val)) return 'error';\n if (isRegexp(val)) return 'regexp';\n\n switch (ctorName(val)) {\n case 'Symbol': return 'symbol';\n case 'Promise': return 'promise';\n\n // Set, Map, WeakSet, WeakMap\n case 'WeakMap': return 'weakmap';\n case 'WeakSet': return 'weakset';\n case 'Map': return 'map';\n case 'Set': return 'set';\n\n // 8-bit typed arrays\n case 'Int8Array': return 'int8array';\n case 'Uint8Array': return 'uint8array';\n case 'Uint8ClampedArray': return 'uint8clampedarray';\n\n // 16-bit typed arrays\n case 'Int16Array': return 'int16array';\n case 'Uint16Array': return 'uint16array';\n\n // 32-bit typed arrays\n case 'Int32Array': return 'int32array';\n case 'Uint32Array': return 'uint32array';\n case 'Float32Array': return 'float32array';\n case 'Float64Array': return 'float64array';\n }\n\n if (isGeneratorObj(val)) {\n return 'generator';\n }\n\n // Non-plain objects\n type = toString.call(val);\n switch (type) {\n case '[object Object]': return 'object';\n // iterators\n case '[object Map Iterator]': return 'mapiterator';\n case '[object Set Iterator]': return 'setiterator';\n case '[object String Iterator]': return 'stringiterator';\n case '[object Array Iterator]': return 'arrayiterator';\n }\n\n // other\n return type.slice(8, -1).toLowerCase().replace(/\\s/g, '');\n};\n\nfunction ctorName(val) {\n return val.constructor ? val.constructor.name : null;\n}\n\nfunction isArray(val) {\n if (Array.isArray) return Array.isArray(val);\n return val instanceof Array;\n}\n\nfunction isError(val) {\n return val instanceof Error || (typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number');\n}\n\nfunction isDate(val) {\n if (val instanceof Date) return true;\n return typeof val.toDateString === 'function'\n && typeof val.getDate === 'function'\n && typeof val.setDate === 'function';\n}\n\nfunction isRegexp(val) {\n if (val instanceof RegExp) return true;\n return typeof val.flags === 'string'\n && typeof val.ignoreCase === 'boolean'\n && typeof val.multiline === 'boolean'\n && typeof val.global === 'boolean';\n}\n\nfunction isGeneratorFn(name, val) {\n return ctorName(name) === 'GeneratorFunction';\n}\n\nfunction isGeneratorObj(val) {\n return typeof val.throw === 'function'\n && typeof val.return === 'function'\n && typeof val.next === 'function';\n}\n\nfunction isArguments(val) {\n try {\n if (typeof val.length === 'number' && typeof val.callee === 'function') {\n return true;\n }\n } catch (err) {\n if (err.message.indexOf('callee') !== -1) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * If you need to support Safari 5-7 (8-10 yr-old browser),\n * take a look at https://github.com/feross/is-buffer\n */\n\nfunction isBuffer(val) {\n if (val.constructor && typeof val.constructor.isBuffer === 'function') {\n return val.constructor.isBuffer(val);\n }\n return false;\n}\n", "var toString = Object.prototype.toString;\n\nmodule.exports = function kindOf(val) {\n if (val === void 0) return 'undefined';\n if (val === null) return 'null';\n\n var type = typeof val;\n if (type === 'boolean') return 'boolean';\n if (type === 'string') return 'string';\n if (type === 'number') return 'number';\n if (type === 'symbol') return 'symbol';\n if (type === 'function') {\n return isGeneratorFn(val) ? 'generatorfunction' : 'function';\n }\n\n if (isArray(val)) return 'array';\n if (isBuffer(val)) return 'buffer';\n if (isArguments(val)) return 'arguments';\n if (isDate(val)) return 'date';\n if (isError(val)) return 'error';\n if (isRegexp(val)) return 'regexp';\n\n switch (ctorName(val)) {\n case 'Symbol': return 'symbol';\n case 'Promise': return 'promise';\n\n // Set, Map, WeakSet, WeakMap\n case 'WeakMap': return 'weakmap';\n case 'WeakSet': return 'weakset';\n case 'Map': return 'map';\n case 'Set': return 'set';\n\n // 8-bit typed arrays\n case 'Int8Array': return 'int8array';\n case 'Uint8Array': return 'uint8array';\n case 'Uint8ClampedArray': return 'uint8clampedarray';\n\n // 16-bit typed arrays\n case 'Int16Array': return 'int16array';\n case 'Uint16Array': return 'uint16array';\n\n // 32-bit typed arrays\n case 'Int32Array': return 'int32array';\n case 'Uint32Array': return 'uint32array';\n case 'Float32Array': return 'float32array';\n case 'Float64Array': return 'float64array';\n }\n\n if (isGeneratorObj(val)) {\n return 'generator';\n }\n\n // Non-plain objects\n type = toString.call(val);\n switch (type) {\n case '[object Object]': return 'object';\n // iterators\n case '[object Map Iterator]': return 'mapiterator';\n case '[object Set Iterator]': return 'setiterator';\n case '[object String Iterator]': return 'stringiterator';\n case '[object Array Iterator]': return 'arrayiterator';\n }\n\n // other\n return type.slice(8, -1).toLowerCase().replace(/\\s/g, '');\n};\n\nfunction ctorName(val) {\n return typeof val.constructor === 'function' ? val.constructor.name : null;\n}\n\nfunction isArray(val) {\n if (Array.isArray) return Array.isArray(val);\n return val instanceof Array;\n}\n\nfunction isError(val) {\n return val instanceof Error || (typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number');\n}\n\nfunction isDate(val) {\n if (val instanceof Date) return true;\n return typeof val.toDateString === 'function'\n && typeof val.getDate === 'function'\n && typeof val.setDate === 'function';\n}\n\nfunction isRegexp(val) {\n if (val instanceof RegExp) return true;\n return typeof val.flags === 'string'\n && typeof val.ignoreCase === 'boolean'\n && typeof val.multiline === 'boolean'\n && typeof val.global === 'boolean';\n}\n\nfunction isGeneratorFn(name, val) {\n return ctorName(name) === 'GeneratorFunction';\n}\n\nfunction isGeneratorObj(val) {\n return typeof val.throw === 'function'\n && typeof val.return === 'function'\n && typeof val.next === 'function';\n}\n\nfunction isArguments(val) {\n try {\n if (typeof val.length === 'number' && typeof val.callee === 'function') {\n return true;\n }\n } catch (err) {\n if (err.message.indexOf('callee') !== -1) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * If you need to support Safari 5-7 (8-10 yr-old browser),\n * take a look at https://github.com/feross/is-buffer\n */\n\nfunction isBuffer(val) {\n if (val.constructor && typeof val.constructor.isBuffer === 'function') {\n return val.constructor.isBuffer(val);\n }\n return false;\n}\n", "/*!\n * is-accessor-descriptor <https://github.com/jonschlinkert/is-accessor-descriptor>\n *\n * Copyright (c) 2015-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar typeOf = require('kind-of');\n\n// accessor descriptor properties\nvar accessor = {\n get: 'function',\n set: 'function',\n configurable: 'boolean',\n enumerable: 'boolean'\n};\n\nfunction isAccessorDescriptor(obj, prop) {\n if (typeof prop === 'string') {\n var val = Object.getOwnPropertyDescriptor(obj, prop);\n return typeof val !== 'undefined';\n }\n\n if (typeOf(obj) !== 'object') {\n return false;\n }\n\n if (has(obj, 'value') || has(obj, 'writable')) {\n return false;\n }\n\n if (!has(obj, 'get') || typeof obj.get !== 'function') {\n return false;\n }\n\n // tldr: it's valid to have \"set\" be undefined\n // \"set\" might be undefined if `Object.getOwnPropertyDescriptor`\n // was used to get the value, and only `get` was defined by the user\n if (has(obj, 'set') && typeof obj[key] !== 'function' && typeof obj[key] !== 'undefined') {\n return false;\n }\n\n for (var key in obj) {\n if (!accessor.hasOwnProperty(key)) {\n continue;\n }\n\n if (typeOf(obj[key]) === accessor[key]) {\n continue;\n }\n\n if (typeof obj[key] !== 'undefined') {\n return false;\n }\n }\n return true;\n}\n\nfunction has(obj, key) {\n return {}.hasOwnProperty.call(obj, key);\n}\n\n/**\n * Expose `isAccessorDescriptor`\n */\n\nmodule.exports = isAccessorDescriptor;\n", "var toString = Object.prototype.toString;\n\nmodule.exports = function kindOf(val) {\n if (val === void 0) return 'undefined';\n if (val === null) return 'null';\n\n var type = typeof val;\n if (type === 'boolean') return 'boolean';\n if (type === 'string') return 'string';\n if (type === 'number') return 'number';\n if (type === 'symbol') return 'symbol';\n if (type === 'function') {\n return isGeneratorFn(val) ? 'generatorfunction' : 'function';\n }\n\n if (isArray(val)) return 'array';\n if (isBuffer(val)) return 'buffer';\n if (isArguments(val)) return 'arguments';\n if (isDate(val)) return 'date';\n if (isError(val)) return 'error';\n if (isRegexp(val)) return 'regexp';\n\n switch (ctorName(val)) {\n case 'Symbol': return 'symbol';\n case 'Promise': return 'promise';\n\n // Set, Map, WeakSet, WeakMap\n case 'WeakMap': return 'weakmap';\n case 'WeakSet': return 'weakset';\n case 'Map': return 'map';\n case 'Set': return 'set';\n\n // 8-bit typed arrays\n case 'Int8Array': return 'int8array';\n case 'Uint8Array': return 'uint8array';\n case 'Uint8ClampedArray': return 'uint8clampedarray';\n\n // 16-bit typed arrays\n case 'Int16Array': return 'int16array';\n case 'Uint16Array': return 'uint16array';\n\n // 32-bit typed arrays\n case 'Int32Array': return 'int32array';\n case 'Uint32Array': return 'uint32array';\n case 'Float32Array': return 'float32array';\n case 'Float64Array': return 'float64array';\n }\n\n if (isGeneratorObj(val)) {\n return 'generator';\n }\n\n // Non-plain objects\n type = toString.call(val);\n switch (type) {\n case '[object Object]': return 'object';\n // iterators\n case '[object Map Iterator]': return 'mapiterator';\n case '[object Set Iterator]': return 'setiterator';\n case '[object String Iterator]': return 'stringiterator';\n case '[object Array Iterator]': return 'arrayiterator';\n }\n\n // other\n return type.slice(8, -1).toLowerCase().replace(/\\s/g, '');\n};\n\nfunction ctorName(val) {\n return typeof val.constructor === 'function' ? val.constructor.name : null;\n}\n\nfunction isArray(val) {\n if (Array.isArray) return Array.isArray(val);\n return val instanceof Array;\n}\n\nfunction isError(val) {\n return val instanceof Error || (typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number');\n}\n\nfunction isDate(val) {\n if (val instanceof Date) return true;\n return typeof val.toDateString === 'function'\n && typeof val.getDate === 'function'\n && typeof val.setDate === 'function';\n}\n\nfunction isRegexp(val) {\n if (val instanceof RegExp) return true;\n return typeof val.flags === 'string'\n && typeof val.ignoreCase === 'boolean'\n && typeof val.multiline === 'boolean'\n && typeof val.global === 'boolean';\n}\n\nfunction isGeneratorFn(name, val) {\n return ctorName(name) === 'GeneratorFunction';\n}\n\nfunction isGeneratorObj(val) {\n return typeof val.throw === 'function'\n && typeof val.return === 'function'\n && typeof val.next === 'function';\n}\n\nfunction isArguments(val) {\n try {\n if (typeof val.length === 'number' && typeof val.callee === 'function') {\n return true;\n }\n } catch (err) {\n if (err.message.indexOf('callee') !== -1) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * If you need to support Safari 5-7 (8-10 yr-old browser),\n * take a look at https://github.com/feross/is-buffer\n */\n\nfunction isBuffer(val) {\n if (val.constructor && typeof val.constructor.isBuffer === 'function') {\n return val.constructor.isBuffer(val);\n }\n return false;\n}\n", "/*!\n * is-data-descriptor <https://github.com/jonschlinkert/is-data-descriptor>\n *\n * Copyright (c) 2015-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar typeOf = require('kind-of');\n\nmodule.exports = function isDataDescriptor(obj, prop) {\n // data descriptor properties\n var data = {\n configurable: 'boolean',\n enumerable: 'boolean',\n writable: 'boolean'\n };\n\n if (typeOf(obj) !== 'object') {\n return false;\n }\n\n if (typeof prop === 'string') {\n var val = Object.getOwnPropertyDescriptor(obj, prop);\n return typeof val !== 'undefined';\n }\n\n if (!('value' in obj) && !('writable' in obj)) {\n return false;\n }\n\n for (var key in obj) {\n if (key === 'value') continue;\n\n if (!data.hasOwnProperty(key)) {\n continue;\n }\n\n if (typeOf(obj[key]) === data[key]) {\n continue;\n }\n\n if (typeof obj[key] !== 'undefined') {\n return false;\n }\n }\n return true;\n};\n", "/*!\n * is-descriptor <https://github.com/jonschlinkert/is-descriptor>\n *\n * Copyright (c) 2015-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar typeOf = require('kind-of');\nvar isAccessor = require('is-accessor-descriptor');\nvar isData = require('is-data-descriptor');\n\nmodule.exports = function isDescriptor(obj, key) {\n if (typeOf(obj) !== 'object') {\n return false;\n }\n if ('get' in obj) {\n return isAccessor(obj, key);\n }\n return isData(obj, key);\n};\n", "/*!\n * define-property <https://github.com/jonschlinkert/define-property>\n *\n * Copyright (c) 2015-2018, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar isobject = require('isobject');\nvar isDescriptor = require('is-descriptor');\nvar define = (typeof Reflect !== 'undefined' && Reflect.defineProperty)\n ? Reflect.defineProperty\n : Object.defineProperty;\n\nmodule.exports = function defineProperty(obj, key, val) {\n if (!isobject(obj) && typeof obj !== 'function' && !Array.isArray(obj)) {\n throw new TypeError('expected an object, function, or array');\n }\n\n if (typeof key !== 'string') {\n throw new TypeError('expected \"key\" to be a string');\n }\n\n if (isDescriptor(val)) {\n define(obj, key, val);\n return obj;\n }\n\n define(obj, key, {\n configurable: true,\n enumerable: false,\n writable: true,\n value: val\n });\n\n return obj;\n};\n", "/*!\n * is-plain-object <https://github.com/jonschlinkert/is-plain-object>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar isObject = require('isobject');\n\nfunction isObjectObject(o) {\n return isObject(o) === true\n && Object.prototype.toString.call(o) === '[object Object]';\n}\n\nmodule.exports = function isPlainObject(o) {\n var ctor,prot;\n\n if (isObjectObject(o) === false) return false;\n\n // If has modified constructor\n ctor = o.constructor;\n if (typeof ctor !== 'function') return false;\n\n // If has modified prototype\n prot = ctor.prototype;\n if (isObjectObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (prot.hasOwnProperty('isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n};\n", "/*!\n * is-extendable <https://github.com/jonschlinkert/is-extendable>\n *\n * Copyright (c) 2015-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar isPlainObject = require('is-plain-object');\n\nmodule.exports = function isExtendable(val) {\n return isPlainObject(val) || typeof val === 'function' || Array.isArray(val);\n};\n", "/*!\n * assign-symbols <https://github.com/jonschlinkert/assign-symbols>\n *\n * Copyright (c) 2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function(receiver, objects) {\n if (receiver === null || typeof receiver === 'undefined') {\n throw new TypeError('expected first argument to be an object.');\n }\n\n if (typeof objects === 'undefined' || typeof Symbol === 'undefined') {\n return receiver;\n }\n\n if (typeof Object.getOwnPropertySymbols !== 'function') {\n return receiver;\n }\n\n var isEnumerable = Object.prototype.propertyIsEnumerable;\n var target = Object(receiver);\n var len = arguments.length, i = 0;\n\n while (++i < len) {\n var provider = Object(arguments[i]);\n var names = Object.getOwnPropertySymbols(provider);\n\n for (var j = 0; j < names.length; j++) {\n var key = names[j];\n\n if (isEnumerable.call(provider, key)) {\n target[key] = provider[key];\n }\n }\n }\n return target;\n};\n", "'use strict';\n\nvar isExtendable = require('is-extendable');\nvar assignSymbols = require('assign-symbols');\n\nmodule.exports = Object.assign || function(obj/*, objects*/) {\n if (obj === null || typeof obj === 'undefined') {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n if (!isObject(obj)) {\n obj = {};\n }\n for (var i = 1; i < arguments.length; i++) {\n var val = arguments[i];\n if (isString(val)) {\n val = toObject(val);\n }\n if (isObject(val)) {\n assign(obj, val);\n assignSymbols(obj, val);\n }\n }\n return obj;\n};\n\nfunction assign(a, b) {\n for (var key in b) {\n if (hasOwn(b, key)) {\n a[key] = b[key];\n }\n }\n}\n\nfunction isString(val) {\n return (val && typeof val === 'string');\n}\n\nfunction toObject(str) {\n var obj = {};\n for (var i in str) {\n obj[i] = str[i];\n }\n return obj;\n}\n\nfunction isObject(val) {\n return (val && typeof val === 'object') || isExtendable(val);\n}\n\n/**\n * Returns true if the given `key` is an own property of `obj`.\n */\n\nfunction hasOwn(obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nfunction isEnum(obj, key) {\n return Object.prototype.propertyIsEnumerable.call(obj, key);\n}\n", "/*!\n * is-extendable <https://github.com/jonschlinkert/is-extendable>\n *\n * Copyright (c) 2015-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar isPlainObject = require('is-plain-object');\n\nmodule.exports = function isExtendable(val) {\n return isPlainObject(val) || typeof val === 'function' || Array.isArray(val);\n};\n", "'use strict';\n\nvar isExtendable = require('is-extendable');\nvar assignSymbols = require('assign-symbols');\n\nmodule.exports = Object.assign || function(obj/*, objects*/) {\n if (obj === null || typeof obj === 'undefined') {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n if (!isObject(obj)) {\n obj = {};\n }\n for (var i = 1; i < arguments.length; i++) {\n var val = arguments[i];\n if (isString(val)) {\n val = toObject(val);\n }\n if (isObject(val)) {\n assign(obj, val);\n assignSymbols(obj, val);\n }\n }\n return obj;\n};\n\nfunction assign(a, b) {\n for (var key in b) {\n if (hasOwn(b, key)) {\n a[key] = b[key];\n }\n }\n}\n\nfunction isString(val) {\n return (val && typeof val === 'string');\n}\n\nfunction toObject(str) {\n var obj = {};\n for (var i in str) {\n obj[i] = str[i];\n }\n return obj;\n}\n\nfunction isObject(val) {\n return (val && typeof val === 'object') || isExtendable(val);\n}\n\n/**\n * Returns true if the given `key` is an own property of `obj`.\n */\n\nfunction hasOwn(obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nfunction isEnum(obj, key) {\n return Object.prototype.propertyIsEnumerable.call(obj, key);\n}\n", "'use strict';\n\nvar extend = require('extend-shallow');\nvar safe = require('safe-regex');\n\n/**\n * The main export is a function that takes a `pattern` string and an `options` object.\n *\n * ```js\n & var not = require('regex-not');\n & console.log(not('foo'));\n & //=> /^(?:(?!^(?:foo)$).)*$/\n * ```\n *\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {RegExp} Converts the given `pattern` to a regex using the specified `options`.\n * @api public\n */\n\nfunction toRegex(pattern, options) {\n return new RegExp(toRegex.create(pattern, options));\n}\n\n/**\n * Create a regex-compatible string from the given `pattern` and `options`.\n *\n * ```js\n & var not = require('regex-not');\n & console.log(not.create('foo'));\n & //=> '^(?:(?!^(?:foo)$).)*$'\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {String}\n * @api public\n */\n\ntoRegex.create = function(pattern, options) {\n if (typeof pattern !== 'string') {\n throw new TypeError('expected a string');\n }\n\n var opts = extend({}, options);\n if (opts.contains === true) {\n opts.strictNegate = false;\n }\n\n var open = opts.strictOpen !== false ? '^' : '';\n var close = opts.strictClose !== false ? '$' : '';\n var endChar = opts.endChar ? opts.endChar : '+';\n var str = pattern;\n\n if (opts.strictNegate === false) {\n str = '(?:(?!(?:' + pattern + ')).)' + endChar;\n } else {\n str = '(?:(?!^(?:' + pattern + ')$).)' + endChar;\n }\n\n var res = open + str + close;\n if (opts.safe === true && safe(res) === false) {\n throw new Error('potentially unsafe regular expression: ' + res);\n }\n\n return res;\n};\n\n/**\n * Expose `toRegex`\n */\n\nmodule.exports = toRegex;\n", "'use strict';\n\nvar safe = require('safe-regex');\nvar define = require('define-property');\nvar extend = require('extend-shallow');\nvar not = require('regex-not');\nvar MAX_LENGTH = 1024 * 64;\n\n/**\n * Session cache\n */\n\nvar cache = {};\n\n/**\n * Create a regular expression from the given `pattern` string.\n *\n * @param {String|RegExp} `pattern` Pattern can be a string or regular expression.\n * @param {Object} `options`\n * @return {RegExp}\n * @api public\n */\n\nmodule.exports = function(patterns, options) {\n if (!Array.isArray(patterns)) {\n return makeRe(patterns, options);\n }\n return makeRe(patterns.join('|'), options);\n};\n\n/**\n * Create a regular expression from the given `pattern` string.\n *\n * @param {String|RegExp} `pattern` Pattern can be a string or regular expression.\n * @param {Object} `options`\n * @return {RegExp}\n * @api public\n */\n\nfunction makeRe(pattern, options) {\n if (pattern instanceof RegExp) {\n return pattern;\n }\n\n if (typeof pattern !== 'string') {\n throw new TypeError('expected a string');\n }\n\n if (pattern.length > MAX_LENGTH) {\n throw new Error('expected pattern to be less than ' + MAX_LENGTH + ' characters');\n }\n\n var key = pattern;\n // do this before shallow cloning options, it's a lot faster\n if (!options || (options && options.cache !== false)) {\n key = createKey(pattern, options);\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n }\n\n var opts = extend({}, options);\n if (opts.contains === true) {\n if (opts.negate === true) {\n opts.strictNegate = false;\n } else {\n opts.strict = false;\n }\n }\n\n if (opts.strict === false) {\n opts.strictOpen = false;\n opts.strictClose = false;\n }\n\n var open = opts.strictOpen !== false ? '^' : '';\n var close = opts.strictClose !== false ? '$' : '';\n var flags = opts.flags || '';\n var regex;\n\n if (opts.nocase === true && !/i/.test(flags)) {\n flags += 'i';\n }\n\n try {\n if (opts.negate || typeof opts.strictNegate === 'boolean') {\n pattern = not.create(pattern, opts);\n }\n\n var str = open + '(?:' + pattern + ')' + close;\n regex = new RegExp(str, flags);\n\n if (opts.safe === true && safe(regex) === false) {\n throw new Error('potentially unsafe regular expression: ' + regex.source);\n }\n\n } catch (err) {\n if (opts.strictErrors === true || opts.safe === true) {\n err.key = key;\n err.pattern = pattern;\n err.originalOptions = options;\n err.createdOptions = opts;\n throw err;\n }\n\n try {\n regex = new RegExp('^' + pattern.replace(/(\\W)/g, '\\\\$1') + '$');\n } catch (err) {\n regex = /.^/; //<= match nothing\n }\n }\n\n if (opts.cache !== false) {\n memoize(regex, key, pattern, opts);\n }\n return regex;\n}\n\n/**\n * Memoize generated regex. This can result in dramatic speed improvements\n * and simplify debugging by adding options and pattern to the regex. It can be\n * disabled by passing setting `options.cache` to false.\n */\n\nfunction memoize(regex, key, pattern, options) {\n define(regex, 'cached', true);\n define(regex, 'pattern', pattern);\n define(regex, 'options', options);\n define(regex, 'key', key);\n cache[key] = regex;\n}\n\n/**\n * Create the key to use for memoization. The key is generated\n * by iterating over the options and concatenating key-value pairs\n * to the pattern string.\n */\n\nfunction createKey(pattern, options) {\n if (!options) return pattern;\n var key = pattern;\n for (var prop in options) {\n if (options.hasOwnProperty(prop)) {\n key += ';' + prop + '=' + String(options[prop]);\n }\n }\n return key;\n}\n\n/**\n * Expose `makeRe`\n */\n\nmodule.exports.makeRe = makeRe;\n", "/*!\n * array-unique <https://github.com/jonschlinkert/array-unique>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function unique(arr) {\n if (!Array.isArray(arr)) {\n throw new TypeError('array-unique expects an array.');\n }\n\n var len = arr.length;\n var i = -1;\n\n while (i++ < len) {\n var j = i + 1;\n\n for (; j < arr.length; ++j) {\n if (arr[i] === arr[j]) {\n arr.splice(j--, 1);\n }\n }\n }\n return arr;\n};\n\nmodule.exports.immutable = function uniqueImmutable(arr) {\n if (!Array.isArray(arr)) {\n throw new TypeError('array-unique expects an array.');\n }\n\n var arrLen = arr.length;\n var newArr = new Array(arrLen);\n\n for (var i = 0; i < arrLen; i++) {\n newArr[i] = arr[i];\n }\n\n return module.exports(newArr);\n};\n", "/*!\n * is-extendable <https://github.com/jonschlinkert/is-extendable>\n *\n * Copyright (c) 2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function isExtendable(val) {\n return typeof val !== 'undefined' && val !== null\n && (typeof val === 'object' || typeof val === 'function');\n};\n", "'use strict';\n\nvar isObject = require('is-extendable');\n\nmodule.exports = function extend(o/*, objects*/) {\n if (!isObject(o)) { o = {}; }\n\n var len = arguments.length;\n for (var i = 1; i < len; i++) {\n var obj = arguments[i];\n\n if (isObject(obj)) {\n assign(o, obj);\n }\n }\n return o;\n};\n\nfunction assign(a, b) {\n for (var key in b) {\n if (hasOwn(b, key)) {\n a[key] = b[key];\n }\n }\n}\n\n/**\n * Returns true if the given `key` is an own property of `obj`.\n */\n\nfunction hasOwn(obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n", "/*!\n * is-extendable <https://github.com/jonschlinkert/is-extendable>\n *\n * Copyright (c) 2015-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar isPlainObject = require('is-plain-object');\n\nmodule.exports = function isExtendable(val) {\n return isPlainObject(val) || typeof val === 'function' || Array.isArray(val);\n};\n", "'use strict';\n\nvar isExtendable = require('is-extendable');\nvar assignSymbols = require('assign-symbols');\n\nmodule.exports = Object.assign || function(obj/*, objects*/) {\n if (obj === null || typeof obj === 'undefined') {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n if (!isObject(obj)) {\n obj = {};\n }\n for (var i = 1; i < arguments.length; i++) {\n var val = arguments[i];\n if (isString(val)) {\n val = toObject(val);\n }\n if (isObject(val)) {\n assign(obj, val);\n assignSymbols(obj, val);\n }\n }\n return obj;\n};\n\nfunction assign(a, b) {\n for (var key in b) {\n if (hasOwn(b, key)) {\n a[key] = b[key];\n }\n }\n}\n\nfunction isString(val) {\n return (val && typeof val === 'string');\n}\n\nfunction toObject(str) {\n var obj = {};\n for (var i in str) {\n obj[i] = str[i];\n }\n return obj;\n}\n\nfunction isObject(val) {\n return (val && typeof val === 'object') || isExtendable(val);\n}\n\n/**\n * Returns true if the given `key` is an own property of `obj`.\n */\n\nfunction hasOwn(obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nfunction isEnum(obj, key) {\n return Object.prototype.propertyIsEnumerable.call(obj, key);\n}\n", "/*!\n * split-string <https://github.com/jonschlinkert/split-string>\n *\n * Copyright (c) 2015-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar extend = require('extend-shallow');\n\nmodule.exports = function(str, options, fn) {\n if (typeof str !== 'string') {\n throw new TypeError('expected a string');\n }\n\n if (typeof options === 'function') {\n fn = options;\n options = null;\n }\n\n // allow separator to be defined as a string\n if (typeof options === 'string') {\n options = { sep: options };\n }\n\n var opts = extend({sep: '.'}, options);\n var quotes = opts.quotes || ['\"', \"'\", '`'];\n var brackets;\n\n if (opts.brackets === true) {\n brackets = {\n '<': '>',\n '(': ')',\n '[': ']',\n '{': '}'\n };\n } else if (opts.brackets) {\n brackets = opts.brackets;\n }\n\n var tokens = [];\n var stack = [];\n var arr = [''];\n var sep = opts.sep;\n var len = str.length;\n var idx = -1;\n var closeIdx;\n\n function expected() {\n if (brackets && stack.length) {\n return brackets[stack[stack.length - 1]];\n }\n }\n\n while (++idx < len) {\n var ch = str[idx];\n var next = str[idx + 1];\n var tok = { val: ch, idx: idx, arr: arr, str: str };\n tokens.push(tok);\n\n if (ch === '\\\\') {\n tok.val = keepEscaping(opts, str, idx) === true ? (ch + next) : next;\n tok.escaped = true;\n if (typeof fn === 'function') {\n fn(tok);\n }\n arr[arr.length - 1] += tok.val;\n idx++;\n continue;\n }\n\n if (brackets && brackets[ch]) {\n stack.push(ch);\n var e = expected();\n var i = idx + 1;\n\n if (str.indexOf(e, i + 1) !== -1) {\n while (stack.length && i < len) {\n var s = str[++i];\n if (s === '\\\\') {\n s++;\n continue;\n }\n\n if (quotes.indexOf(s) !== -1) {\n i = getClosingQuote(str, s, i + 1);\n continue;\n }\n\n e = expected();\n if (stack.length && str.indexOf(e, i + 1) === -1) {\n break;\n }\n\n if (brackets[s]) {\n stack.push(s);\n continue;\n }\n\n if (e === s) {\n stack.pop();\n }\n }\n }\n\n closeIdx = i;\n if (closeIdx === -1) {\n arr[arr.length - 1] += ch;\n continue;\n }\n\n ch = str.slice(idx, closeIdx + 1);\n tok.val = ch;\n tok.idx = idx = closeIdx;\n }\n\n if (quotes.indexOf(ch) !== -1) {\n closeIdx = getClosingQuote(str, ch, idx + 1);\n if (closeIdx === -1) {\n arr[arr.length - 1] += ch;\n continue;\n }\n\n if (keepQuotes(ch, opts) === true) {\n ch = str.slice(idx, closeIdx + 1);\n } else {\n ch = str.slice(idx + 1, closeIdx);\n }\n\n tok.val = ch;\n tok.idx = idx = closeIdx;\n }\n\n if (typeof fn === 'function') {\n fn(tok, tokens);\n ch = tok.val;\n idx = tok.idx;\n }\n\n if (tok.val === sep && tok.split !== false) {\n arr.push('');\n continue;\n }\n\n arr[arr.length - 1] += tok.val;\n }\n\n return arr;\n};\n\nfunction getClosingQuote(str, ch, i, brackets) {\n var idx = str.indexOf(ch, i);\n if (str.charAt(idx - 1) === '\\\\') {\n return getClosingQuote(str, ch, idx + 1);\n }\n return idx;\n}\n\nfunction keepQuotes(ch, opts) {\n if (opts.keepDoubleQuotes === true && ch === '\"') return true;\n if (opts.keepSingleQuotes === true && ch === \"'\") return true;\n return opts.keepQuotes;\n}\n\nfunction keepEscaping(opts, str, idx) {\n if (typeof opts.keepEscaping === 'function') {\n return opts.keepEscaping(str, idx);\n }\n return opts.keepEscaping === true || str[idx + 1] === '\\\\';\n}\n", "/*!\n * arr-flatten <https://github.com/jonschlinkert/arr-flatten>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function (arr) {\n return flat(arr, []);\n};\n\nfunction flat(arr, res) {\n var i = 0, cur;\n var len = arr.length;\n for (; i < len; i++) {\n cur = arr[i];\n Array.isArray(cur) ? flat(cur, res) : res.push(cur);\n }\n return res;\n}\n", "/*!\n * Determine if an object is a Buffer\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n\n// The _isBuffer check is for Safari 5-7 support, because it's missing\n// Object.prototype.constructor. Remove this eventually\nmodule.exports = function (obj) {\n return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)\n}\n\nfunction isBuffer (obj) {\n return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n\n// For Node v0.10 support. Remove this eventually.\nfunction isSlowBuffer (obj) {\n return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))\n}\n", "var isBuffer = require('is-buffer');\nvar toString = Object.prototype.toString;\n\n/**\n * Get the native `typeof` a value.\n *\n * @param {*} `val`\n * @return {*} Native javascript type\n */\n\nmodule.exports = function kindOf(val) {\n // primitivies\n if (typeof val === 'undefined') {\n return 'undefined';\n }\n if (val === null) {\n return 'null';\n }\n if (val === true || val === false || val instanceof Boolean) {\n return 'boolean';\n }\n if (typeof val === 'string' || val instanceof String) {\n return 'string';\n }\n if (typeof val === 'number' || val instanceof Number) {\n return 'number';\n }\n\n // functions\n if (typeof val === 'function' || val instanceof Function) {\n return 'function';\n }\n\n // array\n if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) {\n return 'array';\n }\n\n // check for instances of RegExp and Date before calling `toString`\n if (val instanceof RegExp) {\n return 'regexp';\n }\n if (val instanceof Date) {\n return 'date';\n }\n\n // other objects\n var type = toString.call(val);\n\n if (type === '[object RegExp]') {\n return 'regexp';\n }\n if (type === '[object Date]') {\n return 'date';\n }\n if (type === '[object Arguments]') {\n return 'arguments';\n }\n if (type === '[object Error]') {\n return 'error';\n }\n\n // buffer\n if (isBuffer(val)) {\n return 'buffer';\n }\n\n // es6: Map, WeakMap, Set, WeakSet\n if (type === '[object Set]') {\n return 'set';\n }\n if (type === '[object WeakSet]') {\n return 'weakset';\n }\n if (type === '[object Map]') {\n return 'map';\n }\n if (type === '[object WeakMap]') {\n return 'weakmap';\n }\n if (type === '[object Symbol]') {\n return 'symbol';\n }\n\n // typed arrays\n if (type === '[object Int8Array]') {\n return 'int8array';\n }\n if (type === '[object Uint8Array]') {\n return 'uint8array';\n }\n if (type === '[object Uint8ClampedArray]') {\n return 'uint8clampedarray';\n }\n if (type === '[object Int16Array]') {\n return 'int16array';\n }\n if (type === '[object Uint16Array]') {\n return 'uint16array';\n }\n if (type === '[object Int32Array]') {\n return 'int32array';\n }\n if (type === '[object Uint32Array]') {\n return 'uint32array';\n }\n if (type === '[object Float32Array]') {\n return 'float32array';\n }\n if (type === '[object Float64Array]') {\n return 'float64array';\n }\n\n // must be a plain object\n return 'object';\n};\n", "/*!\n * is-number <https://github.com/jonschlinkert/is-number>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nvar typeOf = require('kind-of');\n\nmodule.exports = function isNumber(num) {\n var type = typeOf(num);\n\n if (type === 'string') {\n if (!num.trim()) return false;\n } else if (type !== 'number') {\n return false;\n }\n\n return (num - num + 1) >= 0;\n};\n", "/*!\n * is-extendable <https://github.com/jonschlinkert/is-extendable>\n *\n * Copyright (c) 2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function isExtendable(val) {\n return typeof val !== 'undefined' && val !== null\n && (typeof val === 'object' || typeof val === 'function');\n};\n", "'use strict';\n\nvar isObject = require('is-extendable');\n\nmodule.exports = function extend(o/*, objects*/) {\n if (!isObject(o)) { o = {}; }\n\n var len = arguments.length;\n for (var i = 1; i < len; i++) {\n var obj = arguments[i];\n\n if (isObject(obj)) {\n assign(o, obj);\n }\n }\n return o;\n};\n\nfunction assign(a, b) {\n for (var key in b) {\n if (hasOwn(b, key)) {\n a[key] = b[key];\n }\n }\n}\n\n/**\n * Returns true if the given `key` is an own property of `obj`.\n */\n\nfunction hasOwn(obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n", "/*!\n * to-regex-range <https://github.com/jonschlinkert/to-regex-range>\n *\n * Copyright (c) 2015, 2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar repeat = require('repeat-string');\nvar isNumber = require('is-number');\nvar cache = {};\n\nfunction toRegexRange(min, max, options) {\n if (isNumber(min) === false) {\n throw new RangeError('toRegexRange: first argument is invalid.');\n }\n\n if (typeof max === 'undefined' || min === max) {\n return String(min);\n }\n\n if (isNumber(max) === false) {\n throw new RangeError('toRegexRange: second argument is invalid.');\n }\n\n options = options || {};\n var relax = String(options.relaxZeros);\n var shorthand = String(options.shorthand);\n var capture = String(options.capture);\n var key = min + ':' + max + '=' + relax + shorthand + capture;\n if (cache.hasOwnProperty(key)) {\n return cache[key].result;\n }\n\n var a = Math.min(min, max);\n var b = Math.max(min, max);\n\n if (Math.abs(a - b) === 1) {\n var result = min + '|' + max;\n if (options.capture) {\n return '(' + result + ')';\n }\n return result;\n }\n\n var isPadded = padding(min) || padding(max);\n var positives = [];\n var negatives = [];\n\n var tok = {min: min, max: max, a: a, b: b};\n if (isPadded) {\n tok.isPadded = isPadded;\n tok.maxLen = String(tok.max).length;\n }\n\n if (a < 0) {\n var newMin = b < 0 ? Math.abs(b) : 1;\n var newMax = Math.abs(a);\n negatives = splitToPatterns(newMin, newMax, tok, options);\n a = tok.a = 0;\n }\n\n if (b >= 0) {\n positives = splitToPatterns(a, b, tok, options);\n }\n\n tok.negatives = negatives;\n tok.positives = positives;\n tok.result = siftPatterns(negatives, positives, options);\n\n if (options.capture && (positives.length + negatives.length) > 1) {\n tok.result = '(' + tok.result + ')';\n }\n\n cache[key] = tok;\n return tok.result;\n}\n\nfunction siftPatterns(neg, pos, options) {\n var onlyNegative = filterPatterns(neg, pos, '-', false, options) || [];\n var onlyPositive = filterPatterns(pos, neg, '', false, options) || [];\n var intersected = filterPatterns(neg, pos, '-?', true, options) || [];\n var subpatterns = onlyNegative.concat(intersected).concat(onlyPositive);\n return subpatterns.join('|');\n}\n\nfunction splitToRanges(min, max) {\n min = Number(min);\n max = Number(max);\n\n var nines = 1;\n var stops = [max];\n var stop = +countNines(min, nines);\n\n while (min <= stop && stop <= max) {\n stops = push(stops, stop);\n nines += 1;\n stop = +countNines(min, nines);\n }\n\n var zeros = 1;\n stop = countZeros(max + 1, zeros) - 1;\n\n while (min < stop && stop <= max) {\n stops = push(stops, stop);\n zeros += 1;\n stop = countZeros(max + 1, zeros) - 1;\n }\n\n stops.sort(compare);\n return stops;\n}\n\n/**\n * Convert a range to a regex pattern\n * @param {Number} `start`\n * @param {Number} `stop`\n * @return {String}\n */\n\nfunction rangeToPattern(start, stop, options) {\n if (start === stop) {\n return {pattern: String(start), digits: []};\n }\n\n var zipped = zip(String(start), String(stop));\n var len = zipped.length, i = -1;\n\n var pattern = '';\n var digits = 0;\n\n while (++i < len) {\n var numbers = zipped[i];\n var startDigit = numbers[0];\n var stopDigit = numbers[1];\n\n if (startDigit === stopDigit) {\n pattern += startDigit;\n\n } else if (startDigit !== '0' || stopDigit !== '9') {\n pattern += toCharacterClass(startDigit, stopDigit);\n\n } else {\n digits += 1;\n }\n }\n\n if (digits) {\n pattern += options.shorthand ? '\\\\d' : '[0-9]';\n }\n\n return { pattern: pattern, digits: [digits] };\n}\n\nfunction splitToPatterns(min, max, tok, options) {\n var ranges = splitToRanges(min, max);\n var len = ranges.length;\n var idx = -1;\n\n var tokens = [];\n var start = min;\n var prev;\n\n while (++idx < len) {\n var range = ranges[idx];\n var obj = rangeToPattern(start, range, options);\n var zeros = '';\n\n if (!tok.isPadded && prev && prev.pattern === obj.pattern) {\n if (prev.digits.length > 1) {\n prev.digits.pop();\n }\n prev.digits.push(obj.digits[0]);\n prev.string = prev.pattern + toQuantifier(prev.digits);\n start = range + 1;\n continue;\n }\n\n if (tok.isPadded) {\n zeros = padZeros(range, tok);\n }\n\n obj.string = zeros + obj.pattern + toQuantifier(obj.digits);\n tokens.push(obj);\n start = range + 1;\n prev = obj;\n }\n\n return tokens;\n}\n\nfunction filterPatterns(arr, comparison, prefix, intersection, options) {\n var res = [];\n\n for (var i = 0; i < arr.length; i++) {\n var tok = arr[i];\n var ele = tok.string;\n\n if (options.relaxZeros !== false) {\n if (prefix === '-' && ele.charAt(0) === '0') {\n if (ele.charAt(1) === '{') {\n ele = '0*' + ele.replace(/^0\\{\\d+\\}/, '');\n } else {\n ele = '0*' + ele.slice(1);\n }\n }\n }\n\n if (!intersection && !contains(comparison, 'string', ele)) {\n res.push(prefix + ele);\n }\n\n if (intersection && contains(comparison, 'string', ele)) {\n res.push(prefix + ele);\n }\n }\n return res;\n}\n\n/**\n * Zip strings (`for in` can be used on string characters)\n */\n\nfunction zip(a, b) {\n var arr = [];\n for (var ch in a) arr.push([a[ch], b[ch]]);\n return arr;\n}\n\nfunction compare(a, b) {\n return a > b ? 1 : b > a ? -1 : 0;\n}\n\nfunction push(arr, ele) {\n if (arr.indexOf(ele) === -1) arr.push(ele);\n return arr;\n}\n\nfunction contains(arr, key, val) {\n for (var i = 0; i < arr.length; i++) {\n if (arr[i][key] === val) {\n return true;\n }\n }\n return false;\n}\n\nfunction countNines(min, len) {\n return String(min).slice(0, -len) + repeat('9', len);\n}\n\nfunction countZeros(integer, zeros) {\n return integer - (integer % Math.pow(10, zeros));\n}\n\nfunction toQuantifier(digits) {\n var start = digits[0];\n var stop = digits[1] ? (',' + digits[1]) : '';\n if (!stop && (!start || start === 1)) {\n return '';\n }\n return '{' + start + stop + '}';\n}\n\nfunction toCharacterClass(a, b) {\n return '[' + a + ((b - a === 1) ? '' : '-') + b + ']';\n}\n\nfunction padding(str) {\n return /^-?(0+)\\d/.exec(str);\n}\n\nfunction padZeros(val, tok) {\n if (tok.isPadded) {\n var diff = Math.abs(tok.maxLen - String(val).length);\n switch (diff) {\n case 0:\n return '';\n case 1:\n return '0';\n default: {\n return '0{' + diff + '}';\n }\n }\n }\n return val;\n}\n\n/**\n * Expose `toRegexRange`\n */\n\nmodule.exports = toRegexRange;\n", "/*!\n * fill-range <https://github.com/jonschlinkert/fill-range>\n *\n * Copyright (c) 2014-2015, 2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar util = require('util');\nvar isNumber = require('is-number');\nvar extend = require('extend-shallow');\nvar repeat = require('repeat-string');\nvar toRegex = require('to-regex-range');\n\n/**\n * Return a range of numbers or letters.\n *\n * @param {String} `start` Start of the range\n * @param {String} `stop` End of the range\n * @param {String} `step` Increment or decrement to use.\n * @param {Function} `fn` Custom function to modify each element in the range.\n * @return {Array}\n */\n\nfunction fillRange(start, stop, step, options) {\n if (typeof start === 'undefined') {\n return [];\n }\n\n if (typeof stop === 'undefined' || start === stop) {\n // special case, for handling negative zero\n var isString = typeof start === 'string';\n if (isNumber(start) && !toNumber(start)) {\n return [isString ? '0' : 0];\n }\n return [start];\n }\n\n if (typeof step !== 'number' && typeof step !== 'string') {\n options = step;\n step = undefined;\n }\n\n if (typeof options === 'function') {\n options = { transform: options };\n }\n\n var opts = extend({step: step}, options);\n if (opts.step && !isValidNumber(opts.step)) {\n if (opts.strictRanges === true) {\n throw new TypeError('expected options.step to be a number');\n }\n return [];\n }\n\n opts.isNumber = isValidNumber(start) && isValidNumber(stop);\n if (!opts.isNumber && !isValid(start, stop)) {\n if (opts.strictRanges === true) {\n throw new RangeError('invalid range arguments: ' + util.inspect([start, stop]));\n }\n return [];\n }\n\n opts.isPadded = isPadded(start) || isPadded(stop);\n opts.toString = opts.stringify\n || typeof opts.step === 'string'\n || typeof start === 'string'\n || typeof stop === 'string'\n || !opts.isNumber;\n\n if (opts.isPadded) {\n opts.maxLength = Math.max(String(start).length, String(stop).length);\n }\n\n // support legacy minimatch/fill-range options\n if (typeof opts.optimize === 'boolean') opts.toRegex = opts.optimize;\n if (typeof opts.makeRe === 'boolean') opts.toRegex = opts.makeRe;\n return expand(start, stop, opts);\n}\n\nfunction expand(start, stop, options) {\n var a = options.isNumber ? toNumber(start) : start.charCodeAt(0);\n var b = options.isNumber ? toNumber(stop) : stop.charCodeAt(0);\n\n var step = Math.abs(toNumber(options.step)) || 1;\n if (options.toRegex && step === 1) {\n return toRange(a, b, start, stop, options);\n }\n\n var zero = {greater: [], lesser: []};\n var asc = a < b;\n var arr = new Array(Math.round((asc ? b - a : a - b) / step));\n var idx = 0;\n\n while (asc ? a <= b : a >= b) {\n var val = options.isNumber ? a : String.fromCharCode(a);\n if (options.toRegex && (val >= 0 || !options.isNumber)) {\n zero.greater.push(val);\n } else {\n zero.lesser.push(Math.abs(val));\n }\n\n if (options.isPadded) {\n val = zeros(val, options);\n }\n\n if (options.toString) {\n val = String(val);\n }\n\n if (typeof options.transform === 'function') {\n arr[idx++] = options.transform(val, a, b, step, idx, arr, options);\n } else {\n arr[idx++] = val;\n }\n\n if (asc) {\n a += step;\n } else {\n a -= step;\n }\n }\n\n if (options.toRegex === true) {\n return toSequence(arr, zero, options);\n }\n return arr;\n}\n\nfunction toRange(a, b, start, stop, options) {\n if (options.isPadded) {\n return toRegex(start, stop, options);\n }\n\n if (options.isNumber) {\n return toRegex(Math.min(a, b), Math.max(a, b), options);\n }\n\n var start = String.fromCharCode(Math.min(a, b));\n var stop = String.fromCharCode(Math.max(a, b));\n return '[' + start + '-' + stop + ']';\n}\n\nfunction toSequence(arr, zeros, options) {\n var greater = '', lesser = '';\n if (zeros.greater.length) {\n greater = zeros.greater.join('|');\n }\n if (zeros.lesser.length) {\n lesser = '-(' + zeros.lesser.join('|') + ')';\n }\n var res = greater && lesser\n ? greater + '|' + lesser\n : greater || lesser;\n\n if (options.capture) {\n return '(' + res + ')';\n }\n return res;\n}\n\nfunction zeros(val, options) {\n if (options.isPadded) {\n var str = String(val);\n var len = str.length;\n var dash = '';\n if (str.charAt(0) === '-') {\n dash = '-';\n str = str.slice(1);\n }\n var diff = options.maxLength - len;\n var pad = repeat('0', diff);\n val = (dash + pad + str);\n }\n if (options.stringify) {\n return String(val);\n }\n return val;\n}\n\nfunction toNumber(val) {\n return Number(val) || 0;\n}\n\nfunction isPadded(str) {\n return /^-?0\\d/.test(str);\n}\n\nfunction isValid(min, max) {\n return (isValidNumber(min) || isValidLetter(min))\n && (isValidNumber(max) || isValidLetter(max));\n}\n\nfunction isValidLetter(ch) {\n return typeof ch === 'string' && ch.length === 1 && /^\\w+$/.test(ch);\n}\n\nfunction isValidNumber(n) {\n return isNumber(n) && !/\\./.test(n);\n}\n\n/**\n * Expose `fillRange`\n * @type {Function}\n */\n\nmodule.exports = fillRange;\n", "/*!\n * repeat-element <https://github.com/jonschlinkert/repeat-element>\n *\n * Copyright (c) 2015-present, Jon Schlinkert.\n * Licensed under the MIT license.\n */\n\n'use strict';\n\nmodule.exports = function repeat(ele, num) {\n var arr = new Array(num);\n\n for (var i = 0; i < num; i++) {\n arr[i] = ele;\n }\n\n return arr;\n};\n", "'use strict';\n\nvar splitString = require('split-string');\nvar utils = module.exports;\n\n/**\n * Module dependencies\n */\n\nutils.extend = require('extend-shallow');\nutils.flatten = require('arr-flatten');\nutils.isObject = require('isobject');\nutils.fillRange = require('fill-range');\nutils.repeat = require('repeat-element');\nutils.unique = require('array-unique');\n\nutils.define = function(obj, key, val) {\n Object.defineProperty(obj, key, {\n writable: true,\n configurable: true,\n enumerable: false,\n value: val\n });\n};\n\n/**\n * Returns true if the given string contains only empty brace sets.\n */\n\nutils.isEmptySets = function(str) {\n return /^(?:\\{,\\})+$/.test(str);\n};\n\n/**\n * Returns true if the given string contains only empty brace sets.\n */\n\nutils.isQuotedString = function(str) {\n var open = str.charAt(0);\n if (open === '\\'' || open === '\"' || open === '`') {\n return str.slice(-1) === open;\n }\n return false;\n};\n\n/**\n * Create the key to use for memoization. The unique key is generated\n * by iterating over the options and concatenating key-value pairs\n * to the pattern string.\n */\n\nutils.createKey = function(pattern, options) {\n var id = pattern;\n if (typeof options === 'undefined') {\n return id;\n }\n var keys = Object.keys(options);\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n id += ';' + key + '=' + String(options[key]);\n }\n return id;\n};\n\n/**\n * Normalize options\n */\n\nutils.createOptions = function(options) {\n var opts = utils.extend.apply(null, arguments);\n if (typeof opts.expand === 'boolean') {\n opts.optimize = !opts.expand;\n }\n if (typeof opts.optimize === 'boolean') {\n opts.expand = !opts.optimize;\n }\n if (opts.optimize === true) {\n opts.makeRe = true;\n }\n return opts;\n};\n\n/**\n * Join patterns in `a` to patterns in `b`\n */\n\nutils.join = function(a, b, options) {\n options = options || {};\n a = utils.arrayify(a);\n b = utils.arrayify(b);\n\n if (!a.length) return b;\n if (!b.length) return a;\n\n var len = a.length;\n var idx = -1;\n var arr = [];\n\n while (++idx < len) {\n var val = a[idx];\n if (Array.isArray(val)) {\n for (var i = 0; i < val.length; i++) {\n val[i] = utils.join(val[i], b, options);\n }\n arr.push(val);\n continue;\n }\n\n for (var j = 0; j < b.length; j++) {\n var bval = b[j];\n\n if (Array.isArray(bval)) {\n arr.push(utils.join(val, bval, options));\n } else {\n arr.push(val + bval);\n }\n }\n }\n return arr;\n};\n\n/**\n * Split the given string on `,` if not escaped.\n */\n\nutils.split = function(str, options) {\n var opts = utils.extend({sep: ','}, options);\n if (typeof opts.keepQuotes !== 'boolean') {\n opts.keepQuotes = true;\n }\n if (opts.unescape === false) {\n opts.keepEscaping = true;\n }\n return splitString(str, opts, utils.escapeBrackets(opts));\n};\n\n/**\n * Expand ranges or sets in the given `pattern`.\n *\n * @param {String} `str`\n * @param {Object} `options`\n * @return {Object}\n */\n\nutils.expand = function(str, options) {\n var opts = utils.extend({rangeLimit: 10000}, options);\n var segs = utils.split(str, opts);\n var tok = { segs: segs };\n\n if (utils.isQuotedString(str)) {\n return tok;\n }\n\n if (opts.rangeLimit === true) {\n opts.rangeLimit = 10000;\n }\n\n if (segs.length > 1) {\n if (opts.optimize === false) {\n tok.val = segs[0];\n return tok;\n }\n\n tok.segs = utils.stringifyArray(tok.segs);\n } else if (segs.length === 1) {\n var arr = str.split('..');\n\n if (arr.length === 1) {\n tok.val = tok.segs[tok.segs.length - 1] || tok.val || str;\n tok.segs = [];\n return tok;\n }\n\n if (arr.length === 2 && arr[0] === arr[1]) {\n tok.escaped = true;\n tok.val = arr[0];\n tok.segs = [];\n return tok;\n }\n\n if (arr.length > 1) {\n if (opts.optimize !== false) {\n opts.optimize = true;\n delete opts.expand;\n }\n\n if (opts.optimize !== true) {\n var min = Math.min(arr[0], arr[1]);\n var max = Math.max(arr[0], arr[1]);\n var step = arr[2] || 1;\n\n if (opts.rangeLimit !== false && ((max - min) / step >= opts.rangeLimit)) {\n throw new RangeError('expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.');\n }\n }\n\n arr.push(opts);\n tok.segs = utils.fillRange.apply(null, arr);\n\n if (!tok.segs.length) {\n tok.escaped = true;\n tok.val = str;\n return tok;\n }\n\n if (opts.optimize === true) {\n tok.segs = utils.stringifyArray(tok.segs);\n }\n\n if (tok.segs === '') {\n tok.val = str;\n } else {\n tok.val = tok.segs[0];\n }\n return tok;\n }\n } else {\n tok.val = str;\n }\n return tok;\n};\n\n/**\n * Ensure commas inside brackets and parens are not split.\n * @param {Object} `tok` Token from the `split-string` module\n * @return {undefined}\n */\n\nutils.escapeBrackets = function(options) {\n return function(tok) {\n if (tok.escaped && tok.val === 'b') {\n tok.val = '\\\\b';\n return;\n }\n\n if (tok.val !== '(' && tok.val !== '[') return;\n var opts = utils.extend({}, options);\n var brackets = [];\n var parens = [];\n var stack = [];\n var val = tok.val;\n var str = tok.str;\n var i = tok.idx - 1;\n\n while (++i < str.length) {\n var ch = str[i];\n\n if (ch === '\\\\') {\n val += (opts.keepEscaping === false ? '' : ch) + str[++i];\n continue;\n }\n\n if (ch === '(') {\n parens.push(ch);\n stack.push(ch);\n }\n\n if (ch === '[') {\n brackets.push(ch);\n stack.push(ch);\n }\n\n if (ch === ')') {\n parens.pop();\n stack.pop();\n if (!stack.length) {\n val += ch;\n break;\n }\n }\n\n if (ch === ']') {\n brackets.pop();\n stack.pop();\n if (!stack.length) {\n val += ch;\n break;\n }\n }\n val += ch;\n }\n\n tok.split = false;\n tok.val = val.slice(1);\n tok.idx = i;\n };\n};\n\n/**\n * Returns true if the given string looks like a regex quantifier\n * @return {Boolean}\n */\n\nutils.isQuantifier = function(str) {\n return /^(?:[0-9]?,[0-9]|[0-9],)$/.test(str);\n};\n\n/**\n * Cast `val` to an array.\n * @param {*} `val`\n */\n\nutils.stringifyArray = function(arr) {\n return [utils.arrayify(arr).join('|')];\n};\n\n/**\n * Cast `val` to an array.\n * @param {*} `val`\n */\n\nutils.arrayify = function(arr) {\n if (typeof arr === 'undefined') {\n return [];\n }\n if (typeof arr === 'string') {\n return [arr];\n }\n return arr;\n};\n\n/**\n * Returns true if the given `str` is a non-empty string\n * @return {Boolean}\n */\n\nutils.isString = function(str) {\n return str != null && typeof str === 'string';\n};\n\n/**\n * Get the last element from `array`\n * @param {Array} `array`\n * @return {*}\n */\n\nutils.last = function(arr, n) {\n return arr[arr.length - (n || 1)];\n};\n\nutils.escapeRegex = function(str) {\n return str.replace(/\\\\?([!^*?()[\\]{}+?/])/g, '\\\\$1');\n};\n", "'use strict';\n\nvar utils = require('./utils');\n\nmodule.exports = function(braces, options) {\n braces.compiler\n\n /**\n * bos\n */\n\n .set('bos', function() {\n if (this.output) return;\n this.ast.queue = isEscaped(this.ast) ? [this.ast.val] : [];\n this.ast.count = 1;\n })\n\n /**\n * Square brackets\n */\n\n .set('bracket', function(node) {\n var close = node.close;\n var open = !node.escaped ? '[' : '\\\\[';\n var negated = node.negated;\n var inner = node.inner;\n\n inner = inner.replace(/\\\\(?=[\\\\\\w]|$)/g, '\\\\\\\\');\n if (inner === ']-') {\n inner = '\\\\]\\\\-';\n }\n\n if (negated && inner.indexOf('.') === -1) {\n inner += '.';\n }\n if (negated && inner.indexOf('/') === -1) {\n inner += '/';\n }\n\n var val = open + negated + inner + close;\n var queue = node.parent.queue;\n var last = utils.arrayify(queue.pop());\n\n queue.push(utils.join(last, val));\n queue.push.apply(queue, []);\n })\n\n /**\n * Brace\n */\n\n .set('brace', function(node) {\n node.queue = isEscaped(node) ? [node.val] : [];\n node.count = 1;\n return this.mapVisit(node.nodes);\n })\n\n /**\n * Open\n */\n\n .set('brace.open', function(node) {\n node.parent.open = node.val;\n })\n\n /**\n * Inner\n */\n\n .set('text', function(node) {\n var queue = node.parent.queue;\n var escaped = node.escaped;\n var segs = [node.val];\n\n if (node.optimize === false) {\n options = utils.extend({}, options, {optimize: false});\n }\n\n if (node.multiplier > 1) {\n node.parent.count *= node.multiplier;\n }\n\n if (options.quantifiers === true && utils.isQuantifier(node.val)) {\n escaped = true;\n\n } else if (node.val.length > 1) {\n if (isType(node.parent, 'brace') && !isEscaped(node)) {\n var expanded = utils.expand(node.val, options);\n segs = expanded.segs;\n\n if (expanded.isOptimized) {\n node.parent.isOptimized = true;\n }\n\n // if nothing was expanded, we probably have a literal brace\n if (!segs.length) {\n var val = (expanded.val || node.val);\n if (options.unescape !== false) {\n // unescape unexpanded brace sequence/set separators\n val = val.replace(/\\\\([,.])/g, '$1');\n // strip quotes\n val = val.replace(/[\"'`]/g, '');\n }\n\n segs = [val];\n escaped = true;\n }\n }\n\n } else if (node.val === ',') {\n if (options.expand) {\n node.parent.queue.push(['']);\n segs = [''];\n } else {\n segs = ['|'];\n }\n } else {\n escaped = true;\n }\n\n if (escaped && isType(node.parent, 'brace')) {\n if (node.parent.nodes.length <= 4 && node.parent.count === 1) {\n node.parent.escaped = true;\n } else if (node.parent.length <= 3) {\n node.parent.escaped = true;\n }\n }\n\n if (!hasQueue(node.parent)) {\n node.parent.queue = segs;\n return;\n }\n\n var last = utils.arrayify(queue.pop());\n if (node.parent.count > 1 && options.expand) {\n last = multiply(last, node.parent.count);\n node.parent.count = 1;\n }\n\n queue.push(utils.join(utils.flatten(last), segs.shift()));\n queue.push.apply(queue, segs);\n })\n\n /**\n * Close\n */\n\n .set('brace.close', function(node) {\n var queue = node.parent.queue;\n var prev = node.parent.parent;\n var last = prev.queue.pop();\n var open = node.parent.open;\n var close = node.val;\n\n if (open && close && isOptimized(node, options)) {\n open = '(';\n close = ')';\n }\n\n // if a close brace exists, and the previous segment is one character\n // don't wrap the result in braces or parens\n var ele = utils.last(queue);\n if (node.parent.count > 1 && options.expand) {\n ele = multiply(queue.pop(), node.parent.count);\n node.parent.count = 1;\n queue.push(ele);\n }\n\n if (close && typeof ele === 'string' && ele.length === 1) {\n open = '';\n close = '';\n }\n\n if ((isLiteralBrace(node, options) || noInner(node)) && !node.parent.hasEmpty) {\n queue.push(utils.join(open, queue.pop() || ''));\n queue = utils.flatten(utils.join(queue, close));\n }\n\n if (typeof last === 'undefined') {\n prev.queue = [queue];\n } else {\n prev.queue.push(utils.flatten(utils.join(last, queue)));\n }\n })\n\n /**\n * eos\n */\n\n .set('eos', function(node) {\n if (this.input) return;\n\n if (options.optimize !== false) {\n this.output = utils.last(utils.flatten(this.ast.queue));\n } else if (Array.isArray(utils.last(this.ast.queue))) {\n this.output = utils.flatten(this.ast.queue.pop());\n } else {\n this.output = utils.flatten(this.ast.queue);\n }\n\n if (node.parent.count > 1 && options.expand) {\n this.output = multiply(this.output, node.parent.count);\n }\n\n this.output = utils.arrayify(this.output);\n this.ast.queue = [];\n });\n\n};\n\n/**\n * Multiply the segments in the current brace level\n */\n\nfunction multiply(queue, n, options) {\n return utils.flatten(utils.repeat(utils.arrayify(queue), n));\n}\n\n/**\n * Return true if `node` is escaped\n */\n\nfunction isEscaped(node) {\n return node.escaped === true;\n}\n\n/**\n * Returns true if regex parens should be used for sets. If the parent `type`\n * is not `brace`, then we're on a root node, which means we should never\n * expand segments and open/close braces should be `{}` (since this indicates\n * a brace is missing from the set)\n */\n\nfunction isOptimized(node, options) {\n if (node.parent.isOptimized) return true;\n return isType(node.parent, 'brace')\n && !isEscaped(node.parent)\n && options.expand !== true;\n}\n\n/**\n * Returns true if the value in `node` should be wrapped in a literal brace.\n * @return {Boolean}\n */\n\nfunction isLiteralBrace(node, options) {\n return isEscaped(node.parent) || options.optimize !== false;\n}\n\n/**\n * Returns true if the given `node` does not have an inner value.\n * @return {Boolean}\n */\n\nfunction noInner(node, type) {\n if (node.parent.queue.length === 1) {\n return true;\n }\n var nodes = node.parent.nodes;\n return nodes.length === 3\n && isType(nodes[0], 'brace.open')\n && !isType(nodes[1], 'text')\n && isType(nodes[2], 'brace.close');\n}\n\n/**\n * Returns true if the given `node` is the given `type`\n * @return {Boolean}\n */\n\nfunction isType(node, type) {\n return typeof node !== 'undefined' && node.type === type;\n}\n\n/**\n * Returns true if the given `node` has a non-empty queue.\n * @return {Boolean}\n */\n\nfunction hasQueue(node) {\n return Array.isArray(node.queue) && node.queue.length;\n}\n", "/*!\n * define-property <https://github.com/jonschlinkert/define-property>\n *\n * Copyright (c) 2015, 2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar isDescriptor = require('is-descriptor');\n\nmodule.exports = function defineProperty(obj, prop, val) {\n if (typeof obj !== 'object' && typeof obj !== 'function') {\n throw new TypeError('expected an object or function.');\n }\n\n if (typeof prop !== 'string') {\n throw new TypeError('expected `prop` to be a string.');\n }\n\n if (isDescriptor(val) && ('set' in val || 'get' in val)) {\n return Object.defineProperty(obj, prop, val);\n }\n\n return Object.defineProperty(obj, prop, {\n configurable: true,\n enumerable: false,\n writable: true,\n value: val\n });\n};\n", "'use strict';\n\nvar typeOf = require('kind-of');\nvar utils = module.exports;\n\n/**\n * Returns true if the given value is a node.\n *\n * ```js\n * var Node = require('snapdragon-node');\n * var node = new Node({type: 'foo'});\n * console.log(utils.isNode(node)); //=> true\n * console.log(utils.isNode({})); //=> false\n * ```\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @returns {Boolean}\n * @api public\n */\n\nutils.isNode = function(node) {\n return typeOf(node) === 'object' && node.isNode === true;\n};\n\n/**\n * Emit an empty string for the given `node`.\n *\n * ```js\n * // do nothing for beginning-of-string\n * snapdragon.compiler.set('bos', utils.noop);\n * ```\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @returns {undefined}\n * @api public\n */\n\nutils.noop = function(node) {\n append(this, '', node);\n};\n\n/**\n * Appdend `node.val` to `compiler.output`, exactly as it was created\n * by the parser.\n *\n * ```js\n * snapdragon.compiler.set('text', utils.identity);\n * ```\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @returns {undefined}\n * @api public\n */\n\nutils.identity = function(node) {\n append(this, node.val, node);\n};\n\n/**\n * Previously named `.emit`, this method appends the given `val`\n * to `compiler.output` for the given node. Useful when you know\n * what value should be appended advance, regardless of the actual\n * value of `node.val`.\n *\n * ```js\n * snapdragon.compiler\n * .set('i', function(node) {\n * this.mapVisit(node);\n * })\n * .set('i.open', utils.append('<i>'))\n * .set('i.close', utils.append('</i>'))\n * ```\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @returns {Function} Returns a compiler middleware function.\n * @api public\n */\n\nutils.append = function(val) {\n return function(node) {\n append(this, val, node);\n };\n};\n\n/**\n * Used in compiler middleware, this onverts an AST node into\n * an empty `text` node and deletes `node.nodes` if it exists.\n * The advantage of this method is that, as opposed to completely\n * removing the node, indices will not need to be re-calculated\n * in sibling nodes, and nothing is appended to the output.\n *\n * ```js\n * utils.toNoop(node);\n * // convert `node.nodes` to the given value instead of deleting it\n * utils.toNoop(node, []);\n * ```\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @param {Array} `nodes` Optionally pass a new `nodes` value, to replace the existing `node.nodes` array.\n * @api public\n */\n\nutils.toNoop = function(node, nodes) {\n if (nodes) {\n node.nodes = nodes;\n } else {\n delete node.nodes;\n node.type = 'text';\n node.val = '';\n }\n};\n\n/**\n * Visit `node` with the given `fn`. The built-in `.visit` method in snapdragon\n * automatically calls registered compilers, this allows you to pass a visitor\n * function.\n *\n * ```js\n * snapdragon.compiler.set('i', function(node) {\n * utils.visit(node, function(childNode) {\n * // do stuff with \"childNode\"\n * return childNode;\n * });\n * });\n * ```\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @param {Function} `fn`\n * @return {Object} returns the node after recursively visiting all child nodes.\n * @api public\n */\n\nutils.visit = function(node, fn) {\n assert(utils.isNode(node), 'expected node to be an instance of Node');\n assert(isFunction(fn), 'expected a visitor function');\n fn(node);\n return node.nodes ? utils.mapVisit(node, fn) : node;\n};\n\n/**\n * Map [visit](#visit) the given `fn` over `node.nodes`. This is called by\n * [visit](#visit), use this method if you do not want `fn` to be called on\n * the first node.\n *\n * ```js\n * snapdragon.compiler.set('i', function(node) {\n * utils.mapVisit(node, function(childNode) {\n * // do stuff with \"childNode\"\n * return childNode;\n * });\n * });\n * ```\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @param {Object} `options`\n * @param {Function} `fn`\n * @return {Object} returns the node\n * @api public\n */\n\nutils.mapVisit = function(node, fn) {\n assert(utils.isNode(node), 'expected node to be an instance of Node');\n assert(isArray(node.nodes), 'expected node.nodes to be an array');\n assert(isFunction(fn), 'expected a visitor function');\n\n for (var i = 0; i < node.nodes.length; i++) {\n utils.visit(node.nodes[i], fn);\n }\n return node;\n};\n\n/**\n * Unshift an `*.open` node onto `node.nodes`.\n *\n * ```js\n * var Node = require('snapdragon-node');\n * snapdragon.parser.set('brace', function(node) {\n * var match = this.match(/^{/);\n * if (match) {\n * var parent = new Node({type: 'brace'});\n * utils.addOpen(parent, Node);\n * console.log(parent.nodes[0]):\n * // { type: 'brace.open', val: '' };\n *\n * // push the parent \"brace\" node onto the stack\n * this.push(parent);\n *\n * // return the parent node, so it's also added to the AST\n * return brace;\n * }\n * });\n * ```\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @param {Function} `Node` (required) Node constructor function from [snapdragon-node][].\n * @param {Function} `filter` Optionaly specify a filter function to exclude the node.\n * @return {Object} Returns the created opening node.\n * @api public\n */\n\nutils.addOpen = function(node, Node, val, filter) {\n assert(utils.isNode(node), 'expected node to be an instance of Node');\n assert(isFunction(Node), 'expected Node to be a constructor function');\n\n if (typeof val === 'function') {\n filter = val;\n val = '';\n }\n\n if (typeof filter === 'function' && !filter(node)) return;\n var open = new Node({ type: node.type + '.open', val: val});\n var unshift = node.unshift || node.unshiftNode;\n if (typeof unshift === 'function') {\n unshift.call(node, open);\n } else {\n utils.unshiftNode(node, open);\n }\n return open;\n};\n\n/**\n * Push a `*.close` node onto `node.nodes`.\n *\n * ```js\n * var Node = require('snapdragon-node');\n * snapdragon.parser.set('brace', function(node) {\n * var match = this.match(/^}/);\n * if (match) {\n * var parent = this.parent();\n * if (parent.type !== 'brace') {\n * throw new Error('missing opening: ' + '}');\n * }\n *\n * utils.addClose(parent, Node);\n * console.log(parent.nodes[parent.nodes.length - 1]):\n * // { type: 'brace.close', val: '' };\n *\n * // no need to return a node, since the parent\n * // was already added to the AST\n * return;\n * }\n * });\n * ```\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @param {Function} `Node` (required) Node constructor function from [snapdragon-node][].\n * @param {Function} `filter` Optionaly specify a filter function to exclude the node.\n * @return {Object} Returns the created closing node.\n * @api public\n */\n\nutils.addClose = function(node, Node, val, filter) {\n assert(utils.isNode(node), 'expected node to be an instance of Node');\n assert(isFunction(Node), 'expected Node to be a constructor function');\n\n if (typeof val === 'function') {\n filter = val;\n val = '';\n }\n\n if (typeof filter === 'function' && !filter(node)) return;\n var close = new Node({ type: node.type + '.close', val: val});\n var push = node.push || node.pushNode;\n if (typeof push === 'function') {\n push.call(node, close);\n } else {\n utils.pushNode(node, close);\n }\n return close;\n};\n\n/**\n * Wraps the given `node` with `*.open` and `*.close` nodes.\n *\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @param {Function} `Node` (required) Node constructor function from [snapdragon-node][].\n * @param {Function} `filter` Optionaly specify a filter function to exclude the node.\n * @return {Object} Returns the node\n * @api public\n */\n\nutils.wrapNodes = function(node, Node, filter) {\n assert(utils.isNode(node), 'expected node to be an instance of Node');\n assert(isFunction(Node), 'expected Node to be a constructor function');\n\n utils.addOpen(node, Node, filter);\n utils.addClose(node, Node, filter);\n return node;\n};\n\n/**\n * Push the given `node` onto `parent.nodes`, and set `parent` as `node.parent.\n *\n * ```js\n * var parent = new Node({type: 'foo'});\n * var node = new Node({type: 'bar'});\n * utils.pushNode(parent, node);\n * console.log(parent.nodes[0].type) // 'bar'\n * console.log(node.parent.type) // 'foo'\n * ```\n * @param {Object} `parent`\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @return {Object} Returns the child node\n * @api public\n */\n\nutils.pushNode = function(parent, node) {\n assert(utils.isNode(parent), 'expected parent node to be an instance of Node');\n assert(utils.isNode(node), 'expected node to be an instance of Node');\n\n node.define('parent', parent);\n parent.nodes = parent.nodes || [];\n parent.nodes.push(node);\n return node;\n};\n\n/**\n * Unshift `node` onto `parent.nodes`, and set `parent` as `node.parent.\n *\n * ```js\n * var parent = new Node({type: 'foo'});\n * var node = new Node({type: 'bar'});\n * utils.unshiftNode(parent, node);\n * console.log(parent.nodes[0].type) // 'bar'\n * console.log(node.parent.type) // 'foo'\n * ```\n * @param {Object} `parent`\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @return {undefined}\n * @api public\n */\n\nutils.unshiftNode = function(parent, node) {\n assert(utils.isNode(parent), 'expected parent node to be an instance of Node');\n assert(utils.isNode(node), 'expected node to be an instance of Node');\n\n node.define('parent', parent);\n parent.nodes = parent.nodes || [];\n parent.nodes.unshift(node);\n};\n\n/**\n * Pop the last `node` off of `parent.nodes`. The advantage of\n * using this method is that it checks for `node.nodes` and works\n * with any version of `snapdragon-node`.\n *\n * ```js\n * var parent = new Node({type: 'foo'});\n * utils.pushNode(parent, new Node({type: 'foo'}));\n * utils.pushNode(parent, new Node({type: 'bar'}));\n * utils.pushNode(parent, new Node({type: 'baz'}));\n * console.log(parent.nodes.length); //=> 3\n * utils.popNode(parent);\n * console.log(parent.nodes.length); //=> 2\n * ```\n * @param {Object} `parent`\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @return {Number|Undefined} Returns the length of `node.nodes` or undefined.\n * @api public\n */\n\nutils.popNode = function(node) {\n assert(utils.isNode(node), 'expected node to be an instance of Node');\n if (typeof node.pop === 'function') {\n return node.pop();\n }\n return node.nodes && node.nodes.pop();\n};\n\n/**\n * Shift the first `node` off of `parent.nodes`. The advantage of\n * using this method is that it checks for `node.nodes` and works\n * with any version of `snapdragon-node`.\n *\n * ```js\n * var parent = new Node({type: 'foo'});\n * utils.pushNode(parent, new Node({type: 'foo'}));\n * utils.pushNode(parent, new Node({type: 'bar'}));\n * utils.pushNode(parent, new Node({type: 'baz'}));\n * console.log(parent.nodes.length); //=> 3\n * utils.shiftNode(parent);\n * console.log(parent.nodes.length); //=> 2\n * ```\n * @param {Object} `parent`\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @return {Number|Undefined} Returns the length of `node.nodes` or undefined.\n * @api public\n */\n\nutils.shiftNode = function(node) {\n assert(utils.isNode(node), 'expected node to be an instance of Node');\n if (typeof node.shift === 'function') {\n return node.shift();\n }\n return node.nodes && node.nodes.shift();\n};\n\n/**\n * Remove the specified `node` from `parent.nodes`.\n *\n * ```js\n * var parent = new Node({type: 'abc'});\n * var foo = new Node({type: 'foo'});\n * utils.pushNode(parent, foo);\n * utils.pushNode(parent, new Node({type: 'bar'}));\n * utils.pushNode(parent, new Node({type: 'baz'}));\n * console.log(parent.nodes.length); //=> 3\n * utils.removeNode(parent, foo);\n * console.log(parent.nodes.length); //=> 2\n * ```\n * @param {Object} `parent`\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @return {Object|undefined} Returns the removed node, if successful, or undefined if it does not exist on `parent.nodes`.\n * @api public\n */\n\nutils.removeNode = function(parent, node) {\n assert(utils.isNode(parent), 'expected parent.node to be an instance of Node');\n assert(utils.isNode(node), 'expected node to be an instance of Node');\n\n if (!parent.nodes) {\n return null;\n }\n\n if (typeof parent.remove === 'function') {\n return parent.remove(node);\n }\n\n var idx = parent.nodes.indexOf(node);\n if (idx !== -1) {\n return parent.nodes.splice(idx, 1);\n }\n};\n\n/**\n * Returns true if `node.type` matches the given `type`. Throws a\n * `TypeError` if `node` is not an instance of `Node`.\n *\n * ```js\n * var Node = require('snapdragon-node');\n * var node = new Node({type: 'foo'});\n * console.log(utils.isType(node, 'foo')); // false\n * console.log(utils.isType(node, 'bar')); // true\n * ```\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @param {String} `type`\n * @return {Boolean}\n * @api public\n */\n\nutils.isType = function(node, type) {\n assert(utils.isNode(node), 'expected node to be an instance of Node');\n switch (typeOf(type)) {\n case 'array':\n var types = type.slice();\n for (var i = 0; i < types.length; i++) {\n if (utils.isType(node, types[i])) {\n return true;\n }\n }\n return false;\n case 'string':\n return node.type === type;\n case 'regexp':\n return type.test(node.type);\n default: {\n throw new TypeError('expected \"type\" to be an array, string or regexp');\n }\n }\n};\n\n/**\n * Returns true if the given `node` has the given `type` in `node.nodes`.\n * Throws a `TypeError` if `node` is not an instance of `Node`.\n *\n * ```js\n * var Node = require('snapdragon-node');\n * var node = new Node({\n * type: 'foo',\n * nodes: [\n * new Node({type: 'bar'}),\n * new Node({type: 'baz'})\n * ]\n * });\n * console.log(utils.hasType(node, 'xyz')); // false\n * console.log(utils.hasType(node, 'baz')); // true\n * ```\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @param {String} `type`\n * @return {Boolean}\n * @api public\n */\n\nutils.hasType = function(node, type) {\n assert(utils.isNode(node), 'expected node to be an instance of Node');\n if (!Array.isArray(node.nodes)) return false;\n for (var i = 0; i < node.nodes.length; i++) {\n if (utils.isType(node.nodes[i], type)) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * Returns the first node from `node.nodes` of the given `type`\n *\n * ```js\n * var node = new Node({\n * type: 'foo',\n * nodes: [\n * new Node({type: 'text', val: 'abc'}),\n * new Node({type: 'text', val: 'xyz'})\n * ]\n * });\n *\n * var textNode = utils.firstOfType(node.nodes, 'text');\n * console.log(textNode.val);\n * //=> 'abc'\n * ```\n * @param {Array} `nodes`\n * @param {String} `type`\n * @return {Object|undefined} Returns the first matching node or undefined.\n * @api public\n */\n\nutils.firstOfType = function(nodes, type) {\n for (var i = 0; i < nodes.length; i++) {\n var node = nodes[i];\n if (utils.isType(node, type)) {\n return node;\n }\n }\n};\n\n/**\n * Returns the node at the specified index, or the first node of the\n * given `type` from `node.nodes`.\n *\n * ```js\n * var node = new Node({\n * type: 'foo',\n * nodes: [\n * new Node({type: 'text', val: 'abc'}),\n * new Node({type: 'text', val: 'xyz'})\n * ]\n * });\n *\n * var nodeOne = utils.findNode(node.nodes, 'text');\n * console.log(nodeOne.val);\n * //=> 'abc'\n *\n * var nodeTwo = utils.findNode(node.nodes, 1);\n * console.log(nodeTwo.val);\n * //=> 'xyz'\n * ```\n *\n * @param {Array} `nodes`\n * @param {String|Number} `type` Node type or index.\n * @return {Object} Returns a node or undefined.\n * @api public\n */\n\nutils.findNode = function(nodes, type) {\n if (!Array.isArray(nodes)) {\n return null;\n }\n if (typeof type === 'number') {\n return nodes[type];\n }\n return utils.firstOfType(nodes, type);\n};\n\n/**\n * Returns true if the given node is an \"*.open\" node.\n *\n * ```js\n * var Node = require('snapdragon-node');\n * var brace = new Node({type: 'brace'});\n * var open = new Node({type: 'brace.open'});\n * var close = new Node({type: 'brace.close'});\n *\n * console.log(utils.isOpen(brace)); // false\n * console.log(utils.isOpen(open)); // true\n * console.log(utils.isOpen(close)); // false\n * ```\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @return {Boolean}\n * @api public\n */\n\nutils.isOpen = function(node) {\n assert(utils.isNode(node), 'expected node to be an instance of Node');\n return node.type.slice(-5) === '.open';\n};\n\n/**\n * Returns true if the given node is a \"*.close\" node.\n *\n * ```js\n * var Node = require('snapdragon-node');\n * var brace = new Node({type: 'brace'});\n * var open = new Node({type: 'brace.open'});\n * var close = new Node({type: 'brace.close'});\n *\n * console.log(utils.isClose(brace)); // false\n * console.log(utils.isClose(open)); // false\n * console.log(utils.isClose(close)); // true\n * ```\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @return {Boolean}\n * @api public\n */\n\nutils.isClose = function(node) {\n assert(utils.isNode(node), 'expected node to be an instance of Node');\n return node.type.slice(-6) === '.close';\n};\n\n/**\n * Returns true if `node.nodes` **has** an `.open` node\n *\n * ```js\n * var Node = require('snapdragon-node');\n * var brace = new Node({\n * type: 'brace',\n * nodes: []\n * });\n *\n * var open = new Node({type: 'brace.open'});\n * console.log(utils.hasOpen(brace)); // false\n *\n * brace.pushNode(open);\n * console.log(utils.hasOpen(brace)); // true\n * ```\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @return {Boolean}\n * @api public\n */\n\nutils.hasOpen = function(node) {\n assert(utils.isNode(node), 'expected node to be an instance of Node');\n var first = node.first || node.nodes ? node.nodes[0] : null;\n if (utils.isNode(first)) {\n return first.type === node.type + '.open';\n }\n return false;\n};\n\n/**\n * Returns true if `node.nodes` **has** a `.close` node\n *\n * ```js\n * var Node = require('snapdragon-node');\n * var brace = new Node({\n * type: 'brace',\n * nodes: []\n * });\n *\n * var close = new Node({type: 'brace.close'});\n * console.log(utils.hasClose(brace)); // false\n *\n * brace.pushNode(close);\n * console.log(utils.hasClose(brace)); // true\n * ```\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @return {Boolean}\n * @api public\n */\n\nutils.hasClose = function(node) {\n assert(utils.isNode(node), 'expected node to be an instance of Node');\n var last = node.last || node.nodes ? node.nodes[node.nodes.length - 1] : null;\n if (utils.isNode(last)) {\n return last.type === node.type + '.close';\n }\n return false;\n};\n\n/**\n * Returns true if `node.nodes` has both `.open` and `.close` nodes\n *\n * ```js\n * var Node = require('snapdragon-node');\n * var brace = new Node({\n * type: 'brace',\n * nodes: []\n * });\n *\n * var open = new Node({type: 'brace.open'});\n * var close = new Node({type: 'brace.close'});\n * console.log(utils.hasOpen(brace)); // false\n * console.log(utils.hasClose(brace)); // false\n *\n * brace.pushNode(open);\n * brace.pushNode(close);\n * console.log(utils.hasOpen(brace)); // true\n * console.log(utils.hasClose(brace)); // true\n * ```\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @return {Boolean}\n * @api public\n */\n\nutils.hasOpenAndClose = function(node) {\n return utils.hasOpen(node) && utils.hasClose(node);\n};\n\n/**\n * Push the given `node` onto the `state.inside` array for the\n * given type. This array is used as a specialized \"stack\" for\n * only the given `node.type`.\n *\n * ```js\n * var state = { inside: {}};\n * var node = new Node({type: 'brace'});\n * utils.addType(state, node);\n * console.log(state.inside);\n * //=> { brace: [{type: 'brace'}] }\n * ```\n * @param {Object} `state` The `compiler.state` object or custom state object.\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @return {Array} Returns the `state.inside` stack for the given type.\n * @api public\n */\n\nutils.addType = function(state, node) {\n assert(utils.isNode(node), 'expected node to be an instance of Node');\n assert(isObject(state), 'expected state to be an object');\n\n var type = node.parent\n ? node.parent.type\n : node.type.replace(/\\.open$/, '');\n\n if (!state.hasOwnProperty('inside')) {\n state.inside = {};\n }\n if (!state.inside.hasOwnProperty(type)) {\n state.inside[type] = [];\n }\n\n var arr = state.inside[type];\n arr.push(node);\n return arr;\n};\n\n/**\n * Remove the given `node` from the `state.inside` array for the\n * given type. This array is used as a specialized \"stack\" for\n * only the given `node.type`.\n *\n * ```js\n * var state = { inside: {}};\n * var node = new Node({type: 'brace'});\n * utils.addType(state, node);\n * console.log(state.inside);\n * //=> { brace: [{type: 'brace'}] }\n * utils.removeType(state, node);\n * //=> { brace: [] }\n * ```\n * @param {Object} `state` The `compiler.state` object or custom state object.\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @return {Array} Returns the `state.inside` stack for the given type.\n * @api public\n */\n\nutils.removeType = function(state, node) {\n assert(utils.isNode(node), 'expected node to be an instance of Node');\n assert(isObject(state), 'expected state to be an object');\n\n var type = node.parent\n ? node.parent.type\n : node.type.replace(/\\.close$/, '');\n\n if (state.inside.hasOwnProperty(type)) {\n return state.inside[type].pop();\n }\n};\n\n/**\n * Returns true if `node.val` is an empty string, or `node.nodes` does\n * not contain any non-empty text nodes.\n *\n * ```js\n * var node = new Node({type: 'text'});\n * utils.isEmpty(node); //=> true\n * node.val = 'foo';\n * utils.isEmpty(node); //=> false\n * ```\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @param {Function} `fn`\n * @return {Boolean}\n * @api public\n */\n\nutils.isEmpty = function(node, fn) {\n assert(utils.isNode(node), 'expected node to be an instance of Node');\n\n if (!Array.isArray(node.nodes)) {\n if (node.type !== 'text') {\n return true;\n }\n if (typeof fn === 'function') {\n return fn(node, node.parent);\n }\n return !utils.trim(node.val);\n }\n\n for (var i = 0; i < node.nodes.length; i++) {\n var child = node.nodes[i];\n if (utils.isOpen(child) || utils.isClose(child)) {\n continue;\n }\n if (!utils.isEmpty(child, fn)) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * Returns true if the `state.inside` stack for the given type exists\n * and has one or more nodes on it.\n *\n * ```js\n * var state = { inside: {}};\n * var node = new Node({type: 'brace'});\n * console.log(utils.isInsideType(state, 'brace')); //=> false\n * utils.addType(state, node);\n * console.log(utils.isInsideType(state, 'brace')); //=> true\n * utils.removeType(state, node);\n * console.log(utils.isInsideType(state, 'brace')); //=> false\n * ```\n * @param {Object} `state`\n * @param {String} `type`\n * @return {Boolean}\n * @api public\n */\n\nutils.isInsideType = function(state, type) {\n assert(isObject(state), 'expected state to be an object');\n assert(isString(type), 'expected type to be a string');\n\n if (!state.hasOwnProperty('inside')) {\n return false;\n }\n\n if (!state.inside.hasOwnProperty(type)) {\n return false;\n }\n\n return state.inside[type].length > 0;\n};\n\n/**\n * Returns true if `node` is either a child or grand-child of the given `type`,\n * or `state.inside[type]` is a non-empty array.\n *\n * ```js\n * var state = { inside: {}};\n * var node = new Node({type: 'brace'});\n * var open = new Node({type: 'brace.open'});\n * console.log(utils.isInside(state, open, 'brace')); //=> false\n * utils.pushNode(node, open);\n * console.log(utils.isInside(state, open, 'brace')); //=> true\n * ```\n * @param {Object} `state` Either the `compiler.state` object, if it exists, or a user-supplied state object.\n * @param {Object} `node` Instance of [snapdragon-node][]\n * @param {String} `type` The `node.type` to check for.\n * @return {Boolean}\n * @api public\n */\n\nutils.isInside = function(state, node, type) {\n assert(utils.isNode(node), 'expected node to be an instance of Node');\n assert(isObject(state), 'expected state to be an object');\n\n if (Array.isArray(type)) {\n for (var i = 0; i < type.length; i++) {\n if (utils.isInside(state, node, type[i])) {\n return true;\n }\n }\n return false;\n }\n\n var parent = node.parent;\n if (typeof type === 'string') {\n return (parent && parent.type === type) || utils.isInsideType(state, type);\n }\n\n if (typeOf(type) === 'regexp') {\n if (parent && parent.type && type.test(parent.type)) {\n return true;\n }\n\n var keys = Object.keys(state.inside);\n var len = keys.length;\n var idx = -1;\n while (++idx < len) {\n var key = keys[idx];\n var val = state.inside[key];\n\n if (Array.isArray(val) && val.length !== 0 && type.test(key)) {\n return true;\n }\n }\n }\n return false;\n};\n\n/**\n * Get the last `n` element from the given `array`. Used for getting\n * a node from `node.nodes.`\n *\n * @param {Array} `array`\n * @param {Number} `n`\n * @return {undefined}\n * @api public\n */\n\nutils.last = function(arr, n) {\n return arr[arr.length - (n || 1)];\n};\n\n/**\n * Cast the given `val` to an array.\n *\n * ```js\n * console.log(utils.arrayify(''));\n * //=> []\n * console.log(utils.arrayify('foo'));\n * //=> ['foo']\n * console.log(utils.arrayify(['foo']));\n * //=> ['foo']\n * ```\n * @param {any} `val`\n * @return {Array}\n * @api public\n */\n\nutils.arrayify = function(val) {\n if (typeof val === 'string' && val !== '') {\n return [val];\n }\n if (!Array.isArray(val)) {\n return [];\n }\n return val;\n};\n\n/**\n * Convert the given `val` to a string by joining with `,`. Useful\n * for creating a cheerio/CSS/DOM-style selector from a list of strings.\n *\n * @param {any} `val`\n * @return {Array}\n * @api public\n */\n\nutils.stringify = function(val) {\n return utils.arrayify(val).join(',');\n};\n\n/**\n * Ensure that the given value is a string and call `.trim()` on it,\n * or return an empty string.\n *\n * @param {String} `str`\n * @return {String}\n * @api public\n */\n\nutils.trim = function(str) {\n return typeof str === 'string' ? str.trim() : '';\n};\n\n/**\n * Return true if val is an object\n */\n\nfunction isObject(val) {\n return typeOf(val) === 'object';\n}\n\n/**\n * Return true if val is a string\n */\n\nfunction isString(val) {\n return typeof val === 'string';\n}\n\n/**\n * Return true if val is a function\n */\n\nfunction isFunction(val) {\n return typeof val === 'function';\n}\n\n/**\n * Return true if val is an array\n */\n\nfunction isArray(val) {\n return Array.isArray(val);\n}\n\n/**\n * Shim to ensure the `.append` methods work with any version of snapdragon\n */\n\nfunction append(compiler, val, node) {\n if (typeof compiler.append !== 'function') {\n return compiler.emit(val, node);\n }\n return compiler.append(val, node);\n}\n\n/**\n * Simplified assertion. Throws an error is `val` is falsey.\n */\n\nfunction assert(val, message) {\n if (!val) throw new Error(message);\n}\n", "'use strict';\n\nvar isObject = require('isobject');\nvar define = require('define-property');\nvar utils = require('snapdragon-util');\nvar ownNames;\n\n/**\n * Create a new AST `Node` with the given `val` and `type`.\n *\n * ```js\n * var node = new Node('*', 'Star');\n * var node = new Node({type: 'star', val: '*'});\n * ```\n * @name Node\n * @param {String|Object} `val` Pass a matched substring, or an object to merge onto the node.\n * @param {String} `type` The node type to use when `val` is a string.\n * @return {Object} node instance\n * @api public\n */\n\nfunction Node(val, type, parent) {\n if (typeof type !== 'string') {\n parent = type;\n type = null;\n }\n\n define(this, 'parent', parent);\n define(this, 'isNode', true);\n define(this, 'expect', null);\n\n if (typeof type !== 'string' && isObject(val)) {\n lazyKeys();\n var keys = Object.keys(val);\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (ownNames.indexOf(key) === -1) {\n this[key] = val[key];\n }\n }\n } else {\n this.type = type;\n this.val = val;\n }\n}\n\n/**\n * Returns true if the given value is a node.\n *\n * ```js\n * var Node = require('snapdragon-node');\n * var node = new Node({type: 'foo'});\n * console.log(Node.isNode(node)); //=> true\n * console.log(Node.isNode({})); //=> false\n * ```\n * @param {Object} `node`\n * @returns {Boolean}\n * @api public\n */\n\nNode.isNode = function(node) {\n return utils.isNode(node);\n};\n\n/**\n * Define a non-enumberable property on the node instance.\n * Useful for adding properties that shouldn't be extended\n * or visible during debugging.\n *\n * ```js\n * var node = new Node();\n * node.define('foo', 'something non-enumerable');\n * ```\n * @param {String} `name`\n * @param {any} `val`\n * @return {Object} returns the node instance\n * @api public\n */\n\nNode.prototype.define = function(name, val) {\n define(this, name, val);\n return this;\n};\n\n/**\n * Returns true if `node.val` is an empty string, or `node.nodes` does\n * not contain any non-empty text nodes.\n *\n * ```js\n * var node = new Node({type: 'text'});\n * node.isEmpty(); //=> true\n * node.val = 'foo';\n * node.isEmpty(); //=> false\n * ```\n * @param {Function} `fn` (optional) Filter function that is called on `node` and/or child nodes. `isEmpty` will return false immediately when the filter function returns false on any nodes.\n * @return {Boolean}\n * @api public\n */\n\nNode.prototype.isEmpty = function(fn) {\n return utils.isEmpty(this, fn);\n};\n\n/**\n * Given node `foo` and node `bar`, push node `bar` onto `foo.nodes`, and\n * set `foo` as `bar.parent`.\n *\n * ```js\n * var foo = new Node({type: 'foo'});\n * var bar = new Node({type: 'bar'});\n * foo.push(bar);\n * ```\n * @param {Object} `node`\n * @return {Number} Returns the length of `node.nodes`\n * @api public\n */\n\nNode.prototype.push = function(node) {\n assert(Node.isNode(node), 'expected node to be an instance of Node');\n define(node, 'parent', this);\n\n this.nodes = this.nodes || [];\n return this.nodes.push(node);\n};\n\n/**\n * Given node `foo` and node `bar`, unshift node `bar` onto `foo.nodes`, and\n * set `foo` as `bar.parent`.\n *\n * ```js\n * var foo = new Node({type: 'foo'});\n * var bar = new Node({type: 'bar'});\n * foo.unshift(bar);\n * ```\n * @param {Object} `node`\n * @return {Number} Returns the length of `node.nodes`\n * @api public\n */\n\nNode.prototype.unshift = function(node) {\n assert(Node.isNode(node), 'expected node to be an instance of Node');\n define(node, 'parent', this);\n\n this.nodes = this.nodes || [];\n return this.nodes.unshift(node);\n};\n\n/**\n * Pop a node from `node.nodes`.\n *\n * ```js\n * var node = new Node({type: 'foo'});\n * node.push(new Node({type: 'a'}));\n * node.push(new Node({type: 'b'}));\n * node.push(new Node({type: 'c'}));\n * node.push(new Node({type: 'd'}));\n * console.log(node.nodes.length);\n * //=> 4\n * node.pop();\n * console.log(node.nodes.length);\n * //=> 3\n * ```\n * @return {Number} Returns the popped `node`\n * @api public\n */\n\nNode.prototype.pop = function() {\n return this.nodes && this.nodes.pop();\n};\n\n/**\n * Shift a node from `node.nodes`.\n *\n * ```js\n * var node = new Node({type: 'foo'});\n * node.push(new Node({type: 'a'}));\n * node.push(new Node({type: 'b'}));\n * node.push(new Node({type: 'c'}));\n * node.push(new Node({type: 'd'}));\n * console.log(node.nodes.length);\n * //=> 4\n * node.shift();\n * console.log(node.nodes.length);\n * //=> 3\n * ```\n * @return {Object} Returns the shifted `node`\n * @api public\n */\n\nNode.prototype.shift = function() {\n return this.nodes && this.nodes.shift();\n};\n\n/**\n * Remove `node` from `node.nodes`.\n *\n * ```js\n * node.remove(childNode);\n * ```\n * @param {Object} `node`\n * @return {Object} Returns the removed node.\n * @api public\n */\n\nNode.prototype.remove = function(node) {\n assert(Node.isNode(node), 'expected node to be an instance of Node');\n this.nodes = this.nodes || [];\n var idx = node.index;\n if (idx !== -1) {\n node.index = -1;\n return this.nodes.splice(idx, 1);\n }\n return null;\n};\n\n/**\n * Get the first child node from `node.nodes` that matches the given `type`.\n * If `type` is a number, the child node at that index is returned.\n *\n * ```js\n * var child = node.find(1); //<= index of the node to get\n * var child = node.find('foo'); //<= node.type of a child node\n * var child = node.find(/^(foo|bar)$/); //<= regex to match node.type\n * var child = node.find(['foo', 'bar']); //<= array of node.type(s)\n * ```\n * @param {String} `type`\n * @return {Object} Returns a child node or undefined.\n * @api public\n */\n\nNode.prototype.find = function(type) {\n return utils.findNode(this.nodes, type);\n};\n\n/**\n * Return true if the node is the given `type`.\n *\n * ```js\n * var node = new Node({type: 'bar'});\n * cosole.log(node.isType('foo')); // false\n * cosole.log(node.isType(/^(foo|bar)$/)); // true\n * cosole.log(node.isType(['foo', 'bar'])); // true\n * ```\n * @param {String} `type`\n * @return {Boolean}\n * @api public\n */\n\nNode.prototype.isType = function(type) {\n return utils.isType(this, type);\n};\n\n/**\n * Return true if the `node.nodes` has the given `type`.\n *\n * ```js\n * var foo = new Node({type: 'foo'});\n * var bar = new Node({type: 'bar'});\n * foo.push(bar);\n *\n * cosole.log(foo.hasType('qux')); // false\n * cosole.log(foo.hasType(/^(qux|bar)$/)); // true\n * cosole.log(foo.hasType(['qux', 'bar'])); // true\n * ```\n * @param {String} `type`\n * @return {Boolean}\n * @api public\n */\n\nNode.prototype.hasType = function(type) {\n return utils.hasType(this, type);\n};\n\n/**\n * Get the siblings array, or `null` if it doesn't exist.\n *\n * ```js\n * var foo = new Node({type: 'foo'});\n * var bar = new Node({type: 'bar'});\n * var baz = new Node({type: 'baz'});\n * foo.push(bar);\n * foo.push(baz);\n *\n * console.log(bar.siblings.length) // 2\n * console.log(baz.siblings.length) // 2\n * ```\n * @return {Array}\n * @api public\n */\n\nObject.defineProperty(Node.prototype, 'siblings', {\n set: function() {\n throw new Error('node.siblings is a getter and cannot be defined');\n },\n get: function() {\n return this.parent ? this.parent.nodes : null;\n }\n});\n\n/**\n * Get the node's current index from `node.parent.nodes`.\n * This should always be correct, even when the parent adds nodes.\n *\n * ```js\n * var foo = new Node({type: 'foo'});\n * var bar = new Node({type: 'bar'});\n * var baz = new Node({type: 'baz'});\n * var qux = new Node({type: 'qux'});\n * foo.push(bar);\n * foo.push(baz);\n * foo.unshift(qux);\n *\n * console.log(bar.index) // 1\n * console.log(baz.index) // 2\n * console.log(qux.index) // 0\n * ```\n * @return {Number}\n * @api public\n */\n\nObject.defineProperty(Node.prototype, 'index', {\n set: function(index) {\n define(this, 'idx', index);\n },\n get: function() {\n if (!Array.isArray(this.siblings)) {\n return -1;\n }\n var tok = this.idx !== -1 ? this.siblings[this.idx] : null;\n if (tok !== this) {\n this.idx = this.siblings.indexOf(this);\n }\n return this.idx;\n }\n});\n\n/**\n * Get the previous node from the siblings array or `null`.\n *\n * ```js\n * var foo = new Node({type: 'foo'});\n * var bar = new Node({type: 'bar'});\n * var baz = new Node({type: 'baz'});\n * foo.push(bar);\n * foo.push(baz);\n *\n * console.log(baz.prev.type) // 'bar'\n * ```\n * @return {Object}\n * @api public\n */\n\nObject.defineProperty(Node.prototype, 'prev', {\n set: function() {\n throw new Error('node.prev is a getter and cannot be defined');\n },\n get: function() {\n if (Array.isArray(this.siblings)) {\n return this.siblings[this.index - 1] || this.parent.prev;\n }\n return null;\n }\n});\n\n/**\n * Get the siblings array, or `null` if it doesn't exist.\n *\n * ```js\n * var foo = new Node({type: 'foo'});\n * var bar = new Node({type: 'bar'});\n * var baz = new Node({type: 'baz'});\n * foo.push(bar);\n * foo.push(baz);\n *\n * console.log(bar.siblings.length) // 2\n * console.log(baz.siblings.length) // 2\n * ```\n * @return {Object}\n * @api public\n */\n\nObject.defineProperty(Node.prototype, 'next', {\n set: function() {\n throw new Error('node.next is a getter and cannot be defined');\n },\n get: function() {\n if (Array.isArray(this.siblings)) {\n return this.siblings[this.index + 1] || this.parent.next;\n }\n return null;\n }\n});\n\n/**\n * Get the first node from `node.nodes`.\n *\n * ```js\n * var foo = new Node({type: 'foo'});\n * var bar = new Node({type: 'bar'});\n * var baz = new Node({type: 'baz'});\n * var qux = new Node({type: 'qux'});\n * foo.push(bar);\n * foo.push(baz);\n * foo.push(qux);\n *\n * console.log(foo.first.type) // 'bar'\n * ```\n * @return {Object} The first node, or undefiend\n * @api public\n */\n\nObject.defineProperty(Node.prototype, 'first', {\n get: function() {\n return this.nodes ? this.nodes[0] : null;\n }\n});\n\n/**\n * Get the last node from `node.nodes`.\n *\n * ```js\n * var foo = new Node({type: 'foo'});\n * var bar = new Node({type: 'bar'});\n * var baz = new Node({type: 'baz'});\n * var qux = new Node({type: 'qux'});\n * foo.push(bar);\n * foo.push(baz);\n * foo.push(qux);\n *\n * console.log(foo.last.type) // 'qux'\n * ```\n * @return {Object} The last node, or undefiend\n * @api public\n */\n\nObject.defineProperty(Node.prototype, 'last', {\n get: function() {\n return this.nodes ? utils.last(this.nodes) : null;\n }\n});\n\n/**\n * Get the last node from `node.nodes`.\n *\n * ```js\n * var foo = new Node({type: 'foo'});\n * var bar = new Node({type: 'bar'});\n * var baz = new Node({type: 'baz'});\n * var qux = new Node({type: 'qux'});\n * foo.push(bar);\n * foo.push(baz);\n * foo.push(qux);\n *\n * console.log(foo.last.type) // 'qux'\n * ```\n * @return {Object} The last node, or undefiend\n * @api public\n */\n\nObject.defineProperty(Node.prototype, 'scope', {\n get: function() {\n if (this.isScope !== true) {\n return this.parent ? this.parent.scope : this;\n }\n return this;\n }\n});\n\n/**\n * Get own property names from Node prototype, but only the\n * first time `Node` is instantiated\n */\n\nfunction lazyKeys() {\n if (!ownNames) {\n ownNames = Object.getOwnPropertyNames(Node.prototype);\n }\n}\n\n/**\n * Simplified assertion. Throws an error is `val` is falsey.\n */\n\nfunction assert(val, message) {\n if (!val) throw new Error(message);\n}\n\n/**\n * Expose `Node`\n */\n\nexports = module.exports = Node;\n", "'use strict';\n\nvar Node = require('snapdragon-node');\nvar utils = require('./utils');\n\n/**\n * Braces parsers\n */\n\nmodule.exports = function(braces, options) {\n braces.parser\n .set('bos', function() {\n if (!this.parsed) {\n this.ast = this.nodes[0] = new Node(this.ast);\n }\n })\n\n /**\n * Character parsers\n */\n\n .set('escape', function() {\n var pos = this.position();\n var m = this.match(/^(?:\\\\(.)|\\$\\{)/);\n if (!m) return;\n\n var prev = this.prev();\n var last = utils.last(prev.nodes);\n\n var node = pos(new Node({\n type: 'text',\n multiplier: 1,\n val: m[0]\n }));\n\n if (node.val === '\\\\\\\\') {\n return node;\n }\n\n if (node.val === '${') {\n var str = this.input;\n var idx = -1;\n var ch;\n\n while ((ch = str[++idx])) {\n this.consume(1);\n node.val += ch;\n if (ch === '\\\\') {\n node.val += str[++idx];\n continue;\n }\n if (ch === '}') {\n break;\n }\n }\n }\n\n if (this.options.unescape !== false) {\n node.val = node.val.replace(/\\\\([{}])/g, '$1');\n }\n\n if (last.val === '\"' && this.input.charAt(0) === '\"') {\n last.val = node.val;\n this.consume(1);\n return;\n }\n\n return concatNodes.call(this, pos, node, prev, options);\n })\n\n /**\n * Brackets: \"[...]\" (basic, this is overridden by\n * other parsers in more advanced implementations)\n */\n\n .set('bracket', function() {\n var isInside = this.isInside('brace');\n var pos = this.position();\n var m = this.match(/^(?:\\[([!^]?)([^\\]]{2,}|\\]-)(\\]|[^*+?]+)|\\[)/);\n if (!m) return;\n\n var prev = this.prev();\n var val = m[0];\n var negated = m[1] ? '^' : '';\n var inner = m[2] || '';\n var close = m[3] || '';\n\n if (isInside && prev.type === 'brace') {\n prev.text = prev.text || '';\n prev.text += val;\n }\n\n var esc = this.input.slice(0, 2);\n if (inner === '' && esc === '\\\\]') {\n inner += esc;\n this.consume(2);\n\n var str = this.input;\n var idx = -1;\n var ch;\n\n while ((ch = str[++idx])) {\n this.consume(1);\n if (ch === ']') {\n close = ch;\n break;\n }\n inner += ch;\n }\n }\n\n return pos(new Node({\n type: 'bracket',\n val: val,\n escaped: close !== ']',\n negated: negated,\n inner: inner,\n close: close\n }));\n })\n\n /**\n * Empty braces (we capture these early to\n * speed up processing in the compiler)\n */\n\n .set('multiplier', function() {\n var isInside = this.isInside('brace');\n var pos = this.position();\n var m = this.match(/^\\{((?:,|\\{,+\\})+)\\}/);\n if (!m) return;\n\n this.multiplier = true;\n var prev = this.prev();\n var val = m[0];\n\n if (isInside && prev.type === 'brace') {\n prev.text = prev.text || '';\n prev.text += val;\n }\n\n var node = pos(new Node({\n type: 'text',\n multiplier: 1,\n match: m,\n val: val\n }));\n\n return concatNodes.call(this, pos, node, prev, options);\n })\n\n /**\n * Open\n */\n\n .set('brace.open', function() {\n var pos = this.position();\n var m = this.match(/^\\{(?!(?:[^\\\\}]?|,+)\\})/);\n if (!m) return;\n\n var prev = this.prev();\n var last = utils.last(prev.nodes);\n\n // if the last parsed character was an extglob character\n // we need to _not optimize_ the brace pattern because\n // it might be mistaken for an extglob by a downstream parser\n if (last && last.val && isExtglobChar(last.val.slice(-1))) {\n last.optimize = false;\n }\n\n var open = pos(new Node({\n type: 'brace.open',\n val: m[0]\n }));\n\n var node = pos(new Node({\n type: 'brace',\n nodes: []\n }));\n\n node.push(open);\n prev.push(node);\n this.push('brace', node);\n })\n\n /**\n * Close\n */\n\n .set('brace.close', function() {\n var pos = this.position();\n var m = this.match(/^\\}/);\n if (!m || !m[0]) return;\n\n var brace = this.pop('brace');\n var node = pos(new Node({\n type: 'brace.close',\n val: m[0]\n }));\n\n if (!this.isType(brace, 'brace')) {\n if (this.options.strict) {\n throw new Error('missing opening \"{\"');\n }\n node.type = 'text';\n node.multiplier = 0;\n node.escaped = true;\n return node;\n }\n\n var prev = this.prev();\n var last = utils.last(prev.nodes);\n if (last.text) {\n var lastNode = utils.last(last.nodes);\n if (lastNode.val === ')' && /[!@*?+]\\(/.test(last.text)) {\n var open = last.nodes[0];\n var text = last.nodes[1];\n if (open.type === 'brace.open' && text && text.type === 'text') {\n text.optimize = false;\n }\n }\n }\n\n if (brace.nodes.length > 2) {\n var first = brace.nodes[1];\n if (first.type === 'text' && first.val === ',') {\n brace.nodes.splice(1, 1);\n brace.nodes.push(first);\n }\n }\n\n brace.push(node);\n })\n\n /**\n * Capture boundary characters\n */\n\n .set('boundary', function() {\n var pos = this.position();\n var m = this.match(/^[$^](?!\\{)/);\n if (!m) return;\n return pos(new Node({\n type: 'text',\n val: m[0]\n }));\n })\n\n /**\n * One or zero, non-comma characters wrapped in braces\n */\n\n .set('nobrace', function() {\n var isInside = this.isInside('brace');\n var pos = this.position();\n var m = this.match(/^\\{[^,]?\\}/);\n if (!m) return;\n\n var prev = this.prev();\n var val = m[0];\n\n if (isInside && prev.type === 'brace') {\n prev.text = prev.text || '';\n prev.text += val;\n }\n\n return pos(new Node({\n type: 'text',\n multiplier: 0,\n val: val\n }));\n })\n\n /**\n * Text\n */\n\n .set('text', function() {\n var isInside = this.isInside('brace');\n var pos = this.position();\n var m = this.match(/^((?!\\\\)[^${}[\\]])+/);\n if (!m) return;\n\n var prev = this.prev();\n var val = m[0];\n\n if (isInside && prev.type === 'brace') {\n prev.text = prev.text || '';\n prev.text += val;\n }\n\n var node = pos(new Node({\n type: 'text',\n multiplier: 1,\n val: val\n }));\n\n return concatNodes.call(this, pos, node, prev, options);\n });\n};\n\n/**\n * Returns true if the character is an extglob character.\n */\n\nfunction isExtglobChar(ch) {\n return ch === '!' || ch === '@' || ch === '*' || ch === '?' || ch === '+';\n}\n\n/**\n * Combine text nodes, and calculate empty sets (`{,,}`)\n * @param {Function} `pos` Function to calculate node position\n * @param {Object} `node` AST node\n * @return {Object}\n */\n\nfunction concatNodes(pos, node, parent, options) {\n node.orig = node.val;\n var prev = this.prev();\n var last = utils.last(prev.nodes);\n var isEscaped = false;\n\n if (node.val.length > 1) {\n var a = node.val.charAt(0);\n var b = node.val.slice(-1);\n\n isEscaped = (a === '\"' && b === '\"')\n || (a === \"'\" && b === \"'\")\n || (a === '`' && b === '`');\n }\n\n if (isEscaped && options.unescape !== false) {\n node.val = node.val.slice(1, node.val.length - 1);\n node.escaped = true;\n }\n\n if (node.match) {\n var match = node.match[1];\n if (!match || match.indexOf('}') === -1) {\n match = node.match[0];\n }\n\n // replace each set with a single \",\"\n var val = match.replace(/\\{/g, ',').replace(/\\}/g, '');\n node.multiplier *= val.length;\n node.val = '';\n }\n\n var simpleText = last.type === 'text'\n && last.multiplier === 1\n && node.multiplier === 1\n && node.val;\n\n if (simpleText) {\n last.val += node.val;\n return;\n }\n\n prev.push(node);\n}\n", "/*!\n * define-property <https://github.com/jonschlinkert/define-property>\n *\n * Copyright (c) 2015, 2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar isDescriptor = require('is-descriptor');\n\nmodule.exports = function defineProperty(obj, prop, val) {\n if (typeof obj !== 'object' && typeof obj !== 'function') {\n throw new TypeError('expected an object or function.');\n }\n\n if (typeof prop !== 'string') {\n throw new TypeError('expected `prop` to be a string.');\n }\n\n if (isDescriptor(val) && ('set' in val || 'get' in val)) {\n return Object.defineProperty(obj, prop, val);\n }\n\n return Object.defineProperty(obj, prop, {\n configurable: true,\n enumerable: false,\n writable: true,\n value: val\n });\n};\n", "\r\n/**\r\n * Expose `Emitter`.\r\n */\r\n\r\nif (typeof module !== 'undefined') {\r\n module.exports = Emitter;\r\n}\r\n\r\n/**\r\n * Initialize a new `Emitter`.\r\n *\r\n * @api public\r\n */\r\n\r\nfunction Emitter(obj) {\r\n if (obj) return mixin(obj);\r\n};\r\n\r\n/**\r\n * Mixin the emitter properties.\r\n *\r\n * @param {Object} obj\r\n * @return {Object}\r\n * @api private\r\n */\r\n\r\nfunction mixin(obj) {\r\n for (var key in Emitter.prototype) {\r\n obj[key] = Emitter.prototype[key];\r\n }\r\n return obj;\r\n}\r\n\r\n/**\r\n * Listen on the given `event` with `fn`.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.on =\r\nEmitter.prototype.addEventListener = function(event, fn){\r\n this._callbacks = this._callbacks || {};\r\n (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\r\n .push(fn);\r\n return this;\r\n};\r\n\r\n/**\r\n * Adds an `event` listener that will be invoked a single\r\n * time then automatically removed.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.once = function(event, fn){\r\n function on() {\r\n this.off(event, on);\r\n fn.apply(this, arguments);\r\n }\r\n\r\n on.fn = fn;\r\n this.on(event, on);\r\n return this;\r\n};\r\n\r\n/**\r\n * Remove the given callback for `event` or all\r\n * registered callbacks.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.off =\r\nEmitter.prototype.removeListener =\r\nEmitter.prototype.removeAllListeners =\r\nEmitter.prototype.removeEventListener = function(event, fn){\r\n this._callbacks = this._callbacks || {};\r\n\r\n // all\r\n if (0 == arguments.length) {\r\n this._callbacks = {};\r\n return this;\r\n }\r\n\r\n // specific event\r\n var callbacks = this._callbacks['$' + event];\r\n if (!callbacks) return this;\r\n\r\n // remove all handlers\r\n if (1 == arguments.length) {\r\n delete this._callbacks['$' + event];\r\n return this;\r\n }\r\n\r\n // remove specific handler\r\n var cb;\r\n for (var i = 0; i < callbacks.length; i++) {\r\n cb = callbacks[i];\r\n if (cb === fn || cb.fn === fn) {\r\n callbacks.splice(i, 1);\r\n break;\r\n }\r\n }\r\n return this;\r\n};\r\n\r\n/**\r\n * Emit `event` with the given args.\r\n *\r\n * @param {String} event\r\n * @param {Mixed} ...\r\n * @return {Emitter}\r\n */\r\n\r\nEmitter.prototype.emit = function(event){\r\n this._callbacks = this._callbacks || {};\r\n var args = [].slice.call(arguments, 1)\r\n , callbacks = this._callbacks['$' + event];\r\n\r\n if (callbacks) {\r\n callbacks = callbacks.slice(0);\r\n for (var i = 0, len = callbacks.length; i < len; ++i) {\r\n callbacks[i].apply(this, args);\r\n }\r\n }\r\n\r\n return this;\r\n};\r\n\r\n/**\r\n * Return array of callbacks for `event`.\r\n *\r\n * @param {String} event\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.listeners = function(event){\r\n this._callbacks = this._callbacks || {};\r\n return this._callbacks['$' + event] || [];\r\n};\r\n\r\n/**\r\n * Check if this emitter has `event` handlers.\r\n *\r\n * @param {String} event\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.hasListeners = function(event){\r\n return !! this.listeners(event).length;\r\n};\r\n", "/*!\n * object-visit <https://github.com/jonschlinkert/object-visit>\n *\n * Copyright (c) 2015, 2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar isObject = require('isobject');\n\nmodule.exports = function visit(thisArg, method, target, val) {\n if (!isObject(thisArg) && typeof thisArg !== 'function') {\n throw new Error('object-visit expects `thisArg` to be an object.');\n }\n\n if (typeof method !== 'string') {\n throw new Error('object-visit expects `method` name to be a string');\n }\n\n if (typeof thisArg[method] !== 'function') {\n return thisArg;\n }\n\n var args = [].slice.call(arguments, 3);\n target = target || {};\n\n for (var key in target) {\n var arr = [key, target[key]].concat(args);\n thisArg[method].apply(thisArg, arr);\n }\n return thisArg;\n};\n", "'use strict';\n\nvar util = require('util');\nvar visit = require('object-visit');\n\n/**\n * Map `visit` over an array of objects.\n *\n * @param {Object} `collection` The context in which to invoke `method`\n * @param {String} `method` Name of the method to call on `collection`\n * @param {Object} `arr` Array of objects.\n */\n\nmodule.exports = function mapVisit(collection, method, val) {\n if (isObject(val)) {\n return visit.apply(null, arguments);\n }\n\n if (!Array.isArray(val)) {\n throw new TypeError('expected an array: ' + util.inspect(val));\n }\n\n var args = [].slice.call(arguments, 3);\n\n for (var i = 0; i < val.length; i++) {\n var ele = val[i];\n if (isObject(ele)) {\n visit.apply(null, [collection, method, ele].concat(args));\n } else {\n collection[method].apply(collection, [ele].concat(args));\n }\n }\n};\n\nfunction isObject(val) {\n return val && (typeof val === 'function' || (!Array.isArray(val) && typeof val === 'object'));\n}\n", "/*!\n * collection-visit <https://github.com/jonschlinkert/collection-visit>\n *\n * Copyright (c) 2015, 2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar visit = require('object-visit');\nvar mapVisit = require('map-visit');\n\nmodule.exports = function(collection, method, val) {\n var result;\n\n if (typeof val === 'string' && (method in collection)) {\n var args = [].slice.call(arguments, 2);\n result = collection[method].apply(collection, args);\n } else if (Array.isArray(val)) {\n result = mapVisit.apply(null, arguments);\n } else {\n result = visit.apply(null, arguments);\n }\n\n if (typeof result !== 'undefined') {\n return result;\n }\n\n return collection;\n};\n", "/*!\n * to-object-path <https://github.com/jonschlinkert/to-object-path>\n *\n * Copyright (c) 2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nvar typeOf = require('kind-of');\n\nmodule.exports = function toPath(args) {\n if (typeOf(args) !== 'arguments') {\n args = arguments;\n }\n return filter(args).join('.');\n};\n\nfunction filter(arr) {\n var len = arr.length;\n var idx = -1;\n var res = [];\n\n while (++idx < len) {\n var ele = arr[idx];\n if (typeOf(ele) === 'arguments' || Array.isArray(ele)) {\n res.push.apply(res, filter(ele));\n } else if (typeof ele === 'string') {\n res.push(ele);\n }\n }\n return res;\n}\n", "/*!\n * is-extendable <https://github.com/jonschlinkert/is-extendable>\n *\n * Copyright (c) 2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function isExtendable(val) {\n return typeof val !== 'undefined' && val !== null\n && (typeof val === 'object' || typeof val === 'function');\n};\n", "'use strict';\n\nmodule.exports = function union(init) {\n if (!Array.isArray(init)) {\n throw new TypeError('arr-union expects the first argument to be an array.');\n }\n\n var len = arguments.length;\n var i = 0;\n\n while (++i < len) {\n var arg = arguments[i];\n if (!arg) continue;\n\n if (!Array.isArray(arg)) {\n arg = [arg];\n }\n\n for (var j = 0; j < arg.length; j++) {\n var ele = arg[j];\n\n if (init.indexOf(ele) >= 0) {\n continue;\n }\n init.push(ele);\n }\n }\n return init;\n};\n", "/*!\n * get-value <https://github.com/jonschlinkert/get-value>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\nmodule.exports = function(obj, prop, a, b, c) {\n if (!isObject(obj) || !prop) {\n return obj;\n }\n\n prop = toString(prop);\n\n // allowing for multiple properties to be passed as\n // a string or array, but much faster (3-4x) than doing\n // `[].slice.call(arguments)`\n if (a) prop += '.' + toString(a);\n if (b) prop += '.' + toString(b);\n if (c) prop += '.' + toString(c);\n\n if (prop in obj) {\n return obj[prop];\n }\n\n var segs = prop.split('.');\n var len = segs.length;\n var i = -1;\n\n while (obj && (++i < len)) {\n var key = segs[i];\n while (key[key.length - 1] === '\\\\') {\n key = key.slice(0, -1) + '.' + segs[++i];\n }\n obj = obj[key];\n }\n return obj;\n};\n\nfunction isObject(val) {\n return val !== null && (typeof val === 'object' || typeof val === 'function');\n}\n\nfunction toString(val) {\n if (!val) return '';\n if (Array.isArray(val)) {\n return val.join('.');\n }\n return val;\n}\n", "'use strict';\n\nvar isObject = require('is-extendable');\n\nmodule.exports = function extend(o/*, objects*/) {\n if (!isObject(o)) { o = {}; }\n\n var len = arguments.length;\n for (var i = 1; i < len; i++) {\n var obj = arguments[i];\n\n if (isObject(obj)) {\n assign(o, obj);\n }\n }\n return o;\n};\n\nfunction assign(a, b) {\n for (var key in b) {\n if (hasOwn(b, key)) {\n a[key] = b[key];\n }\n }\n}\n\n/**\n * Returns true if the given `key` is an own property of `obj`.\n */\n\nfunction hasOwn(obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n", "/*!\n * set-value <https://github.com/jonschlinkert/set-value>\n *\n * Copyright (c) 2014-2015, 2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar toPath = require('to-object-path');\nvar extend = require('extend-shallow');\nvar isPlainObject = require('is-plain-object');\nvar isObject = require('is-extendable');\n\nmodule.exports = function(obj, path, val) {\n if (!isObject(obj)) {\n return obj;\n }\n\n if (Array.isArray(path)) {\n path = toPath(path);\n }\n\n if (typeof path !== 'string') {\n return obj;\n }\n\n var segs = path.split('.');\n var len = segs.length, i = -1;\n var res = obj;\n var last;\n\n while (++i < len) {\n var key = segs[i];\n\n while (key[key.length - 1] === '\\\\') {\n key = key.slice(0, -1) + '.' + segs[++i];\n }\n\n if (i === len - 1) {\n last = key;\n break;\n }\n\n if (!isObject(obj[key])) {\n obj[key] = {};\n }\n obj = obj[key];\n }\n\n if (obj.hasOwnProperty(last) && isObject(obj[last])) {\n if (isPlainObject(val)) {\n extend(obj[last], val);\n } else {\n obj[last] = val;\n }\n\n } else {\n obj[last] = val;\n }\n return res;\n};\n\n", "'use strict';\n\nvar isObject = require('is-extendable');\nvar union = require('arr-union');\nvar get = require('get-value');\nvar set = require('set-value');\n\nmodule.exports = function unionValue(obj, prop, value) {\n if (!isObject(obj)) {\n throw new TypeError('union-value expects the first argument to be an object.');\n }\n\n if (typeof prop !== 'string') {\n throw new TypeError('union-value expects `prop` to be a string.');\n }\n\n var arr = arrayify(get(obj, prop));\n set(obj, prop, union(arr, arrayify(value)));\n return obj;\n};\n\nfunction arrayify(val) {\n if (val === null || typeof val === 'undefined') {\n return [];\n }\n if (Array.isArray(val)) {\n return val;\n }\n return [val];\n}\n", "var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n return toString.call(arr) == '[object Array]';\n};\n", "/*!\n * isobject <https://github.com/jonschlinkert/isobject>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nvar isArray = require('isarray');\n\nmodule.exports = function isObject(val) {\n return val != null && typeof val === 'object' && isArray(val) === false;\n};\n", "/*!\n * has-values <https://github.com/jonschlinkert/has-values>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function hasValue(o, noZero) {\n if (o === null || o === undefined) {\n return false;\n }\n\n if (typeof o === 'boolean') {\n return true;\n }\n\n if (typeof o === 'number') {\n if (o === 0 && noZero === true) {\n return false;\n }\n return true;\n }\n\n if (o.length !== undefined) {\n return o.length !== 0;\n }\n\n for (var key in o) {\n if (o.hasOwnProperty(key)) {\n return true;\n }\n }\n return false;\n};\n", "/*!\n * has-value <https://github.com/jonschlinkert/has-value>\n *\n * Copyright (c) 2014-2016, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nvar isObject = require('isobject');\nvar hasValues = require('has-values');\nvar get = require('get-value');\n\nmodule.exports = function(obj, prop, noZero) {\n if (isObject(obj)) {\n return hasValues(get(obj, prop), noZero);\n }\n return hasValues(obj, prop);\n};\n", "/*!\n * unset-value <https://github.com/jonschlinkert/unset-value>\n *\n * Copyright (c) 2015, 2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar isObject = require('isobject');\nvar has = require('has-value');\n\nmodule.exports = function unset(obj, prop) {\n if (!isObject(obj)) {\n throw new TypeError('expected an object.');\n }\n if (obj.hasOwnProperty(prop)) {\n delete obj[prop];\n return true;\n }\n\n if (has(obj, prop)) {\n var segs = prop.split('.');\n var last = segs.pop();\n while (segs.length && segs[segs.length - 1].slice(-1) === '\\\\') {\n last = segs.pop().slice(0, -1) + '.' + last;\n }\n while (segs.length) obj = obj[prop = segs.shift()];\n return (delete obj[last]);\n }\n return true;\n};\n", "/*!\n * Determine if an object is a Buffer\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n\n// The _isBuffer check is for Safari 5-7 support, because it's missing\n// Object.prototype.constructor. Remove this eventually\nmodule.exports = function (obj) {\n return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)\n}\n\nfunction isBuffer (obj) {\n return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n\n// For Node v0.10 support. Remove this eventually.\nfunction isSlowBuffer (obj) {\n return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))\n}\n", "var isBuffer = require('is-buffer');\nvar toString = Object.prototype.toString;\n\n/**\n * Get the native `typeof` a value.\n *\n * @param {*} `val`\n * @return {*} Native javascript type\n */\n\nmodule.exports = function kindOf(val) {\n // primitivies\n if (typeof val === 'undefined') {\n return 'undefined';\n }\n if (val === null) {\n return 'null';\n }\n if (val === true || val === false || val instanceof Boolean) {\n return 'boolean';\n }\n if (typeof val === 'string' || val instanceof String) {\n return 'string';\n }\n if (typeof val === 'number' || val instanceof Number) {\n return 'number';\n }\n\n // functions\n if (typeof val === 'function' || val instanceof Function) {\n return 'function';\n }\n\n // array\n if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) {\n return 'array';\n }\n\n // check for instances of RegExp and Date before calling `toString`\n if (val instanceof RegExp) {\n return 'regexp';\n }\n if (val instanceof Date) {\n return 'date';\n }\n\n // other objects\n var type = toString.call(val);\n\n if (type === '[object RegExp]') {\n return 'regexp';\n }\n if (type === '[object Date]') {\n return 'date';\n }\n if (type === '[object Arguments]') {\n return 'arguments';\n }\n if (type === '[object Error]') {\n return 'error';\n }\n if (type === '[object Promise]') {\n return 'promise';\n }\n\n // buffer\n if (isBuffer(val)) {\n return 'buffer';\n }\n\n // es6: Map, WeakMap, Set, WeakSet\n if (type === '[object Set]') {\n return 'set';\n }\n if (type === '[object WeakSet]') {\n return 'weakset';\n }\n if (type === '[object Map]') {\n return 'map';\n }\n if (type === '[object WeakMap]') {\n return 'weakmap';\n }\n if (type === '[object Symbol]') {\n return 'symbol';\n }\n\n // typed arrays\n if (type === '[object Int8Array]') {\n return 'int8array';\n }\n if (type === '[object Uint8Array]') {\n return 'uint8array';\n }\n if (type === '[object Uint8ClampedArray]') {\n return 'uint8clampedarray';\n }\n if (type === '[object Int16Array]') {\n return 'int16array';\n }\n if (type === '[object Uint16Array]') {\n return 'uint16array';\n }\n if (type === '[object Int32Array]') {\n return 'int32array';\n }\n if (type === '[object Uint32Array]') {\n return 'uint32array';\n }\n if (type === '[object Float32Array]') {\n return 'float32array';\n }\n if (type === '[object Float64Array]') {\n return 'float64array';\n }\n\n // must be a plain object\n return 'object';\n};\n", "/*!\n * has-values <https://github.com/jonschlinkert/has-values>\n *\n * Copyright (c) 2014-2015, 2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar typeOf = require('kind-of');\nvar isNumber = require('is-number');\n\nmodule.exports = function hasValue(val) {\n // is-number checks for NaN and other edge cases\n if (isNumber(val)) {\n return true;\n }\n\n switch (typeOf(val)) {\n case 'null':\n case 'boolean':\n case 'function':\n return true;\n case 'string':\n case 'arguments':\n return val.length !== 0;\n case 'error':\n return val.message !== '';\n case 'array':\n var len = val.length;\n if (len === 0) {\n return false;\n }\n for (var i = 0; i < len; i++) {\n if (hasValue(val[i])) {\n return true;\n }\n }\n return false;\n case 'file':\n case 'map':\n case 'set':\n return val.size !== 0;\n case 'object':\n var keys = Object.keys(val);\n if (keys.length === 0) {\n return false;\n }\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (hasValue(val[key])) {\n return true;\n }\n }\n return false;\n default: {\n return false;\n }\n }\n};\n", "/*!\n * has-value <https://github.com/jonschlinkert/has-value>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nvar isObject = require('isobject');\nvar hasValues = require('has-values');\nvar get = require('get-value');\n\nmodule.exports = function(val, prop) {\n return hasValues(isObject(val) && prop ? get(val, prop) : val);\n};\n", "/*!\n * set-value <https://github.com/jonschlinkert/set-value>\n *\n * Copyright (c) 2014-2015, 2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar split = require('split-string');\nvar extend = require('extend-shallow');\nvar isPlainObject = require('is-plain-object');\nvar isObject = require('is-extendable');\n\nmodule.exports = function(obj, prop, val) {\n if (!isObject(obj)) {\n return obj;\n }\n\n if (Array.isArray(prop)) {\n prop = [].concat.apply([], prop).join('.');\n }\n\n if (typeof prop !== 'string') {\n return obj;\n }\n\n var keys = split(prop, {sep: '.', brackets: true});\n var len = keys.length;\n var idx = -1;\n var current = obj;\n\n while (++idx < len) {\n var key = keys[idx];\n if (idx !== len - 1) {\n if (!isObject(current[key])) {\n current[key] = {};\n }\n current = current[key];\n continue;\n }\n\n if (isPlainObject(current[key]) && isPlainObject(val)) {\n current[key] = extend({}, current[key], val);\n } else {\n current[key] = val;\n }\n }\n\n return obj;\n};\n", "'use strict';\n\nvar isObject = require('isobject');\nvar Emitter = require('component-emitter');\nvar visit = require('collection-visit');\nvar toPath = require('to-object-path');\nvar union = require('union-value');\nvar del = require('unset-value');\nvar get = require('get-value');\nvar has = require('has-value');\nvar set = require('set-value');\n\n/**\n * Create a `Cache` constructor that when instantiated will\n * store values on the given `prop`.\n *\n * ```js\n * var Cache = require('cache-base').namespace('data');\n * var cache = new Cache();\n *\n * cache.set('foo', 'bar');\n * //=> {data: {foo: 'bar'}}\n * ```\n * @param {String} `prop` The property name to use for storing values.\n * @return {Function} Returns a custom `Cache` constructor\n * @api public\n */\n\nfunction namespace(prop) {\n\n /**\n * Create a new `Cache`. Internally the `Cache` constructor is created using\n * the `namespace` function, with `cache` defined as the storage object.\n *\n * ```js\n * var app = new Cache();\n * ```\n * @param {Object} `cache` Optionally pass an object to initialize with.\n * @constructor\n * @api public\n */\n\n function Cache(cache) {\n if (prop) {\n this[prop] = {};\n }\n if (cache) {\n this.set(cache);\n }\n }\n\n /**\n * Inherit Emitter\n */\n\n Emitter(Cache.prototype);\n\n /**\n * Assign `value` to `key`. Also emits `set` with\n * the key and value.\n *\n * ```js\n * app.on('set', function(key, val) {\n * // do something when `set` is emitted\n * });\n *\n * app.set(key, value);\n *\n * // also takes an object or array\n * app.set({name: 'Halle'});\n * app.set([{foo: 'bar'}, {baz: 'quux'}]);\n * console.log(app);\n * //=> {name: 'Halle', foo: 'bar', baz: 'quux'}\n * ```\n *\n * @name .set\n * @emits `set` with `key` and `value` as arguments.\n * @param {String} `key`\n * @param {any} `value`\n * @return {Object} Returns the instance for chaining.\n * @api public\n */\n\n Cache.prototype.set = function(key, val) {\n if (Array.isArray(key) && arguments.length === 2) {\n key = toPath(key);\n }\n if (isObject(key) || Array.isArray(key)) {\n this.visit('set', key);\n } else {\n set(prop ? this[prop] : this, key, val);\n this.emit('set', key, val);\n }\n return this;\n };\n\n /**\n * Union `array` to `key`. Also emits `set` with\n * the key and value.\n *\n * ```js\n * app.union('a.b', ['foo']);\n * app.union('a.b', ['bar']);\n * console.log(app.get('a'));\n * //=> {b: ['foo', 'bar']}\n * ```\n * @name .union\n * @param {String} `key`\n * @param {any} `value`\n * @return {Object} Returns the instance for chaining.\n * @api public\n */\n\n Cache.prototype.union = function(key, val) {\n if (Array.isArray(key) && arguments.length === 2) {\n key = toPath(key);\n }\n var ctx = prop ? this[prop] : this;\n union(ctx, key, arrayify(val));\n this.emit('union', val);\n return this;\n };\n\n /**\n * Return the value of `key`. Dot notation may be used\n * to get [nested property values][get-value].\n *\n * ```js\n * app.set('a.b.c', 'd');\n * app.get('a.b');\n * //=> {c: 'd'}\n *\n * app.get(['a', 'b']);\n * //=> {c: 'd'}\n * ```\n *\n * @name .get\n * @emits `get` with `key` and `value` as arguments.\n * @param {String} `key` The name of the property to get. Dot-notation may be used.\n * @return {any} Returns the value of `key`\n * @api public\n */\n\n Cache.prototype.get = function(key) {\n key = toPath(arguments);\n\n var ctx = prop ? this[prop] : this;\n var val = get(ctx, key);\n\n this.emit('get', key, val);\n return val;\n };\n\n /**\n * Return true if app has a stored value for `key`,\n * false only if value is `undefined`.\n *\n * ```js\n * app.set('foo', 'bar');\n * app.has('foo');\n * //=> true\n * ```\n *\n * @name .has\n * @emits `has` with `key` and true or false as arguments.\n * @param {String} `key`\n * @return {Boolean}\n * @api public\n */\n\n Cache.prototype.has = function(key) {\n key = toPath(arguments);\n\n var ctx = prop ? this[prop] : this;\n var val = get(ctx, key);\n\n var has = typeof val !== 'undefined';\n this.emit('has', key, has);\n return has;\n };\n\n /**\n * Delete one or more properties from the instance.\n *\n * ```js\n * app.del(); // delete all\n * // or\n * app.del('foo');\n * // or\n * app.del(['foo', 'bar']);\n * ```\n * @name .del\n * @emits `del` with the `key` as the only argument.\n * @param {String|Array} `key` Property name or array of property names.\n * @return {Object} Returns the instance for chaining.\n * @api public\n */\n\n Cache.prototype.del = function(key) {\n if (Array.isArray(key)) {\n this.visit('del', key);\n } else {\n del(prop ? this[prop] : this, key);\n this.emit('del', key);\n }\n return this;\n };\n\n /**\n * Reset the entire cache to an empty object.\n *\n * ```js\n * app.clear();\n * ```\n * @api public\n */\n\n Cache.prototype.clear = function() {\n if (prop) {\n this[prop] = {};\n }\n };\n\n /**\n * Visit `method` over the properties in the given object, or map\n * visit over the object-elements in an array.\n *\n * @name .visit\n * @param {String} `method` The name of the `base` method to call.\n * @param {Object|Array} `val` The object or array to iterate over.\n * @return {Object} Returns the instance for chaining.\n * @api public\n */\n\n Cache.prototype.visit = function(method, val) {\n visit(this, method, val);\n return this;\n };\n\n return Cache;\n}\n\n/**\n * Cast val to an array\n */\n\nfunction arrayify(val) {\n return val ? (Array.isArray(val) ? val : [val]) : [];\n}\n\n/**\n * Expose `Cache`\n */\n\nmodule.exports = namespace();\n\n/**\n * Expose `Cache.namespace`\n */\n\nmodule.exports.namespace = namespace;\n", "/*!\n * is-extendable <https://github.com/jonschlinkert/is-extendable>\n *\n * Copyright (c) 2015-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar isPlainObject = require('is-plain-object');\n\nmodule.exports = function isExtendable(val) {\n return isPlainObject(val) || typeof val === 'function' || Array.isArray(val);\n};\n", "/*!\n * for-in <https://github.com/jonschlinkert/for-in>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function forIn(obj, fn, thisArg) {\n for (var key in obj) {\n if (fn.call(thisArg, obj[key], key, obj) === false) {\n break;\n }\n }\n};\n", "'use strict';\n\nvar isExtendable = require('is-extendable');\nvar forIn = require('for-in');\n\nfunction mixinDeep(target, objects) {\n var len = arguments.length, i = 0;\n while (++i < len) {\n var obj = arguments[i];\n if (isObject(obj)) {\n forIn(obj, copy, target);\n }\n }\n return target;\n}\n\n/**\n * Copy properties from the source object to the\n * target object.\n *\n * @param {*} `val`\n * @param {String} `key`\n */\n\nfunction copy(val, key) {\n if (!isValidKey(key)) {\n return;\n }\n\n var obj = this[key];\n if (isObject(val) && isObject(obj)) {\n mixinDeep(obj, val);\n } else {\n this[key] = val;\n }\n}\n\n/**\n * Returns true if `val` is an object or function.\n *\n * @param {any} val\n * @return {Boolean}\n */\n\nfunction isObject(val) {\n return isExtendable(val) && !Array.isArray(val);\n}\n\n/**\n * Returns true if `key` is a valid key to use when extending objects.\n *\n * @param {String} `key`\n * @return {Boolean}\n */\n\nfunction isValidKey(key) {\n return key !== '__proto__' && key !== 'constructor' && key !== 'prototype';\n};\n\n/**\n * Expose `mixinDeep`\n */\n\nmodule.exports = mixinDeep;\n", "/*!\n * pascalcase <https://github.com/jonschlinkert/pascalcase>\n *\n * Copyright (c) 2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\nfunction pascalcase(str) {\n if (typeof str !== 'string') {\n throw new TypeError('expected a string.');\n }\n str = str.replace(/([A-Z])/g, ' $1');\n if (str.length === 1) { return str.toUpperCase(); }\n str = str.replace(/^[\\W_]+|[\\W_]+$/g, '').toLowerCase();\n str = str.charAt(0).toUpperCase() + str.slice(1);\n return str.replace(/[\\W_]+(\\w|$)/g, function (_, ch) {\n return ch.toUpperCase();\n });\n}\n\nmodule.exports = pascalcase;\n", "var toString = Object.prototype.toString;\n\n/**\n * Get the native `typeof` a value.\n *\n * @param {*} `val`\n * @return {*} Native javascript type\n */\n\nmodule.exports = function kindOf(val) {\n var type = typeof val;\n\n // primitivies\n if (type === 'undefined') {\n return 'undefined';\n }\n if (val === null) {\n return 'null';\n }\n if (val === true || val === false || val instanceof Boolean) {\n return 'boolean';\n }\n if (type === 'string' || val instanceof String) {\n return 'string';\n }\n if (type === 'number' || val instanceof Number) {\n return 'number';\n }\n\n // functions\n if (type === 'function' || val instanceof Function) {\n if (typeof val.constructor.name !== 'undefined' && val.constructor.name.slice(0, 9) === 'Generator') {\n return 'generatorfunction';\n }\n return 'function';\n }\n\n // array\n if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) {\n return 'array';\n }\n\n // check for instances of RegExp and Date before calling `toString`\n if (val instanceof RegExp) {\n return 'regexp';\n }\n if (val instanceof Date) {\n return 'date';\n }\n\n // other objects\n type = toString.call(val);\n\n if (type === '[object RegExp]') {\n return 'regexp';\n }\n if (type === '[object Date]') {\n return 'date';\n }\n if (type === '[object Arguments]') {\n return 'arguments';\n }\n if (type === '[object Error]') {\n return 'error';\n }\n if (type === '[object Promise]') {\n return 'promise';\n }\n\n // buffer\n if (isBuffer(val)) {\n return 'buffer';\n }\n\n // es6: Map, WeakMap, Set, WeakSet\n if (type === '[object Set]') {\n return 'set';\n }\n if (type === '[object WeakSet]') {\n return 'weakset';\n }\n if (type === '[object Map]') {\n return 'map';\n }\n if (type === '[object WeakMap]') {\n return 'weakmap';\n }\n if (type === '[object Symbol]') {\n return 'symbol';\n }\n \n if (type === '[object Map Iterator]') {\n return 'mapiterator';\n }\n if (type === '[object Set Iterator]') {\n return 'setiterator';\n }\n if (type === '[object String Iterator]') {\n return 'stringiterator';\n }\n if (type === '[object Array Iterator]') {\n return 'arrayiterator';\n }\n \n // typed arrays\n if (type === '[object Int8Array]') {\n return 'int8array';\n }\n if (type === '[object Uint8Array]') {\n return 'uint8array';\n }\n if (type === '[object Uint8ClampedArray]') {\n return 'uint8clampedarray';\n }\n if (type === '[object Int16Array]') {\n return 'int16array';\n }\n if (type === '[object Uint16Array]') {\n return 'uint16array';\n }\n if (type === '[object Int32Array]') {\n return 'int32array';\n }\n if (type === '[object Uint32Array]') {\n return 'uint32array';\n }\n if (type === '[object Float32Array]') {\n return 'float32array';\n }\n if (type === '[object Float64Array]') {\n return 'float64array';\n }\n\n // must be a plain object\n return 'object';\n};\n\n/**\n * If you need to support Safari 5-7 (8-10 yr-old browser),\n * take a look at https://github.com/feross/is-buffer\n */\n\nfunction isBuffer(val) {\n return val.constructor\n && typeof val.constructor.isBuffer === 'function'\n && val.constructor.isBuffer(val);\n}\n", "/*!\n * Determine if an object is a Buffer\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n\n// The _isBuffer check is for Safari 5-7 support, because it's missing\n// Object.prototype.constructor. Remove this eventually\nmodule.exports = function (obj) {\n return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)\n}\n\nfunction isBuffer (obj) {\n return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n\n// For Node v0.10 support. Remove this eventually.\nfunction isSlowBuffer (obj) {\n return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))\n}\n", "var isBuffer = require('is-buffer');\nvar toString = Object.prototype.toString;\n\n/**\n * Get the native `typeof` a value.\n *\n * @param {*} `val`\n * @return {*} Native javascript type\n */\n\nmodule.exports = function kindOf(val) {\n // primitivies\n if (typeof val === 'undefined') {\n return 'undefined';\n }\n if (val === null) {\n return 'null';\n }\n if (val === true || val === false || val instanceof Boolean) {\n return 'boolean';\n }\n if (typeof val === 'string' || val instanceof String) {\n return 'string';\n }\n if (typeof val === 'number' || val instanceof Number) {\n return 'number';\n }\n\n // functions\n if (typeof val === 'function' || val instanceof Function) {\n return 'function';\n }\n\n // array\n if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) {\n return 'array';\n }\n\n // check for instances of RegExp and Date before calling `toString`\n if (val instanceof RegExp) {\n return 'regexp';\n }\n if (val instanceof Date) {\n return 'date';\n }\n\n // other objects\n var type = toString.call(val);\n\n if (type === '[object RegExp]') {\n return 'regexp';\n }\n if (type === '[object Date]') {\n return 'date';\n }\n if (type === '[object Arguments]') {\n return 'arguments';\n }\n if (type === '[object Error]') {\n return 'error';\n }\n\n // buffer\n if (isBuffer(val)) {\n return 'buffer';\n }\n\n // es6: Map, WeakMap, Set, WeakSet\n if (type === '[object Set]') {\n return 'set';\n }\n if (type === '[object WeakSet]') {\n return 'weakset';\n }\n if (type === '[object Map]') {\n return 'map';\n }\n if (type === '[object WeakMap]') {\n return 'weakmap';\n }\n if (type === '[object Symbol]') {\n return 'symbol';\n }\n\n // typed arrays\n if (type === '[object Int8Array]') {\n return 'int8array';\n }\n if (type === '[object Uint8Array]') {\n return 'uint8array';\n }\n if (type === '[object Uint8ClampedArray]') {\n return 'uint8clampedarray';\n }\n if (type === '[object Int16Array]') {\n return 'int16array';\n }\n if (type === '[object Uint16Array]') {\n return 'uint16array';\n }\n if (type === '[object Int32Array]') {\n return 'int32array';\n }\n if (type === '[object Uint32Array]') {\n return 'uint32array';\n }\n if (type === '[object Float32Array]') {\n return 'float32array';\n }\n if (type === '[object Float64Array]') {\n return 'float64array';\n }\n\n // must be a plain object\n return 'object';\n};\n", "/*!\n * is-accessor-descriptor <https://github.com/jonschlinkert/is-accessor-descriptor>\n *\n * Copyright (c) 2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nvar typeOf = require('kind-of');\n\n// accessor descriptor properties\nvar accessor = {\n get: 'function',\n set: 'function',\n configurable: 'boolean',\n enumerable: 'boolean'\n};\n\nfunction isAccessorDescriptor(obj, prop) {\n if (typeof prop === 'string') {\n var val = Object.getOwnPropertyDescriptor(obj, prop);\n return typeof val !== 'undefined';\n }\n\n if (typeOf(obj) !== 'object') {\n return false;\n }\n\n if (has(obj, 'value') || has(obj, 'writable')) {\n return false;\n }\n\n if (!has(obj, 'get') || typeof obj.get !== 'function') {\n return false;\n }\n\n // tldr: it's valid to have \"set\" be undefined\n // \"set\" might be undefined if `Object.getOwnPropertyDescriptor`\n // was used to get the value, and only `get` was defined by the user\n if (has(obj, 'set') && typeof obj[key] !== 'function' && typeof obj[key] !== 'undefined') {\n return false;\n }\n\n for (var key in obj) {\n if (!accessor.hasOwnProperty(key)) {\n continue;\n }\n\n if (typeOf(obj[key]) === accessor[key]) {\n continue;\n }\n\n if (typeof obj[key] !== 'undefined') {\n return false;\n }\n }\n return true;\n}\n\nfunction has(obj, key) {\n return {}.hasOwnProperty.call(obj, key);\n}\n\n/**\n * Expose `isAccessorDescriptor`\n */\n\nmodule.exports = isAccessorDescriptor;\n", "var isBuffer = require('is-buffer');\nvar toString = Object.prototype.toString;\n\n/**\n * Get the native `typeof` a value.\n *\n * @param {*} `val`\n * @return {*} Native javascript type\n */\n\nmodule.exports = function kindOf(val) {\n // primitivies\n if (typeof val === 'undefined') {\n return 'undefined';\n }\n if (val === null) {\n return 'null';\n }\n if (val === true || val === false || val instanceof Boolean) {\n return 'boolean';\n }\n if (typeof val === 'string' || val instanceof String) {\n return 'string';\n }\n if (typeof val === 'number' || val instanceof Number) {\n return 'number';\n }\n\n // functions\n if (typeof val === 'function' || val instanceof Function) {\n return 'function';\n }\n\n // array\n if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) {\n return 'array';\n }\n\n // check for instances of RegExp and Date before calling `toString`\n if (val instanceof RegExp) {\n return 'regexp';\n }\n if (val instanceof Date) {\n return 'date';\n }\n\n // other objects\n var type = toString.call(val);\n\n if (type === '[object RegExp]') {\n return 'regexp';\n }\n if (type === '[object Date]') {\n return 'date';\n }\n if (type === '[object Arguments]') {\n return 'arguments';\n }\n if (type === '[object Error]') {\n return 'error';\n }\n\n // buffer\n if (isBuffer(val)) {\n return 'buffer';\n }\n\n // es6: Map, WeakMap, Set, WeakSet\n if (type === '[object Set]') {\n return 'set';\n }\n if (type === '[object WeakSet]') {\n return 'weakset';\n }\n if (type === '[object Map]') {\n return 'map';\n }\n if (type === '[object WeakMap]') {\n return 'weakmap';\n }\n if (type === '[object Symbol]') {\n return 'symbol';\n }\n\n // typed arrays\n if (type === '[object Int8Array]') {\n return 'int8array';\n }\n if (type === '[object Uint8Array]') {\n return 'uint8array';\n }\n if (type === '[object Uint8ClampedArray]') {\n return 'uint8clampedarray';\n }\n if (type === '[object Int16Array]') {\n return 'int16array';\n }\n if (type === '[object Uint16Array]') {\n return 'uint16array';\n }\n if (type === '[object Int32Array]') {\n return 'int32array';\n }\n if (type === '[object Uint32Array]') {\n return 'uint32array';\n }\n if (type === '[object Float32Array]') {\n return 'float32array';\n }\n if (type === '[object Float64Array]') {\n return 'float64array';\n }\n\n // must be a plain object\n return 'object';\n};\n", "/*!\n * is-data-descriptor <https://github.com/jonschlinkert/is-data-descriptor>\n *\n * Copyright (c) 2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nvar typeOf = require('kind-of');\n\n// data descriptor properties\nvar data = {\n configurable: 'boolean',\n enumerable: 'boolean',\n writable: 'boolean'\n};\n\nfunction isDataDescriptor(obj, prop) {\n if (typeOf(obj) !== 'object') {\n return false;\n }\n\n if (typeof prop === 'string') {\n var val = Object.getOwnPropertyDescriptor(obj, prop);\n return typeof val !== 'undefined';\n }\n\n if (!('value' in obj) && !('writable' in obj)) {\n return false;\n }\n\n for (var key in obj) {\n if (key === 'value') continue;\n\n if (!data.hasOwnProperty(key)) {\n continue;\n }\n\n if (typeOf(obj[key]) === data[key]) {\n continue;\n }\n\n if (typeof obj[key] !== 'undefined') {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Expose `isDataDescriptor`\n */\n\nmodule.exports = isDataDescriptor;\n", "/*!\n * is-descriptor <https://github.com/jonschlinkert/is-descriptor>\n *\n * Copyright (c) 2015-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar typeOf = require('kind-of');\nvar isAccessor = require('is-accessor-descriptor');\nvar isData = require('is-data-descriptor');\n\nmodule.exports = function isDescriptor(obj, key) {\n if (typeOf(obj) !== 'object') {\n return false;\n }\n if ('get' in obj) {\n return isAccessor(obj, key);\n }\n return isData(obj, key);\n};\n", "/*!\n * define-property <https://github.com/jonschlinkert/define-property>\n *\n * Copyright (c) 2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nvar isDescriptor = require('is-descriptor');\n\nmodule.exports = function defineProperty(obj, prop, val) {\n if (typeof obj !== 'object' && typeof obj !== 'function') {\n throw new TypeError('expected an object or function.');\n }\n\n if (typeof prop !== 'string') {\n throw new TypeError('expected `prop` to be a string.');\n }\n\n if (isDescriptor(val) && ('set' in val || 'get' in val)) {\n return Object.defineProperty(obj, prop, val);\n }\n\n return Object.defineProperty(obj, prop, {\n configurable: true,\n enumerable: false,\n writable: true,\n value: val\n });\n};\n", "/*!\n * copy-descriptor <https://github.com/jonschlinkert/copy-descriptor>\n *\n * Copyright (c) 2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\n/**\n * Copy a descriptor from one object to another.\n *\n * ```js\n * function App() {\n * this.cache = {};\n * }\n * App.prototype.set = function(key, val) {\n * this.cache[key] = val;\n * return this;\n * };\n * Object.defineProperty(App.prototype, 'count', {\n * get: function() {\n * return Object.keys(this.cache).length;\n * }\n * });\n *\n * copy(App.prototype, 'count', 'len');\n *\n * // create an instance\n * var app = new App();\n *\n * app.set('a', true);\n * app.set('b', true);\n * app.set('c', true);\n *\n * console.log(app.count);\n * //=> 3\n * console.log(app.len);\n * //=> 3\n * ```\n * @name copy\n * @param {Object} `receiver` The target object\n * @param {Object} `provider` The provider object\n * @param {String} `from` The key to copy on provider.\n * @param {String} `to` Optionally specify a new key name to use.\n * @return {Object}\n * @api public\n */\n\nmodule.exports = function copyDescriptor(receiver, provider, from, to) {\n if (!isObject(provider) && typeof provider !== 'function') {\n to = from;\n from = provider;\n provider = receiver;\n }\n if (!isObject(receiver) && typeof receiver !== 'function') {\n throw new TypeError('expected the first argument to be an object');\n }\n if (!isObject(provider) && typeof provider !== 'function') {\n throw new TypeError('expected provider to be an object');\n }\n\n if (typeof to !== 'string') {\n to = from;\n }\n if (typeof from !== 'string') {\n throw new TypeError('expected key to be a string');\n }\n\n if (!(from in provider)) {\n throw new Error('property \"' + from + '\" does not exist');\n }\n\n var val = Object.getOwnPropertyDescriptor(provider, from);\n if (val) Object.defineProperty(receiver, to, val);\n};\n\nfunction isObject(val) {\n return {}.toString.call(val) === '[object Object]';\n}\n\n", "'use strict';\n\nvar typeOf = require('kind-of');\nvar copyDescriptor = require('copy-descriptor');\nvar define = require('define-property');\n\n/**\n * Copy static properties, prototype properties, and descriptors from one object to another.\n *\n * ```js\n * function App() {}\n * var proto = App.prototype;\n * App.prototype.set = function() {};\n * App.prototype.get = function() {};\n *\n * var obj = {};\n * copy(obj, proto);\n * ```\n * @param {Object} `receiver`\n * @param {Object} `provider`\n * @param {String|Array} `omit` One or more properties to omit\n * @return {Object}\n * @api public\n */\n\nfunction copy(receiver, provider, omit) {\n if (!isObject(receiver)) {\n throw new TypeError('expected receiving object to be an object.');\n }\n if (!isObject(provider)) {\n throw new TypeError('expected providing object to be an object.');\n }\n\n var props = nativeKeys(provider);\n var keys = Object.keys(provider);\n var len = props.length;\n omit = arrayify(omit);\n\n while (len--) {\n var key = props[len];\n\n if (has(keys, key)) {\n define(receiver, key, provider[key]);\n } else if (!(key in receiver) && !has(omit, key)) {\n copyDescriptor(receiver, provider, key);\n }\n }\n};\n\n/**\n * Return true if the given value is an object or function\n */\n\nfunction isObject(val) {\n return typeOf(val) === 'object' || typeof val === 'function';\n}\n\n/**\n * Returns true if an array has any of the given elements, or an\n * object has any of the give keys.\n *\n * ```js\n * has(['a', 'b', 'c'], 'c');\n * //=> true\n *\n * has(['a', 'b', 'c'], ['c', 'z']);\n * //=> true\n *\n * has({a: 'b', c: 'd'}, ['c', 'z']);\n * //=> true\n * ```\n * @param {Object} `obj`\n * @param {String|Array} `val`\n * @return {Boolean}\n */\n\nfunction has(obj, val) {\n val = arrayify(val);\n var len = val.length;\n\n if (isObject(obj)) {\n for (var key in obj) {\n if (val.indexOf(key) > -1) {\n return true;\n }\n }\n\n var keys = nativeKeys(obj);\n return has(keys, val);\n }\n\n if (Array.isArray(obj)) {\n var arr = obj;\n while (len--) {\n if (arr.indexOf(val[len]) > -1) {\n return true;\n }\n }\n return false;\n }\n\n throw new TypeError('expected an array or object.');\n}\n\n/**\n * Cast the given value to an array.\n *\n * ```js\n * arrayify('foo');\n * //=> ['foo']\n *\n * arrayify(['foo']);\n * //=> ['foo']\n * ```\n *\n * @param {String|Array} `val`\n * @return {Array}\n */\n\nfunction arrayify(val) {\n return val ? (Array.isArray(val) ? val : [val]) : [];\n}\n\n/**\n * Returns true if a value has a `contructor`\n *\n * ```js\n * hasConstructor({});\n * //=> true\n *\n * hasConstructor(Object.create(null));\n * //=> false\n * ```\n * @param {Object} `value`\n * @return {Boolean}\n */\n\nfunction hasConstructor(val) {\n return isObject(val) && typeof val.constructor !== 'undefined';\n}\n\n/**\n * Get the native `ownPropertyNames` from the constructor of the\n * given `object`. An empty array is returned if the object does\n * not have a constructor.\n *\n * ```js\n * nativeKeys({a: 'b', b: 'c', c: 'd'})\n * //=> ['a', 'b', 'c']\n *\n * nativeKeys(function(){})\n * //=> ['length', 'caller']\n * ```\n *\n * @param {Object} `obj` Object that has a `constructor`.\n * @return {Array} Array of keys.\n */\n\nfunction nativeKeys(val) {\n if (!hasConstructor(val)) return [];\n return Object.getOwnPropertyNames(val);\n}\n\n/**\n * Expose `copy`\n */\n\nmodule.exports = copy;\n\n/**\n * Expose `copy.has` for tests\n */\n\nmodule.exports.has = has;\n", "/*!\n * static-extend <https://github.com/jonschlinkert/static-extend>\n *\n * Copyright (c) 2016, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nvar copy = require('object-copy');\nvar define = require('define-property');\nvar util = require('util');\n\n/**\n * Returns a function for extending the static properties,\n * prototype properties, and descriptors from the `Parent`\n * constructor onto `Child` constructors.\n *\n * ```js\n * var extend = require('static-extend');\n * Parent.extend = extend(Parent);\n *\n * // optionally pass a custom merge function as the second arg\n * Parent.extend = extend(Parent, function(Child) {\n * Child.prototype.mixin = function(key, val) {\n * Child.prototype[key] = val;\n * };\n * });\n *\n * // extend \"child\" constructors\n * Parent.extend(Child);\n *\n * // optionally define prototype methods as the second arg\n * Parent.extend(Child, {\n * foo: function() {},\n * bar: function() {}\n * });\n * ```\n * @param {Function} `Parent` Parent ctor\n * @param {Function} `extendFn` Optional extend function for handling any necessary custom merging. Useful when updating methods that require a specific prototype.\n * @param {Function} `Child` Child ctor\n * @param {Object} `proto` Optionally pass additional prototype properties to inherit.\n * @return {Object}\n * @api public\n */\n\nfunction extend(Parent, extendFn) {\n if (typeof Parent !== 'function') {\n throw new TypeError('expected Parent to be a function.');\n }\n\n return function(Ctor, proto) {\n if (typeof Ctor !== 'function') {\n throw new TypeError('expected Ctor to be a function.');\n }\n\n util.inherits(Ctor, Parent);\n copy(Ctor, Parent);\n\n // proto can be null or a plain object\n if (typeof proto === 'object') {\n var obj = Object.create(proto);\n\n for (var k in obj) {\n Ctor.prototype[k] = obj[k];\n }\n }\n\n // keep a reference to the parent prototype\n define(Ctor.prototype, '_parent_', {\n configurable: true,\n set: function() {},\n get: function() {\n return Parent.prototype;\n }\n });\n\n if (typeof extendFn === 'function') {\n extendFn(Ctor, Parent);\n }\n\n Ctor.extend = extend(Ctor, extendFn);\n };\n};\n\n/**\n * Expose `extend`\n */\n\nmodule.exports = extend;\n", "'use strict';\n\nvar util = require('util');\nvar union = require('arr-union');\nvar define = require('define-property');\nvar staticExtend = require('static-extend');\nvar isObj = require('isobject');\n\n/**\n * Expose class utils\n */\n\nvar cu = module.exports;\n\n/**\n * Expose class utils: `cu`\n */\n\ncu.isObject = function isObject(val) {\n return isObj(val) || typeof val === 'function';\n};\n\n/**\n * Returns true if an array has any of the given elements, or an\n * object has any of the give keys.\n *\n * ```js\n * cu.has(['a', 'b', 'c'], 'c');\n * //=> true\n *\n * cu.has(['a', 'b', 'c'], ['c', 'z']);\n * //=> true\n *\n * cu.has({a: 'b', c: 'd'}, ['c', 'z']);\n * //=> true\n * ```\n * @param {Object} `obj`\n * @param {String|Array} `val`\n * @return {Boolean}\n * @api public\n */\n\ncu.has = function has(obj, val) {\n val = cu.arrayify(val);\n var len = val.length;\n\n if (cu.isObject(obj)) {\n for (var key in obj) {\n if (val.indexOf(key) > -1) {\n return true;\n }\n }\n\n var keys = cu.nativeKeys(obj);\n return cu.has(keys, val);\n }\n\n if (Array.isArray(obj)) {\n var arr = obj;\n while (len--) {\n if (arr.indexOf(val[len]) > -1) {\n return true;\n }\n }\n return false;\n }\n\n throw new TypeError('expected an array or object.');\n};\n\n/**\n * Returns true if an array or object has all of the given values.\n *\n * ```js\n * cu.hasAll(['a', 'b', 'c'], 'c');\n * //=> true\n *\n * cu.hasAll(['a', 'b', 'c'], ['c', 'z']);\n * //=> false\n *\n * cu.hasAll({a: 'b', c: 'd'}, ['c', 'z']);\n * //=> false\n * ```\n * @param {Object|Array} `val`\n * @param {String|Array} `values`\n * @return {Boolean}\n * @api public\n */\n\ncu.hasAll = function hasAll(val, values) {\n values = cu.arrayify(values);\n var len = values.length;\n while (len--) {\n if (!cu.has(val, values[len])) {\n return false;\n }\n }\n return true;\n};\n\n/**\n * Cast the given value to an array.\n *\n * ```js\n * cu.arrayify('foo');\n * //=> ['foo']\n *\n * cu.arrayify(['foo']);\n * //=> ['foo']\n * ```\n *\n * @param {String|Array} `val`\n * @return {Array}\n * @api public\n */\n\ncu.arrayify = function arrayify(val) {\n return val ? (Array.isArray(val) ? val : [val]) : [];\n};\n\n/**\n * Noop\n */\n\ncu.noop = function noop() {\n return;\n};\n\n/**\n * Returns the first argument passed to the function.\n */\n\ncu.identity = function identity(val) {\n return val;\n};\n\n/**\n * Returns true if a value has a `contructor`\n *\n * ```js\n * cu.hasConstructor({});\n * //=> true\n *\n * cu.hasConstructor(Object.create(null));\n * //=> false\n * ```\n * @param {Object} `value`\n * @return {Boolean}\n * @api public\n */\n\ncu.hasConstructor = function hasConstructor(val) {\n return cu.isObject(val) && typeof val.constructor !== 'undefined';\n};\n\n/**\n * Get the native `ownPropertyNames` from the constructor of the\n * given `object`. An empty array is returned if the object does\n * not have a constructor.\n *\n * ```js\n * cu.nativeKeys({a: 'b', b: 'c', c: 'd'})\n * //=> ['a', 'b', 'c']\n *\n * cu.nativeKeys(function(){})\n * //=> ['length', 'caller']\n * ```\n *\n * @param {Object} `obj` Object that has a `constructor`.\n * @return {Array} Array of keys.\n * @api public\n */\n\ncu.nativeKeys = function nativeKeys(val) {\n if (!cu.hasConstructor(val)) return [];\n var keys = Object.getOwnPropertyNames(val);\n if ('caller' in val) keys.push('caller');\n return keys;\n};\n\n/**\n * Returns property descriptor `key` if it's an \"own\" property\n * of the given object.\n *\n * ```js\n * function App() {}\n * Object.defineProperty(App.prototype, 'count', {\n * get: function() {\n * return Object.keys(this).length;\n * }\n * });\n * cu.getDescriptor(App.prototype, 'count');\n * // returns:\n * // {\n * // get: [Function],\n * // set: undefined,\n * // enumerable: false,\n * // configurable: false\n * // }\n * ```\n *\n * @param {Object} `obj`\n * @param {String} `key`\n * @return {Object} Returns descriptor `key`\n * @api public\n */\n\ncu.getDescriptor = function getDescriptor(obj, key) {\n if (!cu.isObject(obj)) {\n throw new TypeError('expected an object.');\n }\n if (typeof key !== 'string') {\n throw new TypeError('expected key to be a string.');\n }\n return Object.getOwnPropertyDescriptor(obj, key);\n};\n\n/**\n * Copy a descriptor from one object to another.\n *\n * ```js\n * function App() {}\n * Object.defineProperty(App.prototype, 'count', {\n * get: function() {\n * return Object.keys(this).length;\n * }\n * });\n * var obj = {};\n * cu.copyDescriptor(obj, App.prototype, 'count');\n * ```\n * @param {Object} `receiver`\n * @param {Object} `provider`\n * @param {String} `name`\n * @return {Object}\n * @api public\n */\n\ncu.copyDescriptor = function copyDescriptor(receiver, provider, name) {\n if (!cu.isObject(receiver)) {\n throw new TypeError('expected receiving object to be an object.');\n }\n if (!cu.isObject(provider)) {\n throw new TypeError('expected providing object to be an object.');\n }\n if (typeof name !== 'string') {\n throw new TypeError('expected name to be a string.');\n }\n\n var val = cu.getDescriptor(provider, name);\n if (val) Object.defineProperty(receiver, name, val);\n};\n\n/**\n * Copy static properties, prototype properties, and descriptors\n * from one object to another.\n *\n * @param {Object} `receiver`\n * @param {Object} `provider`\n * @param {String|Array} `omit` One or more properties to omit\n * @return {Object}\n * @api public\n */\n\ncu.copy = function copy(receiver, provider, omit) {\n if (!cu.isObject(receiver)) {\n throw new TypeError('expected receiving object to be an object.');\n }\n if (!cu.isObject(provider)) {\n throw new TypeError('expected providing object to be an object.');\n }\n var props = Object.getOwnPropertyNames(provider);\n var keys = Object.keys(provider);\n var len = props.length,\n key;\n omit = cu.arrayify(omit);\n\n while (len--) {\n key = props[len];\n\n if (cu.has(keys, key)) {\n define(receiver, key, provider[key]);\n } else if (!(key in receiver) && !cu.has(omit, key)) {\n cu.copyDescriptor(receiver, provider, key);\n }\n }\n};\n\n/**\n * Inherit the static properties, prototype properties, and descriptors\n * from of an object.\n *\n * @param {Object} `receiver`\n * @param {Object} `provider`\n * @param {String|Array} `omit` One or more properties to omit\n * @return {Object}\n * @api public\n */\n\ncu.inherit = function inherit(receiver, provider, omit) {\n if (!cu.isObject(receiver)) {\n throw new TypeError('expected receiving object to be an object.');\n }\n if (!cu.isObject(provider)) {\n throw new TypeError('expected providing object to be an object.');\n }\n\n var keys = [];\n for (var key in provider) {\n keys.push(key);\n receiver[key] = provider[key];\n }\n\n keys = keys.concat(cu.arrayify(omit));\n\n var a = provider.prototype || provider;\n var b = receiver.prototype || receiver;\n cu.copy(b, a, keys);\n};\n\n/**\n * Returns a function for extending the static properties,\n * prototype properties, and descriptors from the `Parent`\n * constructor onto `Child` constructors.\n *\n * ```js\n * var extend = cu.extend(Parent);\n * Parent.extend(Child);\n *\n * // optional methods\n * Parent.extend(Child, {\n * foo: function() {},\n * bar: function() {}\n * });\n * ```\n * @param {Function} `Parent` Parent ctor\n * @param {Function} `extend` Optional extend function to handle custom extensions. Useful when updating methods that require a specific prototype.\n * @param {Function} `Child` Child ctor\n * @param {Object} `proto` Optionally pass additional prototype properties to inherit.\n * @return {Object}\n * @api public\n */\n\ncu.extend = function() {\n // keep it lazy, instead of assigning to `cu.extend`\n return staticExtend.apply(null, arguments);\n};\n\n/**\n * Bubble up events emitted from static methods on the Parent ctor.\n *\n * @param {Object} `Parent`\n * @param {Array} `events` Event names to bubble up\n * @api public\n */\n\ncu.bubble = function(Parent, events) {\n events = events || [];\n Parent.bubble = function(Child, arr) {\n if (Array.isArray(arr)) {\n events = union([], events, arr);\n }\n var len = events.length;\n var idx = -1;\n while (++idx < len) {\n var name = events[idx];\n Parent.on(name, Child.emit.bind(Child, name));\n }\n cu.bubble(Child, events);\n };\n};\n", "'use strict';\n\nvar util = require('util');\nvar define = require('define-property');\nvar CacheBase = require('cache-base');\nvar Emitter = require('component-emitter');\nvar isObject = require('isobject');\nvar merge = require('mixin-deep');\nvar pascal = require('pascalcase');\nvar cu = require('class-utils');\n\n/**\n * Optionally define a custom `cache` namespace to use.\n */\n\nfunction namespace(name) {\n var Cache = name ? CacheBase.namespace(name) : CacheBase;\n var fns = [];\n\n /**\n * Create an instance of `Base` with the given `config` and `options`.\n *\n * ```js\n * // initialize with `config` and `options`\n * var app = new Base({isApp: true}, {abc: true});\n * app.set('foo', 'bar');\n *\n * // values defined with the given `config` object will be on the root of the instance\n * console.log(app.baz); //=> undefined\n * console.log(app.foo); //=> 'bar'\n * // or use `.get`\n * console.log(app.get('isApp')); //=> true\n * console.log(app.get('foo')); //=> 'bar'\n *\n * // values defined with the given `options` object will be on `app.options\n * console.log(app.options.abc); //=> true\n * ```\n *\n * @param {Object} `config` If supplied, this object is passed to [cache-base][] to merge onto the the instance upon instantiation.\n * @param {Object} `options` If supplied, this object is used to initialize the `base.options` object.\n * @api public\n */\n\n function Base(config, options) {\n if (!(this instanceof Base)) {\n return new Base(config, options);\n }\n Cache.call(this, config);\n this.is('base');\n this.initBase(config, options);\n }\n\n /**\n * Inherit cache-base\n */\n\n util.inherits(Base, Cache);\n\n /**\n * Add static emitter methods\n */\n\n Emitter(Base);\n\n /**\n * Initialize `Base` defaults with the given `config` object\n */\n\n Base.prototype.initBase = function(config, options) {\n this.options = merge({}, this.options, options);\n this.cache = this.cache || {};\n this.define('registered', {});\n if (name) this[name] = {};\n\n // make `app._callbacks` non-enumerable\n this.define('_callbacks', this._callbacks);\n if (isObject(config)) {\n this.visit('set', config);\n }\n Base.run(this, 'use', fns);\n };\n\n /**\n * Set the given `name` on `app._name` and `app.is*` properties. Used for doing\n * lookups in plugins.\n *\n * ```js\n * app.is('foo');\n * console.log(app._name);\n * //=> 'foo'\n * console.log(app.isFoo);\n * //=> true\n * app.is('bar');\n * console.log(app.isFoo);\n * //=> true\n * console.log(app.isBar);\n * //=> true\n * console.log(app._name);\n * //=> 'bar'\n * ```\n * @name .is\n * @param {String} `name`\n * @return {Boolean}\n * @api public\n */\n\n Base.prototype.is = function(name) {\n if (typeof name !== 'string') {\n throw new TypeError('expected name to be a string');\n }\n this.define('is' + pascal(name), true);\n this.define('_name', name);\n this.define('_appname', name);\n return this;\n };\n\n /**\n * Returns true if a plugin has already been registered on an instance.\n *\n * Plugin implementors are encouraged to use this first thing in a plugin\n * to prevent the plugin from being called more than once on the same\n * instance.\n *\n * ```js\n * var base = new Base();\n * base.use(function(app) {\n * if (app.isRegistered('myPlugin')) return;\n * // do stuff to `app`\n * });\n *\n * // to also record the plugin as being registered\n * base.use(function(app) {\n * if (app.isRegistered('myPlugin', true)) return;\n * // do stuff to `app`\n * });\n * ```\n * @name .isRegistered\n * @emits `plugin` Emits the name of the plugin being registered. Useful for unit tests, to ensure plugins are only registered once.\n * @param {String} `name` The plugin name.\n * @param {Boolean} `register` If the plugin if not already registered, to record it as being registered pass `true` as the second argument.\n * @return {Boolean} Returns true if a plugin is already registered.\n * @api public\n */\n\n Base.prototype.isRegistered = function(name, register) {\n if (this.registered.hasOwnProperty(name)) {\n return true;\n }\n if (register !== false) {\n this.registered[name] = true;\n this.emit('plugin', name);\n }\n return false;\n };\n\n /**\n * Define a plugin function to be called immediately upon init. Plugins are chainable\n * and expose the following arguments to the plugin function:\n *\n * - `app`: the current instance of `Base`\n * - `base`: the [first ancestor instance](#base) of `Base`\n *\n * ```js\n * var app = new Base()\n * .use(foo)\n * .use(bar)\n * .use(baz)\n * ```\n * @name .use\n * @param {Function} `fn` plugin function to call\n * @return {Object} Returns the item instance for chaining.\n * @api public\n */\n\n Base.prototype.use = function(fn) {\n fn.call(this, this);\n return this;\n };\n\n /**\n * The `.define` method is used for adding non-enumerable property on the instance.\n * Dot-notation is **not supported** with `define`.\n *\n * ```js\n * // arbitrary `render` function using lodash `template`\n * app.define('render', function(str, locals) {\n * return _.template(str)(locals);\n * });\n * ```\n * @name .define\n * @param {String} `key` The name of the property to define.\n * @param {any} `value`\n * @return {Object} Returns the instance for chaining.\n * @api public\n */\n\n Base.prototype.define = function(key, val) {\n if (isObject(key)) {\n return this.visit('define', key);\n }\n define(this, key, val);\n return this;\n };\n\n /**\n * Mix property `key` onto the Base prototype. If base is inherited using\n * `Base.extend` this method will be overridden by a new `mixin` method that will\n * only add properties to the prototype of the inheriting application.\n *\n * ```js\n * app.mixin('foo', function() {\n * // do stuff\n * });\n * ```\n * @name .mixin\n * @param {String} `key`\n * @param {Object|Array} `val`\n * @return {Object} Returns the `base` instance for chaining.\n * @api public\n */\n\n Base.prototype.mixin = function(key, val) {\n Base.prototype[key] = val;\n return this;\n };\n\n /**\n * Non-enumberable mixin array, used by the static [Base.mixin]() method.\n */\n\n Base.prototype.mixins = Base.prototype.mixins || [];\n\n /**\n * Getter/setter used when creating nested instances of `Base`, for storing a reference\n * to the first ancestor instance. This works by setting an instance of `Base` on the `parent`\n * property of a \"child\" instance. The `base` property defaults to the current instance if\n * no `parent` property is defined.\n *\n * ```js\n * // create an instance of `Base`, this is our first (\"base\") instance\n * var first = new Base();\n * first.foo = 'bar'; // arbitrary property, to make it easier to see what's happening later\n *\n * // create another instance\n * var second = new Base();\n * // create a reference to the first instance (`first`)\n * second.parent = first;\n *\n * // create another instance\n * var third = new Base();\n * // create a reference to the previous instance (`second`)\n * // repeat this pattern every time a \"child\" instance is created\n * third.parent = second;\n *\n * // we can always access the first instance using the `base` property\n * console.log(first.base.foo);\n * //=> 'bar'\n * console.log(second.base.foo);\n * //=> 'bar'\n * console.log(third.base.foo);\n * //=> 'bar'\n * // and now you know how to get to third base ;)\n * ```\n * @name .base\n * @api public\n */\n\n Object.defineProperty(Base.prototype, 'base', {\n configurable: true,\n get: function() {\n return this.parent ? this.parent.base : this;\n }\n });\n\n /**\n * Static method for adding global plugin functions that will\n * be added to an instance when created.\n *\n * ```js\n * Base.use(function(app) {\n * app.foo = 'bar';\n * });\n * var app = new Base();\n * console.log(app.foo);\n * //=> 'bar'\n * ```\n * @name #use\n * @param {Function} `fn` Plugin function to use on each instance.\n * @return {Object} Returns the `Base` constructor for chaining\n * @api public\n */\n\n define(Base, 'use', function(fn) {\n fns.push(fn);\n return Base;\n });\n\n /**\n * Run an array of functions by passing each function\n * to a method on the given object specified by the given property.\n *\n * @param {Object} `obj` Object containing method to use.\n * @param {String} `prop` Name of the method on the object to use.\n * @param {Array} `arr` Array of functions to pass to the method.\n */\n\n define(Base, 'run', function(obj, prop, arr) {\n var len = arr.length, i = 0;\n while (len--) {\n obj[prop](arr[i++]);\n }\n return Base;\n });\n\n /**\n * Static method for inheriting the prototype and static methods of the `Base` class.\n * This method greatly simplifies the process of creating inheritance-based applications.\n * See [static-extend][] for more details.\n *\n * ```js\n * var extend = cu.extend(Parent);\n * Parent.extend(Child);\n *\n * // optional methods\n * Parent.extend(Child, {\n * foo: function() {},\n * bar: function() {}\n * });\n * ```\n * @name #extend\n * @param {Function} `Ctor` constructor to extend\n * @param {Object} `methods` Optional prototype properties to mix in.\n * @return {Object} Returns the `Base` constructor for chaining\n * @api public\n */\n\n define(Base, 'extend', cu.extend(Base, function(Ctor, Parent) {\n Ctor.prototype.mixins = Ctor.prototype.mixins || [];\n\n define(Ctor, 'mixin', function(fn) {\n var mixin = fn(Ctor.prototype, Ctor);\n if (typeof mixin === 'function') {\n Ctor.prototype.mixins.push(mixin);\n }\n return Ctor;\n });\n\n define(Ctor, 'mixins', function(Child) {\n Base.run(Child, 'mixin', Ctor.prototype.mixins);\n return Ctor;\n });\n\n Ctor.prototype.mixin = function(key, value) {\n Ctor.prototype[key] = value;\n return this;\n };\n return Base;\n }));\n\n /**\n * Used for adding methods to the `Base` prototype, and/or to the prototype of child instances.\n * When a mixin function returns a function, the returned function is pushed onto the `.mixins`\n * array, making it available to be used on inheriting classes whenever `Base.mixins()` is\n * called (e.g. `Base.mixins(Child)`).\n *\n * ```js\n * Base.mixin(function(proto) {\n * proto.foo = function(msg) {\n * return 'foo ' + msg;\n * };\n * });\n * ```\n * @name #mixin\n * @param {Function} `fn` Function to call\n * @return {Object} Returns the `Base` constructor for chaining\n * @api public\n */\n\n define(Base, 'mixin', function(fn) {\n var mixin = fn(Base.prototype, Base);\n if (typeof mixin === 'function') {\n Base.prototype.mixins.push(mixin);\n }\n return Base;\n });\n\n /**\n * Static method for running global mixin functions against a child constructor.\n * Mixins must be registered before calling this method.\n *\n * ```js\n * Base.extend(Child);\n * Base.mixins(Child);\n * ```\n * @name #mixins\n * @param {Function} `Child` Constructor function of a child class\n * @return {Object} Returns the `Base` constructor for chaining\n * @api public\n */\n\n define(Base, 'mixins', function(Child) {\n Base.run(Child, 'mixin', Base.prototype.mixins);\n return Base;\n });\n\n /**\n * Similar to `util.inherit`, but copies all static properties, prototype properties, and\n * getters/setters from `Provider` to `Receiver`. See [class-utils][]{#inherit} for more details.\n *\n * ```js\n * Base.inherit(Foo, Bar);\n * ```\n * @name #inherit\n * @param {Function} `Receiver` Receiving (child) constructor\n * @param {Function} `Provider` Providing (parent) constructor\n * @return {Object} Returns the `Base` constructor for chaining\n * @api public\n */\n\n define(Base, 'inherit', cu.inherit);\n define(Base, 'bubble', cu.bubble);\n return Base;\n}\n\n/**\n * Expose `Base` with default settings\n */\n\nmodule.exports = namespace();\n\n/**\n * Allow users to define a namespace\n */\n\nmodule.exports.namespace = namespace;\n", "/*!\n * use <https://github.com/jonschlinkert/use>\n *\n * Copyright (c) 2015-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function base(app, options) {\n if (!isObject(app) && typeof app !== 'function') {\n throw new TypeError('expected an object or function');\n }\n\n var opts = isObject(options) ? options : {};\n var prop = typeof opts.prop === 'string' ? opts.prop : 'fns';\n if (!Array.isArray(app[prop])) {\n define(app, prop, []);\n }\n\n /**\n * Define a plugin function to be passed to use. The only\n * parameter exposed to the plugin is `app`, the object or function.\n * passed to `use(app)`. `app` is also exposed as `this` in plugins.\n *\n * Additionally, **if a plugin returns a function, the function will\n * be pushed onto the `fns` array**, allowing the plugin to be\n * called at a later point by the `run` method.\n *\n * ```js\n * var use = require('use');\n *\n * // define a plugin\n * function foo(app) {\n * // do stuff\n * }\n *\n * var app = function(){};\n * use(app);\n *\n * // register plugins\n * app.use(foo);\n * app.use(bar);\n * app.use(baz);\n * ```\n * @name .use\n * @param {Function} `fn` plugin function to call\n * @api public\n */\n\n define(app, 'use', use);\n\n /**\n * Run all plugins on `fns`. Any plugin that returns a function\n * when called by `use` is pushed onto the `fns` array.\n *\n * ```js\n * var config = {};\n * app.run(config);\n * ```\n * @name .run\n * @param {Object} `value` Object to be modified by plugins.\n * @return {Object} Returns the object passed to `run`\n * @api public\n */\n\n define(app, 'run', function(val) {\n if (!isObject(val)) return;\n\n if (!val.use || !val.run) {\n define(val, prop, val[prop] || []);\n define(val, 'use', use);\n }\n\n if (!val[prop] || val[prop].indexOf(base) === -1) {\n val.use(base);\n }\n\n var self = this || app;\n var fns = self[prop];\n var len = fns.length;\n var idx = -1;\n\n while (++idx < len) {\n val.use(fns[idx]);\n }\n return val;\n });\n\n /**\n * Call plugin `fn`. If a function is returned push it into the\n * `fns` array to be called by the `run` method.\n */\n\n function use(type, fn, options) {\n var offset = 1;\n\n if (typeof type === 'string' || Array.isArray(type)) {\n fn = wrap(type, fn);\n offset++;\n } else {\n options = fn;\n fn = type;\n }\n\n if (typeof fn !== 'function') {\n throw new TypeError('expected a function');\n }\n\n var self = this || app;\n var fns = self[prop];\n\n var args = [].slice.call(arguments, offset);\n args.unshift(self);\n\n if (typeof opts.hook === 'function') {\n opts.hook.apply(self, args);\n }\n\n var val = fn.apply(self, args);\n if (typeof val === 'function' && fns.indexOf(val) === -1) {\n fns.push(val);\n }\n return self;\n }\n\n /**\n * Wrap a named plugin function so that it's only called on objects of the\n * given `type`\n *\n * @param {String} `type`\n * @param {Function} `fn` Plugin function\n * @return {Function}\n */\n\n function wrap(type, fn) {\n return function plugin() {\n return this.type === type ? fn.apply(this, arguments) : plugin;\n };\n }\n\n return app;\n};\n\nfunction isObject(val) {\n return val && typeof val === 'object' && !Array.isArray(val);\n}\n\nfunction define(obj, key, val) {\n Object.defineProperty(obj, key, {\n configurable: true,\n writable: true,\n value: val\n });\n}\n", "/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isNaN(val) === false) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n if (ms >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (ms >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (ms >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (ms >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n return plural(ms, d, 'day') ||\n plural(ms, h, 'hour') ||\n plural(ms, m, 'minute') ||\n plural(ms, s, 'second') ||\n ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, n, name) {\n if (ms < n) {\n return;\n }\n if (ms < n * 1.5) {\n return Math.floor(ms / n) + ' ' + name;\n }\n return Math.ceil(ms / n) + ' ' + name + 's';\n}\n", "\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = createDebug.debug = createDebug['default'] = createDebug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = require('ms');\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n */\n\nexports.formatters = {};\n\n/**\n * Previous log timestamp.\n */\n\nvar prevTime;\n\n/**\n * Select a color.\n * @param {String} namespace\n * @return {Number}\n * @api private\n */\n\nfunction selectColor(namespace) {\n var hash = 0, i;\n\n for (i in namespace) {\n hash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n hash |= 0; // Convert to 32bit integer\n }\n\n return exports.colors[Math.abs(hash) % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction createDebug(namespace) {\n\n function debug() {\n // disabled?\n if (!debug.enabled) return;\n\n var self = debug;\n\n // set `diff` timestamp\n var curr = +new Date();\n var ms = curr - (prevTime || curr);\n self.diff = ms;\n self.prev = prevTime;\n self.curr = curr;\n prevTime = curr;\n\n // turn the `arguments` into a proper Array\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n\n args[0] = exports.coerce(args[0]);\n\n if ('string' !== typeof args[0]) {\n // anything else let's inspect with %O\n args.unshift('%O');\n }\n\n // apply any `formatters` transformations\n var index = 0;\n args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {\n // if we encounter an escaped % then don't increase the array index\n if (match === '%%') return match;\n index++;\n var formatter = exports.formatters[format];\n if ('function' === typeof formatter) {\n var val = args[index];\n match = formatter.call(self, val);\n\n // now we need to remove `args[index]` since it's inlined in the `format`\n args.splice(index, 1);\n index--;\n }\n return match;\n });\n\n // apply env-specific formatting (colors, etc.)\n exports.formatArgs.call(self, args);\n\n var logFn = debug.log || exports.log || console.log.bind(console);\n logFn.apply(self, args);\n }\n\n debug.namespace = namespace;\n debug.enabled = exports.enabled(namespace);\n debug.useColors = exports.useColors();\n debug.color = selectColor(namespace);\n\n // env-specific initialization logic for debug instances\n if ('function' === typeof exports.init) {\n exports.init(debug);\n }\n\n return debug;\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n exports.save(namespaces);\n\n exports.names = [];\n exports.skips = [];\n\n var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n var len = split.length;\n\n for (var i = 0; i < len; i++) {\n if (!split[i]) continue; // ignore empty strings\n namespaces = split[i].replace(/\\*/g, '.*?');\n if (namespaces[0] === '-') {\n exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n } else {\n exports.names.push(new RegExp('^' + namespaces + '$'));\n }\n }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n var i, len;\n for (i = 0, len = exports.skips.length; i < len; i++) {\n if (exports.skips[i].test(name)) {\n return false;\n }\n }\n for (i = 0, len = exports.names.length; i < len; i++) {\n if (exports.names[i].test(name)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n if (val instanceof Error) return val.stack || val.message;\n return val;\n}\n", "/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = require('./debug');\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = 'undefined' != typeof chrome\n && 'undefined' != typeof chrome.storage\n ? chrome.storage.local\n : localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n 'lightseagreen',\n 'forestgreen',\n 'goldenrod',\n 'dodgerblue',\n 'darkorchid',\n 'crimson'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n // NB: In an Electron preload script, document will be defined but not fully\n // initialized. Since we know we're in Chrome, we'll just detect this case\n // explicitly\n if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {\n return true;\n }\n\n // is webkit? http://stackoverflow.com/a/16459606/376773\n // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n // is firebug? http://stackoverflow.com/a/398120/376773\n (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n // is firefox >= v31?\n // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n // double check webkit in userAgent just in case we are in a worker\n (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function(v) {\n try {\n return JSON.stringify(v);\n } catch (err) {\n return '[UnexpectedJSONParseError]: ' + err.message;\n }\n};\n\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n var useColors = this.useColors;\n\n args[0] = (useColors ? '%c' : '')\n + this.namespace\n + (useColors ? ' %c' : ' ')\n + args[0]\n + (useColors ? '%c ' : ' ')\n + '+' + exports.humanize(this.diff);\n\n if (!useColors) return;\n\n var c = 'color: ' + this.color;\n args.splice(1, 0, c, 'color: inherit')\n\n // the final \"%c\" is somewhat tricky, because there could be other\n // arguments passed either before or after the %c, so we need to\n // figure out the correct index to insert the CSS into\n var index = 0;\n var lastC = 0;\n args[0].replace(/%[a-zA-Z%]/g, function(match) {\n if ('%%' === match) return;\n index++;\n if ('%c' === match) {\n // we only are interested in the *last* %c\n // (the user may have provided their own)\n lastC = index;\n }\n });\n\n args.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n // this hackery is required for IE8/9, where\n // the `console.log` function doesn't have 'apply'\n return 'object' === typeof console\n && console.log\n && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n try {\n if (null == namespaces) {\n exports.storage.removeItem('debug');\n } else {\n exports.storage.debug = namespaces;\n }\n } catch(e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n var r;\n try {\n r = exports.storage.debug;\n } catch(e) {}\n\n // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n if (!r && typeof process !== 'undefined' && 'env' in process) {\n r = process.env.DEBUG;\n }\n\n return r;\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n try {\n return window.localStorage;\n } catch (e) {}\n}\n", "/**\n * Module dependencies.\n */\n\nvar tty = require('tty');\nvar util = require('util');\n\n/**\n * This is the Node.js implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = require('./debug');\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\n\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(function (key) {\n return /^debug_/i.test(key);\n}).reduce(function (obj, key) {\n // camel-case\n var prop = key\n .substring(6)\n .toLowerCase()\n .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() });\n\n // coerce string value into JS value\n var val = process.env[key];\n if (/^(yes|on|true|enabled)$/i.test(val)) val = true;\n else if (/^(no|off|false|disabled)$/i.test(val)) val = false;\n else if (val === 'null') val = null;\n else val = Number(val);\n\n obj[prop] = val;\n return obj;\n}, {});\n\n/**\n * The file descriptor to write the `debug()` calls to.\n * Set the `DEBUG_FD` env variable to override with another value. i.e.:\n *\n * $ DEBUG_FD=3 node script.js 3>debug.log\n */\n\nvar fd = parseInt(process.env.DEBUG_FD, 10) || 2;\n\nif (1 !== fd && 2 !== fd) {\n util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')()\n}\n\nvar stream = 1 === fd ? process.stdout :\n 2 === fd ? process.stderr :\n createWritableStdioStream(fd);\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n return 'colors' in exports.inspectOpts\n ? Boolean(exports.inspectOpts.colors)\n : tty.isatty(fd);\n}\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nexports.formatters.o = function(v) {\n this.inspectOpts.colors = this.useColors;\n return util.inspect(v, this.inspectOpts)\n .split('\\n').map(function(str) {\n return str.trim()\n }).join(' ');\n};\n\n/**\n * Map %o to `util.inspect()`, allowing multiple lines if needed.\n */\n\nexports.formatters.O = function(v) {\n this.inspectOpts.colors = this.useColors;\n return util.inspect(v, this.inspectOpts);\n};\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n var name = this.namespace;\n var useColors = this.useColors;\n\n if (useColors) {\n var c = this.color;\n var prefix = ' \\u001b[3' + c + ';1m' + name + ' ' + '\\u001b[0m';\n\n args[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n args.push('\\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\\u001b[0m');\n } else {\n args[0] = new Date().toUTCString()\n + ' ' + name + ' ' + args[0];\n }\n}\n\n/**\n * Invokes `util.format()` with the specified arguments and writes to `stream`.\n */\n\nfunction log() {\n return stream.write(util.format.apply(util, arguments) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n if (null == namespaces) {\n // If you set a process.env field to null or undefined, it gets cast to the\n // string 'null' or 'undefined'. Just delete instead.\n delete process.env.DEBUG;\n } else {\n process.env.DEBUG = namespaces;\n }\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n return process.env.DEBUG;\n}\n\n/**\n * Copied from `node/src/node.js`.\n *\n * XXX: It's lame that node doesn't expose this API out-of-the-box. It also\n * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.\n */\n\nfunction createWritableStdioStream (fd) {\n var stream;\n var tty_wrap = process.binding('tty_wrap');\n\n // Note stream._type is used for test-module-load-list.js\n\n switch (tty_wrap.guessHandleType(fd)) {\n case 'TTY':\n stream = new tty.WriteStream(fd);\n stream._type = 'tty';\n\n // Hack to have stream not keep the event loop alive.\n // See https://github.com/joyent/node/issues/1726\n if (stream._handle && stream._handle.unref) {\n stream._handle.unref();\n }\n break;\n\n case 'FILE':\n var fs = require('fs');\n stream = new fs.SyncWriteStream(fd, { autoClose: false });\n stream._type = 'fs';\n break;\n\n case 'PIPE':\n case 'TCP':\n var net = require('net');\n stream = new net.Socket({\n fd: fd,\n readable: false,\n writable: true\n });\n\n // FIXME Should probably have an option in net.Socket to create a\n // stream from an existing fd which is writable only. But for now\n // we'll just add this hack and set the `readable` member to false.\n // Test: ./node test/fixtures/echo.js < /etc/passwd\n stream.readable = false;\n stream.read = null;\n stream._type = 'pipe';\n\n // FIXME Hack to have stream not keep the event loop alive.\n // See https://github.com/joyent/node/issues/1726\n if (stream._handle && stream._handle.unref) {\n stream._handle.unref();\n }\n break;\n\n default:\n // Probably an error on in uv_guess_handle()\n throw new Error('Implement me. Unknown stream file type!');\n }\n\n // For supporting legacy API we put the FD here.\n stream.fd = fd;\n\n stream._isStdio = true;\n\n return stream;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init (debug) {\n debug.inspectOpts = {};\n\n var keys = Object.keys(exports.inspectOpts);\n for (var i = 0; i < keys.length; i++) {\n debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n }\n}\n\n/**\n * Enable namespaces listed in `process.env.DEBUG` initially.\n */\n\nexports.enable(load());\n", "/**\n * Detect Electron renderer process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process !== 'undefined' && process.type === 'renderer') {\n module.exports = require('./browser.js');\n} else {\n module.exports = require('./node.js');\n}\n", "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\n/**\n * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n */\nexports.encode = function (number) {\n if (0 <= number && number < intToCharMap.length) {\n return intToCharMap[number];\n }\n throw new TypeError(\"Must be between 0 and 63: \" + number);\n};\n\n/**\n * Decode a single base 64 character code digit to an integer. Returns -1 on\n * failure.\n */\nexports.decode = function (charCode) {\n var bigA = 65; // 'A'\n var bigZ = 90; // 'Z'\n\n var littleA = 97; // 'a'\n var littleZ = 122; // 'z'\n\n var zero = 48; // '0'\n var nine = 57; // '9'\n\n var plus = 43; // '+'\n var slash = 47; // '/'\n\n var littleOffset = 26;\n var numberOffset = 52;\n\n // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n if (bigA <= charCode && charCode <= bigZ) {\n return (charCode - bigA);\n }\n\n // 26 - 51: abcdefghijklmnopqrstuvwxyz\n if (littleA <= charCode && charCode <= littleZ) {\n return (charCode - littleA + littleOffset);\n }\n\n // 52 - 61: 0123456789\n if (zero <= charCode && charCode <= nine) {\n return (charCode - zero + numberOffset);\n }\n\n // 62: +\n if (charCode == plus) {\n return 62;\n }\n\n // 63: /\n if (charCode == slash) {\n return 63;\n }\n\n // Invalid base64 digit.\n return -1;\n};\n", "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * Based on the Base 64 VLQ implementation in Closure Compiler:\n * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n *\n * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n * * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived\n * from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nvar base64 = require('./base64');\n\n// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n// length quantities we use in the source map spec, the first bit is the sign,\n// the next four bits are the actual value, and the 6th bit is the\n// continuation bit. The continuation bit tells us whether there are more\n// digits in this value following this digit.\n//\n// Continuation\n// | Sign\n// | |\n// V V\n// 101011\n\nvar VLQ_BASE_SHIFT = 5;\n\n// binary: 100000\nvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\n// binary: 011111\nvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\n// binary: 100000\nvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\n/**\n * Converts from a two-complement value to a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n */\nfunction toVLQSigned(aValue) {\n return aValue < 0\n ? ((-aValue) << 1) + 1\n : (aValue << 1) + 0;\n}\n\n/**\n * Converts to a two-complement value from a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n */\nfunction fromVLQSigned(aValue) {\n var isNegative = (aValue & 1) === 1;\n var shifted = aValue >> 1;\n return isNegative\n ? -shifted\n : shifted;\n}\n\n/**\n * Returns the base 64 VLQ encoded value.\n */\nexports.encode = function base64VLQ_encode(aValue) {\n var encoded = \"\";\n var digit;\n\n var vlq = toVLQSigned(aValue);\n\n do {\n digit = vlq & VLQ_BASE_MASK;\n vlq >>>= VLQ_BASE_SHIFT;\n if (vlq > 0) {\n // There are still more digits in this value, so we must make sure the\n // continuation bit is marked.\n digit |= VLQ_CONTINUATION_BIT;\n }\n encoded += base64.encode(digit);\n } while (vlq > 0);\n\n return encoded;\n};\n\n/**\n * Decodes the next base 64 VLQ value from the given string and returns the\n * value and the rest of the string via the out parameter.\n */\nexports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n var strLen = aStr.length;\n var result = 0;\n var shift = 0;\n var continuation, digit;\n\n do {\n if (aIndex >= strLen) {\n throw new Error(\"Expected more digits in base 64 VLQ value.\");\n }\n\n digit = base64.decode(aStr.charCodeAt(aIndex++));\n if (digit === -1) {\n throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n }\n\n continuation = !!(digit & VLQ_CONTINUATION_BIT);\n digit &= VLQ_BASE_MASK;\n result = result + (digit << shift);\n shift += VLQ_BASE_SHIFT;\n } while (continuation);\n\n aOutParam.value = fromVLQSigned(result);\n aOutParam.rest = aIndex;\n};\n", "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n/**\n * This is a helper function for getting values from parameter/options\n * objects.\n *\n * @param args The object we are extracting values from\n * @param name The name of the property we are getting.\n * @param defaultValue An optional value to return if the property is missing\n * from the object. If this is not specified and the property is missing, an\n * error will be thrown.\n */\nfunction getArg(aArgs, aName, aDefaultValue) {\n if (aName in aArgs) {\n return aArgs[aName];\n } else if (arguments.length === 3) {\n return aDefaultValue;\n } else {\n throw new Error('\"' + aName + '\" is a required argument.');\n }\n}\nexports.getArg = getArg;\n\nvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.]*)(?::(\\d+))?(\\S*)$/;\nvar dataUrlRegexp = /^data:.+\\,.+$/;\n\nfunction urlParse(aUrl) {\n var match = aUrl.match(urlRegexp);\n if (!match) {\n return null;\n }\n return {\n scheme: match[1],\n auth: match[2],\n host: match[3],\n port: match[4],\n path: match[5]\n };\n}\nexports.urlParse = urlParse;\n\nfunction urlGenerate(aParsedUrl) {\n var url = '';\n if (aParsedUrl.scheme) {\n url += aParsedUrl.scheme + ':';\n }\n url += '//';\n if (aParsedUrl.auth) {\n url += aParsedUrl.auth + '@';\n }\n if (aParsedUrl.host) {\n url += aParsedUrl.host;\n }\n if (aParsedUrl.port) {\n url += \":\" + aParsedUrl.port\n }\n if (aParsedUrl.path) {\n url += aParsedUrl.path;\n }\n return url;\n}\nexports.urlGenerate = urlGenerate;\n\n/**\n * Normalizes a path, or the path portion of a URL:\n *\n * - Replaces consecutive slashes with one slash.\n * - Removes unnecessary '.' parts.\n * - Removes unnecessary '<dir>/..' parts.\n *\n * Based on code in the Node.js 'path' core module.\n *\n * @param aPath The path or url to normalize.\n */\nfunction normalize(aPath) {\n var path = aPath;\n var url = urlParse(aPath);\n if (url) {\n if (!url.path) {\n return aPath;\n }\n path = url.path;\n }\n var isAbsolute = exports.isAbsolute(path);\n\n var parts = path.split(/\\/+/);\n for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n part = parts[i];\n if (part === '.') {\n parts.splice(i, 1);\n } else if (part === '..') {\n up++;\n } else if (up > 0) {\n if (part === '') {\n // The first part is blank if the path is absolute. Trying to go\n // above the root is a no-op. Therefore we can remove all '..' parts\n // directly after the root.\n parts.splice(i + 1, up);\n up = 0;\n } else {\n parts.splice(i, 2);\n up--;\n }\n }\n }\n path = parts.join('/');\n\n if (path === '') {\n path = isAbsolute ? '/' : '.';\n }\n\n if (url) {\n url.path = path;\n return urlGenerate(url);\n }\n return path;\n}\nexports.normalize = normalize;\n\n/**\n * Joins two paths/URLs.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be joined with the root.\n *\n * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n * scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n * first.\n * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n * is updated with the result and aRoot is returned. Otherwise the result\n * is returned.\n * - If aPath is absolute, the result is aPath.\n * - Otherwise the two paths are joined with a slash.\n * - Joining for example 'http://' and 'www.example.com' is also supported.\n */\nfunction join(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n if (aPath === \"\") {\n aPath = \".\";\n }\n var aPathUrl = urlParse(aPath);\n var aRootUrl = urlParse(aRoot);\n if (aRootUrl) {\n aRoot = aRootUrl.path || '/';\n }\n\n // `join(foo, '//www.example.org')`\n if (aPathUrl && !aPathUrl.scheme) {\n if (aRootUrl) {\n aPathUrl.scheme = aRootUrl.scheme;\n }\n return urlGenerate(aPathUrl);\n }\n\n if (aPathUrl || aPath.match(dataUrlRegexp)) {\n return aPath;\n }\n\n // `join('http://', 'www.example.com')`\n if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n aRootUrl.host = aPath;\n return urlGenerate(aRootUrl);\n }\n\n var joined = aPath.charAt(0) === '/'\n ? aPath\n : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\n if (aRootUrl) {\n aRootUrl.path = joined;\n return urlGenerate(aRootUrl);\n }\n return joined;\n}\nexports.join = join;\n\nexports.isAbsolute = function (aPath) {\n return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp);\n};\n\n/**\n * Make a path relative to a URL or another path.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be made relative to aRoot.\n */\nfunction relative(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n\n aRoot = aRoot.replace(/\\/$/, '');\n\n // It is possible for the path to be above the root. In this case, simply\n // checking whether the root is a prefix of the path won't work. Instead, we\n // need to remove components from the root one by one, until either we find\n // a prefix that fits, or we run out of components to remove.\n var level = 0;\n while (aPath.indexOf(aRoot + '/') !== 0) {\n var index = aRoot.lastIndexOf(\"/\");\n if (index < 0) {\n return aPath;\n }\n\n // If the only part of the root that is left is the scheme (i.e. http://,\n // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n // have exhausted all components, so the path is not relative to the root.\n aRoot = aRoot.slice(0, index);\n if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n return aPath;\n }\n\n ++level;\n }\n\n // Make sure we add a \"../\" for each component we removed from the root.\n return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n}\nexports.relative = relative;\n\nvar supportsNullProto = (function () {\n var obj = Object.create(null);\n return !('__proto__' in obj);\n}());\n\nfunction identity (s) {\n return s;\n}\n\n/**\n * Because behavior goes wacky when you set `__proto__` on objects, we\n * have to prefix all the strings in our set with an arbitrary character.\n *\n * See https://github.com/mozilla/source-map/pull/31 and\n * https://github.com/mozilla/source-map/issues/30\n *\n * @param String aStr\n */\nfunction toSetString(aStr) {\n if (isProtoString(aStr)) {\n return '$' + aStr;\n }\n\n return aStr;\n}\nexports.toSetString = supportsNullProto ? identity : toSetString;\n\nfunction fromSetString(aStr) {\n if (isProtoString(aStr)) {\n return aStr.slice(1);\n }\n\n return aStr;\n}\nexports.fromSetString = supportsNullProto ? identity : fromSetString;\n\nfunction isProtoString(s) {\n if (!s) {\n return false;\n }\n\n var length = s.length;\n\n if (length < 9 /* \"__proto__\".length */) {\n return false;\n }\n\n if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||\n s.charCodeAt(length - 2) !== 95 /* '_' */ ||\n s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n s.charCodeAt(length - 8) !== 95 /* '_' */ ||\n s.charCodeAt(length - 9) !== 95 /* '_' */) {\n return false;\n }\n\n for (var i = length - 10; i >= 0; i--) {\n if (s.charCodeAt(i) !== 36 /* '$' */) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Comparator between two mappings where the original positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same original source/line/column, but different generated\n * line and column the same. Useful when searching for a mapping with a\n * stubbed out mapping.\n */\nfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n var cmp = mappingA.source - mappingB.source;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0 || onlyCompareOriginal) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n return mappingA.name - mappingB.name;\n}\nexports.compareByOriginalPositions = compareByOriginalPositions;\n\n/**\n * Comparator between two mappings with deflated source and name indices where\n * the generated positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same generated line and column, but different\n * source/name/original line and column the same. Useful when searching for a\n * mapping with a stubbed out mapping.\n */\nfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n var cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0 || onlyCompareGenerated) {\n return cmp;\n }\n\n cmp = mappingA.source - mappingB.source;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return mappingA.name - mappingB.name;\n}\nexports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\nfunction strcmp(aStr1, aStr2) {\n if (aStr1 === aStr2) {\n return 0;\n }\n\n if (aStr1 > aStr2) {\n return 1;\n }\n\n return -1;\n}\n\n/**\n * Comparator between two mappings with inflated source and name strings where\n * the generated positions are compared.\n */\nfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n var cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n", "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar has = Object.prototype.hasOwnProperty;\nvar hasNativeMap = typeof Map !== \"undefined\";\n\n/**\n * A data structure which is a combination of an array and a set. Adding a new\n * member is O(1), testing for membership is O(1), and finding the index of an\n * element is O(1). Removing elements from the set is not supported. Only\n * strings are supported for membership.\n */\nfunction ArraySet() {\n this._array = [];\n this._set = hasNativeMap ? new Map() : Object.create(null);\n}\n\n/**\n * Static method for creating ArraySet instances from an existing array.\n */\nArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n var set = new ArraySet();\n for (var i = 0, len = aArray.length; i < len; i++) {\n set.add(aArray[i], aAllowDuplicates);\n }\n return set;\n};\n\n/**\n * Return how many unique items are in this ArraySet. If duplicates have been\n * added, than those do not count towards the size.\n *\n * @returns Number\n */\nArraySet.prototype.size = function ArraySet_size() {\n return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length;\n};\n\n/**\n * Add the given string to this set.\n *\n * @param String aStr\n */\nArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n var sStr = hasNativeMap ? aStr : util.toSetString(aStr);\n var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr);\n var idx = this._array.length;\n if (!isDuplicate || aAllowDuplicates) {\n this._array.push(aStr);\n }\n if (!isDuplicate) {\n if (hasNativeMap) {\n this._set.set(aStr, idx);\n } else {\n this._set[sStr] = idx;\n }\n }\n};\n\n/**\n * Is the given string a member of this set?\n *\n * @param String aStr\n */\nArraySet.prototype.has = function ArraySet_has(aStr) {\n if (hasNativeMap) {\n return this._set.has(aStr);\n } else {\n var sStr = util.toSetString(aStr);\n return has.call(this._set, sStr);\n }\n};\n\n/**\n * What is the index of the given string in the array?\n *\n * @param String aStr\n */\nArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n if (hasNativeMap) {\n var idx = this._set.get(aStr);\n if (idx >= 0) {\n return idx;\n }\n } else {\n var sStr = util.toSetString(aStr);\n if (has.call(this._set, sStr)) {\n return this._set[sStr];\n }\n }\n\n throw new Error('\"' + aStr + '\" is not in the set.');\n};\n\n/**\n * What is the element at the given index?\n *\n * @param Number aIdx\n */\nArraySet.prototype.at = function ArraySet_at(aIdx) {\n if (aIdx >= 0 && aIdx < this._array.length) {\n return this._array[aIdx];\n }\n throw new Error('No element indexed by ' + aIdx);\n};\n\n/**\n * Returns the array representation of this set (which has the proper indices\n * indicated by indexOf). Note that this is a copy of the internal array used\n * for storing the members so that no one can mess with internal state.\n */\nArraySet.prototype.toArray = function ArraySet_toArray() {\n return this._array.slice();\n};\n\nexports.ArraySet = ArraySet;\n", "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2014 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\n\n/**\n * Determine whether mappingB is after mappingA with respect to generated\n * position.\n */\nfunction generatedPositionAfter(mappingA, mappingB) {\n // Optimized for most common case\n var lineA = mappingA.generatedLine;\n var lineB = mappingB.generatedLine;\n var columnA = mappingA.generatedColumn;\n var columnB = mappingB.generatedColumn;\n return lineB > lineA || lineB == lineA && columnB >= columnA ||\n util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n}\n\n/**\n * A data structure to provide a sorted view of accumulated mappings in a\n * performance conscious manner. It trades a neglibable overhead in general\n * case for a large speedup in case of mappings being added in order.\n */\nfunction MappingList() {\n this._array = [];\n this._sorted = true;\n // Serves as infimum\n this._last = {generatedLine: -1, generatedColumn: 0};\n}\n\n/**\n * Iterate through internal items. This method takes the same arguments that\n * `Array.prototype.forEach` takes.\n *\n * NOTE: The order of the mappings is NOT guaranteed.\n */\nMappingList.prototype.unsortedForEach =\n function MappingList_forEach(aCallback, aThisArg) {\n this._array.forEach(aCallback, aThisArg);\n };\n\n/**\n * Add the given source mapping.\n *\n * @param Object aMapping\n */\nMappingList.prototype.add = function MappingList_add(aMapping) {\n if (generatedPositionAfter(this._last, aMapping)) {\n this._last = aMapping;\n this._array.push(aMapping);\n } else {\n this._sorted = false;\n this._array.push(aMapping);\n }\n};\n\n/**\n * Returns the flat, sorted array of mappings. The mappings are sorted by\n * generated position.\n *\n * WARNING: This method returns internal data without copying, for\n * performance. The return value must NOT be mutated, and should be treated as\n * an immutable borrow. If you want to take ownership, you must make your own\n * copy.\n */\nMappingList.prototype.toArray = function MappingList_toArray() {\n if (!this._sorted) {\n this._array.sort(util.compareByGeneratedPositionsInflated);\n this._sorted = true;\n }\n return this._array;\n};\n\nexports.MappingList = MappingList;\n", "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar base64VLQ = require('./base64-vlq');\nvar util = require('./util');\nvar ArraySet = require('./array-set').ArraySet;\nvar MappingList = require('./mapping-list').MappingList;\n\n/**\n * An instance of the SourceMapGenerator represents a source map which is\n * being built incrementally. You may pass an object with the following\n * properties:\n *\n * - file: The filename of the generated source.\n * - sourceRoot: A root for all relative URLs in this source map.\n */\nfunction SourceMapGenerator(aArgs) {\n if (!aArgs) {\n aArgs = {};\n }\n this._file = util.getArg(aArgs, 'file', null);\n this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n this._sources = new ArraySet();\n this._names = new ArraySet();\n this._mappings = new MappingList();\n this._sourcesContents = null;\n}\n\nSourceMapGenerator.prototype._version = 3;\n\n/**\n * Creates a new SourceMapGenerator based on a SourceMapConsumer\n *\n * @param aSourceMapConsumer The SourceMap.\n */\nSourceMapGenerator.fromSourceMap =\n function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\n var sourceRoot = aSourceMapConsumer.sourceRoot;\n var generator = new SourceMapGenerator({\n file: aSourceMapConsumer.file,\n sourceRoot: sourceRoot\n });\n aSourceMapConsumer.eachMapping(function (mapping) {\n var newMapping = {\n generated: {\n line: mapping.generatedLine,\n column: mapping.generatedColumn\n }\n };\n\n if (mapping.source != null) {\n newMapping.source = mapping.source;\n if (sourceRoot != null) {\n newMapping.source = util.relative(sourceRoot, newMapping.source);\n }\n\n newMapping.original = {\n line: mapping.originalLine,\n column: mapping.originalColumn\n };\n\n if (mapping.name != null) {\n newMapping.name = mapping.name;\n }\n }\n\n generator.addMapping(newMapping);\n });\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n generator.setSourceContent(sourceFile, content);\n }\n });\n return generator;\n };\n\n/**\n * Add a single mapping from original source line and column to the generated\n * source's line and column for this source map being created. The mapping\n * object should have the following properties:\n *\n * - generated: An object with the generated line and column positions.\n * - original: An object with the original line and column positions.\n * - source: The original source file (relative to the sourceRoot).\n * - name: An optional original token name for this mapping.\n */\nSourceMapGenerator.prototype.addMapping =\n function SourceMapGenerator_addMapping(aArgs) {\n var generated = util.getArg(aArgs, 'generated');\n var original = util.getArg(aArgs, 'original', null);\n var source = util.getArg(aArgs, 'source', null);\n var name = util.getArg(aArgs, 'name', null);\n\n if (!this._skipValidation) {\n this._validateMapping(generated, original, source, name);\n }\n\n if (source != null) {\n source = String(source);\n if (!this._sources.has(source)) {\n this._sources.add(source);\n }\n }\n\n if (name != null) {\n name = String(name);\n if (!this._names.has(name)) {\n this._names.add(name);\n }\n }\n\n this._mappings.add({\n generatedLine: generated.line,\n generatedColumn: generated.column,\n originalLine: original != null && original.line,\n originalColumn: original != null && original.column,\n source: source,\n name: name\n });\n };\n\n/**\n * Set the source content for a source file.\n */\nSourceMapGenerator.prototype.setSourceContent =\n function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n var source = aSourceFile;\n if (this._sourceRoot != null) {\n source = util.relative(this._sourceRoot, source);\n }\n\n if (aSourceContent != null) {\n // Add the source content to the _sourcesContents map.\n // Create a new _sourcesContents map if the property is null.\n if (!this._sourcesContents) {\n this._sourcesContents = Object.create(null);\n }\n this._sourcesContents[util.toSetString(source)] = aSourceContent;\n } else if (this._sourcesContents) {\n // Remove the source file from the _sourcesContents map.\n // If the _sourcesContents map is empty, set the property to null.\n delete this._sourcesContents[util.toSetString(source)];\n if (Object.keys(this._sourcesContents).length === 0) {\n this._sourcesContents = null;\n }\n }\n };\n\n/**\n * Applies the mappings of a sub-source-map for a specific source file to the\n * source map being generated. Each mapping to the supplied source file is\n * rewritten using the supplied source map. Note: The resolution for the\n * resulting mappings is the minimium of this map and the supplied map.\n *\n * @param aSourceMapConsumer The source map to be applied.\n * @param aSourceFile Optional. The filename of the source file.\n * If omitted, SourceMapConsumer's file property will be used.\n * @param aSourceMapPath Optional. The dirname of the path to the source map\n * to be applied. If relative, it is relative to the SourceMapConsumer.\n * This parameter is needed when the two source maps aren't in the same\n * directory, and the source map to be applied contains relative source\n * paths. If so, those relative source paths need to be rewritten\n * relative to the SourceMapGenerator.\n */\nSourceMapGenerator.prototype.applySourceMap =\n function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n var sourceFile = aSourceFile;\n // If aSourceFile is omitted, we will use the file property of the SourceMap\n if (aSourceFile == null) {\n if (aSourceMapConsumer.file == null) {\n throw new Error(\n 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n 'or the source map\\'s \"file\" property. Both were omitted.'\n );\n }\n sourceFile = aSourceMapConsumer.file;\n }\n var sourceRoot = this._sourceRoot;\n // Make \"sourceFile\" relative if an absolute Url is passed.\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n // Applying the SourceMap can add and remove items from the sources and\n // the names array.\n var newSources = new ArraySet();\n var newNames = new ArraySet();\n\n // Find mappings for the \"sourceFile\"\n this._mappings.unsortedForEach(function (mapping) {\n if (mapping.source === sourceFile && mapping.originalLine != null) {\n // Check if it can be mapped by the source map, then update the mapping.\n var original = aSourceMapConsumer.originalPositionFor({\n line: mapping.originalLine,\n column: mapping.originalColumn\n });\n if (original.source != null) {\n // Copy mapping\n mapping.source = original.source;\n if (aSourceMapPath != null) {\n mapping.source = util.join(aSourceMapPath, mapping.source)\n }\n if (sourceRoot != null) {\n mapping.source = util.relative(sourceRoot, mapping.source);\n }\n mapping.originalLine = original.line;\n mapping.originalColumn = original.column;\n if (original.name != null) {\n mapping.name = original.name;\n }\n }\n }\n\n var source = mapping.source;\n if (source != null && !newSources.has(source)) {\n newSources.add(source);\n }\n\n var name = mapping.name;\n if (name != null && !newNames.has(name)) {\n newNames.add(name);\n }\n\n }, this);\n this._sources = newSources;\n this._names = newNames;\n\n // Copy sourcesContents of applied map.\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aSourceMapPath != null) {\n sourceFile = util.join(aSourceMapPath, sourceFile);\n }\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n this.setSourceContent(sourceFile, content);\n }\n }, this);\n };\n\n/**\n * A mapping can have one of the three levels of data:\n *\n * 1. Just the generated position.\n * 2. The Generated position, original position, and original source.\n * 3. Generated and original position, original source, as well as a name\n * token.\n *\n * To maintain consistency, we validate that any new mapping being added falls\n * in to one of these categories.\n */\nSourceMapGenerator.prototype._validateMapping =\n function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n aName) {\n // When aOriginal is truthy but has empty values for .line and .column,\n // it is most likely a programmer error. In this case we throw a very\n // specific error message to try to guide them the right way.\n // For example: https://github.com/Polymer/polymer-bundler/pull/519\n if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') {\n throw new Error(\n 'original.line and original.column are not numbers -- you probably meant to omit ' +\n 'the original mapping entirely and only map the generated position. If so, pass ' +\n 'null for the original mapping instead of an object with empty or null values.'\n );\n }\n\n if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aGenerated.line > 0 && aGenerated.column >= 0\n && !aOriginal && !aSource && !aName) {\n // Case 1.\n return;\n }\n else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n && aGenerated.line > 0 && aGenerated.column >= 0\n && aOriginal.line > 0 && aOriginal.column >= 0\n && aSource) {\n // Cases 2 and 3.\n return;\n }\n else {\n throw new Error('Invalid mapping: ' + JSON.stringify({\n generated: aGenerated,\n source: aSource,\n original: aOriginal,\n name: aName\n }));\n }\n };\n\n/**\n * Serialize the accumulated mappings in to the stream of base 64 VLQs\n * specified by the source map format.\n */\nSourceMapGenerator.prototype._serializeMappings =\n function SourceMapGenerator_serializeMappings() {\n var previousGeneratedColumn = 0;\n var previousGeneratedLine = 1;\n var previousOriginalColumn = 0;\n var previousOriginalLine = 0;\n var previousName = 0;\n var previousSource = 0;\n var result = '';\n var next;\n var mapping;\n var nameIdx;\n var sourceIdx;\n\n var mappings = this._mappings.toArray();\n for (var i = 0, len = mappings.length; i < len; i++) {\n mapping = mappings[i];\n next = ''\n\n if (mapping.generatedLine !== previousGeneratedLine) {\n previousGeneratedColumn = 0;\n while (mapping.generatedLine !== previousGeneratedLine) {\n next += ';';\n previousGeneratedLine++;\n }\n }\n else {\n if (i > 0) {\n if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n continue;\n }\n next += ',';\n }\n }\n\n next += base64VLQ.encode(mapping.generatedColumn\n - previousGeneratedColumn);\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (mapping.source != null) {\n sourceIdx = this._sources.indexOf(mapping.source);\n next += base64VLQ.encode(sourceIdx - previousSource);\n previousSource = sourceIdx;\n\n // lines are stored 0-based in SourceMap spec version 3\n next += base64VLQ.encode(mapping.originalLine - 1\n - previousOriginalLine);\n previousOriginalLine = mapping.originalLine - 1;\n\n next += base64VLQ.encode(mapping.originalColumn\n - previousOriginalColumn);\n previousOriginalColumn = mapping.originalColumn;\n\n if (mapping.name != null) {\n nameIdx = this._names.indexOf(mapping.name);\n next += base64VLQ.encode(nameIdx - previousName);\n previousName = nameIdx;\n }\n }\n\n result += next;\n }\n\n return result;\n };\n\nSourceMapGenerator.prototype._generateSourcesContent =\n function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n return aSources.map(function (source) {\n if (!this._sourcesContents) {\n return null;\n }\n if (aSourceRoot != null) {\n source = util.relative(aSourceRoot, source);\n }\n var key = util.toSetString(source);\n return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n ? this._sourcesContents[key]\n : null;\n }, this);\n };\n\n/**\n * Externalize the source map.\n */\nSourceMapGenerator.prototype.toJSON =\n function SourceMapGenerator_toJSON() {\n var map = {\n version: this._version,\n sources: this._sources.toArray(),\n names: this._names.toArray(),\n mappings: this._serializeMappings()\n };\n if (this._file != null) {\n map.file = this._file;\n }\n if (this._sourceRoot != null) {\n map.sourceRoot = this._sourceRoot;\n }\n if (this._sourcesContents) {\n map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n }\n\n return map;\n };\n\n/**\n * Render the source map being generated to a string.\n */\nSourceMapGenerator.prototype.toString =\n function SourceMapGenerator_toString() {\n return JSON.stringify(this.toJSON());\n };\n\nexports.SourceMapGenerator = SourceMapGenerator;\n", "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nexports.GREATEST_LOWER_BOUND = 1;\nexports.LEAST_UPPER_BOUND = 2;\n\n/**\n * Recursive implementation of binary search.\n *\n * @param aLow Indices here and lower do not contain the needle.\n * @param aHigh Indices here and higher do not contain the needle.\n * @param aNeedle The element being searched for.\n * @param aHaystack The non-empty array being searched.\n * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n */\nfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n // This function terminates when one of the following is true:\n //\n // 1. We find the exact element we are looking for.\n //\n // 2. We did not find the exact element, but we can return the index of\n // the next-closest element.\n //\n // 3. We did not find the exact element, and there is no next-closest\n // element than the one we are searching for, so we return -1.\n var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n var cmp = aCompare(aNeedle, aHaystack[mid], true);\n if (cmp === 0) {\n // Found the element we are looking for.\n return mid;\n }\n else if (cmp > 0) {\n // Our needle is greater than aHaystack[mid].\n if (aHigh - mid > 1) {\n // The element is in the upper half.\n return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // The exact needle element was not found in this haystack. Determine if\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return aHigh < aHaystack.length ? aHigh : -1;\n } else {\n return mid;\n }\n }\n else {\n // Our needle is less than aHaystack[mid].\n if (mid - aLow > 1) {\n // The element is in the lower half.\n return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return mid;\n } else {\n return aLow < 0 ? -1 : aLow;\n }\n }\n}\n\n/**\n * This is an implementation of binary search which will always try and return\n * the index of the closest element if there is no exact hit. This is because\n * mappings between original and generated line/col pairs are single points,\n * and there is an implicit region between each of them, so a miss just means\n * that you aren't on the very start of a region.\n *\n * @param aNeedle The element you are looking for.\n * @param aHaystack The array that is being searched.\n * @param aCompare A function which takes the needle and an element in the\n * array and returns -1, 0, or 1 depending on whether the needle is less\n * than, equal to, or greater than the element, respectively.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n */\nexports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n if (aHaystack.length === 0) {\n return -1;\n }\n\n var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n if (index < 0) {\n return -1;\n }\n\n // We have found either the exact element, or the next-closest element than\n // the one we are searching for. However, there may be more than one such\n // element. Make sure we always return the smallest of these.\n while (index - 1 >= 0) {\n if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n break;\n }\n --index;\n }\n\n return index;\n};\n", "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n// It turns out that some (most?) JavaScript engines don't self-host\n// `Array.prototype.sort`. This makes sense because C++ will likely remain\n// faster than JS when doing raw CPU-intensive sorting. However, when using a\n// custom comparator function, calling back and forth between the VM's C++ and\n// JIT'd JS is rather slow *and* loses JIT type information, resulting in\n// worse generated code for the comparator function than would be optimal. In\n// fact, when sorting with a comparator, these costs outweigh the benefits of\n// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n// a ~3500ms mean speed-up in `bench/bench.html`.\n\n/**\n * Swap the elements indexed by `x` and `y` in the array `ary`.\n *\n * @param {Array} ary\n * The array.\n * @param {Number} x\n * The index of the first item.\n * @param {Number} y\n * The index of the second item.\n */\nfunction swap(ary, x, y) {\n var temp = ary[x];\n ary[x] = ary[y];\n ary[y] = temp;\n}\n\n/**\n * Returns a random integer within the range `low .. high` inclusive.\n *\n * @param {Number} low\n * The lower bound on the range.\n * @param {Number} high\n * The upper bound on the range.\n */\nfunction randomIntInRange(low, high) {\n return Math.round(low + (Math.random() * (high - low)));\n}\n\n/**\n * The Quick Sort algorithm.\n *\n * @param {Array} ary\n * An array to sort.\n * @param {function} comparator\n * Function to use to compare two items.\n * @param {Number} p\n * Start index of the array\n * @param {Number} r\n * End index of the array\n */\nfunction doQuickSort(ary, comparator, p, r) {\n // If our lower bound is less than our upper bound, we (1) partition the\n // array into two pieces and (2) recurse on each half. If it is not, this is\n // the empty array and our base case.\n\n if (p < r) {\n // (1) Partitioning.\n //\n // The partitioning chooses a pivot between `p` and `r` and moves all\n // elements that are less than or equal to the pivot to the before it, and\n // all the elements that are greater than it after it. The effect is that\n // once partition is done, the pivot is in the exact place it will be when\n // the array is put in sorted order, and it will not need to be moved\n // again. This runs in O(n) time.\n\n // Always choose a random pivot so that an input array which is reverse\n // sorted does not cause O(n^2) running time.\n var pivotIndex = randomIntInRange(p, r);\n var i = p - 1;\n\n swap(ary, pivotIndex, r);\n var pivot = ary[r];\n\n // Immediately after `j` is incremented in this loop, the following hold\n // true:\n //\n // * Every element in `ary[p .. i]` is less than or equal to the pivot.\n //\n // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n for (var j = p; j < r; j++) {\n if (comparator(ary[j], pivot) <= 0) {\n i += 1;\n swap(ary, i, j);\n }\n }\n\n swap(ary, i + 1, j);\n var q = i + 1;\n\n // (2) Recurse on each half.\n\n doQuickSort(ary, comparator, p, q - 1);\n doQuickSort(ary, comparator, q + 1, r);\n }\n}\n\n/**\n * Sort the given array in-place with the given comparator function.\n *\n * @param {Array} ary\n * An array to sort.\n * @param {function} comparator\n * Function to use to compare two items.\n */\nexports.quickSort = function (ary, comparator) {\n doQuickSort(ary, comparator, 0, ary.length - 1);\n};\n", "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = require('./util');\nvar binarySearch = require('./binary-search');\nvar ArraySet = require('./array-set').ArraySet;\nvar base64VLQ = require('./base64-vlq');\nvar quickSort = require('./quick-sort').quickSort;\n\nfunction SourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n return sourceMap.sections != null\n ? new IndexedSourceMapConsumer(sourceMap)\n : new BasicSourceMapConsumer(sourceMap);\n}\n\nSourceMapConsumer.fromSourceMap = function(aSourceMap) {\n return BasicSourceMapConsumer.fromSourceMap(aSourceMap);\n}\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nSourceMapConsumer.prototype._version = 3;\n\n// `__generatedMappings` and `__originalMappings` are arrays that hold the\n// parsed mapping coordinates from the source map's \"mappings\" attribute. They\n// are lazily instantiated, accessed via the `_generatedMappings` and\n// `_originalMappings` getters respectively, and we only parse the mappings\n// and create these arrays once queried for a source location. We jump through\n// these hoops because there can be many thousands of mappings, and parsing\n// them is expensive, so we only want to do it if we must.\n//\n// Each object in the arrays is of the form:\n//\n// {\n// generatedLine: The line number in the generated code,\n// generatedColumn: The column number in the generated code,\n// source: The path to the original source file that generated this\n// chunk of code,\n// originalLine: The line number in the original source that\n// corresponds to this chunk of generated code,\n// originalColumn: The column number in the original source that\n// corresponds to this chunk of generated code,\n// name: The name of the original symbol which generated this chunk of\n// code.\n// }\n//\n// All properties except for `generatedLine` and `generatedColumn` can be\n// `null`.\n//\n// `_generatedMappings` is ordered by the generated positions.\n//\n// `_originalMappings` is ordered by the original positions.\n\nSourceMapConsumer.prototype.__generatedMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n get: function () {\n if (!this.__generatedMappings) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__generatedMappings;\n }\n});\n\nSourceMapConsumer.prototype.__originalMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n get: function () {\n if (!this.__originalMappings) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__originalMappings;\n }\n});\n\nSourceMapConsumer.prototype._charIsMappingSeparator =\n function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n var c = aStr.charAt(index);\n return c === \";\" || c === \",\";\n };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nSourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n throw new Error(\"Subclasses must implement _parseMappings\");\n };\n\nSourceMapConsumer.GENERATED_ORDER = 1;\nSourceMapConsumer.ORIGINAL_ORDER = 2;\n\nSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\nSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\n/**\n * Iterate over each mapping between an original source/line/column and a\n * generated line/column in this source map.\n *\n * @param Function aCallback\n * The function that is called with each mapping.\n * @param Object aContext\n * Optional. If specified, this object will be the value of `this` every\n * time that `aCallback` is called.\n * @param aOrder\n * Either `SourceMapConsumer.GENERATED_ORDER` or\n * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n * iterate over the mappings sorted by the generated file's line/column\n * order or the original's source/line/column order, respectively. Defaults to\n * `SourceMapConsumer.GENERATED_ORDER`.\n */\nSourceMapConsumer.prototype.eachMapping =\n function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n var context = aContext || null;\n var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\n var mappings;\n switch (order) {\n case SourceMapConsumer.GENERATED_ORDER:\n mappings = this._generatedMappings;\n break;\n case SourceMapConsumer.ORIGINAL_ORDER:\n mappings = this._originalMappings;\n break;\n default:\n throw new Error(\"Unknown order of iteration.\");\n }\n\n var sourceRoot = this.sourceRoot;\n mappings.map(function (mapping) {\n var source = mapping.source === null ? null : this._sources.at(mapping.source);\n if (source != null && sourceRoot != null) {\n source = util.join(sourceRoot, source);\n }\n return {\n source: source,\n generatedLine: mapping.generatedLine,\n generatedColumn: mapping.generatedColumn,\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: mapping.name === null ? null : this._names.at(mapping.name)\n };\n }, this).forEach(aCallback, context);\n };\n\n/**\n * Returns all generated line and column information for the original source,\n * line, and column provided. If no column is provided, returns all mappings\n * corresponding to a either the line we are searching for or the next\n * closest line that has any mappings. Otherwise, returns all mappings\n * corresponding to the given line and either the column we are searching for\n * or the next closest column that has any offsets.\n *\n * The only argument is an object with the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: Optional. the column number in the original source.\n *\n * and an array of objects is returned, each with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\nSourceMapConsumer.prototype.allGeneratedPositionsFor =\n function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n var line = util.getArg(aArgs, 'line');\n\n // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n // returns the index of the closest mapping less than the needle. By\n // setting needle.originalColumn to 0, we thus find the last mapping for\n // the given line, provided such a mapping exists.\n var needle = {\n source: util.getArg(aArgs, 'source'),\n originalLine: line,\n originalColumn: util.getArg(aArgs, 'column', 0)\n };\n\n if (this.sourceRoot != null) {\n needle.source = util.relative(this.sourceRoot, needle.source);\n }\n if (!this._sources.has(needle.source)) {\n return [];\n }\n needle.source = this._sources.indexOf(needle.source);\n\n var mappings = [];\n\n var index = this._findMapping(needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions,\n binarySearch.LEAST_UPPER_BOUND);\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n if (aArgs.column === undefined) {\n var originalLine = mapping.originalLine;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we found. Since\n // mappings are sorted, this is guaranteed to find all mappings for\n // the line we found.\n while (mapping && mapping.originalLine === originalLine) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[++index];\n }\n } else {\n var originalColumn = mapping.originalColumn;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we were searching for.\n // Since mappings are sorted, this is guaranteed to find all mappings for\n // the line we are searching for.\n while (mapping &&\n mapping.originalLine === line &&\n mapping.originalColumn == originalColumn) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[++index];\n }\n }\n }\n\n return mappings;\n };\n\nexports.SourceMapConsumer = SourceMapConsumer;\n\n/**\n * A BasicSourceMapConsumer instance represents a parsed source map which we can\n * query for information about the original file positions by giving it a file\n * position in the generated source.\n *\n * The only parameter is the raw source map (either as a JSON string, or\n * already parsed to an object). According to the spec, source maps have the\n * following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - sources: An array of URLs to the original source files.\n * - names: An array of identifiers which can be referrenced by individual mappings.\n * - sourceRoot: Optional. The URL root from which all sources are relative.\n * - sourcesContent: Optional. An array of contents of the original source files.\n * - mappings: A string of base64 VLQs which contain the actual mappings.\n * - file: Optional. The generated file this source map is associated with.\n *\n * Here is an example source map, taken from the source map spec[0]:\n *\n * {\n * version : 3,\n * file: \"out.js\",\n * sourceRoot : \"\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AA,AB;;ABCDE;\"\n * }\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n */\nfunction BasicSourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sources = util.getArg(sourceMap, 'sources');\n // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n // requires the array) to play nice here.\n var names = util.getArg(sourceMap, 'names', []);\n var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n var mappings = util.getArg(sourceMap, 'mappings');\n var file = util.getArg(sourceMap, 'file', null);\n\n // Once again, Sass deviates from the spec and supplies the version as a\n // string rather than a number, so we use loose equality checking here.\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n sources = sources\n .map(String)\n // Some source maps produce relative source paths like \"./foo.js\" instead of\n // \"foo.js\". Normalize these first so that future comparisons will succeed.\n // See bugzil.la/1090768.\n .map(util.normalize)\n // Always ensure that absolute sources are internally stored relative to\n // the source root, if the source root is absolute. Not doing this would\n // be particularly problematic when the source root is a prefix of the\n // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n .map(function (source) {\n return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n ? util.relative(sourceRoot, source)\n : source;\n });\n\n // Pass `true` below to allow duplicate names and sources. While source maps\n // are intended to be compressed and deduplicated, the TypeScript compiler\n // sometimes generates source maps with duplicates in them. See Github issue\n // #72 and bugzil.la/889492.\n this._names = ArraySet.fromArray(names.map(String), true);\n this._sources = ArraySet.fromArray(sources, true);\n\n this.sourceRoot = sourceRoot;\n this.sourcesContent = sourcesContent;\n this._mappings = mappings;\n this.file = file;\n}\n\nBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\n/**\n * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n *\n * @param SourceMapGenerator aSourceMap\n * The source map that will be consumed.\n * @returns BasicSourceMapConsumer\n */\nBasicSourceMapConsumer.fromSourceMap =\n function SourceMapConsumer_fromSourceMap(aSourceMap) {\n var smc = Object.create(BasicSourceMapConsumer.prototype);\n\n var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n smc.sourceRoot = aSourceMap._sourceRoot;\n smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n smc.sourceRoot);\n smc.file = aSourceMap._file;\n\n // Because we are modifying the entries (by converting string sources and\n // names to indices into the sources and names ArraySets), we have to make\n // a copy of the entry or else bad things happen. Shared mutable state\n // strikes again! See github issue #191.\n\n var generatedMappings = aSourceMap._mappings.toArray().slice();\n var destGeneratedMappings = smc.__generatedMappings = [];\n var destOriginalMappings = smc.__originalMappings = [];\n\n for (var i = 0, length = generatedMappings.length; i < length; i++) {\n var srcMapping = generatedMappings[i];\n var destMapping = new Mapping;\n destMapping.generatedLine = srcMapping.generatedLine;\n destMapping.generatedColumn = srcMapping.generatedColumn;\n\n if (srcMapping.source) {\n destMapping.source = sources.indexOf(srcMapping.source);\n destMapping.originalLine = srcMapping.originalLine;\n destMapping.originalColumn = srcMapping.originalColumn;\n\n if (srcMapping.name) {\n destMapping.name = names.indexOf(srcMapping.name);\n }\n\n destOriginalMappings.push(destMapping);\n }\n\n destGeneratedMappings.push(destMapping);\n }\n\n quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\n return smc;\n };\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nBasicSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n get: function () {\n return this._sources.toArray().map(function (s) {\n return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s;\n }, this);\n }\n});\n\n/**\n * Provide the JIT with a nice shape / hidden class.\n */\nfunction Mapping() {\n this.generatedLine = 0;\n this.generatedColumn = 0;\n this.source = null;\n this.originalLine = null;\n this.originalColumn = null;\n this.name = null;\n}\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nBasicSourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n var generatedLine = 1;\n var previousGeneratedColumn = 0;\n var previousOriginalLine = 0;\n var previousOriginalColumn = 0;\n var previousSource = 0;\n var previousName = 0;\n var length = aStr.length;\n var index = 0;\n var cachedSegments = {};\n var temp = {};\n var originalMappings = [];\n var generatedMappings = [];\n var mapping, str, segment, end, value;\n\n while (index < length) {\n if (aStr.charAt(index) === ';') {\n generatedLine++;\n index++;\n previousGeneratedColumn = 0;\n }\n else if (aStr.charAt(index) === ',') {\n index++;\n }\n else {\n mapping = new Mapping();\n mapping.generatedLine = generatedLine;\n\n // Because each offset is encoded relative to the previous one,\n // many segments often have the same encoding. We can exploit this\n // fact by caching the parsed variable length fields of each segment,\n // allowing us to avoid a second parse if we encounter the same\n // segment again.\n for (end = index; end < length; end++) {\n if (this._charIsMappingSeparator(aStr, end)) {\n break;\n }\n }\n str = aStr.slice(index, end);\n\n segment = cachedSegments[str];\n if (segment) {\n index += str.length;\n } else {\n segment = [];\n while (index < end) {\n base64VLQ.decode(aStr, index, temp);\n value = temp.value;\n index = temp.rest;\n segment.push(value);\n }\n\n if (segment.length === 2) {\n throw new Error('Found a source, but no line and column');\n }\n\n if (segment.length === 3) {\n throw new Error('Found a source and line, but no column');\n }\n\n cachedSegments[str] = segment;\n }\n\n // Generated column.\n mapping.generatedColumn = previousGeneratedColumn + segment[0];\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (segment.length > 1) {\n // Original source.\n mapping.source = previousSource + segment[1];\n previousSource += segment[1];\n\n // Original line.\n mapping.originalLine = previousOriginalLine + segment[2];\n previousOriginalLine = mapping.originalLine;\n // Lines are stored 0-based\n mapping.originalLine += 1;\n\n // Original column.\n mapping.originalColumn = previousOriginalColumn + segment[3];\n previousOriginalColumn = mapping.originalColumn;\n\n if (segment.length > 4) {\n // Original name.\n mapping.name = previousName + segment[4];\n previousName += segment[4];\n }\n }\n\n generatedMappings.push(mapping);\n if (typeof mapping.originalLine === 'number') {\n originalMappings.push(mapping);\n }\n }\n }\n\n quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n this.__generatedMappings = generatedMappings;\n\n quickSort(originalMappings, util.compareByOriginalPositions);\n this.__originalMappings = originalMappings;\n };\n\n/**\n * Find the mapping that best matches the hypothetical \"needle\" mapping that\n * we are searching for in the given \"haystack\" of mappings.\n */\nBasicSourceMapConsumer.prototype._findMapping =\n function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n aColumnName, aComparator, aBias) {\n // To return the position we are searching for, we must first find the\n // mapping for the given position and then return the opposite position it\n // points to. Because the mappings are sorted, we can use binary search to\n // find the best mapping.\n\n if (aNeedle[aLineName] <= 0) {\n throw new TypeError('Line must be greater than or equal to 1, got '\n + aNeedle[aLineName]);\n }\n if (aNeedle[aColumnName] < 0) {\n throw new TypeError('Column must be greater than or equal to 0, got '\n + aNeedle[aColumnName]);\n }\n\n return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n };\n\n/**\n * Compute the last column for each generated mapping. The last column is\n * inclusive.\n */\nBasicSourceMapConsumer.prototype.computeColumnSpans =\n function SourceMapConsumer_computeColumnSpans() {\n for (var index = 0; index < this._generatedMappings.length; ++index) {\n var mapping = this._generatedMappings[index];\n\n // Mappings do not contain a field for the last generated columnt. We\n // can come up with an optimistic estimate, however, by assuming that\n // mappings are contiguous (i.e. given two consecutive mappings, the\n // first mapping ends where the second one starts).\n if (index + 1 < this._generatedMappings.length) {\n var nextMapping = this._generatedMappings[index + 1];\n\n if (mapping.generatedLine === nextMapping.generatedLine) {\n mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n continue;\n }\n }\n\n // The last mapping for each line spans the entire line.\n mapping.lastGeneratedColumn = Infinity;\n }\n };\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source.\n * - column: The column number in the generated source.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null.\n * - column: The column number in the original source, or null.\n * - name: The original identifier, or null.\n */\nBasicSourceMapConsumer.prototype.originalPositionFor =\n function SourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(\n needle,\n this._generatedMappings,\n \"generatedLine\",\n \"generatedColumn\",\n util.compareByGeneratedPositionsDeflated,\n util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n );\n\n if (index >= 0) {\n var mapping = this._generatedMappings[index];\n\n if (mapping.generatedLine === needle.generatedLine) {\n var source = util.getArg(mapping, 'source', null);\n if (source !== null) {\n source = this._sources.at(source);\n if (this.sourceRoot != null) {\n source = util.join(this.sourceRoot, source);\n }\n }\n var name = util.getArg(mapping, 'name', null);\n if (name !== null) {\n name = this._names.at(name);\n }\n return {\n source: source,\n line: util.getArg(mapping, 'originalLine', null),\n column: util.getArg(mapping, 'originalColumn', null),\n name: name\n };\n }\n }\n\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n function BasicSourceMapConsumer_hasContentsOfAllSources() {\n if (!this.sourcesContent) {\n return false;\n }\n return this.sourcesContent.length >= this._sources.size() &&\n !this.sourcesContent.some(function (sc) { return sc == null; });\n };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nBasicSourceMapConsumer.prototype.sourceContentFor =\n function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n if (!this.sourcesContent) {\n return null;\n }\n\n if (this.sourceRoot != null) {\n aSource = util.relative(this.sourceRoot, aSource);\n }\n\n if (this._sources.has(aSource)) {\n return this.sourcesContent[this._sources.indexOf(aSource)];\n }\n\n var url;\n if (this.sourceRoot != null\n && (url = util.urlParse(this.sourceRoot))) {\n // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n // many users. We can help them out when they expect file:// URIs to\n // behave like it would if they were running a local HTTP server. See\n // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n var fileUriAbsPath = aSource.replace(/^file:\\/\\//, \"\");\n if (url.scheme == \"file\"\n && this._sources.has(fileUriAbsPath)) {\n return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n }\n\n if ((!url.path || url.path == \"/\")\n && this._sources.has(\"/\" + aSource)) {\n return this.sourcesContent[this._sources.indexOf(\"/\" + aSource)];\n }\n }\n\n // This function is used recursively from\n // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n // don't want to throw if we can't find the source - we just want to\n // return null, so we provide a flag to exit gracefully.\n if (nullOnMissing) {\n return null;\n }\n else {\n throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n }\n };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: The column number in the original source.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\nBasicSourceMapConsumer.prototype.generatedPositionFor =\n function SourceMapConsumer_generatedPositionFor(aArgs) {\n var source = util.getArg(aArgs, 'source');\n if (this.sourceRoot != null) {\n source = util.relative(this.sourceRoot, source);\n }\n if (!this._sources.has(source)) {\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n }\n source = this._sources.indexOf(source);\n\n var needle = {\n source: source,\n originalLine: util.getArg(aArgs, 'line'),\n originalColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(\n needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions,\n util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n );\n\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n if (mapping.source === needle.source) {\n return {\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n };\n }\n }\n\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n };\n\nexports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\n/**\n * An IndexedSourceMapConsumer instance represents a parsed source map which\n * we can query for information. It differs from BasicSourceMapConsumer in\n * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n * input.\n *\n * The only parameter is a raw source map (either as a JSON string, or already\n * parsed to an object). According to the spec for indexed source maps, they\n * have the following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - file: Optional. The generated file this source map is associated with.\n * - sections: A list of section definitions.\n *\n * Each value under the \"sections\" field has two fields:\n * - offset: The offset into the original specified at which this section\n * begins to apply, defined as an object with a \"line\" and \"column\"\n * field.\n * - map: A source map definition. This source map could also be indexed,\n * but doesn't have to be.\n *\n * Instead of the \"map\" field, it's also possible to have a \"url\" field\n * specifying a URL to retrieve a source map from, but that's currently\n * unsupported.\n *\n * Here's an example source map, taken from the source map spec[0], but\n * modified to omit a section which uses the \"url\" field.\n *\n * {\n * version : 3,\n * file: \"app.js\",\n * sections: [{\n * offset: {line:100, column:10},\n * map: {\n * version : 3,\n * file: \"section.js\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AAAA,E;;ABCDE;\"\n * }\n * }],\n * }\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n */\nfunction IndexedSourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sections = util.getArg(sourceMap, 'sections');\n\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n this._sources = new ArraySet();\n this._names = new ArraySet();\n\n var lastOffset = {\n line: -1,\n column: 0\n };\n this._sections = sections.map(function (s) {\n if (s.url) {\n // The url field will require support for asynchronicity.\n // See https://github.com/mozilla/source-map/issues/16\n throw new Error('Support for url field in sections not implemented.');\n }\n var offset = util.getArg(s, 'offset');\n var offsetLine = util.getArg(offset, 'line');\n var offsetColumn = util.getArg(offset, 'column');\n\n if (offsetLine < lastOffset.line ||\n (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n throw new Error('Section offsets must be ordered and non-overlapping.');\n }\n lastOffset = offset;\n\n return {\n generatedOffset: {\n // The offset fields are 0-based, but we use 1-based indices when\n // encoding/decoding from VLQ.\n generatedLine: offsetLine + 1,\n generatedColumn: offsetColumn + 1\n },\n consumer: new SourceMapConsumer(util.getArg(s, 'map'))\n }\n });\n}\n\nIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nIndexedSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n get: function () {\n var sources = [];\n for (var i = 0; i < this._sections.length; i++) {\n for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n sources.push(this._sections[i].consumer.sources[j]);\n }\n }\n return sources;\n }\n});\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source.\n * - column: The column number in the generated source.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null.\n * - column: The column number in the original source, or null.\n * - name: The original identifier, or null.\n */\nIndexedSourceMapConsumer.prototype.originalPositionFor =\n function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n // Find the section containing the generated position we're trying to map\n // to an original position.\n var sectionIndex = binarySearch.search(needle, this._sections,\n function(needle, section) {\n var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n if (cmp) {\n return cmp;\n }\n\n return (needle.generatedColumn -\n section.generatedOffset.generatedColumn);\n });\n var section = this._sections[sectionIndex];\n\n if (!section) {\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n }\n\n return section.consumer.originalPositionFor({\n line: needle.generatedLine -\n (section.generatedOffset.generatedLine - 1),\n column: needle.generatedColumn -\n (section.generatedOffset.generatedLine === needle.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n bias: aArgs.bias\n });\n };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n return this._sections.every(function (s) {\n return s.consumer.hasContentsOfAllSources();\n });\n };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nIndexedSourceMapConsumer.prototype.sourceContentFor =\n function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n\n var content = section.consumer.sourceContentFor(aSource, true);\n if (content) {\n return content;\n }\n }\n if (nullOnMissing) {\n return null;\n }\n else {\n throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n }\n };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: The column number in the original source.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\nIndexedSourceMapConsumer.prototype.generatedPositionFor =\n function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n\n // Only consider this section if the requested source is in the list of\n // sources of the consumer.\n if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) {\n continue;\n }\n var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n if (generatedPosition) {\n var ret = {\n line: generatedPosition.line +\n (section.generatedOffset.generatedLine - 1),\n column: generatedPosition.column +\n (section.generatedOffset.generatedLine === generatedPosition.line\n ? section.generatedOffset.generatedColumn - 1\n : 0)\n };\n return ret;\n }\n }\n\n return {\n line: null,\n column: null\n };\n };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nIndexedSourceMapConsumer.prototype._parseMappings =\n function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n this.__generatedMappings = [];\n this.__originalMappings = [];\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n var sectionMappings = section.consumer._generatedMappings;\n for (var j = 0; j < sectionMappings.length; j++) {\n var mapping = sectionMappings[j];\n\n var source = section.consumer._sources.at(mapping.source);\n if (section.consumer.sourceRoot !== null) {\n source = util.join(section.consumer.sourceRoot, source);\n }\n this._sources.add(source);\n source = this._sources.indexOf(source);\n\n var name = section.consumer._names.at(mapping.name);\n this._names.add(name);\n name = this._names.indexOf(name);\n\n // The mappings coming from the consumer for the section have\n // generated positions relative to the start of the section, so we\n // need to offset them to be relative to the start of the concatenated\n // generated file.\n var adjustedMapping = {\n source: source,\n generatedLine: mapping.generatedLine +\n (section.generatedOffset.generatedLine - 1),\n generatedColumn: mapping.generatedColumn +\n (section.generatedOffset.generatedLine === mapping.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: name\n };\n\n this.__generatedMappings.push(adjustedMapping);\n if (typeof adjustedMapping.originalLine === 'number') {\n this.__originalMappings.push(adjustedMapping);\n }\n }\n }\n\n quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n quickSort(this.__originalMappings, util.compareByOriginalPositions);\n };\n\nexports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n", "/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;\nvar util = require('./util');\n\n// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n// operating systems these days (capturing the result).\nvar REGEX_NEWLINE = /(\\r?\\n)/;\n\n// Newline character code for charCodeAt() comparisons\nvar NEWLINE_CODE = 10;\n\n// Private symbol for identifying `SourceNode`s when multiple versions of\n// the source-map library are loaded. This MUST NOT CHANGE across\n// versions!\nvar isSourceNode = \"$$$isSourceNode$$$\";\n\n/**\n * SourceNodes provide a way to abstract over interpolating/concatenating\n * snippets of generated JavaScript source code while maintaining the line and\n * column information associated with the original source code.\n *\n * @param aLine The original line number.\n * @param aColumn The original column number.\n * @param aSource The original source's filename.\n * @param aChunks Optional. An array of strings which are snippets of\n * generated JS, or other SourceNodes.\n * @param aName The original identifier.\n */\nfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n this.children = [];\n this.sourceContents = {};\n this.line = aLine == null ? null : aLine;\n this.column = aColumn == null ? null : aColumn;\n this.source = aSource == null ? null : aSource;\n this.name = aName == null ? null : aName;\n this[isSourceNode] = true;\n if (aChunks != null) this.add(aChunks);\n}\n\n/**\n * Creates a SourceNode from generated code and a SourceMapConsumer.\n *\n * @param aGeneratedCode The generated code\n * @param aSourceMapConsumer The SourceMap for the generated code\n * @param aRelativePath Optional. The path that relative sources in the\n * SourceMapConsumer should be relative to.\n */\nSourceNode.fromStringWithSourceMap =\n function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n // The SourceNode we want to fill with the generated code\n // and the SourceMap\n var node = new SourceNode();\n\n // All even indices of this array are one line of the generated code,\n // while all odd indices are the newlines between two adjacent lines\n // (since `REGEX_NEWLINE` captures its match).\n // Processed fragments are accessed by calling `shiftNextLine`.\n var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n var remainingLinesIndex = 0;\n var shiftNextLine = function() {\n var lineContents = getNextLine();\n // The last line of a file might not have a newline.\n var newLine = getNextLine() || \"\";\n return lineContents + newLine;\n\n function getNextLine() {\n return remainingLinesIndex < remainingLines.length ?\n remainingLines[remainingLinesIndex++] : undefined;\n }\n };\n\n // We need to remember the position of \"remainingLines\"\n var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\n // The generate SourceNodes we need a code range.\n // To extract it current and last mapping is used.\n // Here we store the last mapping.\n var lastMapping = null;\n\n aSourceMapConsumer.eachMapping(function (mapping) {\n if (lastMapping !== null) {\n // We add the code from \"lastMapping\" to \"mapping\":\n // First check if there is a new line in between.\n if (lastGeneratedLine < mapping.generatedLine) {\n // Associate first line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n lastGeneratedLine++;\n lastGeneratedColumn = 0;\n // The remaining code is added without mapping\n } else {\n // There is no new line in between.\n // Associate the code between \"lastGeneratedColumn\" and\n // \"mapping.generatedColumn\" with \"lastMapping\"\n var nextLine = remainingLines[remainingLinesIndex];\n var code = nextLine.substr(0, mapping.generatedColumn -\n lastGeneratedColumn);\n remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -\n lastGeneratedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n addMappingWithCode(lastMapping, code);\n // No more remaining code, continue\n lastMapping = mapping;\n return;\n }\n }\n // We add the generated code until the first mapping\n // to the SourceNode without any mapping.\n // Each line is added as separate string.\n while (lastGeneratedLine < mapping.generatedLine) {\n node.add(shiftNextLine());\n lastGeneratedLine++;\n }\n if (lastGeneratedColumn < mapping.generatedColumn) {\n var nextLine = remainingLines[remainingLinesIndex];\n node.add(nextLine.substr(0, mapping.generatedColumn));\n remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n }\n lastMapping = mapping;\n }, this);\n // We have processed all mappings.\n if (remainingLinesIndex < remainingLines.length) {\n if (lastMapping) {\n // Associate the remaining code in the current line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n }\n // and add the remaining lines without any mapping\n node.add(remainingLines.splice(remainingLinesIndex).join(\"\"));\n }\n\n // Copy sourcesContent into SourceNode\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aRelativePath != null) {\n sourceFile = util.join(aRelativePath, sourceFile);\n }\n node.setSourceContent(sourceFile, content);\n }\n });\n\n return node;\n\n function addMappingWithCode(mapping, code) {\n if (mapping === null || mapping.source === undefined) {\n node.add(code);\n } else {\n var source = aRelativePath\n ? util.join(aRelativePath, mapping.source)\n : mapping.source;\n node.add(new SourceNode(mapping.originalLine,\n mapping.originalColumn,\n source,\n code,\n mapping.name));\n }\n }\n };\n\n/**\n * Add a chunk of generated JS to this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.add = function SourceNode_add(aChunk) {\n if (Array.isArray(aChunk)) {\n aChunk.forEach(function (chunk) {\n this.add(chunk);\n }, this);\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n if (aChunk) {\n this.children.push(aChunk);\n }\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n};\n\n/**\n * Add a chunk of generated JS to the beginning of this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n if (Array.isArray(aChunk)) {\n for (var i = aChunk.length-1; i >= 0; i--) {\n this.prepend(aChunk[i]);\n }\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n this.children.unshift(aChunk);\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n};\n\n/**\n * Walk over the tree of JS snippets in this node and its children. The\n * walking function is called once for each snippet of JS and is passed that\n * snippet and the its original associated source's line/column location.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walk = function SourceNode_walk(aFn) {\n var chunk;\n for (var i = 0, len = this.children.length; i < len; i++) {\n chunk = this.children[i];\n if (chunk[isSourceNode]) {\n chunk.walk(aFn);\n }\n else {\n if (chunk !== '') {\n aFn(chunk, { source: this.source,\n line: this.line,\n column: this.column,\n name: this.name });\n }\n }\n }\n};\n\n/**\n * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n * each of `this.children`.\n *\n * @param aSep The separator.\n */\nSourceNode.prototype.join = function SourceNode_join(aSep) {\n var newChildren;\n var i;\n var len = this.children.length;\n if (len > 0) {\n newChildren = [];\n for (i = 0; i < len-1; i++) {\n newChildren.push(this.children[i]);\n newChildren.push(aSep);\n }\n newChildren.push(this.children[i]);\n this.children = newChildren;\n }\n return this;\n};\n\n/**\n * Call String.prototype.replace on the very right-most source snippet. Useful\n * for trimming whitespace from the end of a source node, etc.\n *\n * @param aPattern The pattern to replace.\n * @param aReplacement The thing to replace the pattern with.\n */\nSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n var lastChild = this.children[this.children.length - 1];\n if (lastChild[isSourceNode]) {\n lastChild.replaceRight(aPattern, aReplacement);\n }\n else if (typeof lastChild === 'string') {\n this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n }\n else {\n this.children.push(''.replace(aPattern, aReplacement));\n }\n return this;\n};\n\n/**\n * Set the source content for a source file. This will be added to the SourceMapGenerator\n * in the sourcesContent field.\n *\n * @param aSourceFile The filename of the source file\n * @param aSourceContent The content of the source file\n */\nSourceNode.prototype.setSourceContent =\n function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n };\n\n/**\n * Walk over the tree of SourceNodes. The walking function is called for each\n * source file content and is passed the filename and source content.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walkSourceContents =\n function SourceNode_walkSourceContents(aFn) {\n for (var i = 0, len = this.children.length; i < len; i++) {\n if (this.children[i][isSourceNode]) {\n this.children[i].walkSourceContents(aFn);\n }\n }\n\n var sources = Object.keys(this.sourceContents);\n for (var i = 0, len = sources.length; i < len; i++) {\n aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n }\n };\n\n/**\n * Return the string representation of this source node. Walks over the tree\n * and concatenates all the various snippets together to one string.\n */\nSourceNode.prototype.toString = function SourceNode_toString() {\n var str = \"\";\n this.walk(function (chunk) {\n str += chunk;\n });\n return str;\n};\n\n/**\n * Returns the string representation of this source node along with a source\n * map.\n */\nSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n var generated = {\n code: \"\",\n line: 1,\n column: 0\n };\n var map = new SourceMapGenerator(aArgs);\n var sourceMappingActive = false;\n var lastOriginalSource = null;\n var lastOriginalLine = null;\n var lastOriginalColumn = null;\n var lastOriginalName = null;\n this.walk(function (chunk, original) {\n generated.code += chunk;\n if (original.source !== null\n && original.line !== null\n && original.column !== null) {\n if(lastOriginalSource !== original.source\n || lastOriginalLine !== original.line\n || lastOriginalColumn !== original.column\n || lastOriginalName !== original.name) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n lastOriginalSource = original.source;\n lastOriginalLine = original.line;\n lastOriginalColumn = original.column;\n lastOriginalName = original.name;\n sourceMappingActive = true;\n } else if (sourceMappingActive) {\n map.addMapping({\n generated: {\n line: generated.line,\n column: generated.column\n }\n });\n lastOriginalSource = null;\n sourceMappingActive = false;\n }\n for (var idx = 0, length = chunk.length; idx < length; idx++) {\n if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n generated.line++;\n generated.column = 0;\n // Mappings end at eol\n if (idx + 1 === length) {\n lastOriginalSource = null;\n sourceMappingActive = false;\n } else if (sourceMappingActive) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n } else {\n generated.column++;\n }\n }\n });\n this.walkSourceContents(function (sourceFile, sourceContent) {\n map.setSourceContent(sourceFile, sourceContent);\n });\n\n return { code: generated.code, map: map };\n};\n\nexports.SourceNode = SourceNode;\n", "/*\n * Copyright 2009-2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE.txt or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nexports.SourceMapGenerator = require('./lib/source-map-generator').SourceMapGenerator;\nexports.SourceMapConsumer = require('./lib/source-map-consumer').SourceMapConsumer;\nexports.SourceNode = require('./lib/source-node').SourceNode;\n", "// Copyright 2014 Simon Lydell\n// X11 (\u201CMIT\u201D) Licensed. (See LICENSE.)\n\nvoid (function(root, factory) {\n if (typeof define === \"function\" && define.amd) {\n define(factory)\n } else if (typeof exports === \"object\") {\n module.exports = factory()\n } else {\n root.sourceMappingURL = factory()\n }\n}(this, function() {\n\n var innerRegex = /[#@] sourceMappingURL=([^\\s'\"]*)/\n\n var regex = RegExp(\n \"(?:\" +\n \"/\\\\*\" +\n \"(?:\\\\s*\\r?\\n(?://)?)?\" +\n \"(?:\" + innerRegex.source + \")\" +\n \"\\\\s*\" +\n \"\\\\*/\" +\n \"|\" +\n \"//(?:\" + innerRegex.source + \")\" +\n \")\" +\n \"\\\\s*\"\n )\n\n return {\n\n regex: regex,\n _innerRegex: innerRegex,\n\n getFrom: function(code) {\n var match = code.match(regex)\n return (match ? match[1] || match[2] || \"\" : null)\n },\n\n existsIn: function(code) {\n return regex.test(code)\n },\n\n removeFrom: function(code) {\n return code.replace(regex, \"\")\n },\n\n insertBefore: function(code, string) {\n var match = code.match(regex)\n if (match) {\n return code.slice(0, match.index) + string + code.slice(match.index)\n } else {\n return code + string\n }\n }\n }\n\n}));\n", "// Copyright 2014 Simon Lydell\n// X11 (\u201CMIT\u201D) Licensed. (See LICENSE.)\n\nvar url = require(\"url\")\n\nfunction resolveUrl(/* ...urls */) {\n return Array.prototype.reduce.call(arguments, function(resolved, nextUrl) {\n return url.resolve(resolved, nextUrl)\n })\n}\n\nmodule.exports = resolveUrl\n", "'use strict';\nvar token = '%[a-f0-9]{2}';\nvar singleMatcher = new RegExp('(' + token + ')|([^%]+?)', 'gi');\nvar multiMatcher = new RegExp('(' + token + ')+', 'gi');\n\nfunction decodeComponents(components, split) {\n\ttry {\n\t\t// Try to decode the entire string first\n\t\treturn [decodeURIComponent(components.join(''))];\n\t} catch (err) {\n\t\t// Do nothing\n\t}\n\n\tif (components.length === 1) {\n\t\treturn components;\n\t}\n\n\tsplit = split || 1;\n\n\t// Split the array in 2 parts\n\tvar left = components.slice(0, split);\n\tvar right = components.slice(split);\n\n\treturn Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right));\n}\n\nfunction decode(input) {\n\ttry {\n\t\treturn decodeURIComponent(input);\n\t} catch (err) {\n\t\tvar tokens = input.match(singleMatcher) || [];\n\n\t\tfor (var i = 1; i < tokens.length; i++) {\n\t\t\tinput = decodeComponents(tokens, i).join('');\n\n\t\t\ttokens = input.match(singleMatcher) || [];\n\t\t}\n\n\t\treturn input;\n\t}\n}\n\nfunction customDecodeURIComponent(input) {\n\t// Keep track of all the replacements and prefill the map with the `BOM`\n\tvar replaceMap = {\n\t\t'%FE%FF': '\\uFFFD\\uFFFD',\n\t\t'%FF%FE': '\\uFFFD\\uFFFD'\n\t};\n\n\tvar match = multiMatcher.exec(input);\n\twhile (match) {\n\t\ttry {\n\t\t\t// Decode as big chunks as possible\n\t\t\treplaceMap[match[0]] = decodeURIComponent(match[0]);\n\t\t} catch (err) {\n\t\t\tvar result = decode(match[0]);\n\n\t\t\tif (result !== match[0]) {\n\t\t\t\treplaceMap[match[0]] = result;\n\t\t\t}\n\t\t}\n\n\t\tmatch = multiMatcher.exec(input);\n\t}\n\n\t// Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else\n\treplaceMap['%C2'] = '\\uFFFD';\n\n\tvar entries = Object.keys(replaceMap);\n\n\tfor (var i = 0; i < entries.length; i++) {\n\t\t// Replace all decoded components\n\t\tvar key = entries[i];\n\t\tinput = input.replace(new RegExp(key, 'g'), replaceMap[key]);\n\t}\n\n\treturn input;\n}\n\nmodule.exports = function (encodedURI) {\n\tif (typeof encodedURI !== 'string') {\n\t\tthrow new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`');\n\t}\n\n\ttry {\n\t\tencodedURI = encodedURI.replace(/\\+/g, ' ');\n\n\t\t// Try the built in decoder first\n\t\treturn decodeURIComponent(encodedURI);\n\t} catch (err) {\n\t\t// Fallback to a more advanced decoder\n\t\treturn customDecodeURIComponent(encodedURI);\n\t}\n};\n", "// Copyright 2017 Simon Lydell\n// X11 (\u201CMIT\u201D) Licensed. (See LICENSE.)\n\nvar decodeUriComponent = require(\"decode-uri-component\")\n\nfunction customDecodeUriComponent(string) {\n // `decodeUriComponent` turns `+` into ` `, but that's not wanted.\n return decodeUriComponent(string.replace(/\\+/g, \"%2B\"))\n}\n\nmodule.exports = customDecodeUriComponent\n", "// Copyright 2014 Simon Lydell\r\n// X11 (\u201CMIT\u201D) Licensed. (See LICENSE.)\r\n\r\nvar path = require(\"path\")\r\n\r\n\"use strict\"\r\n\r\nfunction urix(aPath) {\r\n if (path.sep === \"\\\\\") {\r\n return aPath\r\n .replace(/\\\\/g, \"/\")\r\n .replace(/^[a-z]:\\/?/i, \"/\")\r\n }\r\n return aPath\r\n}\r\n\r\nmodule.exports = urix\r\n", "\"use strict\";\n\nfunction atob(str) {\n return Buffer.from(str, 'base64').toString('binary');\n}\n\nmodule.exports = atob.atob = atob;\n", "// Copyright 2014, 2015, 2016, 2017 Simon Lydell\n// X11 (\u201CMIT\u201D) Licensed. (See LICENSE.)\n\nvar sourceMappingURL = require(\"source-map-url\")\nvar resolveUrl = require(\"./resolve-url\")\nvar decodeUriComponent = require(\"./decode-uri-component\")\nvar urix = require(\"urix\")\nvar atob = require(\"atob\")\n\n\n\nfunction callbackAsync(callback, error, result) {\n setImmediate(function() { callback(error, result) })\n}\n\nfunction parseMapToJSON(string, data) {\n try {\n return JSON.parse(string.replace(/^\\)\\]\\}'/, \"\"))\n } catch (error) {\n error.sourceMapData = data\n throw error\n }\n}\n\nfunction readSync(read, url, data) {\n var readUrl = decodeUriComponent(url)\n try {\n return String(read(readUrl))\n } catch (error) {\n error.sourceMapData = data\n throw error\n }\n}\n\n\n\nfunction resolveSourceMap(code, codeUrl, read, callback) {\n var mapData\n try {\n mapData = resolveSourceMapHelper(code, codeUrl)\n } catch (error) {\n return callbackAsync(callback, error)\n }\n if (!mapData || mapData.map) {\n return callbackAsync(callback, null, mapData)\n }\n var readUrl = decodeUriComponent(mapData.url)\n read(readUrl, function(error, result) {\n if (error) {\n error.sourceMapData = mapData\n return callback(error)\n }\n mapData.map = String(result)\n try {\n mapData.map = parseMapToJSON(mapData.map, mapData)\n } catch (error) {\n return callback(error)\n }\n callback(null, mapData)\n })\n}\n\nfunction resolveSourceMapSync(code, codeUrl, read) {\n var mapData = resolveSourceMapHelper(code, codeUrl)\n if (!mapData || mapData.map) {\n return mapData\n }\n mapData.map = readSync(read, mapData.url, mapData)\n mapData.map = parseMapToJSON(mapData.map, mapData)\n return mapData\n}\n\nvar dataUriRegex = /^data:([^,;]*)(;[^,;]*)*(?:,(.*))?$/\nvar jsonMimeTypeRegex = /^(?:application|text)\\/json$/\n\nfunction resolveSourceMapHelper(code, codeUrl) {\n codeUrl = urix(codeUrl)\n\n var url = sourceMappingURL.getFrom(code)\n if (!url) {\n return null\n }\n\n var dataUri = url.match(dataUriRegex)\n if (dataUri) {\n var mimeType = dataUri[1]\n var lastParameter = dataUri[2] || \"\"\n var encoded = dataUri[3] || \"\"\n var data = {\n sourceMappingURL: url,\n url: null,\n sourcesRelativeTo: codeUrl,\n map: encoded\n }\n if (!jsonMimeTypeRegex.test(mimeType)) {\n var error = new Error(\"Unuseful data uri mime type: \" + (mimeType || \"text/plain\"))\n error.sourceMapData = data\n throw error\n }\n data.map = parseMapToJSON(\n lastParameter === \";base64\" ? atob(encoded) : decodeURIComponent(encoded),\n data\n )\n return data\n }\n\n var mapUrl = resolveUrl(codeUrl, url)\n return {\n sourceMappingURL: url,\n url: mapUrl,\n sourcesRelativeTo: mapUrl,\n map: null\n }\n}\n\n\n\nfunction resolveSources(map, mapUrl, read, options, callback) {\n if (typeof options === \"function\") {\n callback = options\n options = {}\n }\n var pending = map.sources ? map.sources.length : 0\n var result = {\n sourcesResolved: [],\n sourcesContent: []\n }\n\n if (pending === 0) {\n callbackAsync(callback, null, result)\n return\n }\n\n var done = function() {\n pending--\n if (pending === 0) {\n callback(null, result)\n }\n }\n\n resolveSourcesHelper(map, mapUrl, options, function(fullUrl, sourceContent, index) {\n result.sourcesResolved[index] = fullUrl\n if (typeof sourceContent === \"string\") {\n result.sourcesContent[index] = sourceContent\n callbackAsync(done, null)\n } else {\n var readUrl = decodeUriComponent(fullUrl)\n read(readUrl, function(error, source) {\n result.sourcesContent[index] = error ? error : String(source)\n done()\n })\n }\n })\n}\n\nfunction resolveSourcesSync(map, mapUrl, read, options) {\n var result = {\n sourcesResolved: [],\n sourcesContent: []\n }\n\n if (!map.sources || map.sources.length === 0) {\n return result\n }\n\n resolveSourcesHelper(map, mapUrl, options, function(fullUrl, sourceContent, index) {\n result.sourcesResolved[index] = fullUrl\n if (read !== null) {\n if (typeof sourceContent === \"string\") {\n result.sourcesContent[index] = sourceContent\n } else {\n var readUrl = decodeUriComponent(fullUrl)\n try {\n result.sourcesContent[index] = String(read(readUrl))\n } catch (error) {\n result.sourcesContent[index] = error\n }\n }\n }\n })\n\n return result\n}\n\nvar endingSlash = /\\/?$/\n\nfunction resolveSourcesHelper(map, mapUrl, options, fn) {\n options = options || {}\n mapUrl = urix(mapUrl)\n var fullUrl\n var sourceContent\n var sourceRoot\n for (var index = 0, len = map.sources.length; index < len; index++) {\n sourceRoot = null\n if (typeof options.sourceRoot === \"string\") {\n sourceRoot = options.sourceRoot\n } else if (typeof map.sourceRoot === \"string\" && options.sourceRoot !== false) {\n sourceRoot = map.sourceRoot\n }\n // If the sourceRoot is the empty string, it is equivalent to not setting\n // the property at all.\n if (sourceRoot === null || sourceRoot === '') {\n fullUrl = resolveUrl(mapUrl, map.sources[index])\n } else {\n // Make sure that the sourceRoot ends with a slash, so that `/scripts/subdir` becomes\n // `/scripts/subdir/<source>`, not `/scripts/<source>`. Pointing to a file as source root\n // does not make sense.\n fullUrl = resolveUrl(mapUrl, sourceRoot.replace(endingSlash, \"/\"), map.sources[index])\n }\n sourceContent = (map.sourcesContent || [])[index]\n fn(fullUrl, sourceContent, index)\n }\n}\n\n\n\nfunction resolve(code, codeUrl, read, options, callback) {\n if (typeof options === \"function\") {\n callback = options\n options = {}\n }\n if (code === null) {\n var mapUrl = codeUrl\n var data = {\n sourceMappingURL: null,\n url: mapUrl,\n sourcesRelativeTo: mapUrl,\n map: null\n }\n var readUrl = decodeUriComponent(mapUrl)\n read(readUrl, function(error, result) {\n if (error) {\n error.sourceMapData = data\n return callback(error)\n }\n data.map = String(result)\n try {\n data.map = parseMapToJSON(data.map, data)\n } catch (error) {\n return callback(error)\n }\n _resolveSources(data)\n })\n } else {\n resolveSourceMap(code, codeUrl, read, function(error, mapData) {\n if (error) {\n return callback(error)\n }\n if (!mapData) {\n return callback(null, null)\n }\n _resolveSources(mapData)\n })\n }\n\n function _resolveSources(mapData) {\n resolveSources(mapData.map, mapData.sourcesRelativeTo, read, options, function(error, result) {\n if (error) {\n return callback(error)\n }\n mapData.sourcesResolved = result.sourcesResolved\n mapData.sourcesContent = result.sourcesContent\n callback(null, mapData)\n })\n }\n}\n\nfunction resolveSync(code, codeUrl, read, options) {\n var mapData\n if (code === null) {\n var mapUrl = codeUrl\n mapData = {\n sourceMappingURL: null,\n url: mapUrl,\n sourcesRelativeTo: mapUrl,\n map: null\n }\n mapData.map = readSync(read, mapUrl, mapData)\n mapData.map = parseMapToJSON(mapData.map, mapData)\n } else {\n mapData = resolveSourceMapSync(code, codeUrl, read)\n if (!mapData) {\n return null\n }\n }\n var result = resolveSourcesSync(mapData.map, mapData.sourcesRelativeTo, read, options)\n mapData.sourcesResolved = result.sourcesResolved\n mapData.sourcesContent = result.sourcesContent\n return mapData\n}\n\n\n\nmodule.exports = {\n resolveSourceMap: resolveSourceMap,\n resolveSourceMapSync: resolveSourceMapSync,\n resolveSources: resolveSources,\n resolveSourcesSync: resolveSourcesSync,\n resolve: resolve,\n resolveSync: resolveSync,\n parseMapToJSON: parseMapToJSON\n}\n", "'use strict';\n\n/**\n * Module dependencies\n */\n\nexports.extend = require('extend-shallow');\nexports.SourceMap = require('source-map');\nexports.sourceMapResolve = require('source-map-resolve');\n\n/**\n * Convert backslash in the given string to forward slashes\n */\n\nexports.unixify = function(fp) {\n return fp.split(/\\\\+/).join('/');\n};\n\n/**\n * Return true if `val` is a non-empty string\n *\n * @param {String} `str`\n * @return {Boolean}\n */\n\nexports.isString = function(str) {\n return str && typeof str === 'string';\n};\n\n/**\n * Cast `val` to an array\n * @return {Array}\n */\n\nexports.arrayify = function(val) {\n if (typeof val === 'string') return [val];\n return val ? (Array.isArray(val) ? val : [val]) : [];\n};\n\n/**\n * Get the last `n` element from the given `array`\n * @param {Array} `array`\n * @return {*}\n */\n\nexports.last = function(arr, n) {\n return arr[arr.length - (n || 1)];\n};\n", "'use strict';\n\nvar fs = require('fs');\nvar path = require('path');\nvar define = require('define-property');\nvar utils = require('./utils');\n\n/**\n * Expose `mixin()`.\n * This code is based on `source-maps-support.js` in reworkcss/css\n * https://github.com/reworkcss/css/blob/master/lib/stringify/source-map-support.js\n * Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>\n */\n\nmodule.exports = mixin;\n\n/**\n * Mixin source map support into `compiler`.\n *\n * @param {Object} `compiler`\n * @api public\n */\n\nfunction mixin(compiler) {\n define(compiler, '_comment', compiler.comment);\n compiler.map = new utils.SourceMap.SourceMapGenerator();\n compiler.position = { line: 1, column: 1 };\n compiler.content = {};\n compiler.files = {};\n\n for (var key in exports) {\n define(compiler, key, exports[key]);\n }\n}\n\n/**\n * Update position.\n *\n * @param {String} str\n */\n\nexports.updatePosition = function(str) {\n var lines = str.match(/\\n/g);\n if (lines) this.position.line += lines.length;\n var i = str.lastIndexOf('\\n');\n this.position.column = ~i ? str.length - i : this.position.column + str.length;\n};\n\n/**\n * Emit `str` with `position`.\n *\n * @param {String} str\n * @param {Object} [pos]\n * @return {String}\n */\n\nexports.emit = function(str, node) {\n var position = node.position || {};\n var source = position.source;\n if (source) {\n if (position.filepath) {\n source = utils.unixify(position.filepath);\n }\n\n this.map.addMapping({\n source: source,\n generated: {\n line: this.position.line,\n column: Math.max(this.position.column - 1, 0)\n },\n original: {\n line: position.start.line,\n column: position.start.column - 1\n }\n });\n\n if (position.content) {\n this.addContent(source, position);\n }\n if (position.filepath) {\n this.addFile(source, position);\n }\n\n this.updatePosition(str);\n this.output += str;\n }\n return str;\n};\n\n/**\n * Adds a file to the source map output if it has not already been added\n * @param {String} `file`\n * @param {Object} `pos`\n */\n\nexports.addFile = function(file, position) {\n if (typeof position.content !== 'string') return;\n if (Object.prototype.hasOwnProperty.call(this.files, file)) return;\n this.files[file] = position.content;\n};\n\n/**\n * Adds a content source to the source map output if it has not already been added\n * @param {String} `source`\n * @param {Object} `position`\n */\n\nexports.addContent = function(source, position) {\n if (typeof position.content !== 'string') return;\n if (Object.prototype.hasOwnProperty.call(this.content, source)) return;\n this.map.setSourceContent(source, position.content);\n};\n\n/**\n * Applies any original source maps to the output and embeds the source file\n * contents in the source map.\n */\n\nexports.applySourceMaps = function() {\n Object.keys(this.files).forEach(function(file) {\n var content = this.files[file];\n this.map.setSourceContent(file, content);\n\n if (this.options.inputSourcemaps === true) {\n var originalMap = utils.sourceMapResolve.resolveSync(content, file, fs.readFileSync);\n if (originalMap) {\n var map = new utils.SourceMap.SourceMapConsumer(originalMap.map);\n var relativeTo = originalMap.sourcesRelativeTo;\n this.map.applySourceMap(map, file, utils.unixify(path.dirname(relativeTo)));\n }\n }\n }, this);\n};\n\n/**\n * Process comments, drops sourceMap comments.\n * @param {Object} node\n */\n\nexports.comment = function(node) {\n if (/^# sourceMappingURL=/.test(node.comment)) {\n return this.emit('', node.position);\n }\n return this._comment(node);\n};\n", "'use strict';\n\nvar use = require('use');\nvar define = require('define-property');\nvar debug = require('debug')('snapdragon:compiler');\nvar utils = require('./utils');\n\n/**\n * Create a new `Compiler` with the given `options`.\n * @param {Object} `options`\n */\n\nfunction Compiler(options, state) {\n debug('initializing', __filename);\n this.options = utils.extend({source: 'string'}, options);\n this.state = state || {};\n this.compilers = {};\n this.output = '';\n this.set('eos', function(node) {\n return this.emit(node.val, node);\n });\n this.set('noop', function(node) {\n return this.emit(node.val, node);\n });\n this.set('bos', function(node) {\n return this.emit(node.val, node);\n });\n use(this);\n}\n\n/**\n * Prototype methods\n */\n\nCompiler.prototype = {\n\n /**\n * Throw an error message with details including the cursor position.\n * @param {String} `msg` Message to use in the Error.\n */\n\n error: function(msg, node) {\n var pos = node.position || {start: {column: 0}};\n var message = this.options.source + ' column:' + pos.start.column + ': ' + msg;\n\n var err = new Error(message);\n err.reason = msg;\n err.column = pos.start.column;\n err.source = this.pattern;\n\n if (this.options.silent) {\n this.errors.push(err);\n } else {\n throw err;\n }\n },\n\n /**\n * Define a non-enumberable property on the `Compiler` instance.\n *\n * ```js\n * compiler.define('foo', 'bar');\n * ```\n * @name .define\n * @param {String} `key` propery name\n * @param {any} `val` property value\n * @return {Object} Returns the Compiler instance for chaining.\n * @api public\n */\n\n define: function(key, val) {\n define(this, key, val);\n return this;\n },\n\n /**\n * Emit `node.val`\n */\n\n emit: function(str, node) {\n this.output += str;\n return str;\n },\n\n /**\n * Add a compiler `fn` with the given `name`\n */\n\n set: function(name, fn) {\n this.compilers[name] = fn;\n return this;\n },\n\n /**\n * Get compiler `name`.\n */\n\n get: function(name) {\n return this.compilers[name];\n },\n\n /**\n * Get the previous AST node.\n */\n\n prev: function(n) {\n return this.ast.nodes[this.idx - (n || 1)] || { type: 'bos', val: '' };\n },\n\n /**\n * Get the next AST node.\n */\n\n next: function(n) {\n return this.ast.nodes[this.idx + (n || 1)] || { type: 'eos', val: '' };\n },\n\n /**\n * Visit `node`.\n */\n\n visit: function(node, nodes, i) {\n var fn = this.compilers[node.type];\n this.idx = i;\n\n if (typeof fn !== 'function') {\n throw this.error('compiler \"' + node.type + '\" is not registered', node);\n }\n return fn.call(this, node, nodes, i);\n },\n\n /**\n * Map visit over array of `nodes`.\n */\n\n mapVisit: function(nodes) {\n if (!Array.isArray(nodes)) {\n throw new TypeError('expected an array');\n }\n var len = nodes.length;\n var idx = -1;\n while (++idx < len) {\n this.visit(nodes[idx], nodes, idx);\n }\n return this;\n },\n\n /**\n * Compile `ast`.\n */\n\n compile: function(ast, options) {\n var opts = utils.extend({}, this.options, options);\n this.ast = ast;\n this.parsingErrors = this.ast.errors;\n this.output = '';\n\n // source map support\n if (opts.sourcemap) {\n var sourcemaps = require('./source-maps');\n sourcemaps(this);\n this.mapVisit(this.ast.nodes);\n this.applySourceMaps();\n this.map = opts.sourcemap === 'generator' ? this.map : this.map.toJSON();\n return this;\n }\n\n this.mapVisit(this.ast.nodes);\n return this;\n }\n};\n\n/**\n * Expose `Compiler`\n */\n\nmodule.exports = Compiler;\n", "/*!\n * map-cache <https://github.com/jonschlinkert/map-cache>\n *\n * Copyright (c) 2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nvar hasOwn = Object.prototype.hasOwnProperty;\n\n/**\n * Expose `MapCache`\n */\n\nmodule.exports = MapCache;\n\n/**\n * Creates a cache object to store key/value pairs.\n *\n * ```js\n * var cache = new MapCache();\n * ```\n *\n * @api public\n */\n\nfunction MapCache(data) {\n this.__data__ = data || {};\n}\n\n/**\n * Adds `value` to `key` on the cache.\n *\n * ```js\n * cache.set('foo', 'bar');\n * ```\n *\n * @param {String} `key` The key of the value to cache.\n * @param {*} `value` The value to cache.\n * @returns {Object} Returns the `Cache` object for chaining.\n * @api public\n */\n\nMapCache.prototype.set = function mapSet(key, value) {\n if (key !== '__proto__') {\n this.__data__[key] = value;\n }\n return this;\n};\n\n/**\n * Gets the cached value for `key`.\n *\n * ```js\n * cache.get('foo');\n * //=> 'bar'\n * ```\n *\n * @param {String} `key` The key of the value to get.\n * @returns {*} Returns the cached value.\n * @api public\n */\n\nMapCache.prototype.get = function mapGet(key) {\n return key === '__proto__' ? undefined : this.__data__[key];\n};\n\n/**\n * Checks if a cached value for `key` exists.\n *\n * ```js\n * cache.has('foo');\n * //=> true\n * ```\n *\n * @param {String} `key` The key of the entry to check.\n * @returns {Boolean} Returns `true` if an entry for `key` exists, else `false`.\n * @api public\n */\n\nMapCache.prototype.has = function mapHas(key) {\n return key !== '__proto__' && hasOwn.call(this.__data__, key);\n};\n\n/**\n * Removes `key` and its value from the cache.\n *\n * ```js\n * cache.del('foo');\n * ```\n * @title .del\n * @param {String} `key` The key of the value to remove.\n * @returns {Boolean} Returns `true` if the entry was removed successfully, else `false`.\n * @api public\n */\n\nMapCache.prototype.del = function mapDelete(key) {\n return this.has(key) && delete this.__data__[key];\n};\n", "'use strict';\n\nvar define = require('define-property');\n\n/**\n * Store position for a node\n */\n\nmodule.exports = function Position(start, parser) {\n this.start = start;\n this.end = { line: parser.line, column: parser.column };\n define(this, 'content', parser.orig);\n define(this, 'source', parser.options.source);\n};\n", "'use strict';\n\nvar use = require('use');\nvar util = require('util');\nvar Cache = require('map-cache');\nvar define = require('define-property');\nvar debug = require('debug')('snapdragon:parser');\nvar Position = require('./position');\nvar utils = require('./utils');\n\n/**\n * Create a new `Parser` with the given `input` and `options`.\n * @param {String} `input`\n * @param {Object} `options`\n * @api public\n */\n\nfunction Parser(options) {\n debug('initializing', __filename);\n this.options = utils.extend({source: 'string'}, options);\n this.init(this.options);\n use(this);\n}\n\n/**\n * Prototype methods\n */\n\nParser.prototype = {\n constructor: Parser,\n\n init: function(options) {\n this.orig = '';\n this.input = '';\n this.parsed = '';\n\n this.column = 1;\n this.line = 1;\n\n this.regex = new Cache();\n this.errors = this.errors || [];\n this.parsers = this.parsers || {};\n this.types = this.types || [];\n this.sets = this.sets || {};\n this.fns = this.fns || [];\n this.currentType = 'root';\n\n var pos = this.position();\n this.bos = pos({type: 'bos', val: ''});\n\n this.ast = {\n type: 'root',\n errors: this.errors,\n nodes: [this.bos]\n };\n\n define(this.bos, 'parent', this.ast);\n this.nodes = [this.ast];\n\n this.count = 0;\n this.setCount = 0;\n this.stack = [];\n },\n\n /**\n * Throw a formatted error with the cursor column and `msg`.\n * @param {String} `msg` Message to use in the Error.\n */\n\n error: function(msg, node) {\n var pos = node.position || {start: {column: 0, line: 0}};\n var line = pos.start.line;\n var column = pos.start.column;\n var source = this.options.source;\n\n var message = source + ' <line:' + line + ' column:' + column + '>: ' + msg;\n var err = new Error(message);\n err.source = source;\n err.reason = msg;\n err.pos = pos;\n\n if (this.options.silent) {\n this.errors.push(err);\n } else {\n throw err;\n }\n },\n\n /**\n * Define a non-enumberable property on the `Parser` instance.\n *\n * ```js\n * parser.define('foo', 'bar');\n * ```\n * @name .define\n * @param {String} `key` propery name\n * @param {any} `val` property value\n * @return {Object} Returns the Parser instance for chaining.\n * @api public\n */\n\n define: function(key, val) {\n define(this, key, val);\n return this;\n },\n\n /**\n * Mark position and patch `node.position`.\n */\n\n position: function() {\n var start = { line: this.line, column: this.column };\n var self = this;\n\n return function(node) {\n define(node, 'position', new Position(start, self));\n return node;\n };\n },\n\n /**\n * Set parser `name` with the given `fn`\n * @param {String} `name`\n * @param {Function} `fn`\n * @api public\n */\n\n set: function(type, fn) {\n if (this.types.indexOf(type) === -1) {\n this.types.push(type);\n }\n this.parsers[type] = fn.bind(this);\n return this;\n },\n\n /**\n * Get parser `name`\n * @param {String} `name`\n * @api public\n */\n\n get: function(name) {\n return this.parsers[name];\n },\n\n /**\n * Push a `token` onto the `type` stack.\n *\n * @param {String} `type`\n * @return {Object} `token`\n * @api public\n */\n\n push: function(type, token) {\n this.sets[type] = this.sets[type] || [];\n this.count++;\n this.stack.push(token);\n return this.sets[type].push(token);\n },\n\n /**\n * Pop a token off of the `type` stack\n * @param {String} `type`\n * @returns {Object} Returns a token\n * @api public\n */\n\n pop: function(type) {\n this.sets[type] = this.sets[type] || [];\n this.count--;\n this.stack.pop();\n return this.sets[type].pop();\n },\n\n /**\n * Return true if inside a `stack` node. Types are `braces`, `parens` or `brackets`.\n *\n * @param {String} `type`\n * @return {Boolean}\n * @api public\n */\n\n isInside: function(type) {\n this.sets[type] = this.sets[type] || [];\n return this.sets[type].length > 0;\n },\n\n /**\n * Return true if `node` is the given `type`.\n *\n * ```js\n * parser.isType(node, 'brace');\n * ```\n * @param {Object} `node`\n * @param {String} `type`\n * @return {Boolean}\n * @api public\n */\n\n isType: function(node, type) {\n return node && node.type === type;\n },\n\n /**\n * Get the previous AST node\n * @return {Object}\n */\n\n prev: function(n) {\n return this.stack.length > 0\n ? utils.last(this.stack, n)\n : utils.last(this.nodes, n);\n },\n\n /**\n * Update line and column based on `str`.\n */\n\n consume: function(len) {\n this.input = this.input.substr(len);\n },\n\n /**\n * Update column based on `str`.\n */\n\n updatePosition: function(str, len) {\n var lines = str.match(/\\n/g);\n if (lines) this.line += lines.length;\n var i = str.lastIndexOf('\\n');\n this.column = ~i ? len - i : this.column + len;\n this.parsed += str;\n this.consume(len);\n },\n\n /**\n * Match `regex`, return captures, and update the cursor position by `match[0]` length.\n * @param {RegExp} `regex`\n * @return {Object}\n */\n\n match: function(regex) {\n var m = regex.exec(this.input);\n if (m) {\n this.updatePosition(m[0], m[0].length);\n return m;\n }\n },\n\n /**\n * Capture `type` with the given regex.\n * @param {String} `type`\n * @param {RegExp} `regex`\n * @return {Function}\n */\n\n capture: function(type, regex) {\n if (typeof regex === 'function') {\n return this.set.apply(this, arguments);\n }\n\n this.regex.set(type, regex);\n this.set(type, function() {\n var parsed = this.parsed;\n var pos = this.position();\n var m = this.match(regex);\n if (!m || !m[0]) return;\n\n var prev = this.prev();\n var node = pos({\n type: type,\n val: m[0],\n parsed: parsed,\n rest: this.input\n });\n\n if (m[1]) {\n node.inner = m[1];\n }\n\n define(node, 'inside', this.stack.length > 0);\n define(node, 'parent', prev);\n prev.nodes.push(node);\n }.bind(this));\n return this;\n },\n\n /**\n * Create a parser with open and close for parens,\n * brackets or braces\n */\n\n capturePair: function(type, openRegex, closeRegex, fn) {\n this.sets[type] = this.sets[type] || [];\n\n /**\n * Open\n */\n\n this.set(type + '.open', function() {\n var parsed = this.parsed;\n var pos = this.position();\n var m = this.match(openRegex);\n if (!m || !m[0]) return;\n\n var val = m[0];\n this.setCount++;\n this.specialChars = true;\n var open = pos({\n type: type + '.open',\n val: val,\n rest: this.input\n });\n\n if (typeof m[1] !== 'undefined') {\n open.inner = m[1];\n }\n\n var prev = this.prev();\n var node = pos({\n type: type,\n nodes: [open]\n });\n\n define(node, 'rest', this.input);\n define(node, 'parsed', parsed);\n define(node, 'prefix', m[1]);\n define(node, 'parent', prev);\n define(open, 'parent', node);\n\n if (typeof fn === 'function') {\n fn.call(this, open, node);\n }\n\n this.push(type, node);\n prev.nodes.push(node);\n });\n\n /**\n * Close\n */\n\n this.set(type + '.close', function() {\n var pos = this.position();\n var m = this.match(closeRegex);\n if (!m || !m[0]) return;\n\n var parent = this.pop(type);\n var node = pos({\n type: type + '.close',\n rest: this.input,\n suffix: m[1],\n val: m[0]\n });\n\n if (!this.isType(parent, type)) {\n if (this.options.strict) {\n throw new Error('missing opening \"' + type + '\"');\n }\n\n this.setCount--;\n node.escaped = true;\n return node;\n }\n\n if (node.suffix === '\\\\') {\n parent.escaped = true;\n node.escaped = true;\n }\n\n parent.nodes.push(node);\n define(node, 'parent', parent);\n });\n\n return this;\n },\n\n /**\n * Capture end-of-string\n */\n\n eos: function() {\n var pos = this.position();\n if (this.input) return;\n var prev = this.prev();\n\n while (prev.type !== 'root' && !prev.visited) {\n if (this.options.strict === true) {\n throw new SyntaxError('invalid syntax:' + util.inspect(prev, null, 2));\n }\n\n if (!hasDelims(prev)) {\n prev.parent.escaped = true;\n prev.escaped = true;\n }\n\n visit(prev, function(node) {\n if (!hasDelims(node.parent)) {\n node.parent.escaped = true;\n node.escaped = true;\n }\n });\n\n prev = prev.parent;\n }\n\n var tok = pos({\n type: 'eos',\n val: this.append || ''\n });\n\n define(tok, 'parent', this.ast);\n return tok;\n },\n\n /**\n * Run parsers to advance the cursor position\n */\n\n next: function() {\n var parsed = this.parsed;\n var len = this.types.length;\n var idx = -1;\n var tok;\n\n while (++idx < len) {\n if ((tok = this.parsers[this.types[idx]].call(this))) {\n define(tok, 'rest', this.input);\n define(tok, 'parsed', parsed);\n this.last = tok;\n return tok;\n }\n }\n },\n\n /**\n * Parse the given string.\n * @return {Array}\n */\n\n parse: function(input) {\n if (typeof input !== 'string') {\n throw new TypeError('expected a string');\n }\n\n this.init(this.options);\n this.orig = input;\n this.input = input;\n var self = this;\n\n function parse() {\n // check input before calling `.next()`\n input = self.input;\n\n // get the next AST ndoe\n var node = self.next();\n if (node) {\n var prev = self.prev();\n if (prev) {\n define(node, 'parent', prev);\n if (prev.nodes) {\n prev.nodes.push(node);\n }\n }\n\n if (self.sets.hasOwnProperty(prev.type)) {\n self.currentType = prev.type;\n }\n }\n\n // if we got here but input is not changed, throw an error\n if (self.input && input === self.input) {\n throw new Error('no parsers registered for: \"' + self.input.slice(0, 5) + '\"');\n }\n }\n\n while (this.input) parse();\n if (this.stack.length && this.options.strict) {\n var node = this.stack.pop();\n throw this.error('missing opening ' + node.type + ': \"' + this.orig + '\"');\n }\n\n var eos = this.eos();\n var tok = this.prev();\n if (tok.type !== 'eos') {\n this.ast.nodes.push(eos);\n }\n\n return this.ast;\n }\n};\n\n/**\n * Visit `node` with the given `fn`\n */\n\nfunction visit(node, fn) {\n if (!node.visited) {\n define(node, 'visited', true);\n return node.nodes ? mapVisit(node.nodes, fn) : fn(node);\n }\n return node;\n}\n\n/**\n * Map visit over array of `nodes`.\n */\n\nfunction mapVisit(nodes, fn) {\n var len = nodes.length;\n var idx = -1;\n while (++idx < len) {\n visit(nodes[idx], fn);\n }\n}\n\nfunction hasOpen(node) {\n return node.nodes && node.nodes[0].type === (node.type + '.open');\n}\n\nfunction hasClose(node) {\n return node.nodes && utils.last(node.nodes).type === (node.type + '.close');\n}\n\nfunction hasDelims(node) {\n return hasOpen(node) && hasClose(node);\n}\n\n/**\n * Expose `Parser`\n */\n\nmodule.exports = Parser;\n", "'use strict';\n\nvar Base = require('base');\nvar define = require('define-property');\nvar Compiler = require('./lib/compiler');\nvar Parser = require('./lib/parser');\nvar utils = require('./lib/utils');\nvar regexCache = {};\nvar cache = {};\n\n/**\n * Create a new instance of `Snapdragon` with the given `options`.\n *\n * ```js\n * var snapdragon = new Snapdragon();\n * ```\n *\n * @param {Object} `options`\n * @api public\n */\n\nfunction Snapdragon(options) {\n Base.call(this, null, options);\n this.options = utils.extend({source: 'string'}, this.options);\n this.compiler = new Compiler(this.options);\n this.parser = new Parser(this.options);\n\n Object.defineProperty(this, 'compilers', {\n get: function() {\n return this.compiler.compilers;\n }\n });\n\n Object.defineProperty(this, 'parsers', {\n get: function() {\n return this.parser.parsers;\n }\n });\n\n Object.defineProperty(this, 'regex', {\n get: function() {\n return this.parser.regex;\n }\n });\n}\n\n/**\n * Inherit Base\n */\n\nBase.extend(Snapdragon);\n\n/**\n * Add a parser to `snapdragon.parsers` for capturing the given `type` using\n * the specified regex or parser function. A function is useful if you need\n * to customize how the token is created and/or have access to the parser\n * instance to check options, etc.\n *\n * ```js\n * snapdragon\n * .capture('slash', /^\\//)\n * .capture('dot', function() {\n * var pos = this.position();\n * var m = this.match(/^\\./);\n * if (!m) return;\n * return pos({\n * type: 'dot',\n * val: m[0]\n * });\n * });\n * ```\n * @param {String} `type`\n * @param {RegExp|Function} `regex`\n * @return {Object} Returns the parser instance for chaining\n * @api public\n */\n\nSnapdragon.prototype.capture = function() {\n return this.parser.capture.apply(this.parser, arguments);\n};\n\n/**\n * Register a plugin `fn`.\n *\n * ```js\n * var snapdragon = new Snapdgragon([options]);\n * snapdragon.use(function() {\n * console.log(this); //<= snapdragon instance\n * console.log(this.parser); //<= parser instance\n * console.log(this.compiler); //<= compiler instance\n * });\n * ```\n * @param {Object} `fn`\n * @api public\n */\n\nSnapdragon.prototype.use = function(fn) {\n fn.call(this, this);\n return this;\n};\n\n/**\n * Parse the given `str`.\n *\n * ```js\n * var snapdragon = new Snapdgragon([options]);\n * // register parsers\n * snapdragon.parser.use(function() {});\n *\n * // parse\n * var ast = snapdragon.parse('foo/bar');\n * console.log(ast);\n * ```\n * @param {String} `str`\n * @param {Object} `options` Set `options.sourcemap` to true to enable source maps.\n * @return {Object} Returns an AST.\n * @api public\n */\n\nSnapdragon.prototype.parse = function(str, options) {\n this.options = utils.extend({}, this.options, options);\n var parsed = this.parser.parse(str, this.options);\n\n // add non-enumerable parser reference\n define(parsed, 'parser', this.parser);\n return parsed;\n};\n\n/**\n * Compile the given `AST`.\n *\n * ```js\n * var snapdragon = new Snapdgragon([options]);\n * // register plugins\n * snapdragon.use(function() {});\n * // register parser plugins\n * snapdragon.parser.use(function() {});\n * // register compiler plugins\n * snapdragon.compiler.use(function() {});\n *\n * // parse\n * var ast = snapdragon.parse('foo/bar');\n *\n * // compile\n * var res = snapdragon.compile(ast);\n * console.log(res.output);\n * ```\n * @param {Object} `ast`\n * @param {Object} `options`\n * @return {Object} Returns an object with an `output` property with the rendered string.\n * @api public\n */\n\nSnapdragon.prototype.compile = function(ast, options) {\n this.options = utils.extend({}, this.options, options);\n var compiled = this.compiler.compile(ast, this.options);\n\n // add non-enumerable compiler reference\n define(compiled, 'compiler', this.compiler);\n return compiled;\n};\n\n/**\n * Expose `Snapdragon`\n */\n\nmodule.exports = Snapdragon;\n\n/**\n * Expose `Parser` and `Compiler`\n */\n\nmodule.exports.Compiler = Compiler;\nmodule.exports.Parser = Parser;\n", "'use strict';\n\nvar extend = require('extend-shallow');\nvar Snapdragon = require('snapdragon');\nvar compilers = require('./compilers');\nvar parsers = require('./parsers');\nvar utils = require('./utils');\n\n/**\n * Customize Snapdragon parser and renderer\n */\n\nfunction Braces(options) {\n this.options = extend({}, options);\n}\n\n/**\n * Initialize braces\n */\n\nBraces.prototype.init = function(options) {\n if (this.isInitialized) return;\n this.isInitialized = true;\n var opts = utils.createOptions({}, this.options, options);\n this.snapdragon = this.options.snapdragon || new Snapdragon(opts);\n this.compiler = this.snapdragon.compiler;\n this.parser = this.snapdragon.parser;\n\n compilers(this.snapdragon, opts);\n parsers(this.snapdragon, opts);\n\n /**\n * Call Snapdragon `.parse` method. When AST is returned, we check to\n * see if any unclosed braces are left on the stack and, if so, we iterate\n * over the stack and correct the AST so that compilers are called in the correct\n * order and unbalance braces are properly escaped.\n */\n\n utils.define(this.snapdragon, 'parse', function(pattern, options) {\n var parsed = Snapdragon.prototype.parse.apply(this, arguments);\n this.parser.ast.input = pattern;\n\n var stack = this.parser.stack;\n while (stack.length) {\n addParent({type: 'brace.close', val: ''}, stack.pop());\n }\n\n function addParent(node, parent) {\n utils.define(node, 'parent', parent);\n parent.nodes.push(node);\n }\n\n // add non-enumerable parser reference\n utils.define(parsed, 'parser', this.parser);\n return parsed;\n });\n};\n\n/**\n * Decorate `.parse` method\n */\n\nBraces.prototype.parse = function(ast, options) {\n if (ast && typeof ast === 'object' && ast.nodes) return ast;\n this.init(options);\n return this.snapdragon.parse(ast, options);\n};\n\n/**\n * Decorate `.compile` method\n */\n\nBraces.prototype.compile = function(ast, options) {\n if (typeof ast === 'string') {\n ast = this.parse(ast, options);\n } else {\n this.init(options);\n }\n return this.snapdragon.compile(ast, options);\n};\n\n/**\n * Expand\n */\n\nBraces.prototype.expand = function(pattern) {\n var ast = this.parse(pattern, {expand: true});\n return this.compile(ast, {expand: true});\n};\n\n/**\n * Optimize\n */\n\nBraces.prototype.optimize = function(pattern) {\n var ast = this.parse(pattern, {optimize: true});\n return this.compile(ast, {optimize: true});\n};\n\n/**\n * Expose `Braces`\n */\n\nmodule.exports = Braces;\n", "'use strict';\n\n/**\n * Module dependencies\n */\n\nvar toRegex = require('to-regex');\nvar unique = require('array-unique');\nvar extend = require('extend-shallow');\n\n/**\n * Local dependencies\n */\n\nvar compilers = require('./lib/compilers');\nvar parsers = require('./lib/parsers');\nvar Braces = require('./lib/braces');\nvar utils = require('./lib/utils');\nvar MAX_LENGTH = 1024 * 64;\nvar cache = {};\n\n/**\n * Convert the given `braces` pattern into a regex-compatible string. By default, only one string is generated for every input string. Set `options.expand` to true to return an array of patterns (similar to Bash or minimatch. Before using `options.expand`, it's recommended that you read the [performance notes](#performance)).\n *\n * ```js\n * var braces = require('braces');\n * console.log(braces('{a,b,c}'));\n * //=> ['(a|b|c)']\n *\n * console.log(braces('{a,b,c}', {expand: true}));\n * //=> ['a', 'b', 'c']\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {String}\n * @api public\n */\n\nfunction braces(pattern, options) {\n var key = utils.createKey(String(pattern), options);\n var arr = [];\n\n var disabled = options && options.cache === false;\n if (!disabled && cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n if (Array.isArray(pattern)) {\n for (var i = 0; i < pattern.length; i++) {\n arr.push.apply(arr, braces.create(pattern[i], options));\n }\n } else {\n arr = braces.create(pattern, options);\n }\n\n if (options && options.nodupes === true) {\n arr = unique(arr);\n }\n\n if (!disabled) {\n cache[key] = arr;\n }\n return arr;\n}\n\n/**\n * Expands a brace pattern into an array. This method is called by the main [braces](#braces) function when `options.expand` is true. Before using this method it's recommended that you read the [performance notes](#performance)) and advantages of using [.optimize](#optimize) instead.\n *\n * ```js\n * var braces = require('braces');\n * console.log(braces.expand('a/{b,c}/d'));\n * //=> ['a/b/d', 'a/c/d'];\n * ```\n * @param {String} `pattern` Brace pattern\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.expand = function(pattern, options) {\n return braces.create(pattern, extend({}, options, {expand: true}));\n};\n\n/**\n * Expands a brace pattern into a regex-compatible, optimized string. This method is called by the main [braces](#braces) function by default.\n *\n * ```js\n * var braces = require('braces');\n * console.log(braces.expand('a/{b,c}/d'));\n * //=> ['a/(b|c)/d']\n * ```\n * @param {String} `pattern` Brace pattern\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.optimize = function(pattern, options) {\n return braces.create(pattern, options);\n};\n\n/**\n * Processes a brace pattern and returns either an expanded array (if `options.expand` is true), a highly optimized regex-compatible string. This method is called by the main [braces](#braces) function.\n *\n * ```js\n * var braces = require('braces');\n * console.log(braces.create('user-{200..300}/project-{a,b,c}-{1..10}'))\n * //=> 'user-(20[0-9]|2[1-9][0-9]|300)/project-(a|b|c)-([1-9]|10)'\n * ```\n * @param {String} `pattern` Brace pattern\n * @param {Object} `options`\n * @return {Array} Returns an array of expanded values.\n * @api public\n */\n\nbraces.create = function(pattern, options) {\n if (typeof pattern !== 'string') {\n throw new TypeError('expected a string');\n }\n\n var maxLength = (options && options.maxLength) || MAX_LENGTH;\n if (pattern.length >= maxLength) {\n throw new Error('expected pattern to be less than ' + maxLength + ' characters');\n }\n\n function create() {\n if (pattern === '' || pattern.length < 3) {\n return [pattern];\n }\n\n if (utils.isEmptySets(pattern)) {\n return [];\n }\n\n if (utils.isQuotedString(pattern)) {\n return [pattern.slice(1, -1)];\n }\n\n var proto = new Braces(options);\n var result = !options || options.expand !== true\n ? proto.optimize(pattern, options)\n : proto.expand(pattern, options);\n\n // get the generated pattern(s)\n var arr = result.output;\n\n // filter out empty strings if specified\n if (options && options.noempty === true) {\n arr = arr.filter(Boolean);\n }\n\n // filter out duplicates if specified\n if (options && options.nodupes === true) {\n arr = unique(arr);\n }\n\n Object.defineProperty(arr, 'result', {\n enumerable: false,\n value: result\n });\n\n return arr;\n }\n\n return memoize('create', pattern, options, create);\n};\n\n/**\n * Create a regular expression from the given string `pattern`.\n *\n * ```js\n * var braces = require('braces');\n *\n * console.log(braces.makeRe('id-{200..300}'));\n * //=> /^(?:id-(20[0-9]|2[1-9][0-9]|300))$/\n * ```\n * @param {String} `pattern` The pattern to convert to regex.\n * @param {Object} `options`\n * @return {RegExp}\n * @api public\n */\n\nbraces.makeRe = function(pattern, options) {\n if (typeof pattern !== 'string') {\n throw new TypeError('expected a string');\n }\n\n var maxLength = (options && options.maxLength) || MAX_LENGTH;\n if (pattern.length >= maxLength) {\n throw new Error('expected pattern to be less than ' + maxLength + ' characters');\n }\n\n function makeRe() {\n var arr = braces(pattern, options);\n var opts = extend({strictErrors: false}, options);\n return toRegex(arr, opts);\n }\n\n return memoize('makeRe', pattern, options, makeRe);\n};\n\n/**\n * Parse the given `str` with the given `options`.\n *\n * ```js\n * var braces = require('braces');\n * var ast = braces.parse('a/{b,c}/d');\n * console.log(ast);\n * // { type: 'root',\n * // errors: [],\n * // input: 'a/{b,c}/d',\n * // nodes:\n * // [ { type: 'bos', val: '' },\n * // { type: 'text', val: 'a/' },\n * // { type: 'brace',\n * // nodes:\n * // [ { type: 'brace.open', val: '{' },\n * // { type: 'text', val: 'b,c' },\n * // { type: 'brace.close', val: '}' } ] },\n * // { type: 'text', val: '/d' },\n * // { type: 'eos', val: '' } ] }\n * ```\n * @param {String} `pattern` Brace pattern to parse\n * @param {Object} `options`\n * @return {Object} Returns an AST\n * @api public\n */\n\nbraces.parse = function(pattern, options) {\n var proto = new Braces(options);\n return proto.parse(pattern, options);\n};\n\n/**\n * Compile the given `ast` or string with the given `options`.\n *\n * ```js\n * var braces = require('braces');\n * var ast = braces.parse('a/{b,c}/d');\n * console.log(braces.compile(ast));\n * // { options: { source: 'string' },\n * // state: {},\n * // compilers:\n * // { eos: [Function],\n * // noop: [Function],\n * // bos: [Function],\n * // brace: [Function],\n * // 'brace.open': [Function],\n * // text: [Function],\n * // 'brace.close': [Function] },\n * // output: [ 'a/(b|c)/d' ],\n * // ast:\n * // { ... },\n * // parsingErrors: [] }\n * ```\n * @param {Object|String} `ast` AST from [.parse](#parse). If a string is passed it will be parsed first.\n * @param {Object} `options`\n * @return {Object} Returns an object that has an `output` property with the compiled string.\n * @api public\n */\n\nbraces.compile = function(ast, options) {\n var proto = new Braces(options);\n return proto.compile(ast, options);\n};\n\n/**\n * Clear the regex cache.\n *\n * ```js\n * braces.clearCache();\n * ```\n * @api public\n */\n\nbraces.clearCache = function() {\n cache = braces.cache = {};\n};\n\n/**\n * Memoize a generated regex or function. A unique key is generated\n * from the method name, pattern, and user-defined options. Set\n * options.memoize to false to disable.\n */\n\nfunction memoize(type, pattern, options, fn) {\n var key = utils.createKey(type + ':' + pattern, options);\n var disabled = options && options.cache === false;\n if (disabled) {\n braces.clearCache();\n return fn(pattern, options);\n }\n\n if (cache.hasOwnProperty(key)) {\n return cache[key];\n }\n\n var res = fn(pattern, options);\n cache[key] = res;\n return res;\n}\n\n/**\n * Expose `Braces` constructor and methods\n * @type {Function}\n */\n\nbraces.Braces = Braces;\nbraces.compilers = compilers;\nbraces.parsers = parsers;\nbraces.cache = cache;\n\n/**\n * Expose `braces`\n * @type {Function}\n */\n\nmodule.exports = braces;\n", "/*!\n * is-extendable <https://github.com/jonschlinkert/is-extendable>\n *\n * Copyright (c) 2015-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar isPlainObject = require('is-plain-object');\n\nmodule.exports = function isExtendable(val) {\n return isPlainObject(val) || typeof val === 'function' || Array.isArray(val);\n};\n", "'use strict';\n\nvar isExtendable = require('is-extendable');\nvar assignSymbols = require('assign-symbols');\n\nmodule.exports = Object.assign || function(obj/*, objects*/) {\n if (obj === null || typeof obj === 'undefined') {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n if (!isObject(obj)) {\n obj = {};\n }\n for (var i = 1; i < arguments.length; i++) {\n var val = arguments[i];\n if (isString(val)) {\n val = toObject(val);\n }\n if (isObject(val)) {\n assign(obj, val);\n assignSymbols(obj, val);\n }\n }\n return obj;\n};\n\nfunction assign(a, b) {\n for (var key in b) {\n if (hasOwn(b, key)) {\n a[key] = b[key];\n }\n }\n}\n\nfunction isString(val) {\n return (val && typeof val === 'string');\n}\n\nfunction toObject(str) {\n var obj = {};\n for (var i in str) {\n obj[i] = str[i];\n }\n return obj;\n}\n\nfunction isObject(val) {\n return (val && typeof val === 'object') || isExtendable(val);\n}\n\n/**\n * Returns true if the given `key` is an own property of `obj`.\n */\n\nfunction hasOwn(obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nfunction isEnum(obj, key) {\n return Object.prototype.propertyIsEnumerable.call(obj, key);\n}\n", "/*!\n * is-extendable <https://github.com/jonschlinkert/is-extendable>\n *\n * Copyright (c) 2015-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar isPlainObject = require('is-plain-object');\n\nmodule.exports = function isExtendable(val) {\n return isPlainObject(val) || typeof val === 'function' || Array.isArray(val);\n};\n", "'use strict';\n\nvar isExtendable = require('is-extendable');\nvar assignSymbols = require('assign-symbols');\n\nmodule.exports = Object.assign || function(obj/*, objects*/) {\n if (obj === null || typeof obj === 'undefined') {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n if (!isObject(obj)) {\n obj = {};\n }\n for (var i = 1; i < arguments.length; i++) {\n var val = arguments[i];\n if (isString(val)) {\n val = toObject(val);\n }\n if (isObject(val)) {\n assign(obj, val);\n assignSymbols(obj, val);\n }\n }\n return obj;\n};\n\nfunction assign(a, b) {\n for (var key in b) {\n if (hasOwn(b, key)) {\n a[key] = b[key];\n }\n }\n}\n\nfunction isString(val) {\n return (val && typeof val === 'string');\n}\n\nfunction toObject(str) {\n var obj = {};\n for (var i in str) {\n obj[i] = str[i];\n }\n return obj;\n}\n\nfunction isObject(val) {\n return (val && typeof val === 'object') || isExtendable(val);\n}\n\n/**\n * Returns true if the given `key` is an own property of `obj`.\n */\n\nfunction hasOwn(obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nfunction isEnum(obj, key) {\n return Object.prototype.propertyIsEnumerable.call(obj, key);\n}\n", "'use strict';\n\n/**\n* Nanomatch compilers\n*/\n\nmodule.exports = function(nanomatch, options) {\n function slash() {\n if (options && typeof options.slash === 'string') {\n return options.slash;\n }\n if (options && typeof options.slash === 'function') {\n return options.slash.call(nanomatch);\n }\n return '\\\\\\\\/';\n }\n\n function star() {\n if (options && typeof options.star === 'string') {\n return options.star;\n }\n if (options && typeof options.star === 'function') {\n return options.star.call(nanomatch);\n }\n return '[^' + slash() + ']*?';\n }\n\n var ast = nanomatch.ast = nanomatch.parser.ast;\n ast.state = nanomatch.parser.state;\n nanomatch.compiler.state = ast.state;\n nanomatch.compiler\n\n /**\n * Negation / escaping\n */\n\n .set('not', function(node) {\n var prev = this.prev();\n if (this.options.nonegate === true || prev.type !== 'bos') {\n return this.emit('\\\\' + node.val, node);\n }\n return this.emit(node.val, node);\n })\n .set('escape', function(node) {\n if (this.options.unescape && /^[-\\w_.]/.test(node.val)) {\n return this.emit(node.val, node);\n }\n return this.emit('\\\\' + node.val, node);\n })\n .set('quoted', function(node) {\n return this.emit(node.val, node);\n })\n\n /**\n * Regex\n */\n\n .set('dollar', function(node) {\n if (node.parent.type === 'bracket') {\n return this.emit(node.val, node);\n }\n return this.emit('\\\\' + node.val, node);\n })\n\n /**\n * Dot: \".\"\n */\n\n .set('dot', function(node) {\n if (node.dotfiles === true) this.dotfiles = true;\n return this.emit('\\\\' + node.val, node);\n })\n\n /**\n * Slashes: \"/\" and \"\\\"\n */\n\n .set('backslash', function(node) {\n return this.emit(node.val, node);\n })\n .set('slash', function(node, nodes, i) {\n var val = '[' + slash() + ']';\n var parent = node.parent;\n var prev = this.prev();\n\n // set \"node.hasSlash\" to true on all ancestor parens nodes\n while (parent.type === 'paren' && !parent.hasSlash) {\n parent.hasSlash = true;\n parent = parent.parent;\n }\n\n if (prev.addQmark) {\n val += '?';\n }\n\n // word boundary\n if (node.rest.slice(0, 2) === '\\\\b') {\n return this.emit(val, node);\n }\n\n // globstars\n if (node.parsed === '**' || node.parsed === './**') {\n this.output = '(?:' + this.output;\n return this.emit(val + ')?', node);\n }\n\n // negation\n if (node.parsed === '!**' && this.options.nonegate !== true) {\n return this.emit(val + '?\\\\b', node);\n }\n return this.emit(val, node);\n })\n\n /**\n * Square brackets\n */\n\n .set('bracket', function(node) {\n var close = node.close;\n var open = !node.escaped ? '[' : '\\\\[';\n var negated = node.negated;\n var inner = node.inner;\n var val = node.val;\n\n if (node.escaped === true) {\n inner = inner.replace(/\\\\?(\\W)/g, '\\\\$1');\n negated = '';\n }\n\n if (inner === ']-') {\n inner = '\\\\]\\\\-';\n }\n\n if (negated && inner.indexOf('.') === -1) {\n inner += '.';\n }\n if (negated && inner.indexOf('/') === -1) {\n inner += '/';\n }\n\n val = open + negated + inner + close;\n return this.emit(val, node);\n })\n\n /**\n * Square: \"[.]\" (only matches a single character in brackets)\n */\n\n .set('square', function(node) {\n var val = (/^\\W/.test(node.val) ? '\\\\' : '') + node.val;\n return this.emit(val, node);\n })\n\n /**\n * Question mark: \"?\"\n */\n\n .set('qmark', function(node) {\n var prev = this.prev();\n // don't use \"slash\" variable so that we always avoid\n // matching backslashes and slashes with a qmark\n var val = '[^.\\\\\\\\/]';\n if (this.options.dot || (prev.type !== 'bos' && prev.type !== 'slash')) {\n val = '[^\\\\\\\\/]';\n }\n\n if (node.parsed.slice(-1) === '(') {\n var ch = node.rest.charAt(0);\n if (ch === '!' || ch === '=' || ch === ':') {\n return this.emit(node.val, node);\n }\n }\n\n if (node.val.length > 1) {\n val += '{' + node.val.length + '}';\n }\n return this.emit(val, node);\n })\n\n /**\n * Plus\n */\n\n .set('plus', function(node) {\n var prev = node.parsed.slice(-1);\n if (prev === ']' || prev === ')') {\n return this.emit(node.val, node);\n }\n if (!this.output || (/[?*+]/.test(ch) && node.parent.type !== 'bracket')) {\n return this.emit('\\\\+', node);\n }\n var ch = this.output.slice(-1);\n if (/\\w/.test(ch) && !node.inside) {\n return this.emit('+\\\\+?', node);\n }\n return this.emit('+', node);\n })\n\n /**\n * globstar: '**'\n */\n\n .set('globstar', function(node, nodes, i) {\n if (!this.output) {\n this.state.leadingGlobstar = true;\n }\n\n var prev = this.prev();\n var before = this.prev(2);\n var next = this.next();\n var after = this.next(2);\n var type = prev.type;\n var val = node.val;\n\n if (prev.type === 'slash' && next.type === 'slash') {\n if (before.type === 'text') {\n this.output += '?';\n\n if (after.type !== 'text') {\n this.output += '\\\\b';\n }\n }\n }\n\n var parsed = node.parsed;\n if (parsed.charAt(0) === '!') {\n parsed = parsed.slice(1);\n }\n\n var isInside = node.isInside.paren || node.isInside.brace;\n if (parsed && type !== 'slash' && type !== 'bos' && !isInside) {\n val = star();\n } else {\n val = this.options.dot !== true\n ? '(?:(?!(?:[' + slash() + ']|^)\\\\.).)*?'\n : '(?:(?!(?:[' + slash() + ']|^)(?:\\\\.{1,2})($|[' + slash() + ']))(?!\\\\.{2}).)*?';\n }\n\n if ((type === 'slash' || type === 'bos') && this.options.dot !== true) {\n val = '(?!\\\\.)' + val;\n }\n\n if (prev.type === 'slash' && next.type === 'slash' && before.type !== 'text') {\n if (after.type === 'text' || after.type === 'star') {\n node.addQmark = true;\n }\n }\n\n if (this.options.capture) {\n val = '(' + val + ')';\n }\n\n return this.emit(val, node);\n })\n\n /**\n * Star: \"*\"\n */\n\n .set('star', function(node, nodes, i) {\n var prior = nodes[i - 2] || {};\n var prev = this.prev();\n var next = this.next();\n var type = prev.type;\n\n function isStart(n) {\n return n.type === 'bos' || n.type === 'slash';\n }\n\n if (this.output === '' && this.options.contains !== true) {\n this.output = '(?![' + slash() + '])';\n }\n\n if (type === 'bracket' && this.options.bash === false) {\n var str = next && next.type === 'bracket' ? star() : '*?';\n if (!prev.nodes || prev.nodes[1].type !== 'posix') {\n return this.emit(str, node);\n }\n }\n\n var prefix = !this.dotfiles && type !== 'text' && type !== 'escape'\n ? (this.options.dot ? '(?!(?:^|[' + slash() + '])\\\\.{1,2}(?:$|[' + slash() + ']))' : '(?!\\\\.)')\n : '';\n\n if (isStart(prev) || (isStart(prior) && type === 'not')) {\n if (prefix !== '(?!\\\\.)') {\n prefix += '(?!(\\\\.{2}|\\\\.[' + slash() + ']))(?=.)';\n } else {\n prefix += '(?=.)';\n }\n } else if (prefix === '(?!\\\\.)') {\n prefix = '';\n }\n\n if (prev.type === 'not' && prior.type === 'bos' && this.options.dot === true) {\n this.output = '(?!\\\\.)' + this.output;\n }\n\n var output = prefix + star();\n if (this.options.capture) {\n output = '(' + output + ')';\n }\n\n return this.emit(output, node);\n })\n\n /**\n * Text\n */\n\n .set('text', function(node) {\n return this.emit(node.val, node);\n })\n\n /**\n * End-of-string\n */\n\n .set('eos', function(node) {\n var prev = this.prev();\n var val = node.val;\n\n this.output = '(?:\\\\.[' + slash() + '](?=.))?' + this.output;\n if (this.state.metachar && prev.type !== 'qmark' && prev.type !== 'slash') {\n val += (this.options.contains ? '[' + slash() + ']?' : '(?:[' + slash() + ']|$)');\n }\n\n return this.emit(val, node);\n });\n\n /**\n * Allow custom compilers to be passed on options\n */\n\n if (options && typeof options.compilers === 'function') {\n options.compilers(nanomatch.compiler);\n }\n};\n\n", "'use strict';\n\nvar regexNot = require('regex-not');\nvar toRegex = require('to-regex');\n\n/**\n * Characters to use in negation regex (we want to \"not\" match\n * characters that are matched by other parsers)\n */\n\nvar cached;\nvar NOT_REGEX = '[\\\\[!*+?$^\"\\'.\\\\\\\\/]+';\nvar not = createTextRegex(NOT_REGEX);\n\n/**\n * Nanomatch parsers\n */\n\nmodule.exports = function(nanomatch, options) {\n var parser = nanomatch.parser;\n var opts = parser.options;\n\n parser.state = {\n slashes: 0,\n paths: []\n };\n\n parser.ast.state = parser.state;\n parser\n\n /**\n * Beginning-of-string\n */\n\n .capture('prefix', function() {\n if (this.parsed) return;\n var m = this.match(/^\\.[\\\\/]/);\n if (!m) return;\n this.state.strictOpen = !!this.options.strictOpen;\n this.state.addPrefix = true;\n })\n\n /**\n * Escape: \"\\\\.\"\n */\n\n .capture('escape', function() {\n if (this.isInside('bracket')) return;\n var pos = this.position();\n var m = this.match(/^(?:\\\\(.)|([$^]))/);\n if (!m) return;\n\n return pos({\n type: 'escape',\n val: m[2] || m[1]\n });\n })\n\n /**\n * Quoted strings\n */\n\n .capture('quoted', function() {\n var pos = this.position();\n var m = this.match(/^[\"']/);\n if (!m) return;\n\n var quote = m[0];\n if (this.input.indexOf(quote) === -1) {\n return pos({\n type: 'escape',\n val: quote\n });\n }\n\n var tok = advanceTo(this.input, quote);\n this.consume(tok.len);\n\n return pos({\n type: 'quoted',\n val: tok.esc\n });\n })\n\n /**\n * Negations: \"!\"\n */\n\n .capture('not', function() {\n var parsed = this.parsed;\n var pos = this.position();\n var m = this.match(this.notRegex || /^!+/);\n if (!m) return;\n var val = m[0];\n\n var isNegated = (val.length % 2) === 1;\n if (parsed === '' && !isNegated) {\n val = '';\n }\n\n // if nothing has been parsed, we know `!` is at the start,\n // so we need to wrap the result in a negation regex\n if (parsed === '' && isNegated && this.options.nonegate !== true) {\n this.bos.val = '(?!^(?:';\n this.append = ')$).*';\n val = '';\n }\n return pos({\n type: 'not',\n val: val\n });\n })\n\n /**\n * Dot: \".\"\n */\n\n .capture('dot', function() {\n var parsed = this.parsed;\n var pos = this.position();\n var m = this.match(/^\\.+/);\n if (!m) return;\n\n var val = m[0];\n this.state.dot = val === '.' && (parsed === '' || parsed.slice(-1) === '/');\n\n return pos({\n type: 'dot',\n dotfiles: this.state.dot,\n val: val\n });\n })\n\n /**\n * Plus: \"+\"\n */\n\n .capture('plus', /^\\+(?!\\()/)\n\n /**\n * Question mark: \"?\"\n */\n\n .capture('qmark', function() {\n var parsed = this.parsed;\n var pos = this.position();\n var m = this.match(/^\\?+(?!\\()/);\n if (!m) return;\n\n this.state.metachar = true;\n this.state.qmark = true;\n\n return pos({\n type: 'qmark',\n parsed: parsed,\n val: m[0]\n });\n })\n\n /**\n * Globstar: \"**\"\n */\n\n .capture('globstar', function() {\n var parsed = this.parsed;\n var pos = this.position();\n var m = this.match(/^\\*{2}(?![*(])(?=[,)/]|$)/);\n if (!m) return;\n\n var type = opts.noglobstar !== true ? 'globstar' : 'star';\n var node = pos({type: type, parsed: parsed});\n this.state.metachar = true;\n\n while (this.input.slice(0, 4) === '/**/') {\n this.input = this.input.slice(3);\n }\n\n node.isInside = {\n brace: this.isInside('brace'),\n paren: this.isInside('paren')\n };\n\n if (type === 'globstar') {\n this.state.globstar = true;\n node.val = '**';\n\n } else {\n this.state.star = true;\n node.val = '*';\n }\n\n return node;\n })\n\n /**\n * Star: \"*\"\n */\n\n .capture('star', function() {\n var pos = this.position();\n var starRe = /^(?:\\*(?![*(])|[*]{3,}(?!\\()|[*]{2}(?![(/]|$)|\\*(?=\\*\\())/;\n var m = this.match(starRe);\n if (!m) return;\n\n this.state.metachar = true;\n this.state.star = true;\n return pos({\n type: 'star',\n val: m[0]\n });\n })\n\n /**\n * Slash: \"/\"\n */\n\n .capture('slash', function() {\n var pos = this.position();\n var m = this.match(/^\\//);\n if (!m) return;\n\n this.state.slashes++;\n return pos({\n type: 'slash',\n val: m[0]\n });\n })\n\n /**\n * Backslash: \"\\\\\"\n */\n\n .capture('backslash', function() {\n var pos = this.position();\n var m = this.match(/^\\\\(?![*+?(){}[\\]'\"])/);\n if (!m) return;\n\n var val = m[0];\n\n if (this.isInside('bracket')) {\n val = '\\\\';\n } else if (val.length > 1) {\n val = '\\\\\\\\';\n }\n\n return pos({\n type: 'backslash',\n val: val\n });\n })\n\n /**\n * Square: \"[.]\"\n */\n\n .capture('square', function() {\n if (this.isInside('bracket')) return;\n var pos = this.position();\n var m = this.match(/^\\[([^!^\\\\])\\]/);\n if (!m) return;\n\n return pos({\n type: 'square',\n val: m[1]\n });\n })\n\n /**\n * Brackets: \"[...]\" (basic, this can be overridden by other parsers)\n */\n\n .capture('bracket', function() {\n var pos = this.position();\n var m = this.match(/^(?:\\[([!^]?)([^\\]]+|\\]-)(\\]|[^*+?]+)|\\[)/);\n if (!m) return;\n\n var val = m[0];\n var negated = m[1] ? '^' : '';\n var inner = (m[2] || '').replace(/\\\\\\\\+/, '\\\\\\\\');\n var close = m[3] || '';\n\n if (m[2] && inner.length < m[2].length) {\n val = val.replace(/\\\\\\\\+/, '\\\\\\\\');\n }\n\n var esc = this.input.slice(0, 2);\n if (inner === '' && esc === '\\\\]') {\n inner += esc;\n this.consume(2);\n\n var str = this.input;\n var idx = -1;\n var ch;\n\n while ((ch = str[++idx])) {\n this.consume(1);\n if (ch === ']') {\n close = ch;\n break;\n }\n inner += ch;\n }\n }\n\n return pos({\n type: 'bracket',\n val: val,\n escaped: close !== ']',\n negated: negated,\n inner: inner,\n close: close\n });\n })\n\n /**\n * Text\n */\n\n .capture('text', function() {\n if (this.isInside('bracket')) return;\n var pos = this.position();\n var m = this.match(not);\n if (!m || !m[0]) return;\n\n return pos({\n type: 'text',\n val: m[0]\n });\n });\n\n /**\n * Allow custom parsers to be passed on options\n */\n\n if (options && typeof options.parsers === 'function') {\n options.parsers(nanomatch.parser);\n }\n};\n\n/**\n * Advance to the next non-escaped character\n */\n\nfunction advanceTo(input, endChar) {\n var ch = input.charAt(0);\n var tok = { len: 1, val: '', esc: '' };\n var idx = 0;\n\n function advance() {\n if (ch !== '\\\\') {\n tok.esc += '\\\\' + ch;\n tok.val += ch;\n }\n\n ch = input.charAt(++idx);\n tok.len++;\n\n if (ch === '\\\\') {\n advance();\n advance();\n }\n }\n\n while (ch && ch !== endChar) {\n advance();\n }\n return tok;\n}\n\n/**\n * Create text regex\n */\n\nfunction createTextRegex(pattern) {\n if (cached) return cached;\n var opts = {contains: true, strictClose: false};\n var not = regexNot.create(pattern, opts);\n var re = toRegex('^(?:[*]\\\\((?=.)|' + not + ')', opts);\n return (cached = re);\n}\n\n/**\n * Expose negation string\n */\n\nmodule.exports.not = NOT_REGEX;\n", "/*!\n * fragment-cache <https://github.com/jonschlinkert/fragment-cache>\n *\n * Copyright (c) 2016-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar MapCache = require('map-cache');\n\n/**\n * Create a new `FragmentCache` with an optional object to use for `caches`.\n *\n * ```js\n * var fragment = new FragmentCache();\n * ```\n * @name FragmentCache\n * @param {String} `cacheName`\n * @return {Object} Returns the [map-cache][] instance.\n * @api public\n */\n\nfunction FragmentCache(caches) {\n this.caches = caches || {};\n}\n\n/**\n * Prototype\n */\n\nFragmentCache.prototype = {\n\n /**\n * Get cache `name` from the `fragment.caches` object. Creates a new\n * `MapCache` if it doesn't already exist.\n *\n * ```js\n * var cache = fragment.cache('files');\n * console.log(fragment.caches.hasOwnProperty('files'));\n * //=> true\n * ```\n * @name .cache\n * @param {String} `cacheName`\n * @return {Object} Returns the [map-cache][] instance.\n * @api public\n */\n\n cache: function(cacheName) {\n return this.caches[cacheName] || (this.caches[cacheName] = new MapCache());\n },\n\n /**\n * Set a value for property `key` on cache `name`\n *\n * ```js\n * fragment.set('files', 'somefile.js', new File({path: 'somefile.js'}));\n * ```\n * @name .set\n * @param {String} `name`\n * @param {String} `key` Property name to set\n * @param {any} `val` The value of `key`\n * @return {Object} The cache instance for chaining\n * @api public\n */\n\n set: function(cacheName, key, val) {\n var cache = this.cache(cacheName);\n cache.set(key, val);\n return cache;\n },\n\n /**\n * Returns true if a non-undefined value is set for `key` on fragment cache `name`.\n *\n * ```js\n * var cache = fragment.cache('files');\n * cache.set('somefile.js');\n *\n * console.log(cache.has('somefile.js'));\n * //=> true\n *\n * console.log(cache.has('some-other-file.js'));\n * //=> false\n * ```\n * @name .has\n * @param {String} `name` Cache name\n * @param {String} `key` Optionally specify a property to check for on cache `name`\n * @return {Boolean}\n * @api public\n */\n\n has: function(cacheName, key) {\n return typeof this.get(cacheName, key) !== 'undefined';\n },\n\n /**\n * Get `name`, or if specified, the value of `key`. Invokes the [cache]() method,\n * so that cache `name` will be created it doesn't already exist. If `key` is not passed,\n * the entire cache (`name`) is returned.\n *\n * ```js\n * var Vinyl = require('vinyl');\n * var cache = fragment.cache('files');\n * cache.set('somefile.js', new Vinyl({path: 'somefile.js'}));\n * console.log(cache.get('somefile.js'));\n * //=> <File \"somefile.js\">\n * ```\n * @name .get\n * @param {String} `name`\n * @return {Object} Returns cache `name`, or the value of `key` if specified\n * @api public\n */\n\n get: function(name, key) {\n var cache = this.cache(name);\n if (typeof key === 'string') {\n return cache.get(key);\n }\n return cache;\n }\n};\n\n/**\n * Expose `FragmentCache`\n */\n\nexports = module.exports = FragmentCache;\n", "module.exports = new (require('fragment-cache'))();\n", "/*!\n * is-windows <https://github.com/jonschlinkert/is-windows>\n *\n * Copyright \u00A9 2015-2018, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n(function(factory) {\n if (exports && typeof exports === 'object' && typeof module !== 'undefined') {\n module.exports = factory();\n } else if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else if (typeof window !== 'undefined') {\n window.isWindows = factory();\n } else if (typeof global !== 'undefined') {\n global.isWindows = factory();\n } else if (typeof self !== 'undefined') {\n self.isWindows = factory();\n } else {\n this.isWindows = factory();\n }\n})(function() {\n 'use strict';\n return function isWindows() {\n return process && (process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE));\n };\n});\n", "/*!\n * define-property <https://github.com/jonschlinkert/define-property>\n *\n * Copyright (c) 2015-2018, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar isobject = require('isobject');\nvar isDescriptor = require('is-descriptor');\nvar define = (typeof Reflect !== 'undefined' && Reflect.defineProperty)\n ? Reflect.defineProperty\n : Object.defineProperty;\n\nmodule.exports = function defineProperty(obj, key, val) {\n if (!isobject(obj) && typeof obj !== 'function' && !Array.isArray(obj)) {\n throw new TypeError('expected an object, function, or array');\n }\n\n if (typeof key !== 'string') {\n throw new TypeError('expected \"key\" to be a string');\n }\n\n if (isDescriptor(val)) {\n define(obj, key, val);\n return obj;\n }\n\n define(obj, key, {\n configurable: true,\n enumerable: false,\n writable: true,\n value: val\n });\n\n return obj;\n};\n", "/*!\n * arr-diff <https://github.com/jonschlinkert/arr-diff>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function diff(arr/*, arrays*/) {\n var len = arguments.length;\n var idx = 0;\n while (++idx < len) {\n arr = diffArray(arr, arguments[idx]);\n }\n return arr;\n};\n\nfunction diffArray(one, two) {\n if (!Array.isArray(two)) {\n return one.slice();\n }\n\n var tlen = two.length\n var olen = one.length;\n var idx = -1;\n var arr = [];\n\n while (++idx < olen) {\n var ele = one[idx];\n\n var hasEle = false;\n for (var i = 0; i < tlen; i++) {\n var val = two[i];\n\n if (ele === val) {\n hasEle = true;\n break;\n }\n }\n\n if (hasEle === false) {\n arr.push(ele);\n }\n }\n return arr;\n}\n", "/*!\n * object.pick <https://github.com/jonschlinkert/object.pick>\n *\n * Copyright (c) 2014-2015 Jon Schlinkert, contributors.\n * Licensed under the MIT License\n */\n\n'use strict';\n\nvar isObject = require('isobject');\n\nmodule.exports = function pick(obj, keys) {\n if (!isObject(obj) && typeof obj !== 'function') {\n return {};\n }\n\n var res = {};\n if (typeof keys === 'string') {\n if (keys in obj) {\n res[keys] = obj[keys];\n }\n return res;\n }\n\n var len = keys.length;\n var idx = -1;\n\n while (++idx < len) {\n var key = keys[idx];\n if (key in obj) {\n res[key] = obj[key];\n }\n }\n return res;\n};\n", "var toString = Object.prototype.toString;\n\nmodule.exports = function kindOf(val) {\n if (val === void 0) return 'undefined';\n if (val === null) return 'null';\n\n var type = typeof val;\n if (type === 'boolean') return 'boolean';\n if (type === 'string') return 'string';\n if (type === 'number') return 'number';\n if (type === 'symbol') return 'symbol';\n if (type === 'function') {\n return isGeneratorFn(val) ? 'generatorfunction' : 'function';\n }\n\n if (isArray(val)) return 'array';\n if (isBuffer(val)) return 'buffer';\n if (isArguments(val)) return 'arguments';\n if (isDate(val)) return 'date';\n if (isError(val)) return 'error';\n if (isRegexp(val)) return 'regexp';\n\n switch (ctorName(val)) {\n case 'Symbol': return 'symbol';\n case 'Promise': return 'promise';\n\n // Set, Map, WeakSet, WeakMap\n case 'WeakMap': return 'weakmap';\n case 'WeakSet': return 'weakset';\n case 'Map': return 'map';\n case 'Set': return 'set';\n\n // 8-bit typed arrays\n case 'Int8Array': return 'int8array';\n case 'Uint8Array': return 'uint8array';\n case 'Uint8ClampedArray': return 'uint8clampedarray';\n\n // 16-bit typed arrays\n case 'Int16Array': return 'int16array';\n case 'Uint16Array': return 'uint16array';\n\n // 32-bit typed arrays\n case 'Int32Array': return 'int32array';\n case 'Uint32Array': return 'uint32array';\n case 'Float32Array': return 'float32array';\n case 'Float64Array': return 'float64array';\n }\n\n if (isGeneratorObj(val)) {\n return 'generator';\n }\n\n // Non-plain objects\n type = toString.call(val);\n switch (type) {\n case '[object Object]': return 'object';\n // iterators\n case '[object Map Iterator]': return 'mapiterator';\n case '[object Set Iterator]': return 'setiterator';\n case '[object String Iterator]': return 'stringiterator';\n case '[object Array Iterator]': return 'arrayiterator';\n }\n\n // other\n return type.slice(8, -1).toLowerCase().replace(/\\s/g, '');\n};\n\nfunction ctorName(val) {\n return val.constructor ? val.constructor.name : null;\n}\n\nfunction isArray(val) {\n if (Array.isArray) return Array.isArray(val);\n return val instanceof Array;\n}\n\nfunction isError(val) {\n return val instanceof Error || (typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number');\n}\n\nfunction isDate(val) {\n if (val instanceof Date) return true;\n return typeof val.toDateString === 'function'\n && typeof val.getDate === 'function'\n && typeof val.setDate === 'function';\n}\n\nfunction isRegexp(val) {\n if (val instanceof RegExp) return true;\n return typeof val.flags === 'string'\n && typeof val.ignoreCase === 'boolean'\n && typeof val.multiline === 'boolean'\n && typeof val.global === 'boolean';\n}\n\nfunction isGeneratorFn(name, val) {\n return ctorName(name) === 'GeneratorFunction';\n}\n\nfunction isGeneratorObj(val) {\n return typeof val.throw === 'function'\n && typeof val.return === 'function'\n && typeof val.next === 'function';\n}\n\nfunction isArguments(val) {\n try {\n if (typeof val.length === 'number' && typeof val.callee === 'function') {\n return true;\n }\n } catch (err) {\n if (err.message.indexOf('callee') !== -1) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * If you need to support Safari 5-7 (8-10 yr-old browser),\n * take a look at https://github.com/feross/is-buffer\n */\n\nfunction isBuffer(val) {\n if (val.constructor && typeof val.constructor.isBuffer === 'function') {\n return val.constructor.isBuffer(val);\n }\n return false;\n}\n", "'use strict';\n\nvar utils = module.exports;\nvar path = require('path');\n\n/**\n * Module dependencies\n */\n\nvar isWindows = require('is-windows')();\nvar Snapdragon = require('snapdragon');\nutils.define = require('define-property');\nutils.diff = require('arr-diff');\nutils.extend = require('extend-shallow');\nutils.pick = require('object.pick');\nutils.typeOf = require('kind-of');\nutils.unique = require('array-unique');\n\n/**\n * Returns true if the given value is effectively an empty string\n */\n\nutils.isEmptyString = function(val) {\n return String(val) === '' || String(val) === './';\n};\n\n/**\n * Returns true if the platform is windows, or `path.sep` is `\\\\`.\n * This is defined as a function to allow `path.sep` to be set in unit tests,\n * or by the user, if there is a reason to do so.\n * @return {Boolean}\n */\n\nutils.isWindows = function() {\n return path.sep === '\\\\' || isWindows === true;\n};\n\n/**\n * Return the last element from an array\n */\n\nutils.last = function(arr, n) {\n return arr[arr.length - (n || 1)];\n};\n\n/**\n * Get the `Snapdragon` instance to use\n */\n\nutils.instantiate = function(ast, options) {\n var snapdragon;\n // if an instance was created by `.parse`, use that instance\n if (utils.typeOf(ast) === 'object' && ast.snapdragon) {\n snapdragon = ast.snapdragon;\n // if the user supplies an instance on options, use that instance\n } else if (utils.typeOf(options) === 'object' && options.snapdragon) {\n snapdragon = options.snapdragon;\n // create a new instance\n } else {\n snapdragon = new Snapdragon(options);\n }\n\n utils.define(snapdragon, 'parse', function(str, options) {\n var parsed = Snapdragon.prototype.parse.call(this, str, options);\n parsed.input = str;\n\n // escape unmatched brace/bracket/parens\n var last = this.parser.stack.pop();\n if (last && this.options.strictErrors !== true) {\n var open = last.nodes[0];\n var inner = last.nodes[1];\n if (last.type === 'bracket') {\n if (inner.val.charAt(0) === '[') {\n inner.val = '\\\\' + inner.val;\n }\n\n } else {\n open.val = '\\\\' + open.val;\n var sibling = open.parent.nodes[1];\n if (sibling.type === 'star') {\n sibling.loose = true;\n }\n }\n }\n\n // add non-enumerable parser reference\n utils.define(parsed, 'parser', this.parser);\n return parsed;\n });\n\n return snapdragon;\n};\n\n/**\n * Create the key to use for memoization. The key is generated\n * by iterating over the options and concatenating key-value pairs\n * to the pattern string.\n */\n\nutils.createKey = function(pattern, options) {\n if (typeof options === 'undefined') {\n return pattern;\n }\n var key = pattern;\n for (var prop in options) {\n if (options.hasOwnProperty(prop)) {\n key += ';' + prop + '=' + String(options[prop]);\n }\n }\n return key;\n};\n\n/**\n * Cast `val` to an array\n * @return {Array}\n */\n\nutils.arrayify = function(val) {\n if (typeof val === 'string') return [val];\n return val ? (Array.isArray(val) ? val : [val]) : [];\n};\n\n/**\n * Return true if `val` is a non-empty string\n */\n\nutils.isString = function(val) {\n return typeof val === 'string';\n};\n\n/**\n * Return true if `val` is a non-empty string\n */\n\nutils.isRegex = function(val) {\n return utils.typeOf(val) === 'regexp';\n};\n\n/**\n * Return true if `val` is a non-empty string\n */\n\nutils.isObject = function(val) {\n return utils.typeOf(val) === 'object';\n};\n\n/**\n * Escape regex characters in the given string\n */\n\nutils.escapeRegex = function(str) {\n return str.replace(/[-[\\]{}()^$|*+?.\\\\/\\s]/g, '\\\\$&');\n};\n\n/**\n * Combines duplicate characters in the provided `input` string.\n * @param {String} `input`\n * @returns {String}\n */\n\nutils.combineDupes = function(input, patterns) {\n patterns = utils.arrayify(patterns).join('|').split('|');\n patterns = patterns.map(function(s) {\n return s.replace(/\\\\?([+*\\\\/])/g, '\\\\$1');\n });\n var substr = patterns.join('|');\n var regex = new RegExp('(' + substr + ')(?=\\\\1)', 'g');\n return input.replace(regex, '');\n};\n\n/**\n * Returns true if the given `str` has special characters\n */\n\nutils.hasSpecialChars = function(str) {\n return /(?:(?:(^|\\/)[!.])|[*?+()|[\\]{}]|[+@]\\()/.test(str);\n};\n\n/**\n * Normalize slashes in the given filepath.\n *\n * @param {String} `filepath`\n * @return {String}\n */\n\nutils.toPosixPath = function(str) {\n return str.replace(/\\\\+/g, '/');\n};\n\n/**\n * Strip backslashes before special characters in a string.\n *\n * @param {String} `str`\n * @return {String}\n */\n\nutils.unescape = function(str) {\n return utils.toPosixPath(str.replace(/\\\\(?=[*+?!.])/g, ''));\n};\n\n/**\n * Strip the drive letter from a windows filepath\n * @param {String} `fp`\n * @return {String}\n */\n\nutils.stripDrive = function(fp) {\n return utils.isWindows() ? fp.replace(/^[a-z]:[\\\\/]+?/i, '/') : fp;\n};\n\n/**\n * Strip the prefix from a filepath\n * @param {String} `fp`\n * @return {String}\n */\n\nutils.stripPrefix = function(str) {\n if (str.charAt(0) === '.' && (str.charAt(1) === '/' || str.charAt(1) === '\\\\')) {\n return str.slice(2);\n }\n return str;\n};\n\n/**\n * Returns true if `str` is a common character that doesn't need\n * to be processed to be used for matching.\n * @param {String} `str`\n * @return {Boolean}\n */\n\nutils.isSimpleChar = function(str) {\n return str.trim() === '' || str === '.';\n};\n\n/**\n * Returns true if the given str is an escaped or\n * unescaped path character\n */\n\nutils.isSlash = function(str) {\n return str === '/' || str === '\\\\/' || str === '\\\\' || str === '\\\\\\\\';\n};\n\n/**\n * Returns a function that returns true if the given\n * pattern matches or contains a `filepath`\n *\n * @param {String} `pattern`\n * @return {Function}\n */\n\nutils.matchPath = function(pattern, options) {\n return (options && options.contains)\n ? utils.containsPattern(pattern, options)\n : utils.equalsPattern(pattern, options);\n};\n\n/**\n * Returns true if the given (original) filepath or unixified path are equal\n * to the given pattern.\n */\n\nutils._equals = function(filepath, unixPath, pattern) {\n return pattern === filepath || pattern === unixPath;\n};\n\n/**\n * Returns true if the given (original) filepath or unixified path contain\n * the given pattern.\n */\n\nutils._contains = function(filepath, unixPath, pattern) {\n return filepath.indexOf(pattern) !== -1 || unixPath.indexOf(pattern) !== -1;\n};\n\n/**\n * Returns a function that returns true if the given\n * pattern is the same as a given `filepath`\n *\n * @param {String} `pattern`\n * @return {Function}\n */\n\nutils.equalsPattern = function(pattern, options) {\n var unixify = utils.unixify(options);\n options = options || {};\n\n return function fn(filepath) {\n var equal = utils._equals(filepath, unixify(filepath), pattern);\n if (equal === true || options.nocase !== true) {\n return equal;\n }\n var lower = filepath.toLowerCase();\n return utils._equals(lower, unixify(lower), pattern);\n };\n};\n\n/**\n * Returns a function that returns true if the given\n * pattern contains a `filepath`\n *\n * @param {String} `pattern`\n * @return {Function}\n */\n\nutils.containsPattern = function(pattern, options) {\n var unixify = utils.unixify(options);\n options = options || {};\n\n return function(filepath) {\n var contains = utils._contains(filepath, unixify(filepath), pattern);\n if (contains === true || options.nocase !== true) {\n return contains;\n }\n var lower = filepath.toLowerCase();\n return utils._contains(lower, unixify(lower), pattern);\n };\n};\n\n/**\n * Returns a function that returns true if the given\n * regex matches the `filename` of a file path.\n *\n * @param {RegExp} `re` Matching regex\n * @return {Function}\n */\n\nutils.matchBasename = function(re) {\n return function(filepath) {\n return re.test(filepath) || re.test(path.basename(filepath));\n };\n};\n\n/**\n * Returns the given value unchanced.\n * @return {any}\n */\n\nutils.identity = function(val) {\n return val;\n};\n\n/**\n * Determines the filepath to return based on the provided options.\n * @return {any}\n */\n\nutils.value = function(str, unixify, options) {\n if (options && options.unixify === false) {\n return str;\n }\n if (options && typeof options.unixify === 'function') {\n return options.unixify(str);\n }\n return unixify(str);\n};\n\n/**\n * Returns a function that normalizes slashes in a string to forward\n * slashes, strips `./` from beginning of paths, and optionally unescapes\n * special characters.\n * @return {Function}\n */\n\nutils.unixify = function(options) {\n var opts = options || {};\n return function(filepath) {\n if (opts.stripPrefix !== false) {\n filepath = utils.stripPrefix(filepath);\n }\n if (opts.unescape === true) {\n filepath = utils.unescape(filepath);\n }\n if (opts.unixify === true || utils.isWindows()) {\n filepath = utils.toPosixPath(filepath);\n }\n return filepath;\n };\n};\n", "'use strict';\n\n/**\n * Module dependencies\n */\n\nvar util = require('util');\nvar toRegex = require('to-regex');\nvar extend = require('extend-shallow');\n\n/**\n * Local dependencies\n */\n\nvar compilers = require('./lib/compilers');\nvar parsers = require('./lib/parsers');\nvar cache = require('./lib/cache');\nvar utils = require('./lib/utils');\nvar MAX_LENGTH = 1024 * 64;\n\n/**\n * The main function takes a list of strings and one or more\n * glob patterns to use for matching.\n *\n * ```js\n * var nm = require('nanomatch');\n * nm(list, patterns[, options]);\n *\n * console.log(nm(['a.js', 'a.txt'], ['*.js']));\n * //=> [ 'a.js' ]\n * ```\n * @param {Array} `list` A list of strings to match\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Array} Returns an array of matches\n * @summary false\n * @api public\n */\n\nfunction nanomatch(list, patterns, options) {\n patterns = utils.arrayify(patterns);\n list = utils.arrayify(list);\n\n var len = patterns.length;\n if (list.length === 0 || len === 0) {\n return [];\n }\n\n if (len === 1) {\n return nanomatch.match(list, patterns[0], options);\n }\n\n var negated = false;\n var omit = [];\n var keep = [];\n var idx = -1;\n\n while (++idx < len) {\n var pattern = patterns[idx];\n\n if (typeof pattern === 'string' && pattern.charCodeAt(0) === 33 /* ! */) {\n omit.push.apply(omit, nanomatch.match(list, pattern.slice(1), options));\n negated = true;\n } else {\n keep.push.apply(keep, nanomatch.match(list, pattern, options));\n }\n }\n\n // minimatch.match parity\n if (negated && keep.length === 0) {\n if (options && options.unixify === false) {\n keep = list.slice();\n } else {\n var unixify = utils.unixify(options);\n for (var i = 0; i < list.length; i++) {\n keep.push(unixify(list[i]));\n }\n }\n }\n\n var matches = utils.diff(keep, omit);\n if (!options || options.nodupes !== false) {\n return utils.unique(matches);\n }\n\n return matches;\n}\n\n/**\n * Similar to the main function, but `pattern` must be a string.\n *\n * ```js\n * var nm = require('nanomatch');\n * nm.match(list, pattern[, options]);\n *\n * console.log(nm.match(['a.a', 'a.aa', 'a.b', 'a.c'], '*.a'));\n * //=> ['a.a', 'a.aa']\n * ```\n * @param {Array} `list` Array of strings to match\n * @param {String} `pattern` Glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Array} Returns an array of matches\n * @api public\n */\n\nnanomatch.match = function(list, pattern, options) {\n if (Array.isArray(pattern)) {\n throw new TypeError('expected pattern to be a string');\n }\n\n var unixify = utils.unixify(options);\n var isMatch = memoize('match', pattern, options, nanomatch.matcher);\n var matches = [];\n\n list = utils.arrayify(list);\n var len = list.length;\n var idx = -1;\n\n while (++idx < len) {\n var ele = list[idx];\n if (ele === pattern || isMatch(ele)) {\n matches.push(utils.value(ele, unixify, options));\n }\n }\n\n // if no options were passed, uniquify results and return\n if (typeof options === 'undefined') {\n return utils.unique(matches);\n }\n\n if (matches.length === 0) {\n if (options.failglob === true) {\n throw new Error('no matches found for \"' + pattern + '\"');\n }\n if (options.nonull === true || options.nullglob === true) {\n return [options.unescape ? utils.unescape(pattern) : pattern];\n }\n }\n\n // if `opts.ignore` was defined, diff ignored list\n if (options.ignore) {\n matches = nanomatch.not(matches, options.ignore, options);\n }\n\n return options.nodupes !== false ? utils.unique(matches) : matches;\n};\n\n/**\n * Returns true if the specified `string` matches the given glob `pattern`.\n *\n * ```js\n * var nm = require('nanomatch');\n * nm.isMatch(string, pattern[, options]);\n *\n * console.log(nm.isMatch('a.a', '*.a'));\n * //=> true\n * console.log(nm.isMatch('a.b', '*.a'));\n * //=> false\n * ```\n * @param {String} `string` String to match\n * @param {String} `pattern` Glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if the string matches the glob pattern.\n * @api public\n */\n\nnanomatch.isMatch = function(str, pattern, options) {\n if (typeof str !== 'string') {\n throw new TypeError('expected a string: \"' + util.inspect(str) + '\"');\n }\n\n if (utils.isEmptyString(str) || utils.isEmptyString(pattern)) {\n return false;\n }\n\n var equals = utils.equalsPattern(options);\n if (equals(str)) {\n return true;\n }\n\n var isMatch = memoize('isMatch', pattern, options, nanomatch.matcher);\n return isMatch(str);\n};\n\n/**\n * Returns true if some of the elements in the given `list` match any of the\n * given glob `patterns`.\n *\n * ```js\n * var nm = require('nanomatch');\n * nm.some(list, patterns[, options]);\n *\n * console.log(nm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js']));\n * // true\n * console.log(nm.some(['foo.js'], ['*.js', '!foo.js']));\n * // false\n * ```\n * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nnanomatch.some = function(list, patterns, options) {\n if (typeof list === 'string') {\n list = [list];\n }\n\n for (var i = 0; i < list.length; i++) {\n if (nanomatch(list[i], patterns, options).length === 1) {\n return true;\n }\n }\n\n return false;\n};\n\n/**\n * Returns true if every element in the given `list` matches\n * at least one of the given glob `patterns`.\n *\n * ```js\n * var nm = require('nanomatch');\n * nm.every(list, patterns[, options]);\n *\n * console.log(nm.every('foo.js', ['foo.js']));\n * // true\n * console.log(nm.every(['foo.js', 'bar.js'], ['*.js']));\n * // true\n * console.log(nm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js']));\n * // false\n * console.log(nm.every(['foo.js'], ['*.js', '!foo.js']));\n * // false\n * ```\n * @param {String|Array} `list` The string or array of strings to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nnanomatch.every = function(list, patterns, options) {\n if (typeof list === 'string') {\n list = [list];\n }\n\n for (var i = 0; i < list.length; i++) {\n if (nanomatch(list[i], patterns, options).length !== 1) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * Returns true if **any** of the given glob `patterns`\n * match the specified `string`.\n *\n * ```js\n * var nm = require('nanomatch');\n * nm.any(string, patterns[, options]);\n *\n * console.log(nm.any('a.a', ['b.*', '*.a']));\n * //=> true\n * console.log(nm.any('a.a', 'b.*'));\n * //=> false\n * ```\n * @param {String|Array} `str` The string to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nnanomatch.any = function(str, patterns, options) {\n if (typeof str !== 'string') {\n throw new TypeError('expected a string: \"' + util.inspect(str) + '\"');\n }\n\n if (utils.isEmptyString(str) || utils.isEmptyString(patterns)) {\n return false;\n }\n\n if (typeof patterns === 'string') {\n patterns = [patterns];\n }\n\n for (var i = 0; i < patterns.length; i++) {\n if (nanomatch.isMatch(str, patterns[i], options)) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * Returns true if **all** of the given `patterns`\n * match the specified string.\n *\n * ```js\n * var nm = require('nanomatch');\n * nm.all(string, patterns[, options]);\n *\n * console.log(nm.all('foo.js', ['foo.js']));\n * // true\n *\n * console.log(nm.all('foo.js', ['*.js', '!foo.js']));\n * // false\n *\n * console.log(nm.all('foo.js', ['*.js', 'foo.js']));\n * // true\n *\n * console.log(nm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js']));\n * // true\n * ```\n * @param {String|Array} `str` The string to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nnanomatch.all = function(str, patterns, options) {\n if (typeof str !== 'string') {\n throw new TypeError('expected a string: \"' + util.inspect(str) + '\"');\n }\n\n if (typeof patterns === 'string') {\n patterns = [patterns];\n }\n\n for (var i = 0; i < patterns.length; i++) {\n if (!nanomatch.isMatch(str, patterns[i], options)) {\n return false;\n }\n }\n return true;\n};\n\n/**\n * Returns a list of strings that _**do not match any**_ of the given `patterns`.\n *\n * ```js\n * var nm = require('nanomatch');\n * nm.not(list, patterns[, options]);\n *\n * console.log(nm.not(['a.a', 'b.b', 'c.c'], '*.a'));\n * //=> ['b.b', 'c.c']\n * ```\n * @param {Array} `list` Array of strings to match.\n * @param {String|Array} `patterns` One or more glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Array} Returns an array of strings that **do not match** the given patterns.\n * @api public\n */\n\nnanomatch.not = function(list, patterns, options) {\n var opts = extend({}, options);\n var ignore = opts.ignore;\n delete opts.ignore;\n\n list = utils.arrayify(list);\n\n var matches = utils.diff(list, nanomatch(list, patterns, opts));\n if (ignore) {\n matches = utils.diff(matches, nanomatch(list, ignore));\n }\n\n return opts.nodupes !== false ? utils.unique(matches) : matches;\n};\n\n/**\n * Returns true if the given `string` contains the given pattern. Similar\n * to [.isMatch](#isMatch) but the pattern can match any part of the string.\n *\n * ```js\n * var nm = require('nanomatch');\n * nm.contains(string, pattern[, options]);\n *\n * console.log(nm.contains('aa/bb/cc', '*b'));\n * //=> true\n * console.log(nm.contains('aa/bb/cc', '*d'));\n * //=> false\n * ```\n * @param {String} `str` The string to match.\n * @param {String|Array} `patterns` Glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if the patter matches any part of `str`.\n * @api public\n */\n\nnanomatch.contains = function(str, patterns, options) {\n if (typeof str !== 'string') {\n throw new TypeError('expected a string: \"' + util.inspect(str) + '\"');\n }\n\n if (typeof patterns === 'string') {\n if (utils.isEmptyString(str) || utils.isEmptyString(patterns)) {\n return false;\n }\n\n var equals = utils.equalsPattern(patterns, options);\n if (equals(str)) {\n return true;\n }\n var contains = utils.containsPattern(patterns, options);\n if (contains(str)) {\n return true;\n }\n }\n\n var opts = extend({}, options, {contains: true});\n return nanomatch.any(str, patterns, opts);\n};\n\n/**\n * Returns true if the given pattern and options should enable\n * the `matchBase` option.\n * @return {Boolean}\n * @api private\n */\n\nnanomatch.matchBase = function(pattern, options) {\n if (pattern && pattern.indexOf('/') !== -1 || !options) return false;\n return options.basename === true || options.matchBase === true;\n};\n\n/**\n * Filter the keys of the given object with the given `glob` pattern\n * and `options`. Does not attempt to match nested keys. If you need this feature,\n * use [glob-object][] instead.\n *\n * ```js\n * var nm = require('nanomatch');\n * nm.matchKeys(object, patterns[, options]);\n *\n * var obj = { aa: 'a', ab: 'b', ac: 'c' };\n * console.log(nm.matchKeys(obj, '*b'));\n * //=> { ab: 'b' }\n * ```\n * @param {Object} `object` The object with keys to filter.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Object} Returns an object with only keys that match the given patterns.\n * @api public\n */\n\nnanomatch.matchKeys = function(obj, patterns, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('expected the first argument to be an object');\n }\n var keys = nanomatch(Object.keys(obj), patterns, options);\n return utils.pick(obj, keys);\n};\n\n/**\n * Returns a memoized matcher function from the given glob `pattern` and `options`.\n * The returned function takes a string to match as its only argument and returns\n * true if the string is a match.\n *\n * ```js\n * var nm = require('nanomatch');\n * nm.matcher(pattern[, options]);\n *\n * var isMatch = nm.matcher('*.!(*a)');\n * console.log(isMatch('a.a'));\n * //=> false\n * console.log(isMatch('a.b'));\n * //=> true\n * ```\n * @param {String} `pattern` Glob pattern\n * @param {Object} `options` See available [options](#options) for changing how matches are performed.\n * @return {Function} Returns a matcher function.\n * @api public\n */\n\nnanomatch.matcher = function matcher(pattern, options) {\n if (utils.isEmptyString(pattern)) {\n return function() {\n return false;\n };\n }\n\n if (Array.isArray(pattern)) {\n return compose(pattern, options, matcher);\n }\n\n // if pattern is a regex\n if (pattern instanceof RegExp) {\n return test(pattern);\n }\n\n // if pattern is invalid\n if (!utils.isString(pattern)) {\n throw new TypeError('expected pattern to be an array, string or regex');\n }\n\n // if pattern is a non-glob string\n if (!utils.hasSpecialChars(pattern)) {\n if (options && options.nocase === true) {\n pattern = pattern.toLowerCase();\n }\n return utils.matchPath(pattern, options);\n }\n\n // if pattern is a glob string\n var re = nanomatch.makeRe(pattern, options);\n\n // if `options.matchBase` or `options.basename` is defined\n if (nanomatch.matchBase(pattern, options)) {\n return utils.matchBasename(re, options);\n }\n\n function test(regex) {\n var equals = utils.equalsPattern(options);\n var unixify = utils.unixify(options);\n\n return function(str) {\n if (equals(str)) {\n return true;\n }\n\n if (regex.test(unixify(str))) {\n return true;\n }\n return false;\n };\n }\n\n // create matcher function\n var matcherFn = test(re);\n // set result object from compiler on matcher function,\n // as a non-enumerable property. useful for debugging\n utils.define(matcherFn, 'result', re.result);\n return matcherFn;\n};\n\n/**\n * Returns an array of matches captured by `pattern` in `string, or\n * `null` if the pattern did not match.\n *\n * ```js\n * var nm = require('nanomatch');\n * nm.capture(pattern, string[, options]);\n *\n * console.log(nm.capture('test/*.js', 'test/foo.js'));\n * //=> ['foo']\n * console.log(nm.capture('test/*.js', 'foo/bar.css'));\n * //=> null\n * ```\n * @param {String} `pattern` Glob pattern to use for matching.\n * @param {String} `string` String to match\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns an array of captures if the string matches the glob pattern, otherwise `null`.\n * @api public\n */\n\nnanomatch.capture = function(pattern, str, options) {\n var re = nanomatch.makeRe(pattern, extend({capture: true}, options));\n var unixify = utils.unixify(options);\n\n function match() {\n return function(string) {\n var match = re.exec(unixify(string));\n if (!match) {\n return null;\n }\n\n return match.slice(1);\n };\n }\n\n var capture = memoize('capture', pattern, options, match);\n return capture(str);\n};\n\n/**\n * Create a regular expression from the given glob `pattern`.\n *\n * ```js\n * var nm = require('nanomatch');\n * nm.makeRe(pattern[, options]);\n *\n * console.log(nm.makeRe('*.js'));\n * //=> /^(?:(\\.[\\\\\\/])?(?!\\.)(?=.)[^\\/]*?\\.js)$/\n * ```\n * @param {String} `pattern` A glob pattern to convert to regex.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed.\n * @return {RegExp} Returns a regex created from the given pattern.\n * @api public\n */\n\nnanomatch.makeRe = function(pattern, options) {\n if (pattern instanceof RegExp) {\n return pattern;\n }\n\n if (typeof pattern !== 'string') {\n throw new TypeError('expected pattern to be a string');\n }\n\n if (pattern.length > MAX_LENGTH) {\n throw new Error('expected pattern to be less than ' + MAX_LENGTH + ' characters');\n }\n\n function makeRe() {\n var opts = utils.extend({wrap: false}, options);\n var result = nanomatch.create(pattern, opts);\n var regex = toRegex(result.output, opts);\n utils.define(regex, 'result', result);\n return regex;\n }\n\n return memoize('makeRe', pattern, options, makeRe);\n};\n\n/**\n * Parses the given glob `pattern` and returns an object with the compiled `output`\n * and optional source `map`.\n *\n * ```js\n * var nm = require('nanomatch');\n * nm.create(pattern[, options]);\n *\n * console.log(nm.create('abc/*.js'));\n * // { options: { source: 'string', sourcemap: true },\n * // state: {},\n * // compilers:\n * // { ... },\n * // output: '(\\\\.[\\\\\\\\\\\\/])?abc\\\\/(?!\\\\.)(?=.)[^\\\\/]*?\\\\.js',\n * // ast:\n * // { type: 'root',\n * // errors: [],\n * // nodes:\n * // [ ... ],\n * // dot: false,\n * // input: 'abc/*.js' },\n * // parsingErrors: [],\n * // map:\n * // { version: 3,\n * // sources: [ 'string' ],\n * // names: [],\n * // mappings: 'AAAA,GAAG,EAAC,kBAAC,EAAC,EAAE',\n * // sourcesContent: [ 'abc/*.js' ] },\n * // position: { line: 1, column: 28 },\n * // content: {},\n * // files: {},\n * // idx: 6 }\n * ```\n * @param {String} `pattern` Glob pattern to parse and compile.\n * @param {Object} `options` Any [options](#options) to change how parsing and compiling is performed.\n * @return {Object} Returns an object with the parsed AST, compiled string and optional source map.\n * @api public\n */\n\nnanomatch.create = function(pattern, options) {\n if (typeof pattern !== 'string') {\n throw new TypeError('expected a string');\n }\n function create() {\n return nanomatch.compile(nanomatch.parse(pattern, options), options);\n }\n return memoize('create', pattern, options, create);\n};\n\n/**\n * Parse the given `str` with the given `options`.\n *\n * ```js\n * var nm = require('nanomatch');\n * nm.parse(pattern[, options]);\n *\n * var ast = nm.parse('a/{b,c}/d');\n * console.log(ast);\n * // { type: 'root',\n * // errors: [],\n * // input: 'a/{b,c}/d',\n * // nodes:\n * // [ { type: 'bos', val: '' },\n * // { type: 'text', val: 'a/' },\n * // { type: 'brace',\n * // nodes:\n * // [ { type: 'brace.open', val: '{' },\n * // { type: 'text', val: 'b,c' },\n * // { type: 'brace.close', val: '}' } ] },\n * // { type: 'text', val: '/d' },\n * // { type: 'eos', val: '' } ] }\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {Object} Returns an AST\n * @api public\n */\n\nnanomatch.parse = function(pattern, options) {\n if (typeof pattern !== 'string') {\n throw new TypeError('expected a string');\n }\n\n function parse() {\n var snapdragon = utils.instantiate(null, options);\n parsers(snapdragon, options);\n\n var ast = snapdragon.parse(pattern, options);\n utils.define(ast, 'snapdragon', snapdragon);\n ast.input = pattern;\n return ast;\n }\n\n return memoize('parse', pattern, options, parse);\n};\n\n/**\n * Compile the given `ast` or string with the given `options`.\n *\n * ```js\n * var nm = require('nanomatch');\n * nm.compile(ast[, options]);\n *\n * var ast = nm.parse('a/{b,c}/d');\n * console.log(nm.compile(ast));\n * // { options: { source: 'string' },\n * // state: {},\n * // compilers:\n * // { eos: [Function],\n * // noop: [Function],\n * // bos: [Function],\n * // brace: [Function],\n * // 'brace.open': [Function],\n * // text: [Function],\n * // 'brace.close': [Function] },\n * // output: [ 'a/(b|c)/d' ],\n * // ast:\n * // { ... },\n * // parsingErrors: [] }\n * ```\n * @param {Object|String} `ast`\n * @param {Object} `options`\n * @return {Object} Returns an object that has an `output` property with the compiled string.\n * @api public\n */\n\nnanomatch.compile = function(ast, options) {\n if (typeof ast === 'string') {\n ast = nanomatch.parse(ast, options);\n }\n\n function compile() {\n var snapdragon = utils.instantiate(ast, options);\n compilers(snapdragon, options);\n return snapdragon.compile(ast, options);\n }\n\n return memoize('compile', ast.input, options, compile);\n};\n\n/**\n * Clear the regex cache.\n *\n * ```js\n * nm.clearCache();\n * ```\n * @api public\n */\n\nnanomatch.clearCache = function() {\n nanomatch.cache.__data__ = {};\n};\n\n/**\n * Compose a matcher function with the given patterns.\n * This allows matcher functions to be compiled once and\n * called multiple times.\n */\n\nfunction compose(patterns, options, matcher) {\n var matchers;\n\n return memoize('compose', String(patterns), options, function() {\n return function(file) {\n // delay composition until it's invoked the first time,\n // after that it won't be called again\n if (!matchers) {\n matchers = [];\n for (var i = 0; i < patterns.length; i++) {\n matchers.push(matcher(patterns[i], options));\n }\n }\n\n var len = matchers.length;\n while (len--) {\n if (matchers[len](file) === true) {\n return true;\n }\n }\n return false;\n };\n });\n}\n\n/**\n * Memoize a generated regex or function. A unique key is generated\n * from the `type` (usually method name), the `pattern`, and\n * user-defined options.\n */\n\nfunction memoize(type, pattern, options, fn) {\n var key = utils.createKey(type + '=' + pattern, options);\n\n if (options && options.cache === false) {\n return fn(pattern, options);\n }\n\n if (cache.has(type, key)) {\n return cache.get(type, key);\n }\n\n var val = fn(pattern, options);\n cache.set(type, key, val);\n return val;\n}\n\n/**\n * Expose compiler, parser and cache on `nanomatch`\n */\n\nnanomatch.compilers = compilers;\nnanomatch.parsers = parsers;\nnanomatch.cache = cache;\n\n/**\n * Expose `nanomatch`\n * @type {Function}\n */\n\nmodule.exports = nanomatch;\n", "'use strict';\n\n/**\n * POSIX character classes\n */\n\nmodule.exports = {\n alnum: 'a-zA-Z0-9',\n alpha: 'a-zA-Z',\n ascii: '\\\\x00-\\\\x7F',\n blank: ' \\\\t',\n cntrl: '\\\\x00-\\\\x1F\\\\x7F',\n digit: '0-9',\n graph: '\\\\x21-\\\\x7E',\n lower: 'a-z',\n print: '\\\\x20-\\\\x7E ',\n punct: '\\\\-!\"#$%&\\'()\\\\*+,./:;<=>?@[\\\\]^_`{|}~',\n space: ' \\\\t\\\\r\\\\n\\\\v\\\\f',\n upper: 'A-Z',\n word: 'A-Za-z0-9_',\n xdigit: 'A-Fa-f0-9'\n};\n", "'use strict';\n\nvar posix = require('posix-character-classes');\n\nmodule.exports = function(brackets) {\n brackets.compiler\n\n /**\n * Escaped characters\n */\n\n .set('escape', function(node) {\n return this.emit('\\\\' + node.val.replace(/^\\\\/, ''), node);\n })\n\n /**\n * Text\n */\n\n .set('text', function(node) {\n return this.emit(node.val.replace(/([{}])/g, '\\\\$1'), node);\n })\n\n /**\n * POSIX character classes\n */\n\n .set('posix', function(node) {\n if (node.val === '[::]') {\n return this.emit('\\\\[::\\\\]', node);\n }\n\n var val = posix[node.inner];\n if (typeof val === 'undefined') {\n val = '[' + node.inner + ']';\n }\n return this.emit(val, node);\n })\n\n /**\n * Non-posix brackets\n */\n\n .set('bracket', function(node) {\n return this.mapVisit(node.nodes);\n })\n .set('bracket.open', function(node) {\n return this.emit(node.val, node);\n })\n .set('bracket.inner', function(node) {\n var inner = node.val;\n\n if (inner === '[' || inner === ']') {\n return this.emit('\\\\' + node.val, node);\n }\n if (inner === '^]') {\n return this.emit('^\\\\]', node);\n }\n if (inner === '^') {\n return this.emit('^', node);\n }\n\n if (/-/.test(inner) && !/(\\d-\\d|\\w-\\w)/.test(inner)) {\n inner = inner.split('-').join('\\\\-');\n }\n\n var isNegated = inner.charAt(0) === '^';\n // add slashes to negated brackets, per spec\n if (isNegated && inner.indexOf('/') === -1) {\n inner += '/';\n }\n if (isNegated && inner.indexOf('.') === -1) {\n inner += '.';\n }\n\n // don't unescape `0` (octal literal)\n inner = inner.replace(/\\\\([1-9])/g, '$1');\n return this.emit(inner, node);\n })\n .set('bracket.close', function(node) {\n var val = node.val.replace(/^\\\\/, '');\n if (node.parent.escaped === true) {\n return this.emit('\\\\' + val, node);\n }\n return this.emit(val, node);\n });\n};\n", "'use strict';\n\nvar toRegex = require('to-regex');\nvar regexNot = require('regex-not');\nvar cached;\n\n/**\n * Get the last element from `array`\n * @param {Array} `array`\n * @return {*}\n */\n\nexports.last = function(arr) {\n return arr[arr.length - 1];\n};\n\n/**\n * Create and cache regex to use for text nodes\n */\n\nexports.createRegex = function(pattern, include) {\n if (cached) return cached;\n var opts = {contains: true, strictClose: false};\n var not = regexNot.create(pattern, opts);\n var re;\n\n if (typeof include === 'string') {\n re = toRegex('^(?:' + include + '|' + not + ')', opts);\n } else {\n re = toRegex(not, opts);\n }\n\n return (cached = re);\n};\n", "'use strict';\n\nvar utils = require('./utils');\nvar define = require('define-property');\n\n/**\n * Text regex\n */\n\nvar TEXT_REGEX = '(\\\\[(?=.*\\\\])|\\\\])+';\nvar not = utils.createRegex(TEXT_REGEX);\n\n/**\n * Brackets parsers\n */\n\nfunction parsers(brackets) {\n brackets.state = brackets.state || {};\n brackets.parser.sets.bracket = brackets.parser.sets.bracket || [];\n brackets.parser\n\n .capture('escape', function() {\n if (this.isInside('bracket')) return;\n var pos = this.position();\n var m = this.match(/^\\\\(.)/);\n if (!m) return;\n\n return pos({\n type: 'escape',\n val: m[0]\n });\n })\n\n /**\n * Text parser\n */\n\n .capture('text', function() {\n if (this.isInside('bracket')) return;\n var pos = this.position();\n var m = this.match(not);\n if (!m || !m[0]) return;\n\n return pos({\n type: 'text',\n val: m[0]\n });\n })\n\n /**\n * POSIX character classes: \"[[:alpha:][:digits:]]\"\n */\n\n .capture('posix', function() {\n var pos = this.position();\n var m = this.match(/^\\[:(.*?):\\](?=.*\\])/);\n if (!m) return;\n\n var inside = this.isInside('bracket');\n if (inside) {\n brackets.posix++;\n }\n\n return pos({\n type: 'posix',\n insideBracket: inside,\n inner: m[1],\n val: m[0]\n });\n })\n\n /**\n * Bracket (noop)\n */\n\n .capture('bracket', function() {})\n\n /**\n * Open: '['\n */\n\n .capture('bracket.open', function() {\n var parsed = this.parsed;\n var pos = this.position();\n var m = this.match(/^\\[(?=.*\\])/);\n if (!m) return;\n\n var prev = this.prev();\n var last = utils.last(prev.nodes);\n\n if (parsed.slice(-1) === '\\\\' && !this.isInside('bracket')) {\n last.val = last.val.slice(0, last.val.length - 1);\n return pos({\n type: 'escape',\n val: m[0]\n });\n }\n\n var open = pos({\n type: 'bracket.open',\n val: m[0]\n });\n\n if (last.type === 'bracket.open' || this.isInside('bracket')) {\n open.val = '\\\\' + open.val;\n open.type = 'bracket.inner';\n open.escaped = true;\n return open;\n }\n\n var node = pos({\n type: 'bracket',\n nodes: [open]\n });\n\n define(node, 'parent', prev);\n define(open, 'parent', node);\n this.push('bracket', node);\n prev.nodes.push(node);\n })\n\n /**\n * Bracket text\n */\n\n .capture('bracket.inner', function() {\n if (!this.isInside('bracket')) return;\n var pos = this.position();\n var m = this.match(not);\n if (!m || !m[0]) return;\n\n var next = this.input.charAt(0);\n var val = m[0];\n\n var node = pos({\n type: 'bracket.inner',\n val: val\n });\n\n if (val === '\\\\\\\\') {\n return node;\n }\n\n var first = val.charAt(0);\n var last = val.slice(-1);\n\n if (first === '!') {\n val = '^' + val.slice(1);\n }\n\n if (last === '\\\\' || (val === '^' && next === ']')) {\n val += this.input[0];\n this.consume(1);\n }\n\n node.val = val;\n return node;\n })\n\n /**\n * Close: ']'\n */\n\n .capture('bracket.close', function() {\n var parsed = this.parsed;\n var pos = this.position();\n var m = this.match(/^\\]/);\n if (!m) return;\n\n var prev = this.prev();\n var last = utils.last(prev.nodes);\n\n if (parsed.slice(-1) === '\\\\' && !this.isInside('bracket')) {\n last.val = last.val.slice(0, last.val.length - 1);\n\n return pos({\n type: 'escape',\n val: m[0]\n });\n }\n\n var node = pos({\n type: 'bracket.close',\n rest: this.input,\n val: m[0]\n });\n\n if (last.type === 'bracket.open') {\n node.type = 'bracket.inner';\n node.escaped = true;\n return node;\n }\n\n var bracket = this.pop('bracket');\n if (!this.isType(bracket, 'bracket')) {\n if (this.options.strict) {\n throw new Error('missing opening \"[\"');\n }\n node.type = 'bracket.inner';\n node.escaped = true;\n return node;\n }\n\n bracket.nodes.push(node);\n define(node, 'parent', bracket);\n });\n}\n\n/**\n * Brackets parsers\n */\n\nmodule.exports = parsers;\n\n/**\n * Expose text regex\n */\n\nmodule.exports.TEXT_REGEX = TEXT_REGEX;\n", "/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isNaN(val) === false) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n if (ms >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (ms >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (ms >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (ms >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n return plural(ms, d, 'day') ||\n plural(ms, h, 'hour') ||\n plural(ms, m, 'minute') ||\n plural(ms, s, 'second') ||\n ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, n, name) {\n if (ms < n) {\n return;\n }\n if (ms < n * 1.5) {\n return Math.floor(ms / n) + ' ' + name;\n }\n return Math.ceil(ms / n) + ' ' + name + 's';\n}\n", "\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = createDebug.debug = createDebug['default'] = createDebug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = require('ms');\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n */\n\nexports.formatters = {};\n\n/**\n * Previous log timestamp.\n */\n\nvar prevTime;\n\n/**\n * Select a color.\n * @param {String} namespace\n * @return {Number}\n * @api private\n */\n\nfunction selectColor(namespace) {\n var hash = 0, i;\n\n for (i in namespace) {\n hash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n hash |= 0; // Convert to 32bit integer\n }\n\n return exports.colors[Math.abs(hash) % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction createDebug(namespace) {\n\n function debug() {\n // disabled?\n if (!debug.enabled) return;\n\n var self = debug;\n\n // set `diff` timestamp\n var curr = +new Date();\n var ms = curr - (prevTime || curr);\n self.diff = ms;\n self.prev = prevTime;\n self.curr = curr;\n prevTime = curr;\n\n // turn the `arguments` into a proper Array\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n\n args[0] = exports.coerce(args[0]);\n\n if ('string' !== typeof args[0]) {\n // anything else let's inspect with %O\n args.unshift('%O');\n }\n\n // apply any `formatters` transformations\n var index = 0;\n args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {\n // if we encounter an escaped % then don't increase the array index\n if (match === '%%') return match;\n index++;\n var formatter = exports.formatters[format];\n if ('function' === typeof formatter) {\n var val = args[index];\n match = formatter.call(self, val);\n\n // now we need to remove `args[index]` since it's inlined in the `format`\n args.splice(index, 1);\n index--;\n }\n return match;\n });\n\n // apply env-specific formatting (colors, etc.)\n exports.formatArgs.call(self, args);\n\n var logFn = debug.log || exports.log || console.log.bind(console);\n logFn.apply(self, args);\n }\n\n debug.namespace = namespace;\n debug.enabled = exports.enabled(namespace);\n debug.useColors = exports.useColors();\n debug.color = selectColor(namespace);\n\n // env-specific initialization logic for debug instances\n if ('function' === typeof exports.init) {\n exports.init(debug);\n }\n\n return debug;\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n exports.save(namespaces);\n\n exports.names = [];\n exports.skips = [];\n\n var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n var len = split.length;\n\n for (var i = 0; i < len; i++) {\n if (!split[i]) continue; // ignore empty strings\n namespaces = split[i].replace(/\\*/g, '.*?');\n if (namespaces[0] === '-') {\n exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n } else {\n exports.names.push(new RegExp('^' + namespaces + '$'));\n }\n }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n var i, len;\n for (i = 0, len = exports.skips.length; i < len; i++) {\n if (exports.skips[i].test(name)) {\n return false;\n }\n }\n for (i = 0, len = exports.names.length; i < len; i++) {\n if (exports.names[i].test(name)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n if (val instanceof Error) return val.stack || val.message;\n return val;\n}\n", "/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = require('./debug');\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = 'undefined' != typeof chrome\n && 'undefined' != typeof chrome.storage\n ? chrome.storage.local\n : localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n 'lightseagreen',\n 'forestgreen',\n 'goldenrod',\n 'dodgerblue',\n 'darkorchid',\n 'crimson'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n // NB: In an Electron preload script, document will be defined but not fully\n // initialized. Since we know we're in Chrome, we'll just detect this case\n // explicitly\n if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {\n return true;\n }\n\n // is webkit? http://stackoverflow.com/a/16459606/376773\n // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n // is firebug? http://stackoverflow.com/a/398120/376773\n (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n // is firefox >= v31?\n // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n // double check webkit in userAgent just in case we are in a worker\n (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function(v) {\n try {\n return JSON.stringify(v);\n } catch (err) {\n return '[UnexpectedJSONParseError]: ' + err.message;\n }\n};\n\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n var useColors = this.useColors;\n\n args[0] = (useColors ? '%c' : '')\n + this.namespace\n + (useColors ? ' %c' : ' ')\n + args[0]\n + (useColors ? '%c ' : ' ')\n + '+' + exports.humanize(this.diff);\n\n if (!useColors) return;\n\n var c = 'color: ' + this.color;\n args.splice(1, 0, c, 'color: inherit')\n\n // the final \"%c\" is somewhat tricky, because there could be other\n // arguments passed either before or after the %c, so we need to\n // figure out the correct index to insert the CSS into\n var index = 0;\n var lastC = 0;\n args[0].replace(/%[a-zA-Z%]/g, function(match) {\n if ('%%' === match) return;\n index++;\n if ('%c' === match) {\n // we only are interested in the *last* %c\n // (the user may have provided their own)\n lastC = index;\n }\n });\n\n args.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n // this hackery is required for IE8/9, where\n // the `console.log` function doesn't have 'apply'\n return 'object' === typeof console\n && console.log\n && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n try {\n if (null == namespaces) {\n exports.storage.removeItem('debug');\n } else {\n exports.storage.debug = namespaces;\n }\n } catch(e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n var r;\n try {\n r = exports.storage.debug;\n } catch(e) {}\n\n // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n if (!r && typeof process !== 'undefined' && 'env' in process) {\n r = process.env.DEBUG;\n }\n\n return r;\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n try {\n return window.localStorage;\n } catch (e) {}\n}\n", "/**\n * Module dependencies.\n */\n\nvar tty = require('tty');\nvar util = require('util');\n\n/**\n * This is the Node.js implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = require('./debug');\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\n\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(function (key) {\n return /^debug_/i.test(key);\n}).reduce(function (obj, key) {\n // camel-case\n var prop = key\n .substring(6)\n .toLowerCase()\n .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() });\n\n // coerce string value into JS value\n var val = process.env[key];\n if (/^(yes|on|true|enabled)$/i.test(val)) val = true;\n else if (/^(no|off|false|disabled)$/i.test(val)) val = false;\n else if (val === 'null') val = null;\n else val = Number(val);\n\n obj[prop] = val;\n return obj;\n}, {});\n\n/**\n * The file descriptor to write the `debug()` calls to.\n * Set the `DEBUG_FD` env variable to override with another value. i.e.:\n *\n * $ DEBUG_FD=3 node script.js 3>debug.log\n */\n\nvar fd = parseInt(process.env.DEBUG_FD, 10) || 2;\n\nif (1 !== fd && 2 !== fd) {\n util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')()\n}\n\nvar stream = 1 === fd ? process.stdout :\n 2 === fd ? process.stderr :\n createWritableStdioStream(fd);\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n return 'colors' in exports.inspectOpts\n ? Boolean(exports.inspectOpts.colors)\n : tty.isatty(fd);\n}\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nexports.formatters.o = function(v) {\n this.inspectOpts.colors = this.useColors;\n return util.inspect(v, this.inspectOpts)\n .split('\\n').map(function(str) {\n return str.trim()\n }).join(' ');\n};\n\n/**\n * Map %o to `util.inspect()`, allowing multiple lines if needed.\n */\n\nexports.formatters.O = function(v) {\n this.inspectOpts.colors = this.useColors;\n return util.inspect(v, this.inspectOpts);\n};\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n var name = this.namespace;\n var useColors = this.useColors;\n\n if (useColors) {\n var c = this.color;\n var prefix = ' \\u001b[3' + c + ';1m' + name + ' ' + '\\u001b[0m';\n\n args[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n args.push('\\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\\u001b[0m');\n } else {\n args[0] = new Date().toUTCString()\n + ' ' + name + ' ' + args[0];\n }\n}\n\n/**\n * Invokes `util.format()` with the specified arguments and writes to `stream`.\n */\n\nfunction log() {\n return stream.write(util.format.apply(util, arguments) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n if (null == namespaces) {\n // If you set a process.env field to null or undefined, it gets cast to the\n // string 'null' or 'undefined'. Just delete instead.\n delete process.env.DEBUG;\n } else {\n process.env.DEBUG = namespaces;\n }\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n return process.env.DEBUG;\n}\n\n/**\n * Copied from `node/src/node.js`.\n *\n * XXX: It's lame that node doesn't expose this API out-of-the-box. It also\n * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.\n */\n\nfunction createWritableStdioStream (fd) {\n var stream;\n var tty_wrap = process.binding('tty_wrap');\n\n // Note stream._type is used for test-module-load-list.js\n\n switch (tty_wrap.guessHandleType(fd)) {\n case 'TTY':\n stream = new tty.WriteStream(fd);\n stream._type = 'tty';\n\n // Hack to have stream not keep the event loop alive.\n // See https://github.com/joyent/node/issues/1726\n if (stream._handle && stream._handle.unref) {\n stream._handle.unref();\n }\n break;\n\n case 'FILE':\n var fs = require('fs');\n stream = new fs.SyncWriteStream(fd, { autoClose: false });\n stream._type = 'fs';\n break;\n\n case 'PIPE':\n case 'TCP':\n var net = require('net');\n stream = new net.Socket({\n fd: fd,\n readable: false,\n writable: true\n });\n\n // FIXME Should probably have an option in net.Socket to create a\n // stream from an existing fd which is writable only. But for now\n // we'll just add this hack and set the `readable` member to false.\n // Test: ./node test/fixtures/echo.js < /etc/passwd\n stream.readable = false;\n stream.read = null;\n stream._type = 'pipe';\n\n // FIXME Hack to have stream not keep the event loop alive.\n // See https://github.com/joyent/node/issues/1726\n if (stream._handle && stream._handle.unref) {\n stream._handle.unref();\n }\n break;\n\n default:\n // Probably an error on in uv_guess_handle()\n throw new Error('Implement me. Unknown stream file type!');\n }\n\n // For supporting legacy API we put the FD here.\n stream.fd = fd;\n\n stream._isStdio = true;\n\n return stream;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init (debug) {\n debug.inspectOpts = {};\n\n var keys = Object.keys(exports.inspectOpts);\n for (var i = 0; i < keys.length; i++) {\n debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n }\n}\n\n/**\n * Enable namespaces listed in `process.env.DEBUG` initially.\n */\n\nexports.enable(load());\n", "/**\n * Detect Electron renderer process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process !== 'undefined' && process.type === 'renderer') {\n module.exports = require('./browser.js');\n} else {\n module.exports = require('./node.js');\n}\n", "'use strict';\n\n/**\n * Local dependencies\n */\n\nvar compilers = require('./lib/compilers');\nvar parsers = require('./lib/parsers');\n\n/**\n * Module dependencies\n */\n\nvar debug = require('debug')('expand-brackets');\nvar extend = require('extend-shallow');\nvar Snapdragon = require('snapdragon');\nvar toRegex = require('to-regex');\n\n/**\n * Parses the given POSIX character class `pattern` and returns a\n * string that can be used for creating regular expressions for matching.\n *\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {Object}\n * @api public\n */\n\nfunction brackets(pattern, options) {\n debug('initializing from <%s>', __filename);\n var res = brackets.create(pattern, options);\n return res.output;\n}\n\n/**\n * Takes an array of strings and a POSIX character class pattern, and returns a new\n * array with only the strings that matched the pattern.\n *\n * ```js\n * var brackets = require('expand-brackets');\n * console.log(brackets.match(['1', 'a', 'ab'], '[[:alpha:]]'));\n * //=> ['a']\n *\n * console.log(brackets.match(['1', 'a', 'ab'], '[[:alpha:]]+'));\n * //=> ['a', 'ab']\n * ```\n * @param {Array} `arr` Array of strings to match\n * @param {String} `pattern` POSIX character class pattern(s)\n * @param {Object} `options`\n * @return {Array}\n * @api public\n */\n\nbrackets.match = function(arr, pattern, options) {\n arr = [].concat(arr);\n var opts = extend({}, options);\n var isMatch = brackets.matcher(pattern, opts);\n var len = arr.length;\n var idx = -1;\n var res = [];\n\n while (++idx < len) {\n var ele = arr[idx];\n if (isMatch(ele)) {\n res.push(ele);\n }\n }\n\n if (res.length === 0) {\n if (opts.failglob === true) {\n throw new Error('no matches found for \"' + pattern + '\"');\n }\n\n if (opts.nonull === true || opts.nullglob === true) {\n return [pattern.split('\\\\').join('')];\n }\n }\n return res;\n};\n\n/**\n * Returns true if the specified `string` matches the given\n * brackets `pattern`.\n *\n * ```js\n * var brackets = require('expand-brackets');\n *\n * console.log(brackets.isMatch('a.a', '[[:alpha:]].[[:alpha:]]'));\n * //=> true\n * console.log(brackets.isMatch('1.2', '[[:alpha:]].[[:alpha:]]'));\n * //=> false\n * ```\n * @param {String} `string` String to match\n * @param {String} `pattern` Poxis pattern\n * @param {String} `options`\n * @return {Boolean}\n * @api public\n */\n\nbrackets.isMatch = function(str, pattern, options) {\n return brackets.matcher(pattern, options)(str);\n};\n\n/**\n * Takes a POSIX character class pattern and returns a matcher function. The returned\n * function takes the string to match as its only argument.\n *\n * ```js\n * var brackets = require('expand-brackets');\n * var isMatch = brackets.matcher('[[:lower:]].[[:upper:]]');\n *\n * console.log(isMatch('a.a'));\n * //=> false\n * console.log(isMatch('a.A'));\n * //=> true\n * ```\n * @param {String} `pattern` Poxis pattern\n * @param {String} `options`\n * @return {Boolean}\n * @api public\n */\n\nbrackets.matcher = function(pattern, options) {\n var re = brackets.makeRe(pattern, options);\n return function(str) {\n return re.test(str);\n };\n};\n\n/**\n * Create a regular expression from the given `pattern`.\n *\n * ```js\n * var brackets = require('expand-brackets');\n * var re = brackets.makeRe('[[:alpha:]]');\n * console.log(re);\n * //=> /^(?:[a-zA-Z])$/\n * ```\n * @param {String} `pattern` The pattern to convert to regex.\n * @param {Object} `options`\n * @return {RegExp}\n * @api public\n */\n\nbrackets.makeRe = function(pattern, options) {\n var res = brackets.create(pattern, options);\n var opts = extend({strictErrors: false}, options);\n return toRegex(res.output, opts);\n};\n\n/**\n * Parses the given POSIX character class `pattern` and returns an object\n * with the compiled `output` and optional source `map`.\n *\n * ```js\n * var brackets = require('expand-brackets');\n * console.log(brackets('[[:alpha:]]'));\n * // { options: { source: 'string' },\n * // input: '[[:alpha:]]',\n * // state: {},\n * // compilers:\n * // { eos: [Function],\n * // noop: [Function],\n * // bos: [Function],\n * // not: [Function],\n * // escape: [Function],\n * // text: [Function],\n * // posix: [Function],\n * // bracket: [Function],\n * // 'bracket.open': [Function],\n * // 'bracket.inner': [Function],\n * // 'bracket.literal': [Function],\n * // 'bracket.close': [Function] },\n * // output: '[a-zA-Z]',\n * // ast:\n * // { type: 'root',\n * // errors: [],\n * // nodes: [ [Object], [Object], [Object] ] },\n * // parsingErrors: [] }\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {Object}\n * @api public\n */\n\nbrackets.create = function(pattern, options) {\n var snapdragon = (options && options.snapdragon) || new Snapdragon(options);\n compilers(snapdragon);\n parsers(snapdragon);\n\n var ast = snapdragon.parse(pattern, options);\n ast.input = pattern;\n var res = snapdragon.compile(ast, options);\n res.input = pattern;\n return res;\n};\n\n/**\n * Expose `brackets` constructor, parsers and compilers\n */\n\nbrackets.compilers = compilers;\nbrackets.parsers = parsers;\n\n/**\n * Expose `brackets`\n * @type {Function}\n */\n\nmodule.exports = brackets;\n", "'use strict';\n\nvar brackets = require('expand-brackets');\n\n/**\n * Extglob compilers\n */\n\nmodule.exports = function(extglob) {\n function star() {\n if (typeof extglob.options.star === 'function') {\n return extglob.options.star.apply(this, arguments);\n }\n if (typeof extglob.options.star === 'string') {\n return extglob.options.star;\n }\n return '.*?';\n }\n\n /**\n * Use `expand-brackets` compilers\n */\n\n extglob.use(brackets.compilers);\n extglob.compiler\n\n /**\n * Escaped: \"\\\\*\"\n */\n\n .set('escape', function(node) {\n return this.emit(node.val, node);\n })\n\n /**\n * Dot: \".\"\n */\n\n .set('dot', function(node) {\n return this.emit('\\\\' + node.val, node);\n })\n\n /**\n * Question mark: \"?\"\n */\n\n .set('qmark', function(node) {\n var val = '[^\\\\\\\\/.]';\n var prev = this.prev();\n\n if (node.parsed.slice(-1) === '(') {\n var ch = node.rest.charAt(0);\n if (ch !== '!' && ch !== '=' && ch !== ':') {\n return this.emit(val, node);\n }\n return this.emit(node.val, node);\n }\n\n if (prev.type === 'text' && prev.val) {\n return this.emit(val, node);\n }\n\n if (node.val.length > 1) {\n val += '{' + node.val.length + '}';\n }\n return this.emit(val, node);\n })\n\n /**\n * Plus: \"+\"\n */\n\n .set('plus', function(node) {\n var prev = node.parsed.slice(-1);\n if (prev === ']' || prev === ')') {\n return this.emit(node.val, node);\n }\n var ch = this.output.slice(-1);\n if (!this.output || (/[?*+]/.test(ch) && node.parent.type !== 'bracket')) {\n return this.emit('\\\\+', node);\n }\n if (/\\w/.test(ch) && !node.inside) {\n return this.emit('+\\\\+?', node);\n }\n return this.emit('+', node);\n })\n\n /**\n * Star: \"*\"\n */\n\n .set('star', function(node) {\n var prev = this.prev();\n var prefix = prev.type !== 'text' && prev.type !== 'escape'\n ? '(?!\\\\.)'\n : '';\n\n return this.emit(prefix + star.call(this, node), node);\n })\n\n /**\n * Parens\n */\n\n .set('paren', function(node) {\n return this.mapVisit(node.nodes);\n })\n .set('paren.open', function(node) {\n var capture = this.options.capture ? '(' : '';\n\n switch (node.parent.prefix) {\n case '!':\n case '^':\n return this.emit(capture + '(?:(?!(?:', node);\n case '*':\n case '+':\n case '?':\n case '@':\n return this.emit(capture + '(?:', node);\n default: {\n var val = node.val;\n if (this.options.bash === true) {\n val = '\\\\' + val;\n } else if (!this.options.capture && val === '(' && node.parent.rest[0] !== '?') {\n val += '?:';\n }\n\n return this.emit(val, node);\n }\n }\n })\n .set('paren.close', function(node) {\n var capture = this.options.capture ? ')' : '';\n\n switch (node.prefix) {\n case '!':\n case '^':\n var prefix = /^(\\)|$)/.test(node.rest) ? '$' : '';\n var str = star.call(this, node);\n\n // if the extglob has a slash explicitly defined, we know the user wants\n // to match slashes, so we need to ensure the \"star\" regex allows for it\n if (node.parent.hasSlash && !this.options.star && this.options.slash !== false) {\n str = '.*?';\n }\n\n return this.emit(prefix + ('))' + str + ')') + capture, node);\n case '*':\n case '+':\n case '?':\n return this.emit(')' + node.prefix + capture, node);\n case '@':\n return this.emit(')' + capture, node);\n default: {\n var val = (this.options.bash === true ? '\\\\' : '') + ')';\n return this.emit(val, node);\n }\n }\n })\n\n /**\n * Text\n */\n\n .set('text', function(node) {\n var val = node.val.replace(/[\\[\\]]/g, '\\\\$&');\n return this.emit(val, node);\n });\n};\n", "/*!\n * define-property <https://github.com/jonschlinkert/define-property>\n *\n * Copyright (c) 2015, 2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar isDescriptor = require('is-descriptor');\n\nmodule.exports = function defineProperty(obj, prop, val) {\n if (typeof obj !== 'object' && typeof obj !== 'function') {\n throw new TypeError('expected an object or function.');\n }\n\n if (typeof prop !== 'string') {\n throw new TypeError('expected `prop` to be a string.');\n }\n\n if (isDescriptor(val) && ('set' in val || 'get' in val)) {\n return Object.defineProperty(obj, prop, val);\n }\n\n return Object.defineProperty(obj, prop, {\n configurable: true,\n enumerable: false,\n writable: true,\n value: val\n });\n};\n", "'use strict';\n\nvar regex = require('regex-not');\nvar Cache = require('fragment-cache');\n\n/**\n * Utils\n */\n\nvar utils = module.exports;\nvar cache = utils.cache = new Cache();\n\n/**\n * Cast `val` to an array\n * @return {Array}\n */\n\nutils.arrayify = function(val) {\n if (!Array.isArray(val)) {\n return [val];\n }\n return val;\n};\n\n/**\n * Memoize a generated regex or function\n */\n\nutils.memoize = function(type, pattern, options, fn) {\n var key = utils.createKey(type + pattern, options);\n\n if (cache.has(type, key)) {\n return cache.get(type, key);\n }\n\n var val = fn(pattern, options);\n if (options && options.cache === false) {\n return val;\n }\n\n cache.set(type, key, val);\n return val;\n};\n\n/**\n * Create the key to use for memoization. The key is generated\n * by iterating over the options and concatenating key-value pairs\n * to the pattern string.\n */\n\nutils.createKey = function(pattern, options) {\n var key = pattern;\n if (typeof options === 'undefined') {\n return key;\n }\n for (var prop in options) {\n key += ';' + prop + '=' + String(options[prop]);\n }\n return key;\n};\n\n/**\n * Create the regex to use for matching text\n */\n\nutils.createRegex = function(str) {\n var opts = {contains: true, strictClose: false};\n return regex(str, opts);\n};\n", "'use strict';\n\nvar brackets = require('expand-brackets');\nvar define = require('define-property');\nvar utils = require('./utils');\n\n/**\n * Characters to use in text regex (we want to \"not\" match\n * characters that are matched by other parsers)\n */\n\nvar TEXT_REGEX = '([!@*?+]?\\\\(|\\\\)|[*?.+\\\\\\\\]|\\\\[:?(?=.*\\\\])|:?\\\\])+';\nvar not = utils.createRegex(TEXT_REGEX);\n\n/**\n * Extglob parsers\n */\n\nfunction parsers(extglob) {\n extglob.state = extglob.state || {};\n\n /**\n * Use `expand-brackets` parsers\n */\n\n extglob.use(brackets.parsers);\n extglob.parser.sets.paren = extglob.parser.sets.paren || [];\n extglob.parser\n\n /**\n * Extglob open: \"*(\"\n */\n\n .capture('paren.open', function() {\n var parsed = this.parsed;\n var pos = this.position();\n var m = this.match(/^([!@*?+])?\\(/);\n if (!m) return;\n\n var prev = this.prev();\n var prefix = m[1];\n var val = m[0];\n\n var open = pos({\n type: 'paren.open',\n parsed: parsed,\n val: val\n });\n\n var node = pos({\n type: 'paren',\n prefix: prefix,\n nodes: [open]\n });\n\n // if nested negation extglobs, just cancel them out to simplify\n if (prefix === '!' && prev.type === 'paren' && prev.prefix === '!') {\n prev.prefix = '@';\n node.prefix = '@';\n }\n\n define(node, 'rest', this.input);\n define(node, 'parsed', parsed);\n define(node, 'parent', prev);\n define(open, 'parent', node);\n\n this.push('paren', node);\n prev.nodes.push(node);\n })\n\n /**\n * Extglob close: \")\"\n */\n\n .capture('paren.close', function() {\n var parsed = this.parsed;\n var pos = this.position();\n var m = this.match(/^\\)/);\n if (!m) return;\n\n var parent = this.pop('paren');\n var node = pos({\n type: 'paren.close',\n rest: this.input,\n parsed: parsed,\n val: m[0]\n });\n\n if (!this.isType(parent, 'paren')) {\n if (this.options.strict) {\n throw new Error('missing opening paren: \"(\"');\n }\n node.escaped = true;\n return node;\n }\n\n node.prefix = parent.prefix;\n parent.nodes.push(node);\n define(node, 'parent', parent);\n })\n\n /**\n * Escape: \"\\\\.\"\n */\n\n .capture('escape', function() {\n var pos = this.position();\n var m = this.match(/^\\\\(.)/);\n if (!m) return;\n\n return pos({\n type: 'escape',\n val: m[0],\n ch: m[1]\n });\n })\n\n /**\n * Question marks: \"?\"\n */\n\n .capture('qmark', function() {\n var parsed = this.parsed;\n var pos = this.position();\n var m = this.match(/^\\?+(?!\\()/);\n if (!m) return;\n extglob.state.metachar = true;\n return pos({\n type: 'qmark',\n rest: this.input,\n parsed: parsed,\n val: m[0]\n });\n })\n\n /**\n * Character parsers\n */\n\n .capture('star', /^\\*(?!\\()/)\n .capture('plus', /^\\+(?!\\()/)\n .capture('dot', /^\\./)\n .capture('text', not);\n};\n\n/**\n * Expose text regex string\n */\n\nmodule.exports.TEXT_REGEX = TEXT_REGEX;\n\n/**\n * Extglob parsers\n */\n\nmodule.exports = parsers;\n", "'use strict';\n\n/**\n * Module dependencies\n */\n\nvar Snapdragon = require('snapdragon');\nvar define = require('define-property');\nvar extend = require('extend-shallow');\n\n/**\n * Local dependencies\n */\n\nvar compilers = require('./compilers');\nvar parsers = require('./parsers');\n\n/**\n * Customize Snapdragon parser and renderer\n */\n\nfunction Extglob(options) {\n this.options = extend({source: 'extglob'}, options);\n this.snapdragon = this.options.snapdragon || new Snapdragon(this.options);\n this.snapdragon.patterns = this.snapdragon.patterns || {};\n this.compiler = this.snapdragon.compiler;\n this.parser = this.snapdragon.parser;\n\n compilers(this.snapdragon);\n parsers(this.snapdragon);\n\n /**\n * Override Snapdragon `.parse` method\n */\n\n define(this.snapdragon, 'parse', function(str, options) {\n var parsed = Snapdragon.prototype.parse.apply(this, arguments);\n parsed.input = str;\n\n // escape unmatched brace/bracket/parens\n var last = this.parser.stack.pop();\n if (last && this.options.strict !== true) {\n var node = last.nodes[0];\n node.val = '\\\\' + node.val;\n var sibling = node.parent.nodes[1];\n if (sibling.type === 'star') {\n sibling.loose = true;\n }\n }\n\n // add non-enumerable parser reference\n define(parsed, 'parser', this.parser);\n return parsed;\n });\n\n /**\n * Decorate `.parse` method\n */\n\n define(this, 'parse', function(ast, options) {\n return this.snapdragon.parse.apply(this.snapdragon, arguments);\n });\n\n /**\n * Decorate `.compile` method\n */\n\n define(this, 'compile', function(ast, options) {\n return this.snapdragon.compile.apply(this.snapdragon, arguments);\n });\n\n}\n\n/**\n * Expose `Extglob`\n */\n\nmodule.exports = Extglob;\n", "'use strict';\n\n/**\n * Module dependencies\n */\n\nvar extend = require('extend-shallow');\nvar unique = require('array-unique');\nvar toRegex = require('to-regex');\n\n/**\n * Local dependencies\n */\n\nvar compilers = require('./lib/compilers');\nvar parsers = require('./lib/parsers');\nvar Extglob = require('./lib/extglob');\nvar utils = require('./lib/utils');\nvar MAX_LENGTH = 1024 * 64;\n\n/**\n * Convert the given `extglob` pattern into a regex-compatible string. Returns\n * an object with the compiled result and the parsed AST.\n *\n * ```js\n * var extglob = require('extglob');\n * console.log(extglob('*.!(*a)'));\n * //=> '(?!\\\\.)[^/]*?\\\\.(?!(?!\\\\.)[^/]*?a\\\\b).*?'\n * ```\n * @param {String} `pattern`\n * @param {Object} `options`\n * @return {String}\n * @api public\n */\n\nfunction extglob(pattern, options) {\n return extglob.create(pattern, options).output;\n}\n\n/**\n * Takes an array of strings and an extglob pattern and returns a new\n * array that contains only the strings that match the pattern.\n *\n * ```js\n * var extglob = require('extglob');\n * console.log(extglob.match(['a.a', 'a.b', 'a.c'], '*.!(*a)'));\n * //=> ['a.b', 'a.c']\n * ```\n * @param {Array} `list` Array of strings to match\n * @param {String} `pattern` Extglob pattern\n * @param {Object} `options`\n * @return {Array} Returns an array of matches\n * @api public\n */\n\nextglob.match = function(list, pattern, options) {\n if (typeof pattern !== 'string') {\n throw new TypeError('expected pattern to be a string');\n }\n\n list = utils.arrayify(list);\n var isMatch = extglob.matcher(pattern, options);\n var len = list.length;\n var idx = -1;\n var matches = [];\n\n while (++idx < len) {\n var ele = list[idx];\n\n if (isMatch(ele)) {\n matches.push(ele);\n }\n }\n\n // if no options were passed, uniquify results and return\n if (typeof options === 'undefined') {\n return unique(matches);\n }\n\n if (matches.length === 0) {\n if (options.failglob === true) {\n throw new Error('no matches found for \"' + pattern + '\"');\n }\n if (options.nonull === true || options.nullglob === true) {\n return [pattern.split('\\\\').join('')];\n }\n }\n\n return options.nodupes !== false ? unique(matches) : matches;\n};\n\n/**\n * Returns true if the specified `string` matches the given\n * extglob `pattern`.\n *\n * ```js\n * var extglob = require('extglob');\n *\n * console.log(extglob.isMatch('a.a', '*.!(*a)'));\n * //=> false\n * console.log(extglob.isMatch('a.b', '*.!(*a)'));\n * //=> true\n * ```\n * @param {String} `string` String to match\n * @param {String} `pattern` Extglob pattern\n * @param {String} `options`\n * @return {Boolean}\n * @api public\n */\n\nextglob.isMatch = function(str, pattern, options) {\n if (typeof pattern !== 'string') {\n throw new TypeError('expected pattern to be a string');\n }\n\n if (typeof str !== 'string') {\n throw new TypeError('expected a string');\n }\n\n if (pattern === str) {\n return true;\n }\n\n if (pattern === '' || pattern === ' ' || pattern === '.') {\n return pattern === str;\n }\n\n var isMatch = utils.memoize('isMatch', pattern, options, extglob.matcher);\n return isMatch(str);\n};\n\n/**\n * Returns true if the given `string` contains the given pattern. Similar to `.isMatch` but\n * the pattern can match any part of the string.\n *\n * ```js\n * var extglob = require('extglob');\n * console.log(extglob.contains('aa/bb/cc', '*b'));\n * //=> true\n * console.log(extglob.contains('aa/bb/cc', '*d'));\n * //=> false\n * ```\n * @param {String} `str` The string to match.\n * @param {String} `pattern` Glob pattern to use for matching.\n * @param {Object} `options`\n * @return {Boolean} Returns true if the patter matches any part of `str`.\n * @api public\n */\n\nextglob.contains = function(str, pattern, options) {\n if (typeof str !== 'string') {\n throw new TypeError('expected a string');\n }\n\n if (pattern === '' || pattern === ' ' || pattern === '.') {\n return pattern === str;\n }\n\n var opts = extend({}, options, {contains: true});\n opts.strictClose = false;\n opts.strictOpen = false;\n return extglob.isMatch(str, pattern, opts);\n};\n\n/**\n * Takes an extglob pattern and returns a matcher function. The returned\n * function takes the string to match as its only argument.\n *\n * ```js\n * var extglob = require('extglob');\n * var isMatch = extglob.matcher('*.!(*a)');\n *\n * console.log(isMatch('a.a'));\n * //=> false\n * console.log(isMatch('a.b'));\n * //=> true\n * ```\n * @param {String} `pattern` Extglob pattern\n * @param {String} `options`\n * @return {Boolean}\n * @api public\n */\n\nextglob.matcher = function(pattern, options) {\n if (typeof pattern !== 'string') {\n throw new TypeError('expected pattern to be a string');\n }\n\n function matcher() {\n var re = extglob.makeRe(pattern, options);\n return function(str) {\n return re.test(str);\n };\n }\n\n return utils.memoize('matcher', pattern, options, matcher);\n};\n\n/**\n * Convert the given `extglob` pattern into a regex-compatible string. Returns\n * an object with the compiled result and the parsed AST.\n *\n * ```js\n * var extglob = require('extglob');\n * console.log(extglob.create('*.!(*a)').output);\n * //=> '(?!\\\\.)[^/]*?\\\\.(?!(?!\\\\.)[^/]*?a\\\\b).*?'\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {String}\n * @api public\n */\n\nextglob.create = function(pattern, options) {\n if (typeof pattern !== 'string') {\n throw new TypeError('expected pattern to be a string');\n }\n\n function create() {\n var ext = new Extglob(options);\n var ast = ext.parse(pattern, options);\n return ext.compile(ast, options);\n }\n\n return utils.memoize('create', pattern, options, create);\n};\n\n/**\n * Returns an array of matches captured by `pattern` in `string`, or `null`\n * if the pattern did not match.\n *\n * ```js\n * var extglob = require('extglob');\n * extglob.capture(pattern, string[, options]);\n *\n * console.log(extglob.capture('test/*.js', 'test/foo.js'));\n * //=> ['foo']\n * console.log(extglob.capture('test/*.js', 'foo/bar.css'));\n * //=> null\n * ```\n * @param {String} `pattern` Glob pattern to use for matching.\n * @param {String} `string` String to match\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns an array of captures if the string matches the glob pattern, otherwise `null`.\n * @api public\n */\n\nextglob.capture = function(pattern, str, options) {\n var re = extglob.makeRe(pattern, extend({capture: true}, options));\n\n function match() {\n return function(string) {\n var match = re.exec(string);\n if (!match) {\n return null;\n }\n\n return match.slice(1);\n };\n }\n\n var capture = utils.memoize('capture', pattern, options, match);\n return capture(str);\n};\n\n/**\n * Create a regular expression from the given `pattern` and `options`.\n *\n * ```js\n * var extglob = require('extglob');\n * var re = extglob.makeRe('*.!(*a)');\n * console.log(re);\n * //=> /^[^\\/]*?\\.(?![^\\/]*?a)[^\\/]*?$/\n * ```\n * @param {String} `pattern` The pattern to convert to regex.\n * @param {Object} `options`\n * @return {RegExp}\n * @api public\n */\n\nextglob.makeRe = function(pattern, options) {\n if (pattern instanceof RegExp) {\n return pattern;\n }\n\n if (typeof pattern !== 'string') {\n throw new TypeError('expected pattern to be a string');\n }\n\n if (pattern.length > MAX_LENGTH) {\n throw new Error('expected pattern to be less than ' + MAX_LENGTH + ' characters');\n }\n\n function makeRe() {\n var opts = extend({strictErrors: false}, options);\n if (opts.strictErrors === true) opts.strict = true;\n var res = extglob.create(pattern, opts);\n return toRegex(res.output, opts);\n }\n\n var regex = utils.memoize('makeRe', pattern, options, makeRe);\n if (regex.source.length > MAX_LENGTH) {\n throw new SyntaxError('potentially malicious regex detected');\n }\n\n return regex;\n};\n\n/**\n * Cache\n */\n\nextglob.cache = utils.cache;\nextglob.clearCache = function() {\n extglob.cache.__data__ = {};\n};\n\n/**\n * Expose `Extglob` constructor, parsers and compilers\n */\n\nextglob.Extglob = Extglob;\nextglob.compilers = compilers;\nextglob.parsers = parsers;\n\n/**\n * Expose `extglob`\n * @type {Function}\n */\n\nmodule.exports = extglob;\n", "'use strict';\n\nvar nanomatch = require('nanomatch');\nvar extglob = require('extglob');\n\nmodule.exports = function(snapdragon) {\n var compilers = snapdragon.compiler.compilers;\n var opts = snapdragon.options;\n\n // register nanomatch compilers\n snapdragon.use(nanomatch.compilers);\n\n // get references to some specific nanomatch compilers before they\n // are overridden by the extglob and/or custom compilers\n var escape = compilers.escape;\n var qmark = compilers.qmark;\n var slash = compilers.slash;\n var star = compilers.star;\n var text = compilers.text;\n var plus = compilers.plus;\n var dot = compilers.dot;\n\n // register extglob compilers or escape exglobs if disabled\n if (opts.extglob === false || opts.noext === true) {\n snapdragon.compiler.use(escapeExtglobs);\n } else {\n snapdragon.use(extglob.compilers);\n }\n\n snapdragon.use(function() {\n this.options.star = this.options.star || function(/*node*/) {\n return '[^\\\\\\\\/]*?';\n };\n });\n\n // custom micromatch compilers\n snapdragon.compiler\n\n // reset referenced compiler\n .set('dot', dot)\n .set('escape', escape)\n .set('plus', plus)\n .set('slash', slash)\n .set('qmark', qmark)\n .set('star', star)\n .set('text', text);\n};\n\nfunction escapeExtglobs(compiler) {\n compiler.set('paren', function(node) {\n var val = '';\n visit(node, function(tok) {\n if (tok.val) val += (/^\\W/.test(tok.val) ? '\\\\' : '') + tok.val;\n });\n return this.emit(val, node);\n });\n\n /**\n * Visit `node` with the given `fn`\n */\n\n function visit(node, fn) {\n return node.nodes ? mapVisit(node.nodes, fn) : fn(node);\n }\n\n /**\n * Map visit over array of `nodes`.\n */\n\n function mapVisit(nodes, fn) {\n var len = nodes.length;\n var idx = -1;\n while (++idx < len) {\n visit(nodes[idx], fn);\n }\n }\n}\n", "'use strict';\n\nvar extglob = require('extglob');\nvar nanomatch = require('nanomatch');\nvar regexNot = require('regex-not');\nvar toRegex = require('to-regex');\nvar not;\n\n/**\n * Characters to use in negation regex (we want to \"not\" match\n * characters that are matched by other parsers)\n */\n\nvar TEXT = '([!@*?+]?\\\\(|\\\\)|\\\\[:?(?=.*?:?\\\\])|:?\\\\]|[*+?!^$.\\\\\\\\/])+';\nvar createNotRegex = function(opts) {\n return not || (not = textRegex(TEXT));\n};\n\n/**\n * Parsers\n */\n\nmodule.exports = function(snapdragon) {\n var parsers = snapdragon.parser.parsers;\n\n // register nanomatch parsers\n snapdragon.use(nanomatch.parsers);\n\n // get references to some specific nanomatch parsers before they\n // are overridden by the extglob and/or parsers\n var escape = parsers.escape;\n var slash = parsers.slash;\n var qmark = parsers.qmark;\n var plus = parsers.plus;\n var star = parsers.star;\n var dot = parsers.dot;\n\n // register extglob parsers\n snapdragon.use(extglob.parsers);\n\n // custom micromatch parsers\n snapdragon.parser\n .use(function() {\n // override \"notRegex\" created in nanomatch parser\n this.notRegex = /^\\!+(?!\\()/;\n })\n // reset the referenced parsers\n .capture('escape', escape)\n .capture('slash', slash)\n .capture('qmark', qmark)\n .capture('star', star)\n .capture('plus', plus)\n .capture('dot', dot)\n\n /**\n * Override `text` parser\n */\n\n .capture('text', function() {\n if (this.isInside('bracket')) return;\n var pos = this.position();\n var m = this.match(createNotRegex(this.options));\n if (!m || !m[0]) return;\n\n // escape regex boundary characters and simple brackets\n var val = m[0].replace(/([[\\]^$])/g, '\\\\$1');\n\n return pos({\n type: 'text',\n val: val\n });\n });\n};\n\n/**\n * Create text regex\n */\n\nfunction textRegex(pattern) {\n var notStr = regexNot.create(pattern, {contains: true, strictClose: false});\n var prefix = '(?:[\\\\^]|\\\\\\\\|';\n return toRegex(prefix + notStr + ')', {strictClose: false});\n}\n", "module.exports = new (require('fragment-cache'))();\n", "/*!\n * define-property <https://github.com/jonschlinkert/define-property>\n *\n * Copyright (c) 2015-2018, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar isobject = require('isobject');\nvar isDescriptor = require('is-descriptor');\nvar define = (typeof Reflect !== 'undefined' && Reflect.defineProperty)\n ? Reflect.defineProperty\n : Object.defineProperty;\n\nmodule.exports = function defineProperty(obj, key, val) {\n if (!isobject(obj) && typeof obj !== 'function' && !Array.isArray(obj)) {\n throw new TypeError('expected an object, function, or array');\n }\n\n if (typeof key !== 'string') {\n throw new TypeError('expected \"key\" to be a string');\n }\n\n if (isDescriptor(val)) {\n define(obj, key, val);\n return obj;\n }\n\n define(obj, key, {\n configurable: true,\n enumerable: false,\n writable: true,\n value: val\n });\n\n return obj;\n};\n", "var toString = Object.prototype.toString;\n\nmodule.exports = function kindOf(val) {\n if (val === void 0) return 'undefined';\n if (val === null) return 'null';\n\n var type = typeof val;\n if (type === 'boolean') return 'boolean';\n if (type === 'string') return 'string';\n if (type === 'number') return 'number';\n if (type === 'symbol') return 'symbol';\n if (type === 'function') {\n return isGeneratorFn(val) ? 'generatorfunction' : 'function';\n }\n\n if (isArray(val)) return 'array';\n if (isBuffer(val)) return 'buffer';\n if (isArguments(val)) return 'arguments';\n if (isDate(val)) return 'date';\n if (isError(val)) return 'error';\n if (isRegexp(val)) return 'regexp';\n\n switch (ctorName(val)) {\n case 'Symbol': return 'symbol';\n case 'Promise': return 'promise';\n\n // Set, Map, WeakSet, WeakMap\n case 'WeakMap': return 'weakmap';\n case 'WeakSet': return 'weakset';\n case 'Map': return 'map';\n case 'Set': return 'set';\n\n // 8-bit typed arrays\n case 'Int8Array': return 'int8array';\n case 'Uint8Array': return 'uint8array';\n case 'Uint8ClampedArray': return 'uint8clampedarray';\n\n // 16-bit typed arrays\n case 'Int16Array': return 'int16array';\n case 'Uint16Array': return 'uint16array';\n\n // 32-bit typed arrays\n case 'Int32Array': return 'int32array';\n case 'Uint32Array': return 'uint32array';\n case 'Float32Array': return 'float32array';\n case 'Float64Array': return 'float64array';\n }\n\n if (isGeneratorObj(val)) {\n return 'generator';\n }\n\n // Non-plain objects\n type = toString.call(val);\n switch (type) {\n case '[object Object]': return 'object';\n // iterators\n case '[object Map Iterator]': return 'mapiterator';\n case '[object Set Iterator]': return 'setiterator';\n case '[object String Iterator]': return 'stringiterator';\n case '[object Array Iterator]': return 'arrayiterator';\n }\n\n // other\n return type.slice(8, -1).toLowerCase().replace(/\\s/g, '');\n};\n\nfunction ctorName(val) {\n return val.constructor ? val.constructor.name : null;\n}\n\nfunction isArray(val) {\n if (Array.isArray) return Array.isArray(val);\n return val instanceof Array;\n}\n\nfunction isError(val) {\n return val instanceof Error || (typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number');\n}\n\nfunction isDate(val) {\n if (val instanceof Date) return true;\n return typeof val.toDateString === 'function'\n && typeof val.getDate === 'function'\n && typeof val.setDate === 'function';\n}\n\nfunction isRegexp(val) {\n if (val instanceof RegExp) return true;\n return typeof val.flags === 'string'\n && typeof val.ignoreCase === 'boolean'\n && typeof val.multiline === 'boolean'\n && typeof val.global === 'boolean';\n}\n\nfunction isGeneratorFn(name, val) {\n return ctorName(name) === 'GeneratorFunction';\n}\n\nfunction isGeneratorObj(val) {\n return typeof val.throw === 'function'\n && typeof val.return === 'function'\n && typeof val.next === 'function';\n}\n\nfunction isArguments(val) {\n try {\n if (typeof val.length === 'number' && typeof val.callee === 'function') {\n return true;\n }\n } catch (err) {\n if (err.message.indexOf('callee') !== -1) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * If you need to support Safari 5-7 (8-10 yr-old browser),\n * take a look at https://github.com/feross/is-buffer\n */\n\nfunction isBuffer(val) {\n if (val.constructor && typeof val.constructor.isBuffer === 'function') {\n return val.constructor.isBuffer(val);\n }\n return false;\n}\n", "'use strict';\n\nvar utils = module.exports;\nvar path = require('path');\n\n/**\n * Module dependencies\n */\n\nvar Snapdragon = require('snapdragon');\nutils.define = require('define-property');\nutils.diff = require('arr-diff');\nutils.extend = require('extend-shallow');\nutils.pick = require('object.pick');\nutils.typeOf = require('kind-of');\nutils.unique = require('array-unique');\n\n/**\n * Returns true if the platform is windows, or `path.sep` is `\\\\`.\n * This is defined as a function to allow `path.sep` to be set in unit tests,\n * or by the user, if there is a reason to do so.\n * @return {Boolean}\n */\n\nutils.isWindows = function() {\n return path.sep === '\\\\' || process.platform === 'win32';\n};\n\n/**\n * Get the `Snapdragon` instance to use\n */\n\nutils.instantiate = function(ast, options) {\n var snapdragon;\n // if an instance was created by `.parse`, use that instance\n if (utils.typeOf(ast) === 'object' && ast.snapdragon) {\n snapdragon = ast.snapdragon;\n // if the user supplies an instance on options, use that instance\n } else if (utils.typeOf(options) === 'object' && options.snapdragon) {\n snapdragon = options.snapdragon;\n // create a new instance\n } else {\n snapdragon = new Snapdragon(options);\n }\n\n utils.define(snapdragon, 'parse', function(str, options) {\n var parsed = Snapdragon.prototype.parse.apply(this, arguments);\n parsed.input = str;\n\n // escape unmatched brace/bracket/parens\n var last = this.parser.stack.pop();\n if (last && this.options.strictErrors !== true) {\n var open = last.nodes[0];\n var inner = last.nodes[1];\n if (last.type === 'bracket') {\n if (inner.val.charAt(0) === '[') {\n inner.val = '\\\\' + inner.val;\n }\n\n } else {\n open.val = '\\\\' + open.val;\n var sibling = open.parent.nodes[1];\n if (sibling.type === 'star') {\n sibling.loose = true;\n }\n }\n }\n\n // add non-enumerable parser reference\n utils.define(parsed, 'parser', this.parser);\n return parsed;\n });\n\n return snapdragon;\n};\n\n/**\n * Create the key to use for memoization. The key is generated\n * by iterating over the options and concatenating key-value pairs\n * to the pattern string.\n */\n\nutils.createKey = function(pattern, options) {\n if (utils.typeOf(options) !== 'object') {\n return pattern;\n }\n var val = pattern;\n var keys = Object.keys(options);\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n val += ';' + key + '=' + String(options[key]);\n }\n return val;\n};\n\n/**\n * Cast `val` to an array\n * @return {Array}\n */\n\nutils.arrayify = function(val) {\n if (typeof val === 'string') return [val];\n return val ? (Array.isArray(val) ? val : [val]) : [];\n};\n\n/**\n * Return true if `val` is a non-empty string\n */\n\nutils.isString = function(val) {\n return typeof val === 'string';\n};\n\n/**\n * Return true if `val` is a non-empty string\n */\n\nutils.isObject = function(val) {\n return utils.typeOf(val) === 'object';\n};\n\n/**\n * Returns true if the given `str` has special characters\n */\n\nutils.hasSpecialChars = function(str) {\n return /(?:(?:(^|\\/)[!.])|[*?+()|\\[\\]{}]|[+@]\\()/.test(str);\n};\n\n/**\n * Escape regex characters in the given string\n */\n\nutils.escapeRegex = function(str) {\n return str.replace(/[-[\\]{}()^$|*+?.\\\\\\/\\s]/g, '\\\\$&');\n};\n\n/**\n * Normalize slashes in the given filepath.\n *\n * @param {String} `filepath`\n * @return {String}\n */\n\nutils.toPosixPath = function(str) {\n return str.replace(/\\\\+/g, '/');\n};\n\n/**\n * Strip backslashes before special characters in a string.\n *\n * @param {String} `str`\n * @return {String}\n */\n\nutils.unescape = function(str) {\n return utils.toPosixPath(str.replace(/\\\\(?=[*+?!.])/g, ''));\n};\n\n/**\n * Strip the prefix from a filepath\n * @param {String} `fp`\n * @return {String}\n */\n\nutils.stripPrefix = function(str) {\n if (str.charAt(0) !== '.') {\n return str;\n }\n var ch = str.charAt(1);\n if (utils.isSlash(ch)) {\n return str.slice(2);\n }\n return str;\n};\n\n/**\n * Returns true if the given str is an escaped or\n * unescaped path character\n */\n\nutils.isSlash = function(str) {\n return str === '/' || str === '\\\\/' || str === '\\\\' || str === '\\\\\\\\';\n};\n\n/**\n * Returns a function that returns true if the given\n * pattern matches or contains a `filepath`\n *\n * @param {String} `pattern`\n * @return {Function}\n */\n\nutils.matchPath = function(pattern, options) {\n return (options && options.contains)\n ? utils.containsPattern(pattern, options)\n : utils.equalsPattern(pattern, options);\n};\n\n/**\n * Returns true if the given (original) filepath or unixified path are equal\n * to the given pattern.\n */\n\nutils._equals = function(filepath, unixPath, pattern) {\n return pattern === filepath || pattern === unixPath;\n};\n\n/**\n * Returns true if the given (original) filepath or unixified path contain\n * the given pattern.\n */\n\nutils._contains = function(filepath, unixPath, pattern) {\n return filepath.indexOf(pattern) !== -1 || unixPath.indexOf(pattern) !== -1;\n};\n\n/**\n * Returns a function that returns true if the given\n * pattern is the same as a given `filepath`\n *\n * @param {String} `pattern`\n * @return {Function}\n */\n\nutils.equalsPattern = function(pattern, options) {\n var unixify = utils.unixify(options);\n options = options || {};\n\n return function fn(filepath) {\n var equal = utils._equals(filepath, unixify(filepath), pattern);\n if (equal === true || options.nocase !== true) {\n return equal;\n }\n var lower = filepath.toLowerCase();\n return utils._equals(lower, unixify(lower), pattern);\n };\n};\n\n/**\n * Returns a function that returns true if the given\n * pattern contains a `filepath`\n *\n * @param {String} `pattern`\n * @return {Function}\n */\n\nutils.containsPattern = function(pattern, options) {\n var unixify = utils.unixify(options);\n options = options || {};\n\n return function(filepath) {\n var contains = utils._contains(filepath, unixify(filepath), pattern);\n if (contains === true || options.nocase !== true) {\n return contains;\n }\n var lower = filepath.toLowerCase();\n return utils._contains(lower, unixify(lower), pattern);\n };\n};\n\n/**\n * Returns a function that returns true if the given\n * regex matches the `filename` of a file path.\n *\n * @param {RegExp} `re` Matching regex\n * @return {Function}\n */\n\nutils.matchBasename = function(re) {\n return function(filepath) {\n return re.test(path.basename(filepath));\n };\n};\n\n/**\n * Determines the filepath to return based on the provided options.\n * @return {any}\n */\n\nutils.value = function(str, unixify, options) {\n if (options && options.unixify === false) {\n return str;\n }\n return unixify(str);\n};\n\n/**\n * Returns a function that normalizes slashes in a string to forward\n * slashes, strips `./` from beginning of paths, and optionally unescapes\n * special characters.\n * @return {Function}\n */\n\nutils.unixify = function(options) {\n options = options || {};\n return function(filepath) {\n if (utils.isWindows() || options.unixify === true) {\n filepath = utils.toPosixPath(filepath);\n }\n if (options.stripPrefix !== false) {\n filepath = utils.stripPrefix(filepath);\n }\n if (options.unescape === true) {\n filepath = utils.unescape(filepath);\n }\n return filepath;\n };\n};\n", "'use strict';\n\n/**\n * Module dependencies\n */\n\nvar util = require('util');\nvar braces = require('braces');\nvar toRegex = require('to-regex');\nvar extend = require('extend-shallow');\n\n/**\n * Local dependencies\n */\n\nvar compilers = require('./lib/compilers');\nvar parsers = require('./lib/parsers');\nvar cache = require('./lib/cache');\nvar utils = require('./lib/utils');\nvar MAX_LENGTH = 1024 * 64;\n\n/**\n * The main function takes a list of strings and one or more\n * glob patterns to use for matching.\n *\n * ```js\n * var mm = require('micromatch');\n * mm(list, patterns[, options]);\n *\n * console.log(mm(['a.js', 'a.txt'], ['*.js']));\n * //=> [ 'a.js' ]\n * ```\n * @param {Array} `list` A list of strings to match\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Array} Returns an array of matches\n * @summary false\n * @api public\n */\n\nfunction micromatch(list, patterns, options) {\n patterns = utils.arrayify(patterns);\n list = utils.arrayify(list);\n\n var len = patterns.length;\n if (list.length === 0 || len === 0) {\n return [];\n }\n\n if (len === 1) {\n return micromatch.match(list, patterns[0], options);\n }\n\n var omit = [];\n var keep = [];\n var idx = -1;\n\n while (++idx < len) {\n var pattern = patterns[idx];\n\n if (typeof pattern === 'string' && pattern.charCodeAt(0) === 33 /* ! */) {\n omit.push.apply(omit, micromatch.match(list, pattern.slice(1), options));\n } else {\n keep.push.apply(keep, micromatch.match(list, pattern, options));\n }\n }\n\n var matches = utils.diff(keep, omit);\n if (!options || options.nodupes !== false) {\n return utils.unique(matches);\n }\n\n return matches;\n}\n\n/**\n * Similar to the main function, but `pattern` must be a string.\n *\n * ```js\n * var mm = require('micromatch');\n * mm.match(list, pattern[, options]);\n *\n * console.log(mm.match(['a.a', 'a.aa', 'a.b', 'a.c'], '*.a'));\n * //=> ['a.a', 'a.aa']\n * ```\n * @param {Array} `list` Array of strings to match\n * @param {String} `pattern` Glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Array} Returns an array of matches\n * @api public\n */\n\nmicromatch.match = function(list, pattern, options) {\n if (Array.isArray(pattern)) {\n throw new TypeError('expected pattern to be a string');\n }\n\n var unixify = utils.unixify(options);\n var isMatch = memoize('match', pattern, options, micromatch.matcher);\n var matches = [];\n\n list = utils.arrayify(list);\n var len = list.length;\n var idx = -1;\n\n while (++idx < len) {\n var ele = list[idx];\n if (ele === pattern || isMatch(ele)) {\n matches.push(utils.value(ele, unixify, options));\n }\n }\n\n // if no options were passed, uniquify results and return\n if (typeof options === 'undefined') {\n return utils.unique(matches);\n }\n\n if (matches.length === 0) {\n if (options.failglob === true) {\n throw new Error('no matches found for \"' + pattern + '\"');\n }\n if (options.nonull === true || options.nullglob === true) {\n return [options.unescape ? utils.unescape(pattern) : pattern];\n }\n }\n\n // if `opts.ignore` was defined, diff ignored list\n if (options.ignore) {\n matches = micromatch.not(matches, options.ignore, options);\n }\n\n return options.nodupes !== false ? utils.unique(matches) : matches;\n};\n\n/**\n * Returns true if the specified `string` matches the given glob `pattern`.\n *\n * ```js\n * var mm = require('micromatch');\n * mm.isMatch(string, pattern[, options]);\n *\n * console.log(mm.isMatch('a.a', '*.a'));\n * //=> true\n * console.log(mm.isMatch('a.b', '*.a'));\n * //=> false\n * ```\n * @param {String} `string` String to match\n * @param {String} `pattern` Glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if the string matches the glob pattern.\n * @api public\n */\n\nmicromatch.isMatch = function(str, pattern, options) {\n if (typeof str !== 'string') {\n throw new TypeError('expected a string: \"' + util.inspect(str) + '\"');\n }\n\n if (isEmptyString(str) || isEmptyString(pattern)) {\n return false;\n }\n\n var equals = utils.equalsPattern(options);\n if (equals(str)) {\n return true;\n }\n\n var isMatch = memoize('isMatch', pattern, options, micromatch.matcher);\n return isMatch(str);\n};\n\n/**\n * Returns true if some of the strings in the given `list` match any of the\n * given glob `patterns`.\n *\n * ```js\n * var mm = require('micromatch');\n * mm.some(list, patterns[, options]);\n *\n * console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js']));\n * // true\n * console.log(mm.some(['foo.js'], ['*.js', '!foo.js']));\n * // false\n * ```\n * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nmicromatch.some = function(list, patterns, options) {\n if (typeof list === 'string') {\n list = [list];\n }\n for (var i = 0; i < list.length; i++) {\n if (micromatch(list[i], patterns, options).length === 1) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * Returns true if every string in the given `list` matches\n * any of the given glob `patterns`.\n *\n * ```js\n * var mm = require('micromatch');\n * mm.every(list, patterns[, options]);\n *\n * console.log(mm.every('foo.js', ['foo.js']));\n * // true\n * console.log(mm.every(['foo.js', 'bar.js'], ['*.js']));\n * // true\n * console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js']));\n * // false\n * console.log(mm.every(['foo.js'], ['*.js', '!foo.js']));\n * // false\n * ```\n * @param {String|Array} `list` The string or array of strings to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nmicromatch.every = function(list, patterns, options) {\n if (typeof list === 'string') {\n list = [list];\n }\n for (var i = 0; i < list.length; i++) {\n if (micromatch(list[i], patterns, options).length !== 1) {\n return false;\n }\n }\n return true;\n};\n\n/**\n * Returns true if **any** of the given glob `patterns`\n * match the specified `string`.\n *\n * ```js\n * var mm = require('micromatch');\n * mm.any(string, patterns[, options]);\n *\n * console.log(mm.any('a.a', ['b.*', '*.a']));\n * //=> true\n * console.log(mm.any('a.a', 'b.*'));\n * //=> false\n * ```\n * @param {String|Array} `str` The string to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nmicromatch.any = function(str, patterns, options) {\n if (typeof str !== 'string') {\n throw new TypeError('expected a string: \"' + util.inspect(str) + '\"');\n }\n\n if (isEmptyString(str) || isEmptyString(patterns)) {\n return false;\n }\n\n if (typeof patterns === 'string') {\n patterns = [patterns];\n }\n\n for (var i = 0; i < patterns.length; i++) {\n if (micromatch.isMatch(str, patterns[i], options)) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * Returns true if **all** of the given `patterns` match\n * the specified string.\n *\n * ```js\n * var mm = require('micromatch');\n * mm.all(string, patterns[, options]);\n *\n * console.log(mm.all('foo.js', ['foo.js']));\n * // true\n *\n * console.log(mm.all('foo.js', ['*.js', '!foo.js']));\n * // false\n *\n * console.log(mm.all('foo.js', ['*.js', 'foo.js']));\n * // true\n *\n * console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js']));\n * // true\n * ```\n * @param {String|Array} `str` The string to test.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if any patterns match `str`\n * @api public\n */\n\nmicromatch.all = function(str, patterns, options) {\n if (typeof str !== 'string') {\n throw new TypeError('expected a string: \"' + util.inspect(str) + '\"');\n }\n if (typeof patterns === 'string') {\n patterns = [patterns];\n }\n for (var i = 0; i < patterns.length; i++) {\n if (!micromatch.isMatch(str, patterns[i], options)) {\n return false;\n }\n }\n return true;\n};\n\n/**\n * Returns a list of strings that _**do not match any**_ of the given `patterns`.\n *\n * ```js\n * var mm = require('micromatch');\n * mm.not(list, patterns[, options]);\n *\n * console.log(mm.not(['a.a', 'b.b', 'c.c'], '*.a'));\n * //=> ['b.b', 'c.c']\n * ```\n * @param {Array} `list` Array of strings to match.\n * @param {String|Array} `patterns` One or more glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Array} Returns an array of strings that **do not match** the given patterns.\n * @api public\n */\n\nmicromatch.not = function(list, patterns, options) {\n var opts = extend({}, options);\n var ignore = opts.ignore;\n delete opts.ignore;\n\n var unixify = utils.unixify(opts);\n list = utils.arrayify(list).map(unixify);\n\n var matches = utils.diff(list, micromatch(list, patterns, opts));\n if (ignore) {\n matches = utils.diff(matches, micromatch(list, ignore));\n }\n\n return opts.nodupes !== false ? utils.unique(matches) : matches;\n};\n\n/**\n * Returns true if the given `string` contains the given pattern. Similar\n * to [.isMatch](#isMatch) but the pattern can match any part of the string.\n *\n * ```js\n * var mm = require('micromatch');\n * mm.contains(string, pattern[, options]);\n *\n * console.log(mm.contains('aa/bb/cc', '*b'));\n * //=> true\n * console.log(mm.contains('aa/bb/cc', '*d'));\n * //=> false\n * ```\n * @param {String} `str` The string to match.\n * @param {String|Array} `patterns` Glob pattern to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns true if the patter matches any part of `str`.\n * @api public\n */\n\nmicromatch.contains = function(str, patterns, options) {\n if (typeof str !== 'string') {\n throw new TypeError('expected a string: \"' + util.inspect(str) + '\"');\n }\n\n if (typeof patterns === 'string') {\n if (isEmptyString(str) || isEmptyString(patterns)) {\n return false;\n }\n\n var equals = utils.equalsPattern(patterns, options);\n if (equals(str)) {\n return true;\n }\n var contains = utils.containsPattern(patterns, options);\n if (contains(str)) {\n return true;\n }\n }\n\n var opts = extend({}, options, {contains: true});\n return micromatch.any(str, patterns, opts);\n};\n\n/**\n * Returns true if the given pattern and options should enable\n * the `matchBase` option.\n * @return {Boolean}\n * @api private\n */\n\nmicromatch.matchBase = function(pattern, options) {\n if (pattern && pattern.indexOf('/') !== -1 || !options) return false;\n return options.basename === true || options.matchBase === true;\n};\n\n/**\n * Filter the keys of the given object with the given `glob` pattern\n * and `options`. Does not attempt to match nested keys. If you need this feature,\n * use [glob-object][] instead.\n *\n * ```js\n * var mm = require('micromatch');\n * mm.matchKeys(object, patterns[, options]);\n *\n * var obj = { aa: 'a', ab: 'b', ac: 'c' };\n * console.log(mm.matchKeys(obj, '*b'));\n * //=> { ab: 'b' }\n * ```\n * @param {Object} `object` The object with keys to filter.\n * @param {String|Array} `patterns` One or more glob patterns to use for matching.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Object} Returns an object with only keys that match the given patterns.\n * @api public\n */\n\nmicromatch.matchKeys = function(obj, patterns, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('expected the first argument to be an object');\n }\n var keys = micromatch(Object.keys(obj), patterns, options);\n return utils.pick(obj, keys);\n};\n\n/**\n * Returns a memoized matcher function from the given glob `pattern` and `options`.\n * The returned function takes a string to match as its only argument and returns\n * true if the string is a match.\n *\n * ```js\n * var mm = require('micromatch');\n * mm.matcher(pattern[, options]);\n *\n * var isMatch = mm.matcher('*.!(*a)');\n * console.log(isMatch('a.a'));\n * //=> false\n * console.log(isMatch('a.b'));\n * //=> true\n * ```\n * @param {String} `pattern` Glob pattern\n * @param {Object} `options` See available [options](#options) for changing how matches are performed.\n * @return {Function} Returns a matcher function.\n * @api public\n */\n\nmicromatch.matcher = function matcher(pattern, options) {\n if (Array.isArray(pattern)) {\n return compose(pattern, options, matcher);\n }\n\n // if pattern is a regex\n if (pattern instanceof RegExp) {\n return test(pattern);\n }\n\n // if pattern is invalid\n if (!utils.isString(pattern)) {\n throw new TypeError('expected pattern to be an array, string or regex');\n }\n\n // if pattern is a non-glob string\n if (!utils.hasSpecialChars(pattern)) {\n if (options && options.nocase === true) {\n pattern = pattern.toLowerCase();\n }\n return utils.matchPath(pattern, options);\n }\n\n // if pattern is a glob string\n var re = micromatch.makeRe(pattern, options);\n\n // if `options.matchBase` or `options.basename` is defined\n if (micromatch.matchBase(pattern, options)) {\n return utils.matchBasename(re, options);\n }\n\n function test(regex) {\n var equals = utils.equalsPattern(options);\n var unixify = utils.unixify(options);\n\n return function(str) {\n if (equals(str)) {\n return true;\n }\n\n if (regex.test(unixify(str))) {\n return true;\n }\n return false;\n };\n }\n\n var fn = test(re);\n Object.defineProperty(fn, 'result', {\n configurable: true,\n enumerable: false,\n value: re.result\n });\n return fn;\n};\n\n/**\n * Returns an array of matches captured by `pattern` in `string, or `null` if the pattern did not match.\n *\n * ```js\n * var mm = require('micromatch');\n * mm.capture(pattern, string[, options]);\n *\n * console.log(mm.capture('test/*.js', 'test/foo.js'));\n * //=> ['foo']\n * console.log(mm.capture('test/*.js', 'foo/bar.css'));\n * //=> null\n * ```\n * @param {String} `pattern` Glob pattern to use for matching.\n * @param {String} `string` String to match\n * @param {Object} `options` See available [options](#options) for changing how matches are performed\n * @return {Boolean} Returns an array of captures if the string matches the glob pattern, otherwise `null`.\n * @api public\n */\n\nmicromatch.capture = function(pattern, str, options) {\n var re = micromatch.makeRe(pattern, extend({capture: true}, options));\n var unixify = utils.unixify(options);\n\n function match() {\n return function(string) {\n var match = re.exec(unixify(string));\n if (!match) {\n return null;\n }\n\n return match.slice(1);\n };\n }\n\n var capture = memoize('capture', pattern, options, match);\n return capture(str);\n};\n\n/**\n * Create a regular expression from the given glob `pattern`.\n *\n * ```js\n * var mm = require('micromatch');\n * mm.makeRe(pattern[, options]);\n *\n * console.log(mm.makeRe('*.js'));\n * //=> /^(?:(\\.[\\\\\\/])?(?!\\.)(?=.)[^\\/]*?\\.js)$/\n * ```\n * @param {String} `pattern` A glob pattern to convert to regex.\n * @param {Object} `options` See available [options](#options) for changing how matches are performed.\n * @return {RegExp} Returns a regex created from the given pattern.\n * @api public\n */\n\nmicromatch.makeRe = function(pattern, options) {\n if (typeof pattern !== 'string') {\n throw new TypeError('expected pattern to be a string');\n }\n\n if (pattern.length > MAX_LENGTH) {\n throw new Error('expected pattern to be less than ' + MAX_LENGTH + ' characters');\n }\n\n function makeRe() {\n var result = micromatch.create(pattern, options);\n var ast_array = [];\n var output = result.map(function(obj) {\n obj.ast.state = obj.state;\n ast_array.push(obj.ast);\n return obj.output;\n });\n\n var regex = toRegex(output.join('|'), options);\n Object.defineProperty(regex, 'result', {\n configurable: true,\n enumerable: false,\n value: ast_array\n });\n return regex;\n }\n\n return memoize('makeRe', pattern, options, makeRe);\n};\n\n/**\n * Expand the given brace `pattern`.\n *\n * ```js\n * var mm = require('micromatch');\n * console.log(mm.braces('foo/{a,b}/bar'));\n * //=> ['foo/(a|b)/bar']\n *\n * console.log(mm.braces('foo/{a,b}/bar', {expand: true}));\n * //=> ['foo/(a|b)/bar']\n * ```\n * @param {String} `pattern` String with brace pattern to expand.\n * @param {Object} `options` Any [options](#options) to change how expansion is performed. See the [braces][] library for all available options.\n * @return {Array}\n * @api public\n */\n\nmicromatch.braces = function(pattern, options) {\n if (typeof pattern !== 'string' && !Array.isArray(pattern)) {\n throw new TypeError('expected pattern to be an array or string');\n }\n\n function expand() {\n if (options && options.nobrace === true || !/\\{.*\\}/.test(pattern)) {\n return utils.arrayify(pattern);\n }\n return braces(pattern, options);\n }\n\n return memoize('braces', pattern, options, expand);\n};\n\n/**\n * Proxy to the [micromatch.braces](#method), for parity with\n * minimatch.\n */\n\nmicromatch.braceExpand = function(pattern, options) {\n var opts = extend({}, options, {expand: true});\n return micromatch.braces(pattern, opts);\n};\n\n/**\n * Parses the given glob `pattern` and returns an array of abstract syntax\n * trees (ASTs), with the compiled `output` and optional source `map` on\n * each AST.\n *\n * ```js\n * var mm = require('micromatch');\n * mm.create(pattern[, options]);\n *\n * console.log(mm.create('abc/*.js'));\n * // [{ options: { source: 'string', sourcemap: true },\n * // state: {},\n * // compilers:\n * // { ... },\n * // output: '(\\\\.[\\\\\\\\\\\\/])?abc\\\\/(?!\\\\.)(?=.)[^\\\\/]*?\\\\.js',\n * // ast:\n * // { type: 'root',\n * // errors: [],\n * // nodes:\n * // [ ... ],\n * // dot: false,\n * // input: 'abc/*.js' },\n * // parsingErrors: [],\n * // map:\n * // { version: 3,\n * // sources: [ 'string' ],\n * // names: [],\n * // mappings: 'AAAA,GAAG,EAAC,kBAAC,EAAC,EAAE',\n * // sourcesContent: [ 'abc/*.js' ] },\n * // position: { line: 1, column: 28 },\n * // content: {},\n * // files: {},\n * // idx: 6 }]\n * ```\n * @param {String} `pattern` Glob pattern to parse and compile.\n * @param {Object} `options` Any [options](#options) to change how parsing and compiling is performed.\n * @return {Object} Returns an object with the parsed AST, compiled string and optional source map.\n * @api public\n */\n\nmicromatch.create = function(pattern, options) {\n return memoize('create', pattern, options, function() {\n function create(str, opts) {\n return micromatch.compile(micromatch.parse(str, opts), opts);\n }\n\n pattern = micromatch.braces(pattern, options);\n var len = pattern.length;\n var idx = -1;\n var res = [];\n\n while (++idx < len) {\n res.push(create(pattern[idx], options));\n }\n return res;\n });\n};\n\n/**\n * Parse the given `str` with the given `options`.\n *\n * ```js\n * var mm = require('micromatch');\n * mm.parse(pattern[, options]);\n *\n * var ast = mm.parse('a/{b,c}/d');\n * console.log(ast);\n * // { type: 'root',\n * // errors: [],\n * // input: 'a/{b,c}/d',\n * // nodes:\n * // [ { type: 'bos', val: '' },\n * // { type: 'text', val: 'a/' },\n * // { type: 'brace',\n * // nodes:\n * // [ { type: 'brace.open', val: '{' },\n * // { type: 'text', val: 'b,c' },\n * // { type: 'brace.close', val: '}' } ] },\n * // { type: 'text', val: '/d' },\n * // { type: 'eos', val: '' } ] }\n * ```\n * @param {String} `str`\n * @param {Object} `options`\n * @return {Object} Returns an AST\n * @api public\n */\n\nmicromatch.parse = function(pattern, options) {\n if (typeof pattern !== 'string') {\n throw new TypeError('expected a string');\n }\n\n function parse() {\n var snapdragon = utils.instantiate(null, options);\n parsers(snapdragon, options);\n\n var ast = snapdragon.parse(pattern, options);\n utils.define(ast, 'snapdragon', snapdragon);\n ast.input = pattern;\n return ast;\n }\n\n return memoize('parse', pattern, options, parse);\n};\n\n/**\n * Compile the given `ast` or string with the given `options`.\n *\n * ```js\n * var mm = require('micromatch');\n * mm.compile(ast[, options]);\n *\n * var ast = mm.parse('a/{b,c}/d');\n * console.log(mm.compile(ast));\n * // { options: { source: 'string' },\n * // state: {},\n * // compilers:\n * // { eos: [Function],\n * // noop: [Function],\n * // bos: [Function],\n * // brace: [Function],\n * // 'brace.open': [Function],\n * // text: [Function],\n * // 'brace.close': [Function] },\n * // output: [ 'a/(b|c)/d' ],\n * // ast:\n * // { ... },\n * // parsingErrors: [] }\n * ```\n * @param {Object|String} `ast`\n * @param {Object} `options`\n * @return {Object} Returns an object that has an `output` property with the compiled string.\n * @api public\n */\n\nmicromatch.compile = function(ast, options) {\n if (typeof ast === 'string') {\n ast = micromatch.parse(ast, options);\n }\n\n return memoize('compile', ast.input, options, function() {\n var snapdragon = utils.instantiate(ast, options);\n compilers(snapdragon, options);\n return snapdragon.compile(ast, options);\n });\n};\n\n/**\n * Clear the regex cache.\n *\n * ```js\n * mm.clearCache();\n * ```\n * @api public\n */\n\nmicromatch.clearCache = function() {\n micromatch.cache.caches = {};\n};\n\n/**\n * Returns true if the given value is effectively an empty string\n */\n\nfunction isEmptyString(val) {\n return String(val) === '' || String(val) === './';\n}\n\n/**\n * Compose a matcher function with the given patterns.\n * This allows matcher functions to be compiled once and\n * called multiple times.\n */\n\nfunction compose(patterns, options, matcher) {\n var matchers;\n\n return memoize('compose', String(patterns), options, function() {\n return function(file) {\n // delay composition until it's invoked the first time,\n // after that it won't be called again\n if (!matchers) {\n matchers = [];\n for (var i = 0; i < patterns.length; i++) {\n matchers.push(matcher(patterns[i], options));\n }\n }\n\n var len = matchers.length;\n while (len--) {\n if (matchers[len](file) === true) {\n return true;\n }\n }\n return false;\n };\n });\n}\n\n/**\n * Memoize a generated regex or function. A unique key is generated\n * from the `type` (usually method name), the `pattern`, and\n * user-defined options.\n */\n\nfunction memoize(type, pattern, options, fn) {\n var key = utils.createKey(type + '=' + pattern, options);\n\n if (options && options.cache === false) {\n return fn(pattern, options);\n }\n\n if (cache.has(type, key)) {\n return cache.get(type, key);\n }\n\n var val = fn(pattern, options);\n cache.set(type, key, val);\n return val;\n}\n\n/**\n * Expose compiler, parser and cache on `micromatch`\n */\n\nmicromatch.compilers = compilers;\nmicromatch.parsers = parsers;\nmicromatch.caches = cache.caches;\n\n/**\n * Expose `micromatch`\n * @type {Function}\n */\n\nmodule.exports = micromatch;\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar path = require(\"path\");\r\nvar globParent = require(\"glob-parent\");\r\nvar isGlob = require(\"is-glob\");\r\nvar micromatch = require(\"micromatch\");\r\nvar GLOBSTAR = '**';\r\n/**\r\n * Return true for static pattern.\r\n */\r\nfunction isStaticPattern(pattern) {\r\n return !isDynamicPattern(pattern);\r\n}\r\nexports.isStaticPattern = isStaticPattern;\r\n/**\r\n * Return true for pattern that looks like glob.\r\n */\r\nfunction isDynamicPattern(pattern) {\r\n return isGlob(pattern, { strict: false });\r\n}\r\nexports.isDynamicPattern = isDynamicPattern;\r\n/**\r\n * Convert a windows \u00ABpath\u00BB to a unix-style \u00ABpath\u00BB.\r\n */\r\nfunction unixifyPattern(pattern) {\r\n return pattern.replace(/\\\\/g, '/');\r\n}\r\nexports.unixifyPattern = unixifyPattern;\r\n/**\r\n * Returns negative pattern as positive pattern.\r\n */\r\nfunction convertToPositivePattern(pattern) {\r\n return isNegativePattern(pattern) ? pattern.slice(1) : pattern;\r\n}\r\nexports.convertToPositivePattern = convertToPositivePattern;\r\n/**\r\n * Returns positive pattern as negative pattern.\r\n */\r\nfunction convertToNegativePattern(pattern) {\r\n return '!' + pattern;\r\n}\r\nexports.convertToNegativePattern = convertToNegativePattern;\r\n/**\r\n * Return true if provided pattern is negative pattern.\r\n */\r\nfunction isNegativePattern(pattern) {\r\n return pattern.startsWith('!') && pattern[1] !== '(';\r\n}\r\nexports.isNegativePattern = isNegativePattern;\r\n/**\r\n * Return true if provided pattern is positive pattern.\r\n */\r\nfunction isPositivePattern(pattern) {\r\n return !isNegativePattern(pattern);\r\n}\r\nexports.isPositivePattern = isPositivePattern;\r\n/**\r\n * Extracts negative patterns from array of patterns.\r\n */\r\nfunction getNegativePatterns(patterns) {\r\n return patterns.filter(isNegativePattern);\r\n}\r\nexports.getNegativePatterns = getNegativePatterns;\r\n/**\r\n * Extracts positive patterns from array of patterns.\r\n */\r\nfunction getPositivePatterns(patterns) {\r\n return patterns.filter(isPositivePattern);\r\n}\r\nexports.getPositivePatterns = getPositivePatterns;\r\n/**\r\n * Extract base directory from provided pattern.\r\n */\r\nfunction getBaseDirectory(pattern) {\r\n return globParent(pattern);\r\n}\r\nexports.getBaseDirectory = getBaseDirectory;\r\n/**\r\n * Return true if provided pattern has globstar.\r\n */\r\nfunction hasGlobStar(pattern) {\r\n return pattern.indexOf(GLOBSTAR) !== -1;\r\n}\r\nexports.hasGlobStar = hasGlobStar;\r\n/**\r\n * Return true if provided pattern ends with slash and globstar.\r\n */\r\nfunction endsWithSlashGlobStar(pattern) {\r\n return pattern.endsWith('/' + GLOBSTAR);\r\n}\r\nexports.endsWithSlashGlobStar = endsWithSlashGlobStar;\r\n/**\r\n * Returns \u00ABtrue\u00BB when pattern ends with a slash and globstar or the last partial of the pattern is static pattern.\r\n */\r\nfunction isAffectDepthOfReadingPattern(pattern) {\r\n var basename = path.basename(pattern);\r\n return endsWithSlashGlobStar(pattern) || isStaticPattern(basename);\r\n}\r\nexports.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern;\r\n/**\r\n * Return naive depth of provided pattern without depth of the base directory.\r\n */\r\nfunction getNaiveDepth(pattern) {\r\n var base = getBaseDirectory(pattern);\r\n var patternDepth = pattern.split('/').length;\r\n var patternBaseDepth = base.split('/').length;\r\n /**\r\n * This is a hack for pattern that has no base directory.\r\n *\r\n * This is related to the `*\\something\\*` pattern.\r\n */\r\n if (base === '.') {\r\n return patternDepth - patternBaseDepth;\r\n }\r\n return patternDepth - patternBaseDepth - 1;\r\n}\r\nexports.getNaiveDepth = getNaiveDepth;\r\n/**\r\n * Return max naive depth of provided patterns without depth of the base directory.\r\n */\r\nfunction getMaxNaivePatternsDepth(patterns) {\r\n return patterns.reduce(function (max, pattern) {\r\n var depth = getNaiveDepth(pattern);\r\n return depth > max ? depth : max;\r\n }, 0);\r\n}\r\nexports.getMaxNaivePatternsDepth = getMaxNaivePatternsDepth;\r\n/**\r\n * Make RegExp for provided pattern.\r\n */\r\nfunction makeRe(pattern, options) {\r\n return micromatch.makeRe(pattern, options);\r\n}\r\nexports.makeRe = makeRe;\r\n/**\r\n * Convert patterns to regexps.\r\n */\r\nfunction convertPatternsToRe(patterns, options) {\r\n return patterns.map(function (pattern) { return makeRe(pattern, options); });\r\n}\r\nexports.convertPatternsToRe = convertPatternsToRe;\r\n/**\r\n * Returns true if the entry match any of the given RegExp's.\r\n */\r\nfunction matchAny(entry, patternsRe) {\r\n return patternsRe.some(function (patternRe) { return patternRe.test(entry); });\r\n}\r\nexports.matchAny = matchAny;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar patternUtils = require(\"../utils/pattern\");\r\n/**\r\n * Generate tasks based on parent directory of each pattern.\r\n */\r\nfunction generate(patterns, options) {\r\n var unixPatterns = patterns.map(patternUtils.unixifyPattern);\r\n var unixIgnore = options.ignore.map(patternUtils.unixifyPattern);\r\n var positivePatterns = getPositivePatterns(unixPatterns);\r\n var negativePatterns = getNegativePatternsAsPositive(unixPatterns, unixIgnore);\r\n /**\r\n * When the `case` option is disabled, all patterns must be marked as dynamic, because we cannot check filepath\r\n * directly (without read directory).\r\n */\r\n var staticPatterns = !options.case ? [] : positivePatterns.filter(patternUtils.isStaticPattern);\r\n var dynamicPatterns = !options.case ? positivePatterns : positivePatterns.filter(patternUtils.isDynamicPattern);\r\n var staticTasks = convertPatternsToTasks(staticPatterns, negativePatterns, /* dynamic */ false);\r\n var dynamicTasks = convertPatternsToTasks(dynamicPatterns, negativePatterns, /* dynamic */ true);\r\n return staticTasks.concat(dynamicTasks);\r\n}\r\nexports.generate = generate;\r\n/**\r\n * Convert patterns to tasks based on parent directory of each pattern.\r\n */\r\nfunction convertPatternsToTasks(positive, negative, dynamic) {\r\n var positivePatternsGroup = groupPatternsByBaseDirectory(positive);\r\n // When we have a global group \u2013 there is no reason to divide the patterns into independent tasks.\r\n // In this case, the global task covers the rest.\r\n if ('.' in positivePatternsGroup) {\r\n var task = convertPatternGroupToTask('.', positive, negative, dynamic);\r\n return [task];\r\n }\r\n return convertPatternGroupsToTasks(positivePatternsGroup, negative, dynamic);\r\n}\r\nexports.convertPatternsToTasks = convertPatternsToTasks;\r\n/**\r\n * Return only positive patterns.\r\n */\r\nfunction getPositivePatterns(patterns) {\r\n return patternUtils.getPositivePatterns(patterns);\r\n}\r\nexports.getPositivePatterns = getPositivePatterns;\r\n/**\r\n * Return only negative patterns.\r\n */\r\nfunction getNegativePatternsAsPositive(patterns, ignore) {\r\n var negative = patternUtils.getNegativePatterns(patterns).concat(ignore);\r\n var positive = negative.map(patternUtils.convertToPositivePattern);\r\n return positive;\r\n}\r\nexports.getNegativePatternsAsPositive = getNegativePatternsAsPositive;\r\n/**\r\n * Group patterns by base directory of each pattern.\r\n */\r\nfunction groupPatternsByBaseDirectory(patterns) {\r\n return patterns.reduce(function (collection, pattern) {\r\n var base = patternUtils.getBaseDirectory(pattern);\r\n if (base in collection) {\r\n collection[base].push(pattern);\r\n }\r\n else {\r\n collection[base] = [pattern];\r\n }\r\n return collection;\r\n }, {});\r\n}\r\nexports.groupPatternsByBaseDirectory = groupPatternsByBaseDirectory;\r\n/**\r\n * Convert group of patterns to tasks.\r\n */\r\nfunction convertPatternGroupsToTasks(positive, negative, dynamic) {\r\n return Object.keys(positive).map(function (base) {\r\n return convertPatternGroupToTask(base, positive[base], negative, dynamic);\r\n });\r\n}\r\nexports.convertPatternGroupsToTasks = convertPatternGroupsToTasks;\r\n/**\r\n * Create a task for positive and negative patterns.\r\n */\r\nfunction convertPatternGroupToTask(base, positive, negative, dynamic) {\r\n return {\r\n base: base,\r\n dynamic: dynamic,\r\n positive: positive,\r\n negative: negative,\r\n patterns: [].concat(positive, negative.map(patternUtils.convertToNegativePattern))\r\n };\r\n}\r\nexports.convertPatternGroupToTask = convertPatternGroupToTask;\r\n", "module.exports = function (glob, opts) {\n if (typeof glob !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n var str = String(glob);\n\n // The regexp we are building, as a string.\n var reStr = \"\";\n\n // Whether we are matching so called \"extended\" globs (like bash) and should\n // support single character matching, matching ranges of characters, group\n // matching, etc.\n var extended = opts ? !!opts.extended : false;\n\n // When globstar is _false_ (default), '/foo/*' is translated a regexp like\n // '^\\/foo\\/.*$' which will match any string beginning with '/foo/'\n // When globstar is _true_, '/foo/*' is translated to regexp like\n // '^\\/foo\\/[^/]*$' which will match any string beginning with '/foo/' BUT\n // which does not have a '/' to the right of it.\n // E.g. with '/foo/*' these will match: '/foo/bar', '/foo/bar.txt' but\n // these will not '/foo/bar/baz', '/foo/bar/baz.txt'\n // Lastely, when globstar is _true_, '/foo/**' is equivelant to '/foo/*' when\n // globstar is _false_\n var globstar = opts ? !!opts.globstar : false;\n\n // If we are doing extended matching, this boolean is true when we are inside\n // a group (eg {*.html,*.js}), and false otherwise.\n var inGroup = false;\n\n // RegExp flags (eg \"i\" ) to pass in to RegExp constructor.\n var flags = opts && typeof( opts.flags ) === \"string\" ? opts.flags : \"\";\n\n var c;\n for (var i = 0, len = str.length; i < len; i++) {\n c = str[i];\n\n switch (c) {\n case \"\\\\\":\n case \"/\":\n case \"$\":\n case \"^\":\n case \"+\":\n case \".\":\n case \"(\":\n case \")\":\n case \"=\":\n case \"!\":\n case \"|\":\n reStr += \"\\\\\" + c;\n break;\n\n case \"?\":\n if (extended) {\n reStr += \".\";\n\t break;\n }\n\n case \"[\":\n case \"]\":\n if (extended) {\n reStr += c;\n\t break;\n }\n\n case \"{\":\n if (extended) {\n inGroup = true;\n\t reStr += \"(\";\n\t break;\n }\n\n case \"}\":\n if (extended) {\n inGroup = false;\n\t reStr += \")\";\n\t break;\n }\n\n case \",\":\n if (inGroup) {\n reStr += \"|\";\n\t break;\n }\n reStr += \"\\\\\" + c;\n break;\n\n case \"*\":\n // Move over all consecutive \"*\"'s.\n // Also store the previous and next characters\n var prevChar = str[i - 1];\n var starCount = 1;\n while(str[i + 1] === \"*\") {\n starCount++;\n i++;\n }\n var nextChar = str[i + 1];\n\n if (!globstar) {\n // globstar is disabled, so treat any number of \"*\" as one\n reStr += \".*\";\n } else {\n // globstar is enabled, so determine if this is a globstar segment\n var isGlobstar = starCount > 1 // multiple \"*\"'s\n && (prevChar === \"/\" || prevChar === undefined) // from the start of the segment\n && (nextChar === \"/\" || nextChar === undefined) // to the end of the segment\n\n if (isGlobstar) {\n // it's a globstar, so match zero or more path segments\n reStr += \"(?:[^/]*(?:\\/|$))*\";\n i++; // move over the \"/\"\n } else {\n // it's not a globstar, so only match one path segment\n reStr += \"[^/]*\";\n }\n }\n break;\n\n default:\n reStr += c;\n }\n }\n\n // When regexp 'g' flag is specified don't\n // constrain the regular expression with ^ & $\n if (!flags || !~flags.indexOf('g')) {\n reStr = \"^\" + reStr + \"$\";\n }\n\n return new RegExp(reStr, flags);\n};\n", "'use strict';\n\nconst path = require('path');\nconst globToRegExp = require('glob-to-regexp');\n\nmodule.exports = normalizeOptions;\n\nlet isWindows = /^win/.test(process.platform);\n\n/**\n * @typedef {Object} FSFacade\n * @property {fs.readdir} readdir\n * @property {fs.stat} stat\n * @property {fs.lstat} lstat\n */\n\n/**\n * Validates and normalizes the options argument\n *\n * @param {object} [options] - User-specified options, if any\n * @param {object} internalOptions - Internal options that aren't part of the public API\n *\n * @param {number|boolean|function} [options.deep]\n * The number of directories to recursively traverse. Any falsy value or negative number will\n * default to zero, so only the top-level contents will be returned. Set to `true` or `Infinity`\n * to traverse all subdirectories. Or provide a function that accepts a {@link fs.Stats} object\n * and returns a truthy value if the directory's contents should be crawled.\n *\n * @param {function|string|RegExp} [options.filter]\n * A function that accepts a {@link fs.Stats} object and returns a truthy value if the data should\n * be returned. Or a RegExp or glob string pattern, to filter by file name.\n *\n * @param {string} [options.sep]\n * The path separator to use. By default, the OS-specific separator will be used, but this can be\n * set to a specific value to ensure consistency across platforms.\n *\n * @param {string} [options.basePath]\n * The base path to prepend to each result. If empty, then all results will be relative to `dir`.\n *\n * @param {FSFacade} [options.fs]\n * Synchronous or asynchronous facades for Node.js File System module\n *\n * @param {object} [internalOptions.facade]\n * Synchronous or asynchronous facades for various methods, including for the Node.js File System module\n *\n * @param {boolean} [internalOptions.emit]\n * Indicates whether the reader should emit \"file\", \"directory\", and \"symlink\" events\n *\n * @param {boolean} [internalOptions.stats]\n * Indicates whether the reader should emit {@link fs.Stats} objects instead of path strings\n *\n * @returns {object}\n */\nfunction normalizeOptions (options, internalOptions) {\n if (options === null || options === undefined) {\n options = {};\n }\n else if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n\n let recurseDepth, recurseFn, recurseRegExp, recurseGlob, deep = options.deep;\n if (deep === null || deep === undefined) {\n recurseDepth = 0;\n }\n else if (typeof deep === 'boolean') {\n recurseDepth = deep ? Infinity : 0;\n }\n else if (typeof deep === 'number') {\n if (deep < 0 || isNaN(deep)) {\n throw new Error('options.deep must be a positive number');\n }\n else if (Math.floor(deep) !== deep) {\n throw new Error('options.deep must be an integer');\n }\n else {\n recurseDepth = deep;\n }\n }\n else if (typeof deep === 'function') {\n recurseDepth = Infinity;\n recurseFn = deep;\n }\n else if (deep instanceof RegExp) {\n recurseDepth = Infinity;\n recurseRegExp = deep;\n }\n else if (typeof deep === 'string' && deep.length > 0) {\n recurseDepth = Infinity;\n recurseGlob = globToRegExp(deep, { extended: true, globstar: true });\n }\n else {\n throw new TypeError('options.deep must be a boolean, number, function, regular expression, or glob pattern');\n }\n\n let filterFn, filterRegExp, filterGlob, filter = options.filter;\n if (filter !== null && filter !== undefined) {\n if (typeof filter === 'function') {\n filterFn = filter;\n }\n else if (filter instanceof RegExp) {\n filterRegExp = filter;\n }\n else if (typeof filter === 'string' && filter.length > 0) {\n filterGlob = globToRegExp(filter, { extended: true, globstar: true });\n }\n else {\n throw new TypeError('options.filter must be a function, regular expression, or glob pattern');\n }\n }\n\n let sep = options.sep;\n if (sep === null || sep === undefined) {\n sep = path.sep;\n }\n else if (typeof sep !== 'string') {\n throw new TypeError('options.sep must be a string');\n }\n\n let basePath = options.basePath;\n if (basePath === null || basePath === undefined) {\n basePath = '';\n }\n else if (typeof basePath === 'string') {\n // Append a path separator to the basePath, if necessary\n if (basePath && basePath.substr(-1) !== sep) {\n basePath += sep;\n }\n }\n else {\n throw new TypeError('options.basePath must be a string');\n }\n\n // Convert the basePath to POSIX (forward slashes)\n // so that glob pattern matching works consistently, even on Windows\n let posixBasePath = basePath;\n if (posixBasePath && sep !== '/') {\n posixBasePath = posixBasePath.replace(new RegExp('\\\\' + sep, 'g'), '/');\n\n /* istanbul ignore if */\n if (isWindows) {\n // Convert Windows root paths (C:\\) and UNCs (\\\\) to POSIX root paths\n posixBasePath = posixBasePath.replace(/^([a-zA-Z]\\:\\/|\\/\\/)/, '/');\n }\n }\n\n // Determine which facade methods to use\n let facade;\n if (options.fs === null || options.fs === undefined) {\n // The user didn't provide their own facades, so use our internal ones\n facade = internalOptions.facade;\n }\n else if (typeof options.fs === 'object') {\n // Merge the internal facade methods with the user-provided `fs` facades\n facade = Object.assign({}, internalOptions.facade);\n facade.fs = Object.assign({}, internalOptions.facade.fs, options.fs);\n }\n else {\n throw new TypeError('options.fs must be an object');\n }\n\n return {\n recurseDepth,\n recurseFn,\n recurseRegExp,\n recurseGlob,\n filterFn,\n filterRegExp,\n filterGlob,\n sep,\n basePath,\n posixBasePath,\n facade,\n emit: !!internalOptions.emit,\n stats: !!internalOptions.stats,\n };\n}\n", "'use strict';\n\nlet call = module.exports = {\n safe: safeCall,\n once: callOnce,\n};\n\n/**\n * Calls a function with the given arguments, and ensures that the error-first callback is _always_\n * invoked exactly once, even if the function throws an error.\n *\n * @param {function} fn - The function to invoke\n * @param {...*} args - The arguments to pass to the function. The final argument must be a callback function.\n */\nfunction safeCall (fn, args) {\n // Get the function arguments as an array\n args = Array.prototype.slice.call(arguments, 1);\n\n // Replace the callback function with a wrapper that ensures it will only be called once\n let callback = call.once(args.pop());\n args.push(callback);\n\n try {\n fn.apply(null, args);\n }\n catch (err) {\n callback(err);\n }\n}\n\n/**\n * Returns a wrapper function that ensures the given callback function is only called once.\n * Subsequent calls are ignored, unless the first argument is an Error, in which case the\n * error is thrown.\n *\n * @param {function} fn - The function that should only be called once\n * @returns {function}\n */\nfunction callOnce (fn) {\n let fulfilled = false;\n\n return function onceWrapper (err) {\n if (!fulfilled) {\n fulfilled = true;\n return fn.apply(this, arguments);\n }\n else if (err) {\n // The callback has already been called, but now an error has occurred\n // (most likely inside the callback function). So re-throw the error,\n // so it gets handled further up the call stack\n throw err;\n }\n };\n}\n", "'use strict';\n\nconst call = require('./call');\n\nmodule.exports = stat;\n\n/**\n * Retrieves the {@link fs.Stats} for the given path. If the path is a symbolic link,\n * then the Stats of the symlink's target are returned instead. If the symlink is broken,\n * then the Stats of the symlink itself are returned.\n *\n * @param {object} fs - Synchronous or Asynchronouse facade for the \"fs\" module\n * @param {string} path - The path to return stats for\n * @param {function} callback\n */\nfunction stat (fs, path, callback) {\n let isSymLink = false;\n\n call.safe(fs.lstat, path, (err, lstats) => {\n if (err) {\n // fs.lstat threw an eror\n return callback(err);\n }\n\n try {\n isSymLink = lstats.isSymbolicLink();\n }\n catch (err2) {\n // lstats.isSymbolicLink() threw an error\n // (probably because fs.lstat returned an invalid result)\n return callback(err2);\n }\n\n if (isSymLink) {\n // Try to resolve the symlink\n symlinkStat(fs, path, lstats, callback);\n }\n else {\n // It's not a symlink, so return the stats as-is\n callback(null, lstats);\n }\n });\n}\n\n/**\n * Retrieves the {@link fs.Stats} for the target of the given symlink.\n * If the symlink is broken, then the Stats of the symlink itself are returned.\n *\n * @param {object} fs - Synchronous or Asynchronouse facade for the \"fs\" module\n * @param {string} path - The path of the symlink to return stats for\n * @param {object} lstats - The stats of the symlink\n * @param {function} callback\n */\nfunction symlinkStat (fs, path, lstats, callback) {\n call.safe(fs.stat, path, (err, stats) => {\n if (err) {\n // The symlink is broken, so return the stats for the link itself\n return callback(null, lstats);\n }\n\n try {\n // Return the stats for the resolved symlink target,\n // and override the `isSymbolicLink` method to indicate that it's a symlink\n stats.isSymbolicLink = () => true;\n }\n catch (err2) {\n // Setting stats.isSymbolicLink threw an error\n // (probably because fs.stat returned an invalid result)\n return callback(err2);\n }\n\n callback(null, stats);\n });\n}\n", "'use strict';\n\nconst Readable = require('stream').Readable;\nconst EventEmitter = require('events').EventEmitter;\nconst path = require('path');\nconst normalizeOptions = require('./normalize-options');\nconst stat = require('./stat');\nconst call = require('./call');\n\n/**\n * Asynchronously reads the contents of a directory and streams the results\n * via a {@link stream.Readable}.\n */\nclass DirectoryReader {\n /**\n * @param {string} dir - The absolute or relative directory path to read\n * @param {object} [options] - User-specified options, if any (see {@link normalizeOptions})\n * @param {object} internalOptions - Internal options that aren't part of the public API\n * @class\n */\n constructor (dir, options, internalOptions) {\n this.options = options = normalizeOptions(options, internalOptions);\n\n // Indicates whether we should keep reading\n // This is set false if stream.Readable.push() returns false.\n this.shouldRead = true;\n\n // The directories to read\n // (initialized with the top-level directory)\n this.queue = [{\n path: dir,\n basePath: options.basePath,\n posixBasePath: options.posixBasePath,\n depth: 0\n }];\n\n // The number of directories that are currently being processed\n this.pending = 0;\n\n // The data that has been read, but not yet emitted\n this.buffer = [];\n\n this.stream = new Readable({ objectMode: true });\n this.stream._read = () => {\n // Start (or resume) reading\n this.shouldRead = true;\n\n // If we have data in the buffer, then send the next chunk\n if (this.buffer.length > 0) {\n this.pushFromBuffer();\n }\n\n // If we have directories queued, then start processing the next one\n if (this.queue.length > 0) {\n if (this.options.facade.sync) {\n while (this.queue.length > 0) {\n this.readNextDirectory();\n }\n }\n else {\n this.readNextDirectory();\n }\n }\n\n this.checkForEOF();\n };\n }\n\n /**\n * Reads the next directory in the queue\n */\n readNextDirectory () {\n let facade = this.options.facade;\n let dir = this.queue.shift();\n this.pending++;\n\n // Read the directory listing\n call.safe(facade.fs.readdir, dir.path, (err, items) => {\n if (err) {\n // fs.readdir threw an error\n this.emit('error', err);\n return this.finishedReadingDirectory();\n }\n\n try {\n // Process each item in the directory (simultaneously, if async)\n facade.forEach(\n items,\n this.processItem.bind(this, dir),\n this.finishedReadingDirectory.bind(this, dir)\n );\n }\n catch (err2) {\n // facade.forEach threw an error\n // (probably because fs.readdir returned an invalid result)\n this.emit('error', err2);\n this.finishedReadingDirectory();\n }\n });\n }\n\n /**\n * This method is called after all items in a directory have been processed.\n *\n * NOTE: This does not necessarily mean that the reader is finished, since there may still\n * be other directories queued or pending.\n */\n finishedReadingDirectory () {\n this.pending--;\n\n if (this.shouldRead) {\n // If we have directories queued, then start processing the next one\n if (this.queue.length > 0 && this.options.facade.async) {\n this.readNextDirectory();\n }\n\n this.checkForEOF();\n }\n }\n\n /**\n * Determines whether the reader has finished processing all items in all directories.\n * If so, then the \"end\" event is fired (via {@Readable#push})\n */\n checkForEOF () {\n if (this.buffer.length === 0 && // The stuff we've already read\n this.pending === 0 && // The stuff we're currently reading\n this.queue.length === 0) { // The stuff we haven't read yet\n // There's no more stuff!\n this.stream.push(null);\n }\n }\n\n /**\n * Processes a single item in a directory.\n *\n * If the item is a directory, and `option.deep` is enabled, then the item will be added\n * to the directory queue.\n *\n * If the item meets the filter criteria, then it will be emitted to the reader's stream.\n *\n * @param {object} dir - A directory object from the queue\n * @param {string} item - The name of the item (name only, no path)\n * @param {function} done - A callback function that is called after the item has been processed\n */\n processItem (dir, item, done) {\n let stream = this.stream;\n let options = this.options;\n\n let itemPath = dir.basePath + item;\n let posixPath = dir.posixBasePath + item;\n let fullPath = path.join(dir.path, item);\n\n // If `options.deep` is a number, and we've already recursed to the max depth,\n // then there's no need to check fs.Stats to know if it's a directory.\n // If `options.deep` is a function, then we'll need fs.Stats\n let maxDepthReached = dir.depth >= options.recurseDepth;\n\n // Do we need to call `fs.stat`?\n let needStats =\n !maxDepthReached || // we need the fs.Stats to know if it's a directory\n options.stats || // the user wants fs.Stats objects returned\n options.recurseFn || // we need fs.Stats for the recurse function\n options.filterFn || // we need fs.Stats for the filter function\n EventEmitter.listenerCount(stream, 'file') || // we need the fs.Stats to know if it's a file\n EventEmitter.listenerCount(stream, 'directory') || // we need the fs.Stats to know if it's a directory\n EventEmitter.listenerCount(stream, 'symlink'); // we need the fs.Stats to know if it's a symlink\n\n // If we don't need stats, then exit early\n if (!needStats) {\n if (this.filter(itemPath, posixPath)) {\n this.pushOrBuffer({ data: itemPath });\n }\n return done();\n }\n\n // Get the fs.Stats object for this path\n stat(options.facade.fs, fullPath, (err, stats) => {\n if (err) {\n // fs.stat threw an error\n this.emit('error', err);\n return done();\n }\n\n try {\n // Add the item's path to the fs.Stats object\n // The base of this path, and its separators are determined by the options\n // (i.e. options.basePath and options.sep)\n stats.path = itemPath;\n\n // Add depth of the path to the fs.Stats object for use this in the filter function\n stats.depth = dir.depth;\n\n if (this.shouldRecurse(stats, posixPath, maxDepthReached)) {\n // Add this subdirectory to the queue\n this.queue.push({\n path: fullPath,\n basePath: itemPath + options.sep,\n posixBasePath: posixPath + '/',\n depth: dir.depth + 1,\n });\n }\n\n // Determine whether this item matches the filter criteria\n if (this.filter(stats, posixPath)) {\n this.pushOrBuffer({\n data: options.stats ? stats : itemPath,\n file: stats.isFile(),\n directory: stats.isDirectory(),\n symlink: stats.isSymbolicLink(),\n });\n }\n\n done();\n }\n catch (err2) {\n // An error occurred while processing the item\n // (probably during a user-specified function, such as options.deep, options.filter, etc.)\n this.emit('error', err2);\n done();\n }\n });\n }\n\n /**\n * Pushes the given chunk of data to the stream, or adds it to the buffer,\n * depending on the state of the stream.\n *\n * @param {object} chunk\n */\n pushOrBuffer (chunk) {\n // Add the chunk to the buffer\n this.buffer.push(chunk);\n\n // If we're still reading, then immediately emit the next chunk in the buffer\n // (which may or may not be the chunk that we just added)\n if (this.shouldRead) {\n this.pushFromBuffer();\n }\n }\n\n /**\n * Immediately pushes the next chunk in the buffer to the reader's stream.\n * The \"data\" event will always be fired (via {@link Readable#push}).\n * In addition, the \"file\", \"directory\", and/or \"symlink\" events may be fired,\n * depending on the type of properties of the chunk.\n */\n pushFromBuffer () {\n let stream = this.stream;\n let chunk = this.buffer.shift();\n\n // Stream the data\n try {\n this.shouldRead = stream.push(chunk.data);\n }\n catch (err) {\n this.emit('error', err);\n }\n\n // Also emit specific events, based on the type of chunk\n chunk.file && this.emit('file', chunk.data);\n chunk.symlink && this.emit('symlink', chunk.data);\n chunk.directory && this.emit('directory', chunk.data);\n }\n\n /**\n * Determines whether the given directory meets the user-specified recursion criteria.\n * If the user didn't specify recursion criteria, then this function will default to true.\n *\n * @param {fs.Stats} stats - The directory's {@link fs.Stats} object\n * @param {string} posixPath - The item's POSIX path (used for glob matching)\n * @param {boolean} maxDepthReached - Whether we've already crawled the user-specified depth\n * @returns {boolean}\n */\n shouldRecurse (stats, posixPath, maxDepthReached) {\n let options = this.options;\n\n if (maxDepthReached) {\n // We've already crawled to the maximum depth. So no more recursion.\n return false;\n }\n else if (!stats.isDirectory()) {\n // It's not a directory. So don't try to crawl it.\n return false;\n }\n else if (options.recurseGlob) {\n // Glob patterns are always tested against the POSIX path, even on Windows\n // https://github.com/isaacs/node-glob#windows\n return options.recurseGlob.test(posixPath);\n }\n else if (options.recurseRegExp) {\n // Regular expressions are tested against the normal path\n // (based on the OS or options.sep)\n return options.recurseRegExp.test(stats.path);\n }\n else if (options.recurseFn) {\n try {\n // Run the user-specified recursion criteria\n return options.recurseFn.call(null, stats);\n }\n catch (err) {\n // An error occurred in the user's code.\n // In Sync and Async modes, this will return an error.\n // In Streaming mode, we emit an \"error\" event, but continue processing\n this.emit('error', err);\n }\n }\n else {\n // No recursion function was specified, and we're within the maximum depth.\n // So crawl this directory.\n return true;\n }\n }\n\n /**\n * Determines whether the given item meets the user-specified filter criteria.\n * If the user didn't specify a filter, then this function will always return true.\n *\n * @param {string|fs.Stats} value - Either the item's path, or the item's {@link fs.Stats} object\n * @param {string} posixPath - The item's POSIX path (used for glob matching)\n * @returns {boolean}\n */\n filter (value, posixPath) {\n let options = this.options;\n\n if (options.filterGlob) {\n // Glob patterns are always tested against the POSIX path, even on Windows\n // https://github.com/isaacs/node-glob#windows\n return options.filterGlob.test(posixPath);\n }\n else if (options.filterRegExp) {\n // Regular expressions are tested against the normal path\n // (based on the OS or options.sep)\n return options.filterRegExp.test(value.path || value);\n }\n else if (options.filterFn) {\n try {\n // Run the user-specified filter function\n return options.filterFn.call(null, value);\n }\n catch (err) {\n // An error occurred in the user's code.\n // In Sync and Async modes, this will return an error.\n // In Streaming mode, we emit an \"error\" event, but continue processing\n this.emit('error', err);\n }\n }\n else {\n // No filter was specified, so match everything\n return true;\n }\n }\n\n /**\n * Emits an event. If one of the event listeners throws an error,\n * then an \"error\" event is emitted.\n *\n * @param {string} eventName\n * @param {*} data\n */\n emit (eventName, data) {\n let stream = this.stream;\n\n try {\n stream.emit(eventName, data);\n }\n catch (err) {\n if (eventName === 'error') {\n // Don't recursively emit \"error\" events.\n // If the first one fails, then just throw\n throw err;\n }\n else {\n stream.emit('error', err);\n }\n }\n }\n}\n\nmodule.exports = DirectoryReader;\n", "'use strict';\n\nconst fs = require('fs');\nconst call = require('../call');\n\n/**\n * A facade around {@link fs.readdirSync} that allows it to be called\n * the same way as {@link fs.readdir}.\n *\n * @param {string} dir\n * @param {function} callback\n */\nexports.readdir = function (dir, callback) {\n // Make sure the callback is only called once\n callback = call.once(callback);\n\n try {\n let items = fs.readdirSync(dir);\n callback(null, items);\n }\n catch (err) {\n callback(err);\n }\n};\n\n/**\n * A facade around {@link fs.statSync} that allows it to be called\n * the same way as {@link fs.stat}.\n *\n * @param {string} path\n * @param {function} callback\n */\nexports.stat = function (path, callback) {\n // Make sure the callback is only called once\n callback = call.once(callback);\n\n try {\n let stats = fs.statSync(path);\n callback(null, stats);\n }\n catch (err) {\n callback(err);\n }\n};\n\n/**\n * A facade around {@link fs.lstatSync} that allows it to be called\n * the same way as {@link fs.lstat}.\n *\n * @param {string} path\n * @param {function} callback\n */\nexports.lstat = function (path, callback) {\n // Make sure the callback is only called once\n callback = call.once(callback);\n\n try {\n let stats = fs.lstatSync(path);\n callback(null, stats);\n }\n catch (err) {\n callback(err);\n }\n};\n", "'use strict';\n\nmodule.exports = syncForEach;\n\n/**\n * A facade that allows {@link Array.forEach} to be called as though it were asynchronous.\n *\n * @param {array} array - The array to iterate over\n * @param {function} iterator - The function to call for each item in the array\n * @param {function} done - The function to call when all iterators have completed\n */\nfunction syncForEach (array, iterator, done) {\n array.forEach(item => {\n iterator(item, () => {\n // Note: No error-handling here because this is currently only ever called\n // by DirectoryReader, which never passes an `error` parameter to the callback.\n // Instead, DirectoryReader emits an \"error\" event if an error occurs.\n });\n });\n\n done();\n}\n", "'use strict';\n\nmodule.exports = readdirSync;\n\nconst DirectoryReader = require('../directory-reader');\n\nlet syncFacade = {\n fs: require('./fs'),\n forEach: require('./for-each'),\n sync: true\n};\n\n/**\n * Returns the buffered output from a synchronous {@link DirectoryReader}.\n *\n * @param {string} dir\n * @param {object} [options]\n * @param {object} internalOptions\n */\nfunction readdirSync (dir, options, internalOptions) {\n internalOptions.facade = syncFacade;\n\n let reader = new DirectoryReader(dir, options, internalOptions);\n let stream = reader.stream;\n\n let results = [];\n let data = stream.read();\n while (data !== null) {\n results.push(data);\n data = stream.read();\n }\n\n return results;\n}\n", "\"use strict\"\n\nvar next = (global.process && process.nextTick) || global.setImmediate || function (f) {\n setTimeout(f, 0)\n}\n\nmodule.exports = function maybe (cb, promise) {\n if (cb) {\n promise\n .then(function (result) {\n next(function () { cb(null, result) })\n }, function (err) {\n next(function () { cb(err) })\n })\n return undefined\n }\n else {\n return promise\n }\n}\n", "'use strict';\n\nmodule.exports = asyncForEach;\n\n/**\n * Simultaneously processes all items in the given array.\n *\n * @param {array} array - The array to iterate over\n * @param {function} iterator - The function to call for each item in the array\n * @param {function} done - The function to call when all iterators have completed\n */\nfunction asyncForEach (array, iterator, done) {\n if (array.length === 0) {\n // NOTE: Normally a bad idea to mix sync and async, but it's safe here because\n // of the way that this method is currently used by DirectoryReader.\n done();\n return;\n }\n\n // Simultaneously process all items in the array.\n let pending = array.length;\n array.forEach(item => {\n iterator(item, () => {\n if (--pending === 0) {\n done();\n }\n });\n });\n}\n", "'use strict';\n\nmodule.exports = readdirAsync;\n\nconst maybe = require('call-me-maybe');\nconst DirectoryReader = require('../directory-reader');\n\nlet asyncFacade = {\n fs: require('fs'),\n forEach: require('./for-each'),\n async: true\n};\n\n/**\n * Returns the buffered output from an asynchronous {@link DirectoryReader},\n * via an error-first callback or a {@link Promise}.\n *\n * @param {string} dir\n * @param {object} [options]\n * @param {function} [callback]\n * @param {object} internalOptions\n */\nfunction readdirAsync (dir, options, callback, internalOptions) {\n if (typeof options === 'function') {\n callback = options;\n options = undefined;\n }\n\n return maybe(callback, new Promise(((resolve, reject) => {\n let results = [];\n\n internalOptions.facade = asyncFacade;\n\n let reader = new DirectoryReader(dir, options, internalOptions);\n let stream = reader.stream;\n\n stream.on('error', err => {\n reject(err);\n stream.pause();\n });\n stream.on('data', result => {\n results.push(result);\n });\n stream.on('end', () => {\n resolve(results);\n });\n })));\n}\n", "'use strict';\n\nmodule.exports = readdirStream;\n\nconst DirectoryReader = require('../directory-reader');\n\nlet streamFacade = {\n fs: require('fs'),\n forEach: require('../async/for-each'),\n async: true\n};\n\n/**\n * Returns the {@link stream.Readable} of an asynchronous {@link DirectoryReader}.\n *\n * @param {string} dir\n * @param {object} [options]\n * @param {object} internalOptions\n */\nfunction readdirStream (dir, options, internalOptions) {\n internalOptions.facade = streamFacade;\n\n let reader = new DirectoryReader(dir, options, internalOptions);\n return reader.stream;\n}\n", "'use strict';\n\nconst readdirSync = require('./sync');\nconst readdirAsync = require('./async');\nconst readdirStream = require('./stream');\n\nmodule.exports = exports = readdirAsyncPath;\nexports.readdir = exports.readdirAsync = exports.async = readdirAsyncPath;\nexports.readdirAsyncStat = exports.async.stat = readdirAsyncStat;\nexports.readdirStream = exports.stream = readdirStreamPath;\nexports.readdirStreamStat = exports.stream.stat = readdirStreamStat;\nexports.readdirSync = exports.sync = readdirSyncPath;\nexports.readdirSyncStat = exports.sync.stat = readdirSyncStat;\n\n/**\n * Synchronous readdir that returns an array of string paths.\n *\n * @param {string} dir\n * @param {object} [options]\n * @returns {string[]}\n */\nfunction readdirSyncPath (dir, options) {\n return readdirSync(dir, options, {});\n}\n\n/**\n * Synchronous readdir that returns results as an array of {@link fs.Stats} objects\n *\n * @param {string} dir\n * @param {object} [options]\n * @returns {fs.Stats[]}\n */\nfunction readdirSyncStat (dir, options) {\n return readdirSync(dir, options, { stats: true });\n}\n\n/**\n * Aynchronous readdir (accepts an error-first callback or returns a {@link Promise}).\n * Results are an array of path strings.\n *\n * @param {string} dir\n * @param {object} [options]\n * @param {function} [callback]\n * @returns {Promise<string[]>}\n */\nfunction readdirAsyncPath (dir, options, callback) {\n return readdirAsync(dir, options, callback, {});\n}\n\n/**\n * Aynchronous readdir (accepts an error-first callback or returns a {@link Promise}).\n * Results are an array of {@link fs.Stats} objects.\n *\n * @param {string} dir\n * @param {object} [options]\n * @param {function} [callback]\n * @returns {Promise<fs.Stats[]>}\n */\nfunction readdirAsyncStat (dir, options, callback) {\n return readdirAsync(dir, options, callback, { stats: true });\n}\n\n/**\n * Aynchronous readdir that returns a {@link stream.Readable} (which is also an {@link EventEmitter}).\n * All stream data events (\"data\", \"file\", \"directory\", \"symlink\") are passed a path string.\n *\n * @param {string} dir\n * @param {object} [options]\n * @returns {stream.Readable}\n */\nfunction readdirStreamPath (dir, options) {\n return readdirStream(dir, options, {});\n}\n\n/**\n * Aynchronous readdir that returns a {@link stream.Readable} (which is also an {@link EventEmitter})\n * All stream data events (\"data\", \"file\", \"directory\", \"symlink\") are passed an {@link fs.Stats} object.\n *\n * @param {string} dir\n * @param {object} [options]\n * @returns {stream.Readable}\n */\nfunction readdirStreamStat (dir, options) {\n return readdirStream(dir, options, { stats: true });\n}\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar path = require(\"path\");\r\n/**\r\n * Returns \u00ABtrue\u00BB if the last partial of the path starting with a period.\r\n */\r\nfunction isDotDirectory(filepath) {\r\n return path.basename(filepath).startsWith('.');\r\n}\r\nexports.isDotDirectory = isDotDirectory;\r\n/**\r\n * Convert a windows-like path to a unix-style path.\r\n */\r\nfunction normalize(filepath) {\r\n return filepath.replace(/\\\\/g, '/');\r\n}\r\nexports.normalize = normalize;\r\n/**\r\n * Returns normalized absolute path of provided filepath.\r\n */\r\nfunction makeAbsolute(cwd, filepath) {\r\n return normalize(path.resolve(cwd, filepath));\r\n}\r\nexports.makeAbsolute = makeAbsolute;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar pathUtils = require(\"../../utils/path\");\r\nvar patternUtils = require(\"../../utils/pattern\");\r\nvar DeepFilter = /** @class */ (function () {\r\n function DeepFilter(options, micromatchOptions) {\r\n this.options = options;\r\n this.micromatchOptions = micromatchOptions;\r\n }\r\n /**\r\n * Returns filter for directories.\r\n */\r\n DeepFilter.prototype.getFilter = function (positive, negative) {\r\n var _this = this;\r\n var maxPatternDepth = this.getMaxPatternDepth(positive);\r\n var negativeRe = this.getNegativePatternsRe(negative);\r\n return function (entry) { return _this.filter(entry, negativeRe, maxPatternDepth); };\r\n };\r\n /**\r\n * Returns max depth of the provided patterns.\r\n */\r\n DeepFilter.prototype.getMaxPatternDepth = function (patterns) {\r\n var globstar = patterns.some(patternUtils.hasGlobStar);\r\n return globstar ? Infinity : patternUtils.getMaxNaivePatternsDepth(patterns);\r\n };\r\n /**\r\n * Returns RegExp's for patterns that can affect the depth of reading.\r\n */\r\n DeepFilter.prototype.getNegativePatternsRe = function (patterns) {\r\n var affectDepthOfReadingPatterns = patterns.filter(patternUtils.isAffectDepthOfReadingPattern);\r\n return patternUtils.convertPatternsToRe(affectDepthOfReadingPatterns, this.micromatchOptions);\r\n };\r\n /**\r\n * Returns \u00ABtrue\u00BB for directory that should be read.\r\n */\r\n DeepFilter.prototype.filter = function (entry, negativeRe, maxPatternDepth) {\r\n if (this.isSkippedByDeepOption(entry.depth)) {\r\n return false;\r\n }\r\n if (this.isSkippedByMaxPatternDepth(entry.depth, maxPatternDepth)) {\r\n return false;\r\n }\r\n if (this.isSkippedSymlinkedDirectory(entry)) {\r\n return false;\r\n }\r\n if (this.isSkippedDotDirectory(entry)) {\r\n return false;\r\n }\r\n return this.isSkippedByNegativePatterns(entry, negativeRe);\r\n };\r\n /**\r\n * Returns \u00ABtrue\u00BB when the \u00ABdeep\u00BB option is disabled or number and depth of the entry is greater that the option value.\r\n */\r\n DeepFilter.prototype.isSkippedByDeepOption = function (entryDepth) {\r\n return !this.options.deep || (typeof this.options.deep === 'number' && entryDepth >= this.options.deep);\r\n };\r\n /**\r\n * Returns \u00ABtrue\u00BB when depth parameter is not an Infinity and entry depth greater that the parameter value.\r\n */\r\n DeepFilter.prototype.isSkippedByMaxPatternDepth = function (entryDepth, maxPatternDepth) {\r\n return maxPatternDepth !== Infinity && entryDepth >= maxPatternDepth;\r\n };\r\n /**\r\n * Returns \u00ABtrue\u00BB for symlinked directory if the \u00ABfollowSymlinkedDirectories\u00BB option is disabled.\r\n */\r\n DeepFilter.prototype.isSkippedSymlinkedDirectory = function (entry) {\r\n return !this.options.followSymlinkedDirectories && entry.isSymbolicLink();\r\n };\r\n /**\r\n * Returns \u00ABtrue\u00BB for a directory whose name starts with a period if \u00ABdot\u00BB option is disabled.\r\n */\r\n DeepFilter.prototype.isSkippedDotDirectory = function (entry) {\r\n return !this.options.dot && pathUtils.isDotDirectory(entry.path);\r\n };\r\n /**\r\n * Returns \u00ABtrue\u00BB for a directory whose path math to any negative pattern.\r\n */\r\n DeepFilter.prototype.isSkippedByNegativePatterns = function (entry, negativeRe) {\r\n return !patternUtils.matchAny(entry.path, negativeRe);\r\n };\r\n return DeepFilter;\r\n}());\r\nexports.default = DeepFilter;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar pathUtils = require(\"../../utils/path\");\r\nvar patternUtils = require(\"../../utils/pattern\");\r\nvar EntryFilter = /** @class */ (function () {\r\n function EntryFilter(options, micromatchOptions) {\r\n this.options = options;\r\n this.micromatchOptions = micromatchOptions;\r\n this.index = new Map();\r\n }\r\n /**\r\n * Returns filter for directories.\r\n */\r\n EntryFilter.prototype.getFilter = function (positive, negative) {\r\n var _this = this;\r\n var positiveRe = patternUtils.convertPatternsToRe(positive, this.micromatchOptions);\r\n var negativeRe = patternUtils.convertPatternsToRe(negative, this.micromatchOptions);\r\n return function (entry) { return _this.filter(entry, positiveRe, negativeRe); };\r\n };\r\n /**\r\n * Returns true if entry must be added to result.\r\n */\r\n EntryFilter.prototype.filter = function (entry, positiveRe, negativeRe) {\r\n // Exclude duplicate results\r\n if (this.options.unique) {\r\n if (this.isDuplicateEntry(entry)) {\r\n return false;\r\n }\r\n this.createIndexRecord(entry);\r\n }\r\n // Filter files and directories by options\r\n if (this.onlyFileFilter(entry) || this.onlyDirectoryFilter(entry)) {\r\n return false;\r\n }\r\n if (this.isSkippedByAbsoluteNegativePatterns(entry, negativeRe)) {\r\n return false;\r\n }\r\n return this.isMatchToPatterns(entry.path, positiveRe) && !this.isMatchToPatterns(entry.path, negativeRe);\r\n };\r\n /**\r\n * Return true if the entry already has in the cross reader index.\r\n */\r\n EntryFilter.prototype.isDuplicateEntry = function (entry) {\r\n return this.index.has(entry.path);\r\n };\r\n /**\r\n * Create record in the cross reader index.\r\n */\r\n EntryFilter.prototype.createIndexRecord = function (entry) {\r\n this.index.set(entry.path, undefined);\r\n };\r\n /**\r\n * Returns true for non-files if the \u00ABonlyFiles\u00BB option is enabled.\r\n */\r\n EntryFilter.prototype.onlyFileFilter = function (entry) {\r\n return this.options.onlyFiles && !entry.isFile();\r\n };\r\n /**\r\n * Returns true for non-directories if the \u00ABonlyDirectories\u00BB option is enabled.\r\n */\r\n EntryFilter.prototype.onlyDirectoryFilter = function (entry) {\r\n return this.options.onlyDirectories && !entry.isDirectory();\r\n };\r\n /**\r\n * Return true when `absolute` option is enabled and matched to the negative patterns.\r\n */\r\n EntryFilter.prototype.isSkippedByAbsoluteNegativePatterns = function (entry, negativeRe) {\r\n if (!this.options.absolute) {\r\n return false;\r\n }\r\n var fullpath = pathUtils.makeAbsolute(this.options.cwd, entry.path);\r\n return this.isMatchToPatterns(fullpath, negativeRe);\r\n };\r\n /**\r\n * Return true when entry match to provided patterns.\r\n *\r\n * First, just trying to apply patterns to the path.\r\n * Second, trying to apply patterns to the path with final slash (need to micromatch to support \u00ABdirectory/**\u00BB patterns).\r\n */\r\n EntryFilter.prototype.isMatchToPatterns = function (filepath, patternsRe) {\r\n return patternUtils.matchAny(filepath, patternsRe) || patternUtils.matchAny(filepath + '/', patternsRe);\r\n };\r\n return EntryFilter;\r\n}());\r\nexports.default = EntryFilter;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar path = require(\"path\");\r\nvar deep_1 = require(\"./filters/deep\");\r\nvar entry_1 = require(\"./filters/entry\");\r\nvar pathUtil = require(\"../utils/path\");\r\nvar Reader = /** @class */ (function () {\r\n function Reader(options) {\r\n this.options = options;\r\n this.micromatchOptions = this.getMicromatchOptions();\r\n this.entryFilter = new entry_1.default(options, this.micromatchOptions);\r\n this.deepFilter = new deep_1.default(options, this.micromatchOptions);\r\n }\r\n /**\r\n * Returns root path to scanner.\r\n */\r\n Reader.prototype.getRootDirectory = function (task) {\r\n return path.resolve(this.options.cwd, task.base);\r\n };\r\n /**\r\n * Returns options for reader.\r\n */\r\n Reader.prototype.getReaderOptions = function (task) {\r\n return {\r\n basePath: task.base === '.' ? '' : task.base,\r\n filter: this.entryFilter.getFilter(task.positive, task.negative),\r\n deep: this.deepFilter.getFilter(task.positive, task.negative),\r\n sep: '/'\r\n };\r\n };\r\n /**\r\n * Returns options for micromatch.\r\n */\r\n Reader.prototype.getMicromatchOptions = function () {\r\n return {\r\n dot: this.options.dot,\r\n nobrace: !this.options.brace,\r\n noglobstar: !this.options.globstar,\r\n noext: !this.options.extension,\r\n nocase: !this.options.case,\r\n matchBase: this.options.matchBase\r\n };\r\n };\r\n /**\r\n * Returns transformed entry.\r\n */\r\n Reader.prototype.transform = function (entry) {\r\n if (this.options.absolute) {\r\n entry.path = pathUtil.makeAbsolute(this.options.cwd, entry.path);\r\n }\r\n if (this.options.markDirectories && entry.isDirectory()) {\r\n entry.path += '/';\r\n }\r\n var item = this.options.stats ? entry : entry.path;\r\n if (this.options.transform === null) {\r\n return item;\r\n }\r\n return this.options.transform(item);\r\n };\r\n /**\r\n * Returns true if error has ENOENT code.\r\n */\r\n Reader.prototype.isEnoentCodeError = function (err) {\r\n return err.code === 'ENOENT';\r\n };\r\n return Reader;\r\n}());\r\nexports.default = Reader;\r\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fs = require(\"fs\");\nexports.FILE_SYSTEM_ADAPTER = {\n lstat: fs.lstat,\n stat: fs.stat,\n lstatSync: fs.lstatSync,\n statSync: fs.statSync\n};\nfunction getFileSystemAdapter(fsMethods) {\n if (!fsMethods) {\n return exports.FILE_SYSTEM_ADAPTER;\n }\n return Object.assign({}, exports.FILE_SYSTEM_ADAPTER, fsMethods);\n}\nexports.getFileSystemAdapter = getFileSystemAdapter;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst fsAdapter = require(\"../adapters/fs\");\nfunction prepare(opts) {\n const options = Object.assign({\n fs: fsAdapter.getFileSystemAdapter(opts ? opts.fs : undefined),\n throwErrorOnBrokenSymlinks: true,\n followSymlinks: true\n }, opts);\n return options;\n}\nexports.prepare = prepare;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction sync(path, options) {\n const lstat = options.fs.lstatSync(path);\n if (!isFollowedSymlink(lstat, options)) {\n return lstat;\n }\n try {\n const stat = options.fs.statSync(path);\n stat.isSymbolicLink = () => true;\n return stat;\n }\n catch (err) {\n if (!options.throwErrorOnBrokenSymlinks) {\n return lstat;\n }\n throw err;\n }\n}\nexports.sync = sync;\nfunction async(path, options, callback) {\n options.fs.lstat(path, (err0, lstat) => {\n if (err0) {\n return callback(err0, undefined);\n }\n if (!isFollowedSymlink(lstat, options)) {\n return callback(null, lstat);\n }\n options.fs.stat(path, (err1, stat) => {\n if (err1) {\n return options.throwErrorOnBrokenSymlinks ? callback(err1) : callback(null, lstat);\n }\n stat.isSymbolicLink = () => true;\n callback(null, stat);\n });\n });\n}\nexports.async = async;\n/**\n * Returns `true` for followed symlink.\n */\nfunction isFollowedSymlink(stat, options) {\n return stat.isSymbolicLink() && options.followSymlinks;\n}\nexports.isFollowedSymlink = isFollowedSymlink;\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst optionsManager = require(\"./managers/options\");\nconst statProvider = require(\"./providers/stat\");\n/**\n * Asynchronous API.\n */\nfunction stat(path, opts) {\n return new Promise((resolve, reject) => {\n statProvider.async(path, optionsManager.prepare(opts), (err, stats) => err ? reject(err) : resolve(stats));\n });\n}\nexports.stat = stat;\nfunction statCallback(path, optsOrCallback, callback) {\n if (typeof optsOrCallback === 'function') {\n callback = optsOrCallback; /* tslint:disable-line: no-parameter-reassignment */\n optsOrCallback = undefined; /* tslint:disable-line: no-parameter-reassignment */\n }\n if (typeof callback === 'undefined') {\n throw new TypeError('The \"callback\" argument must be of type Function.');\n }\n statProvider.async(path, optionsManager.prepare(optsOrCallback), callback);\n}\nexports.statCallback = statCallback;\n/**\n * Synchronous API.\n */\nfunction statSync(path, opts) {\n return statProvider.sync(path, optionsManager.prepare(opts));\n}\nexports.statSync = statSync;\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar path = require(\"path\");\r\nvar FileSystem = /** @class */ (function () {\r\n function FileSystem(options) {\r\n this.options = options;\r\n }\r\n /**\r\n * Return full path to entry.\r\n */\r\n FileSystem.prototype.getFullEntryPath = function (filepath) {\r\n return path.resolve(this.options.cwd, filepath);\r\n };\r\n /**\r\n * Return an implementation of the Entry interface.\r\n */\r\n FileSystem.prototype.makeEntry = function (stat, pattern) {\r\n stat.path = pattern;\r\n stat.depth = pattern.split('/').length;\r\n return stat;\r\n };\r\n return FileSystem;\r\n}());\r\nexports.default = FileSystem;\r\n", "\"use strict\";\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = function (d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar stream = require(\"stream\");\r\nvar fsStat = require(\"@nodelib/fs.stat\");\r\nvar fs_1 = require(\"./fs\");\r\nvar FileSystemStream = /** @class */ (function (_super) {\r\n __extends(FileSystemStream, _super);\r\n function FileSystemStream() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n /**\r\n * Use stream API to read entries for Task.\r\n */\r\n FileSystemStream.prototype.read = function (patterns, filter) {\r\n var _this = this;\r\n var filepaths = patterns.map(this.getFullEntryPath, this);\r\n var transform = new stream.Transform({ objectMode: true });\r\n transform._transform = function (index, _enc, done) {\r\n return _this.getEntry(filepaths[index], patterns[index]).then(function (entry) {\r\n if (entry !== null && filter(entry)) {\r\n transform.push(entry);\r\n }\r\n if (index === filepaths.length - 1) {\r\n transform.end();\r\n }\r\n done();\r\n });\r\n };\r\n for (var i = 0; i < filepaths.length; i++) {\r\n transform.write(i);\r\n }\r\n return transform;\r\n };\r\n /**\r\n * Return entry for the provided path.\r\n */\r\n FileSystemStream.prototype.getEntry = function (filepath, pattern) {\r\n var _this = this;\r\n return this.getStat(filepath)\r\n .then(function (stat) { return _this.makeEntry(stat, pattern); })\r\n .catch(function () { return null; });\r\n };\r\n /**\r\n * Return fs.Stats for the provided path.\r\n */\r\n FileSystemStream.prototype.getStat = function (filepath) {\r\n return fsStat.stat(filepath, { throwErrorOnBrokenSymlinks: false });\r\n };\r\n return FileSystemStream;\r\n}(fs_1.default));\r\nexports.default = FileSystemStream;\r\n", "\"use strict\";\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = function (d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar readdir = require(\"@mrmlnc/readdir-enhanced\");\r\nvar reader_1 = require(\"./reader\");\r\nvar fs_stream_1 = require(\"../adapters/fs-stream\");\r\nvar ReaderAsync = /** @class */ (function (_super) {\r\n __extends(ReaderAsync, _super);\r\n function ReaderAsync() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n Object.defineProperty(ReaderAsync.prototype, \"fsAdapter\", {\r\n /**\r\n * Returns FileSystem adapter.\r\n */\r\n get: function () {\r\n return new fs_stream_1.default(this.options);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Use async API to read entries for Task.\r\n */\r\n ReaderAsync.prototype.read = function (task) {\r\n var _this = this;\r\n var root = this.getRootDirectory(task);\r\n var options = this.getReaderOptions(task);\r\n var entries = [];\r\n return new Promise(function (resolve, reject) {\r\n var stream = _this.api(root, task, options);\r\n stream.on('error', function (err) {\r\n _this.isEnoentCodeError(err) ? resolve([]) : reject(err);\r\n stream.pause();\r\n });\r\n stream.on('data', function (entry) { return entries.push(_this.transform(entry)); });\r\n stream.on('end', function () { return resolve(entries); });\r\n });\r\n };\r\n /**\r\n * Returns founded paths.\r\n */\r\n ReaderAsync.prototype.api = function (root, task, options) {\r\n if (task.dynamic) {\r\n return this.dynamicApi(root, options);\r\n }\r\n return this.staticApi(task, options);\r\n };\r\n /**\r\n * Api for dynamic tasks.\r\n */\r\n ReaderAsync.prototype.dynamicApi = function (root, options) {\r\n return readdir.readdirStreamStat(root, options);\r\n };\r\n /**\r\n * Api for static tasks.\r\n */\r\n ReaderAsync.prototype.staticApi = function (task, options) {\r\n return this.fsAdapter.read(task.patterns, options.filter);\r\n };\r\n return ReaderAsync;\r\n}(reader_1.default));\r\nexports.default = ReaderAsync;\r\n", "\"use strict\";\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = function (d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar stream = require(\"stream\");\r\nvar readdir = require(\"@mrmlnc/readdir-enhanced\");\r\nvar reader_1 = require(\"./reader\");\r\nvar fs_stream_1 = require(\"../adapters/fs-stream\");\r\nvar TransformStream = /** @class */ (function (_super) {\r\n __extends(TransformStream, _super);\r\n function TransformStream(reader) {\r\n var _this = _super.call(this, { objectMode: true }) || this;\r\n _this.reader = reader;\r\n return _this;\r\n }\r\n TransformStream.prototype._transform = function (entry, _encoding, callback) {\r\n callback(null, this.reader.transform(entry));\r\n };\r\n return TransformStream;\r\n}(stream.Transform));\r\nvar ReaderStream = /** @class */ (function (_super) {\r\n __extends(ReaderStream, _super);\r\n function ReaderStream() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n Object.defineProperty(ReaderStream.prototype, \"fsAdapter\", {\r\n /**\r\n * Returns FileSystem adapter.\r\n */\r\n get: function () {\r\n return new fs_stream_1.default(this.options);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Use stream API to read entries for Task.\r\n */\r\n ReaderStream.prototype.read = function (task) {\r\n var _this = this;\r\n var root = this.getRootDirectory(task);\r\n var options = this.getReaderOptions(task);\r\n var transform = new TransformStream(this);\r\n var readable = this.api(root, task, options);\r\n return readable\r\n .on('error', function (err) { return _this.isEnoentCodeError(err) ? null : transform.emit('error', err); })\r\n .pipe(transform);\r\n };\r\n /**\r\n * Returns founded paths.\r\n */\r\n ReaderStream.prototype.api = function (root, task, options) {\r\n if (task.dynamic) {\r\n return this.dynamicApi(root, options);\r\n }\r\n return this.staticApi(task, options);\r\n };\r\n /**\r\n * Api for dynamic tasks.\r\n */\r\n ReaderStream.prototype.dynamicApi = function (root, options) {\r\n return readdir.readdirStreamStat(root, options);\r\n };\r\n /**\r\n * Api for static tasks.\r\n */\r\n ReaderStream.prototype.staticApi = function (task, options) {\r\n return this.fsAdapter.read(task.patterns, options.filter);\r\n };\r\n return ReaderStream;\r\n}(reader_1.default));\r\nexports.default = ReaderStream;\r\n", "\"use strict\";\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = function (d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar fsStat = require(\"@nodelib/fs.stat\");\r\nvar fs_1 = require(\"./fs\");\r\nvar FileSystemSync = /** @class */ (function (_super) {\r\n __extends(FileSystemSync, _super);\r\n function FileSystemSync() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n /**\r\n * Use sync API to read entries for Task.\r\n */\r\n FileSystemSync.prototype.read = function (patterns, filter) {\r\n var _this = this;\r\n var entries = [];\r\n patterns.forEach(function (pattern) {\r\n var filepath = _this.getFullEntryPath(pattern);\r\n var entry = _this.getEntry(filepath, pattern);\r\n if (entry === null || !filter(entry)) {\r\n return;\r\n }\r\n entries.push(entry);\r\n });\r\n return entries;\r\n };\r\n /**\r\n * Return entry for the provided path.\r\n */\r\n FileSystemSync.prototype.getEntry = function (filepath, pattern) {\r\n try {\r\n var stat = this.getStat(filepath);\r\n return this.makeEntry(stat, pattern);\r\n }\r\n catch (err) {\r\n return null;\r\n }\r\n };\r\n /**\r\n * Return fs.Stats for the provided path.\r\n */\r\n FileSystemSync.prototype.getStat = function (filepath) {\r\n return fsStat.statSync(filepath, { throwErrorOnBrokenSymlinks: false });\r\n };\r\n return FileSystemSync;\r\n}(fs_1.default));\r\nexports.default = FileSystemSync;\r\n", "\"use strict\";\r\nvar __extends = (this && this.__extends) || (function () {\r\n var extendStatics = function (d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n };\r\n return function (d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n})();\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar readdir = require(\"@mrmlnc/readdir-enhanced\");\r\nvar reader_1 = require(\"./reader\");\r\nvar fs_sync_1 = require(\"../adapters/fs-sync\");\r\nvar ReaderSync = /** @class */ (function (_super) {\r\n __extends(ReaderSync, _super);\r\n function ReaderSync() {\r\n return _super !== null && _super.apply(this, arguments) || this;\r\n }\r\n Object.defineProperty(ReaderSync.prototype, \"fsAdapter\", {\r\n /**\r\n * Returns FileSystem adapter.\r\n */\r\n get: function () {\r\n return new fs_sync_1.default(this.options);\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * Use sync API to read entries for Task.\r\n */\r\n ReaderSync.prototype.read = function (task) {\r\n var root = this.getRootDirectory(task);\r\n var options = this.getReaderOptions(task);\r\n try {\r\n var entries = this.api(root, task, options);\r\n return entries.map(this.transform, this);\r\n }\r\n catch (err) {\r\n if (this.isEnoentCodeError(err)) {\r\n return [];\r\n }\r\n throw err;\r\n }\r\n };\r\n /**\r\n * Returns founded paths.\r\n */\r\n ReaderSync.prototype.api = function (root, task, options) {\r\n if (task.dynamic) {\r\n return this.dynamicApi(root, options);\r\n }\r\n return this.staticApi(task, options);\r\n };\r\n /**\r\n * Api for dynamic tasks.\r\n */\r\n ReaderSync.prototype.dynamicApi = function (root, options) {\r\n return readdir.readdirSyncStat(root, options);\r\n };\r\n /**\r\n * Api for static tasks.\r\n */\r\n ReaderSync.prototype.staticApi = function (task, options) {\r\n return this.fsAdapter.read(task.patterns, options.filter);\r\n };\r\n return ReaderSync;\r\n}(reader_1.default));\r\nexports.default = ReaderSync;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\n/**\r\n * Flatten nested arrays (max depth is 2) into a non-nested array of non-array items.\r\n */\r\nfunction flatten(items) {\r\n return items.reduce(function (collection, item) { return [].concat(collection, item); }, []);\r\n}\r\nexports.flatten = flatten;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar merge2 = require(\"merge2\");\r\n/**\r\n * Merge multiple streams and propagate their errors into one stream in parallel.\r\n */\r\nfunction merge(streams) {\r\n var mergedStream = merge2(streams);\r\n streams.forEach(function (stream) {\r\n stream.on('error', function (err) { return mergedStream.emit('error', err); });\r\n });\r\n return mergedStream;\r\n}\r\nexports.merge = merge;\r\n", "\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar optionsManager = require(\"./managers/options\");\r\nvar taskManager = require(\"./managers/tasks\");\r\nvar reader_async_1 = require(\"./providers/reader-async\");\r\nvar reader_stream_1 = require(\"./providers/reader-stream\");\r\nvar reader_sync_1 = require(\"./providers/reader-sync\");\r\nvar arrayUtils = require(\"./utils/array\");\r\nvar streamUtils = require(\"./utils/stream\");\r\n/**\r\n * Synchronous API.\r\n */\r\nfunction sync(source, opts) {\r\n assertPatternsInput(source);\r\n var works = getWorks(source, reader_sync_1.default, opts);\r\n return arrayUtils.flatten(works);\r\n}\r\nexports.sync = sync;\r\n/**\r\n * Asynchronous API.\r\n */\r\nfunction async(source, opts) {\r\n try {\r\n assertPatternsInput(source);\r\n }\r\n catch (error) {\r\n return Promise.reject(error);\r\n }\r\n var works = getWorks(source, reader_async_1.default, opts);\r\n return Promise.all(works).then(arrayUtils.flatten);\r\n}\r\nexports.async = async;\r\n/**\r\n * Stream API.\r\n */\r\nfunction stream(source, opts) {\r\n assertPatternsInput(source);\r\n var works = getWorks(source, reader_stream_1.default, opts);\r\n return streamUtils.merge(works);\r\n}\r\nexports.stream = stream;\r\n/**\r\n * Return a set of tasks based on provided patterns.\r\n */\r\nfunction generateTasks(source, opts) {\r\n assertPatternsInput(source);\r\n var patterns = [].concat(source);\r\n var options = optionsManager.prepare(opts);\r\n return taskManager.generate(patterns, options);\r\n}\r\nexports.generateTasks = generateTasks;\r\n/**\r\n * Returns a set of works based on provided tasks and class of the reader.\r\n */\r\nfunction getWorks(source, _Reader, opts) {\r\n var patterns = [].concat(source);\r\n var options = optionsManager.prepare(opts);\r\n var tasks = taskManager.generate(patterns, options);\r\n var reader = new _Reader(options);\r\n return tasks.map(reader.read, reader);\r\n}\r\nfunction assertPatternsInput(source) {\r\n if ([].concat(source).every(isString)) {\r\n return;\r\n }\r\n throw new TypeError('Patterns must be a string or an array of strings');\r\n}\r\nfunction isString(source) {\r\n /* tslint:disable-next-line strict-type-predicates */\r\n return typeof source === 'string';\r\n}\r\n", "const pkg = require('./out/index');\n\nmodule.exports = pkg.async;\nmodule.exports.default = pkg.async;\n\nmodule.exports.async = pkg.async;\nmodule.exports.sync = pkg.sync;\nmodule.exports.stream = pkg.stream;\n\nmodule.exports.generateTasks = pkg.generateTasks;\n", "'use strict';\nmodule.exports = function (val) {\n\tif (val === null || val === undefined) {\n\t\treturn [];\n\t}\n\n\treturn Array.isArray(val) ? val : [val];\n};\n", "'use strict';\n\nconst processFn = (fn, opts) => function () {\n\tconst P = opts.promiseModule;\n\tconst args = new Array(arguments.length);\n\n\tfor (let i = 0; i < arguments.length; i++) {\n\t\targs[i] = arguments[i];\n\t}\n\n\treturn new P((resolve, reject) => {\n\t\tif (opts.errorFirst) {\n\t\t\targs.push(function (err, result) {\n\t\t\t\tif (opts.multiArgs) {\n\t\t\t\t\tconst results = new Array(arguments.length - 1);\n\n\t\t\t\t\tfor (let i = 1; i < arguments.length; i++) {\n\t\t\t\t\t\tresults[i - 1] = arguments[i];\n\t\t\t\t\t}\n\n\t\t\t\t\tif (err) {\n\t\t\t\t\t\tresults.unshift(err);\n\t\t\t\t\t\treject(results);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresolve(results);\n\t\t\t\t\t}\n\t\t\t\t} else if (err) {\n\t\t\t\t\treject(err);\n\t\t\t\t} else {\n\t\t\t\t\tresolve(result);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\targs.push(function (result) {\n\t\t\t\tif (opts.multiArgs) {\n\t\t\t\t\tconst results = new Array(arguments.length - 1);\n\n\t\t\t\t\tfor (let i = 0; i < arguments.length; i++) {\n\t\t\t\t\t\tresults[i] = arguments[i];\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve(results);\n\t\t\t\t} else {\n\t\t\t\t\tresolve(result);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tfn.apply(this, args);\n\t});\n};\n\nmodule.exports = (obj, opts) => {\n\topts = Object.assign({\n\t\texclude: [/.+(Sync|Stream)$/],\n\t\terrorFirst: true,\n\t\tpromiseModule: Promise\n\t}, opts);\n\n\tconst filter = key => {\n\t\tconst match = pattern => typeof pattern === 'string' ? key === pattern : pattern.test(key);\n\t\treturn opts.include ? opts.include.some(match) : !opts.exclude.some(match);\n\t};\n\n\tlet ret;\n\tif (typeof obj === 'function') {\n\t\tret = function () {\n\t\t\tif (opts.excludeMain) {\n\t\t\t\treturn obj.apply(this, arguments);\n\t\t\t}\n\n\t\t\treturn processFn(obj, opts).apply(this, arguments);\n\t\t};\n\t} else {\n\t\tret = Object.create(Object.getPrototypeOf(obj));\n\t}\n\n\tfor (const key in obj) { // eslint-disable-line guard-for-in\n\t\tconst x = obj[key];\n\t\tret[key] = typeof x === 'function' && filter(key) ? processFn(x, opts) : x;\n\t}\n\n\treturn ret;\n};\n", "'use strict';\nconst fs = require('fs');\nconst pify = require('pify');\n\nfunction type(fn, fn2, fp) {\n\tif (typeof fp !== 'string') {\n\t\treturn Promise.reject(new TypeError(`Expected a string, got ${typeof fp}`));\n\t}\n\n\treturn pify(fs[fn])(fp)\n\t\t.then(stats => stats[fn2]())\n\t\t.catch(err => {\n\t\t\tif (err.code === 'ENOENT') {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthrow err;\n\t\t});\n}\n\nfunction typeSync(fn, fn2, fp) {\n\tif (typeof fp !== 'string') {\n\t\tthrow new TypeError(`Expected a string, got ${typeof fp}`);\n\t}\n\n\ttry {\n\t\treturn fs[fn](fp)[fn2]();\n\t} catch (err) {\n\t\tif (err.code === 'ENOENT') {\n\t\t\treturn false;\n\t\t}\n\n\t\tthrow err;\n\t}\n}\n\nexports.file = type.bind(null, 'stat', 'isFile');\nexports.dir = type.bind(null, 'stat', 'isDirectory');\nexports.symlink = type.bind(null, 'lstat', 'isSymbolicLink');\nexports.fileSync = typeSync.bind(null, 'statSync', 'isFile');\nexports.dirSync = typeSync.bind(null, 'statSync', 'isDirectory');\nexports.symlinkSync = typeSync.bind(null, 'lstatSync', 'isSymbolicLink');\n", "'use strict';\nconst path = require('path');\nconst arrify = require('arrify');\nconst pathType = require('path-type');\n\nconst getExtensions = extensions => extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0];\nconst getPath = filepath => filepath[0] === '!' ? filepath.slice(1) : filepath;\n\nconst addExtensions = (file, extensions) => {\n\tif (path.extname(file)) {\n\t\treturn `**/${file}`;\n\t}\n\n\treturn `**/${file}.${getExtensions(extensions)}`;\n};\n\nconst getGlob = (dir, opts) => {\n\topts = Object.assign({}, opts);\n\n\tif (opts.files && !Array.isArray(opts.files)) {\n\t\tthrow new TypeError(`\\`options.files\\` must be an \\`Array\\`, not \\`${typeof opts.files}\\``);\n\t}\n\n\tif (opts.extensions && !Array.isArray(opts.extensions)) {\n\t\tthrow new TypeError(`\\`options.extensions\\` must be an \\`Array\\`, not \\`${typeof opts.extensions}\\``);\n\t}\n\n\tif (opts.files && opts.extensions) {\n\t\treturn opts.files.map(x => path.join(dir, addExtensions(x, opts.extensions)));\n\t} else if (opts.files) {\n\t\treturn opts.files.map(x => path.join(dir, `**/${x}`));\n\t} else if (opts.extensions) {\n\t\treturn [path.join(dir, `**/*.${getExtensions(opts.extensions)}`)];\n\t}\n\n\treturn [path.join(dir, '**')];\n};\n\nmodule.exports = (input, opts) => {\n\treturn Promise.all(arrify(input).map(x => pathType.dir(getPath(x))\n\t\t.then(isDir => isDir ? getGlob(x, opts) : x)))\n\t\t.then(globs => [].concat.apply([], globs));\n};\n\nmodule.exports.sync = (input, opts) => {\n\tconst globs = arrify(input).map(x => pathType.dirSync(getPath(x)) ? getGlob(x, opts) : x);\n\treturn [].concat.apply([], globs);\n};\n", "'use strict';\nmodule.exports = function (str) {\n\tvar isExtendedLengthPath = /^\\\\\\\\\\?\\\\/.test(str);\n\tvar hasNonAscii = /[^\\x00-\\x80]+/.test(str);\n\n\tif (isExtendedLengthPath || hasNonAscii) {\n\t\treturn str;\n\t}\n\n\treturn str.replace(/\\\\/g, '/');\n};\n", "'use strict';\nconst fs = require('fs');\nconst path = require('path');\nconst fastGlob = require('fast-glob');\nconst gitIgnore = require('ignore');\nconst pify = require('pify');\nconst slash = require('slash');\n\nconst DEFAULT_IGNORE = [\n\t'**/node_modules/**',\n\t'**/bower_components/**',\n\t'**/flow-typed/**',\n\t'**/coverage/**',\n\t'**/.git'\n];\n\nconst readFileP = pify(fs.readFile);\n\nconst mapGitIgnorePatternTo = base => ignore => {\n\tif (ignore.startsWith('!')) {\n\t\treturn '!' + path.posix.join(base, ignore.substr(1));\n\t}\n\n\treturn path.posix.join(base, ignore);\n};\n\nconst parseGitIgnore = (content, opts) => {\n\tconst base = slash(path.relative(opts.cwd, path.dirname(opts.fileName)));\n\n\treturn content\n\t\t.split(/\\r?\\n/)\n\t\t.filter(Boolean)\n\t\t.filter(l => l.charAt(0) !== '#')\n\t\t.map(mapGitIgnorePatternTo(base));\n};\n\nconst reduceIgnore = files => {\n\treturn files.reduce((ignores, file) => {\n\t\tignores.add(parseGitIgnore(file.content, {\n\t\t\tcwd: file.cwd,\n\t\t\tfileName: file.filePath\n\t\t}));\n\t\treturn ignores;\n\t}, gitIgnore());\n};\n\nconst getIsIgnoredPredecate = (ignores, cwd) => {\n\treturn p => ignores.ignores(slash(path.relative(cwd, p)));\n};\n\nconst getFile = (file, cwd) => {\n\tconst filePath = path.join(cwd, file);\n\treturn readFileP(filePath, 'utf8')\n\t\t.then(content => ({\n\t\t\tcontent,\n\t\t\tcwd,\n\t\t\tfilePath\n\t\t}));\n};\n\nconst getFileSync = (file, cwd) => {\n\tconst filePath = path.join(cwd, file);\n\tconst content = fs.readFileSync(filePath, 'utf8');\n\n\treturn {\n\t\tcontent,\n\t\tcwd,\n\t\tfilePath\n\t};\n};\n\nconst normalizeOpts = opts => {\n\topts = opts || {};\n\tconst ignore = opts.ignore || [];\n\tconst cwd = opts.cwd || process.cwd();\n\treturn {ignore, cwd};\n};\n\nmodule.exports = o => {\n\tconst opts = normalizeOpts(o);\n\n\treturn fastGlob('**/.gitignore', {ignore: DEFAULT_IGNORE.concat(opts.ignore), cwd: opts.cwd})\n\t\t.then(paths => Promise.all(paths.map(file => getFile(file, opts.cwd))))\n\t\t.then(files => reduceIgnore(files))\n\t\t.then(ignores => getIsIgnoredPredecate(ignores, opts.cwd));\n};\n\nmodule.exports.sync = o => {\n\tconst opts = normalizeOpts(o);\n\n\tconst paths = fastGlob.sync('**/.gitignore', {ignore: DEFAULT_IGNORE.concat(opts.ignore), cwd: opts.cwd});\n\tconst files = paths.map(file => getFileSync(file, opts.cwd));\n\tconst ignores = reduceIgnore(files);\n\treturn getIsIgnoredPredecate(ignores, opts.cwd);\n};\n", "'use strict';\nconst arrayUnion = require('array-union');\nconst glob = require('glob');\nconst fastGlob = require('fast-glob');\nconst dirGlob = require('dir-glob');\nconst gitignore = require('./gitignore');\n\nconst DEFAULT_FILTER = () => false;\n\nconst isNegative = pattern => pattern[0] === '!';\n\nconst assertPatternsInput = patterns => {\n\tif (!patterns.every(x => typeof x === 'string')) {\n\t\tthrow new TypeError('Patterns must be a string or an array of strings');\n\t}\n};\n\nconst generateGlobTasks = (patterns, taskOpts) => {\n\tpatterns = [].concat(patterns);\n\tassertPatternsInput(patterns);\n\n\tconst globTasks = [];\n\n\ttaskOpts = Object.assign({\n\t\tignore: [],\n\t\texpandDirectories: true\n\t}, taskOpts);\n\n\tpatterns.forEach((pattern, i) => {\n\t\tif (isNegative(pattern)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst ignore = patterns\n\t\t\t.slice(i)\n\t\t\t.filter(isNegative)\n\t\t\t.map(pattern => pattern.slice(1));\n\n\t\tconst opts = Object.assign({}, taskOpts, {\n\t\t\tignore: taskOpts.ignore.concat(ignore)\n\t\t});\n\n\t\tglobTasks.push({pattern, opts});\n\t});\n\n\treturn globTasks;\n};\n\nconst globDirs = (task, fn) => {\n\tlet opts = {cwd: task.opts.cwd};\n\n\tif (Array.isArray(task.opts.expandDirectories)) {\n\t\topts = Object.assign(opts, {files: task.opts.expandDirectories});\n\t} else if (typeof task.opts.expandDirectories === 'object') {\n\t\topts = Object.assign(opts, task.opts.expandDirectories);\n\t}\n\n\treturn fn(task.pattern, opts);\n};\n\nconst getPattern = (task, fn) => task.opts.expandDirectories ? globDirs(task, fn) : [task.pattern];\n\nmodule.exports = (patterns, opts) => {\n\tlet globTasks;\n\n\ttry {\n\t\tglobTasks = generateGlobTasks(patterns, opts);\n\t} catch (err) {\n\t\treturn Promise.reject(err);\n\t}\n\n\tconst getTasks = Promise.all(globTasks.map(task => Promise.resolve(getPattern(task, dirGlob))\n\t\t.then(globs => Promise.all(globs.map(glob => ({\n\t\t\tpattern: glob,\n\t\t\topts: task.opts\n\t\t}))))\n\t))\n\t\t.then(tasks => arrayUnion.apply(null, tasks));\n\n\tconst getFilter = () => {\n\t\treturn Promise.resolve(\n\t\t\topts && opts.gitignore ?\n\t\t\t\tgitignore({cwd: opts.cwd, ignore: opts.ignore}) :\n\t\t\t\tDEFAULT_FILTER\n\t\t);\n\t};\n\n\treturn getFilter()\n\t\t.then(filter => {\n\t\t\treturn getTasks\n\t\t\t\t.then(tasks => Promise.all(tasks.map(task => fastGlob(task.pattern, task.opts))))\n\t\t\t\t.then(paths => arrayUnion.apply(null, paths))\n\t\t\t\t.then(paths => paths.filter(p => !filter(p)));\n\t\t});\n};\n\nmodule.exports.sync = (patterns, opts) => {\n\tconst globTasks = generateGlobTasks(patterns, opts);\n\n\tconst getFilter = () => {\n\t\treturn opts && opts.gitignore ?\n\t\t\tgitignore.sync({cwd: opts.cwd, ignore: opts.ignore}) :\n\t\t\tDEFAULT_FILTER;\n\t};\n\n\tconst tasks = globTasks.reduce((tasks, task) => {\n\t\tconst newTask = getPattern(task, dirGlob.sync).map(glob => ({\n\t\t\tpattern: glob,\n\t\t\topts: task.opts\n\t\t}));\n\t\treturn tasks.concat(newTask);\n\t}, []);\n\n\tconst filter = getFilter();\n\n\treturn tasks.reduce(\n\t\t(matches, task) => arrayUnion(matches, fastGlob.sync(task.pattern, task.opts)),\n\t\t[]\n\t).filter(p => !filter(p));\n};\n\nmodule.exports.generateGlobTasks = generateGlobTasks;\n\nmodule.exports.hasMagic = (patterns, opts) => []\n\t.concat(patterns)\n\t.some(pattern => glob.hasMagic(pattern, opts));\n\nmodule.exports.gitignore = gitignore;\n", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _globby = require(\"globby\");\n\nvar _globby2 = _interopRequireDefault(_globby);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar expandGlobs = function expandGlobs() {\n var globs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n return _globby2.default.sync([].concat(_toConsumableArray(globs), [\"!**/node_modules/**\", \"!./node_modules/**\"]), {\n dot: true\n });\n};\n\nexports.default = expandGlobs;", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _chalk = require(\"chalk\");\n\nvar _chalk2 = _interopRequireDefault(_chalk);\n\nvar _yargs = require(\"yargs\");\n\nvar _yargs2 = _interopRequireDefault(_yargs);\n\nvar _fix = require(\"./fix\");\n\nvar _fix2 = _interopRequireDefault(_fix);\n\nvar _check = require(\"./check\");\n\nvar _check2 = _interopRequireDefault(_check);\n\nvar _expandGlobs = require(\"./expand-globs\");\n\nvar _expandGlobs2 = _interopRequireDefault(_expandGlobs);\n\nvar _createIgnorer = require(\"./create-ignorer\");\n\nvar _createIgnorer2 = _interopRequireDefault(_createIgnorer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); } /* eslint no-console: 0 */\n\nvar cli = function cli(argv) {\n var _yargs$command$exampl = _yargs2.default\n // Fix\n .command(\"fix\", \"Fix one or more files\").example(\"prettier-tslint fix file1.ts file2.ts\", \"Fix provided files\").example(\"prettier-tslint fix '**/*.ts'\", \"Fix all .ts files\")\n // Check\n .command(\"check\", \"List files that aren't formatted\").example(\"prettier-tslint check '**/*.ts'\", \"List unformatted .ts files\")\n // Meta\n .demandCommand(1, \"Command not provided.\").help().parse(argv),\n _yargs$command$exampl2 = _toArray(_yargs$command$exampl._),\n command = _yargs$command$exampl2[0],\n patterns = _yargs$command$exampl2.slice(1);\n\n switch (command) {\n case \"fix\":\n return fixFiles(patterns);\n case \"check\":\n return checkFiles(patterns);\n default:\n (0, _yargs.showHelp)();\n console.error(`Unknown command: ${command}`);\n }\n};\n\nvar fixFiles = function fixFiles(filePatterns) {\n var ignorer = (0, _createIgnorer2.default)();\n var files = (0, _expandGlobs2.default)(filePatterns);\n files.forEach(function (file) {\n var changed = !(0, _fix2.default)(file, ignorer);\n console.log(changed ? file : _chalk2.default.gray(file));\n });\n};\n\nvar checkFiles = function checkFiles(filePatterns) {\n var ignorer = (0, _createIgnorer2.default)();\n var files = (0, _expandGlobs2.default)(filePatterns);\n var invalid = files.filter(function (file) {\n return !(0, _check2.default)(file, ignorer);\n });\n if (invalid.length) {\n process.exitCode = 1;\n }\n invalid.forEach(function (file) {\n return console.error(_chalk2.default.red.bold(file));\n });\n};\n\nexports.default = cli;", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = format;\n\nvar _path = require(\"path\");\n\nvar _fs = require(\"fs\");\n\nvar _utils = require(\"./utils\");\n\n/**\n * Formats the text with prettier and then eslint based on the given options\n * @param {String} options.filePath - the path of the file being formatted\n * can be used in leu of `eslintConfig` (eslint will be used to find the\n * relevant config for the file). Will also be used to load the `text` if\n * `text` is not provided.\n * @param {String} options.text - the text (TypeScript code) to format\n * @param {String} options.tslintPath - the path to the tslint module to use.\n * Will default to require.resolve('tslint')\n * @param {String} options.prettierPath - the path to the prettier module.\n * Will default to require.resovlve('prettier')\n * @param {Object} options.tslintConfig - the config to use for formatting\n * with TSLint.\n * @param {Object} options.prettierOptions - the options to pass for\n * formatting with `prettier`. If not provided, prettier-eslint will attempt\n * to create the options based on the eslintConfig\n * @param {Object} options.fallbackPrettierOptions - the options to pass for\n * formatting with `prettier` if the given option is not inferrable from the\n * eslintConfig.\n * @param {Boolean} options.prettierLast - Run Prettier Last\n * @return {String} - the formatted string\n */\nfunction format(options) {\n var filePath = options.filePath;\n\n\n var tslintFix = createTSLintFix(options.tslintConfig, options.tslintPath || (0, _utils.getModulePath)(filePath, \"tslint\"));\n\n var prettify = createPrettify(options.prettierOptions || options.fallbackPrettierOptions || {}, options.prettierPath || (0, _utils.getModulePath)(filePath, \"prettier\"));\n\n var text = options.text || (0, _fs.readFileSync)(filePath, \"utf8\");\n return options.prettierLast ? prettify(tslintFix(text, filePath), filePath) : tslintFix(prettify(text, filePath), filePath);\n}\n\nfunction createPrettify(formatOptions, prettierPath) {\n var prettier = (0, _utils.requireModule)(prettierPath);\n return function prettify(text, filePath) {\n return prettier.format(text, Object.assign({}, formatOptions, (0, _utils.getPrettierConfig)(filePath), filePath && { filepath: filePath }));\n };\n}\n\nfunction createTSLintFix(defaultLintConfig, tslintPath) {\n var tslint = (0, _utils.requireModule)(tslintPath);\n var findConfiguration = tslint.Configuration.findConfiguration;\n\n // Adapted from: https://github.com/palantir/tslint/blob/5.12.0/src/linter.ts\n\n return function tslintFix(text, filePath) {\n // TODO: Use the \"fix\" option of `new tslint.Linter()` once the following\n // issue is triaged: https://github.com/palantir/tslint/issues/4411\n var linter = new tslint.Linter({\n fix: false, // Disabled to avoid file operations.\n formatter: \"json\"\n });\n\n var lintConfig = Object.assign({}, defaultLintConfig, findConfiguration(null, filePath).results);\n\n linter.lint(filePath, text, lintConfig);\n\n var _linter$getResult = linter.getResult(),\n failures = _linter$getResult.failures;\n\n if (!failures.length) {\n return text;\n }\n\n // This is a private method, but we're using it as a workaround.\n var enabledRules = linter.getEnabledRules(lintConfig, (0, _path.extname)(filePath) === \".js\");\n\n // To keep rules from interfering with one another, we apply their fixes one\n // rule at a time. More info: https://github.com/azz/prettier-tslint/issues/26\n return enabledRules.reduce(function (text, rule) {\n var _rule$getOptions = rule.getOptions(),\n ruleName = _rule$getOptions.ruleName;\n\n var hasFix = function hasFix(f) {\n return f.hasFix() && f.getRuleName() === ruleName;\n };\n if (failures.some(hasFix)) {\n var sourceFile = tslint.getSourceFile(filePath, text);\n var fixableFailures = tslint.removeDisabledFailures(sourceFile, rule.apply(sourceFile)).filter(function (f) {\n return f.hasFix();\n });\n\n if (fixableFailures.length) {\n var fixes = fixableFailures.map(function (f) {\n return f.getFix();\n });\n return tslint.Replacement.applyFixes(text, fixes);\n }\n }\n return text;\n }, text);\n };\n}", "\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _cli = require(\"./cli\");\n\nObject.defineProperty(exports, \"cli\", {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_cli).default;\n }\n});\n\nvar _format = require(\"./format\");\n\nObject.defineProperty(exports, \"format\", {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_format).default;\n }\n});\n\nvar _fix = require(\"./fix\");\n\nObject.defineProperty(exports, \"fix\", {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_fix).default;\n }\n});\n\nvar _check = require(\"./check\");\n\nObject.defineProperty(exports, \"check\", {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_check).default;\n }\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }", "var baseIteratee = require('./_baseIteratee'),\n isArrayLike = require('./isArrayLike'),\n keys = require('./keys');\n\n/**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\nfunction createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = baseIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n}\n\nmodule.exports = createFind;\n", "var createFind = require('./_createFind'),\n findLastIndex = require('./findLastIndex');\n\n/**\n * This method is like `_.find` except that it iterates over elements of\n * `collection` from right to left.\n *\n * @static\n * @memberOf _\n * @since 2.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=collection.length-1] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * _.findLast([1, 2, 3, 4], function(n) {\n * return n % 2 == 1;\n * });\n * // => 3\n */\nvar findLast = createFind(findLastIndex);\n\nmodule.exports = findLast;\n", "/**\n * Creates an array with all falsey values removed. The values `false`, `null`,\n * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to compact.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.compact([0, 1, false, 2, '', 3]);\n * // => [1, 2, 3]\n */\nfunction compact(array) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = compact;\n", "var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n arrayMap = require('./_arrayMap'),\n baseUnary = require('./_baseUnary'),\n cacheHas = require('./_cacheHas');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\nfunction baseDifference(array, values, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n isCommon = true,\n length = array.length,\n result = [],\n valuesLength = values.length;\n\n if (!length) {\n return result;\n }\n if (iteratee) {\n values = arrayMap(values, baseUnary(iteratee));\n }\n if (comparator) {\n includes = arrayIncludesWith;\n isCommon = false;\n }\n else if (values.length >= LARGE_ARRAY_SIZE) {\n includes = cacheHas;\n isCommon = false;\n values = new SetCache(values);\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee == null ? value : iteratee(value);\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var valuesIndex = valuesLength;\n while (valuesIndex--) {\n if (values[valuesIndex] === computed) {\n continue outer;\n }\n }\n result.push(value);\n }\n else if (!includes(values, computed, comparator)) {\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseDifference;\n", "var baseDifference = require('./_baseDifference'),\n baseFlatten = require('./_baseFlatten'),\n baseRest = require('./_baseRest'),\n isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */\nvar difference = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n : [];\n});\n\nmodule.exports = difference;\n", "/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nmodule.exports = createBaseFor;\n", "var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n", "var baseFor = require('./_baseFor'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n", "var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n", "var baseForOwn = require('./_baseForOwn'),\n createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n", "var baseEach = require('./_baseEach'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\nmodule.exports = baseMap;\n", "/**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\nfunction baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n}\n\nmodule.exports = baseSortBy;\n", "var isSymbol = require('./isSymbol');\n\n/**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\nfunction compareAscending(value, other) {\n if (value !== other) {\n var valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive) {\n return 1;\n }\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive) {\n return -1;\n }\n }\n return 0;\n}\n\nmodule.exports = compareAscending;\n", "var compareAscending = require('./_compareAscending');\n\n/**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\nfunction compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = compareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order == 'desc' ? -1 : 1);\n }\n }\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n}\n\nmodule.exports = compareMultiple;\n", "var arrayMap = require('./_arrayMap'),\n baseGet = require('./_baseGet'),\n baseIteratee = require('./_baseIteratee'),\n baseMap = require('./_baseMap'),\n baseSortBy = require('./_baseSortBy'),\n baseUnary = require('./_baseUnary'),\n compareMultiple = require('./_compareMultiple'),\n identity = require('./identity'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\nfunction baseOrderBy(collection, iteratees, orders) {\n if (iteratees.length) {\n iteratees = arrayMap(iteratees, function(iteratee) {\n if (isArray(iteratee)) {\n return function(value) {\n return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n }\n }\n return iteratee;\n });\n } else {\n iteratees = [identity];\n }\n\n var index = -1;\n iteratees = arrayMap(iteratees, baseUnary(baseIteratee));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n}\n\nmodule.exports = baseOrderBy;\n", "var eq = require('./eq'),\n isArrayLike = require('./isArrayLike'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nmodule.exports = isIterateeCall;\n", "var baseFlatten = require('./_baseFlatten'),\n baseOrderBy = require('./_baseOrderBy'),\n baseRest = require('./_baseRest'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 30 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n */\nvar sortBy = baseRest(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n});\n\nmodule.exports = sortBy;\n", "var baseUniq = require('./_baseUniq');\n\n/**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\nfunction uniq(array) {\n return (array && array.length) ? baseUniq(array) : [];\n}\n\nmodule.exports = uniq;\n", "/**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction arrayAggregator(array, setter, iteratee, accumulator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n var value = array[index];\n setter(accumulator, value, iteratee(value), array);\n }\n return accumulator;\n}\n\nmodule.exports = arrayAggregator;\n", "var baseEach = require('./_baseEach');\n\n/**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction baseAggregator(collection, setter, iteratee, accumulator) {\n baseEach(collection, function(value, key, collection) {\n setter(accumulator, value, iteratee(value), collection);\n });\n return accumulator;\n}\n\nmodule.exports = baseAggregator;\n", "var arrayAggregator = require('./_arrayAggregator'),\n baseAggregator = require('./_baseAggregator'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray');\n\n/**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\nfunction createAggregator(setter, initializer) {\n return function(collection, iteratee) {\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\n accumulator = initializer ? initializer() : {};\n\n return func(collection, setter, baseIteratee(iteratee, 2), accumulator);\n };\n}\n\nmodule.exports = createAggregator;\n", "var createAggregator = require('./_createAggregator');\n\n/**\n * Creates an array of elements split into two groups, the first of which\n * contains elements `predicate` returns truthy for, the second of which\n * contains elements `predicate` returns falsey for. The predicate is\n * invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the array of grouped elements.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true },\n * { 'user': 'pebbles', 'age': 1, 'active': false }\n * ];\n *\n * _.partition(users, function(o) { return o.active; });\n * // => objects for [['fred'], ['barney', 'pebbles']]\n *\n * // The `_.matches` iteratee shorthand.\n * _.partition(users, { 'age': 1, 'active': false });\n * // => objects for [['pebbles'], ['barney', 'fred']]\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.partition(users, ['active', false]);\n * // => objects for [['barney', 'pebbles'], ['fred']]\n *\n * // The `_.property` iteratee shorthand.\n * _.partition(users, 'active');\n * // => objects for [['fred'], ['barney', 'pebbles']]\n */\nvar partition = createAggregator(function(result, value, key) {\n result[key ? 0 : 1].push(value);\n}, function() { return [[], []]; });\n\nmodule.exports = partition;\n", "/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\nmodule.exports = baseSlice;\n", "var baseSlice = require('./_baseSlice');\n\n/**\n * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n * without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to query.\n * @param {Function} predicate The function invoked per iteration.\n * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseWhile(array, predicate, isDrop, fromRight) {\n var length = array.length,\n index = fromRight ? length : -1;\n\n while ((fromRight ? index-- : ++index < length) &&\n predicate(array[index], index, array)) {}\n\n return isDrop\n ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n}\n\nmodule.exports = baseWhile;\n", "var baseIteratee = require('./_baseIteratee'),\n baseWhile = require('./_baseWhile');\n\n/**\n * Creates a slice of `array` with elements taken from the end. Elements are\n * taken until `predicate` returns falsey. The predicate is invoked with\n * three arguments: (value, index, array).\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': false }\n * ];\n *\n * _.takeRightWhile(users, function(o) { return !o.active; });\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.matches` iteratee shorthand.\n * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n * // => objects for ['pebbles']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.takeRightWhile(users, ['active', false]);\n * // => objects for ['fred', 'pebbles']\n *\n * // The `_.property` iteratee shorthand.\n * _.takeRightWhile(users, 'active');\n * // => []\n */\nfunction takeRightWhile(array, predicate) {\n return (array && array.length)\n ? baseWhile(array, baseIteratee(predicate, 3), false, true)\n : [];\n}\n\nmodule.exports = takeRightWhile;\n", "var isSymbol = require('./isSymbol');\n\n/**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\nfunction baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseExtremum;\n", "/**\n * The base implementation of `_.lt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n */\nfunction baseLt(value, other) {\n return value < other;\n}\n\nmodule.exports = baseLt;\n", "var baseExtremum = require('./_baseExtremum'),\n baseLt = require('./_baseLt'),\n identity = require('./identity');\n\n/**\n * Computes the minimum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * _.min([]);\n * // => undefined\n */\nfunction min(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseLt)\n : undefined;\n}\n\nmodule.exports = min;\n", "/**\n * The base implementation of `_.gt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n */\nfunction baseGt(value, other) {\n return value > other;\n}\n\nmodule.exports = baseGt;\n", "var baseExtremum = require('./_baseExtremum'),\n baseGt = require('./_baseGt'),\n baseIteratee = require('./_baseIteratee');\n\n/**\n * This method is like `_.max` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * the value is ranked. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * var objects = [{ 'n': 1 }, { 'n': 2 }];\n *\n * _.maxBy(objects, function(o) { return o.n; });\n * // => { 'n': 2 }\n *\n * // The `_.property` iteratee shorthand.\n * _.maxBy(objects, 'n');\n * // => { 'n': 2 }\n */\nfunction maxBy(array, iteratee) {\n return (array && array.length)\n ? baseExtremum(array, baseIteratee(iteratee, 2), baseGt)\n : undefined;\n}\n\nmodule.exports = maxBy;\n", "var toString = require('./toString');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n reHasRegExpChar = RegExp(reRegExpChar.source);\n\n/**\n * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category String\n * @param {string} [string=''] The string to escape.\n * @returns {string} Returns the escaped string.\n * @example\n *\n * _.escapeRegExp('[lodash](https://lodash.com/)');\n * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n */\nfunction escapeRegExp(string) {\n string = toString(string);\n return (string && reHasRegExpChar.test(string))\n ? string.replace(reRegExpChar, '\\\\$&')\n : string;\n}\n\nmodule.exports = escapeRegExp;\n", "var baseSlice = require('./_baseSlice');\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n var length = array.length;\n end = end === undefined ? length : end;\n return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\nmodule.exports = castSlice;\n", "var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the first unmatched string symbol.\n */\nfunction charsStartIndex(strSymbols, chrSymbols) {\n var index = -1,\n length = strSymbols.length;\n\n while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n}\n\nmodule.exports = charsStartIndex;\n", "/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n return string.split('');\n}\n\nmodule.exports = asciiToArray;\n", "/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsZWJ = '\\\\u200d';\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\nmodule.exports = hasUnicode;\n", "/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n return string.match(reUnicode) || [];\n}\n\nmodule.exports = unicodeToArray;\n", "var asciiToArray = require('./_asciiToArray'),\n hasUnicode = require('./_hasUnicode'),\n unicodeToArray = require('./_unicodeToArray');\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n return hasUnicode(string)\n ? unicodeToArray(string)\n : asciiToArray(string);\n}\n\nmodule.exports = stringToArray;\n", "var baseToString = require('./_baseToString'),\n castSlice = require('./_castSlice'),\n charsStartIndex = require('./_charsStartIndex'),\n stringToArray = require('./_stringToArray'),\n toString = require('./toString');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * Removes leading whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trimStart(' abc ');\n * // => 'abc '\n *\n * _.trimStart('-_-abc-_-', '_-');\n * // => 'abc-_-'\n */\nfunction trimStart(string, chars, guard) {\n string = toString(string);\n if (string && (guard || chars === undefined)) {\n return string.replace(reTrimStart, '');\n }\n if (!string || !(chars = baseToString(chars))) {\n return string;\n }\n var strSymbols = stringToArray(string),\n start = charsStartIndex(strSymbols, stringToArray(chars));\n\n return castSlice(strSymbols, start).join('');\n}\n\nmodule.exports = trimStart;\n", "var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n * that is not found in the character symbols.\n *\n * @private\n * @param {Array} strSymbols The string symbols to inspect.\n * @param {Array} chrSymbols The character symbols to find.\n * @returns {number} Returns the index of the last unmatched string symbol.\n */\nfunction charsEndIndex(strSymbols, chrSymbols) {\n var index = strSymbols.length;\n\n while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n return index;\n}\n\nmodule.exports = charsEndIndex;\n", "var baseToString = require('./_baseToString'),\n castSlice = require('./_castSlice'),\n charsEndIndex = require('./_charsEndIndex'),\n stringToArray = require('./_stringToArray'),\n toString = require('./toString'),\n trimmedEndIndex = require('./_trimmedEndIndex');\n\n/**\n * Removes trailing whitespace or specified characters from `string`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to trim.\n * @param {string} [chars=whitespace] The characters to trim.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {string} Returns the trimmed string.\n * @example\n *\n * _.trimEnd(' abc ');\n * // => ' abc'\n *\n * _.trimEnd('-_-abc-_-', '_-');\n * // => '-_-abc'\n */\nfunction trimEnd(string, chars, guard) {\n string = toString(string);\n if (string && (guard || chars === undefined)) {\n return string.slice(0, trimmedEndIndex(string) + 1);\n }\n if (!string || !(chars = baseToString(chars))) {\n return string;\n }\n var strSymbols = stringToArray(string),\n end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n return castSlice(strSymbols, 0, end).join('');\n}\n\nmodule.exports = trimEnd;\n", "var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n", "var baseGetTag = require('./_baseGetTag'),\n getPrototype = require('./_getPrototype'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n", "var baseGetTag = require('./_baseGetTag'),\n isArray = require('./isArray'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nmodule.exports = isString;\n", "var toInteger = require('./toInteger');\n\n/**\n * Checks if `value` is an integer.\n *\n * **Note:** This method is based on\n * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n * @example\n *\n * _.isInteger(3);\n * // => true\n *\n * _.isInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isInteger(Infinity);\n * // => false\n *\n * _.isInteger('3');\n * // => false\n */\nfunction isInteger(value) {\n return typeof value == 'number' && value == toInteger(value);\n}\n\nmodule.exports = isInteger;\n", "var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]';\n\n/**\n * Checks if `value` is classified as a boolean primitive or object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n * @example\n *\n * _.isBoolean(false);\n * // => true\n *\n * _.isBoolean(null);\n * // => false\n */\nfunction isBoolean(value) {\n return value === true || value === false ||\n (isObjectLike(value) && baseGetTag(value) == boolTag);\n}\n\nmodule.exports = isBoolean;\n", "/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nmodule.exports = arrayEach;\n", "var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nmodule.exports = baseAssignValue;\n", "var baseAssignValue = require('./_baseAssignValue'),\n eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignValue;\n", "var assignValue = require('./_assignValue'),\n baseAssignValue = require('./_baseAssignValue');\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nmodule.exports = copyObject;\n", "var copyObject = require('./_copyObject'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n}\n\nmodule.exports = baseAssign;\n", "/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = nativeKeysIn;\n", "var isObject = require('./isObject'),\n isPrototype = require('./_isPrototype'),\n nativeKeysIn = require('./_nativeKeysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeysIn;\n", "var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeysIn = require('./_baseKeysIn'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n", "var copyObject = require('./_copyObject'),\n keysIn = require('./keysIn');\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n}\n\nmodule.exports = baseAssignIn;\n", "var root = require('./_root');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nmodule.exports = cloneBuffer;\n", "/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nmodule.exports = copyArray;\n", "var copyObject = require('./_copyObject'),\n getSymbols = require('./_getSymbols');\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n}\n\nmodule.exports = copySymbols;\n", "var arrayPush = require('./_arrayPush'),\n getPrototype = require('./_getPrototype'),\n getSymbols = require('./_getSymbols'),\n stubArray = require('./stubArray');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n};\n\nmodule.exports = getSymbolsIn;\n", "var copyObject = require('./_copyObject'),\n getSymbolsIn = require('./_getSymbolsIn');\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n", "var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbolsIn = require('./_getSymbolsIn'),\n keysIn = require('./keysIn');\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nmodule.exports = getAllKeysIn;\n", "/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\nmodule.exports = initCloneArray;\n", "var Uint8Array = require('./_Uint8Array');\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nmodule.exports = cloneArrayBuffer;\n", "var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n", "/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\nmodule.exports = cloneRegExp;\n", "var Symbol = require('./_Symbol');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nmodule.exports = cloneSymbol;\n", "var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nmodule.exports = cloneTypedArray;\n", "var cloneArrayBuffer = require('./_cloneArrayBuffer'),\n cloneDataView = require('./_cloneDataView'),\n cloneRegExp = require('./_cloneRegExp'),\n cloneSymbol = require('./_cloneSymbol'),\n cloneTypedArray = require('./_cloneTypedArray');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\nmodule.exports = initCloneByTag;\n", "var isObject = require('./isObject');\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nmodule.exports = baseCreate;\n", "var baseCreate = require('./_baseCreate'),\n getPrototype = require('./_getPrototype'),\n isPrototype = require('./_isPrototype');\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nmodule.exports = initCloneObject;\n", "var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nmodule.exports = baseIsMap;\n", "var baseIsMap = require('./_baseIsMap'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nmodule.exports = isMap;\n", "var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n}\n\nmodule.exports = baseIsSet;\n", "var baseIsSet = require('./_baseIsSet'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nmodule.exports = isSet;\n", "var Stack = require('./_Stack'),\n arrayEach = require('./_arrayEach'),\n assignValue = require('./_assignValue'),\n baseAssign = require('./_baseAssign'),\n baseAssignIn = require('./_baseAssignIn'),\n cloneBuffer = require('./_cloneBuffer'),\n copyArray = require('./_copyArray'),\n copySymbols = require('./_copySymbols'),\n copySymbolsIn = require('./_copySymbolsIn'),\n getAllKeys = require('./_getAllKeys'),\n getAllKeysIn = require('./_getAllKeysIn'),\n getTag = require('./_getTag'),\n initCloneArray = require('./_initCloneArray'),\n initCloneByTag = require('./_initCloneByTag'),\n initCloneObject = require('./_initCloneObject'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isMap = require('./isMap'),\n isObject = require('./isObject'),\n isSet = require('./isSet'),\n keys = require('./keys'),\n keysIn = require('./keysIn');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\nmodule.exports = baseClone;\n", "var baseClone = require('./_baseClone');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\nfunction clone(value) {\n return baseClone(value, CLONE_SYMBOLS_FLAG);\n}\n\nmodule.exports = clone;\n", "{\n \"grouped\": [\n \"position\",\n \"top\",\n \"right\",\n \"bottom\",\n \"left\",\n \"z-index\",\n \"display\",\n \"visibility\",\n \"flex\",\n \"flex-grow\",\n \"flex-shrink\",\n \"flex-basis\",\n \"flex-direction\",\n \"order\",\n \"flex-order\",\n \"flex-wrap\",\n \"flex-flow\",\n \"justify-content\",\n \"align-self\",\n \"align-items\",\n \"align-content\",\n \"flex-pack\",\n \"flex-align\",\n \"float\",\n \"clear\",\n \"overflow\",\n \"overflow-x\",\n \"overflow-y\",\n \"clip\",\n \"box-sizing\",\n \"margin\",\n \"margin-top\",\n \"margin-right\",\n \"margin-bottom\",\n \"margin-left\",\n \"padding\",\n \"padding-top\",\n \"padding-right\",\n \"padding-bottom\",\n \"padding-left\",\n \"min-width\",\n \"min-height\",\n \"max-width\",\n \"max-height\",\n \"width\",\n \"height\",\n \"outline\",\n \"outline-width\",\n \"outline-style\",\n \"outline-color\",\n \"outline-offset\",\n \"border\",\n \"border-spacing\",\n \"border-collapse\",\n \"border-width\",\n \"border-style\",\n \"border-color\",\n \"border-top\",\n \"border-top-width\",\n \"border-top-style\",\n \"border-top-color\",\n \"border-right\",\n \"border-right-width\",\n \"border-right-style\",\n \"border-right-color\",\n \"border-bottom\",\n \"border-bottom-width\",\n \"border-bottom-style\",\n \"border-bottom-color\",\n \"border-left\",\n \"border-left-width\",\n \"border-left-style\",\n \"border-left-color\",\n \"border-radius\",\n \"border-top-left-radius\",\n \"border-top-right-radius\",\n \"border-bottom-right-radius\",\n \"border-bottom-left-radius\",\n \"border-image\",\n \"border-image-source\",\n \"border-image-slice\",\n \"border-image-width\",\n \"border-image-outset\",\n \"border-image-repeat\",\n \"border-top-image\",\n \"border-right-image\",\n \"border-bottom-image\",\n \"border-left-image\",\n \"border-corner-image\",\n \"border-top-left-image\",\n \"border-top-right-image\",\n \"border-bottom-right-image\",\n \"border-bottom-left-image\",\n \"background\",\n \"filter\",\n \"background-color\",\n \"background-image\",\n \"background-attachment\",\n \"background-position\",\n \"background-position-x\",\n \"background-position-y\",\n \"background-clip\",\n \"background-origin\",\n \"background-size\",\n \"background-repeat\",\n \"box-decoration-break\",\n \"box-shadow\",\n \"color\",\n \"table-layout\",\n \"caption-side\",\n \"empty-cells\",\n \"list-style\",\n \"list-style-position\",\n \"list-style-type\",\n \"list-style-image\",\n \"quotes\",\n \"content\",\n \"counter-increment\",\n \"counter-reset\",\n \"vertical-align\",\n \"text-align\",\n \"text-align-last\",\n \"text-decoration\",\n \"text-emphasis\",\n \"text-emphasis-position\",\n \"text-emphasis-style\",\n \"text-emphasis-color\",\n \"text-indent\",\n \"text-justify\",\n \"text-outline\",\n \"text-transform\",\n \"text-wrap\",\n \"text-overflow\",\n \"text-overflow-ellipsis\",\n \"text-overflow-mode\",\n \"text-shadow\",\n \"white-space\",\n \"word-spacing\",\n \"word-wrap\",\n \"word-break\",\n \"tab-size\",\n \"hyphens\",\n \"letter-spacing\",\n \"font\",\n \"font-weight\",\n \"font-style\",\n \"font-variant\",\n \"font-size-adjust\",\n \"font-stretch\",\n \"font-size\",\n \"font-family\",\n \"src\",\n \"line-height\",\n \"opacity\",\n \"filter\",\n \"resize\",\n \"cursor\",\n \"nav-index\",\n \"nav-up\",\n \"nav-right\",\n \"nav-down\",\n \"nav-left\",\n \"transition\",\n \"transition-delay\",\n \"transition-timing-function\",\n \"transition-duration\",\n \"transition-property\",\n \"transform\",\n \"transform-origin\",\n \"animation\",\n \"animation-name\",\n \"animation-duration\",\n \"animation-play-state\",\n \"animation-timing-function\",\n \"animation-delay\",\n \"animation-iteration-count\",\n \"animation-direction\",\n \"pointer-events\",\n \"unicode-bidi\",\n \"direction\",\n \"columns\",\n \"column-span\",\n \"column-width\",\n \"column-fill\",\n \"column-gap\",\n \"column-rule\",\n \"column-rule-width\",\n \"column-rule-style\",\n \"column-rule-color\",\n \"break-before\",\n \"break-inside\",\n \"break-after\",\n \"page-break-before\",\n \"page-break-inside\",\n \"page-break-after\",\n \"orphans\",\n \"widows\",\n \"zoom\",\n \"max-zoom\",\n \"min-zoom\",\n \"user-zoom\",\n \"orientation\"\n ]\n}\n", "const clone = require('lodash/clone')\nconst uniq = require('lodash/uniq')\nconst ordering = require('stylint/src/data/ordering.json')\n\nmodule.exports = function () {\n const list = clone(ordering.grouped)\n\n function insert(...items) {\n return {\n before: function (prop) {\n list.splice(list.indexOf(prop), 0, ...items)\n },\n after: function (prop) {\n list.splice(list.indexOf(prop) + 1, 0, ...items)\n }\n }\n }\n\n // See https://github.com/tj/nib/blob/master/docs/README.md\n insert('fixed', 'absolute', 'relative').before('position')\n insert('clearfix').before('clear')\n insert('image').before('background')\n insert('shadow-stroke').before('text-shadow')\n insert('size').before('width')\n insert('whitespace').before('white-space')\n insert('ellipsis').before('overflow')\n insert('backface-visibility').before('opacity')\n insert('user-select').after('user-zoom')\n\n return uniq(list)\n}", "const sortedProperties = require('./createSortedProperties')()\n\nmodule.exports = {\n\tinsertColons: {\n\t\tdescription: 'Insert or remove a colon between a property name and its value.',\n\t\ttype: 'boolean',\n\t\tdefault: true,\n\t\texample: {\n\t\t\tvalues: [true, false],\n\t\t\tcode: `\n\t\t\t.class1\n\t\t\t\tbackground red\n\t\t\t`\n\t\t}\n\t},\n\tinsertSemicolons: {\n\t\tdescription: 'Insert or remove a semi-colon after a property value, a variable declaration, a variable assignment and a mixin/function call.',\n\t\ttype: 'boolean',\n\t\tdefault: true,\n\t\texample: {\n\t\t\tvalues: [true, false],\n\t\t\tcode: `\n\t\t\t.class1\n\t\t\t\tbackground red\n\t\t\t`\n\t\t}\n\t},\n\tinsertBraces: {\n\t\tdescription: 'Insert or remove a pair of curly braces where they are supposed to be. Note that this option does not affect <code>@block</code> construction, see <a class=\"nada\" href=\"#option-always-use-at-block\"><mark>alwaysUseAtBlock</mark></a>.',\n\t\ttype: 'boolean',\n\t\tdefault: true,\n\t\texample: {\n\t\t\tvalues: [true, false],\n\t\t\tcode: `\n\t\t\t.class1\n\t\t\t\tbackground red\n\t\t\t`\n\t\t}\n\t},\n\tinsertNewLineAroundImports: {\n\t\tdescription: 'Insert a new-line around a group of <code>@import</code>/<code>@require</code>(s).\\nOnly apply to imports outside a block when set to <code>\"root\"</code>, or only apply to imports inside a block when set to <code>\"nested\"</code>.\\n<span class=\"no-vsce\">Check the detailed examples <a href=\"#option-insert-newline-around-any\">below</a>.</span>',\n\t\tenum: [true, false, 'root', 'nested'],\n\t\tdefault: true,\n\t},\n\tinsertNewLineAroundBlocks: {\n\t\tdescription: 'Insert a new-line around blocks.\\nOnly apply to top-level blocks when set to <code>\"root\"</code>, or only apply to nested blocks when set to <code>\"nested\"</code>.\\n<span class=\"no-vsce\">Check the detailed examples <a href=\"#option-insert-newline-around-any\">below</a>.</span>',\n\t\tenum: [true, false, 'root', 'nested'],\n\t\tdefault: true,\n\t},\n\tinsertNewLineAroundProperties: {\n\t\tdescription: 'Insert a new-line around a group of CSS properties.\\nUnlike <mark>insertNewLineAroundBlocks</mark> and <mark>insertNewLineAroundOthers</mark>, this option cannot be set to <code>\"root\"</code> nor <code>\"nested\"</code> because CSS properties cannot be placed at the top level.\\n<span class=\"no-vsce\">Check the detailed examples <a href=\"#option-insert-newline-around-any\">below</a>.</span>',\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t},\n\tinsertNewLineAroundOthers: {\n\t\tdescription: 'Insert a new-line around a group of non-properties, non-imports and non-blocks.\\nOnly apply to others outside a block when set to <code>\"root\"</code>, or only apply to others inside a block when set to <code>\"nested\"</code>.\\n<span class=\"no-vsce\">Check the detailed examples <a href=\"#option-insert-newline-around-any\">below</a>.</span>',\n\t\tenum: [true, false, 'root', 'nested'],\n\t\tdefault: false,\n\t},\n\tinsertNewLineBetweenSelectors: {\n\t\tdeprecated: true,\n\t\tdescription: 'Insert or remove a new-line between selectors.\\nPlease use <a href=\"#option-selector-separator\">selectorSeparator</a> option instead.',\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\thideInDemo: true\n\t},\n\tpreserveNewLinesBetweenPropertyValues: {\n\t\tdescription: 'Preserve the new-lines between property values instead of flattening the lines. This also adds/keeps the colon after the property name according to Stylus syntax.',\n\t\tenum: [true, false],\n\t\tdefault: false,\n\t\texample: {\n\t\t\tvalues: [true, false],\n\t\t\tcode: `\n\t\t\t.class1\n\t\t\t\tbox-shadow:\n\t\t\t\t\t0px 0px 5px black,\n\t\t\t\t\t0px 5px 1px 1px blue,\n\t\t\t\t\t10px 10px 0px red,\n\t\t\t\t\t0px 0px 0px 1px yellow inset\n\t\t\t`\n\t\t}\n\t},\n\tinsertSpaceBeforeComment: {\n\t\tdescription: 'Insert or remove a white-space before a comment.',\n\t\ttype: 'boolean',\n\t\tdefault: true,\n\t\texample: {\n\t\t\tvalues: [true, false],\n\t\t\tcode: `\n\t\t\t.class1\n\t\t\t\tbackground red//comment\n\t\t\t`\n\t\t}\n\t},\n\tinsertSpaceAfterComment: {\n\t\tdescription: 'Insert or remove a white-space after a comment.',\n\t\ttype: 'boolean',\n\t\tdefault: true,\n\t\texample: {\n\t\t\tvalues: [true, false],\n\t\t\tcode: `\n\t\t\t.class1\n\t\t\t\tbackground red//comment\n\t\t\t`\n\t\t}\n\t},\n\tinsertSpaceAfterComma: {\n\t\tdescription: 'Insert or remove a white-space after a comma.',\n\t\ttype: 'boolean',\n\t\tdefault: true,\n\t\texample: {\n\t\t\tvalues: [true, false],\n\t\t\tcode: `\n\t\t\tmixin(a,b)\n\t\t\t\tmargin a b\n\t\t\t`\n\t\t}\n\t},\n\tinsertSpaceInsideParenthesis: {\n\t\tdescription: 'Insert or remove a white-space after an open parenthesis and before a close parenthesis.',\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\texample: {\n\t\t\tvalues: [true, false],\n\t\t\tcode: `\n\t\t\tmixin(a,b)\n\t\t\t\tmargin a b\n\t\t\t`\n\t\t}\n\t},\n\tinsertParenthesisAfterNegation: {\n\t\tdescription: 'Insert a pair of parentheses or a white-space after a negation operator. This does nothing if a pair of parentheses is already after the negation operator.',\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\texample: {\n\t\t\tvalues: [true, false],\n\t\t\tcode: `\n\t\t\t.class1\n\t\t\t\ttop - 10px\n\t\t\t\tleft -(10px)\n\t\t\t`\n\t\t}\n\t},\n\tinsertParenthesisAroundIfCondition: {\n\t\tdescription: 'Insert a pair of parentheses around <code>if</code>-condition but does not remove the existing pair of parentheses.',\n\t\ttype: 'boolean',\n\t\tdefault: true,\n\t\texample: {\n\t\t\tvalues: [true, false],\n\t\t\tcode: `\n\t\t\tif a > b\n\t\t\t\tbackground red\n\t\t\t`\n\t\t}\n\t},\n\tinsertNewLineBeforeElse: {\n\t\tdescription: 'Insert or remove a new-line before <code>else</code> keyword.',\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\texample: {\n\t\t\tvalues: [true, false],\n\t\t\tcode: `\n\t\t\tif (a > b)\n\t\t\t\tbackground red\n\t\t\telse\n\t\t\t\tbackground blue\n\t\t\t`\n\t\t}\n\t},\n\tinsertLeadingZeroBeforeFraction: {\n\t\tdescription: 'Insert or remove a zero before a number that between 1 and 0.',\n\t\ttype: 'boolean',\n\t\tdefault: true,\n\t\texample: {\n\t\t\tvalues: [true, false],\n\t\t\tcode: `\n\t\t\t.class1\n\t\t\t\tmargin 0.5px\n\t\t\t`\n\t\t}\n\t},\n\tselectorSeparator: {\n\t\tdescription: 'Represent a separator between selectors.\\nIf the option <a href=\"#option-insert-new-line-between-selectors\">insertNewLineBetweenSelectors</a> is set to <code>true</code>, then <code>\",\\\\n\"</code> or <code>\"\\\\n\"</code> will be used. Also <code>\\\\r\\\\n</code> may be used in place of <code>\\\\n</code> according to <a href=\"#option-new-line-char\">newLineChar</a> option.',\n\t\tenum: [',', ', ', ',\\n', '\\n'],\n\t\tdefault: ', ',\n\t\texample: {\n\t\t\tvalues: [',', ', ', ',\\n', '\\n'],\n\t\t\tcode: `\n\t\t\t.class1, .class2\n\t\t\t\tbackground red\n\t\t\t`\n\t\t}\n\t},\n\ttabStopChar: {\n\t\tdescription: 'Represent an indentation. You may change this to any sequence of white-spaces.',\n\t\ttype: 'string',\n\t\tdefault: '\\t',\n\t\thideInDemo: true,\n\t\thideInVSCE: true,\n\t},\n\tnewLineChar: {\n\t\tdescription: 'Represent a new-line character. You may want to change this to <code>\"\\\\r\\\\n\"</code> for Microsoft Windows.',\n\t\tenum: ['\\n', '\\r\\n'],\n\t\tdefault: '\\n',\n\t\thideInDemo: true,\n\t\thideInVSCE: true,\n\t},\n\tquoteChar: {\n\t\tdescription: 'Represent a quote character that is used to begin and terminate a string. You must choose either a single-quote or a double-quote.\\n' +\n\t\t\t'This replaces the original quote characters with the given one, unless the string contains the given quote character (see <code>font-family</code> in <code>.class2</code>.) However, if the string starts with <code>data:image/svg+xml;utf8,</code>, the given quote character will be used, and the quote characters in the string will be escaped (see <code>background-image</code> in <code>.class2</code>.)',\n\t\tenum: ['\\'', '\"'],\n\t\tdefault: '\\'',\n\t\texample: {\n\t\t\tvalues: ['\\'', '\"'],\n\t\t\tcode: `\n\t\t\t.class1\n\t\t\t\tfont-family 'Open Sans'\n\t\t\t.class2\n\t\t\t\tfont-family \"Manta's Nite\"\n\t\t\t\tbackground-image url('data:image/svg+xml;utf8,<svg fill=\"red\"></svg>')\n\t\t\t`\n\t\t}\n\t},\n\tsortProperties: {\n\t\tdescription: 'Can be either <code>false</code> for not sorting, <code>\"alphabetical\"</code> for sorting CSS properties from A to Z, <code>\"grouped\"</code> for sorting CSS properties according to <a href=\"https://github.com/SimenB/stylint/blob/master/src/data/ordering.json\" target=\"_blank\">Stylint</a> and <a href=\"https://github.com/tj/nib/blob/master/docs/README.md\" target=\"_blank\">nib</a><span class=\"no-vsce\"> -- <a href=\"#option-sort-properties-grouped\" onclick=\"$(\\'#option-sort-properties-grouped\\').toggle()\">click here to show the full list of sorted properties</a></span>, or an array of property names that defines the property order, for example <code>[\"color\", \"background\", \"display\"]</code>.\\n' +\n\t\t\t'<table id=\"option-sort-properties-grouped\" class=\"no-vsce\" style=\"display: none;\"><tr><th>Sorted properties for \"grouped\"</th></tr>' + sortedProperties.map(prop => `<tr><td>${prop}</td></tr>`).join('') + '</table>',\n\t\toneOf: [\n\t\t\t{\n\t\t\t\tenum: [\n\t\t\t\t\tfalse,\n\t\t\t\t\t'alphabetical',\n\t\t\t\t\t'grouped',\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'array',\n\t\t\t\titems: { type: 'string' },\n\t\t\t\tuniqueItems: true\n\t\t\t}\n\t\t],\n\t\tdefault: false,\n\t\texample: {\n\t\t\tvalues: [false, 'alphabetical', 'grouped', ['color', 'background', 'display']],\n\t\t\tcode: `\n\t\t\t.class1\n\t\t\t\tbackground red\n\t\t\t\tdisplay block\n\t\t\t\tcolor white\n\t\t\t`\n\t\t}\n\t},\n\talwaysUseImport: {\n\t\tdescription: 'Replace <code>@require</code> with <code>@import</code>, or do nothing.',\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\texample: {\n\t\t\tvalues: [true, false],\n\t\t\tcode: `\n\t\t\t@require './file.styl'\n\t\t\t`\n\t\t}\n\t},\n\talwaysUseNot: {\n\t\tdescription: 'Replace <code>!</code> operator with <code>not</code> keyword, or vice versa.',\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\texample: {\n\t\t\tvalues: [true, false],\n\t\t\tcode: `\n\t\t\t.class1\n\t\t\t\tif (!condition)\n\t\t\t\t\tbackground red\n\t\t\t`\n\t\t}\n\t},\n\talwaysUseAtBlock: {\n\t\tdescription: 'Replace an increased-indent at-block construction with an explicit one with <code>@block</code> keyword or vice versa.\\nNote that this option does not incorporate <a class=\"nada\" href=\"#option-insert-braces\"><mark>insertBraces</mark></a> option.',\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\texample: {\n\t\t\tvalues: [true, false],\n\t\t\tcode: `\n\t\t\tblock =\n\t\t\t\tbackground red\n\t\t\t`\n\t\t}\n\t},\n\talwaysUseExtends: {\n\t\tdescription: 'Convert <code>@extend</code> keyword to <code>@extends</code> keyword, or vice versa.',\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\texample: {\n\t\t\tvalues: [true, false],\n\t\t\tcode: `\n\t\t\t.class1\n\t\t\t\tbackground red\n\t\t\t.class2\n\t\t\t\t@extend .class1\n\t\t\t\tcolor white\n\t\t\t`\n\t\t}\n\t},\n\talwaysUseNoneOverZero: {\n\t\tdescription: 'Replace <code>0</code> (regardless of its unit) with <code>none</code> for <code>border</code> and <code>outline</code> properties, or do nothing.',\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\texample: {\n\t\t\tvalues: [true, false],\n\t\t\tcode: `\n\t\t\t.class1\n\t\t\t\tborder 0px\n\t\t\t`\n\t\t}\n\t},\n\talwaysUseZeroWithoutUnit: {\n\t\tdescription: 'Replace <code>0</code> (regardless of its unit) with <code>0</code> (without units), or do nothing.\\nThere is an exception for <code>flex-basis</code>, which <code>0</code> will always have the unit of <code>%</code>, because of <a href=\"https://github.com/philipwalton/flexbugs#flexbug-4\" target=\"_blank\">the problem with Internet Explorer</a>.',\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\texample: {\n\t\t\tvalues: [true, false],\n\t\t\tcode: `\n\t\t\t.class1\n\t\t\t\tmargin 0px\n\t\t\t\tflex-basis 0px\n\t\t\t`\n\t\t}\n\t},\n\treduceMarginAndPaddingValues: {\n\t\tdescription: 'Reduce <code>margin</code> and <code>padding</code> duplicate values by converting <code>margin x x x x</code> to <code>margin x</code>, <code>margin x y x y</code> to <code>margin x y</code>, and <code>margin x y y y</code> to <code>margin x y y</code> where <code>x</code>, <code>y</code> is a unique property value.',\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\texample: {\n\t\t\tvalues: [true, false],\n\t\t\tcode: `\n\t\t\t.class1\n\t\t\t\tmargin 0px 0px\n\t\t\t\tpadding 0px 5px 0px 5px\n\t\t\t`\n\t\t}\n\t},\n\tignoreFiles: {\n\t\tdescription: 'Do not format the files that match the given <a href=\"https://www.npmjs.com/package/glob#glob-primer\" target=\"_blank\">Glob</a> patterns.\\nFor example, <code>ignoreFiles: [\"bin/**\", \"src/vendors/**\"]</code>',\n\t\ttype: 'array',\n\t\titems: { type: 'string' },\n\t\tdefault: [],\n\t\thideInDemo: true\n\t}\n}", "const isObject = require('lodash/isObject')\nconst isInteger = require('lodash/isInteger')\nconst uniq = require('lodash/uniq')\n\nconst schema = require('./schema')\n\nfunction createFormattingOptions(options = {}) {\n\tconst hash = {}\n\tfor (const name in schema) {\n\t\ttry {\n\t\t\t// Support \"stylusSupremacy.\" prefix for Visual Studio Code setting compatibility since v2.4\n\t\t\tconst normalProjection = options[name]\n\t\t\tconst prefixProjection = options['stylusSupremacy.' + name]\n\t\t\tconst data = prefixProjection !== undefined ? prefixProjection : normalProjection\n\n\t\t\tif (data === undefined) {\n\t\t\t\thash[name] = schema[name].default\n\n\t\t\t} else if (verify(data, schema[name])) {\n\t\t\t\thash[name] = data\n\t\t\t}\n\t\t} catch (ex) {\n\t\t\tthrow new Error(ex.message + ` at \"${name}\".`)\n\t\t}\n\t}\n\treturn hash\n}\n\nfunction verify(data, info) {\n\tif (Array.isArray(info.enum)) {\n\t\treturn info.enum.some(item => {\n\t\t\tif (isObject(item)) {\n\t\t\t\treturn verify(data, item)\n\t\t\t} else {\n\t\t\t\treturn data === item\n\t\t\t}\n\t\t})\n\n\t} else if (info.oneOf !== undefined) {\n\t\tconst matchAnyValue = info.oneOf.some(item => {\n\t\t\tif (isObject(item)) {\n\t\t\t\ttry {\n\t\t\t\t\treturn verify(data, item)\n\t\t\t\t} catch (ex) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn item === data\n\t\t\t}\n\t\t})\n\t\tif (matchAnyValue === false) {\n\t\t\tthrow new Error(`Expected ${data} to be one of the defined values`)\n\t\t}\n\n\t} else if (info.type === 'integer') {\n\t\tif (isInteger(data) === false) {\n\t\t\tthrow new Error(`Expected ${data} to be an integer`)\n\t\t} else if (info.minimum !== undefined && data < info.minimum) {\n\t\t\tthrow new Error(`Expected ${data} to be greater or equal than ${info.minimum}`)\n\t\t} else if (info.maximum !== undefined && data > info.maximum) {\n\t\t\tthrow new Error(`Expected ${data} to be less or equal than ${info.maximum}`)\n\t\t}\n\n\t} else if (info.type === 'array') {\n\t\tif (Array.isArray(data) === false) {\n\t\t\tthrow new Error(`Expected ${data} to be an array`)\n\t\t} else if (info.items !== undefined && data.some(item => verify(item, info.items) === false)) {\n\t\t\tthrow new Error(`Expected ${data} to have items of ${JSON.stringify(info.items)}`)\n\t\t} else if (info.uniqueItems === true && data.length !== uniq(data).length) {\n\t\t\tthrow new Error(`Expected ${data} to have unique items`)\n\t\t}\n\n\t} else if (info.type === 'null') {\n\t\tif (data !== null) {\n\t\t\tthrow new Error(`Expected ${data} to be null`)\n\t\t}\n\n\t} else if (info.type !== typeof data) { // 'boolean', 'string', 'number', 'object'\n\t\tthrow new Error(`Expected ${data} to be ${info.type}`)\n\t}\n\n\treturn true\n}\n\nmodule.exports = createFormattingOptions", "function createStringBuffer() {\n\treturn {\n\t\tbuffer: [],\n\n\t\tappend(text) {\n\t\t\tif (arguments.length > 1) {\n\t\t\t\tthrow new Error('Found too many arguments of', Array.prototype.slice.call(arguments))\n\n\t\t\t} else if (typeof text === 'object' && text !== null) {\n\t\t\t\tthrow new Error('Found a non-string argument of', text)\n\n\t\t\t} else if (text !== '') {\n\t\t\t\tthis.buffer.push(text)\n\t\t\t}\n\n\t\t\treturn this\n\t\t},\n\n\t\tremove(text) {\n\t\t\tif (text === undefined) {\n\t\t\t\tthis.buffer.pop()\n\n\t\t\t} else if (this.buffer.length > 0) {\n\t\t\t\tconst last = this.buffer[this.buffer.length - 1]\n\t\t\t\tif (last === text) {\n\t\t\t\t\tthis.buffer.pop()\n\n\t\t\t\t} else if (last.endsWith(text)) {\n\t\t\t\t\tthis.buffer[this.buffer.length - 1] = last.substring(0, last.length - text.length)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this\n\t\t},\n\n\t\ttoString() {\n\t\t\treturn this.buffer.join('')\n\t\t}\n\t}\n}\n\nmodule.exports = createStringBuffer", "const isObject = require('lodash/isObject')\n\nfunction findChildNodes(inputNode, condition, results = [] /* Internal */, visited = [] /* Internal */) {\n\tif (inputNode && visited.includes(inputNode) === false) {\n\t\t// Remember the visited nodes to prevent stack overflow\n\t\tvisited.push(inputNode)\n\n\t\tif (condition(inputNode)) {\n\t\t\tresults.push(inputNode)\n\t\t}\n\n\t\tObject.getOwnPropertyNames(inputNode).forEach(name => {\n\t\t\tconst prop = inputNode[name]\n\t\t\tif (Array.isArray(prop)) {\n\t\t\t\tprop.forEach(node => {\n\t\t\t\t\tfindChildNodes(node, condition, results, visited)\n\t\t\t\t})\n\t\t\t} else if (isObject(prop)) {\n\t\t\t\tfindChildNodes(prop, condition, results, visited)\n\t\t\t}\n\t\t})\n\t}\n\treturn results\n}\n\nmodule.exports = findChildNodes", "const StylusParser = require('stylus/lib/parser')\nconst StylusNode = require('stylus/lib/nodes')\nconst get = require('lodash/get')\nconst first = require('lodash/first')\nconst last = require('lodash/last')\nconst findLast = require('lodash/findLast')\nconst compact = require('lodash/compact')\nconst difference = require('lodash/difference')\nconst sortBy = require('lodash/sortBy')\nconst uniq = require('lodash/uniq')\nconst partition = require('lodash/partition')\nconst takeRightWhile = require('lodash/takeRightWhile')\nconst min = require('lodash/min')\nconst maxBy = require('lodash/maxBy')\nconst escapeRegExp = require('lodash/escapeRegExp')\nconst trimStart = require('lodash/trimStart')\nconst trimEnd = require('lodash/trimEnd')\nconst isObject = require('lodash/isObject')\nconst isPlainObject = require('lodash/isPlainObject')\nconst isString = require('lodash/isString')\nconst isInteger = require('lodash/isInteger')\nconst isBoolean = require('lodash/isBoolean')\n\nconst schema = require('./schema')\nconst createFormattingOptions = require('./createFormattingOptions')\nconst createStringBuffer = require('./createStringBuffer')\nconst sortedProperties = require('./createSortedProperties')()\nconst findChildNodes = require('./findChildNodes')\n\nfunction format(content, options = {}) {\n\t// Stop processing if the input content is empty\n\tif (content.trim().length === 0) {\n\t\treturn ''\n\t}\n\n\t// Consolidate the formatting options\n\toptions = Object.assign({ wrapMode: !!options.wrapMode }, createFormattingOptions(options))\n\n\t// Prepare the artifacts\n\tconst comma = options.insertSpaceAfterComma ? ', ' : ','\n\tconst openParen = options.insertSpaceInsideParenthesis ? '( ' : '('\n\tconst closeParen = options.insertSpaceInsideParenthesis ? ' )' : ')'\n\n\t// Store the input content line-by-line\n\tconst originalLines = content.split(/\\r?\\n/)\n\n\tlet modifiedContent = content\n\tlet originalTabStopChar = null // For example, \"\\t\", \"\\s\\s\" and so on\n\tlet originalBaseIndent = null // This could be zero or many occurrences of `originalTabStopChar`\n\tif (options.wrapMode) {\n\t\t// Wrap the input content in `wrap{...}` so that it has a root node\n\t\t// This is designed for https://github.com/ThisIsManta/vscode-stylus-supremacy\n\t\tif (originalLines.length === 1) {\n\t\t\tmodifiedContent = 'wrap\\n\\t' + content.trim()\n\t\t\toriginalBaseIndent = get(content.match(/^(\\s|\\t)*/g), '0', null)\n\n\t\t} else {\n\t\t\t// Determine an original tab stop character\n\t\t\tconst twoShortestIndent = sortBy(\n\t\t\t\tuniq(\n\t\t\t\t\toriginalLines\n\t\t\t\t\t\t.filter(line => line.trim().length > 0)\n\t\t\t\t\t\t.map(line => get(line.match(/^(\\s|\\t)*/g), '0', ''))\n\t\t\t\t),\n\t\t\t\ttext => text.length\n\t\t\t).slice(0, 2)\n\t\t\tif (twoShortestIndent.length === 2) {\n\t\t\t\toriginalTabStopChar = twoShortestIndent[1].substring(twoShortestIndent[0].length)\n\t\t\t}\n\t\t\toriginalBaseIndent = twoShortestIndent[0]\n\n\t\t\t// Normalize the original indentation\n\t\t\tmodifiedContent = 'wrap\\n' + originalLines.map(line => {\n\t\t\t\tif (line.trim().length > 0) {\n\t\t\t\t\treturn (originalTabStopChar || '\\t') + line.substring(twoShortestIndent[0].length)\n\t\t\t\t} else {\n\t\t\t\t\treturn ''\n\t\t\t\t}\n\t\t\t}).join('\\n')\n\t\t}\n\t}\n\n\t// Used to determine some information that `rootNode` does not offer\n\t// For example, a single-line comment\n\tconst modifiedLines = modifiedContent.split(/\\r?\\n/)\n\n\t// Store the Stylus parsed tree\n\tconst rootNode = new StylusParser(modifiedContent, { cache: false }).parse()\n\n\t// Return the original content if it only has comments\n\tif (rootNode.nodes.every(node => node instanceof StylusNode.Comment)) {\n\t\treturn content\n\t}\n\n\tfunction travel(parentNode, inputNode, indentLevel, insideExpression = false, data = {}) {\n\t\t// Check argument type\n\t\tif (!(isObject(parentNode) || parentNode === null && inputNode instanceof StylusNode.Root)) {\n\t\t\tthrow new Error(`Found a parent node of ${JSON.stringify(parentNode)}`)\n\t\t} else if (!(isObject(inputNode))) {\n\t\t\tthrow new Error(`Found an input node of ${JSON.stringify(inputNode)}` + (parentNode ? `, which had a parent node of ${JSON.stringify(parentNode)}` : ''))\n\t\t} else if (!(isInteger(indentLevel) && indentLevel >= 0)) {\n\t\t\tthrow new Error(`Found an indent level of ${JSON.stringify(indentLevel)}`)\n\t\t} else if (!(isBoolean(insideExpression))) {\n\t\t\tthrow new Error(`Found an expression flag of ${JSON.stringify(insideExpression)}`)\n\t\t} else if (!(isPlainObject(data))) {\n\t\t\tthrow new Error(`Found an additional data object of ${JSON.stringify(data)}`)\n\t\t}\n\n\t\t// Inject a parent node to the current working node\n\t\tinputNode.parent = parentNode\n\n\t\t// Prepare the indentation from the current indent level\n\t\tconst indent = options.tabStopChar.repeat(indentLevel)\n\n\t\t// Store an output string for the current node\n\t\tconst outputBuffer = createStringBuffer()\n\n\t\t// Insert sticky comment(s) before the current node\n\t\tif (inputNode.commentsOnTop) {\n\t\t\toutputBuffer.append(inputNode.commentsOnTop.map(node => travel(inputNode.parent, node, indentLevel)).join(''))\n\t\t}\n\n\t\tif (inputNode instanceof StylusNode.Import) {\n\t\t\toutputBuffer.append(indent)\n\t\t\toutputBuffer.append('@')\n\t\t\toutputBuffer.append(options.alwaysUseImport || inputNode.once === false ? 'import' : 'require')\n\t\t\toutputBuffer.append(' ')\n\t\t\toutputBuffer.append(travel(inputNode, inputNode.path, indentLevel, true))\n\n\t\t\tif (insideExpression === false) {\n\t\t\t\tif (options.insertSemicolons) {\n\t\t\t\t\toutputBuffer.append(';')\n\t\t\t\t}\n\t\t\t\toutputBuffer.append(options.newLineChar)\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.Group) {\n\t\t\t// Insert single-line comment(s)\n\t\t\tconst topCommentNodes = tryGetSingleLineCommentNodesOnTheTopOf(first(inputNode.nodes))\n\t\t\tif (topCommentNodes.length > 0) {\n\t\t\t\toutputBuffer.append(topCommentNodes.map(node => travel(inputNode.parent, node, indentLevel)).join(''))\n\t\t\t}\n\n\t\t\t// Insert CSS selector(s)\n\t\t\tlet separator = options.selectorSeparator\n\t\t\tif (options.insertNewLineBetweenSelectors && separator.includes('\\n') === false) {\n\t\t\t\tseparator = separator.trim() + '\\n'\n\t\t\t}\n\t\t\tseparator = separator.replace(/\\r?\\n/, options.newLineChar + indent)\n\n\t\t\toutputBuffer.append(indent + inputNode.nodes.map(node => travel(inputNode, node, indentLevel, true)).join(separator).trim())\n\n\t\t\toutputBuffer.append(travel(inputNode, inputNode.block, indentLevel, false, { potentialCommentNodeInsideTheBlock: last(inputNode.nodes) }))\n\n\t\t} else if (inputNode instanceof StylusNode.Root || inputNode instanceof StylusNode.Block) {\n\t\t\tconst childIndentLevel = inputNode instanceof StylusNode.Root ? 0 : (indentLevel + 1)\n\n\t\t\tif (inputNode instanceof StylusNode.Block && (parentNode instanceof StylusNode.Atblock ? options.alwaysUseAtBlock : options.insertBraces)) {\n\t\t\t\toutputBuffer.append(' {')\n\t\t\t}\n\n\t\t\t// Filter consecutive multi-line comment(s)\n\t\t\tconst groupOfCommentNodes = [[]]\n\t\t\tinputNode.nodes.forEach(node => {\n\t\t\t\tconst lastGroup = last(groupOfCommentNodes)\n\t\t\t\tif (node instanceof StylusNode.Comment) {\n\t\t\t\t\tlastGroup.push(node)\n\n\t\t\t\t} else if (lastGroup.length > 0) {\n\t\t\t\t\tgroupOfCommentNodes.push([])\n\t\t\t\t}\n\t\t\t})\n\t\t\tif (last(groupOfCommentNodes).length === 0) {\n\t\t\t\tgroupOfCommentNodes.pop()\n\t\t\t}\n\n\t\t\tconst unsortedNonCommentNodes = difference(\n\t\t\t\tinputNode.nodes,\n\t\t\t\tgroupOfCommentNodes.flat()\n\t\t\t)\n\n\t\t\t// Insert a comment on the right of the last selector\n\t\t\tconst sideCommentNode = tryGetMultiLineCommentNodeOnTheRightOf(data.potentialCommentNodeInsideTheBlock) || tryGetSingleLineCommentNodeOnTheRightOf(data.potentialCommentNodeInsideTheBlock)\n\t\t\tif (sideCommentNode) {\n\t\t\t\tif (options.insertSpaceBeforeComment) {\n\t\t\t\t\toutputBuffer.append(' ')\n\t\t\t\t}\n\t\t\t\toutputBuffer.append(travel(inputNode.parent, sideCommentNode, indentLevel, true))\n\n\t\t\t\t// Remove the first multi-line comment because it has been processed above\n\t\t\t\tconst blockCommentNode = inputNode.nodes[0]\n\t\t\t\tif (\n\t\t\t\t\tblockCommentNode instanceof StylusNode.Comment &&\n\t\t\t\t\tblockCommentNode.lineno === inputNode.lineno &&\n\t\t\t\t\tblockCommentNode.str === sideCommentNode.str &&\n\t\t\t\t\tblockCommentNode === groupOfCommentNodes[0][0]\n\t\t\t\t) {\n\t\t\t\t\tgroupOfCommentNodes[0].shift()\n\t\t\t\t}\n\t\t\t}\n\n\t\t\toutputBuffer.append(options.newLineChar)\n\n\t\t\t// Insert single-comments for an empty block\n\t\t\tif (inputNode.nodes.length === 0) {\n\t\t\t\tconst commentNodes = tryGetSingleLineCommentNodesOnTheBottomOf(inputNode)\n\t\t\t\toutputBuffer.append(commentNodes.map(node => travel(inputNode, node, childIndentLevel)).join(''))\n\t\t\t}\n\n\t\t\tconst groupOfUnsortedNonCommentNodes = []\n\t\t\tunsortedNonCommentNodes.forEach((node, rank, list) => {\n\t\t\t\tif (rank === 0 || getType(node) !== getType(list[rank - 1]) || getType(node) === 'Block') {\n\t\t\t\t\tgroupOfUnsortedNonCommentNodes.push([node])\n\t\t\t\t} else {\n\t\t\t\t\tlast(groupOfUnsortedNonCommentNodes).push(node)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tconst groupOfSortedNonCommentNodes = groupOfUnsortedNonCommentNodes.map(nodes => {\n\t\t\t\tif (nodes[0] instanceof StylusNode.Property) {\n\t\t\t\t\t// Sort CSS properties\n\t\t\t\t\tif (options.sortProperties === 'alphabetical') {\n\t\t\t\t\t\treturn sortBy(nodes, node => {\n\t\t\t\t\t\t\tconst propertyName = node.segments.map(segment => segment.name).join('')\n\t\t\t\t\t\t\tif (propertyName.startsWith('-')) {\n\t\t\t\t\t\t\t\treturn '~' + propertyName.substring(1)\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treturn propertyName\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\n\t\t\t\t\t} else if (options.sortProperties === 'grouped') {\n\t\t\t\t\t\treturn sortBy(nodes, node => {\n\t\t\t\t\t\t\tconst propertyName = node.segments.map(segment => segment.name).join('')\n\t\t\t\t\t\t\tconst propertyRank = sortedProperties.indexOf(propertyName)\n\t\t\t\t\t\t\tif (propertyRank >= 0) {\n\t\t\t\t\t\t\t\treturn propertyRank\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treturn Infinity\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\n\t\t\t\t\t} else if (Array.isArray(options.sortProperties) && options.sortProperties.length > 0) {\n\t\t\t\t\t\treturn sortBy(nodes, node => {\n\t\t\t\t\t\t\tconst propertyName = node.segments.map(segment => segment.name).join('')\n\t\t\t\t\t\t\tconst propertyRank = options.sortProperties.indexOf(propertyName)\n\t\t\t\t\t\t\tif (propertyRank >= 0) {\n\t\t\t\t\t\t\t\treturn propertyRank\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treturn Infinity\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn nodes\n\t\t\t})\n\n\t\t\t// Note that do not mutate this\n\t\t\tconst sortedNonCommentNodes = groupOfSortedNonCommentNodes.flat()\n\n\t\t\t// Put single-line comment(s) to the relevant node\n\t\t\tsortedNonCommentNodes.forEach(node => {\n\t\t\t\tnode.commentsOnTop = tryGetSingleLineCommentNodesOnTheTopOf(node)\n\n\t\t\t\tconst rightCommentNode = tryGetSingleLineCommentNodeOnTheRightOf(node)\n\t\t\t\tif (rightCommentNode) {\n\t\t\t\t\tif (node.commentsOnRight === undefined) {\n\t\t\t\t\t\tnode.commentsOnRight = []\n\t\t\t\t\t}\n\t\t\t\t\tnode.commentsOnRight.push(rightCommentNode)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tgroupOfCommentNodes.forEach(commentNodes => {\n\t\t\t\tconst [rightCommentNodes, lineCommentNodes] = partition(commentNodes, commentNode => sortedNonCommentNodes.some(node => node.lineno === commentNode.lineno && node.column < commentNode.column))\n\n\t\t\t\t// Put the column-consecutive comment(s) on the right of the inner node\n\t\t\t\trightCommentNodes.forEach(commentNode => {\n\t\t\t\t\tconst leftNode = findLast(sortedNonCommentNodes, node => node.lineno === commentNode.lineno && node.column < commentNode.column)\n\t\t\t\t\tif (leftNode.commentsOnRight === undefined) {\n\t\t\t\t\t\tleftNode.commentsOnRight = []\n\t\t\t\t\t}\n\t\t\t\t\tleftNode.commentsOnRight.push(commentNode)\n\t\t\t\t})\n\n\t\t\t\tconst index = inputNode.nodes.indexOf(last(lineCommentNodes))\n\t\t\t\tif (index === inputNode.nodes.length - 1) {\n\t\t\t\t\t// Put the line-consecutive comment(s) at the bottom-most of the block\n\t\t\t\t\tgroupOfSortedNonCommentNodes.push(lineCommentNodes)\n\n\t\t\t\t} else {\n\t\t\t\t\t// Put the line-consecutive comment(s) on the top of the inner node\n\t\t\t\t\tconst belowNode = inputNode.nodes[index + 1]\n\t\t\t\t\tif (sortedNonCommentNodes.includes(belowNode)) {\n\t\t\t\t\t\tif (belowNode.commentsOnTop === undefined) {\n\t\t\t\t\t\t\tbelowNode.commentsOnTop = []\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbelowNode.commentsOnTop.push(...lineCommentNodes)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tconst checkIf = (value) => {\n\t\t\t\tif (value === true) {\n\t\t\t\t\treturn true\n\n\t\t\t\t} else if (options.wrapMode) {\n\t\t\t\t\treturn originalBaseIndent && originalBaseIndent.length > 0 ? value === 'nested' : value === 'root'\n\n\t\t\t\t} else {\n\t\t\t\t\treturn inputNode instanceof StylusNode.Root ? value === 'root' : value === 'nested'\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Insert CSS body and new-lines between them\n\t\t\toutputBuffer.append(groupOfSortedNonCommentNodes\n\t\t\t\t.flatMap((nodes) => {\n\t\t\t\t\tconst nodeType = getType(nodes[0])\n\n\t\t\t\t\tlet newLineOrEmpty = ''\n\t\t\t\t\tif (\n\t\t\t\t\t\tnodeType === 'Block' && checkIf(options.insertNewLineAroundBlocks) ||\n\t\t\t\t\t\tnodeType === 'Property' && checkIf(options.insertNewLineAroundProperties) ||\n\t\t\t\t\t\tnodeType === 'Import' && checkIf(options.insertNewLineAroundImports) ||\n\t\t\t\t\t\tnodeType === 'Other' && checkIf(options.insertNewLineAroundOthers)\n\t\t\t\t\t) {\n\t\t\t\t\t\tnewLineOrEmpty = options.newLineChar\n\t\t\t\t\t}\n\n\t\t\t\t\treturn compact([\n\t\t\t\t\t\tnewLineOrEmpty,\n\t\t\t\t\t\tnodes.map(node => travel(inputNode, node, childIndentLevel)).join(''),\n\t\t\t\t\t\tnewLineOrEmpty,\n\t\t\t\t\t])\n\t\t\t\t})\n\t\t\t\t.filter((text, rank, list) => text !== options.newLineChar || !(\n\t\t\t\t\trank === 0 ||\n\t\t\t\t\trank > 1 && list[rank - 1] === options.newLineChar ||\n\t\t\t\t\trank === list.length - 1\n\t\t\t\t))\n\t\t\t\t.join('')\n\t\t\t)\n\n\t\t\t// Insert the bottom comment(s)\n\t\t\tconst bottomCommentNodes = tryGetSingleLineCommentNodesOnTheBottomOf(last(unsortedNonCommentNodes))\n\t\t\tif (bottomCommentNodes) {\n\t\t\t\toutputBuffer.append(bottomCommentNodes.map(node => travel(inputNode.parent, node, childIndentLevel)).join(''))\n\t\t\t}\n\n\t\t\tif (inputNode instanceof StylusNode.Block && (parentNode instanceof StylusNode.Atblock ? options.alwaysUseAtBlock : options.insertBraces)) {\n\t\t\t\toutputBuffer.append(indent + '}')\n\t\t\t\toutputBuffer.append(options.newLineChar)\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.Selector) {\n\t\t\toutputBuffer.append(travelThroughSegments(inputNode, indentLevel).join('').trim())\n\n\t\t\tif (inputNode.optional === true) {\n\t\t\t\toutputBuffer.append(' !optional')\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.Property) {\n\t\t\tif (insideExpression === false) {\n\t\t\t\toutputBuffer.append(indent)\n\t\t\t}\n\n\t\t\t// Insert the property name\n\t\t\tconst propertyName = travelThroughSegments(inputNode, indentLevel).join('')\n\t\t\toutputBuffer.append(propertyName)\n\n\t\t\t// Insert the property value(s)\n\t\t\tif (inputNode.expr instanceof StylusNode.Expression) {\n\t\t\t\t// Extract the last portion of comments\n\t\t\t\t// For example,\n\t\t\t\t// margin: 8px 0; /* right-comment */\n\t\t\t\tconst commentsOnTheRight = takeRightWhile(inputNode.expr.nodes, node => node instanceof StylusNode.Comment)\n\t\t\t\tconst nodesExcludingCommentsOnTheRight = inputNode.expr.nodes.slice(0, inputNode.expr.nodes.length - commentsOnTheRight.length)\n\n\t\t\t\tlet propertyValues = nodesExcludingCommentsOnTheRight.map(node => travel(inputNode, node, indentLevel, true))\n\n\t\t\t\t// Reduce the redundant margin/padding values\n\t\t\t\t// For example,\n\t\t\t\t// margin: 0 0 0 0; => margin: 0;\n\t\t\t\t// margin: 5px 0 5px 0; => margin: 5px 0;\n\t\t\t\tif (options.reduceMarginAndPaddingValues && (propertyName === 'margin' || propertyName === 'padding') && nodesExcludingCommentsOnTheRight.some(node => node instanceof StylusNode.Comment) === false) {\n\t\t\t\t\tif (propertyValues.length > 1 && propertyValues.every(text => text === propertyValues[0])) {\n\t\t\t\t\t\tpropertyValues = [propertyValues[0]]\n\n\t\t\t\t\t} else if (propertyValues.length >= 3 && propertyValues[0] === propertyValues[2] && (propertyValues[1] === propertyValues[3] || propertyValues[3] === undefined)) {\n\t\t\t\t\t\tpropertyValues = [propertyValues[0], propertyValues[1]]\n\n\t\t\t\t\t} else if (propertyValues.length === 4 && propertyValues[0] !== propertyValues[2] && propertyValues[1] === propertyValues[3]) {\n\t\t\t\t\t\tpropertyValues = [propertyValues[0], propertyValues[1], propertyValues[2]]\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (propertyName === 'border' || propertyName === 'outline') {\n\t\t\t\t\tif (options.alwaysUseNoneOverZero && propertyValues.length === 1 && /^0(\\.0*)?(\\w+|\\%)?/.test(propertyValues[0])) {\n\t\t\t\t\t\tpropertyValues = ['none']\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// See https://github.com/ThisIsManta/stylus-supremacy/issues/79\n\t\t\t\tconst preserveColons = nodesExcludingCommentsOnTheRight.length === 1 && nodesExcludingCommentsOnTheRight[0] instanceof StylusNode.Expression\n\n\t\t\t\t// Insert the property value(s) without the last portion of comments\n\t\t\t\tif (nodesExcludingCommentsOnTheRight.every(node => node instanceof StylusNode.Expression)) {\n\t\t\t\t\tconst numberOfLineTaken = uniq(nodesExcludingCommentsOnTheRight.map(({ lineno }) => lineno)\n\t\t\t\t\t).length\n\t\t\t\t\tif (numberOfLineTaken > 1 && options.preserveNewLinesBetweenPropertyValues) {\n\t\t\t\t\t\toutputBuffer.append(':' + options.newLineChar)\n\t\t\t\t\t\tconst innerIndent = indent + options.tabStopChar\n\t\t\t\t\t\toutputBuffer.append(innerIndent)\n\t\t\t\t\t\toutputBuffer.append(propertyValues.join((inputNode.expr.isList ? ',' : '') + options.newLineChar + innerIndent))\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (options.insertColons || preserveColons) {\n\t\t\t\t\t\t\toutputBuffer.append(':')\n\t\t\t\t\t\t}\n\t\t\t\t\t\toutputBuffer.append(' ')\n\t\t\t\t\t\toutputBuffer.append(propertyValues.join(inputNode.expr.isList ? comma : ' '))\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\tif (options.insertColons || preserveColons) {\n\t\t\t\t\t\toutputBuffer.append(':')\n\t\t\t\t\t}\n\t\t\t\t\toutputBuffer.append(' ')\n\t\t\t\t\toutputBuffer.append(propertyValues.join(' '))\n\t\t\t\t}\n\n\t\t\t\t// Put the last portion of comments aside\n\t\t\t\tif (commentsOnTheRight.length > 0) {\n\t\t\t\t\tif (inputNode.commentsOnRight === undefined) {\n\t\t\t\t\t\tinputNode.commentsOnRight = []\n\t\t\t\t\t}\n\t\t\t\t\tinputNode.commentsOnRight = inputNode.commentsOnRight.concat(commentsOnTheRight)\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tconst error = new Error('Found unknown object')\n\t\t\t\terror.data = inputNode\n\t\t\t\tthrow error\n\t\t\t}\n\n\t\t\tif (insideExpression === false) {\n\t\t\t\tif (options.insertSemicolons) {\n\t\t\t\t\toutputBuffer.append(';')\n\t\t\t\t}\n\t\t\t\toutputBuffer.append(options.newLineChar)\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.Literal) {\n\t\t\tif (inputNode.parent instanceof StylusNode.Property && inputNode.parent.expr.nodes.length === 1 && inputNode.parent.expr.nodes[0] === inputNode) { // In case of @css property\n\t\t\t\t// Note that it must be wrapped inside a pair of braces\n\t\t\t\toutputBuffer.append('@css {')\n\t\t\t\tif (inputNode.val.trim().length > 0) {\n\t\t\t\t\toutputBuffer.append(' ' + inputNode.val.trim() + ' ')\n\t\t\t\t}\n\t\t\t\toutputBuffer.append('}')\n\n\t\t\t} else if (inputNode.parent instanceof StylusNode.Root || inputNode.parent instanceof StylusNode.Block) { // In case of @css block\n\t\t\t\t// Note that it must be wrapped inside a pair of braces\n\t\t\t\toutputBuffer.append('@css {' + options.newLineChar)\n\n\t\t\t\tlet innerLines = inputNode.val.split(/\\r?\\n/)\n\n\t\t\t\t// Adjust the original indentation\n\t\t\t\tif (innerLines.length === 1) {\n\t\t\t\t\tinnerLines[0] = indent + innerLines[0].trim()\n\n\t\t\t\t} else if (innerLines.length >= 2) {\n\t\t\t\t\tconst firstNonEmptyLineIndex = innerLines.findIndex(line => line.trim().length > 0)\n\t\t\t\t\tif (firstNonEmptyLineIndex >= 0) {\n\t\t\t\t\t\tinnerLines = innerLines.slice(firstNonEmptyLineIndex)\n\t\t\t\t\t\tconst firstLineIndent = innerLines[0].match(/^(\\s|\\t)+/)\n\t\t\t\t\t\tif (firstLineIndent) {\n\t\t\t\t\t\t\tconst indentPattern = new RegExp(firstLineIndent[0], 'g')\n\t\t\t\t\t\t\tinnerLines = innerLines.map(line => {\n\t\t\t\t\t\t\t\tconst text = trimStart(line)\n\t\t\t\t\t\t\t\tconst innerIndent = line.substring(0, line.length - text.length)\n\t\t\t\t\t\t\t\treturn innerIndent.replace(indentPattern, options.tabStopChar) + text\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (last(innerLines).trim().length === 0) {\n\t\t\t\t\t\tinnerLines = innerLines.slice(0, innerLines.length - 1)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\toutputBuffer.append(innerLines.join(options.newLineChar))\n\n\t\t\t\toutputBuffer.append(options.newLineChar)\n\t\t\t\toutputBuffer.append('}' + options.newLineChar)\n\n\t\t\t} else {\n\t\t\t\tif (get(modifiedLines, (inputNode.lineno - 1) + '.' + (inputNode.column - 1)) === '\\\\') {\n\t\t\t\t\toutputBuffer.append('\\\\')\n\t\t\t\t}\n\n\t\t\t\tif (isString(inputNode.val)) {\n\t\t\t\t\toutputBuffer.append(inputNode.val)\n\t\t\t\t} else {\n\t\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.val, indentLevel, true))\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.String) {\n\t\t\tif (inputNode.val.includes(options.quoteChar)) {\n\t\t\t\tif (inputNode.val.startsWith('data:image/svg+xml;utf8,')) { // In case of SVG data-URL\n\t\t\t\t\tconst counterQuoteChar = schema.quoteChar.enum.find(item => item !== options.quoteChar)\n\n\t\t\t\t\t// Convert single/double quotes\n\t\t\t\t\toutputBuffer.append(options.quoteChar)\n\t\t\t\t\toutputBuffer.append(inputNode.val.replace(new RegExp(options.quoteChar, 'g'), counterQuoteChar))\n\t\t\t\t\toutputBuffer.append(options.quoteChar)\n\n\t\t\t\t} else { // Use the existing quote character as Stylus does not support escaping quote characters\n\t\t\t\t\toutputBuffer.append(inputNode.quote)\n\t\t\t\t\toutputBuffer.append(inputNode.val)\n\t\t\t\t\toutputBuffer.append(inputNode.quote)\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\toutputBuffer.append(options.quoteChar)\n\t\t\t\toutputBuffer.append(inputNode.val)\n\t\t\t\toutputBuffer.append(options.quoteChar)\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.Ident) {\n\t\t\tif (insideExpression === false) {\n\t\t\t\toutputBuffer.append(indent)\n\t\t\t}\n\n\t\t\tif (inputNode.property === true) { // In case of property lookup\n\t\t\t\toutputBuffer.append('@')\n\t\t\t}\n\n\t\t\t// Replace the identifier name with '@' for anonymous functions\n\t\t\tconst currentIsAnonymousFunc = inputNode.name === 'anonymous' && inputNode.val instanceof StylusNode.Function && inputNode.val.name === 'anonymous'\n\t\t\tif (currentIsAnonymousFunc) {\n\t\t\t\toutputBuffer.append('@')\n\t\t\t} else {\n\t\t\t\toutputBuffer.append(inputNode.name)\n\t\t\t}\n\n\t\t\tif (checkIfMixin(inputNode)) {\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.val, indentLevel, false))\n\n\t\t\t} else if (inputNode.val instanceof StylusNode.Expression) { // In case of assignments\n\t\t\t\toutputBuffer.append(' = ')\n\t\t\t\tconst temp = travel(inputNode, inputNode.val, indentLevel, true)\n\t\t\t\tif (temp.startsWith(' ') || temp.startsWith(options.newLineChar)) {\n\t\t\t\t\toutputBuffer.remove(' ')\n\t\t\t\t}\n\t\t\t\toutputBuffer.append(temp)\n\n\t\t\t} else if (inputNode.val instanceof StylusNode.BinOp && inputNode.val.left instanceof StylusNode.Ident && inputNode.val.left.name === inputNode.name && inputNode.val.right) { // In case of self-assignments\n\t\t\t\toutputBuffer.append(' ' + inputNode.val.op + '= ')\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.val.right, indentLevel, true))\n\t\t\t}\n\n\t\t\tconst currentHasChildOfAnonymousFunc = inputNode.val instanceof StylusNode.Expression && inputNode.val.nodes.length === 1 && inputNode.val.nodes[0] instanceof StylusNode.Ident && inputNode.val.nodes[0].val instanceof StylusNode.Function && inputNode.val.nodes[0].val.name === 'anonymous'\n\n\t\t\tconst currentHasChildOfAtblock = inputNode.val instanceof StylusNode.Expression && inputNode.val.nodes.length === 1 && inputNode.val.nodes[0] instanceof StylusNode.Atblock\n\n\t\t\tif (insideExpression === false) {\n\t\t\t\tif (options.insertSemicolons && !(inputNode.val instanceof StylusNode.Function || currentHasChildOfAnonymousFunc || currentHasChildOfAtblock)) {\n\t\t\t\t\toutputBuffer.append(';')\n\t\t\t\t}\n\t\t\t\toutputBuffer.append(options.newLineChar)\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.Function) {\n\t\t\t// Insert the parameter list\n\t\t\toutputBuffer.append(openParen)\n\t\t\toutputBuffer.append(travel(inputNode, inputNode.params, indentLevel, true))\n\t\t\toutputBuffer.append(closeParen)\n\n\t\t\tlet potentialCommentNodeInsideTheBlock\n\t\t\tif (checkIfMixin(inputNode.parent)) {\n\t\t\t\tpotentialCommentNodeInsideTheBlock = inputNode.block\n\t\t\t} else {\n\t\t\t\tpotentialCommentNodeInsideTheBlock = last(inputNode.params.nodes)\n\t\t\t}\n\n\t\t\t// Insert the function body\n\t\t\toutputBuffer.append(travel(inputNode, inputNode.block, indentLevel, false, { potentialCommentNodeInsideTheBlock }))\n\n\t\t\t// Trim a new-line generated by `Block` because it will cancel a new-line generated by `Ident`\n\t\t\toutputBuffer.remove(options.newLineChar)\n\n\t\t} else if (inputNode instanceof StylusNode.Params) {\n\t\t\toutputBuffer.append(inputNode.nodes.map(node => travel(inputNode, node, indentLevel, true) + (node.rest ? '...' : '')).join(comma))\n\n\t\t} else if (inputNode instanceof StylusNode.Call) {\n\t\t\tif (inputNode.block) { // In case of block mixins\n\t\t\t\toutputBuffer.append(indent + '+')\n\t\t\t}\n\n\t\t\toutputBuffer.append(inputNode.name)\n\n\t\t\tif (inputNode.name === 'url' && inputNode.args.nodes.length === 1 && inputNode.args.nodes[0] instanceof StylusNode.Expression && inputNode.args.nodes[0].nodes.length > 1) { // In case of `url(non-string)`\n\t\t\t\tconst modifiedArgument = new StylusNode.Arguments()\n\t\t\t\tmodifiedArgument.nodes = [new StylusNode.String(inputNode.args.nodes[0].nodes.map(node => travel(inputNode.args.nodes[0], node, indentLevel, true)).join(''))]\n\t\t\t\toutputBuffer.append(travel(inputNode, modifiedArgument, indentLevel, true))\n\n\t\t\t} else {\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.args, indentLevel, true))\n\t\t\t}\n\n\t\t\tif (inputNode.block) { // In case of block mixins\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.block, indentLevel))\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.Return) {\n\t\t\tif (insideExpression === false) {\n\t\t\t\toutputBuffer.append(indent)\n\t\t\t}\n\n\t\t\toutputBuffer.append('return ')\n\t\t\toutputBuffer.append(travel(inputNode, inputNode.expr, indentLevel, true))\n\n\t\t\tif (insideExpression === false) {\n\t\t\t\tif (options.insertSemicolons) {\n\t\t\t\t\toutputBuffer.append(';')\n\t\t\t\t}\n\t\t\t\toutputBuffer.append(options.newLineChar)\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.Arguments) {\n\t\t\toutputBuffer.append(openParen)\n\n\t\t\tconst keyNodePairs = [\n\t\t\t\t// In case of ordinal arguments\n\t\t\t\tinputNode.nodes.map(node => ['', node]),\n\t\t\t\t// In case of named arguments\n\t\t\t\tObject.entries(inputNode.map)\n\t\t\t\t\t.map(pair => [pair[0] + ': ', pair[1]])\n\t\t\t].flat()\n\n\t\t\tconst lineCount = uniq(keyNodePairs.map(pair => pair[1].lineno)).length\n\n\t\t\tif (lineCount > 1) {\n\t\t\t\toutputBuffer.append(options.newLineChar + indent + options.tabStopChar)\n\t\t\t}\n\n\t\t\tconst separator = lineCount > 1\n\t\t\t\t? (',' /* Do not use the variable \"comma\" as it may end with a white-space */ + options.newLineChar + indent + options.tabStopChar)\n\t\t\t\t: comma\n\n\t\t\toutputBuffer.append(keyNodePairs.map(pair =>\n\t\t\t\tpair[0] +\n\t\t\t\ttravel(inputNode, pair[1], indentLevel, true)\n\t\t\t).join(separator))\n\n\t\t\tif (lineCount > 1) {\n\t\t\t\toutputBuffer.append(options.newLineChar + indent)\n\t\t\t}\n\n\t\t\toutputBuffer.append(closeParen)\n\n\t\t} else if (inputNode instanceof StylusNode.Expression) {\n\t\t\tif (insideExpression === false) {\n\t\t\t\toutputBuffer.append(indent)\n\t\t\t}\n\n\t\t\t(function () {\n\t\t\t\t// Handle the special case for a unit suffix\n\t\t\t\tif (\n\t\t\t\t\tinputNode.nodes.length === 2 &&\n\t\t\t\t\tinputNode.nodes[0] instanceof StylusNode.BinOp &&\n\t\t\t\t\tinputNode.nodes[1] instanceof StylusNode.Ident\n\t\t\t\t) {\n\t\t\t\t\toutputBuffer.append(openParen)\n\t\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.nodes[0], indentLevel, true))\n\t\t\t\t\toutputBuffer.append(closeParen)\n\t\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.nodes[1], indentLevel, true))\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst parentIsArithmeticOperator =\n\t\t\t\t\tinputNode.parent instanceof StylusNode.UnaryOp ||\n\t\t\t\t\t(\n\t\t\t\t\t\tinputNode.nodes.length === 1 &&\n\t\t\t\t\t\tinputNode.nodes[0] instanceof StylusNode.BinOp &&\n\t\t\t\t\t\tinputNode.parent instanceof StylusNode.BinOp &&\n\t\t\t\t\t\tinputNode.parent.op !== '[]' &&\n\t\t\t\t\t\tinputNode.parent.op !== '[]='\n\t\t\t\t\t)\n\t\t\t\tconst parentIsStringInterpolation =\n\t\t\t\t\tinputNode.parent instanceof StylusNode.BinOp &&\n\t\t\t\t\tinputNode.parent.op === '%' &&\n\t\t\t\t\tinputNode.parent.right === inputNode &&\n\t\t\t\t\tinputNode.nodes.length > 1\n\t\t\t\tconst parentIsNestedExpression =\n\t\t\t\t\tinputNode.nodes.length === 1 &&\n\t\t\t\t\tinputNode.parent instanceof StylusNode.Expression &&\n\t\t\t\t\t!(inputNode.parent instanceof StylusNode.Arguments) && // Note that `Arguments` type inherits `Expression` type\n\t\t\t\t\tinputNode.parent.parent &&\n\t\t\t\t\t(\n\t\t\t\t\t\tinputNode.parent.parent instanceof StylusNode.Expression &&\n\t\t\t\t\t\t!(inputNode.parent.parent instanceof StylusNode.Arguments) &&\n\t\t\t\t\t\tinputNode.parent.parent.nodes.indexOf(inputNode.parent) >= 1 || // Note that this is a bug from Stylus compiler where it adds extra Expression node\n\t\t\t\t\t\tinputNode.parent.parent instanceof StylusNode.Feature ||\n\t\t\t\t\t\tinputNode.parent.parent instanceof StylusNode.Ident ||\n\t\t\t\t\t\tinputNode.parent.parent instanceof StylusNode.If ||\n\t\t\t\t\t\tinputNode.parent.parent instanceof StylusNode.Each ||\n\t\t\t\t\t\tinputNode.parent.parent instanceof StylusNode.Selector ||\n\t\t\t\t\t\tinputNode.parent.parent instanceof StylusNode.Return ||\n\t\t\t\t\t\tinputNode.parent.parent instanceof StylusNode.Arguments ||\n\t\t\t\t\t\tinputNode.parent.parent instanceof StylusNode.Object ||\n\t\t\t\t\t\tinputNode.parent.parent instanceof StylusNode.BinOp && inputNode.parent.parent.op === '[]'\n\t\t\t\t\t) === false\n\t\t\t\tconst currentIsEmpty =\n\t\t\t\t\tinputNode.nodes.length === 0 &&\n\t\t\t\t\tinputNode.parent instanceof StylusNode.Expression &&\n\t\t\t\t\t!(inputNode.parent instanceof StylusNode.Arguments) && // Note that `Arguments` type inherits `Expression` type\n\t\t\t\t\tinputNode.parent.nodes.length === 1\n\t\t\t\tconst currentIsDivision =\n\t\t\t\t\tinputNode.nodes.length === 1 &&\n\t\t\t\t\tinputNode.nodes[0] instanceof StylusNode.BinOp &&\n\t\t\t\t\tinputNode.nodes[0].op === '/'\n\t\t\t\tconst currentIsNegation =\n\t\t\t\t\tinputNode.nodes.length === 1 &&\n\t\t\t\t\tinputNode.nodes[0] instanceof StylusNode.UnaryOp &&\n\t\t\t\t\tinputNode.nodes[0].op === '-'\n\t\t\t\tconst currentHasParenthesis =\n\t\t\t\t\tparentIsArithmeticOperator ||\n\t\t\t\t\tparentIsStringInterpolation ||\n\t\t\t\t\tparentIsNestedExpression ||\n\t\t\t\t\tcurrentIsEmpty ||\n\t\t\t\t\tcurrentIsDivision ||\n\t\t\t\t\tcurrentIsNegation\n\t\t\t\tif (currentHasParenthesis) {\n\t\t\t\t\toutputBuffer.append(openParen)\n\t\t\t\t}\n\n\t\t\t\toutputBuffer.append(inputNode.nodes.map((node, rank, list) => {\n\t\t\t\t\t// Use either a white-space or a comma as a separator\n\t\t\t\t\tlet separator = ' '\n\t\t\t\t\tif (rank === 0) {\n\t\t\t\t\t\tseparator = ''\n\t\t\t\t\t} else if (inputNode.isList) {\n\t\t\t\t\t\tseparator = comma\n\t\t\t\t\t}\n\n\t\t\t\t\tif (node instanceof StylusNode.Ident && insideExpression === false) {\n\t\t\t\t\t\treturn separator + '{' + travel(inputNode, node, indentLevel, true) + '}'\n\t\t\t\t\t}\n\n\t\t\t\t\treturn separator + travel(inputNode, node, indentLevel, true)\n\t\t\t\t}).join(''))\n\n\t\t\t\tif (currentHasParenthesis) {\n\t\t\t\t\toutputBuffer.append(closeParen)\n\t\t\t\t}\n\t\t\t})()\n\n\t\t\tif (insideExpression === false) {\n\t\t\t\tif (options.insertSemicolons) {\n\t\t\t\t\toutputBuffer.append(';')\n\t\t\t\t}\n\t\t\t\toutputBuffer.append(options.newLineChar)\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.Unit) {\n\t\t\tif (!options.insertLeadingZeroBeforeFraction && typeof inputNode.val === 'number' && Math.abs(inputNode.val) < 1 && inputNode.val !== 0) {\n\t\t\t\tif (inputNode.val < 0) {\n\t\t\t\t\toutputBuffer.append('-')\n\t\t\t\t}\n\t\t\t\toutputBuffer.append(Math.abs(inputNode.val).toString().substring(1))\n\t\t\t} else {\n\t\t\t\toutputBuffer.append(inputNode.val)\n\t\t\t}\n\n\t\t\tif (checkIfFlexBasis(inputNode) && inputNode.val === 0) {\n\t\t\t\t// See https://github.com/philipwalton/flexbugs#flexbug-4\n\t\t\t\toutputBuffer.append('%')\n\n\t\t\t} else if (!options.alwaysUseZeroWithoutUnit || inputNode.val !== 0 || inputNode.type === 's' || inputNode.type === 'ms') {\n\t\t\t\toutputBuffer.append(inputNode.type)\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.UnaryOp) {\n\t\t\toutputBuffer.append(inputNode.op === '!' && options.alwaysUseNot ? 'not ' : inputNode.op)\n\n\t\t\tconst content = travel(inputNode, inputNode.expr, indentLevel, true)\n\n\t\t\tconst bareNegation = inputNode.op === '-' && content.startsWith(openParen) === false\n\t\t\tif (bareNegation) {\n\t\t\t\tif (options.insertParenthesisAfterNegation) {\n\t\t\t\t\toutputBuffer.append(openParen)\n\t\t\t\t} else {\n\t\t\t\t\toutputBuffer.append(' ')\n\t\t\t\t}\n\t\t\t}\n\n\t\t\toutputBuffer.append(content)\n\n\t\t\tif (bareNegation) {\n\t\t\t\tif (options.insertParenthesisAfterNegation) {\n\t\t\t\t\toutputBuffer.append(closeParen)\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.BinOp) {\n\t\t\tif (inputNode.op === '[]') { // In case of array accessing\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.left, indentLevel, true))\n\t\t\t\toutputBuffer.append('[' + travel(inputNode, inputNode.right, indentLevel, true) + ']')\n\n\t\t\t} else if (inputNode.op === '...') { // In case of ranges\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.left, indentLevel, true))\n\t\t\t\toutputBuffer.append('...')\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.right, indentLevel, true))\n\n\t\t\t} else if (inputNode.op === '[]=') { // In case of object-property assignments\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.left, indentLevel, true))\n\t\t\t\toutputBuffer.append('[')\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.right, indentLevel, true))\n\t\t\t\toutputBuffer.append('] = ')\n\t\t\t\tif (inputNode.val instanceof StylusNode.Expression && inputNode.val.nodes.length === 1 && inputNode.val.nodes[0] instanceof StylusNode.Expression) {\n\t\t\t\t\tinputNode.val = inputNode.val.nodes[0]\n\t\t\t\t}\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.val, indentLevel, true))\n\n\t\t\t\tif (insideExpression === false) {\n\t\t\t\t\tif (options.insertSemicolons) {\n\t\t\t\t\t\toutputBuffer.append(';')\n\t\t\t\t\t}\n\t\t\t\t\toutputBuffer.append(options.newLineChar)\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.left, indentLevel, true))\n\n\t\t\t\toutputBuffer.append(' ' + inputNode.op)\n\n\t\t\t\tif (inputNode.right) {\n\t\t\t\t\toutputBuffer.append(' ' + travel(inputNode, inputNode.right, indentLevel, true))\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.Ternary) {\n\t\t\tif (insideExpression === false) {\n\t\t\t\toutputBuffer.append(indent)\n\t\t\t}\n\n\t\t\tif (insideExpression === false && inputNode.cond instanceof StylusNode.BinOp && inputNode.cond.op === 'is defined') {\n\t\t\t\tinputNode.cond.parent = inputNode\n\n\t\t\t\toutputBuffer.append(inputNode.cond.left.name)\n\t\t\t\toutputBuffer.append(' ?= ')\n\t\t\t\toutputBuffer.append(travel(inputNode.cond.left, inputNode.cond.left.val, indentLevel, true))\n\n\t\t\t} else {\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.cond, indentLevel, true))\n\t\t\t\toutputBuffer.append(' ? ')\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.trueExpr, indentLevel, true))\n\t\t\t\toutputBuffer.append(' : ')\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.falseExpr, indentLevel, true))\n\t\t\t}\n\n\t\t\tif (insideExpression === false) {\n\t\t\t\tif (options.insertSemicolons) {\n\t\t\t\t\toutputBuffer.append(';')\n\t\t\t\t}\n\t\t\t\toutputBuffer.append(options.newLineChar)\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.Boolean) {\n\t\t\toutputBuffer.append(inputNode.val.toString())\n\n\t\t} else if (inputNode instanceof StylusNode.RGBA) {\n\t\t\toutputBuffer.append(inputNode.raw.trim())\n\n\t\t} else if (inputNode instanceof StylusNode.Object) {\n\t\t\tconst keyValuePairs = Object.entries(inputNode.vals)\n\t\t\tif (keyValuePairs.length === 0) { // In case of an empty object\n\t\t\t\toutputBuffer.append('{}')\n\n\t\t\t} else if (keyValuePairs.map(pair => pair[1]).every(node => node.lineno === inputNode.lineno)) { // In case of one-line object-property spreading\n\t\t\t\toutputBuffer.append('{ ')\n\t\t\t\toutputBuffer.append(keyValuePairs.map(pair =>\n\t\t\t\t\tgetProperVariableName(pair[0]) + ': ' +\n\t\t\t\t\ttravel(inputNode, pair[1], indentLevel, true)\n\t\t\t\t).join(comma))\n\t\t\t\toutputBuffer.append(' }')\n\n\t\t\t} else { // In case of multiple-line object-property spreading\n\t\t\t\tconst childIndent = indent + options.tabStopChar\n\t\t\t\toutputBuffer.append('{' + options.newLineChar)\n\t\t\t\toutputBuffer.append(keyValuePairs.map(pair =>\n\t\t\t\t\tchildIndent +\n\t\t\t\t\tgetProperVariableName(pair[0]) + ': ' +\n\t\t\t\t\ttravel(inputNode, pair[1], indentLevel + 1, true)\n\t\t\t\t).join(',' + options.newLineChar))\n\t\t\t\toutputBuffer.append(options.newLineChar + indent + '}')\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.Member) {\n\t\t\toutputBuffer.append(travel(inputNode, inputNode.left, indentLevel, true))\n\t\t\toutputBuffer.append('.')\n\t\t\toutputBuffer.append(travel(inputNode, inputNode.right, indentLevel, true))\n\n\t\t\tif (inputNode.val) {\n\t\t\t\toutputBuffer.append(' = ')\n\t\t\t\tif (inputNode.val instanceof StylusNode.Expression && inputNode.val.nodes.length === 1 && inputNode.val.nodes[0] instanceof StylusNode.Expression) {\n\t\t\t\t\tinputNode.val = inputNode.val.nodes[0]\n\t\t\t\t}\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.val, indentLevel, true))\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.If) {\n\t\t\tif (insideExpression === false) {\n\t\t\t\toutputBuffer.append(indent)\n\t\t\t}\n\n\t\t\tconst operation = inputNode.negate ? 'unless' : 'if'\n\n\t\t\tif (inputNode.postfix === true) {\n\t\t\t\t// Insert the `if` body\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.block, indentLevel, true))\n\t\t\t\toutputBuffer.append(' ' + operation + ' ')\n\n\t\t\t\t// Insert the `if` condition\n\t\t\t\tif (checkForParenthesis(inputNode, options)) {\n\t\t\t\t\toutputBuffer.append(openParen)\n\t\t\t\t}\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.cond, indentLevel, true))\n\t\t\t\tif (checkForParenthesis(inputNode, options)) {\n\t\t\t\t\toutputBuffer.append(closeParen)\n\t\t\t\t}\n\n\t\t\t\tif (insideExpression === false) {\n\t\t\t\t\tif (options.insertSemicolons) {\n\t\t\t\t\t\toutputBuffer.append(';')\n\t\t\t\t\t}\n\t\t\t\t\toutputBuffer.append(options.newLineChar)\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tif (insideExpression) {\n\t\t\t\t\toutputBuffer.append(' ')\n\t\t\t\t}\n\n\t\t\t\t// Insert the `if` condition\n\t\t\t\toutputBuffer.append(operation + ' ')\n\t\t\t\tif (checkForParenthesis(inputNode, options)) {\n\t\t\t\t\toutputBuffer.append(openParen)\n\t\t\t\t}\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.cond, indentLevel, true))\n\t\t\t\tif (checkForParenthesis(inputNode, options)) {\n\t\t\t\t\toutputBuffer.append(closeParen)\n\t\t\t\t}\n\n\t\t\t\t// Insert the `if` body\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.block, indentLevel, false))\n\n\t\t\t\t// Insert `else` block(s)\n\t\t\t\tif (inputNode.elses.length > 0) {\n\t\t\t\t\tif (!options.insertNewLineBeforeElse) {\n\t\t\t\t\t\toutputBuffer.remove(options.newLineChar)\n\t\t\t\t\t}\n\n\t\t\t\t\tinputNode.elses.forEach((node, rank, list) => {\n\t\t\t\t\t\tif (!options.insertBraces) {\n\t\t\t\t\t\t\toutputBuffer.append(options.newLineChar)\n\t\t\t\t\t\t\toutputBuffer.append(indent)\n\t\t\t\t\t\t} else if (options.insertNewLineBeforeElse === true) {\n\t\t\t\t\t\t\toutputBuffer.append(indent)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\toutputBuffer.append(' ')\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\toutputBuffer.append('else')\n\t\t\t\t\t\toutputBuffer.append(travel(inputNode, node, indentLevel, true))\n\n\t\t\t\t\t\t// Remove the extra new-line generated by `Block`\n\t\t\t\t\t\tif (!options.insertNewLineBeforeElse && rank < list.length - 1) {\n\t\t\t\t\t\t\toutputBuffer.remove(options.newLineChar)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.Each) {\n\t\t\tif (insideExpression === false) {\n\t\t\t\toutputBuffer.append(indent)\n\t\t\t}\n\n\t\t\tconst currentHasOnlyOneChild = (inputNode.block.nodes || []).length === 1\n\t\t\tconst currentIsOnTheSameLineAsBody = inputNode.lineno === inputNode.block.nodes[0].lineno && inputNode.block.nodes[0].column < inputNode.column\n\t\t\tif (currentHasOnlyOneChild && currentIsOnTheSameLineAsBody) { // In case of postfix\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.block.nodes[0], indentLevel, true))\n\t\t\t\toutputBuffer.append(' for ')\n\t\t\t\toutputBuffer.append(compact([inputNode.val, inputNode.key]).join(comma))\n\t\t\t\toutputBuffer.append(' in ')\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.expr, indentLevel, true))\n\n\t\t\t\tif (insideExpression === false) {\n\t\t\t\t\tif (options.insertSemicolons) {\n\t\t\t\t\t\toutputBuffer.append(';')\n\t\t\t\t\t}\n\t\t\t\t\toutputBuffer.append(options.newLineChar)\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\toutputBuffer.append('for ')\n\t\t\t\toutputBuffer.append(compact([inputNode.val, inputNode.key]).join(comma))\n\t\t\t\toutputBuffer.append(' in ')\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.expr, indentLevel, true))\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.block, indentLevel, false))\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.Media) {\n\t\t\toutputBuffer.append(indent + '@media ')\n\t\t\toutputBuffer.append(travel(inputNode, inputNode.val, indentLevel))\n\t\t\toutputBuffer.append(travel(inputNode, inputNode.block, indentLevel))\n\n\t\t} else if (inputNode instanceof StylusNode.Keyframes) {\n\t\t\toutputBuffer.append(indent + '@keyframes ')\n\t\t\toutputBuffer.append(travelThroughSegments(inputNode, indentLevel).filter(text => text.trim().length > 0).join(''))\n\t\t\toutputBuffer.append(travel(inputNode, inputNode.block, indentLevel))\n\n\t\t} else if (inputNode instanceof StylusNode.QueryList) {\n\t\t\toutputBuffer.append(inputNode.nodes.map(node => travel(inputNode, node, indentLevel, true)).join(comma))\n\n\t\t} else if (inputNode instanceof StylusNode.Query) {\n\t\t\tif (inputNode.predicate) {\n\t\t\t\toutputBuffer.append(inputNode.predicate + ' ')\n\t\t\t}\n\t\t\tif (inputNode.type) {\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.type, indentLevel, true))\n\t\t\t}\n\t\t\tif (inputNode.nodes.length > 0) {\n\t\t\t\tif (inputNode.type) {\n\t\t\t\t\toutputBuffer.append(' and ')\n\t\t\t\t}\n\t\t\t\toutputBuffer.append(inputNode.nodes.map(node => travel(inputNode, node, indentLevel, true)).join(' and '))\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.Feature) {\n\t\t\tif (inputNode.expr) {\n\t\t\t\toutputBuffer.append(openParen)\n\t\t\t\toutputBuffer.append(travelThroughSegments(inputNode, indentLevel).join(''))\n\t\t\t\tif (options.insertColons) {\n\t\t\t\t\toutputBuffer.append(':')\n\t\t\t\t}\n\t\t\t\toutputBuffer.append(' ')\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.expr, indentLevel, true))\n\t\t\t\toutputBuffer.append(closeParen)\n\n\t\t\t} else {\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.segments[0], indentLevel, true))\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.Supports) {\n\t\t\toutputBuffer.append(indent + '@supports ')\n\t\t\toutputBuffer.append(travel(inputNode, inputNode.condition, indentLevel, true))\n\t\t\toutputBuffer.append(travel(inputNode, inputNode.block, indentLevel, false))\n\n\t\t} else if (inputNode instanceof StylusNode.Extend) {\n\t\t\toutputBuffer.append(indent)\n\t\t\tif (options.alwaysUseExtends) {\n\t\t\t\toutputBuffer.append('@extends')\n\t\t\t} else {\n\t\t\t\toutputBuffer.append('@extend')\n\t\t\t}\n\t\t\toutputBuffer.append(' ')\n\t\t\toutputBuffer.append(inputNode.selectors.map(node => travel(inputNode, node, indentLevel, true)).join(comma))\n\t\t\tif (options.insertSemicolons) {\n\t\t\t\toutputBuffer.append(';')\n\t\t\t}\n\t\t\toutputBuffer.append(options.newLineChar)\n\n\t\t} else if (inputNode instanceof StylusNode.Atrule) {\n\t\t\toutputBuffer.append(indent + '@' + inputNode.type)\n\t\t\tif (inputNode.segments.length > 0) {\n\t\t\t\toutputBuffer.append(' ')\n\t\t\t\toutputBuffer.append(travelThroughSegments(inputNode, indentLevel).join(''))\n\t\t\t\toutputBuffer.remove(' ')\n\t\t\t}\n\t\t\tif (inputNode.block) {\n\t\t\t\toutputBuffer.append(travel(inputNode, inputNode.block, indentLevel))\n\t\t\t} else if (options.insertSemicolons) {\n\t\t\t\toutputBuffer.append(';')\n\t\t\t\toutputBuffer.append(options.newLineChar)\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.Atblock) {\n\t\t\tif (options.alwaysUseAtBlock) {\n\t\t\t\toutputBuffer.append('@block')\n\t\t\t}\n\t\t\toutputBuffer.append(travel(inputNode, inputNode.block, indentLevel))\n\n\t\t\t// Remove the extra new-line because of `Ident` and `Block`\n\t\t\toutputBuffer.remove(options.newLineChar)\n\n\t\t} else if (inputNode instanceof StylusNode.Charset) {\n\t\t\toutputBuffer.append('@charset ')\n\t\t\toutputBuffer.append(travel(inputNode, inputNode.val, indentLevel, true))\n\n\t\t} else if (inputNode instanceof StylusNode.Namespace) {\n\t\t\toutputBuffer.append('@namespace ')\n\t\t\tif (inputNode.prefix) {\n\t\t\t\toutputBuffer.append(inputNode.prefix + ' ')\n\t\t\t}\n\t\t\t// Note that `inputNode.val.val` is not a typo\n\t\t\toutputBuffer.append(travel(inputNode, inputNode.val.val, indentLevel, true))\n\n\t\t\tif (options.insertSemicolons) {\n\t\t\t\toutputBuffer.append(';')\n\t\t\t}\n\t\t\toutputBuffer.append(options.newLineChar)\n\n\t\t} else if (inputNode instanceof StylusNode.Null) {\n\t\t\toutputBuffer.append('null')\n\n\t\t} else if (inputNode instanceof StylusNode.Comment && inputNode.str.startsWith('//')) { // In case of single-line comments\n\t\t\tif (inputNode.insertNewLineAbove) {\n\t\t\t\toutputBuffer.append(options.newLineChar)\n\t\t\t}\n\t\t\tif (insideExpression === false) {\n\t\t\t\toutputBuffer.append(indent)\n\t\t\t}\n\t\t\toutputBuffer.append('//' + (options.insertSpaceAfterComment ? ' ' : ''))\n\t\t\toutputBuffer.append(inputNode.str.substring(2).trim())\n\t\t\tif (insideExpression === false) {\n\t\t\t\toutputBuffer.append(options.newLineChar)\n\t\t\t}\n\n\t\t} else if (inputNode instanceof StylusNode.Comment && inputNode.str.startsWith('/*')) { // In case of multi-line comments\n\t\t\tconst spaceAfterComment = (options.insertSpaceAfterComment ? ' ' : '')\n\n\t\t\t// Split into an array of lines\n\t\t\tlet commentLines = inputNode.str.split(/\\r?\\n/)\n\n\t\t\tconst documenting = commentLines[0].startsWith('/*') && commentLines.slice(1).every(line => line.trim().startsWith('*'))\n\n\t\t\tif (commentLines.length === 1) { // In case of one line only\n\t\t\t\t// Add a white-space between /* and */\n\t\t\t\tcommentLines[0] = '/*' + spaceAfterComment + commentLines[0].substring(2, commentLines[0].length - 2).trim() + spaceAfterComment + '*/'\n\n\t\t\t\t// Add indentation\n\t\t\t\tif (!insideExpression) {\n\t\t\t\t\tcommentLines[0] = indent + commentLines[0]\n\t\t\t\t}\n\n\t\t\t} else { // In case of multiple lines\n\t\t\t\t// Add a white-space after /*\n\t\t\t\tif (commentLines[0] !== '/**') {\n\t\t\t\t\tcommentLines[0] = ('/*' + spaceAfterComment + commentLines[0].substring(2).trim()).trim()\n\t\t\t\t}\n\n\t\t\t\t// Add indentation to in-between lines\n\t\t\t\tlet zeroBasedLineIndex = 0\n\t\t\t\twhile (++zeroBasedLineIndex <= commentLines.length - 2) {\n\t\t\t\t\tif (documenting) {\n\t\t\t\t\t\tconst trimmedCurrentLine = commentLines[zeroBasedLineIndex].trim()\n\t\t\t\t\t\tif (trimmedCurrentLine.startsWith('*')) {\n\t\t\t\t\t\t\tif (trimmedCurrentLine.substring(1).charAt(0) === ' ') {\n\t\t\t\t\t\t\t\tcommentLines[zeroBasedLineIndex] = ' *' + trimmedCurrentLine.substring(1)\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcommentLines[zeroBasedLineIndex] = ' *' + spaceAfterComment + trimmedCurrentLine.substring(1)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcommentLines[zeroBasedLineIndex] = ' *' + spaceAfterComment + commentLines[zeroBasedLineIndex]\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcommentLines[zeroBasedLineIndex] = trimEnd(commentLines[zeroBasedLineIndex])\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Add a white-space before */\n\t\t\t\tif (last(commentLines).trim() === '*/') {\n\t\t\t\t\tif (documenting) {\n\t\t\t\t\t\tcommentLines[commentLines.length - 1] = ' ' + last(commentLines).trim()\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tcommentLines[commentLines.length - 1] = trimEnd(last(commentLines).substring(0, last(commentLines).length - 2)) + spaceAfterComment + '*/'\n\t\t\t\t}\n\n\t\t\t\t// Add indentation\n\t\t\t\tif (documenting) {\n\t\t\t\t\tcommentLines = commentLines.map(line => indent + line)\n\t\t\t\t} else {\n\t\t\t\t\tconst originalIndentLong = min(\n\t\t\t\t\t\tcommentLines\n\t\t\t\t\t\t\t.slice(1)\n\t\t\t\t\t\t\t.map(line => line.match(/^(\\s|\\t)*/g)[0].length)\n\t\t\t\t\t) || 0\n\n\t\t\t\t\tcommentLines = commentLines.map((line, rank) => {\n\t\t\t\t\t\tif (rank === 0) {\n\t\t\t\t\t\t\treturn indent + line\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn indent + line.substring(originalIndentLong)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\n\t\t\toutputBuffer.append(commentLines.join(options.newLineChar))\n\n\t\t\tif (!insideExpression) {\n\t\t\t\toutputBuffer.append(options.newLineChar)\n\t\t\t}\n\n\t\t} else {\n\t\t\tconst error = new Error('Found unknown object')\n\t\t\terror.data = inputNode\n\t\t\tthrow error\n\t\t}\n\n\t\t// Insert sticky comment(s) on the right of the current node\n\t\tif (inputNode.commentsOnRight) {\n\t\t\toutputBuffer.remove(options.newLineChar)\n\t\t\tif (options.insertSpaceBeforeComment) {\n\t\t\t\toutputBuffer.append(' ')\n\t\t\t}\n\t\t\toutputBuffer.append(inputNode.commentsOnRight.map(node => travel(inputNode.parent, node, indentLevel, true)).join(''))\n\t\t\toutputBuffer.append(options.newLineChar)\n\t\t}\n\n\t\treturn outputBuffer.toString()\n\t}\n\n\tfunction travelThroughSegments(inputNode, indentLevel) {\n\t\treturn inputNode.segments.map(segment => {\n\t\t\tif (segment instanceof StylusNode.Expression) {\n\t\t\t\tif (segment.nodes.length === 1 && segment.nodes[0] instanceof StylusNode.Expression) {\n\t\t\t\t\tsegment = segment.nodes[0]\n\t\t\t\t}\n\t\t\t\treturn '{' + travel(inputNode, segment, indentLevel, true) + '}'\n\t\t\t} else {\n\t\t\t\treturn travel(inputNode, segment, indentLevel, true)\n\t\t\t}\n\t\t})\n\t}\n\n\t// Store the line indexes of single-line comments that have been processed\n\t// This prevents picking up duplicate comments\n\tconst usedStandaloneSingleLineComments = {}\n\n\tfunction tryGetSingleLineCommentNodesOnTheTopOf(inputNode) {\n\t\t// Re-assign `inputNode` because of wrong mixin declaration `lineno`\n\t\tif (checkIfMixin(inputNode)) {\n\t\t\tconst params = get(inputNode, 'val.params.nodes', [])\n\t\t\tif (params.length > 0) {\n\t\t\t\tinputNode = first(params)\n\t\t\t} else {\n\t\t\t\tinputNode = inputNode.val\n\t\t\t}\n\t\t}\n\n\t\tlet zeroBasedLineIndex\n\t\tif (inputNode instanceof StylusNode.Group && Array.isArray(inputNode.nodes) && inputNode.nodes.length > 0) {\n\t\t\tzeroBasedLineIndex = inputNode.nodes[0].lineno - 1\n\t\t} else if (checkIfTernary(inputNode) && inputNode.cond.left.val.lineno < inputNode.lineno) {\n\t\t\tzeroBasedLineIndex = inputNode.cond.left.val.lineno - 1\n\t\t} else {\n\t\t\tzeroBasedLineIndex = inputNode.lineno - 1\n\t\t}\n\n\t\tif (modifiedLines[zeroBasedLineIndex] === undefined) {\n\t\t\treturn []\n\t\t}\n\n\t\tconst referenceNodeIndent = getIndent(modifiedLines[zeroBasedLineIndex])\n\n\t\tlet commentNodes = []\n\t\twhile (--zeroBasedLineIndex >= 0) {\n\t\t\tconst text = modifiedLines[zeroBasedLineIndex].trim()\n\t\t\tif (text === '') {\n\t\t\t\tif (commentNodes.length > 0) {\n\t\t\t\t\tcommentNodes[0].insertNewLineAbove = true\n\t\t\t\t}\n\n\t\t\t} else if (text.startsWith('//') === false) {\n\t\t\t\tbreak\n\n\t\t\t} else if (referenceNodeIndent !== getIndent(modifiedLines[zeroBasedLineIndex])) {\n\t\t\t\tbreak\n\n\t\t\t} else if (!usedStandaloneSingleLineComments[zeroBasedLineIndex]) {\n\t\t\t\tusedStandaloneSingleLineComments[zeroBasedLineIndex] = true\n\t\t\t\tcommentNodes.unshift(new StylusNode.Comment(text, false, false))\n\t\t\t}\n\t\t}\n\n\t\tif (commentNodes.length > 0) {\n\t\t\tcommentNodes[0].insertNewLineAbove = false\n\t\t}\n\n\t\treturn commentNodes\n\t}\n\n\tfunction tryGetSingleLineCommentNodesOnTheBottomOf(inputNode) {\n\t\tif (!inputNode) {\n\t\t\treturn null\n\t\t}\n\n\t\t// Skip operation for `Group` type\n\t\tif (inputNode instanceof StylusNode.Group) {\n\t\t\treturn null\n\t\t}\n\n\t\tlet zeroBasedLineIndex = inputNode.lineno - 1\n\n\t\t// Skip operation when `inputNode.lineno` is not valid\n\t\tif (modifiedLines[zeroBasedLineIndex] === undefined) {\n\t\t\treturn null\n\t\t}\n\n\t\tconst referenceNodeIndent = getIndent(modifiedLines[zeroBasedLineIndex])\n\n\t\tconst commentNodes = []\n\t\twhile (++zeroBasedLineIndex < modifiedLines.length && modifiedLines[zeroBasedLineIndex].trim().startsWith('//') && modifiedLines[zeroBasedLineIndex].startsWith(referenceNodeIndent)) {\n\t\t\tif (usedStandaloneSingleLineComments[zeroBasedLineIndex]) {\n\t\t\t\tbreak\n\t\t\t} else {\n\t\t\t\tusedStandaloneSingleLineComments[zeroBasedLineIndex] = true\n\t\t\t\tcommentNodes.push(new StylusNode.Comment(modifiedLines[zeroBasedLineIndex].trim(), false, false))\n\t\t\t}\n\t\t}\n\n\t\treturn commentNodes\n\t}\n\n\tfunction tryGetSingleLineCommentNodeOnTheRightOf(inputNode) {\n\t\tif (!inputNode || modifiedLines[inputNode.lineno - 1] !== undefined && modifiedLines[inputNode.lineno - 1].substring(inputNode.column - 1).includes('//') === false) {\n\t\t\treturn null\n\t\t}\n\n\t\t// Skip operation for `Group` type\n\t\tif (inputNode instanceof StylusNode.Group) {\n\t\t\treturn null\n\t\t}\n\n\t\tlet currentLine = modifiedLines[inputNode.lineno - 1]\n\t\tif (currentLine === undefined) {\n\t\t\treturn null\n\t\t}\n\n\t\t// Skip operation if the only \"//\" is in the string\n\t\tlet zeroBasedLineIndex = inputNode.column\n\t\tconst leftmostStringThatHasDoubleSlashes = maxBy(\n\t\t\tfindChildNodes(inputNode, node => node instanceof StylusNode.String)\n\t\t\t\t.filter(node => node.lineno === inputNode.lineno && node.val.includes('//')),\n\t\t\tnode => node.column\n\t\t)\n\t\tif (leftmostStringThatHasDoubleSlashes) {\n\t\t\tzeroBasedLineIndex = leftmostStringThatHasDoubleSlashes.column + leftmostStringThatHasDoubleSlashes.val.length + 1\n\t\t}\n\n\t\tconst commentIndex = currentLine.indexOf('//', zeroBasedLineIndex)\n\t\tif (commentIndex === -1) {\n\t\t\treturn null\n\t\t}\n\n\t\treturn new StylusNode.Comment(currentLine.substring(commentIndex).trim(), false, false)\n\t}\n\n\tfunction tryGetMultiLineCommentNodeOnTheRightOf(inputNode) {\n\t\tif (!inputNode || modifiedLines[inputNode.lineno - 1].substring(inputNode.column - 1).includes('/*') === false) {\n\t\t\treturn null\n\t\t}\n\n\t\tlet zeroBasedLineIndex = inputNode.lineno - 1\n\t\tlet currentLine = modifiedLines[zeroBasedLineIndex]\n\t\tcurrentLine = currentLine.substring(currentLine.indexOf('/*', inputNode.column))\n\t\tif (currentLine.includes('*/')) {\n\t\t\tcurrentLine = currentLine.substring(0, currentLine.indexOf('*/') + 2)\n\t\t} else {\n\t\t\twhile (++zeroBasedLineIndex < modifiedLines.length) {\n\t\t\t\tif (currentLine.includes('*/')) {\n\t\t\t\t\tcurrentLine = currentLine.substring(0, currentLine.indexOf('*/') + 2)\n\t\t\t\t\tbreak\n\t\t\t\t} else {\n\t\t\t\t\tcurrentLine += options.newLineChar\n\t\t\t\t\tcurrentLine += modifiedLines[zeroBasedLineIndex]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn new StylusNode.Comment(currentLine, false, false)\n\t}\n\n\tfunction getType(inputNode) {\n\t\tif (\n\t\t\tinputNode instanceof StylusNode.Property ||\n\t\t\tinputNode instanceof StylusNode.If && inputNode.postfix && inputNode.block instanceof StylusNode.Property\n\t\t) {\n\t\t\treturn 'Property'\n\n\t\t} else if (inputNode instanceof StylusNode.Import) {\n\t\t\treturn 'Import'\n\n\t\t} else if (\n\t\t\tinputNode.block !== undefined ||\n\t\t\t(inputNode instanceof StylusNode.Ident && inputNode.val.block !== undefined)\n\t\t) {\n\t\t\treturn 'Block'\n\n\t\t} else {\n\t\t\treturn 'Other'\n\t\t}\n\t}\n\n\tfunction getProperVariableName(name) {\n\t\tif (/^-/.test(name) || /^\\d/.test(name) || /\\s/.test(name)) {\n\t\t\treturn options.quoteChar + name + options.quoteChar\n\t\t} else {\n\t\t\treturn name\n\t\t}\n\t}\n\n\tconst outputText = travel(null, rootNode, 0)\n\tlet outputLines = outputText.split(new RegExp(escapeRegExp(options.newLineChar)))\n\n\t// Trim a beginning new-line character\n\tif (first(outputLines).trim().length === 0) {\n\t\toutputLines.shift()\n\t}\n\n\t// Trim all trailing new-line characters\n\twhile (outputLines.length > 0 && last(outputLines).trim().length === 0) {\n\t\toutputLines.pop()\n\t}\n\n\tif (options.wrapMode) {\n\t\t// Remove the wrap node block\n\t\tif (outputLines[0].startsWith('wrap')) {\n\t\t\toutputLines.shift()\n\t\t}\n\t\tif (options.insertBraces && last(outputLines).trim() === '}') {\n\t\t\toutputLines.pop()\n\t\t}\n\n\t\t// Remove the wrap node indentation\n\t\toutputLines = outputLines.map(line => line.startsWith(options.tabStopChar) ? line.substring(options.tabStopChar.length) : line)\n\n\t\t// Add the original base indentation\n\t\tif (originalBaseIndent && originalTabStopChar) {\n\t\t\tconst outputBaseIndent = options.tabStopChar.repeat(originalBaseIndent.length / originalTabStopChar.length)\n\t\t\toutputLines = outputLines.map(line => line.trim().length > 0 ? (outputBaseIndent + line) : '')\n\t\t} else if (originalBaseIndent) {\n\t\t\toutputLines = outputLines.map(line => line.trim().length > 0 ? (originalBaseIndent + line) : '')\n\t\t}\n\t}\n\n\t// Add a beginning new-line character\n\t// Do not move this block\n\tif (originalLines[0].length === 0) {\n\t\toutputLines.unshift('')\n\t}\n\n\t// Add a trailing new-line character if the original content has it\n\t// Do not move this block\n\tif (originalLines.length > 1 && content.substring(content.lastIndexOf('\\n') + 1).trim().length === 0) {\n\t\toutputLines.push('')\n\t}\n\n\treturn outputLines.join(options.newLineChar)\n}\n\nfunction checkIfMixin(node) {\n\treturn (\n\t\tnode instanceof StylusNode.Ident &&\n\t\tnode.val instanceof StylusNode.Function\n\t)\n}\n\nfunction checkIfTernary(node) {\n\treturn (\n\t\tnode instanceof StylusNode.Ternary &&\n\t\tnode.cond instanceof StylusNode.BinOp &&\n\t\tnode.cond.op === 'is defined' &&\n\t\tnode.cond.left instanceof StylusNode.Ident &&\n\t\tnode.cond.left.val instanceof StylusNode.Expression\n\t)\n}\n\nfunction checkIfFlexBasis(node) {\n\treturn (\n\t\tnode instanceof StylusNode.Unit &&\n\t\tnode.parent instanceof StylusNode.Property &&\n\t\tnode.parent.segments.length === 1 &&\n\t\tnode.parent.segments[0] instanceof StylusNode.Ident &&\n\t\t(\n\t\t\t(\n\t\t\t\tnode.parent.segments[0].name === 'flex' &&\n\t\t\t\tnode.parent.expr.nodes[2] === node\n\t\t\t) ||\n\t\t\t(\n\t\t\t\tnode.parent.segments[0].name === 'flex-basis' &&\n\t\t\t\tnode.parent.expr.nodes[0] === node\n\t\t\t)\n\t\t)\n\t)\n}\n\nfunction checkForParenthesis(node, options) {\n\t// Note that `Arguments` type inherits `Expression` type\n\tif (\n\t\tnode instanceof StylusNode.If &&\n\t\toptions.insertParenthesisAroundIfCondition &&\n\t\tnode.cond instanceof StylusNode.Expression &&\n\t\tnode.cond.nodes.length === 1 &&\n\t\tcheckForParenthesis(node.cond.nodes[0], options) === false\n\t) {\n\t\treturn true\n\t}\n\n\tif (\n\t\tnode instanceof StylusNode.Expression &&\n\t\tnode instanceof StylusNode.Arguments === false &&\n\t\tnode.nodes.length === 1 &&\n\t\tnode.nodes[0] instanceof StylusNode.Expression &&\n\t\tnode.nodes[0] instanceof StylusNode.Arguments === false\n\t) {\n\t\treturn true\n\t}\n\n\treturn false\n}\n\nfunction getIndent(line) {\n\treturn line.substring(0, line.length - trimStart(line).length)\n}\n\nmodule.exports = format\n", "var baseSlice = require('./_baseSlice'),\n isIterateeCall = require('./_isIterateeCall'),\n toInteger = require('./toInteger');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeCeil = Math.ceil,\n nativeMax = Math.max;\n\n/**\n * Creates an array of elements split into groups the length of `size`.\n * If `array` can't be split evenly, the final chunk will be the remaining\n * elements.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to process.\n * @param {number} [size=1] The length of each chunk\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the new array of chunks.\n * @example\n *\n * _.chunk(['a', 'b', 'c', 'd'], 2);\n * // => [['a', 'b'], ['c', 'd']]\n *\n * _.chunk(['a', 'b', 'c', 'd'], 3);\n * // => [['a', 'b', 'c'], ['d']]\n */\nfunction chunk(array, size, guard) {\n if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n size = 1;\n } else {\n size = nativeMax(toInteger(size), 0);\n }\n var length = array == null ? 0 : array.length;\n if (!length || size < 1) {\n return [];\n }\n var index = 0,\n resIndex = 0,\n result = Array(nativeCeil(length / size));\n\n while (index < length) {\n result[resIndex++] = baseSlice(array, index, (index += size));\n }\n return result;\n}\n\nmodule.exports = chunk;\n", "const isObject = require('lodash/isObject')\nconst difference = require('lodash/difference')\nconst chunk = require('lodash/chunk')\nconst identity = require('lodash/identity')\n\nconst schema = require('./schema')\n\nconst createAdapterForAlwaysNeverFalse = value => (value === 'always' || value === 'never') ? value === 'always' : undefined\n\nconst stylintOptionMap = {\n\tblocks: ['alwaysUseAtBlock', createAdapterForAlwaysNeverFalse],\n\tbrackets: ['insertBraces', createAdapterForAlwaysNeverFalse],\n\tcolons: ['insertColons', createAdapterForAlwaysNeverFalse],\n\tcommaSpace: ['insertSpaceAfterComma', createAdapterForAlwaysNeverFalse],\n\tcommentSpace: ['insertSpaceAfterComment', createAdapterForAlwaysNeverFalse],\n\tefficient: ['reduceMarginAndPaddingValues', createAdapterForAlwaysNeverFalse],\n\texclude: ['ignoreFiles', value => value],\n\textendPref: ['alwaysUseExtends', value => value === '@extends'],\n\tindentPref: ['tabStopChar', value => value > 0 ? ' '.repeat(value) : undefined],\n\tleadingZero: ['insertLeadingZeroBeforeFraction', createAdapterForAlwaysNeverFalse],\n\tparenSpace: ['insertSpaceInsideParenthesis', createAdapterForAlwaysNeverFalse],\n\tquotePref: ['quoteChar', value => (value === 'single' && '\\'' || value === 'double' && '\"' || undefined)],\n\tsemicolons: ['insertSemicolons', createAdapterForAlwaysNeverFalse],\n\tsortOrder: ['sortProperties', value => value, 'insertNewLineAroundProperties', value => value === 'grouped' ? true : undefined],\n\tnone: ['alwaysUseNoneOverZero', createAdapterForAlwaysNeverFalse],\n\tzeroUnits: ['alwaysUseZeroWithoutUnit', value => value === false ? undefined : value === 'never'],\n}\n\nconst usedFormattingOptionNames = chunk(Object.values(stylintOptionMap).flat(), 2)\n\t.flatMap(([name]) => name)\n\n// Prevent conflicts by removing the formatting options that can be specified via Stylint above\nconst complementaryOptionMap = Object.fromEntries(\n\tdifference(Object.keys(schema), usedFormattingOptionNames)\n\t\t.map(name => ['stylusSupremacy.' + name, [name, identity]])\n)\n\nconst universalOptionMap = {\n\t...stylintOptionMap,\n\t...complementaryOptionMap\n}\n\nfunction createFormattingOptionsFromStylint(stylintOptions = {}) {\n\treturn Object.entries(stylintOptions)\n\t\t.filter(([name]) => universalOptionMap[name] !== undefined)\n\t\t.reduce((hash, [name, rule]) => {\n\t\t\tconst value = isObject(rule) && rule.expect !== undefined ? rule.expect : rule\n\n\t\t\tchunk(universalOptionMap[name], 2).forEach(([name, convert]) => {\n\t\t\t\tconst result = convert(value)\n\t\t\t\tif (result !== undefined) {\n\t\t\t\t\thash['stylusSupremacy.' + name] = result\n\t\t\t\t}\n\t\t\t})\n\n\t\t\treturn hash\n\t\t}, {})\n}\n\ncreateFormattingOptionsFromStylint.map = stylintOptionMap\n\nmodule.exports = createFormattingOptionsFromStylint", "const isWindows = typeof process === 'object' &&\n process &&\n process.platform === 'win32'\nmodule.exports = isWindows ? { sep: '\\\\' } : { sep: '/' }\n", "var balanced = require('balanced-match');\n\nmodule.exports = expandTop;\n\nvar escSlash = '\\0SLASH'+Math.random()+'\\0';\nvar escOpen = '\\0OPEN'+Math.random()+'\\0';\nvar escClose = '\\0CLOSE'+Math.random()+'\\0';\nvar escComma = '\\0COMMA'+Math.random()+'\\0';\nvar escPeriod = '\\0PERIOD'+Math.random()+'\\0';\n\nfunction numeric(str) {\n return parseInt(str, 10) == str\n ? parseInt(str, 10)\n : str.charCodeAt(0);\n}\n\nfunction escapeBraces(str) {\n return str.split('\\\\\\\\').join(escSlash)\n .split('\\\\{').join(escOpen)\n .split('\\\\}').join(escClose)\n .split('\\\\,').join(escComma)\n .split('\\\\.').join(escPeriod);\n}\n\nfunction unescapeBraces(str) {\n return str.split(escSlash).join('\\\\')\n .split(escOpen).join('{')\n .split(escClose).join('}')\n .split(escComma).join(',')\n .split(escPeriod).join('.');\n}\n\n\n// Basically just str.split(\",\"), but handling cases\n// where we have nested braced sections, which should be\n// treated as individual members, like {a,{b,c},d}\nfunction parseCommaParts(str) {\n if (!str)\n return [''];\n\n var parts = [];\n var m = balanced('{', '}', str);\n\n if (!m)\n return str.split(',');\n\n var pre = m.pre;\n var body = m.body;\n var post = m.post;\n var p = pre.split(',');\n\n p[p.length-1] += '{' + body + '}';\n var postParts = parseCommaParts(post);\n if (post.length) {\n p[p.length-1] += postParts.shift();\n p.push.apply(p, postParts);\n }\n\n parts.push.apply(parts, p);\n\n return parts;\n}\n\nfunction expandTop(str) {\n if (!str)\n return [];\n\n // I don't know why Bash 4.3 does this, but it does.\n // Anything starting with {} will have the first two bytes preserved\n // but *only* at the top level, so {},a}b will not expand to anything,\n // but a{},b}c will be expanded to [a}c,abc].\n // One could argue that this is a bug in Bash, but since the goal of\n // this module is to match Bash's rules, we escape a leading {}\n if (str.substr(0, 2) === '{}') {\n str = '\\\\{\\\\}' + str.substr(2);\n }\n\n return expand(escapeBraces(str), true).map(unescapeBraces);\n}\n\nfunction embrace(str) {\n return '{' + str + '}';\n}\nfunction isPadded(el) {\n return /^-?0\\d/.test(el);\n}\n\nfunction lte(i, y) {\n return i <= y;\n}\nfunction gte(i, y) {\n return i >= y;\n}\n\nfunction expand(str, isTop) {\n var expansions = [];\n\n var m = balanced('{', '}', str);\n if (!m) return [str];\n\n // no need to expand pre, since it is guaranteed to be free of brace-sets\n var pre = m.pre;\n var post = m.post.length\n ? expand(m.post, false)\n : [''];\n\n if (/\\$$/.test(m.pre)) { \n for (var k = 0; k < post.length; k++) {\n var expansion = pre+ '{' + m.body + '}' + post[k];\n expansions.push(expansion);\n }\n } else {\n var isNumericSequence = /^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(m.body);\n var isAlphaSequence = /^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(m.body);\n var isSequence = isNumericSequence || isAlphaSequence;\n var isOptions = m.body.indexOf(',') >= 0;\n if (!isSequence && !isOptions) {\n // {a},b}\n if (m.post.match(/,.*\\}/)) {\n str = m.pre + '{' + m.body + escClose + m.post;\n return expand(str);\n }\n return [str];\n }\n\n var n;\n if (isSequence) {\n n = m.body.split(/\\.\\./);\n } else {\n n = parseCommaParts(m.body);\n if (n.length === 1) {\n // x{{a,b}}y ==> x{a}y x{b}y\n n = expand(n[0], false).map(embrace);\n if (n.length === 1) {\n return post.map(function(p) {\n return m.pre + n[0] + p;\n });\n }\n }\n }\n\n // at this point, n is the parts, and we know it's not a comma set\n // with a single entry.\n var N;\n\n if (isSequence) {\n var x = numeric(n[0]);\n var y = numeric(n[1]);\n var width = Math.max(n[0].length, n[1].length)\n var incr = n.length == 3\n ? Math.abs(numeric(n[2]))\n : 1;\n var test = lte;\n var reverse = y < x;\n if (reverse) {\n incr *= -1;\n test = gte;\n }\n var pad = n.some(isPadded);\n\n N = [];\n\n for (var i = x; test(i, y); i += incr) {\n var c;\n if (isAlphaSequence) {\n c = String.fromCharCode(i);\n if (c === '\\\\')\n c = '';\n } else {\n c = String(i);\n if (pad) {\n var need = width - c.length;\n if (need > 0) {\n var z = new Array(need + 1).join('0');\n if (i < 0)\n c = '-' + z + c.slice(1);\n else\n c = z + c;\n }\n }\n }\n N.push(c);\n }\n } else {\n N = [];\n\n for (var j = 0; j < n.length; j++) {\n N.push.apply(N, expand(n[j], false));\n }\n }\n\n for (var j = 0; j < N.length; j++) {\n for (var k = 0; k < post.length; k++) {\n var expansion = pre + N[j] + post[k];\n if (!isTop || isSequence || expansion)\n expansions.push(expansion);\n }\n }\n }\n\n return expansions;\n}\n\n", "const minimatch = module.exports = (p, pattern, options = {}) => {\n assertValidPattern(pattern)\n\n // shortcut: comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n return false\n }\n\n return new Minimatch(pattern, options).match(p)\n}\n\nmodule.exports = minimatch\n\nconst path = require('./lib/path.js')\nminimatch.sep = path.sep\n\nconst GLOBSTAR = Symbol('globstar **')\nminimatch.GLOBSTAR = GLOBSTAR\nconst expand = require('brace-expansion')\n\nconst plTypes = {\n '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},\n '?': { open: '(?:', close: ')?' },\n '+': { open: '(?:', close: ')+' },\n '*': { open: '(?:', close: ')*' },\n '@': { open: '(?:', close: ')' }\n}\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n\n// ** when dots are allowed. Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\\\/|^)(?:\\\\.{1,2})($|\\\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\\\/|^)\\\\.).)*?'\n\n// \"abc\" -> { a:true, b:true, c:true }\nconst charSet = s => s.split('').reduce((set, c) => {\n set[c] = true\n return set\n}, {})\n\n// characters that need to be escaped in RegExp.\nconst reSpecials = charSet('().*{}+?[]^$\\\\!')\n\n// characters that indicate we have to add the pattern start\nconst addPatternStartSet = charSet('[.(')\n\n// normalizes slashes.\nconst slashSplit = /\\/+/\n\nminimatch.filter = (pattern, options = {}) =>\n (p, i, list) => minimatch(p, pattern, options)\n\nconst ext = (a, b = {}) => {\n const t = {}\n Object.keys(a).forEach(k => t[k] = a[k])\n Object.keys(b).forEach(k => t[k] = b[k])\n return t\n}\n\nminimatch.defaults = def => {\n if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n return minimatch\n }\n\n const orig = minimatch\n\n const m = (p, pattern, options) => orig(p, pattern, ext(def, options))\n m.Minimatch = class Minimatch extends orig.Minimatch {\n constructor (pattern, options) {\n super(pattern, ext(def, options))\n }\n }\n m.Minimatch.defaults = options => orig.defaults(ext(def, options)).Minimatch\n m.filter = (pattern, options) => orig.filter(pattern, ext(def, options))\n m.defaults = options => orig.defaults(ext(def, options))\n m.makeRe = (pattern, options) => orig.makeRe(pattern, ext(def, options))\n m.braceExpand = (pattern, options) => orig.braceExpand(pattern, ext(def, options))\n m.match = (list, pattern, options) => orig.match(list, pattern, ext(def, options))\n\n return m\n}\n\n\n\n\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nminimatch.braceExpand = (pattern, options) => braceExpand(pattern, options)\n\nconst braceExpand = (pattern, options = {}) => {\n assertValidPattern(pattern)\n\n // Thanks to Yeting Li <https://github.com/yetingli> for\n // improving this regexp to avoid a ReDOS vulnerability.\n if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n // shortcut. no need to expand.\n return [pattern]\n }\n\n return expand(pattern)\n}\n\nconst MAX_PATTERN_LENGTH = 1024 * 64\nconst assertValidPattern = pattern => {\n if (typeof pattern !== 'string') {\n throw new TypeError('invalid pattern')\n }\n\n if (pattern.length > MAX_PATTERN_LENGTH) {\n throw new TypeError('pattern is too long')\n }\n}\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion. Otherwise, any series\n// of * is equivalent to a single *. Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\nconst SUBPARSE = Symbol('subparse')\n\nminimatch.makeRe = (pattern, options) =>\n new Minimatch(pattern, options || {}).makeRe()\n\nminimatch.match = (list, pattern, options = {}) => {\n const mm = new Minimatch(pattern, options)\n list = list.filter(f => mm.match(f))\n if (mm.options.nonull && !list.length) {\n list.push(pattern)\n }\n return list\n}\n\n// replace stuff like \\* with *\nconst globUnescape = s => s.replace(/\\\\(.)/g, '$1')\nconst regExpEscape = s => s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\nclass Minimatch {\n constructor (pattern, options) {\n assertValidPattern(pattern)\n\n if (!options) options = {}\n\n this.options = options\n this.set = []\n this.pattern = pattern\n this.windowsPathsNoEscape = !!options.windowsPathsNoEscape ||\n options.allowWindowsEscape === false\n if (this.windowsPathsNoEscape) {\n this.pattern = this.pattern.replace(/\\\\/g, '/')\n }\n this.regexp = null\n this.negate = false\n this.comment = false\n this.empty = false\n this.partial = !!options.partial\n\n // make the set of regexps etc.\n this.make()\n }\n\n debug () {}\n\n make () {\n const pattern = this.pattern\n const options = this.options\n\n // empty patterns and comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n this.comment = true\n return\n }\n if (!pattern) {\n this.empty = true\n return\n }\n\n // step 1: figure out negation, etc.\n this.parseNegate()\n\n // step 2: expand braces\n let set = this.globSet = this.braceExpand()\n\n if (options.debug) this.debug = (...args) => console.error(...args)\n\n this.debug(this.pattern, set)\n\n // step 3: now we have a set, so turn each one into a series of path-portion\n // matching patterns.\n // These will be regexps, except in the case of \"**\", which is\n // set to the GLOBSTAR object for globstar behavior,\n // and will not contain any / characters\n set = this.globParts = set.map(s => s.split(slashSplit))\n\n this.debug(this.pattern, set)\n\n // glob --> regexps\n set = set.map((s, si, set) => s.map(this.parse, this))\n\n this.debug(this.pattern, set)\n\n // filter out everything that didn't compile properly.\n set = set.filter(s => s.indexOf(false) === -1)\n\n this.debug(this.pattern, set)\n\n this.set = set\n }\n\n parseNegate () {\n if (this.options.nonegate) return\n\n const pattern = this.pattern\n let negate = false\n let negateOffset = 0\n\n for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n negate = !negate\n negateOffset++\n }\n\n if (negateOffset) this.pattern = pattern.slice(negateOffset)\n this.negate = negate\n }\n\n // set partial to true to test if, for example,\n // \"/a/b\" matches the start of \"/*/b/*/d\"\n // Partial means, if you run out of file before you run\n // out of pattern, then that's fine, as long as all\n // the parts match.\n matchOne (file, pattern, partial) {\n var options = this.options\n\n this.debug('matchOne',\n { 'this': this, file: file, pattern: pattern })\n\n this.debug('matchOne', file.length, pattern.length)\n\n for (var fi = 0,\n pi = 0,\n fl = file.length,\n pl = pattern.length\n ; (fi < fl) && (pi < pl)\n ; fi++, pi++) {\n this.debug('matchOne loop')\n var p = pattern[pi]\n var f = file[fi]\n\n this.debug(pattern, p, f)\n\n // should be impossible.\n // some invalid regexp stuff in the set.\n /* istanbul ignore if */\n if (p === false) return false\n\n if (p === GLOBSTAR) {\n this.debug('GLOBSTAR', [pattern, p, f])\n\n // \"**\"\n // a/**/b/**/c would match the following:\n // a/b/x/y/z/c\n // a/x/y/z/b/c\n // a/b/x/b/x/c\n // a/b/c\n // To do this, take the rest of the pattern after\n // the **, and see if it would match the file remainder.\n // If so, return success.\n // If not, the ** \"swallows\" a segment, and try again.\n // This is recursively awful.\n //\n // a/**/b/**/c matching a/b/x/y/z/c\n // - a matches a\n // - doublestar\n // - matchOne(b/x/y/z/c, b/**/c)\n // - b matches b\n // - doublestar\n // - matchOne(x/y/z/c, c) -> no\n // - matchOne(y/z/c, c) -> no\n // - matchOne(z/c, c) -> no\n // - matchOne(c, c) yes, hit\n var fr = fi\n var pr = pi + 1\n if (pr === pl) {\n this.debug('** at the end')\n // a ** at the end will just swallow the rest.\n // We have found a match.\n // however, it will not swallow /.x, unless\n // options.dot is set.\n // . and .. are *never* matched by **, for explosively\n // exponential reasons.\n for (; fi < fl; fi++) {\n if (file[fi] === '.' || file[fi] === '..' ||\n (!options.dot && file[fi].charAt(0) === '.')) return false\n }\n return true\n }\n\n // ok, let's see if we can swallow whatever we can.\n while (fr < fl) {\n var swallowee = file[fr]\n\n this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee)\n\n // XXX remove this slice. Just pass the start index.\n if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n this.debug('globstar found match!', fr, fl, swallowee)\n // found a match.\n return true\n } else {\n // can't swallow \".\" or \"..\" ever.\n // can only swallow \".foo\" when explicitly asked.\n if (swallowee === '.' || swallowee === '..' ||\n (!options.dot && swallowee.charAt(0) === '.')) {\n this.debug('dot detected!', file, fr, pattern, pr)\n break\n }\n\n // ** swallows a segment, and continue.\n this.debug('globstar swallow a segment, and continue')\n fr++\n }\n }\n\n // no match was found.\n // However, in partial mode, we can't say this is necessarily over.\n // If there's more *pattern* left, then\n /* istanbul ignore if */\n if (partial) {\n // ran out of file\n this.debug('\\n>>> no match, partial?', file, fr, pattern, pr)\n if (fr === fl) return true\n }\n return false\n }\n\n // something other than **\n // non-magic patterns just have to match exactly\n // patterns with magic have been turned into regexps.\n var hit\n if (typeof p === 'string') {\n hit = f === p\n this.debug('string match', p, f, hit)\n } else {\n hit = f.match(p)\n this.debug('pattern match', p, f, hit)\n }\n\n if (!hit) return false\n }\n\n // Note: ending in / means that we'll get a final \"\"\n // at the end of the pattern. This can only match a\n // corresponding \"\" at the end of the file.\n // If the file ends in /, then it can only match a\n // a pattern that ends in /, unless the pattern just\n // doesn't have any more for it. But, a/b/ should *not*\n // match \"a/b/*\", even though \"\" matches against the\n // [^/]*? pattern, except in partial mode, where it might\n // simply not be reached yet.\n // However, a/b/ should still satisfy a/*\n\n // now either we fell off the end of the pattern, or we're done.\n if (fi === fl && pi === pl) {\n // ran out of pattern and filename at the same time.\n // an exact hit!\n return true\n } else if (fi === fl) {\n // ran out of file, but still had pattern left.\n // this is ok if we're doing the match as part of\n // a glob fs traversal.\n return partial\n } else /* istanbul ignore else */ if (pi === pl) {\n // ran out of pattern, still have file left.\n // this is only acceptable if we're on the very last\n // empty segment of a file with a trailing slash.\n // a/* should match a/b/\n return (fi === fl - 1) && (file[fi] === '')\n }\n\n // should be unreachable.\n /* istanbul ignore next */\n throw new Error('wtf?')\n }\n\n braceExpand () {\n return braceExpand(this.pattern, this.options)\n }\n\n parse (pattern, isSub) {\n assertValidPattern(pattern)\n\n const options = this.options\n\n // shortcuts\n if (pattern === '**') {\n if (!options.noglobstar)\n return GLOBSTAR\n else\n pattern = '*'\n }\n if (pattern === '') return ''\n\n let re = ''\n let hasMagic = !!options.nocase\n let escaping = false\n // ? => one single character\n const patternListStack = []\n const negativeLists = []\n let stateChar\n let inClass = false\n let reClassStart = -1\n let classStart = -1\n let cs\n let pl\n let sp\n // . and .. never match anything that doesn't start with .,\n // even when options.dot is set.\n const patternStart = pattern.charAt(0) === '.' ? '' // anything\n // not (start or / followed by . or .. followed by / or end)\n : options.dot ? '(?!(?:^|\\\\\\/)\\\\.{1,2}(?:$|\\\\\\/))'\n : '(?!\\\\.)'\n\n const clearStateChar = () => {\n if (stateChar) {\n // we had some state-tracking character\n // that wasn't consumed by this pass.\n switch (stateChar) {\n case '*':\n re += star\n hasMagic = true\n break\n case '?':\n re += qmark\n hasMagic = true\n break\n default:\n re += '\\\\' + stateChar\n break\n }\n this.debug('clearStateChar %j %j', stateChar, re)\n stateChar = false\n }\n }\n\n for (let i = 0, c; (i < pattern.length) && (c = pattern.charAt(i)); i++) {\n this.debug('%s\\t%s %s %j', pattern, i, re, c)\n\n // skip over any that are escaped.\n if (escaping) {\n /* istanbul ignore next - completely not allowed, even escaped. */\n if (c === '/') {\n return false\n }\n\n if (reSpecials[c]) {\n re += '\\\\'\n }\n re += c\n escaping = false\n continue\n }\n\n switch (c) {\n /* istanbul ignore next */\n case '/': {\n // Should already be path-split by now.\n return false\n }\n\n case '\\\\':\n clearStateChar()\n escaping = true\n continue\n\n // the various stateChar values\n // for the \"extglob\" stuff.\n case '?':\n case '*':\n case '+':\n case '@':\n case '!':\n this.debug('%s\\t%s %s %j <-- stateChar', pattern, i, re, c)\n\n // all of those are literals inside a class, except that\n // the glob [!a] means [^a] in regexp\n if (inClass) {\n this.debug(' in class')\n if (c === '!' && i === classStart + 1) c = '^'\n re += c\n continue\n }\n\n // if we already have a stateChar, then it means\n // that there was something like ** or +? in there.\n // Handle the stateChar, then proceed with this one.\n this.debug('call clearStateChar %j', stateChar)\n clearStateChar()\n stateChar = c\n // if extglob is disabled, then +(asdf|foo) isn't a thing.\n // just clear the statechar *now*, rather than even diving into\n // the patternList stuff.\n if (options.noext) clearStateChar()\n continue\n\n case '(':\n if (inClass) {\n re += '('\n continue\n }\n\n if (!stateChar) {\n re += '\\\\('\n continue\n }\n\n patternListStack.push({\n type: stateChar,\n start: i - 1,\n reStart: re.length,\n open: plTypes[stateChar].open,\n close: plTypes[stateChar].close\n })\n // negation is (?:(?!js)[^/]*)\n re += stateChar === '!' ? '(?:(?!(?:' : '(?:'\n this.debug('plType %j %j', stateChar, re)\n stateChar = false\n continue\n\n case ')':\n if (inClass || !patternListStack.length) {\n re += '\\\\)'\n continue\n }\n\n clearStateChar()\n hasMagic = true\n pl = patternListStack.pop()\n // negation is (?:(?!js)[^/]*)\n // The others are (?:<pattern>)<type>\n re += pl.close\n if (pl.type === '!') {\n negativeLists.push(pl)\n }\n pl.reEnd = re.length\n continue\n\n case '|':\n if (inClass || !patternListStack.length) {\n re += '\\\\|'\n continue\n }\n\n clearStateChar()\n re += '|'\n continue\n\n // these are mostly the same in regexp and glob\n case '[':\n // swallow any state-tracking char before the [\n clearStateChar()\n\n if (inClass) {\n re += '\\\\' + c\n continue\n }\n\n inClass = true\n classStart = i\n reClassStart = re.length\n re += c\n continue\n\n case ']':\n // a right bracket shall lose its special\n // meaning and represent itself in\n // a bracket expression if it occurs\n // first in the list. -- POSIX.2 2.8.3.2\n if (i === classStart + 1 || !inClass) {\n re += '\\\\' + c\n continue\n }\n\n // handle the case where we left a class open.\n // \"[z-a]\" is valid, equivalent to \"\\[z-a\\]\"\n // split where the last [ was, make sure we don't have\n // an invalid re. if so, re-walk the contents of the\n // would-be class to re-translate any characters that\n // were passed through as-is\n // TODO: It would probably be faster to determine this\n // without a try/catch and a new RegExp, but it's tricky\n // to do safely. For now, this is safe and works.\n cs = pattern.substring(classStart + 1, i)\n try {\n RegExp('[' + cs + ']')\n } catch (er) {\n // not a valid class!\n sp = this.parse(cs, SUBPARSE)\n re = re.substring(0, reClassStart) + '\\\\[' + sp[0] + '\\\\]'\n hasMagic = hasMagic || sp[1]\n inClass = false\n continue\n }\n\n // finish up the class.\n hasMagic = true\n inClass = false\n re += c\n continue\n\n default:\n // swallow any state char that wasn't consumed\n clearStateChar()\n\n if (reSpecials[c] && !(c === '^' && inClass)) {\n re += '\\\\'\n }\n\n re += c\n break\n\n } // switch\n } // for\n\n // handle the case where we left a class open.\n // \"[abc\" is valid, equivalent to \"\\[abc\"\n if (inClass) {\n // split where the last [ was, and escape it\n // this is a huge pita. We now have to re-walk\n // the contents of the would-be class to re-translate\n // any characters that were passed through as-is\n cs = pattern.slice(classStart + 1)\n sp = this.parse(cs, SUBPARSE)\n re = re.substring(0, reClassStart) + '\\\\[' + sp[0]\n hasMagic = hasMagic || sp[1]\n }\n\n // handle the case where we had a +( thing at the *end*\n // of the pattern.\n // each pattern list stack adds 3 chars, and we need to go through\n // and escape any | chars that were passed through as-is for the regexp.\n // Go through and escape them, taking care not to double-escape any\n // | chars that were already escaped.\n for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {\n let tail\n tail = re.slice(pl.reStart + pl.open.length)\n this.debug('setting tail', re, pl)\n // maybe some even number of \\, then maybe 1 \\, followed by a |\n tail = tail.replace(/((?:\\\\{2}){0,64})(\\\\?)\\|/g, (_, $1, $2) => {\n /* istanbul ignore else - should already be done */\n if (!$2) {\n // the | isn't already escaped, so escape it.\n $2 = '\\\\'\n }\n\n // need to escape all those slashes *again*, without escaping the\n // one that we need for escaping the | character. As it works out,\n // escaping an even number of slashes can be done by simply repeating\n // it exactly after itself. That's why this trick works.\n //\n // I am sorry that you have to see this.\n return $1 + $1 + $2 + '|'\n })\n\n this.debug('tail=%j\\n %s', tail, tail, pl, re)\n const t = pl.type === '*' ? star\n : pl.type === '?' ? qmark\n : '\\\\' + pl.type\n\n hasMagic = true\n re = re.slice(0, pl.reStart) + t + '\\\\(' + tail\n }\n\n // handle trailing things that only matter at the very end.\n clearStateChar()\n if (escaping) {\n // trailing \\\\\n re += '\\\\\\\\'\n }\n\n // only need to apply the nodot start if the re starts with\n // something that could conceivably capture a dot\n const addPatternStart = addPatternStartSet[re.charAt(0)]\n\n // Hack to work around lack of negative lookbehind in JS\n // A pattern like: *.!(x).!(y|z) needs to ensure that a name\n // like 'a.xyz.yz' doesn't match. So, the first negative\n // lookahead, has to look ALL the way ahead, to the end of\n // the pattern.\n for (let n = negativeLists.length - 1; n > -1; n--) {\n const nl = negativeLists[n]\n\n const nlBefore = re.slice(0, nl.reStart)\n const nlFirst = re.slice(nl.reStart, nl.reEnd - 8)\n let nlAfter = re.slice(nl.reEnd)\n const nlLast = re.slice(nl.reEnd - 8, nl.reEnd) + nlAfter\n\n // Handle nested stuff like *(*.js|!(*.json)), where open parens\n // mean that we should *not* include the ) in the bit that is considered\n // \"after\" the negated section.\n const openParensBefore = nlBefore.split('(').length - 1\n let cleanAfter = nlAfter\n for (let i = 0; i < openParensBefore; i++) {\n cleanAfter = cleanAfter.replace(/\\)[+*?]?/, '')\n }\n nlAfter = cleanAfter\n\n const dollar = nlAfter === '' && isSub !== SUBPARSE ? '$' : ''\n re = nlBefore + nlFirst + nlAfter + dollar + nlLast\n }\n\n // if the re is not \"\" at this point, then we need to make sure\n // it doesn't match against an empty path part.\n // Otherwise a/* will match a/, which it should not.\n if (re !== '' && hasMagic) {\n re = '(?=.)' + re\n }\n\n if (addPatternStart) {\n re = patternStart + re\n }\n\n // parsing just a piece of a larger pattern.\n if (isSub === SUBPARSE) {\n return [re, hasMagic]\n }\n\n // skip the regexp for non-magical patterns\n // unescape anything in it, though, so that it'll be\n // an exact match against a file etc.\n if (!hasMagic) {\n return globUnescape(pattern)\n }\n\n const flags = options.nocase ? 'i' : ''\n try {\n return Object.assign(new RegExp('^' + re + '$', flags), {\n _glob: pattern,\n _src: re,\n })\n } catch (er) /* istanbul ignore next - should be impossible */ {\n // If it was an invalid regular expression, then it can't match\n // anything. This trick looks for a character after the end of\n // the string, which is of course impossible, except in multi-line\n // mode, but it's not a /m regex.\n return new RegExp('$.')\n }\n }\n\n makeRe () {\n if (this.regexp || this.regexp === false) return this.regexp\n\n // at this point, this.set is a 2d array of partial\n // pattern strings, or \"**\".\n //\n // It's better to use .match(). This function shouldn't\n // be used, really, but it's pretty convenient sometimes,\n // when you just want to work with a regex.\n const set = this.set\n\n if (!set.length) {\n this.regexp = false\n return this.regexp\n }\n const options = this.options\n\n const twoStar = options.noglobstar ? star\n : options.dot ? twoStarDot\n : twoStarNoDot\n const flags = options.nocase ? 'i' : ''\n\n // coalesce globstars and regexpify non-globstar patterns\n // if it's the only item, then we just do one twoStar\n // if it's the first, and there are more, prepend (\\/|twoStar\\/)? to next\n // if it's the last, append (\\/twoStar|) to previous\n // if it's in the middle, append (\\/|\\/twoStar\\/) to previous\n // then filter out GLOBSTAR symbols\n let re = set.map(pattern => {\n pattern = pattern.map(p =>\n typeof p === 'string' ? regExpEscape(p)\n : p === GLOBSTAR ? GLOBSTAR\n : p._src\n ).reduce((set, p) => {\n if (!(set[set.length - 1] === GLOBSTAR && p === GLOBSTAR)) {\n set.push(p)\n }\n return set\n }, [])\n pattern.forEach((p, i) => {\n if (p !== GLOBSTAR || pattern[i-1] === GLOBSTAR) {\n return\n }\n if (i === 0) {\n if (pattern.length > 1) {\n pattern[i+1] = '(?:\\\\\\/|' + twoStar + '\\\\\\/)?' + pattern[i+1]\n } else {\n pattern[i] = twoStar\n }\n } else if (i === pattern.length - 1) {\n pattern[i-1] += '(?:\\\\\\/|' + twoStar + ')?'\n } else {\n pattern[i-1] += '(?:\\\\\\/|\\\\\\/' + twoStar + '\\\\\\/)' + pattern[i+1]\n pattern[i+1] = GLOBSTAR\n }\n })\n return pattern.filter(p => p !== GLOBSTAR).join('/')\n }).join('|')\n\n // must match entire pattern\n // ending in a * or ** will make it less strict.\n re = '^(?:' + re + ')$'\n\n // can match anything, as long as it's not this.\n if (this.negate) re = '^(?!' + re + ').*$'\n\n try {\n this.regexp = new RegExp(re, flags)\n } catch (ex) /* istanbul ignore next - should be impossible */ {\n this.regexp = false\n }\n return this.regexp\n }\n\n match (f, partial = this.partial) {\n this.debug('match', f, this.pattern)\n // short-circuit in the case of busted things.\n // comments, etc.\n if (this.comment) return false\n if (this.empty) return f === ''\n\n if (f === '/' && partial) return true\n\n const options = this.options\n\n // windows: need to use /, not \\\n if (path.sep !== '/') {\n f = f.split(path.sep).join('/')\n }\n\n // treat the test path as a set of pathparts.\n f = f.split(slashSplit)\n this.debug(this.pattern, 'split', f)\n\n // just ONE of the pattern sets in this.set needs to match\n // in order for it to be valid. If negating, then just one\n // match means that we have failed.\n // Either way, return on the first hit.\n\n const set = this.set\n this.debug(this.pattern, 'set', set)\n\n // Find the basename of the path by looking for the last non-empty segment\n let filename\n for (let i = f.length - 1; i >= 0; i--) {\n filename = f[i]\n if (filename) break\n }\n\n for (let i = 0; i < set.length; i++) {\n const pattern = set[i]\n let file = f\n if (options.matchBase && pattern.length === 1) {\n file = [filename]\n }\n const hit = this.matchOne(file, pattern, partial)\n if (hit) {\n if (options.flipNegate) return true\n return !this.negate\n }\n }\n\n // didn't get any hits. this is success if it's a negative\n // pattern, failure otherwise.\n if (options.flipNegate) return false\n return this.negate\n }\n\n static defaults (def) {\n return minimatch.defaults(def).Minimatch\n }\n}\n\nminimatch.Minimatch = Minimatch\n", "const fp = require('path')\nconst minimatch = require('minimatch')\n\nfunction checkIfFilePathIsIgnored(filePath, rootPath, formattingOptions) {\n\tif (!formattingOptions.ignoreFiles) {\n\t\treturn false\n\t}\n\n\tconst fullPath = fp.isAbsolute(filePath) ? filePath : fp.join(rootPath, filePath)\n\tconst relaPath = fullPath.substring(rootPath.length).replace(/\\\\/g, '/').replace(/^\\//, '')\n\treturn formattingOptions.ignoreFiles.some(pattern => minimatch(relaPath, pattern))\n}\n\nmodule.exports = checkIfFilePathIsIgnored\n", "function findParentNode(inputNode, condition) {\n\tconst workingNode = inputNode && inputNode.parent\n\tif (!workingNode) {\n\t\treturn null\n\n\t} else if (condition(workingNode)) {\n\t\treturn workingNode\n\n\t} else {\n\t\treturn findParentNode(workingNode, condition)\n\t}\n}\n\nmodule.exports = findParentNode", "module.exports.format = require('./format')\nmodule.exports.schema = require('./schema')\nmodule.exports.createFormattingOptions = require('./createFormattingOptions')\nmodule.exports.createFormattingOptionsFromStylint = require('./createFormattingOptionsFromStylint')\nmodule.exports.checkIfFilePathIsIgnored = require('./checkIfFilePathIsIgnored')\nmodule.exports.findParentNode = require('./findParentNode')\nmodule.exports.findChildNodes = require('./findChildNodes')", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "// tslint:disable\n/* auto generator by `generate-index ./src/` */\nexport type {\n VLSFormatConfig,\n VLSConfig,\n VLSFullConfig,\n BasicComponentInfo,\n Glob,\n VeturProject,\n VeturFullConfig,\n VeturConfig\n} from './config';\nexport { getDefaultVLSConfig, getVeturFullConfig } from './config';\nexport { logger } from './log';\nexport type {\n DocumentContext,\n BaseCodeActionData,\n RefactorActionData,\n CombinedFixActionData,\n OrganizeImportsActionData,\n CodeActionData,\n SemanticTokenData,\n SemanticTokenOffsetData\n} from './types';\nexport { CodeActionDataKind } from './types';\nexport type { LanguageId, LanguageRange, VueDocumentRegions } from './embeddedSupport/embeddedSupport';\nexport {\n getVueDocumentRegions,\n getSingleLanguageDocument,\n getSingleTypeDocument,\n getLanguageRangesOfType\n} from './embeddedSupport/embeddedSupport';\nexport type { LanguageModelCache } from './embeddedSupport/languageModelCache';\nexport { getLanguageModelCache } from './embeddedSupport/languageModelCache';\nexport type { VLSServices, LanguageMode, LanguageModeRange } from './embeddedSupport/languageModes';\nexport { LanguageModes } from './embeddedSupport/languageModes';\nexport type { RegionType, EmbeddedRegion } from './embeddedSupport/vueDocumentRegionParser';\nexport { parseVueDocumentRegions } from './embeddedSupport/vueDocumentRegionParser';\nexport { NULL_HOVER, NULL_SIGNATURE, NULL_COMPLETION, nullMode } from './modes/nullMode';\nexport type { EnvironmentService } from './services/EnvironmentService';\nexport { createEnvironmentService } from './services/EnvironmentService';\nexport type { RefTokensService } from './services/RefTokenService';\nexport { createRefTokensService } from './services/RefTokenService';\nexport type { RuntimeLibrary, DependencyService } from './services/dependencyService';\nexport { createNodeModulesPaths, createDependencyService } from './services/dependencyService';\nexport { DocumentService } from './services/documentService';\nexport type { ProjectService } from './services/projectService';\nexport { createProjectService } from './services/projectService';\nexport { VLS } from './services/vls';\nexport type {\n VueFileInfo,\n ComponentInfo,\n ChildComponent,\n EmitInfo,\n PropInfo,\n DataInfo,\n ComputedInfo,\n MethodInfo\n} from './services/vueInfoService';\nexport { VueInfoService } from './services/vueInfoService';\nexport type { VCancellationToken } from './utils/cancellationToken';\nexport { isVCancellationRequested, VCancellationTokenSource } from './utils/cancellationToken';\nexport {\n getFileFsPath,\n getFilePath,\n normalizeFileNameToFsPath,\n normalizeFileNameResolve,\n getPathDepth,\n getFsPathToUri,\n normalizeAbsolutePath\n} from './utils/paths';\nexport { sleep } from './utils/sleep';\nexport {\n getWordAtText,\n removeQuotes,\n indentSection,\n toMarkupContent,\n modulePathToValidIdentifier\n} from './utils/strings';\nexport { getVueVersionKey, inferVueVersion, VueVersion } from './utils/vueVersion';\nexport { findConfigFile, requireUncached } from './utils/workspace';\nexport type { AutoImportSfcPlugin } from './modes/plugins/autoImportSfcPlugin';\nexport { createAutoImportSfcPlugin } from './modes/plugins/autoImportSfcPlugin';\nexport { getPugMode } from './modes/pug/index';\nexport { findTokenAtPosition, locToRange } from './modes/pug/languageService';\nexport type { TSCodeActionKind } from './modes/script/CodeActionKindConverter';\nexport { getCodeActionKind } from './modes/script/CodeActionKindConverter';\nexport type { InternalChildComponent } from './modes/script/childComponents';\nexport { analyzeComponentsDefine } from './modes/script/childComponents';\nexport {\n getComponentInfo,\n analyzeDefaultExportExpr,\n getDefaultExportNode,\n getLastChild,\n isClassType,\n getClassDecoratorArgumentType,\n buildDocumentation\n} from './modes/script/componentInfo';\nexport { getGlobalComponents } from './modes/script/globalComponents';\nexport { getJavascriptMode, languageServiceIncludesFile, getFormatCodeSettings } from './modes/script/javascript';\nexport { getTagDocumentation, plain } from './modes/script/previewer';\nexport {\n getSemanticTokenLegends,\n getTokenTypeFromClassification,\n getTokenModifierFromClassification,\n addCompositionApiRefTokens,\n TsTokenType,\n TokenModifier\n} from './modes/script/semanticToken';\nexport { StylePriority } from './modes/style/emmet';\nexport { getCSSMode, getPostCSSMode, getSCSSMode, getLESSMode } from './modes/style/index';\nexport { HTMLMode } from './modes/template/htmlMode';\nexport { VueHTMLMode } from './modes/template/index';\nexport { VueInterpolationMode } from './modes/template/interpolationMode';\nexport type { Modifier } from './modes/template/modifierProvider';\nexport { getModifierProvider } from './modes/template/modifierProvider';\nexport { getTagDefinition } from './modes/template-common/tagDefinition';\nexport type { CompletionTestSetup } from './modes/test-util/completion-test-util';\nexport { testDSL, CompletionAsserter } from './modes/test-util/completion-test-util';\nexport type { HoverTestSetup } from './modes/test-util/hover-test-util';\nexport { hoverDSL, HoverAsserter } from './modes/test-util/hover-test-util';\nexport { getVueMode } from './modes/vue/index';\nexport type { ScaffoldSnippetSources } from './modes/vue/snippets';\nexport { SnippetManager } from './modes/vue/snippets';\nexport { moduleName, fileName, preVue25Content, vue25Content, vue30Content } from './services/typescriptService/bridge';\nexport { ModuleResolutionCache } from './services/typescriptService/moduleResolutionCache';\nexport {\n parseVueScript,\n parseVueTemplate,\n createUpdater,\n injectVueTemplate\n} from './services/typescriptService/preprocess';\nexport type { IServiceHost } from './services/typescriptService/serviceHost';\nexport { getServiceHost, templateSourceMap } from './services/typescriptService/serviceHost';\nexport type { TemplateSourceMapNode, TemplateSourceMap } from './services/typescriptService/sourceMap';\nexport {\n generateSourceMap,\n mapFromPositionToOffset,\n mapToRange,\n mapBackRange,\n printSourceMap,\n stringifySourceMapNodes\n} from './services/typescriptService/sourceMap';\nexport { createTemplateDiagnosticFilter as createTemplateDiagnosticFilter } from './services/typescriptService/diagnosticFilter';\nexport {\n getTemplateTransformFunctions,\n renderHelperName,\n componentHelperName,\n iterationHelperName,\n componentDataName,\n globalScope\n} from './services/typescriptService/transformTemplate';\nexport {\n isVueFile,\n isVirtualVueFile,\n isVirtualVueTemplateFile,\n findNodeByOffset,\n toCompletionItemKind,\n toSymbolKind\n} from './services/typescriptService/util';\nexport { getVueSys } from './services/typescriptService/vueSys';\nexport { walkExpression } from './services/typescriptService/walkExpression';\nexport { prettierify, prettierEslintify, prettierTslintify, prettierPluginPugify } from './utils/prettier/index';\nexport { SassLanguageMode } from './modes/style/sass/sassLanguageMode';\nexport { default as builtIn } from './modes/style/stylus/built-in';\nexport {\n isClassOrId,\n isAtRule,\n isValue,\n getPropertyName,\n findPropertySchema,\n getAllSymbols,\n getAtRules,\n getProperties,\n getValues,\n provideCompletionItems\n} from './modes/style/stylus/completion-item';\nexport type { LoadedCSSData } from './modes/style/stylus/css-browser-data';\nexport { cssData } from './modes/style/stylus/css-browser-data';\nexport { default as cssColors } from './modes/style/stylus/css-colors-list';\nexport { getStylusMode, wordPattern } from './modes/style/stylus/index';\nexport type { StylusNode } from './modes/style/stylus/parser';\nexport {\n isVariableNode,\n isFunctionNode,\n isSelectorNode,\n isSelectorCallNode,\n isAtRuleNode,\n isColor,\n buildAst,\n flattenAndFilterAst,\n findNodeAtPosition\n} from './modes/style/stylus/parser';\nexport { stylusHover } from './modes/style/stylus/stylus-hover';\nexport type { IStylusSupremacy } from './modes/style/stylus/stylus-supremacy';\nexport { provideDocumentSymbols } from './modes/style/stylus/symbols-finder';\nexport type { HTMLDocument } from './modes/template/parser/htmlParser';\nexport { parse, parseHTMLDocument, Node } from './modes/template/parser/htmlParser';\nexport type { Scanner } from './modes/template/parser/htmlScanner';\nexport { createScanner, HtmlTokenType, ScannerState } from './modes/template/parser/htmlScanner';\nexport { doComplete, normalizeAttributeNameToKebabCase } from './modes/template/services/htmlCompletion';\nexport { findDefinition } from './modes/template/services/htmlDefinition';\nexport { doESLintValidation, createLintEngine } from './modes/template/services/htmlEslintValidation';\nexport { getFoldingRanges } from './modes/template/services/htmlFolding';\nexport { htmlFormat } from './modes/template/services/htmlFormat';\nexport { findDocumentHighlights } from './modes/template/services/htmlHighlighting';\nexport { doHover } from './modes/template/services/htmlHover';\nexport { findDocumentLinks } from './modes/template/services/htmlLinks';\nexport { findDocumentSymbols } from './modes/template/services/htmlSymbolsProvider';\nexport { isInsideInterpolation } from './modes/template/services/isInsideInterpolation';\nexport { doPropValidation } from './modes/template/services/vuePropValidation';\nexport type {\n Attribute,\n AttributeCollector,\n IHTMLTagProvider,\n ITagSet,\n IValueSets\n} from './modes/template/tagProviders/common';\nexport {\n getSameTagInSet,\n collectTagsDefault,\n collectAttributesDefault,\n collectValuesDefault,\n genAttribute,\n TagProviderPriority,\n HTMLTagSpecification\n} from './modes/template/tagProviders/common';\nexport { getComponentInfoTagProvider } from './modes/template/tagProviders/componentInfoTagProvider';\nexport {\n getWorkspaceTagProvider,\n getDependencyTagProvider,\n getExternalTagProvider,\n elementTagProvider,\n onsenTagProvider,\n bootstrapTagProvider,\n gridsomeTagProvider\n} from './modes/template/tagProviders/externalTagProviders';\nexport { isVoidElement, getHTML5TagProvider, VOID_ELEMENTS, HTML_TAGS } from './modes/template/tagProviders/htmlTags';\nexport type { CompletionConfiguration } from './modes/template/tagProviders/index';\nexport { getTagProviderSettings, getEnabledTagProviders, allTagProviders } from './modes/template/tagProviders/index';\nexport { getNuxtTagProvider } from './modes/template/tagProviders/nuxtTags';\nexport { getRouterTagProvider } from './modes/template/tagProviders/routerTags';\nexport { getVueTagProvider } from './modes/template/tagProviders/vueTags';\n/* auto generator end */\n", "import path, { isAbsolute } from 'path';\nimport {\n getPathDepth,\n normalizeFileNameToFsPath,\n normalizeFileNameResolve,\n normalizeAbsolutePath\n} from './utils/paths';\nimport fg from 'fast-glob';\nimport { findConfigFile } from './utils/workspace';\nimport { flatten } from 'lodash';\n\nexport interface VLSFormatConfig {\n defaultFormatter: {\n [lang: string]: string;\n };\n defaultFormatterOptions: {\n [lang: string]: any;\n };\n scriptInitialIndent: boolean;\n styleInitialIndent: boolean;\n options: {\n tabSize: number;\n useTabs: boolean;\n };\n}\n\nexport interface VLSConfig {\n vetur: {\n ignoreProjectWarning: boolean;\n useWorkspaceDependencies: boolean;\n completion: {\n autoImport: boolean;\n tagCasing: 'initial' | 'kebab';\n scaffoldSnippetSources: {\n workspace: string;\n user: string;\n vetur: string;\n };\n };\n grammar: {\n customBlocks: { [lang: string]: string };\n };\n validation: {\n template: boolean;\n templateProps: boolean;\n interpolation: boolean;\n style: boolean;\n script: boolean;\n };\n format: {\n enable: boolean;\n options: {\n tabSize: number;\n useTabs: boolean;\n };\n defaultFormatter: {\n [lang: string]: string;\n };\n defaultFormatterOptions: {\n [lang: string]: {};\n };\n scriptInitialIndent: boolean;\n styleInitialIndent: boolean;\n };\n languageFeatures: {\n codeActions: boolean;\n updateImportOnFileMove: boolean;\n semanticTokens: boolean;\n };\n trace: {\n server: 'off' | 'messages' | 'verbose';\n };\n dev: {\n vlsPath: string;\n vlsPort: number;\n logLevel: 'INFO' | 'DEBUG';\n };\n experimental: {\n templateInterpolationService: boolean;\n };\n };\n}\n\nexport interface VLSFullConfig extends VLSConfig {\n emmet?: any;\n html?: any;\n css?: any;\n sass?: any;\n javascript?: any;\n typescript?: any;\n prettier?: any;\n stylusSupremacy?: any;\n languageStylus?: any;\n}\n\nexport function getDefaultVLSConfig(): VLSFullConfig {\n return {\n vetur: {\n ignoreProjectWarning: false,\n useWorkspaceDependencies: false,\n validation: {\n template: true,\n templateProps: false,\n interpolation: true,\n style: true,\n script: true\n },\n completion: {\n autoImport: false,\n tagCasing: 'initial',\n scaffoldSnippetSources: {\n workspace: '\uD83D\uDCBC',\n user: '\uD83D\uDDD2\uFE0F',\n vetur: '\u270C'\n }\n },\n grammar: {\n customBlocks: {}\n },\n format: {\n enable: true,\n options: {\n tabSize: 2,\n useTabs: false\n },\n defaultFormatter: {},\n defaultFormatterOptions: {},\n scriptInitialIndent: false,\n styleInitialIndent: false\n },\n languageFeatures: {\n codeActions: true,\n updateImportOnFileMove: true,\n semanticTokens: true\n },\n trace: {\n server: 'off'\n },\n dev: {\n vlsPath: '',\n vlsPort: -1,\n logLevel: 'INFO'\n },\n experimental: {\n templateInterpolationService: false\n }\n },\n css: {},\n html: {\n suggest: {}\n },\n javascript: {\n format: {}\n },\n typescript: {\n tsdk: null,\n format: {}\n },\n emmet: {},\n stylusSupremacy: {},\n languageStylus: {}\n };\n}\n\nexport interface BasicComponentInfo {\n name: string;\n path: string;\n}\n\nexport type Glob = string;\n\nexport interface VeturProject<C = BasicComponentInfo | Glob> {\n root: string;\n package?: string;\n tsconfig?: string;\n snippetFolder: string;\n globalComponents: C[];\n}\n\nexport interface VeturFullConfig {\n settings: Record<string, boolean | string | number>;\n projects: VeturProject<BasicComponentInfo>[];\n}\n\nexport type VeturConfig = Partial<Pick<VeturFullConfig, 'settings'>> & {\n projects?: Array<string | (Pick<VeturProject, 'root'> & Partial<VeturProject>)>;\n};\n\nexport async function getVeturFullConfig(\n rootPathForConfig: string,\n workspacePath: string,\n veturConfig: VeturConfig\n): Promise<VeturFullConfig> {\n const oldProjects = veturConfig.projects ?? [workspacePath];\n const projects = oldProjects\n .map(project => {\n const getFallbackPackagePath = (projectRoot: string) => {\n const fallbackPackage = findConfigFile(projectRoot, 'package.json');\n return fallbackPackage ? normalizeFileNameToFsPath(fallbackPackage) : undefined;\n };\n const getFallbackTsconfigPath = (projectRoot: string) => {\n const jsconfigPath = findConfigFile(projectRoot, 'jsconfig.json');\n const tsconfigPath = findConfigFile(projectRoot, 'tsconfig.json');\n if (jsconfigPath && tsconfigPath) {\n const tsconfigFsPath = normalizeFileNameToFsPath(tsconfigPath);\n const jsconfigFsPath = normalizeFileNameToFsPath(jsconfigPath);\n return getPathDepth(tsconfigPath, '/') >= getPathDepth(jsconfigFsPath, '/') ? tsconfigFsPath : jsconfigFsPath;\n }\n const configPath = tsconfigPath || jsconfigPath;\n return configPath ? normalizeFileNameToFsPath(configPath) : undefined;\n };\n\n if (typeof project === 'string') {\n const projectRoot = normalizeAbsolutePath(project, rootPathForConfig);\n\n return {\n root: projectRoot,\n package: getFallbackPackagePath(projectRoot),\n tsconfig: getFallbackTsconfigPath(projectRoot),\n snippetFolder: normalizeFileNameResolve(projectRoot, '.vscode/vetur/snippets'),\n globalComponents: []\n } as VeturProject;\n }\n\n const projectRoot = normalizeAbsolutePath(project.root, rootPathForConfig);\n return {\n root: projectRoot,\n package: project.package\n ? normalizeAbsolutePath(project.package, projectRoot)\n : getFallbackPackagePath(projectRoot),\n tsconfig: project.tsconfig\n ? normalizeAbsolutePath(project.tsconfig, projectRoot)\n : getFallbackTsconfigPath(projectRoot),\n snippetFolder: project.snippetFolder\n ? normalizeAbsolutePath(project.snippetFolder, projectRoot)\n : normalizeFileNameResolve(projectRoot, '.vscode/vetur/snippets'),\n globalComponents: flatten(\n project.globalComponents?.map(comp => {\n if (typeof comp === 'string') {\n return fg.sync(comp, { cwd: projectRoot, absolute: true, suppressErrors: true }).map(fileName => ({\n name: path.basename(fileName, path.extname(fileName)),\n path: normalizeFileNameToFsPath(fileName)\n }));\n }\n return comp;\n }) ?? []\n )\n } as VeturProject<BasicComponentInfo>;\n })\n .sort((a, b) => {\n const r = getPathDepth(b.root, '/') - getPathDepth(a.root, '/');\n if (r !== 0) {\n return r;\n }\n return b.root.length - a.root.length;\n });\n\n return {\n settings: veturConfig.settings ?? {},\n projects\n } as VeturFullConfig;\n}\n", "import { platform } from 'os';\nimport { isAbsolute, resolve } from 'path';\nimport { URI } from 'vscode-uri';\n\n/**\n * Vetur mainly deals with paths / uris from two objects\n *\n * - `TextDocument` from `vscode-languageserver`\n * - `SourceFile` from `typescript`\n *\n * TypeScript Language Service uses `fileName`, which is a file path without scheme.\n * Convert them into standard URI by `Uri.file`.\n *\n * ## `TextDocument.uri`\n *\n * - macOS / Linux: file:///foo/bar.vue\n * - Windows: file:///c%3A/foo/bar.vue (%3A is `:`)\n *\n * ## `SourceFile.fileName`\n *\n * - macOS / Linux: /foo/bar.vue\n * - Windows: c:/foo/bar.vue\n *\n * ## vscode-uri\n *\n * - `Uri.parse`: Takes full URI starting with `file://`\n * - `Uri.file`: Takes file path\n *\n * ### `fsPath` vs `path`\n *\n * - macOS / Linux:\n * ```\n * > Uri.parse('file:///foo/bar.vue').fsPath\n * '/foo/bar.vue'\n * > Uri.parse('file:///foo/bar.vue').path\n * '/foo/bar.vue'\n * ```\n * - Windows\n * ```\n * > Uri.parse('file:///c%3A/foo/bar.vue').fsPath\n * 'c:\\\\foo\\\\bar.vue' (\\\\ escapes to \\)\n * > Uri.parse('file:///c%3A/foo/bar.vue').path\n * '/c:/foo/bar.vue'\n * ```\n */\n\nexport function getFileFsPath(documentUri: string): string {\n return URI.parse(documentUri).fsPath;\n}\n\nexport function getFilePath(documentUri: string): string {\n const IS_WINDOWS = platform() === 'win32';\n if (IS_WINDOWS) {\n // Windows have a leading slash like /C:/Users/pine\n // vscode-uri use lower-case drive letter\n // https://github.com/microsoft/vscode-uri/blob/95e03c06f87d38f25eda1ae3c343fe5b7eec3f52/src/index.ts#L1017\n return URI.parse(documentUri).path.replace(/^\\/[a-zA-Z]/, (s: string) => s.slice(1).toLowerCase());\n } else {\n return URI.parse(documentUri).path;\n }\n}\n\nexport function normalizeFileNameToFsPath(fileName: string) {\n return URI.file(fileName).fsPath;\n}\n\nexport function normalizeFileNameResolve(...paths: string[]) {\n return normalizeFileNameToFsPath(resolve(...paths));\n}\n\nexport function getPathDepth(filePath: string, sep: string) {\n return filePath.split(sep).length;\n}\n\nexport function getFsPathToUri(fsPath: string) {\n return URI.file(fsPath).toString();\n}\n\nexport function normalizeAbsolutePath(fsPath: string, root: string) {\n return isAbsolute(fsPath) ? normalizeFileNameToFsPath(fsPath) : normalizeFileNameResolve(root, fsPath);\n}\n", "// 'path' module extracted from Node.js v8.11.1 (only the posix part)\n// transplited with Babel\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nfunction assertPath(path) {\n if (typeof path !== 'string') {\n throw new TypeError('Path must be a string. Received ' + JSON.stringify(path));\n }\n}\n\n// Resolves . and .. elements in a path with directory names\nfunction normalizeStringPosix(path, allowAboveRoot) {\n var res = '';\n var lastSegmentLength = 0;\n var lastSlash = -1;\n var dots = 0;\n var code;\n for (var i = 0; i <= path.length; ++i) {\n if (i < path.length)\n code = path.charCodeAt(i);\n else if (code === 47 /*/*/)\n break;\n else\n code = 47 /*/*/;\n if (code === 47 /*/*/) {\n if (lastSlash === i - 1 || dots === 1) {\n // NOOP\n } else if (lastSlash !== i - 1 && dots === 2) {\n if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 /*.*/ || res.charCodeAt(res.length - 2) !== 46 /*.*/) {\n if (res.length > 2) {\n var lastSlashIndex = res.lastIndexOf('/');\n if (lastSlashIndex !== res.length - 1) {\n if (lastSlashIndex === -1) {\n res = '';\n lastSegmentLength = 0;\n } else {\n res = res.slice(0, lastSlashIndex);\n lastSegmentLength = res.length - 1 - res.lastIndexOf('/');\n }\n lastSlash = i;\n dots = 0;\n continue;\n }\n } else if (res.length === 2 || res.length === 1) {\n res = '';\n lastSegmentLength = 0;\n lastSlash = i;\n dots = 0;\n continue;\n }\n }\n if (allowAboveRoot) {\n if (res.length > 0)\n res += '/..';\n else\n res = '..';\n lastSegmentLength = 2;\n }\n } else {\n if (res.length > 0)\n res += '/' + path.slice(lastSlash + 1, i);\n else\n res = path.slice(lastSlash + 1, i);\n lastSegmentLength = i - lastSlash - 1;\n }\n lastSlash = i;\n dots = 0;\n } else if (code === 46 /*.*/ && dots !== -1) {\n ++dots;\n } else {\n dots = -1;\n }\n }\n return res;\n}\n\nfunction _format(sep, pathObject) {\n var dir = pathObject.dir || pathObject.root;\n var base = pathObject.base || (pathObject.name || '') + (pathObject.ext || '');\n if (!dir) {\n return base;\n }\n if (dir === pathObject.root) {\n return dir + base;\n }\n return dir + sep + base;\n}\n\nvar posix = {\n // path.resolve([from ...], to)\n resolve: function resolve() {\n var resolvedPath = '';\n var resolvedAbsolute = false;\n var cwd;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path;\n if (i >= 0)\n path = arguments[i];\n else {\n if (cwd === undefined)\n cwd = process.cwd();\n path = cwd;\n }\n\n assertPath(path);\n\n // Skip empty entries\n if (path.length === 0) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charCodeAt(0) === 47 /*/*/;\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute);\n\n if (resolvedAbsolute) {\n if (resolvedPath.length > 0)\n return '/' + resolvedPath;\n else\n return '/';\n } else if (resolvedPath.length > 0) {\n return resolvedPath;\n } else {\n return '.';\n }\n },\n\n normalize: function normalize(path) {\n assertPath(path);\n\n if (path.length === 0) return '.';\n\n var isAbsolute = path.charCodeAt(0) === 47 /*/*/;\n var trailingSeparator = path.charCodeAt(path.length - 1) === 47 /*/*/;\n\n // Normalize the path\n path = normalizeStringPosix(path, !isAbsolute);\n\n if (path.length === 0 && !isAbsolute) path = '.';\n if (path.length > 0 && trailingSeparator) path += '/';\n\n if (isAbsolute) return '/' + path;\n return path;\n },\n\n isAbsolute: function isAbsolute(path) {\n assertPath(path);\n return path.length > 0 && path.charCodeAt(0) === 47 /*/*/;\n },\n\n join: function join() {\n if (arguments.length === 0)\n return '.';\n var joined;\n for (var i = 0; i < arguments.length; ++i) {\n var arg = arguments[i];\n assertPath(arg);\n if (arg.length > 0) {\n if (joined === undefined)\n joined = arg;\n else\n joined += '/' + arg;\n }\n }\n if (joined === undefined)\n return '.';\n return posix.normalize(joined);\n },\n\n relative: function relative(from, to) {\n assertPath(from);\n assertPath(to);\n\n if (from === to) return '';\n\n from = posix.resolve(from);\n to = posix.resolve(to);\n\n if (from === to) return '';\n\n // Trim any leading backslashes\n var fromStart = 1;\n for (; fromStart < from.length; ++fromStart) {\n if (from.charCodeAt(fromStart) !== 47 /*/*/)\n break;\n }\n var fromEnd = from.length;\n var fromLen = fromEnd - fromStart;\n\n // Trim any leading backslashes\n var toStart = 1;\n for (; toStart < to.length; ++toStart) {\n if (to.charCodeAt(toStart) !== 47 /*/*/)\n break;\n }\n var toEnd = to.length;\n var toLen = toEnd - toStart;\n\n // Compare paths to find the longest common path from root\n var length = fromLen < toLen ? fromLen : toLen;\n var lastCommonSep = -1;\n var i = 0;\n for (; i <= length; ++i) {\n if (i === length) {\n if (toLen > length) {\n if (to.charCodeAt(toStart + i) === 47 /*/*/) {\n // We get here if `from` is the exact base path for `to`.\n // For example: from='/foo/bar'; to='/foo/bar/baz'\n return to.slice(toStart + i + 1);\n } else if (i === 0) {\n // We get here if `from` is the root\n // For example: from='/'; to='/foo'\n return to.slice(toStart + i);\n }\n } else if (fromLen > length) {\n if (from.charCodeAt(fromStart + i) === 47 /*/*/) {\n // We get here if `to` is the exact base path for `from`.\n // For example: from='/foo/bar/baz'; to='/foo/bar'\n lastCommonSep = i;\n } else if (i === 0) {\n // We get here if `to` is the root.\n // For example: from='/foo'; to='/'\n lastCommonSep = 0;\n }\n }\n break;\n }\n var fromCode = from.charCodeAt(fromStart + i);\n var toCode = to.charCodeAt(toStart + i);\n if (fromCode !== toCode)\n break;\n else if (fromCode === 47 /*/*/)\n lastCommonSep = i;\n }\n\n var out = '';\n // Generate the relative path based on the path difference between `to`\n // and `from`\n for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {\n if (i === fromEnd || from.charCodeAt(i) === 47 /*/*/) {\n if (out.length === 0)\n out += '..';\n else\n out += '/..';\n }\n }\n\n // Lastly, append the rest of the destination (`to`) path that comes after\n // the common path parts\n if (out.length > 0)\n return out + to.slice(toStart + lastCommonSep);\n else {\n toStart += lastCommonSep;\n if (to.charCodeAt(toStart) === 47 /*/*/)\n ++toStart;\n return to.slice(toStart);\n }\n },\n\n _makeLong: function _makeLong(path) {\n return path;\n },\n\n dirname: function dirname(path) {\n assertPath(path);\n if (path.length === 0) return '.';\n var code = path.charCodeAt(0);\n var hasRoot = code === 47 /*/*/;\n var end = -1;\n var matchedSlash = true;\n for (var i = path.length - 1; i >= 1; --i) {\n code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n } else {\n // We saw the first non-path separator\n matchedSlash = false;\n }\n }\n\n if (end === -1) return hasRoot ? '/' : '.';\n if (hasRoot && end === 1) return '//';\n return path.slice(0, end);\n },\n\n basename: function basename(path, ext) {\n if (ext !== undefined && typeof ext !== 'string') throw new TypeError('\"ext\" argument must be a string');\n assertPath(path);\n\n var start = 0;\n var end = -1;\n var matchedSlash = true;\n var i;\n\n if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {\n if (ext.length === path.length && ext === path) return '';\n var extIdx = ext.length - 1;\n var firstNonSlashEnd = -1;\n for (i = path.length - 1; i >= 0; --i) {\n var code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else {\n if (firstNonSlashEnd === -1) {\n // We saw the first non-path separator, remember this index in case\n // we need it if the extension ends up not matching\n matchedSlash = false;\n firstNonSlashEnd = i + 1;\n }\n if (extIdx >= 0) {\n // Try to match the explicit extension\n if (code === ext.charCodeAt(extIdx)) {\n if (--extIdx === -1) {\n // We matched the extension, so mark this as the end of our path\n // component\n end = i;\n }\n } else {\n // Extension does not match, so our result is the entire path\n // component\n extIdx = -1;\n end = firstNonSlashEnd;\n }\n }\n }\n }\n\n if (start === end) end = firstNonSlashEnd;else if (end === -1) end = path.length;\n return path.slice(start, end);\n } else {\n for (i = path.length - 1; i >= 0; --i) {\n if (path.charCodeAt(i) === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // path component\n matchedSlash = false;\n end = i + 1;\n }\n }\n\n if (end === -1) return '';\n return path.slice(start, end);\n }\n },\n\n extname: function extname(path) {\n assertPath(path);\n var startDot = -1;\n var startPart = 0;\n var end = -1;\n var matchedSlash = true;\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n var preDotState = 0;\n for (var i = path.length - 1; i >= 0; --i) {\n var code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46 /*.*/) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1)\n startDot = i;\n else if (preDotState !== 1)\n preDotState = 1;\n } else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (startDot === -1 || end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n return '';\n }\n return path.slice(startDot, end);\n },\n\n format: function format(pathObject) {\n if (pathObject === null || typeof pathObject !== 'object') {\n throw new TypeError('The \"pathObject\" argument must be of type Object. Received type ' + typeof pathObject);\n }\n return _format('/', pathObject);\n },\n\n parse: function parse(path) {\n assertPath(path);\n\n var ret = { root: '', dir: '', base: '', ext: '', name: '' };\n if (path.length === 0) return ret;\n var code = path.charCodeAt(0);\n var isAbsolute = code === 47 /*/*/;\n var start;\n if (isAbsolute) {\n ret.root = '/';\n start = 1;\n } else {\n start = 0;\n }\n var startDot = -1;\n var startPart = 0;\n var end = -1;\n var matchedSlash = true;\n var i = path.length - 1;\n\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n var preDotState = 0;\n\n // Get non-dir info\n for (; i >= start; --i) {\n code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46 /*.*/) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1) startDot = i;else if (preDotState !== 1) preDotState = 1;\n } else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (startDot === -1 || end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n if (end !== -1) {\n if (startPart === 0 && isAbsolute) ret.base = ret.name = path.slice(1, end);else ret.base = ret.name = path.slice(startPart, end);\n }\n } else {\n if (startPart === 0 && isAbsolute) {\n ret.name = path.slice(1, startDot);\n ret.base = path.slice(1, end);\n } else {\n ret.name = path.slice(startPart, startDot);\n ret.base = path.slice(startPart, end);\n }\n ret.ext = path.slice(startDot, end);\n }\n\n if (startPart > 0) ret.dir = path.slice(0, startPart - 1);else if (isAbsolute) ret.dir = '/';\n\n return ret;\n },\n\n sep: '/',\n delimiter: ':',\n win32: null,\n posix: null\n};\n\nposix.posix = posix;\n\nmodule.exports = posix;\n", "// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n", "// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};", "__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))", "// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\n\n// !!!!!\n// SEE https://github.com/microsoft/vscode/blob/master/src/vs/base/common/platform.ts\n// !!!!!\n\ndeclare const process: { platform: 'win32' };\ndeclare const navigator: { userAgent: string };\n\nexport let isWindows: boolean;\n\nif (typeof process === 'object') {\n\tisWindows = process.platform === 'win32';\n} else if (typeof navigator === 'object') {\n\tlet userAgent = navigator.userAgent;\n\tisWindows = userAgent.indexOf('Windows') >= 0;\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\n\nimport { CharCode } from './charCode'\nimport { isWindows } from './platform';\n\nconst _schemePattern = /^\\w[\\w\\d+.-]*$/;\nconst _singleSlashStart = /^\\//;\nconst _doubleSlashStart = /^\\/\\//;\n\nfunction _validateUri(ret: URI, _strict?: boolean): void {\n\n\t// scheme, must be set\n\tif (!ret.scheme && _strict) {\n\t\tthrow new Error(`[UriError]: Scheme is missing: {scheme: \"\", authority: \"${ret.authority}\", path: \"${ret.path}\", query: \"${ret.query}\", fragment: \"${ret.fragment}\"}`);\n\t}\n\n\t// scheme, https://tools.ietf.org/html/rfc3986#section-3.1\n\t// ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )\n\tif (ret.scheme && !_schemePattern.test(ret.scheme)) {\n\t\tthrow new Error('[UriError]: Scheme contains illegal characters.');\n\t}\n\n\t// path, http://tools.ietf.org/html/rfc3986#section-3.3\n\t// If a URI contains an authority component, then the path component\n\t// must either be empty or begin with a slash (\"/\") character. If a URI\n\t// does not contain an authority component, then the path cannot begin\n\t// with two slash characters (\"//\").\n\tif (ret.path) {\n\t\tif (ret.authority) {\n\t\t\tif (!_singleSlashStart.test(ret.path)) {\n\t\t\t\tthrow new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash (\"/\") character');\n\t\t\t}\n\t\t} else {\n\t\t\tif (_doubleSlashStart.test(ret.path)) {\n\t\t\t\tthrow new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters (\"//\")');\n\t\t\t}\n\t\t}\n\t}\n}\n\n// for a while we allowed uris *without* schemes and this is the migration\n// for them, e.g. an uri without scheme and without strict-mode warns and falls\n// back to the file-scheme. that should cause the least carnage and still be a\n// clear warning\nfunction _schemeFix(scheme: string, _strict: boolean): string {\n\tif (!scheme && !_strict) {\n\t\treturn 'file';\n\t}\n\treturn scheme;\n}\n\n// implements a bit of https://tools.ietf.org/html/rfc3986#section-5\nfunction _referenceResolution(scheme: string, path: string): string {\n\n\t// the slash-character is our 'default base' as we don't\n\t// support constructing URIs relative to other URIs. This\n\t// also means that we alter and potentially break paths.\n\t// see https://tools.ietf.org/html/rfc3986#section-5.1.4\n\tswitch (scheme) {\n\t\tcase 'https':\n\t\tcase 'http':\n\t\tcase 'file':\n\t\t\tif (!path) {\n\t\t\t\tpath = _slash;\n\t\t\t} else if (path[0] !== _slash) {\n\t\t\t\tpath = _slash + path;\n\t\t\t}\n\t\t\tbreak;\n\t}\n\treturn path;\n}\n\nconst _empty = '';\nconst _slash = '/';\nconst _regexp = /^(([^:/?#]+?):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?/;\n\n/**\n * Uniform Resource Identifier (URI) http://tools.ietf.org/html/rfc3986.\n * This class is a simple parser which creates the basic component parts\n * (http://tools.ietf.org/html/rfc3986#section-3) with minimal validation\n * and encoding.\n *\n * ```txt\n * foo://example.com:8042/over/there?name=ferret#nose\n * \\_/ \\______________/\\_________/ \\_________/ \\__/\n * | | | | |\n * scheme authority path query fragment\n * | _____________________|__\n * / \\ / \\\n * urn:example:animal:ferret:nose\n * ```\n */\nexport class URI implements UriComponents {\n\n\tstatic isUri(thing: any): thing is URI {\n\t\tif (thing instanceof URI) {\n\t\t\treturn true;\n\t\t}\n\t\tif (!thing) {\n\t\t\treturn false;\n\t\t}\n\t\treturn typeof (<URI>thing).authority === 'string'\n\t\t\t&& typeof (<URI>thing).fragment === 'string'\n\t\t\t&& typeof (<URI>thing).path === 'string'\n\t\t\t&& typeof (<URI>thing).query === 'string'\n\t\t\t&& typeof (<URI>thing).scheme === 'string'\n\t\t\t&& typeof (<URI>thing).fsPath === 'string'\n\t\t\t&& typeof (<URI>thing).with === 'function'\n\t\t\t&& typeof (<URI>thing).toString === 'function';\n\t}\n\n\t/**\n\t * scheme is the 'http' part of 'http://www.example.com/some/path?query#fragment'.\n\t * The part before the first colon.\n\t */\n\treadonly scheme: string;\n\n\t/**\n\t * authority is the 'www.example.com' part of 'http://www.example.com/some/path?query#fragment'.\n\t * The part between the first double slashes and the next slash.\n\t */\n\treadonly authority: string;\n\n\t/**\n\t * path is the '/some/path' part of 'http://www.example.com/some/path?query#fragment'.\n\t */\n\treadonly path: string;\n\n\t/**\n\t * query is the 'query' part of 'http://www.example.com/some/path?query#fragment'.\n\t */\n\treadonly query: string;\n\n\t/**\n\t * fragment is the 'fragment' part of 'http://www.example.com/some/path?query#fragment'.\n\t */\n\treadonly fragment: string;\n\n\t/**\n\t * @internal\n\t */\n\tprotected constructor(scheme: string, authority?: string, path?: string, query?: string, fragment?: string, _strict?: boolean);\n\n\t/**\n\t * @internal\n\t */\n\tprotected constructor(components: UriComponents);\n\n\t/**\n\t * @internal\n\t */\n\tprotected constructor(schemeOrData: string | UriComponents, authority?: string, path?: string, query?: string, fragment?: string, _strict: boolean = false) {\n\n\t\tif (typeof schemeOrData === 'object') {\n\t\t\tthis.scheme = schemeOrData.scheme || _empty;\n\t\t\tthis.authority = schemeOrData.authority || _empty;\n\t\t\tthis.path = schemeOrData.path || _empty;\n\t\t\tthis.query = schemeOrData.query || _empty;\n\t\t\tthis.fragment = schemeOrData.fragment || _empty;\n\t\t\t// no validation because it's this URI\n\t\t\t// that creates uri components.\n\t\t\t// _validateUri(this);\n\t\t} else {\n\t\t\tthis.scheme = _schemeFix(schemeOrData, _strict);\n\t\t\tthis.authority = authority || _empty;\n\t\t\tthis.path = _referenceResolution(this.scheme, path || _empty);\n\t\t\tthis.query = query || _empty;\n\t\t\tthis.fragment = fragment || _empty;\n\n\t\t\t_validateUri(this, _strict);\n\t\t}\n\t}\n\n\t// ---- filesystem path -----------------------\n\n\t/**\n\t * Returns a string representing the corresponding file system path of this URI.\n\t * Will handle UNC paths, normalizes windows drive letters to lower-case, and uses the\n\t * platform specific path separator.\n\t *\n\t * * Will *not* validate the path for invalid characters and semantics.\n\t * * Will *not* look at the scheme of this URI.\n\t * * The result shall *not* be used for display purposes but for accessing a file on disk.\n\t *\n\t *\n\t * The *difference* to `URI#path` is the use of the platform specific separator and the handling\n\t * of UNC paths. See the below sample of a file-uri with an authority (UNC path).\n\t *\n\t * ```ts\n\t\tconst u = URI.parse('file://server/c$/folder/file.txt')\n\t\tu.authority === 'server'\n\t\tu.path === '/shares/c$/file.txt'\n\t\tu.fsPath === '\\\\server\\c$\\folder\\file.txt'\n\t```\n\t *\n\t * Using `URI#path` to read a file (using fs-apis) would not be enough because parts of the path,\n\t * namely the server name, would be missing. Therefore `URI#fsPath` exists - it's sugar to ease working\n\t * with URIs that represent files on disk (`file` scheme).\n\t */\n\tget fsPath(): string {\n\t\t// if (this.scheme !== 'file') {\n\t\t// \tconsole.warn(`[UriError] calling fsPath with scheme ${this.scheme}`);\n\t\t// }\n\t\treturn uriToFsPath(this, false);\n\t}\n\n\t// ---- modify to new -------------------------\n\n\twith(change: { scheme?: string; authority?: string | null; path?: string | null; query?: string | null; fragment?: string | null }): URI {\n\n\t\tif (!change) {\n\t\t\treturn this;\n\t\t}\n\n\t\tlet { scheme, authority, path, query, fragment } = change;\n\t\tif (scheme === undefined) {\n\t\t\tscheme = this.scheme;\n\t\t} else if (scheme === null) {\n\t\t\tscheme = _empty;\n\t\t}\n\t\tif (authority === undefined) {\n\t\t\tauthority = this.authority;\n\t\t} else if (authority === null) {\n\t\t\tauthority = _empty;\n\t\t}\n\t\tif (path === undefined) {\n\t\t\tpath = this.path;\n\t\t} else if (path === null) {\n\t\t\tpath = _empty;\n\t\t}\n\t\tif (query === undefined) {\n\t\t\tquery = this.query;\n\t\t} else if (query === null) {\n\t\t\tquery = _empty;\n\t\t}\n\t\tif (fragment === undefined) {\n\t\t\tfragment = this.fragment;\n\t\t} else if (fragment === null) {\n\t\t\tfragment = _empty;\n\t\t}\n\n\t\tif (scheme === this.scheme\n\t\t\t&& authority === this.authority\n\t\t\t&& path === this.path\n\t\t\t&& query === this.query\n\t\t\t&& fragment === this.fragment) {\n\n\t\t\treturn this;\n\t\t}\n\n\t\treturn new Uri(scheme, authority, path, query, fragment);\n\t}\n\n\t// ---- parse & validate ------------------------\n\n\t/**\n\t * Creates a new URI from a string, e.g. `http://www.example.com/some/path`,\n\t * `file:///usr/home`, or `scheme:with/path`.\n\t *\n\t * @param value A string which represents an URI (see `URI#toString`).\n\t */\n\tstatic parse(value: string, _strict: boolean = false): URI {\n\t\tconst match = _regexp.exec(value);\n\t\tif (!match) {\n\t\t\treturn new Uri(_empty, _empty, _empty, _empty, _empty);\n\t\t}\n\t\treturn new Uri(\n\t\t\tmatch[2] || _empty,\n\t\t\tpercentDecode(match[4] || _empty),\n\t\t\tpercentDecode(match[5] || _empty),\n\t\t\tpercentDecode(match[7] || _empty),\n\t\t\tpercentDecode(match[9] || _empty),\n\t\t\t_strict\n\t\t);\n\t}\n\n\t/**\n\t * Creates a new URI from a file system path, e.g. `c:\\my\\files`,\n\t * `/usr/home`, or `\\\\server\\share\\some\\path`.\n\t *\n\t * The *difference* between `URI#parse` and `URI#file` is that the latter treats the argument\n\t * as path, not as stringified-uri. E.g. `URI.file(path)` is **not the same as**\n\t * `URI.parse('file://' + path)` because the path might contain characters that are\n\t * interpreted (# and ?). See the following sample:\n\t * ```ts\n\tconst good = URI.file('/coding/c#/project1');\n\tgood.scheme === 'file';\n\tgood.path === '/coding/c#/project1';\n\tgood.fragment === '';\n\tconst bad = URI.parse('file://' + '/coding/c#/project1');\n\tbad.scheme === 'file';\n\tbad.path === '/coding/c'; // path is now broken\n\tbad.fragment === '/project1';\n\t```\n\t *\n\t * @param path A file system path (see `URI#fsPath`)\n\t */\n\tstatic file(path: string): URI {\n\n\t\tlet authority = _empty;\n\n\t\t// normalize to fwd-slashes on windows,\n\t\t// on other systems bwd-slashes are valid\n\t\t// filename character, eg /f\\oo/ba\\r.txt\n\t\tif (isWindows) {\n\t\t\tpath = path.replace(/\\\\/g, _slash);\n\t\t}\n\n\t\t// check for authority as used in UNC shares\n\t\t// or use the path as given\n\t\tif (path[0] === _slash && path[1] === _slash) {\n\t\t\tconst idx = path.indexOf(_slash, 2);\n\t\t\tif (idx === -1) {\n\t\t\t\tauthority = path.substring(2);\n\t\t\t\tpath = _slash;\n\t\t\t} else {\n\t\t\t\tauthority = path.substring(2, idx);\n\t\t\t\tpath = path.substring(idx) || _slash;\n\t\t\t}\n\t\t}\n\n\t\treturn new Uri('file', authority, path, _empty, _empty);\n\t}\n\n\tstatic from(components: { scheme: string; authority?: string; path?: string; query?: string; fragment?: string }): URI {\n\t\tconst result = new Uri(\n\t\t\tcomponents.scheme,\n\t\t\tcomponents.authority,\n\t\t\tcomponents.path,\n\t\t\tcomponents.query,\n\t\t\tcomponents.fragment,\n\t\t);\n\t\t_validateUri(result, true);\n\t\treturn result;\n\t}\n\n\t// ---- printing/externalize ---------------------------\n\n\t/**\n\t * Creates a string representation for this URI. It's guaranteed that calling\n\t * `URI.parse` with the result of this function creates an URI which is equal\n\t * to this URI.\n\t *\n\t * * The result shall *not* be used for display purposes but for externalization or transport.\n\t * * The result will be encoded using the percentage encoding and encoding happens mostly\n\t * ignore the scheme-specific encoding rules.\n\t *\n\t * @param skipEncoding Do not encode the result, default is `false`\n\t */\n\ttoString(skipEncoding: boolean = false): string {\n\t\treturn _asFormatted(this, skipEncoding);\n\t}\n\n\ttoJSON(): UriComponents {\n\t\treturn this;\n\t}\n\n\tstatic revive(data: UriComponents | URI): URI;\n\tstatic revive(data: UriComponents | URI | undefined): URI | undefined;\n\tstatic revive(data: UriComponents | URI | null): URI | null;\n\tstatic revive(data: UriComponents | URI | undefined | null): URI | undefined | null;\n\tstatic revive(data: UriComponents | URI | undefined | null): URI | undefined | null {\n\t\tif (!data) {\n\t\t\treturn <any>data;\n\t\t} else if (data instanceof URI) {\n\t\t\treturn data;\n\t\t} else {\n\t\t\tconst result = new Uri(data);\n\t\t\tresult._formatted = (<UriState>data).external;\n\t\t\tresult._fsPath = (<UriState>data)._sep === _pathSepMarker ? (<UriState>data).fsPath : null;\n\t\t\treturn result;\n\t\t}\n\t}\n}\n\nexport interface UriComponents {\n\tscheme: string;\n\tauthority: string;\n\tpath: string;\n\tquery: string;\n\tfragment: string;\n}\n\ninterface UriState extends UriComponents {\n\t$mid: number;\n\texternal: string;\n\tfsPath: string;\n\t_sep: 1 | undefined;\n}\n\nconst _pathSepMarker = isWindows ? 1 : undefined;\n\n// This class exists so that URI is compatible with vscode.Uri (API).\nclass Uri extends URI {\n\n\t_formatted: string | null = null;\n\t_fsPath: string | null = null;\n\n\toverride get fsPath(): string {\n\t\tif (!this._fsPath) {\n\t\t\tthis._fsPath = uriToFsPath(this, false);\n\t\t}\n\t\treturn this._fsPath;\n\t}\n\n\toverride toString(skipEncoding: boolean = false): string {\n\t\tif (!skipEncoding) {\n\t\t\tif (!this._formatted) {\n\t\t\t\tthis._formatted = _asFormatted(this, false);\n\t\t\t}\n\t\t\treturn this._formatted;\n\t\t} else {\n\t\t\t// we don't cache that\n\t\t\treturn _asFormatted(this, true);\n\t\t}\n\t}\n\n\toverride toJSON(): UriComponents {\n\t\tconst res = <UriState>{\n\t\t\t$mid: 1\n\t\t};\n\t\t// cached state\n\t\tif (this._fsPath) {\n\t\t\tres.fsPath = this._fsPath;\n\t\t\tres._sep = _pathSepMarker;\n\t\t}\n\t\tif (this._formatted) {\n\t\t\tres.external = this._formatted;\n\t\t}\n\t\t// uri components\n\t\tif (this.path) {\n\t\t\tres.path = this.path;\n\t\t}\n\t\tif (this.scheme) {\n\t\t\tres.scheme = this.scheme;\n\t\t}\n\t\tif (this.authority) {\n\t\t\tres.authority = this.authority;\n\t\t}\n\t\tif (this.query) {\n\t\t\tres.query = this.query;\n\t\t}\n\t\tif (this.fragment) {\n\t\t\tres.fragment = this.fragment;\n\t\t}\n\t\treturn res;\n\t}\n}\n\n// reserved characters: https://tools.ietf.org/html/rfc3986#section-2.2\nconst encodeTable: { [ch: number]: string } = {\n\t[CharCode.Colon]: '%3A', // gen-delims\n\t[CharCode.Slash]: '%2F',\n\t[CharCode.QuestionMark]: '%3F',\n\t[CharCode.Hash]: '%23',\n\t[CharCode.OpenSquareBracket]: '%5B',\n\t[CharCode.CloseSquareBracket]: '%5D',\n\t[CharCode.AtSign]: '%40',\n\n\t[CharCode.ExclamationMark]: '%21', // sub-delims\n\t[CharCode.DollarSign]: '%24',\n\t[CharCode.Ampersand]: '%26',\n\t[CharCode.SingleQuote]: '%27',\n\t[CharCode.OpenParen]: '%28',\n\t[CharCode.CloseParen]: '%29',\n\t[CharCode.Asterisk]: '%2A',\n\t[CharCode.Plus]: '%2B',\n\t[CharCode.Comma]: '%2C',\n\t[CharCode.Semicolon]: '%3B',\n\t[CharCode.Equals]: '%3D',\n\n\t[CharCode.Space]: '%20',\n};\n\nfunction encodeURIComponentFast(uriComponent: string, isPath: boolean, isAuthority: boolean): string {\n\tlet res: string | undefined = undefined;\n\tlet nativeEncodePos = -1;\n\n\tfor (let pos = 0; pos < uriComponent.length; pos++) {\n\t\tconst code = uriComponent.charCodeAt(pos);\n\n\t\t// unreserved characters: https://tools.ietf.org/html/rfc3986#section-2.3\n\t\tif (\n\t\t\t(code >= CharCode.a && code <= CharCode.z)\n\t\t\t|| (code >= CharCode.A && code <= CharCode.Z)\n\t\t\t|| (code >= CharCode.Digit0 && code <= CharCode.Digit9)\n\t\t\t|| code === CharCode.Dash\n\t\t\t|| code === CharCode.Period\n\t\t\t|| code === CharCode.Underline\n\t\t\t|| code === CharCode.Tilde\n\t\t\t|| (isPath && code === CharCode.Slash)\n\t\t\t|| (isAuthority && code === CharCode.OpenSquareBracket)\n\t\t\t|| (isAuthority && code === CharCode.CloseSquareBracket)\n\t\t\t|| (isAuthority && code === CharCode.Colon)\n\t\t) {\n\t\t\t// check if we are delaying native encode\n\t\t\tif (nativeEncodePos !== -1) {\n\t\t\t\tres += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos));\n\t\t\t\tnativeEncodePos = -1;\n\t\t\t}\n\t\t\t// check if we write into a new string (by default we try to return the param)\n\t\t\tif (res !== undefined) {\n\t\t\t\tres += uriComponent.charAt(pos);\n\t\t\t}\n\n\t\t} else {\n\t\t\t// encoding needed, we need to allocate a new string\n\t\t\tif (res === undefined) {\n\t\t\t\tres = uriComponent.substr(0, pos);\n\t\t\t}\n\n\t\t\t// check with default table first\n\t\t\tconst escaped = encodeTable[code];\n\t\t\tif (escaped !== undefined) {\n\n\t\t\t\t// check if we are delaying native encode\n\t\t\t\tif (nativeEncodePos !== -1) {\n\t\t\t\t\tres += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos));\n\t\t\t\t\tnativeEncodePos = -1;\n\t\t\t\t}\n\n\t\t\t\t// append escaped variant to result\n\t\t\t\tres += escaped;\n\n\t\t\t} else if (nativeEncodePos === -1) {\n\t\t\t\t// use native encode only when needed\n\t\t\t\tnativeEncodePos = pos;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (nativeEncodePos !== -1) {\n\t\tres += encodeURIComponent(uriComponent.substring(nativeEncodePos));\n\t}\n\n\treturn res !== undefined ? res : uriComponent;\n}\n\nfunction encodeURIComponentMinimal(path: string): string {\n\tlet res: string | undefined = undefined;\n\tfor (let pos = 0; pos < path.length; pos++) {\n\t\tconst code = path.charCodeAt(pos);\n\t\tif (code === CharCode.Hash || code === CharCode.QuestionMark) {\n\t\t\tif (res === undefined) {\n\t\t\t\tres = path.substr(0, pos);\n\t\t\t}\n\t\t\tres += encodeTable[code];\n\t\t} else {\n\t\t\tif (res !== undefined) {\n\t\t\t\tres += path[pos];\n\t\t\t}\n\t\t}\n\t}\n\treturn res !== undefined ? res : path;\n}\n\n/**\n * Compute `fsPath` for the given uri\n */\nexport function uriToFsPath(uri: URI, keepDriveLetterCasing: boolean): string {\n\n\tlet value: string;\n\tif (uri.authority && uri.path.length > 1 && uri.scheme === 'file') {\n\t\t// unc path: file://shares/c$/far/boo\n\t\tvalue = `//${uri.authority}${uri.path}`;\n\t} else if (\n\t\turi.path.charCodeAt(0) === CharCode.Slash\n\t\t&& (uri.path.charCodeAt(1) >= CharCode.A && uri.path.charCodeAt(1) <= CharCode.Z || uri.path.charCodeAt(1) >= CharCode.a && uri.path.charCodeAt(1) <= CharCode.z)\n\t\t&& uri.path.charCodeAt(2) === CharCode.Colon\n\t) {\n\t\tif (!keepDriveLetterCasing) {\n\t\t\t// windows drive letter: file:///c:/far/boo\n\t\t\tvalue = uri.path[1].toLowerCase() + uri.path.substr(2);\n\t\t} else {\n\t\t\tvalue = uri.path.substr(1);\n\t\t}\n\t} else {\n\t\t// other path\n\t\tvalue = uri.path;\n\t}\n\tif (isWindows) {\n\t\tvalue = value.replace(/\\//g, '\\\\');\n\t}\n\treturn value;\n}\n\n/**\n * Create the external version of a uri\n */\nfunction _asFormatted(uri: URI, skipEncoding: boolean): string {\n\n\tconst encoder = !skipEncoding\n\t\t? encodeURIComponentFast\n\t\t: encodeURIComponentMinimal;\n\n\tlet res = '';\n\tlet { scheme, authority, path, query, fragment } = uri;\n\tif (scheme) {\n\t\tres += scheme;\n\t\tres += ':';\n\t}\n\tif (authority || scheme === 'file') {\n\t\tres += _slash;\n\t\tres += _slash;\n\t}\n\tif (authority) {\n\t\tlet idx = authority.indexOf('@');\n\t\tif (idx !== -1) {\n\t\t\t// <user>@<auth>\n\t\t\tconst userinfo = authority.substr(0, idx);\n\t\t\tauthority = authority.substr(idx + 1);\n\t\t\tidx = userinfo.lastIndexOf(':');\n\t\t\tif (idx === -1) {\n\t\t\t\tres += encoder(userinfo, false, false);\n\t\t\t} else {\n\t\t\t\t// <user>:<pass>@<auth>\n\t\t\t\tres += encoder(userinfo.substr(0, idx), false, false);\n\t\t\t\tres += ':';\n\t\t\t\tres += encoder(userinfo.substr(idx + 1), false, true);\n\t\t\t}\n\t\t\tres += '@';\n\t\t}\n\t\tauthority = authority.toLowerCase();\n\t\tidx = authority.lastIndexOf(':');\n\t\tif (idx === -1) {\n\t\t\tres += encoder(authority, false, true);\n\t\t} else {\n\t\t\t// <auth>:<port>\n\t\t\tres += encoder(authority.substr(0, idx), false, true);\n\t\t\tres += authority.substr(idx);\n\t\t}\n\t}\n\tif (path) {\n\t\t// lower-case windows drive letters in /C:/fff or C:/fff\n\t\tif (path.length >= 3 && path.charCodeAt(0) === CharCode.Slash && path.charCodeAt(2) === CharCode.Colon) {\n\t\t\tconst code = path.charCodeAt(1);\n\t\t\tif (code >= CharCode.A && code <= CharCode.Z) {\n\t\t\t\tpath = `/${String.fromCharCode(code + 32)}:${path.substr(3)}`; // \"/c:\".length === 3\n\t\t\t}\n\t\t} else if (path.length >= 2 && path.charCodeAt(1) === CharCode.Colon) {\n\t\t\tconst code = path.charCodeAt(0);\n\t\t\tif (code >= CharCode.A && code <= CharCode.Z) {\n\t\t\t\tpath = `${String.fromCharCode(code + 32)}:${path.substr(2)}`; // \"/c:\".length === 3\n\t\t\t}\n\t\t}\n\t\t// encode the rest of the path\n\t\tres += encoder(path, true, false);\n\t}\n\tif (query) {\n\t\tres += '?';\n\t\tres += encoder(query, false, false);\n\t}\n\tif (fragment) {\n\t\tres += '#';\n\t\tres += !skipEncoding ? encodeURIComponentFast(fragment, false, false) : fragment;\n\t}\n\treturn res;\n}\n\n// --- decode\n\nfunction decodeURIComponentGraceful(str: string): string {\n\ttry {\n\t\treturn decodeURIComponent(str);\n\t} catch {\n\t\tif (str.length > 3) {\n\t\t\treturn str.substr(0, 3) + decodeURIComponentGraceful(str.substr(3));\n\t\t} else {\n\t\t\treturn str;\n\t\t}\n\t}\n}\n\nconst _rEncodedAsHex = /(%[0-9A-Za-z][0-9A-Za-z])+/g;\n\nfunction percentDecode(str: string): string {\n\tif (!str.match(_rEncodedAsHex)) {\n\t\treturn str;\n\t}\n\treturn str.replace(_rEncodedAsHex, (match) => decodeURIComponentGraceful(match));\n}\n\n/**\n * Mapped-type that replaces all occurrences of URI with UriComponents\n */\nexport type UriDto<T> = { [K in keyof T]: T[K] extends URI\n\t? UriComponents\n\t: UriDto<T[K]> };\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n'use strict';\n\nimport { CharCode } from './charCode';\nimport { URI } from './uri';\nimport * as nodePath from 'path';\n\nconst posixPath = nodePath.posix || nodePath;\nconst slash = '/';\n\nexport namespace Utils {\n\n /**\n * Joins one or more input paths to the path of URI. \n * '/' is used as the directory separation character. \n * \n * The resolved path will be normalized. That means:\n * - all '..' and '.' segments are resolved.\n * - multiple, sequential occurences of '/' are replaced by a single instance of '/'.\n * - trailing separators are preserved.\n * \n * @param uri The input URI.\n * @param paths The paths to be joined with the path of URI.\n * @returns A URI with the joined path. All other properties of the URI (scheme, authority, query, fragments, ...) will be taken from the input URI.\n */\n export function joinPath(uri: URI, ...paths: string[]): URI {\n return uri.with({ path: posixPath.join(uri.path, ...paths) });\n }\n\n\n /**\n * Resolves one or more paths against the path of a URI. \n * '/' is used as the directory separation character. \n * \n * The resolved path will be normalized. That means:\n * - all '..' and '.' segments are resolved. \n * - multiple, sequential occurences of '/' are replaced by a single instance of '/'.\n * - trailing separators are removed.\n * \n * @param uri The input URI.\n * @param paths The paths to resolve against the path of URI.\n * @returns A URI with the resolved path. All other properties of the URI (scheme, authority, query, fragments, ...) will be taken from the input URI.\n */\n export function resolvePath(uri: URI, ...paths: string[]): URI {\n let path = uri.path; \n let slashAdded = false;\n if (path[0] !== slash) {\n path = slash + path; // make the path abstract: for posixPath.resolve the first segments has to be absolute or cwd is used.\n slashAdded = true;\n }\n let resolvedPath = posixPath.resolve(path, ...paths);\n if (slashAdded && resolvedPath[0] === slash && !uri.authority) {\n resolvedPath = resolvedPath.substring(1);\n }\n return uri.with({ path: resolvedPath });\n }\n\n /**\n * Returns a URI where the path is the directory name of the input uri, similar to the Unix dirname command. \n * In the path, '/' is recognized as the directory separation character. Trailing directory separators are ignored.\n * The orignal URI is returned if the URIs path is empty or does not contain any path segments.\n * \n * @param uri The input URI.\n * @return The last segment of the URIs path.\n */\n export function dirname(uri: URI): URI {\n if (uri.path.length === 0 || uri.path === slash) {\n return uri;\n }\n let path = posixPath.dirname(uri.path);\n if (path.length === 1 && path.charCodeAt(0) === CharCode.Period) {\n path = '';\n }\n return uri.with({ path });\n }\n\n /**\n * Returns the last segment of the path of a URI, similar to the Unix basename command. \n * In the path, '/' is recognized as the directory separation character. Trailing directory separators are ignored.\n * The empty string is returned if the URIs path is empty or does not contain any path segments.\n * \n * @param uri The input URI.\n * @return The base name of the URIs path.\n */\n export function basename(uri: URI): string {\n return posixPath.basename(uri.path);\n }\n\n /**\n * Returns the extension name of the path of a URI, similar to the Unix extname command. \n * In the path, '/' is recognized as the directory separation character. Trailing directory separators are ignored.\n * The empty string is returned if the URIs path is empty or does not contain any path segments.\n * \n * @param uri The input URI.\n * @return The extension name of the URIs path.\n */\n export function extname(uri: URI): string {\n return posixPath.extname(uri.path);\n }\n}", "import ts from 'typescript';\n\nexport function findConfigFile(findPath: string, configName: string) {\n return ts.findConfigFile(findPath, ts.sys.fileExists, configName);\n}\n\nexport function requireUncached(module: string) {\n delete require.cache[require.resolve(module)];\n return require(module);\n}\n", "const enum DEBUG_LEVEL {\n DEBUG = 0,\n INFO = 1\n}\n\nexport const logger = {\n _level: DEBUG_LEVEL.INFO,\n\n setLevel(level: string) {\n if (level === 'DEBUG') {\n this._level = DEBUG_LEVEL.DEBUG;\n } else {\n this._level = DEBUG_LEVEL.INFO;\n }\n },\n\n logDebug(msg: string) {\n if (this._level <= DEBUG_LEVEL.DEBUG) {\n console.log(`[DEBUG] ${msg}`);\n }\n },\n logInfo(msg: string) {\n console.log(`[INFO ] ${msg}`);\n }\n};\n", "import { LanguageId } from './embeddedSupport/embeddedSupport';\n\nexport interface DocumentContext {\n resolveReference(ref: string, base?: string): string;\n}\n\nexport enum CodeActionDataKind {\n CombinedCodeFix,\n RefactorAction,\n OrganizeImports\n}\n\nexport interface BaseCodeActionData {\n uri: string;\n languageId: LanguageId;\n kind: CodeActionDataKind;\n textRange: { pos: number; end: number };\n}\n\nexport interface RefactorActionData extends BaseCodeActionData {\n kind: CodeActionDataKind.RefactorAction;\n refactorName: string;\n actionName: string;\n description: string;\n notApplicableReason?: string;\n}\n\nexport interface CombinedFixActionData extends BaseCodeActionData {\n kind: CodeActionDataKind.CombinedCodeFix;\n fixId: {};\n}\n\nexport interface OrganizeImportsActionData extends BaseCodeActionData {\n kind: CodeActionDataKind.OrganizeImports;\n}\n\nexport type CodeActionData = RefactorActionData | CombinedFixActionData | OrganizeImportsActionData;\n\ninterface SemanticTokenClassification {\n classificationType: number;\n modifierSet: number;\n}\n\nexport interface SemanticTokenData extends SemanticTokenClassification {\n line: number;\n character: number;\n length: number;\n}\n\nexport interface SemanticTokenOffsetData extends SemanticTokenClassification {\n start: number;\n length: number;\n}\n", "/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\n'use strict';\nclass FullTextDocument {\n constructor(uri, languageId, version, content) {\n this._uri = uri;\n this._languageId = languageId;\n this._version = version;\n this._content = content;\n this._lineOffsets = undefined;\n }\n get uri() {\n return this._uri;\n }\n get languageId() {\n return this._languageId;\n }\n get version() {\n return this._version;\n }\n getText(range) {\n if (range) {\n const start = this.offsetAt(range.start);\n const end = this.offsetAt(range.end);\n return this._content.substring(start, end);\n }\n return this._content;\n }\n update(changes, version) {\n for (let change of changes) {\n if (FullTextDocument.isIncremental(change)) {\n // makes sure start is before end\n const range = getWellformedRange(change.range);\n // update content\n const startOffset = this.offsetAt(range.start);\n const endOffset = this.offsetAt(range.end);\n this._content = this._content.substring(0, startOffset) + change.text + this._content.substring(endOffset, this._content.length);\n // update the offsets\n const startLine = Math.max(range.start.line, 0);\n const endLine = Math.max(range.end.line, 0);\n let lineOffsets = this._lineOffsets;\n const addedLineOffsets = computeLineOffsets(change.text, false, startOffset);\n if (endLine - startLine === addedLineOffsets.length) {\n for (let i = 0, len = addedLineOffsets.length; i < len; i++) {\n lineOffsets[i + startLine + 1] = addedLineOffsets[i];\n }\n }\n else {\n if (addedLineOffsets.length < 10000) {\n lineOffsets.splice(startLine + 1, endLine - startLine, ...addedLineOffsets);\n }\n else { // avoid too many arguments for splice\n this._lineOffsets = lineOffsets = lineOffsets.slice(0, startLine + 1).concat(addedLineOffsets, lineOffsets.slice(endLine + 1));\n }\n }\n const diff = change.text.length - (endOffset - startOffset);\n if (diff !== 0) {\n for (let i = startLine + 1 + addedLineOffsets.length, len = lineOffsets.length; i < len; i++) {\n lineOffsets[i] = lineOffsets[i] + diff;\n }\n }\n }\n else if (FullTextDocument.isFull(change)) {\n this._content = change.text;\n this._lineOffsets = undefined;\n }\n else {\n throw new Error('Unknown change event received');\n }\n }\n this._version = version;\n }\n getLineOffsets() {\n if (this._lineOffsets === undefined) {\n this._lineOffsets = computeLineOffsets(this._content, true);\n }\n return this._lineOffsets;\n }\n positionAt(offset) {\n offset = Math.max(Math.min(offset, this._content.length), 0);\n let lineOffsets = this.getLineOffsets();\n let low = 0, high = lineOffsets.length;\n if (high === 0) {\n return { line: 0, character: offset };\n }\n while (low < high) {\n let mid = Math.floor((low + high) / 2);\n if (lineOffsets[mid] > offset) {\n high = mid;\n }\n else {\n low = mid + 1;\n }\n }\n // low is the least x for which the line offset is larger than the current offset\n // or array.length if no line offset is larger than the current offset\n let line = low - 1;\n return { line, character: offset - lineOffsets[line] };\n }\n offsetAt(position) {\n let lineOffsets = this.getLineOffsets();\n if (position.line >= lineOffsets.length) {\n return this._content.length;\n }\n else if (position.line < 0) {\n return 0;\n }\n let lineOffset = lineOffsets[position.line];\n let nextLineOffset = (position.line + 1 < lineOffsets.length) ? lineOffsets[position.line + 1] : this._content.length;\n return Math.max(Math.min(lineOffset + position.character, nextLineOffset), lineOffset);\n }\n get lineCount() {\n return this.getLineOffsets().length;\n }\n static isIncremental(event) {\n let candidate = event;\n return candidate !== undefined && candidate !== null &&\n typeof candidate.text === 'string' && candidate.range !== undefined &&\n (candidate.rangeLength === undefined || typeof candidate.rangeLength === 'number');\n }\n static isFull(event) {\n let candidate = event;\n return candidate !== undefined && candidate !== null &&\n typeof candidate.text === 'string' && candidate.range === undefined && candidate.rangeLength === undefined;\n }\n}\nexport var TextDocument;\n(function (TextDocument) {\n /**\n * Creates a new text document.\n *\n * @param uri The document's uri.\n * @param languageId The document's language Id.\n * @param version The document's initial version number.\n * @param content The document's content.\n */\n function create(uri, languageId, version, content) {\n return new FullTextDocument(uri, languageId, version, content);\n }\n TextDocument.create = create;\n /**\n * Updates a TextDocument by modifying its content.\n *\n * @param document the document to update. Only documents created by TextDocument.create are valid inputs.\n * @param changes the changes to apply to the document.\n * @param version the changes version for the document.\n * @returns The updated TextDocument. Note: That's the same document instance passed in as first parameter.\n *\n */\n function update(document, changes, version) {\n if (document instanceof FullTextDocument) {\n document.update(changes, version);\n return document;\n }\n else {\n throw new Error('TextDocument.update: document must be created by TextDocument.create');\n }\n }\n TextDocument.update = update;\n function applyEdits(document, edits) {\n let text = document.getText();\n let sortedEdits = mergeSort(edits.map(getWellformedEdit), (a, b) => {\n let diff = a.range.start.line - b.range.start.line;\n if (diff === 0) {\n return a.range.start.character - b.range.start.character;\n }\n return diff;\n });\n let lastModifiedOffset = 0;\n const spans = [];\n for (const e of sortedEdits) {\n let startOffset = document.offsetAt(e.range.start);\n if (startOffset < lastModifiedOffset) {\n throw new Error('Overlapping edit');\n }\n else if (startOffset > lastModifiedOffset) {\n spans.push(text.substring(lastModifiedOffset, startOffset));\n }\n if (e.newText.length) {\n spans.push(e.newText);\n }\n lastModifiedOffset = document.offsetAt(e.range.end);\n }\n spans.push(text.substr(lastModifiedOffset));\n return spans.join('');\n }\n TextDocument.applyEdits = applyEdits;\n})(TextDocument || (TextDocument = {}));\nfunction mergeSort(data, compare) {\n if (data.length <= 1) {\n // sorted\n return data;\n }\n const p = (data.length / 2) | 0;\n const left = data.slice(0, p);\n const right = data.slice(p);\n mergeSort(left, compare);\n mergeSort(right, compare);\n let leftIdx = 0;\n let rightIdx = 0;\n let i = 0;\n while (leftIdx < left.length && rightIdx < right.length) {\n let ret = compare(left[leftIdx], right[rightIdx]);\n if (ret <= 0) {\n // smaller_equal -> take left to preserve order\n data[i++] = left[leftIdx++];\n }\n else {\n // greater -> take right\n data[i++] = right[rightIdx++];\n }\n }\n while (leftIdx < left.length) {\n data[i++] = left[leftIdx++];\n }\n while (rightIdx < right.length) {\n data[i++] = right[rightIdx++];\n }\n return data;\n}\nfunction computeLineOffsets(text, isAtLineStart, textOffset = 0) {\n const result = isAtLineStart ? [textOffset] : [];\n for (let i = 0; i < text.length; i++) {\n let ch = text.charCodeAt(i);\n if (ch === 13 /* CharCode.CarriageReturn */ || ch === 10 /* CharCode.LineFeed */) {\n if (ch === 13 /* CharCode.CarriageReturn */ && i + 1 < text.length && text.charCodeAt(i + 1) === 10 /* CharCode.LineFeed */) {\n i++;\n }\n result.push(textOffset + i + 1);\n }\n }\n return result;\n}\nfunction getWellformedRange(range) {\n const start = range.start;\n const end = range.end;\n if (start.line > end.line || (start.line === end.line && start.character > end.character)) {\n return { start: end, end: start };\n }\n return range;\n}\nfunction getWellformedEdit(textEdit) {\n const range = getWellformedRange(textEdit.range);\n if (range !== textEdit.range) {\n return { newText: textEdit.newText, range };\n }\n return textEdit;\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\n\nexport enum HtmlTokenType {\n StartCommentTag,\n Comment,\n EndCommentTag,\n StartTagOpen,\n StartTagClose,\n StartTagSelfClose,\n StartTag,\n StartInterpolation,\n EndTagOpen,\n EndTagClose,\n EndTag,\n EndInterpolation,\n DelimiterAssign,\n AttributeName,\n AttributeValue,\n StartDoctypeTag,\n Doctype,\n EndDoctypeTag,\n Content,\n InterpolationContent,\n Whitespace,\n Unknown,\n Script,\n Styles,\n EOS\n}\n\nclass MultiLineStream {\n private source: string;\n private len: number;\n private position: number;\n\n constructor(source: string, position: number) {\n this.source = source;\n this.len = source.length;\n this.position = position;\n }\n\n public eos(): boolean {\n return this.len <= this.position;\n }\n\n public getSource(): string {\n return this.source;\n }\n\n public pos(): number {\n return this.position;\n }\n\n public goBackTo(pos: number): void {\n this.position = pos;\n }\n\n public goBack(n: number): void {\n this.position -= n;\n }\n\n public advance(n: number): void {\n this.position += n;\n }\n\n public goToEnd(): void {\n this.position = this.source.length;\n }\n\n public nextChar(): number {\n return this.source.charCodeAt(this.position++) || 0;\n }\n\n public peekChar(n = 0): number {\n return this.source.charCodeAt(this.position + n) || 0;\n }\n\n public advanceIfChar(ch: number): boolean {\n if (ch === this.source.charCodeAt(this.position)) {\n this.position++;\n return true;\n }\n return false;\n }\n\n public advanceIfChars(ch: number[]): boolean {\n let i: number;\n if (this.position + ch.length > this.source.length) {\n return false;\n }\n for (i = 0; i < ch.length; i++) {\n if (this.source.charCodeAt(this.position + i) !== ch[i]) {\n return false;\n }\n }\n this.advance(i);\n return true;\n }\n\n public advanceIfRegExp(regex: RegExp): string {\n const str = this.source.slice(this.position);\n const match = str.match(regex);\n if (match) {\n this.position = this.position + match.index! + match[0].length;\n return match[0];\n }\n return '';\n }\n\n public advanceUntilRegExp(regex: RegExp): string {\n const str = this.source.slice(this.position);\n const match = str.match(regex);\n if (match) {\n this.position = this.position + match.index!;\n return match[0];\n } else {\n this.goToEnd();\n }\n return '';\n }\n\n public advanceUntilChar(ch: number): boolean {\n while (this.position < this.source.length) {\n if (this.source.charCodeAt(this.position) === ch) {\n return true;\n }\n this.advance(1);\n }\n return false;\n }\n\n public advanceUntilChars(ch: number[]): boolean {\n while (this.position + ch.length <= this.source.length) {\n let i = 0;\n for (; i < ch.length && this.source.charCodeAt(this.position + i) === ch[i]; i++) {}\n if (i === ch.length) {\n return true;\n }\n this.advance(1);\n }\n this.goToEnd();\n return false;\n }\n\n public skipWhitespace(): boolean {\n const n = this.advanceWhileChar(ch => {\n return ch === _WSP || ch === _TAB || ch === _NWL || ch === _LFD || ch === _CAR;\n });\n return n > 0;\n }\n\n public advanceWhileChar(condition: (ch: number) => boolean): number {\n const posNow = this.position;\n while (this.position < this.len && condition(this.source.charCodeAt(this.position))) {\n this.position++;\n }\n return this.position - posNow;\n }\n}\nconst _BNG = '!'.charCodeAt(0);\nconst _MIN = '-'.charCodeAt(0);\nconst _LAN = '<'.charCodeAt(0);\nconst _RAN = '>'.charCodeAt(0);\nconst _FSL = '/'.charCodeAt(0);\nconst _EQS = '='.charCodeAt(0);\nconst _DQO = '\"'.charCodeAt(0);\nconst _SQO = \"'\".charCodeAt(0);\nconst _NWL = '\\n'.charCodeAt(0);\nconst _CAR = '\\r'.charCodeAt(0);\nconst _LFD = '\\f'.charCodeAt(0);\nconst _WSP = ' '.charCodeAt(0);\nconst _TAB = '\\t'.charCodeAt(0);\nconst _LCR = '{'.charCodeAt(0);\nconst _RCR = '}'.charCodeAt(0);\n\nexport enum ScannerState {\n WithinContent,\n WithinInterpolation,\n AfterOpeningStartTag,\n AfterOpeningEndTag,\n WithinDoctype,\n WithinTag,\n WithinEndTag,\n WithinComment,\n WithinScriptContent,\n WithinStyleContent,\n AfterAttributeName,\n BeforeAttributeValue\n}\n\nexport interface Scanner {\n scan(): HtmlTokenType;\n scanForRegexp(regexp: RegExp): HtmlTokenType;\n getTokenType(): HtmlTokenType;\n getTokenOffset(): number;\n getTokenLength(): number;\n getTokenEnd(): number;\n getTokenText(): string;\n getTokenError(): string;\n getScannerState(): ScannerState;\n}\n\nconst htmlScriptContents: { [lang: string]: boolean } = {\n 'text/x-handlebars-template': true\n};\n\nexport function createScanner(\n input: string,\n initialOffset = 0,\n initialState: ScannerState = ScannerState.WithinContent\n): Scanner {\n const stream = new MultiLineStream(input, initialOffset);\n let state = initialState;\n let tokenOffset = 0;\n let tokenType: number;\n let tokenError: string;\n\n let hasSpaceAfterTag: boolean;\n let lastTag: string;\n let lastAttributeName: string | null;\n let lastTypeValue: string | null;\n\n function nextElementName(): string {\n return stream.advanceIfRegExp(/^[_:\\w][_:\\w-.\\d]*/).toLowerCase();\n }\n\n function nextAttributeName(): string {\n return stream.advanceIfRegExp(/^[^\\s\"'<>/=\\x00-\\x0F\\x7F\\x80-\\x9F]*/).toLowerCase();\n }\n\n function finishToken(offset: number, type: HtmlTokenType, errorMessage?: string): HtmlTokenType {\n tokenType = type;\n tokenOffset = offset;\n tokenError = errorMessage || '';\n return type;\n }\n\n function scan(): HtmlTokenType {\n const offset = stream.pos();\n const oldState = state;\n const token = internalScan();\n if (token !== HtmlTokenType.EOS && offset === stream.pos()) {\n console.log(\n 'Scanner.scan has not advanced at offset ' + offset + ', state before: ' + oldState + ' after: ' + state\n );\n stream.advance(1);\n return finishToken(offset, HtmlTokenType.Unknown);\n }\n return token;\n }\n\n function internalScan(): HtmlTokenType {\n const offset = stream.pos();\n if (stream.eos()) {\n return finishToken(offset, HtmlTokenType.EOS);\n }\n let errorMessage;\n\n switch (state) {\n case ScannerState.WithinComment:\n if (stream.advanceIfChars([_MIN, _MIN, _RAN])) {\n // -->\n state = ScannerState.WithinContent;\n return finishToken(offset, HtmlTokenType.EndCommentTag);\n }\n stream.advanceUntilChars([_MIN, _MIN, _RAN]); // -->\n return finishToken(offset, HtmlTokenType.Comment);\n case ScannerState.WithinDoctype:\n if (stream.advanceIfChar(_RAN)) {\n state = ScannerState.WithinContent;\n return finishToken(offset, HtmlTokenType.EndDoctypeTag);\n }\n stream.advanceUntilChar(_RAN); // >\n return finishToken(offset, HtmlTokenType.Doctype);\n case ScannerState.WithinContent:\n if (stream.advanceIfChar(_LAN)) {\n // <\n if (!stream.eos() && stream.peekChar() === _BNG) {\n // !\n if (stream.advanceIfChars([_BNG, _MIN, _MIN])) {\n // <!--\n state = ScannerState.WithinComment;\n return finishToken(offset, HtmlTokenType.StartCommentTag);\n }\n if (stream.advanceIfRegExp(/^!doctype/i)) {\n state = ScannerState.WithinDoctype;\n return finishToken(offset, HtmlTokenType.StartDoctypeTag);\n }\n }\n if (stream.advanceIfChar(_FSL)) {\n // /\n state = ScannerState.AfterOpeningEndTag;\n return finishToken(offset, HtmlTokenType.EndTagOpen);\n }\n state = ScannerState.AfterOpeningStartTag;\n return finishToken(offset, HtmlTokenType.StartTagOpen);\n }\n if (stream.advanceIfChars([_LCR, _LCR])) {\n state = ScannerState.WithinInterpolation;\n return finishToken(offset, HtmlTokenType.StartInterpolation);\n }\n stream.advanceUntilRegExp(/<|{{/);\n return finishToken(offset, HtmlTokenType.Content);\n case ScannerState.WithinInterpolation:\n if (stream.advanceIfChars([_RCR, _RCR])) {\n state = ScannerState.WithinContent;\n return finishToken(offset, HtmlTokenType.EndInterpolation);\n }\n stream.advanceUntilChars([_RCR, _RCR]);\n return finishToken(offset, HtmlTokenType.InterpolationContent);\n case ScannerState.AfterOpeningEndTag:\n const tagName = nextElementName();\n if (tagName.length > 0) {\n state = ScannerState.WithinEndTag;\n return finishToken(offset, HtmlTokenType.EndTag);\n }\n if (stream.skipWhitespace()) {\n // white space is not valid here\n return finishToken(offset, HtmlTokenType.Whitespace, 'Tag name must directly follow the open bracket.');\n }\n state = ScannerState.WithinEndTag;\n stream.advanceUntilChar(_RAN);\n if (offset < stream.pos()) {\n return finishToken(offset, HtmlTokenType.Unknown, 'End tag name expected.');\n }\n return internalScan();\n case ScannerState.WithinEndTag:\n if (stream.skipWhitespace()) {\n // white space is valid here\n return finishToken(offset, HtmlTokenType.Whitespace);\n }\n if (stream.advanceIfChar(_RAN)) {\n // >\n state = ScannerState.WithinContent;\n return finishToken(offset, HtmlTokenType.EndTagClose);\n }\n errorMessage = 'Closing bracket expected.';\n break;\n case ScannerState.AfterOpeningStartTag:\n lastTag = nextElementName();\n lastTypeValue = null;\n lastAttributeName = null;\n if (lastTag.length > 0) {\n hasSpaceAfterTag = false;\n state = ScannerState.WithinTag;\n return finishToken(offset, HtmlTokenType.StartTag);\n }\n if (stream.skipWhitespace()) {\n // white space is not valid here\n return finishToken(offset, HtmlTokenType.Whitespace, 'Tag name must directly follow the open bracket.');\n }\n state = ScannerState.WithinTag;\n stream.advanceUntilChar(_RAN);\n if (offset < stream.pos()) {\n return finishToken(offset, HtmlTokenType.Unknown, 'Start tag name expected.');\n }\n return internalScan();\n case ScannerState.WithinTag:\n if (stream.skipWhitespace()) {\n hasSpaceAfterTag = true; // remember that we have seen a whitespace\n return finishToken(offset, HtmlTokenType.Whitespace);\n }\n if (hasSpaceAfterTag) {\n lastAttributeName = nextAttributeName();\n if (lastAttributeName.length > 0) {\n state = ScannerState.AfterAttributeName;\n hasSpaceAfterTag = false;\n return finishToken(offset, HtmlTokenType.AttributeName);\n }\n }\n if (stream.advanceIfChars([_FSL, _RAN])) {\n // />\n state = ScannerState.WithinContent;\n return finishToken(offset, HtmlTokenType.StartTagSelfClose);\n }\n if (stream.advanceIfChar(_RAN)) {\n // >\n if (lastTag === 'script') {\n if (lastTypeValue && htmlScriptContents[lastTypeValue]) {\n // stay in html\n state = ScannerState.WithinContent;\n } else {\n state = ScannerState.WithinScriptContent;\n }\n } else if (lastTag === 'style') {\n state = ScannerState.WithinStyleContent;\n } else {\n state = ScannerState.WithinContent;\n }\n return finishToken(offset, HtmlTokenType.StartTagClose);\n }\n stream.advance(1);\n return finishToken(offset, HtmlTokenType.Unknown, 'Unexpected character in tag.');\n case ScannerState.AfterAttributeName:\n if (stream.skipWhitespace()) {\n hasSpaceAfterTag = true;\n return finishToken(offset, HtmlTokenType.Whitespace);\n }\n\n if (stream.advanceIfChar(_EQS)) {\n state = ScannerState.BeforeAttributeValue;\n return finishToken(offset, HtmlTokenType.DelimiterAssign);\n }\n state = ScannerState.WithinTag;\n return internalScan(); // no advance yet - jump to WithinTag\n case ScannerState.BeforeAttributeValue:\n if (stream.skipWhitespace()) {\n return finishToken(offset, HtmlTokenType.Whitespace);\n }\n const attributeValue = stream.advanceIfRegExp(/^[^\\s\"'`=<>\\/]+/);\n if (attributeValue.length > 0) {\n if (lastAttributeName === 'type') {\n lastTypeValue = attributeValue;\n }\n state = ScannerState.WithinTag;\n hasSpaceAfterTag = false;\n return finishToken(offset, HtmlTokenType.AttributeValue);\n }\n const ch = stream.peekChar();\n if (ch === _SQO || ch === _DQO) {\n stream.advance(1); // consume quote\n if (stream.advanceUntilChar(ch)) {\n stream.advance(1); // consume quote\n }\n if (lastAttributeName === 'type') {\n lastTypeValue = stream.getSource().substring(offset + 1, stream.pos() - 1);\n }\n state = ScannerState.WithinTag;\n hasSpaceAfterTag = false;\n return finishToken(offset, HtmlTokenType.AttributeValue);\n }\n state = ScannerState.WithinTag;\n hasSpaceAfterTag = false;\n return internalScan(); // no advance yet - jump to WithinTag\n case ScannerState.WithinScriptContent:\n // see http://stackoverflow.com/questions/14574471/how-do-browsers-parse-a-script-tag-exactly\n let sciptState = 1;\n while (!stream.eos()) {\n const match = stream.advanceIfRegExp(/<!--|-->|<\\/?script\\s*\\/?>?/i);\n if (match.length === 0) {\n stream.goToEnd();\n return finishToken(offset, HtmlTokenType.Script);\n } else if (match === '<!--') {\n if (sciptState === 1) {\n sciptState = 2;\n }\n } else if (match === '-->') {\n sciptState = 1;\n } else if (match[1] !== '/') {\n // <script\n if (sciptState === 2) {\n sciptState = 3;\n }\n } else {\n // </script\n if (sciptState === 3) {\n sciptState = 2;\n } else {\n stream.goBack(match.length); // to the beginning of the closing tag\n break;\n }\n }\n }\n state = ScannerState.WithinContent;\n if (offset < stream.pos()) {\n return finishToken(offset, HtmlTokenType.Script);\n }\n return internalScan(); // no advance yet - jump to content\n case ScannerState.WithinStyleContent:\n stream.advanceUntilRegExp(/<\\/style/i);\n state = ScannerState.WithinContent;\n if (offset < stream.pos()) {\n return finishToken(offset, HtmlTokenType.Styles);\n }\n return internalScan(); // no advance yet - jump to content\n }\n\n stream.advance(1);\n state = ScannerState.WithinContent;\n return finishToken(offset, HtmlTokenType.Unknown, errorMessage);\n }\n\n function scanForRegexp(regexp: RegExp): HtmlTokenType {\n const offset = stream.pos();\n state = ScannerState.WithinContent;\n if (stream.advanceUntilRegExp(regexp)) {\n return finishToken(offset, HtmlTokenType.Unknown);\n }\n return finishToken(offset, HtmlTokenType.EOS);\n }\n\n return {\n scan,\n scanForRegexp,\n getTokenType: () => tokenType,\n getTokenOffset: () => tokenOffset,\n getTokenLength: () => stream.pos() - tokenOffset,\n getTokenEnd: () => stream.pos(),\n getTokenText: () => stream.getSource().substring(tokenOffset, stream.pos()),\n getScannerState: () => state,\n getTokenError: () => tokenError\n };\n}\n", "import { VLSFormatConfig } from '../config';\nimport { MarkupContent, MarkupKind } from 'vscode-languageserver';\nimport { basename } from 'path';\nimport { RuntimeLibrary } from '../services/dependencyService';\nimport type ts from 'typescript';\n\nexport function getWordAtText(text: string, offset: number, wordDefinition: RegExp): { start: number; length: number } {\n let lineStart = offset;\n while (lineStart > 0 && !isNewlineCharacter(text.charCodeAt(lineStart - 1))) {\n lineStart--;\n }\n const offsetInLine = offset - lineStart;\n const lineText = text.slice(lineStart);\n\n // make a copy of the regex as to not keep the state\n const flags = wordDefinition.ignoreCase ? 'gi' : 'g';\n wordDefinition = new RegExp(wordDefinition.source, flags);\n\n let match = wordDefinition.exec(lineText);\n while (match && match.index + match[0].length < offsetInLine) {\n match = wordDefinition.exec(lineText);\n }\n if (match && match.index <= offsetInLine) {\n return { start: match.index + lineStart, length: match[0].length };\n }\n\n return { start: offset, length: 0 };\n}\n\nexport function removeQuotes(str: string) {\n return str.replace(/[\"']/g, '');\n}\n\nconst CR = '\\r'.charCodeAt(0);\nconst NL = '\\n'.charCodeAt(0);\nfunction isNewlineCharacter(charCode: number) {\n return charCode === CR || charCode === NL;\n}\n\nconst nonEmptyLineRE = /^(?!$)/gm;\n/**\n * wrap text in section tags like <template>, <style>\n * add leading and trailing newline and optional indentation\n */\nexport function indentSection(text: string, options: VLSFormatConfig): string {\n const initialIndent = generateIndent(options);\n return text.replace(nonEmptyLineRE, initialIndent);\n}\n\nfunction generateIndent(options: VLSFormatConfig) {\n if (!options.options.useTabs) {\n return ' '.repeat(options.options.tabSize);\n } else {\n return '\\t';\n }\n}\n\nexport function toMarkupContent(value: string | MarkupContent | undefined) {\n if (!value) {\n return '';\n }\n\n return typeof value === 'string' ? { kind: MarkupKind.Markdown, value } : value;\n}\n\n// Convert module path to valid typescript identifier\n// https://github.com/microsoft/TypeScript/blob/master/src/services/codefixes/importFixes.ts#L951\nexport function modulePathToValidIdentifier(\n tsModule: RuntimeLibrary['typescript'],\n modulePath: string,\n target: ts.ScriptTarget | undefined\n): string {\n const baseName = basename(modulePath, '.vue');\n let res = '';\n let lastCharWasValid = true;\n const firstCharCode = baseName.charCodeAt(0);\n if (tsModule.isIdentifierStart(firstCharCode, target)) {\n res += String.fromCharCode(firstCharCode);\n } else {\n lastCharWasValid = false;\n }\n for (let i = 1; i < baseName.length; i++) {\n const ch = baseName.charCodeAt(i);\n const isValid = tsModule.isIdentifierPart(ch, target);\n if (isValid) {\n let char = String.fromCharCode(ch);\n if (!lastCharWasValid) {\n char = char.toUpperCase();\n }\n res += char;\n }\n lastCharWasValid = isValid;\n }\n\n return res;\n}\n", "import type { TextDocument } from 'vscode-languageserver-textdocument';\nimport { createScanner, HtmlTokenType, Scanner } from '../modes/template/parser/htmlScanner';\nimport { removeQuotes } from '../utils/strings';\nimport { LanguageId } from './embeddedSupport';\n\nexport type RegionType = 'template' | 'script' | 'style' | 'custom';\nexport type RegionAttrKey = 'setup' | 'module' | 'scoped' | 'lang';\n\nexport type RegionAttrs = Partial<Record<RegionAttrKey, boolean | string>> & Partial<Record<string, boolean | string>>;\n\nexport interface EmbeddedRegion {\n languageId: LanguageId;\n start: number;\n end: number;\n type: RegionType;\n attrs: RegionAttrs;\n}\n\nconst defaultScriptLang = 'javascript';\nconst defaultCSSLang = 'css';\n\nexport function parseVueDocumentRegions(document: TextDocument) {\n const regions: EmbeddedRegion[] = [];\n const text = document.getText();\n const scanner = createScanner(text);\n let lastTagName = '';\n let lastAttributeName = '';\n let languageIdFromType: LanguageId | '' = '';\n let attrs: Partial<Record<string, boolean | string>> = {};\n const importedScripts: string[] = [];\n let stakes = 0;\n\n let token = scanner.scan();\n while (token !== HtmlTokenType.EOS) {\n switch (token) {\n case HtmlTokenType.Styles:\n regions.push({\n languageId: /^(sass|scss|less|postcss|stylus)$/.test(languageIdFromType)\n ? (languageIdFromType as LanguageId)\n : defaultCSSLang,\n start: scanner.getTokenOffset(),\n end: scanner.getTokenEnd(),\n type: 'style',\n attrs\n });\n languageIdFromType = '';\n break;\n case HtmlTokenType.Script:\n regions.push({\n languageId: languageIdFromType ? languageIdFromType : defaultScriptLang,\n start: scanner.getTokenOffset(),\n end: scanner.getTokenEnd(),\n type: 'script',\n attrs\n });\n languageIdFromType = '';\n break;\n case HtmlTokenType.StartTag:\n stakes++;\n const tagName = scanner.getTokenText();\n if (tagName === 'template' && stakes === 1) {\n const templateRegion = scanTemplateRegion(scanner, text);\n if (templateRegion) {\n regions.push(templateRegion);\n }\n } else if (!['style', 'script'].includes(tagName) && stakes === 1) {\n const customRegion = scanCustomRegion(tagName, scanner, text);\n if (customRegion) {\n regions.push(customRegion);\n }\n }\n lastTagName = tagName;\n lastAttributeName = '';\n break;\n case HtmlTokenType.AttributeName:\n lastAttributeName = scanner.getTokenText();\n attrs[lastAttributeName] = true;\n break;\n case HtmlTokenType.AttributeValue:\n const attrValue = removeQuotes(scanner.getTokenText());\n if (lastAttributeName === 'lang') {\n languageIdFromType = getLanguageIdFromLangAttr(attrValue);\n } else {\n if (lastAttributeName === 'src' && lastTagName.toLowerCase() === 'script') {\n const value = attrValue;\n importedScripts.push(value);\n }\n }\n attrs[lastAttributeName] = attrValue;\n lastAttributeName = '';\n break;\n case HtmlTokenType.StartTagSelfClose:\n case HtmlTokenType.EndTagClose:\n attrs = {};\n stakes--;\n lastAttributeName = '';\n languageIdFromType = '';\n break;\n }\n token = scanner.scan();\n }\n\n return {\n regions,\n importedScripts\n };\n}\n\nfunction scanTemplateRegion(scanner: Scanner, text: string): EmbeddedRegion | null {\n let languageId: LanguageId = 'vue-html';\n\n let token = -1;\n let start = 0;\n let end: number;\n const attrs: Partial<Record<string, boolean | string>> = {};\n\n // Scan until finding matching template EndTag\n // Also record immediate next StartTagClose to find start\n let unClosedTemplate = 1;\n let lastAttributeName = null;\n while (unClosedTemplate !== 0) {\n // skip parsing on non html syntax, just search terminator\n if (token === HtmlTokenType.AttributeValue && languageId !== 'vue-html') {\n while (![HtmlTokenType.StartTagClose, HtmlTokenType.StartTagSelfClose].includes(token)) {\n token = scanner.scan();\n }\n start = scanner.getTokenEnd();\n\n token = scanner.scanForRegexp(/<\\/template>/);\n if (token === HtmlTokenType.EOS) {\n return null;\n }\n\n // scan to `EndTag`, past `</` to `template`\n while (token !== HtmlTokenType.EndTag) {\n token = scanner.scan();\n }\n break;\n }\n\n token = scanner.scan();\n\n if (token === HtmlTokenType.EOS) {\n return null;\n }\n\n if (start === 0) {\n if (token === HtmlTokenType.AttributeName) {\n lastAttributeName = scanner.getTokenText();\n attrs[lastAttributeName] = true;\n } else if (token === HtmlTokenType.AttributeValue) {\n const attrValue = removeQuotes(scanner.getTokenText());\n if (lastAttributeName === 'lang') {\n languageId = getLanguageIdFromLangAttr(attrValue);\n }\n if (lastAttributeName) {\n attrs[lastAttributeName] = attrValue;\n }\n lastAttributeName = null;\n } else if (token === HtmlTokenType.StartTagClose) {\n start = scanner.getTokenEnd();\n }\n } else {\n if (token === HtmlTokenType.StartTag && scanner.getTokenText() === 'template') {\n unClosedTemplate++;\n } else if (token === HtmlTokenType.EndTag && scanner.getTokenText() === 'template') {\n unClosedTemplate--;\n // test leading </template>\n const charPosBeforeEndTag = scanner.getTokenOffset() - 3;\n if (text[charPosBeforeEndTag] === '\\n') {\n break;\n }\n } else if (token === HtmlTokenType.Unknown) {\n if (scanner.getTokenText().charAt(0) === '<') {\n const offset = scanner.getTokenOffset();\n const unknownText = text.slice(offset, offset + 11);\n if (unknownText === '</template>') {\n unClosedTemplate--;\n // test leading </template>\n if (text[offset - 1] === '\\n') {\n return {\n languageId,\n start,\n end: offset,\n type: 'template',\n attrs\n };\n }\n }\n }\n }\n }\n }\n\n // In EndTag, find end\n // -2 for </\n end = scanner.getTokenOffset() - 2;\n\n return {\n languageId,\n start,\n end,\n type: 'template',\n attrs\n };\n}\n\nfunction scanCustomRegion(tagName: string, scanner: Scanner, text: string): EmbeddedRegion | null {\n let languageId: LanguageId = 'unknown';\n\n let token = -1;\n let start = 0;\n let end: number;\n const attrs: Partial<Record<string, boolean | string>> = {};\n\n // Scan until finding matching template EndTag\n // Also record immediate next StartTagClose to find start\n let unClosedTag = 1;\n let lastAttributeName: string | null = null;\n while (unClosedTag !== 0) {\n token = scanner.scan();\n\n if (token === HtmlTokenType.EOS) {\n return null;\n }\n\n if (start === 0) {\n if (token === HtmlTokenType.AttributeName) {\n lastAttributeName = scanner.getTokenText();\n attrs[lastAttributeName] = true;\n } else if (token === HtmlTokenType.AttributeValue) {\n const attrValue = removeQuotes(scanner.getTokenText());\n if (lastAttributeName === 'lang') {\n languageId = getLanguageIdFromLangAttr(attrValue);\n }\n if (lastAttributeName) {\n attrs[lastAttributeName] = attrValue;\n }\n lastAttributeName = null;\n } else if (token === HtmlTokenType.StartTagClose) {\n start = scanner.getTokenEnd();\n }\n } else {\n if (token === HtmlTokenType.StartTag && scanner.getTokenText() === tagName) {\n unClosedTag++;\n } else if (token === HtmlTokenType.EndTag && scanner.getTokenText() === tagName) {\n unClosedTag--;\n // test leading </${tagName}>\n const charPosBeforeEndTag = scanner.getTokenOffset() - 3;\n if (text[charPosBeforeEndTag] === '\\n') {\n break;\n }\n } else if (token === HtmlTokenType.Unknown) {\n if (scanner.getTokenText().charAt(0) === '<') {\n const offset = scanner.getTokenOffset();\n const unknownText = text.slice(offset, offset + `</${tagName}>`.length);\n if (unknownText === `</${tagName}>`) {\n unClosedTag--;\n // test leading </${tagName}>\n if (text[offset - 1] === '\\n') {\n return {\n languageId,\n start,\n end: offset,\n type: 'custom',\n attrs\n };\n }\n }\n }\n }\n }\n }\n\n // In EndTag, find end\n // -2 for </\n end = scanner.getTokenOffset() - 2;\n\n return {\n languageId,\n start,\n end,\n type: 'custom',\n attrs\n };\n}\n\nfunction getLanguageIdFromLangAttr(languageIdFromType: string): LanguageId {\n if (languageIdFromType === 'jade') {\n languageIdFromType = 'pug';\n }\n if (languageIdFromType === 'ts') {\n languageIdFromType = 'typescript';\n }\n return languageIdFromType as LanguageId;\n}\n", "import { Position, Range } from 'vscode-languageserver-types';\nimport { TextDocument } from 'vscode-languageserver-textdocument';\nimport { parseVueDocumentRegions, EmbeddedRegion, RegionAttrs } from './vueDocumentRegionParser';\n\nexport type LanguageId =\n | 'vue'\n | 'vue-html'\n | 'pug'\n | 'css'\n | 'postcss'\n | 'scss'\n | 'sass'\n | 'less'\n | 'stylus'\n | 'javascript'\n | 'typescript'\n | 'tsx'\n | 'unknown';\n\nexport interface LanguageRange extends Range {\n languageId: LanguageId;\n attrs: RegionAttrs;\n}\n\nexport interface VueDocumentRegions {\n /**\n * Get a document where all regions of `languageId` is preserved\n * Whereas other regions are replaced with whitespaces\n */\n getSingleLanguageDocument(languageId: LanguageId): TextDocument;\n\n /**\n * Get a document where all regions of `type` RegionType is preserved\n * Whereas other regions are replaced with whitespaces\n */\n getSingleTypeDocument(type: RegionType): TextDocument;\n\n /**\n * Get a list of ranges that has `RegionType`\n */\n getLanguageRangesOfType(type: RegionType): LanguageRange[];\n\n /**\n * Get all language ranges inside document\n */\n getAllLanguageRanges(): LanguageRange[];\n\n /**\n * Get language for determining\n */\n getLanguageAtPosition(position: Position): LanguageId;\n getLanguageRangeAtPosition(position: Position): LanguageRange | null;\n\n getImportedScripts(): string[];\n}\n\ntype RegionType = 'template' | 'script' | 'style' | 'custom';\n\nconst defaultLanguageIdForBlockTypes: { [type: string]: string } = {\n template: 'vue-html',\n script: 'javascript',\n style: 'css'\n};\n\nexport function getVueDocumentRegions(document: TextDocument): VueDocumentRegions {\n const { regions, importedScripts } = parseVueDocumentRegions(document);\n\n return {\n getSingleLanguageDocument: (languageId: LanguageId) => getSingleLanguageDocument(document, regions, languageId),\n getSingleTypeDocument: (type: RegionType) => getSingleTypeDocument(document, regions, type),\n\n getLanguageRangesOfType: (type: RegionType) => getLanguageRangesOfType(document, regions, type),\n\n getAllLanguageRanges: () => getAllLanguageRanges(document, regions),\n getLanguageAtPosition: (position: Position) => getLanguageAtPosition(document, regions, position),\n getLanguageRangeAtPosition: (position: Position) => getLanguageRangeAtPosition(document, regions, position),\n getImportedScripts: () => importedScripts\n };\n}\n\nfunction getAllLanguageRanges(document: TextDocument, regions: EmbeddedRegion[]): LanguageRange[] {\n return regions.map(r => {\n return {\n languageId: r.languageId,\n start: document.positionAt(r.start),\n end: document.positionAt(r.end),\n attrs: r.attrs\n };\n });\n}\n\nfunction getLanguageAtPosition(document: TextDocument, regions: EmbeddedRegion[], position: Position): LanguageId {\n const offset = document.offsetAt(position);\n for (const region of regions) {\n if (region.start <= offset) {\n if (offset <= region.end) {\n return region.languageId;\n }\n } else {\n break;\n }\n }\n return 'vue';\n}\n\nfunction getLanguageRangeAtPosition(\n document: TextDocument,\n regions: EmbeddedRegion[],\n position: Position\n): LanguageRange | null {\n const offset = document.offsetAt(position);\n for (const region of regions) {\n if (region.start <= offset) {\n if (offset <= region.end) {\n return {\n start: document.positionAt(region.start),\n end: document.positionAt(region.end),\n languageId: region.languageId,\n attrs: region.attrs\n };\n }\n } else {\n break;\n }\n }\n return null;\n}\n\nexport function getSingleLanguageDocument(\n document: TextDocument,\n regions: EmbeddedRegion[],\n languageId: LanguageId\n): TextDocument {\n const oldContent = document.getText();\n let newContent = oldContent\n .split('\\n')\n .map(line => ' '.repeat(line.length))\n .join('\\n');\n\n for (const r of regions) {\n if (r.languageId === languageId) {\n newContent = newContent.slice(0, r.start) + oldContent.slice(r.start, r.end) + newContent.slice(r.end);\n }\n }\n\n return TextDocument.create(document.uri, languageId, document.version, newContent);\n}\n\nexport function getSingleTypeDocument(\n document: TextDocument,\n regions: EmbeddedRegion[],\n type: RegionType\n): TextDocument {\n const oldContent = document.getText();\n let newContent = oldContent\n .split('\\n')\n .map(line => ' '.repeat(line.length))\n .join('\\n');\n\n let langId: string = defaultLanguageIdForBlockTypes[type];\n\n for (const r of regions) {\n if (r.type === type) {\n newContent = newContent.slice(0, r.start) + oldContent.slice(r.start, r.end) + newContent.slice(r.end);\n langId = r.languageId;\n }\n }\n\n if (type === 'script' && newContent.trim().length === 0) {\n newContent = 'export default {};';\n }\n\n return TextDocument.create(document.uri, langId, document.version, newContent);\n}\n\nexport function getLanguageRangesOfType(\n document: TextDocument,\n regions: EmbeddedRegion[],\n type: RegionType\n): LanguageRange[] {\n const result = [];\n\n for (const r of regions) {\n if (r.type === type) {\n result.push({\n start: document.positionAt(r.start),\n end: document.positionAt(r.end),\n languageId: r.languageId,\n attrs: r.attrs\n });\n }\n }\n\n return result;\n}\n", "import { TextDocument } from 'vscode-languageserver-textdocument';\n\nexport interface LanguageModelCache<T> {\n /**\n * - Feed updated document\n * - Use `parse` function to re-compute model\n * - Return re-computed model\n */\n refreshAndGet(document: TextDocument): T;\n onDocumentRemoved(document: TextDocument): void;\n dispose(): void;\n}\n\nexport function getLanguageModelCache<T>(\n maxEntries: number,\n cleanupIntervalTimeInSec: number,\n parse: (document: TextDocument) => T\n): LanguageModelCache<T> {\n let languageModels: { [uri: string]: { version: number; languageId: string; cTime: number; languageModel: T } } = {};\n let nModels = 0;\n\n let cleanupInterval: NodeJS.Timer;\n if (cleanupIntervalTimeInSec > 0) {\n cleanupInterval = setInterval(() => {\n const cutoffTime = Date.now() - cleanupIntervalTimeInSec * 1000;\n const uris = Object.keys(languageModels);\n for (const uri of uris) {\n const languageModelInfo = languageModels[uri];\n if (languageModelInfo.cTime < cutoffTime) {\n delete languageModels[uri];\n nModels--;\n }\n }\n }, cleanupIntervalTimeInSec * 1000);\n }\n\n return {\n refreshAndGet(document: TextDocument): T {\n const version = document.version;\n const languageId = document.languageId;\n const languageModelInfo = languageModels[document.uri];\n if (languageModelInfo && languageModelInfo.version === version && languageModelInfo.languageId === languageId) {\n languageModelInfo.cTime = Date.now();\n return languageModelInfo.languageModel;\n }\n const languageModel = parse(document);\n languageModels[document.uri] = { languageModel, version, languageId, cTime: Date.now() };\n if (!languageModelInfo) {\n nModels++;\n }\n\n if (nModels === maxEntries) {\n let oldestTime = Number.MAX_VALUE;\n let oldestUri = null;\n for (const uri in languageModels) {\n const languageModelInfo = languageModels[uri];\n if (languageModelInfo.cTime < oldestTime) {\n oldestUri = uri;\n oldestTime = languageModelInfo.cTime;\n }\n }\n if (oldestUri) {\n delete languageModels[oldestUri];\n nModels--;\n }\n }\n return languageModel;\n },\n onDocumentRemoved(document: TextDocument) {\n const uri = document.uri;\n if (languageModels[uri]) {\n delete languageModels[uri];\n nModels--;\n }\n },\n dispose() {\n if (typeof cleanupInterval !== 'undefined') {\n clearInterval(cleanupInterval);\n cleanupInterval = null as any;\n languageModels = {};\n nModels = 0;\n }\n }\n };\n}\n", "import fs from 'fs';\nimport path from 'path';\nimport { CompletionItem, InsertTextFormat, CompletionItemKind, MarkupContent } from 'vscode-languageserver-types';\nimport { logger } from '../../log';\n\ntype SnippetSource = 'workspace' | 'user' | 'vetur';\ntype SnippetType = 'file' | 'template' | 'style' | 'script' | 'custom';\ninterface Snippet {\n source: SnippetSource;\n name: string;\n type: SnippetType;\n customTypeName?: string;\n content: string;\n}\n\nexport interface ScaffoldSnippetSources {\n workspace: string | undefined;\n user: string | undefined;\n vetur: string | undefined;\n}\n\nexport class SnippetManager {\n private _snippets: Snippet[] = [];\n\n constructor(snippetFolder: string, globalSnippetDir?: string) {\n const workspaceSnippets = loadAllSnippets(snippetFolder, 'workspace');\n const userSnippets = globalSnippetDir ? loadAllSnippets(globalSnippetDir, 'user') : [];\n const veturSnippets = loadAllSnippets(path.resolve(__dirname, './veturSnippets'), 'vetur');\n\n this._snippets = [...workspaceSnippets, ...userSnippets, ...veturSnippets];\n }\n\n // Return all snippets in order\n completeSnippets(scaffoldSnippetSources: ScaffoldSnippetSources): CompletionItem[] {\n return this._snippets\n .filter(s => {\n return scaffoldSnippetSources[s.source] !== '';\n })\n .map(s => {\n let scaffoldLabelPre = '';\n switch (s.type) {\n case 'file':\n scaffoldLabelPre = '<vue> with';\n break;\n case 'custom':\n scaffoldLabelPre = `<${s.customTypeName || 'custom'}> with`;\n break;\n case 'template':\n case 'style':\n case 'script':\n scaffoldLabelPre = `<${s.type}>`;\n break;\n }\n\n const sourceIndicator = scaffoldSnippetSources[s.source];\n const label = `${scaffoldLabelPre} ${s.name} ${sourceIndicator}`;\n\n return <CompletionItem>{\n label,\n insertText: s.content,\n insertTextFormat: InsertTextFormat.Snippet,\n // Use file icon to indicate file/template/style/script/custom completions\n kind: CompletionItemKind.File,\n documentation: computeDocumentation(s),\n detail: computeDetailsForFileIcon(s),\n sortText: computeSortTextPrefix(s) + label\n };\n });\n }\n}\n\nfunction loadAllSnippets(rootDir: string, source: SnippetSource): Snippet[] {\n let snippets = [\n ...loadSnippetsFromDir(rootDir, source, 'file'),\n ...loadSnippetsFromDir(path.resolve(rootDir, 'template'), source, 'template'),\n ...loadSnippetsFromDir(path.resolve(rootDir, 'style'), source, 'style'),\n ...loadSnippetsFromDir(path.resolve(rootDir, 'script'), source, 'script')\n ];\n\n try {\n fs.readdirSync(rootDir).forEach(p => {\n if (p === 'template' || p === 'style' || p === 'script') {\n return;\n }\n const absPath = path.resolve(rootDir, p);\n if (!absPath.endsWith('.vue') && fs.existsSync(absPath) && fs.lstatSync(absPath).isDirectory()) {\n const customDirSnippets = loadSnippetsFromDir(absPath, source, 'custom').map(s => {\n return {\n ...s,\n customTypeName: p\n };\n });\n\n snippets = [...snippets, ...customDirSnippets];\n }\n });\n } catch (err) {\n logger.logDebug((err as Error).message);\n }\n\n return snippets;\n}\n\nfunction loadSnippetsFromDir(dir: string, source: SnippetSource, type: SnippetType): Snippet[] {\n const snippets: Snippet[] = [];\n\n if (!fs.existsSync(dir)) {\n return snippets;\n }\n\n try {\n fs.readdirSync(dir)\n .filter(p => p.endsWith('.vue'))\n .forEach(p => {\n snippets.push({\n source,\n name: p,\n type,\n content: fs.readFileSync(path.resolve(dir, p), 'utf-8').replace(/\\\\t/g, '\\t')\n });\n });\n } catch (err) {\n logger.logDebug((err as Error).message);\n }\n\n return snippets;\n}\n\nfunction computeSortTextPrefix(snippet: Snippet) {\n const s = {\n workspace: 0,\n user: 1,\n vetur: 2\n }[snippet.source];\n\n const t = {\n file: 'a',\n template: 'b',\n style: 'c',\n script: 'd',\n custom: 'e'\n }[snippet.type];\n\n return s + t;\n}\n\nfunction computeDetailsForFileIcon(s: Snippet) {\n switch (s.type) {\n case 'file':\n return s.name + ' | .vue';\n case 'template':\n return s.name + ' | .html';\n case 'style':\n return s.name + ' | .css';\n case 'script':\n return s.name + ' | .js';\n case 'custom':\n return s.name;\n }\n}\n\nfunction computeDocumentation(s: Snippet): MarkupContent {\n return {\n kind: 'markdown',\n value: `\\`\\`\\`vue\\n${s.content}\\n\\`\\`\\``\n };\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nexport var TokenType;\n(function (TokenType) {\n TokenType[TokenType[\"Ident\"] = 0] = \"Ident\";\n TokenType[TokenType[\"AtKeyword\"] = 1] = \"AtKeyword\";\n TokenType[TokenType[\"String\"] = 2] = \"String\";\n TokenType[TokenType[\"BadString\"] = 3] = \"BadString\";\n TokenType[TokenType[\"UnquotedString\"] = 4] = \"UnquotedString\";\n TokenType[TokenType[\"Hash\"] = 5] = \"Hash\";\n TokenType[TokenType[\"Num\"] = 6] = \"Num\";\n TokenType[TokenType[\"Percentage\"] = 7] = \"Percentage\";\n TokenType[TokenType[\"Dimension\"] = 8] = \"Dimension\";\n TokenType[TokenType[\"UnicodeRange\"] = 9] = \"UnicodeRange\";\n TokenType[TokenType[\"CDO\"] = 10] = \"CDO\";\n TokenType[TokenType[\"CDC\"] = 11] = \"CDC\";\n TokenType[TokenType[\"Colon\"] = 12] = \"Colon\";\n TokenType[TokenType[\"SemiColon\"] = 13] = \"SemiColon\";\n TokenType[TokenType[\"CurlyL\"] = 14] = \"CurlyL\";\n TokenType[TokenType[\"CurlyR\"] = 15] = \"CurlyR\";\n TokenType[TokenType[\"ParenthesisL\"] = 16] = \"ParenthesisL\";\n TokenType[TokenType[\"ParenthesisR\"] = 17] = \"ParenthesisR\";\n TokenType[TokenType[\"BracketL\"] = 18] = \"BracketL\";\n TokenType[TokenType[\"BracketR\"] = 19] = \"BracketR\";\n TokenType[TokenType[\"Whitespace\"] = 20] = \"Whitespace\";\n TokenType[TokenType[\"Includes\"] = 21] = \"Includes\";\n TokenType[TokenType[\"Dashmatch\"] = 22] = \"Dashmatch\";\n TokenType[TokenType[\"SubstringOperator\"] = 23] = \"SubstringOperator\";\n TokenType[TokenType[\"PrefixOperator\"] = 24] = \"PrefixOperator\";\n TokenType[TokenType[\"SuffixOperator\"] = 25] = \"SuffixOperator\";\n TokenType[TokenType[\"Delim\"] = 26] = \"Delim\";\n TokenType[TokenType[\"EMS\"] = 27] = \"EMS\";\n TokenType[TokenType[\"EXS\"] = 28] = \"EXS\";\n TokenType[TokenType[\"Length\"] = 29] = \"Length\";\n TokenType[TokenType[\"Angle\"] = 30] = \"Angle\";\n TokenType[TokenType[\"Time\"] = 31] = \"Time\";\n TokenType[TokenType[\"Freq\"] = 32] = \"Freq\";\n TokenType[TokenType[\"Exclamation\"] = 33] = \"Exclamation\";\n TokenType[TokenType[\"Resolution\"] = 34] = \"Resolution\";\n TokenType[TokenType[\"Comma\"] = 35] = \"Comma\";\n TokenType[TokenType[\"Charset\"] = 36] = \"Charset\";\n TokenType[TokenType[\"EscapedJavaScript\"] = 37] = \"EscapedJavaScript\";\n TokenType[TokenType[\"BadEscapedJavaScript\"] = 38] = \"BadEscapedJavaScript\";\n TokenType[TokenType[\"Comment\"] = 39] = \"Comment\";\n TokenType[TokenType[\"SingleLineComment\"] = 40] = \"SingleLineComment\";\n TokenType[TokenType[\"EOF\"] = 41] = \"EOF\";\n TokenType[TokenType[\"CustomToken\"] = 42] = \"CustomToken\";\n})(TokenType || (TokenType = {}));\nexport class MultiLineStream {\n constructor(source) {\n this.source = source;\n this.len = source.length;\n this.position = 0;\n }\n substring(from, to = this.position) {\n return this.source.substring(from, to);\n }\n eos() {\n return this.len <= this.position;\n }\n pos() {\n return this.position;\n }\n goBackTo(pos) {\n this.position = pos;\n }\n goBack(n) {\n this.position -= n;\n }\n advance(n) {\n this.position += n;\n }\n nextChar() {\n return this.source.charCodeAt(this.position++) || 0;\n }\n peekChar(n = 0) {\n return this.source.charCodeAt(this.position + n) || 0;\n }\n lookbackChar(n = 0) {\n return this.source.charCodeAt(this.position - n) || 0;\n }\n advanceIfChar(ch) {\n if (ch === this.source.charCodeAt(this.position)) {\n this.position++;\n return true;\n }\n return false;\n }\n advanceIfChars(ch) {\n if (this.position + ch.length > this.source.length) {\n return false;\n }\n let i = 0;\n for (; i < ch.length; i++) {\n if (this.source.charCodeAt(this.position + i) !== ch[i]) {\n return false;\n }\n }\n this.advance(i);\n return true;\n }\n advanceWhileChar(condition) {\n const posNow = this.position;\n while (this.position < this.len && condition(this.source.charCodeAt(this.position))) {\n this.position++;\n }\n return this.position - posNow;\n }\n}\nconst _a = 'a'.charCodeAt(0);\nconst _f = 'f'.charCodeAt(0);\nconst _z = 'z'.charCodeAt(0);\nconst _u = 'u'.charCodeAt(0);\nconst _A = 'A'.charCodeAt(0);\nconst _F = 'F'.charCodeAt(0);\nconst _Z = 'Z'.charCodeAt(0);\nconst _0 = '0'.charCodeAt(0);\nconst _9 = '9'.charCodeAt(0);\nconst _TLD = '~'.charCodeAt(0);\nconst _HAT = '^'.charCodeAt(0);\nconst _EQS = '='.charCodeAt(0);\nconst _PIP = '|'.charCodeAt(0);\nconst _MIN = '-'.charCodeAt(0);\nconst _USC = '_'.charCodeAt(0);\nconst _PRC = '%'.charCodeAt(0);\nconst _MUL = '*'.charCodeAt(0);\nconst _LPA = '('.charCodeAt(0);\nconst _RPA = ')'.charCodeAt(0);\nconst _LAN = '<'.charCodeAt(0);\nconst _RAN = '>'.charCodeAt(0);\nconst _ATS = '@'.charCodeAt(0);\nconst _HSH = '#'.charCodeAt(0);\nconst _DLR = '$'.charCodeAt(0);\nconst _BSL = '\\\\'.charCodeAt(0);\nconst _FSL = '/'.charCodeAt(0);\nconst _NWL = '\\n'.charCodeAt(0);\nconst _CAR = '\\r'.charCodeAt(0);\nconst _LFD = '\\f'.charCodeAt(0);\nconst _DQO = '\"'.charCodeAt(0);\nconst _SQO = '\\''.charCodeAt(0);\nconst _WSP = ' '.charCodeAt(0);\nconst _TAB = '\\t'.charCodeAt(0);\nconst _SEM = ';'.charCodeAt(0);\nconst _COL = ':'.charCodeAt(0);\nconst _CUL = '{'.charCodeAt(0);\nconst _CUR = '}'.charCodeAt(0);\nconst _BRL = '['.charCodeAt(0);\nconst _BRR = ']'.charCodeAt(0);\nconst _CMA = ','.charCodeAt(0);\nconst _DOT = '.'.charCodeAt(0);\nconst _BNG = '!'.charCodeAt(0);\nconst _QSM = '?'.charCodeAt(0);\nconst _PLS = '+'.charCodeAt(0);\nconst staticTokenTable = {};\nstaticTokenTable[_SEM] = TokenType.SemiColon;\nstaticTokenTable[_COL] = TokenType.Colon;\nstaticTokenTable[_CUL] = TokenType.CurlyL;\nstaticTokenTable[_CUR] = TokenType.CurlyR;\nstaticTokenTable[_BRR] = TokenType.BracketR;\nstaticTokenTable[_BRL] = TokenType.BracketL;\nstaticTokenTable[_LPA] = TokenType.ParenthesisL;\nstaticTokenTable[_RPA] = TokenType.ParenthesisR;\nstaticTokenTable[_CMA] = TokenType.Comma;\nconst staticUnitTable = {};\nstaticUnitTable['em'] = TokenType.EMS;\nstaticUnitTable['ex'] = TokenType.EXS;\nstaticUnitTable['px'] = TokenType.Length;\nstaticUnitTable['cm'] = TokenType.Length;\nstaticUnitTable['mm'] = TokenType.Length;\nstaticUnitTable['in'] = TokenType.Length;\nstaticUnitTable['pt'] = TokenType.Length;\nstaticUnitTable['pc'] = TokenType.Length;\nstaticUnitTable['deg'] = TokenType.Angle;\nstaticUnitTable['rad'] = TokenType.Angle;\nstaticUnitTable['grad'] = TokenType.Angle;\nstaticUnitTable['ms'] = TokenType.Time;\nstaticUnitTable['s'] = TokenType.Time;\nstaticUnitTable['hz'] = TokenType.Freq;\nstaticUnitTable['khz'] = TokenType.Freq;\nstaticUnitTable['%'] = TokenType.Percentage;\nstaticUnitTable['fr'] = TokenType.Percentage;\nstaticUnitTable['dpi'] = TokenType.Resolution;\nstaticUnitTable['dpcm'] = TokenType.Resolution;\nexport class Scanner {\n constructor() {\n this.stream = new MultiLineStream('');\n this.ignoreComment = true;\n this.ignoreWhitespace = true;\n this.inURL = false;\n }\n setSource(input) {\n this.stream = new MultiLineStream(input);\n }\n finishToken(offset, type, text) {\n return {\n offset: offset,\n len: this.stream.pos() - offset,\n type: type,\n text: text || this.stream.substring(offset)\n };\n }\n substring(offset, len) {\n return this.stream.substring(offset, offset + len);\n }\n pos() {\n return this.stream.pos();\n }\n goBackTo(pos) {\n this.stream.goBackTo(pos);\n }\n scanUnquotedString() {\n const offset = this.stream.pos();\n const content = [];\n if (this._unquotedString(content)) {\n return this.finishToken(offset, TokenType.UnquotedString, content.join(''));\n }\n return null;\n }\n scan() {\n // processes all whitespaces and comments\n const triviaToken = this.trivia();\n if (triviaToken !== null) {\n return triviaToken;\n }\n const offset = this.stream.pos();\n // End of file/input\n if (this.stream.eos()) {\n return this.finishToken(offset, TokenType.EOF);\n }\n return this.scanNext(offset);\n }\n /**\n * Read the range as described in https://www.w3.org/TR/CSS21/syndata.html#tokenization\n * Assume the `u` has aleady been consumed\n * @returns if reading the unicode was successful\n */\n tryScanUnicode() {\n const offset = this.stream.pos();\n if (!this.stream.eos() && this._unicodeRange()) {\n return this.finishToken(offset, TokenType.UnicodeRange);\n }\n this.stream.goBackTo(offset);\n return undefined;\n }\n scanNext(offset) {\n // CDO <!--\n if (this.stream.advanceIfChars([_LAN, _BNG, _MIN, _MIN])) {\n return this.finishToken(offset, TokenType.CDO);\n }\n // CDC -->\n if (this.stream.advanceIfChars([_MIN, _MIN, _RAN])) {\n return this.finishToken(offset, TokenType.CDC);\n }\n let content = [];\n if (this.ident(content)) {\n return this.finishToken(offset, TokenType.Ident, content.join(''));\n }\n // at-keyword\n if (this.stream.advanceIfChar(_ATS)) {\n content = ['@'];\n if (this._name(content)) {\n const keywordText = content.join('');\n if (keywordText === '@charset') {\n return this.finishToken(offset, TokenType.Charset, keywordText);\n }\n return this.finishToken(offset, TokenType.AtKeyword, keywordText);\n }\n else {\n return this.finishToken(offset, TokenType.Delim);\n }\n }\n // hash\n if (this.stream.advanceIfChar(_HSH)) {\n content = ['#'];\n if (this._name(content)) {\n return this.finishToken(offset, TokenType.Hash, content.join(''));\n }\n else {\n return this.finishToken(offset, TokenType.Delim);\n }\n }\n // Important\n if (this.stream.advanceIfChar(_BNG)) {\n return this.finishToken(offset, TokenType.Exclamation);\n }\n // Numbers\n if (this._number()) {\n const pos = this.stream.pos();\n content = [this.stream.substring(offset, pos)];\n if (this.stream.advanceIfChar(_PRC)) {\n // Percentage 43%\n return this.finishToken(offset, TokenType.Percentage);\n }\n else if (this.ident(content)) {\n const dim = this.stream.substring(pos).toLowerCase();\n const tokenType = staticUnitTable[dim];\n if (typeof tokenType !== 'undefined') {\n // Known dimension 43px\n return this.finishToken(offset, tokenType, content.join(''));\n }\n else {\n // Unknown dimension 43ft\n return this.finishToken(offset, TokenType.Dimension, content.join(''));\n }\n }\n return this.finishToken(offset, TokenType.Num);\n }\n // String, BadString\n content = [];\n let tokenType = this._string(content);\n if (tokenType !== null) {\n return this.finishToken(offset, tokenType, content.join(''));\n }\n // single character tokens\n tokenType = staticTokenTable[this.stream.peekChar()];\n if (typeof tokenType !== 'undefined') {\n this.stream.advance(1);\n return this.finishToken(offset, tokenType);\n }\n // includes ~=\n if (this.stream.peekChar(0) === _TLD && this.stream.peekChar(1) === _EQS) {\n this.stream.advance(2);\n return this.finishToken(offset, TokenType.Includes);\n }\n // DashMatch |=\n if (this.stream.peekChar(0) === _PIP && this.stream.peekChar(1) === _EQS) {\n this.stream.advance(2);\n return this.finishToken(offset, TokenType.Dashmatch);\n }\n // Substring operator *=\n if (this.stream.peekChar(0) === _MUL && this.stream.peekChar(1) === _EQS) {\n this.stream.advance(2);\n return this.finishToken(offset, TokenType.SubstringOperator);\n }\n // Substring operator ^=\n if (this.stream.peekChar(0) === _HAT && this.stream.peekChar(1) === _EQS) {\n this.stream.advance(2);\n return this.finishToken(offset, TokenType.PrefixOperator);\n }\n // Substring operator $=\n if (this.stream.peekChar(0) === _DLR && this.stream.peekChar(1) === _EQS) {\n this.stream.advance(2);\n return this.finishToken(offset, TokenType.SuffixOperator);\n }\n // Delim\n this.stream.nextChar();\n return this.finishToken(offset, TokenType.Delim);\n }\n trivia() {\n while (true) {\n const offset = this.stream.pos();\n if (this._whitespace()) {\n if (!this.ignoreWhitespace) {\n return this.finishToken(offset, TokenType.Whitespace);\n }\n }\n else if (this.comment()) {\n if (!this.ignoreComment) {\n return this.finishToken(offset, TokenType.Comment);\n }\n }\n else {\n return null;\n }\n }\n }\n comment() {\n if (this.stream.advanceIfChars([_FSL, _MUL])) {\n let success = false, hot = false;\n this.stream.advanceWhileChar((ch) => {\n if (hot && ch === _FSL) {\n success = true;\n return false;\n }\n hot = ch === _MUL;\n return true;\n });\n if (success) {\n this.stream.advance(1);\n }\n return true;\n }\n return false;\n }\n _number() {\n let npeek = 0, ch;\n if (this.stream.peekChar() === _DOT) {\n npeek = 1;\n }\n ch = this.stream.peekChar(npeek);\n if (ch >= _0 && ch <= _9) {\n this.stream.advance(npeek + 1);\n this.stream.advanceWhileChar((ch) => {\n return ch >= _0 && ch <= _9 || npeek === 0 && ch === _DOT;\n });\n return true;\n }\n return false;\n }\n _newline(result) {\n const ch = this.stream.peekChar();\n switch (ch) {\n case _CAR:\n case _LFD:\n case _NWL:\n this.stream.advance(1);\n result.push(String.fromCharCode(ch));\n if (ch === _CAR && this.stream.advanceIfChar(_NWL)) {\n result.push('\\n');\n }\n return true;\n }\n return false;\n }\n _escape(result, includeNewLines) {\n let ch = this.stream.peekChar();\n if (ch === _BSL) {\n this.stream.advance(1);\n ch = this.stream.peekChar();\n let hexNumCount = 0;\n while (hexNumCount < 6 && (ch >= _0 && ch <= _9 || ch >= _a && ch <= _f || ch >= _A && ch <= _F)) {\n this.stream.advance(1);\n ch = this.stream.peekChar();\n hexNumCount++;\n }\n if (hexNumCount > 0) {\n try {\n const hexVal = parseInt(this.stream.substring(this.stream.pos() - hexNumCount), 16);\n if (hexVal) {\n result.push(String.fromCharCode(hexVal));\n }\n }\n catch (e) {\n // ignore\n }\n // optional whitespace or new line, not part of result text\n if (ch === _WSP || ch === _TAB) {\n this.stream.advance(1);\n }\n else {\n this._newline([]);\n }\n return true;\n }\n if (ch !== _CAR && ch !== _LFD && ch !== _NWL) {\n this.stream.advance(1);\n result.push(String.fromCharCode(ch));\n return true;\n }\n else if (includeNewLines) {\n return this._newline(result);\n }\n }\n return false;\n }\n _stringChar(closeQuote, result) {\n // not closeQuote, not backslash, not newline\n const ch = this.stream.peekChar();\n if (ch !== 0 && ch !== closeQuote && ch !== _BSL && ch !== _CAR && ch !== _LFD && ch !== _NWL) {\n this.stream.advance(1);\n result.push(String.fromCharCode(ch));\n return true;\n }\n return false;\n }\n _string(result) {\n if (this.stream.peekChar() === _SQO || this.stream.peekChar() === _DQO) {\n const closeQuote = this.stream.nextChar();\n result.push(String.fromCharCode(closeQuote));\n while (this._stringChar(closeQuote, result) || this._escape(result, true)) {\n // loop\n }\n if (this.stream.peekChar() === closeQuote) {\n this.stream.nextChar();\n result.push(String.fromCharCode(closeQuote));\n return TokenType.String;\n }\n else {\n return TokenType.BadString;\n }\n }\n return null;\n }\n _unquotedChar(result) {\n // not closeQuote, not backslash, not newline\n const ch = this.stream.peekChar();\n if (ch !== 0 && ch !== _BSL && ch !== _SQO && ch !== _DQO && ch !== _LPA && ch !== _RPA && ch !== _WSP && ch !== _TAB && ch !== _NWL && ch !== _LFD && ch !== _CAR) {\n this.stream.advance(1);\n result.push(String.fromCharCode(ch));\n return true;\n }\n return false;\n }\n _unquotedString(result) {\n let hasContent = false;\n while (this._unquotedChar(result) || this._escape(result)) {\n hasContent = true;\n }\n return hasContent;\n }\n _whitespace() {\n const n = this.stream.advanceWhileChar((ch) => {\n return ch === _WSP || ch === _TAB || ch === _NWL || ch === _LFD || ch === _CAR;\n });\n return n > 0;\n }\n _name(result) {\n let matched = false;\n while (this._identChar(result) || this._escape(result)) {\n matched = true;\n }\n return matched;\n }\n ident(result) {\n const pos = this.stream.pos();\n const hasMinus = this._minus(result);\n if (hasMinus) {\n if (this._minus(result) /* -- */ || this._identFirstChar(result) || this._escape(result)) {\n while (this._identChar(result) || this._escape(result)) {\n // loop\n }\n return true;\n }\n }\n else if (this._identFirstChar(result) || this._escape(result)) {\n while (this._identChar(result) || this._escape(result)) {\n // loop\n }\n return true;\n }\n this.stream.goBackTo(pos);\n return false;\n }\n _identFirstChar(result) {\n const ch = this.stream.peekChar();\n if (ch === _USC || // _\n ch >= _a && ch <= _z || // a-z\n ch >= _A && ch <= _Z || // A-Z\n ch >= 0x80 && ch <= 0xFFFF) { // nonascii\n this.stream.advance(1);\n result.push(String.fromCharCode(ch));\n return true;\n }\n return false;\n }\n _minus(result) {\n const ch = this.stream.peekChar();\n if (ch === _MIN) {\n this.stream.advance(1);\n result.push(String.fromCharCode(ch));\n return true;\n }\n return false;\n }\n _identChar(result) {\n const ch = this.stream.peekChar();\n if (ch === _USC || // _\n ch === _MIN || // -\n ch >= _a && ch <= _z || // a-z\n ch >= _A && ch <= _Z || // A-Z\n ch >= _0 && ch <= _9 || // 0/9\n ch >= 0x80 && ch <= 0xFFFF) { // nonascii\n this.stream.advance(1);\n result.push(String.fromCharCode(ch));\n return true;\n }\n return false;\n }\n _unicodeRange() {\n // follow https://www.w3.org/TR/CSS21/syndata.html#tokenization and https://www.w3.org/TR/css-syntax-3/#urange-syntax\n // assume u has already been parsed\n if (this.stream.advanceIfChar(_PLS)) {\n const isHexDigit = (ch) => (ch >= _0 && ch <= _9 || ch >= _a && ch <= _f || ch >= _A && ch <= _F);\n const codePoints = this.stream.advanceWhileChar(isHexDigit) + this.stream.advanceWhileChar(ch => ch === _QSM);\n if (codePoints >= 1 && codePoints <= 6) {\n if (this.stream.advanceIfChar(_MIN)) {\n const digits = this.stream.advanceWhileChar(isHexDigit);\n if (digits >= 1 && digits <= 6) {\n return true;\n }\n }\n else {\n return true;\n }\n }\n }\n return false;\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nexport function startsWith(haystack, needle) {\n if (haystack.length < needle.length) {\n return false;\n }\n for (let i = 0; i < needle.length; i++) {\n if (haystack[i] !== needle[i]) {\n return false;\n }\n }\n return true;\n}\n/**\n * Determines if haystack ends with needle.\n */\nexport function endsWith(haystack, needle) {\n let diff = haystack.length - needle.length;\n if (diff > 0) {\n return haystack.lastIndexOf(needle) === diff;\n }\n else if (diff === 0) {\n return haystack === needle;\n }\n else {\n return false;\n }\n}\n/**\n * Computes the difference score for two strings. More similar strings have a higher score.\n * We use largest common subsequence dynamic programming approach but penalize in the end for length differences.\n * Strings that have a large length difference will get a bad default score 0.\n * Complexity - both time and space O(first.length * second.length)\n * Dynamic programming LCS computation http://en.wikipedia.org/wiki/Longest_common_subsequence_problem\n *\n * @param first a string\n * @param second a string\n */\nexport function difference(first, second, maxLenDelta = 4) {\n let lengthDifference = Math.abs(first.length - second.length);\n // We only compute score if length of the currentWord and length of entry.name are similar.\n if (lengthDifference > maxLenDelta) {\n return 0;\n }\n // Initialize LCS (largest common subsequence) matrix.\n let LCS = [];\n let zeroArray = [];\n let i, j;\n for (i = 0; i < second.length + 1; ++i) {\n zeroArray.push(0);\n }\n for (i = 0; i < first.length + 1; ++i) {\n LCS.push(zeroArray);\n }\n for (i = 1; i < first.length + 1; ++i) {\n for (j = 1; j < second.length + 1; ++j) {\n if (first[i - 1] === second[j - 1]) {\n LCS[i][j] = LCS[i - 1][j - 1] + 1;\n }\n else {\n LCS[i][j] = Math.max(LCS[i - 1][j], LCS[i][j - 1]);\n }\n }\n }\n return LCS[first.length][second.length] - Math.sqrt(lengthDifference);\n}\n/**\n * Limit of string length.\n */\nexport function getLimitedString(str, ellipsis = true) {\n if (!str) {\n return '';\n }\n if (str.length < 140) {\n return str;\n }\n return str.slice(0, 140) + (ellipsis ? '\\u2026' : '');\n}\n/**\n * Limit of string length.\n */\nexport function trim(str, regexp) {\n const m = regexp.exec(str);\n if (m && m[0].length) {\n return str.substr(0, str.length - m[0].length);\n }\n return str;\n}\nexport function repeat(value, count) {\n let s = '';\n while (count > 0) {\n if ((count & 1) === 1) {\n s += value;\n }\n value += value;\n count = count >>> 1;\n }\n return s;\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport { trim } from \"../utils/strings\";\n/// <summary>\n/// Nodes for the css 2.1 specification. See for reference:\n/// http://www.w3.org/TR/CSS21/grammar.html#grammar\n/// </summary>\nexport var NodeType;\n(function (NodeType) {\n NodeType[NodeType[\"Undefined\"] = 0] = \"Undefined\";\n NodeType[NodeType[\"Identifier\"] = 1] = \"Identifier\";\n NodeType[NodeType[\"Stylesheet\"] = 2] = \"Stylesheet\";\n NodeType[NodeType[\"Ruleset\"] = 3] = \"Ruleset\";\n NodeType[NodeType[\"Selector\"] = 4] = \"Selector\";\n NodeType[NodeType[\"SimpleSelector\"] = 5] = \"SimpleSelector\";\n NodeType[NodeType[\"SelectorInterpolation\"] = 6] = \"SelectorInterpolation\";\n NodeType[NodeType[\"SelectorCombinator\"] = 7] = \"SelectorCombinator\";\n NodeType[NodeType[\"SelectorCombinatorParent\"] = 8] = \"SelectorCombinatorParent\";\n NodeType[NodeType[\"SelectorCombinatorSibling\"] = 9] = \"SelectorCombinatorSibling\";\n NodeType[NodeType[\"SelectorCombinatorAllSiblings\"] = 10] = \"SelectorCombinatorAllSiblings\";\n NodeType[NodeType[\"SelectorCombinatorShadowPiercingDescendant\"] = 11] = \"SelectorCombinatorShadowPiercingDescendant\";\n NodeType[NodeType[\"Page\"] = 12] = \"Page\";\n NodeType[NodeType[\"PageBoxMarginBox\"] = 13] = \"PageBoxMarginBox\";\n NodeType[NodeType[\"ClassSelector\"] = 14] = \"ClassSelector\";\n NodeType[NodeType[\"IdentifierSelector\"] = 15] = \"IdentifierSelector\";\n NodeType[NodeType[\"ElementNameSelector\"] = 16] = \"ElementNameSelector\";\n NodeType[NodeType[\"PseudoSelector\"] = 17] = \"PseudoSelector\";\n NodeType[NodeType[\"AttributeSelector\"] = 18] = \"AttributeSelector\";\n NodeType[NodeType[\"Declaration\"] = 19] = \"Declaration\";\n NodeType[NodeType[\"Declarations\"] = 20] = \"Declarations\";\n NodeType[NodeType[\"Property\"] = 21] = \"Property\";\n NodeType[NodeType[\"Expression\"] = 22] = \"Expression\";\n NodeType[NodeType[\"BinaryExpression\"] = 23] = \"BinaryExpression\";\n NodeType[NodeType[\"Term\"] = 24] = \"Term\";\n NodeType[NodeType[\"Operator\"] = 25] = \"Operator\";\n NodeType[NodeType[\"Value\"] = 26] = \"Value\";\n NodeType[NodeType[\"StringLiteral\"] = 27] = \"StringLiteral\";\n NodeType[NodeType[\"URILiteral\"] = 28] = \"URILiteral\";\n NodeType[NodeType[\"EscapedValue\"] = 29] = \"EscapedValue\";\n NodeType[NodeType[\"Function\"] = 30] = \"Function\";\n NodeType[NodeType[\"NumericValue\"] = 31] = \"NumericValue\";\n NodeType[NodeType[\"HexColorValue\"] = 32] = \"HexColorValue\";\n NodeType[NodeType[\"RatioValue\"] = 33] = \"RatioValue\";\n NodeType[NodeType[\"MixinDeclaration\"] = 34] = \"MixinDeclaration\";\n NodeType[NodeType[\"MixinReference\"] = 35] = \"MixinReference\";\n NodeType[NodeType[\"VariableName\"] = 36] = \"VariableName\";\n NodeType[NodeType[\"VariableDeclaration\"] = 37] = \"VariableDeclaration\";\n NodeType[NodeType[\"Prio\"] = 38] = \"Prio\";\n NodeType[NodeType[\"Interpolation\"] = 39] = \"Interpolation\";\n NodeType[NodeType[\"NestedProperties\"] = 40] = \"NestedProperties\";\n NodeType[NodeType[\"ExtendsReference\"] = 41] = \"ExtendsReference\";\n NodeType[NodeType[\"SelectorPlaceholder\"] = 42] = \"SelectorPlaceholder\";\n NodeType[NodeType[\"Debug\"] = 43] = \"Debug\";\n NodeType[NodeType[\"If\"] = 44] = \"If\";\n NodeType[NodeType[\"Else\"] = 45] = \"Else\";\n NodeType[NodeType[\"For\"] = 46] = \"For\";\n NodeType[NodeType[\"Each\"] = 47] = \"Each\";\n NodeType[NodeType[\"While\"] = 48] = \"While\";\n NodeType[NodeType[\"MixinContentReference\"] = 49] = \"MixinContentReference\";\n NodeType[NodeType[\"MixinContentDeclaration\"] = 50] = \"MixinContentDeclaration\";\n NodeType[NodeType[\"Media\"] = 51] = \"Media\";\n NodeType[NodeType[\"Keyframe\"] = 52] = \"Keyframe\";\n NodeType[NodeType[\"FontFace\"] = 53] = \"FontFace\";\n NodeType[NodeType[\"Import\"] = 54] = \"Import\";\n NodeType[NodeType[\"Namespace\"] = 55] = \"Namespace\";\n NodeType[NodeType[\"Invocation\"] = 56] = \"Invocation\";\n NodeType[NodeType[\"FunctionDeclaration\"] = 57] = \"FunctionDeclaration\";\n NodeType[NodeType[\"ReturnStatement\"] = 58] = \"ReturnStatement\";\n NodeType[NodeType[\"MediaQuery\"] = 59] = \"MediaQuery\";\n NodeType[NodeType[\"MediaCondition\"] = 60] = \"MediaCondition\";\n NodeType[NodeType[\"MediaFeature\"] = 61] = \"MediaFeature\";\n NodeType[NodeType[\"FunctionParameter\"] = 62] = \"FunctionParameter\";\n NodeType[NodeType[\"FunctionArgument\"] = 63] = \"FunctionArgument\";\n NodeType[NodeType[\"KeyframeSelector\"] = 64] = \"KeyframeSelector\";\n NodeType[NodeType[\"ViewPort\"] = 65] = \"ViewPort\";\n NodeType[NodeType[\"Document\"] = 66] = \"Document\";\n NodeType[NodeType[\"AtApplyRule\"] = 67] = \"AtApplyRule\";\n NodeType[NodeType[\"CustomPropertyDeclaration\"] = 68] = \"CustomPropertyDeclaration\";\n NodeType[NodeType[\"CustomPropertySet\"] = 69] = \"CustomPropertySet\";\n NodeType[NodeType[\"ListEntry\"] = 70] = \"ListEntry\";\n NodeType[NodeType[\"Supports\"] = 71] = \"Supports\";\n NodeType[NodeType[\"SupportsCondition\"] = 72] = \"SupportsCondition\";\n NodeType[NodeType[\"NamespacePrefix\"] = 73] = \"NamespacePrefix\";\n NodeType[NodeType[\"GridLine\"] = 74] = \"GridLine\";\n NodeType[NodeType[\"Plugin\"] = 75] = \"Plugin\";\n NodeType[NodeType[\"UnknownAtRule\"] = 76] = \"UnknownAtRule\";\n NodeType[NodeType[\"Use\"] = 77] = \"Use\";\n NodeType[NodeType[\"ModuleConfiguration\"] = 78] = \"ModuleConfiguration\";\n NodeType[NodeType[\"Forward\"] = 79] = \"Forward\";\n NodeType[NodeType[\"ForwardVisibility\"] = 80] = \"ForwardVisibility\";\n NodeType[NodeType[\"Module\"] = 81] = \"Module\";\n NodeType[NodeType[\"UnicodeRange\"] = 82] = \"UnicodeRange\";\n NodeType[NodeType[\"Layer\"] = 83] = \"Layer\";\n NodeType[NodeType[\"LayerNameList\"] = 84] = \"LayerNameList\";\n NodeType[NodeType[\"LayerName\"] = 85] = \"LayerName\";\n NodeType[NodeType[\"PropertyAtRule\"] = 86] = \"PropertyAtRule\";\n})(NodeType || (NodeType = {}));\nexport var ReferenceType;\n(function (ReferenceType) {\n ReferenceType[ReferenceType[\"Mixin\"] = 0] = \"Mixin\";\n ReferenceType[ReferenceType[\"Rule\"] = 1] = \"Rule\";\n ReferenceType[ReferenceType[\"Variable\"] = 2] = \"Variable\";\n ReferenceType[ReferenceType[\"Function\"] = 3] = \"Function\";\n ReferenceType[ReferenceType[\"Keyframe\"] = 4] = \"Keyframe\";\n ReferenceType[ReferenceType[\"Unknown\"] = 5] = \"Unknown\";\n ReferenceType[ReferenceType[\"Module\"] = 6] = \"Module\";\n ReferenceType[ReferenceType[\"Forward\"] = 7] = \"Forward\";\n ReferenceType[ReferenceType[\"ForwardVisibility\"] = 8] = \"ForwardVisibility\";\n ReferenceType[ReferenceType[\"Property\"] = 9] = \"Property\";\n})(ReferenceType || (ReferenceType = {}));\nexport function getNodeAtOffset(node, offset) {\n let candidate = null;\n if (!node || offset < node.offset || offset > node.end) {\n return null;\n }\n // Find the shortest node at the position\n node.accept((node) => {\n if (node.offset === -1 && node.length === -1) {\n return true;\n }\n if (node.offset <= offset && node.end >= offset) {\n if (!candidate) {\n candidate = node;\n }\n else if (node.length <= candidate.length) {\n candidate = node;\n }\n return true;\n }\n return false;\n });\n return candidate;\n}\nexport function getNodePath(node, offset) {\n let candidate = getNodeAtOffset(node, offset);\n const path = [];\n while (candidate) {\n path.unshift(candidate);\n candidate = candidate.parent;\n }\n return path;\n}\nexport function getParentDeclaration(node) {\n const decl = node.findParent(NodeType.Declaration);\n const value = decl && decl.getValue();\n if (value && value.encloses(node)) {\n return decl;\n }\n return null;\n}\nexport class Node {\n get end() { return this.offset + this.length; }\n constructor(offset = -1, len = -1, nodeType) {\n this.parent = null;\n this.offset = offset;\n this.length = len;\n if (nodeType) {\n this.nodeType = nodeType;\n }\n }\n set type(type) {\n this.nodeType = type;\n }\n get type() {\n return this.nodeType || NodeType.Undefined;\n }\n getTextProvider() {\n let node = this;\n while (node && !node.textProvider) {\n node = node.parent;\n }\n if (node) {\n return node.textProvider;\n }\n return () => { return 'unknown'; };\n }\n getText() {\n return this.getTextProvider()(this.offset, this.length);\n }\n matches(str) {\n return this.length === str.length && this.getTextProvider()(this.offset, this.length) === str;\n }\n startsWith(str) {\n return this.length >= str.length && this.getTextProvider()(this.offset, str.length) === str;\n }\n endsWith(str) {\n return this.length >= str.length && this.getTextProvider()(this.end - str.length, str.length) === str;\n }\n accept(visitor) {\n if (visitor(this) && this.children) {\n for (const child of this.children) {\n child.accept(visitor);\n }\n }\n }\n acceptVisitor(visitor) {\n this.accept(visitor.visitNode.bind(visitor));\n }\n adoptChild(node, index = -1) {\n if (node.parent && node.parent.children) {\n const idx = node.parent.children.indexOf(node);\n if (idx >= 0) {\n node.parent.children.splice(idx, 1);\n }\n }\n node.parent = this;\n let children = this.children;\n if (!children) {\n children = this.children = [];\n }\n if (index !== -1) {\n children.splice(index, 0, node);\n }\n else {\n children.push(node);\n }\n return node;\n }\n attachTo(parent, index = -1) {\n if (parent) {\n parent.adoptChild(this, index);\n }\n return this;\n }\n collectIssues(results) {\n if (this.issues) {\n results.push.apply(results, this.issues);\n }\n }\n addIssue(issue) {\n if (!this.issues) {\n this.issues = [];\n }\n this.issues.push(issue);\n }\n hasIssue(rule) {\n return Array.isArray(this.issues) && this.issues.some(i => i.getRule() === rule);\n }\n isErroneous(recursive = false) {\n if (this.issues && this.issues.length > 0) {\n return true;\n }\n return recursive && Array.isArray(this.children) && this.children.some(c => c.isErroneous(true));\n }\n setNode(field, node, index = -1) {\n if (node) {\n node.attachTo(this, index);\n this[field] = node;\n return true;\n }\n return false;\n }\n addChild(node) {\n if (node) {\n if (!this.children) {\n this.children = [];\n }\n node.attachTo(this);\n this.updateOffsetAndLength(node);\n return true;\n }\n return false;\n }\n updateOffsetAndLength(node) {\n if (node.offset < this.offset || this.offset === -1) {\n this.offset = node.offset;\n }\n const nodeEnd = node.end;\n if ((nodeEnd > this.end) || this.length === -1) {\n this.length = nodeEnd - this.offset;\n }\n }\n hasChildren() {\n return !!this.children && this.children.length > 0;\n }\n getChildren() {\n return this.children ? this.children.slice(0) : [];\n }\n getChild(index) {\n if (this.children && index < this.children.length) {\n return this.children[index];\n }\n return null;\n }\n addChildren(nodes) {\n for (const node of nodes) {\n this.addChild(node);\n }\n }\n findFirstChildBeforeOffset(offset) {\n if (this.children) {\n let current = null;\n for (let i = this.children.length - 1; i >= 0; i--) {\n // iterate until we find a child that has a start offset smaller than the input offset\n current = this.children[i];\n if (current.offset <= offset) {\n return current;\n }\n }\n }\n return null;\n }\n findChildAtOffset(offset, goDeep) {\n const current = this.findFirstChildBeforeOffset(offset);\n if (current && current.end >= offset) {\n if (goDeep) {\n return current.findChildAtOffset(offset, true) || current;\n }\n return current;\n }\n return null;\n }\n encloses(candidate) {\n return this.offset <= candidate.offset && this.offset + this.length >= candidate.offset + candidate.length;\n }\n getParent() {\n let result = this.parent;\n while (result instanceof Nodelist) {\n result = result.parent;\n }\n return result;\n }\n findParent(type) {\n let result = this;\n while (result && result.type !== type) {\n result = result.parent;\n }\n return result;\n }\n findAParent(...types) {\n let result = this;\n while (result && !types.some(t => result.type === t)) {\n result = result.parent;\n }\n return result;\n }\n setData(key, value) {\n if (!this.options) {\n this.options = {};\n }\n this.options[key] = value;\n }\n getData(key) {\n if (!this.options || !this.options.hasOwnProperty(key)) {\n return null;\n }\n return this.options[key];\n }\n}\nexport class Nodelist extends Node {\n constructor(parent, index = -1) {\n super(-1, -1);\n this.attachTo(parent, index);\n this.offset = -1;\n this.length = -1;\n }\n}\nexport class UnicodeRange extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.UnicodeRange;\n }\n setRangeStart(rangeStart) {\n return this.setNode('rangeStart', rangeStart);\n }\n getRangeStart() {\n return this.rangeStart;\n }\n setRangeEnd(rangeEnd) {\n return this.setNode('rangeEnd', rangeEnd);\n }\n getRangeEnd() {\n return this.rangeEnd;\n }\n}\nexport class Identifier extends Node {\n constructor(offset, length) {\n super(offset, length);\n this.isCustomProperty = false;\n }\n get type() {\n return NodeType.Identifier;\n }\n containsInterpolation() {\n return this.hasChildren();\n }\n}\nexport class Stylesheet extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.Stylesheet;\n }\n}\nexport class Declarations extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.Declarations;\n }\n}\nexport class BodyDeclaration extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n getDeclarations() {\n return this.declarations;\n }\n setDeclarations(decls) {\n return this.setNode('declarations', decls);\n }\n}\nexport class RuleSet extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.Ruleset;\n }\n getSelectors() {\n if (!this.selectors) {\n this.selectors = new Nodelist(this);\n }\n return this.selectors;\n }\n isNested() {\n return !!this.parent && this.parent.findParent(NodeType.Declarations) !== null;\n }\n}\nexport class Selector extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.Selector;\n }\n}\nexport class SimpleSelector extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.SimpleSelector;\n }\n}\nexport class AtApplyRule extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.AtApplyRule;\n }\n setIdentifier(node) {\n return this.setNode('identifier', node, 0);\n }\n getIdentifier() {\n return this.identifier;\n }\n getName() {\n return this.identifier ? this.identifier.getText() : '';\n }\n}\nexport class AbstractDeclaration extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n}\nexport class CustomPropertySet extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.CustomPropertySet;\n }\n}\nexport class Declaration extends AbstractDeclaration {\n constructor(offset, length) {\n super(offset, length);\n this.property = null;\n }\n get type() {\n return NodeType.Declaration;\n }\n setProperty(node) {\n return this.setNode('property', node);\n }\n getProperty() {\n return this.property;\n }\n getFullPropertyName() {\n const propertyName = this.property ? this.property.getName() : 'unknown';\n if (this.parent instanceof Declarations && this.parent.getParent() instanceof NestedProperties) {\n const parentDecl = this.parent.getParent().getParent();\n if (parentDecl instanceof Declaration) {\n return parentDecl.getFullPropertyName() + propertyName;\n }\n }\n return propertyName;\n }\n getNonPrefixedPropertyName() {\n const propertyName = this.getFullPropertyName();\n if (propertyName && propertyName.charAt(0) === '-') {\n const vendorPrefixEnd = propertyName.indexOf('-', 1);\n if (vendorPrefixEnd !== -1) {\n return propertyName.substring(vendorPrefixEnd + 1);\n }\n }\n return propertyName;\n }\n setValue(value) {\n return this.setNode('value', value);\n }\n getValue() {\n return this.value;\n }\n setNestedProperties(value) {\n return this.setNode('nestedProperties', value);\n }\n getNestedProperties() {\n return this.nestedProperties;\n }\n}\nexport class CustomPropertyDeclaration extends Declaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.CustomPropertyDeclaration;\n }\n setPropertySet(value) {\n return this.setNode('propertySet', value);\n }\n getPropertySet() {\n return this.propertySet;\n }\n}\nexport class Property extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.Property;\n }\n setIdentifier(value) {\n return this.setNode('identifier', value);\n }\n getIdentifier() {\n return this.identifier;\n }\n getName() {\n return trim(this.getText(), /[_\\+]+$/); /* +_: less merge */\n }\n isCustomProperty() {\n return !!this.identifier && this.identifier.isCustomProperty;\n }\n}\nexport class Invocation extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.Invocation;\n }\n getArguments() {\n if (!this.arguments) {\n this.arguments = new Nodelist(this);\n }\n return this.arguments;\n }\n}\nexport class Function extends Invocation {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.Function;\n }\n setIdentifier(node) {\n return this.setNode('identifier', node, 0);\n }\n getIdentifier() {\n return this.identifier;\n }\n getName() {\n return this.identifier ? this.identifier.getText() : '';\n }\n}\nexport class FunctionParameter extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.FunctionParameter;\n }\n setIdentifier(node) {\n return this.setNode('identifier', node, 0);\n }\n getIdentifier() {\n return this.identifier;\n }\n getName() {\n return this.identifier ? this.identifier.getText() : '';\n }\n setDefaultValue(node) {\n return this.setNode('defaultValue', node, 0);\n }\n getDefaultValue() {\n return this.defaultValue;\n }\n}\nexport class FunctionArgument extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.FunctionArgument;\n }\n setIdentifier(node) {\n return this.setNode('identifier', node, 0);\n }\n getIdentifier() {\n return this.identifier;\n }\n getName() {\n return this.identifier ? this.identifier.getText() : '';\n }\n setValue(node) {\n return this.setNode('value', node, 0);\n }\n getValue() {\n return this.value;\n }\n}\nexport class IfStatement extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.If;\n }\n setExpression(node) {\n return this.setNode('expression', node, 0);\n }\n setElseClause(elseClause) {\n return this.setNode('elseClause', elseClause);\n }\n}\nexport class ForStatement extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.For;\n }\n setVariable(node) {\n return this.setNode('variable', node, 0);\n }\n}\nexport class EachStatement extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.Each;\n }\n getVariables() {\n if (!this.variables) {\n this.variables = new Nodelist(this);\n }\n return this.variables;\n }\n}\nexport class WhileStatement extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.While;\n }\n}\nexport class ElseStatement extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.Else;\n }\n}\nexport class FunctionDeclaration extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.FunctionDeclaration;\n }\n setIdentifier(node) {\n return this.setNode('identifier', node, 0);\n }\n getIdentifier() {\n return this.identifier;\n }\n getName() {\n return this.identifier ? this.identifier.getText() : '';\n }\n getParameters() {\n if (!this.parameters) {\n this.parameters = new Nodelist(this);\n }\n return this.parameters;\n }\n}\nexport class ViewPort extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.ViewPort;\n }\n}\nexport class FontFace extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.FontFace;\n }\n}\nexport class NestedProperties extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.NestedProperties;\n }\n}\nexport class Keyframe extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.Keyframe;\n }\n setKeyword(keyword) {\n return this.setNode('keyword', keyword, 0);\n }\n getKeyword() {\n return this.keyword;\n }\n setIdentifier(node) {\n return this.setNode('identifier', node, 0);\n }\n getIdentifier() {\n return this.identifier;\n }\n getName() {\n return this.identifier ? this.identifier.getText() : '';\n }\n}\nexport class KeyframeSelector extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.KeyframeSelector;\n }\n}\nexport class Import extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.Import;\n }\n setMedialist(node) {\n if (node) {\n node.attachTo(this);\n return true;\n }\n return false;\n }\n}\nexport class Use extends Node {\n get type() {\n return NodeType.Use;\n }\n getParameters() {\n if (!this.parameters) {\n this.parameters = new Nodelist(this);\n }\n return this.parameters;\n }\n setIdentifier(node) {\n return this.setNode('identifier', node, 0);\n }\n getIdentifier() {\n return this.identifier;\n }\n}\nexport class ModuleConfiguration extends Node {\n get type() {\n return NodeType.ModuleConfiguration;\n }\n setIdentifier(node) {\n return this.setNode('identifier', node, 0);\n }\n getIdentifier() {\n return this.identifier;\n }\n getName() {\n return this.identifier ? this.identifier.getText() : '';\n }\n setValue(node) {\n return this.setNode('value', node, 0);\n }\n getValue() {\n return this.value;\n }\n}\nexport class Forward extends Node {\n get type() {\n return NodeType.Forward;\n }\n setIdentifier(node) {\n return this.setNode('identifier', node, 0);\n }\n getIdentifier() {\n return this.identifier;\n }\n getMembers() {\n if (!this.members) {\n this.members = new Nodelist(this);\n }\n return this.members;\n }\n getParameters() {\n if (!this.parameters) {\n this.parameters = new Nodelist(this);\n }\n return this.parameters;\n }\n}\nexport class ForwardVisibility extends Node {\n get type() {\n return NodeType.ForwardVisibility;\n }\n setIdentifier(node) {\n return this.setNode('identifier', node, 0);\n }\n getIdentifier() {\n return this.identifier;\n }\n}\nexport class Namespace extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.Namespace;\n }\n}\nexport class Media extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.Media;\n }\n}\nexport class Supports extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.Supports;\n }\n}\nexport class Layer extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.Layer;\n }\n setNames(names) {\n return this.setNode('names', names);\n }\n getNames() {\n return this.names;\n }\n}\nexport class PropertyAtRule extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.PropertyAtRule;\n }\n setName(node) {\n if (node) {\n node.attachTo(this);\n this.name = node;\n return true;\n }\n return false;\n }\n getName() {\n return this.name;\n }\n}\nexport class Document extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.Document;\n }\n}\nexport class Medialist extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n}\nexport class MediaQuery extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.MediaQuery;\n }\n}\nexport class MediaCondition extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.MediaCondition;\n }\n}\nexport class MediaFeature extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.MediaFeature;\n }\n}\nexport class SupportsCondition extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.SupportsCondition;\n }\n}\nexport class Page extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.Page;\n }\n}\nexport class PageBoxMarginBox extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.PageBoxMarginBox;\n }\n}\nexport class Expression extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.Expression;\n }\n}\nexport class BinaryExpression extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.BinaryExpression;\n }\n setLeft(left) {\n return this.setNode('left', left);\n }\n getLeft() {\n return this.left;\n }\n setRight(right) {\n return this.setNode('right', right);\n }\n getRight() {\n return this.right;\n }\n setOperator(value) {\n return this.setNode('operator', value);\n }\n getOperator() {\n return this.operator;\n }\n}\nexport class Term extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.Term;\n }\n setOperator(value) {\n return this.setNode('operator', value);\n }\n getOperator() {\n return this.operator;\n }\n setExpression(value) {\n return this.setNode('expression', value);\n }\n getExpression() {\n return this.expression;\n }\n}\nexport class AttributeSelector extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.AttributeSelector;\n }\n setNamespacePrefix(value) {\n return this.setNode('namespacePrefix', value);\n }\n getNamespacePrefix() {\n return this.namespacePrefix;\n }\n setIdentifier(value) {\n return this.setNode('identifier', value);\n }\n getIdentifier() {\n return this.identifier;\n }\n setOperator(operator) {\n return this.setNode('operator', operator);\n }\n getOperator() {\n return this.operator;\n }\n setValue(value) {\n return this.setNode('value', value);\n }\n getValue() {\n return this.value;\n }\n}\nexport class Operator extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.Operator;\n }\n}\nexport class HexColorValue extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.HexColorValue;\n }\n}\nexport class RatioValue extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.RatioValue;\n }\n}\nconst _dot = '.'.charCodeAt(0), _0 = '0'.charCodeAt(0), _9 = '9'.charCodeAt(0);\nexport class NumericValue extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.NumericValue;\n }\n getValue() {\n const raw = this.getText();\n let unitIdx = 0;\n let code;\n for (let i = 0, len = raw.length; i < len; i++) {\n code = raw.charCodeAt(i);\n if (!(_0 <= code && code <= _9 || code === _dot)) {\n break;\n }\n unitIdx += 1;\n }\n return {\n value: raw.substring(0, unitIdx),\n unit: unitIdx < raw.length ? raw.substring(unitIdx) : undefined\n };\n }\n}\nexport class VariableDeclaration extends AbstractDeclaration {\n constructor(offset, length) {\n super(offset, length);\n this.needsSemicolon = true;\n }\n get type() {\n return NodeType.VariableDeclaration;\n }\n setVariable(node) {\n if (node) {\n node.attachTo(this);\n this.variable = node;\n return true;\n }\n return false;\n }\n getVariable() {\n return this.variable;\n }\n getName() {\n return this.variable ? this.variable.getName() : '';\n }\n setValue(node) {\n if (node) {\n node.attachTo(this);\n this.value = node;\n return true;\n }\n return false;\n }\n getValue() {\n return this.value;\n }\n}\nexport class Interpolation extends Node {\n // private _interpolations: void; // workaround for https://github.com/Microsoft/TypeScript/issues/18276\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.Interpolation;\n }\n}\nexport class Variable extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.VariableName;\n }\n getName() {\n return this.getText();\n }\n}\nexport class ExtendsReference extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.ExtendsReference;\n }\n getSelectors() {\n if (!this.selectors) {\n this.selectors = new Nodelist(this);\n }\n return this.selectors;\n }\n}\nexport class MixinContentReference extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.MixinContentReference;\n }\n getArguments() {\n if (!this.arguments) {\n this.arguments = new Nodelist(this);\n }\n return this.arguments;\n }\n}\nexport class MixinContentDeclaration extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.MixinContentReference;\n }\n getParameters() {\n if (!this.parameters) {\n this.parameters = new Nodelist(this);\n }\n return this.parameters;\n }\n}\nexport class MixinReference extends Node {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.MixinReference;\n }\n getNamespaces() {\n if (!this.namespaces) {\n this.namespaces = new Nodelist(this);\n }\n return this.namespaces;\n }\n setIdentifier(node) {\n return this.setNode('identifier', node, 0);\n }\n getIdentifier() {\n return this.identifier;\n }\n getName() {\n return this.identifier ? this.identifier.getText() : '';\n }\n getArguments() {\n if (!this.arguments) {\n this.arguments = new Nodelist(this);\n }\n return this.arguments;\n }\n setContent(node) {\n return this.setNode('content', node);\n }\n getContent() {\n return this.content;\n }\n}\nexport class MixinDeclaration extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.MixinDeclaration;\n }\n setIdentifier(node) {\n return this.setNode('identifier', node, 0);\n }\n getIdentifier() {\n return this.identifier;\n }\n getName() {\n return this.identifier ? this.identifier.getText() : '';\n }\n getParameters() {\n if (!this.parameters) {\n this.parameters = new Nodelist(this);\n }\n return this.parameters;\n }\n setGuard(node) {\n if (node) {\n node.attachTo(this);\n this.guard = node;\n }\n return false;\n }\n}\nexport class UnknownAtRule extends BodyDeclaration {\n constructor(offset, length) {\n super(offset, length);\n }\n get type() {\n return NodeType.UnknownAtRule;\n }\n setAtRuleName(atRuleName) {\n this.atRuleName = atRuleName;\n }\n getAtRuleName() {\n return this.atRuleName;\n }\n}\nexport class ListEntry extends Node {\n get type() {\n return NodeType.ListEntry;\n }\n setKey(node) {\n return this.setNode('key', node, 0);\n }\n setValue(node) {\n return this.setNode('value', node, 1);\n }\n}\nexport class LessGuard extends Node {\n getConditions() {\n if (!this.conditions) {\n this.conditions = new Nodelist(this);\n }\n return this.conditions;\n }\n}\nexport class GuardCondition extends Node {\n setVariable(node) {\n return this.setNode('variable', node);\n }\n}\nexport class Module extends Node {\n get type() {\n return NodeType.Module;\n }\n setIdentifier(node) {\n return this.setNode('identifier', node, 0);\n }\n getIdentifier() {\n return this.identifier;\n }\n}\nexport var Level;\n(function (Level) {\n Level[Level[\"Ignore\"] = 1] = \"Ignore\";\n Level[Level[\"Warning\"] = 2] = \"Warning\";\n Level[Level[\"Error\"] = 4] = \"Error\";\n})(Level || (Level = {}));\nexport class Marker {\n constructor(node, rule, level, message, offset = node.offset, length = node.length) {\n this.node = node;\n this.rule = rule;\n this.level = level;\n this.message = message || rule.message;\n this.offset = offset;\n this.length = length;\n }\n getRule() {\n return this.rule;\n }\n getLevel() {\n return this.level;\n }\n getOffset() {\n return this.offset;\n }\n getLength() {\n return this.length;\n }\n getNode() {\n return this.node;\n }\n getMessage() {\n return this.message;\n }\n}\n/*\nexport class DefaultVisitor implements IVisitor {\n\n public visitNode(node:Node):boolean {\n switch (node.type) {\n case NodeType.Stylesheet:\n return this.visitStylesheet(<Stylesheet> node);\n case NodeType.FontFace:\n return this.visitFontFace(<FontFace> node);\n case NodeType.Ruleset:\n return this.visitRuleSet(<RuleSet> node);\n case NodeType.Selector:\n return this.visitSelector(<Selector> node);\n case NodeType.SimpleSelector:\n return this.visitSimpleSelector(<SimpleSelector> node);\n case NodeType.Declaration:\n return this.visitDeclaration(<Declaration> node);\n case NodeType.Function:\n return this.visitFunction(<Function> node);\n case NodeType.FunctionDeclaration:\n return this.visitFunctionDeclaration(<FunctionDeclaration> node);\n case NodeType.FunctionParameter:\n return this.visitFunctionParameter(<FunctionParameter> node);\n case NodeType.FunctionArgument:\n return this.visitFunctionArgument(<FunctionArgument> node);\n case NodeType.Term:\n return this.visitTerm(<Term> node);\n case NodeType.Declaration:\n return this.visitExpression(<Expression> node);\n case NodeType.NumericValue:\n return this.visitNumericValue(<NumericValue> node);\n case NodeType.Page:\n return this.visitPage(<Page> node);\n case NodeType.PageBoxMarginBox:\n return this.visitPageBoxMarginBox(<PageBoxMarginBox> node);\n case NodeType.Property:\n return this.visitProperty(<Property> node);\n case NodeType.NumericValue:\n return this.visitNodelist(<Nodelist> node);\n case NodeType.Import:\n return this.visitImport(<Import> node);\n case NodeType.Namespace:\n return this.visitNamespace(<Namespace> node);\n case NodeType.Keyframe:\n return this.visitKeyframe(<Keyframe> node);\n case NodeType.KeyframeSelector:\n return this.visitKeyframeSelector(<KeyframeSelector> node);\n case NodeType.MixinDeclaration:\n return this.visitMixinDeclaration(<MixinDeclaration> node);\n case NodeType.MixinReference:\n return this.visitMixinReference(<MixinReference> node);\n case NodeType.Variable:\n return this.visitVariable(<Variable> node);\n case NodeType.VariableDeclaration:\n return this.visitVariableDeclaration(<VariableDeclaration> node);\n }\n return this.visitUnknownNode(node);\n }\n\n public visitFontFace(node:FontFace):boolean {\n return true;\n }\n\n public visitKeyframe(node:Keyframe):boolean {\n return true;\n }\n\n public visitKeyframeSelector(node:KeyframeSelector):boolean {\n return true;\n }\n\n public visitStylesheet(node:Stylesheet):boolean {\n return true;\n }\n\n public visitProperty(Node:Property):boolean {\n return true;\n }\n\n public visitRuleSet(node:RuleSet):boolean {\n return true;\n }\n\n public visitSelector(node:Selector):boolean {\n return true;\n }\n\n public visitSimpleSelector(node:SimpleSelector):boolean {\n return true;\n }\n\n public visitDeclaration(node:Declaration):boolean {\n return true;\n }\n\n public visitFunction(node:Function):boolean {\n return true;\n }\n\n public visitFunctionDeclaration(node:FunctionDeclaration):boolean {\n return true;\n }\n\n public visitInvocation(node:Invocation):boolean {\n return true;\n }\n\n public visitTerm(node:Term):boolean {\n return true;\n }\n\n public visitImport(node:Import):boolean {\n return true;\n }\n\n public visitNamespace(node:Namespace):boolean {\n return true;\n }\n\n public visitExpression(node:Expression):boolean {\n return true;\n }\n\n public visitNumericValue(node:NumericValue):boolean {\n return true;\n }\n\n public visitPage(node:Page):boolean {\n return true;\n }\n\n public visitPageBoxMarginBox(node:PageBoxMarginBox):boolean {\n return true;\n }\n\n public visitNodelist(node:Nodelist):boolean {\n return true;\n }\n\n public visitVariableDeclaration(node:VariableDeclaration):boolean {\n return true;\n }\n\n public visitVariable(node:Variable):boolean {\n return true;\n }\n\n public visitMixinDeclaration(node:MixinDeclaration):boolean {\n return true;\n }\n\n public visitMixinReference(node:MixinReference):boolean {\n return true;\n }\n\n public visitUnknownNode(node:Node):boolean {\n return true;\n }\n}\n*/\nexport class ParseErrorCollector {\n static entries(node) {\n const visitor = new ParseErrorCollector();\n node.acceptVisitor(visitor);\n return visitor.entries;\n }\n constructor() {\n this.entries = [];\n }\n visitNode(node) {\n if (node.isErroneous()) {\n node.collectIssues(this.entries);\n }\n return true;\n }\n}\n", "async function g(r){if(r.protocol===\"http\"||r.protocol===\"https\")return await(await fetch(r)).text();throw new Error(\"Unsupported protocol\")}function m(r){throw new Error(\"Unsupported in browser\")}var o;function f(r){if(\"contents\"in r){typeof r.contents==\"string\"?o=JSON.parse(r.contents):o=r.contents;return}if(\"fsPath\"in r){let n=m(r.fsPath);o=JSON.parse(n);return}if(r.uri){let n=r.uri;return typeof r.uri==\"string\"&&(n=new URL(r.uri)),g(n).then(t=>{o=JSON.parse(t)})}}function p(...r){let n=r[0],t,e,s;if(typeof n==\"string\"?(t=n,e=n,r.splice(0,1),s=!r||typeof r[0]!=\"object\"?r:r[0]):(e=n.message,t=e,n.comment&&n.comment.length>0&&(t+=`/${Array.isArray(n.comment)?n.comment.join():n.comment}`),s=n.args??{}),!o)return a(e,s);let i=o[t];return i?typeof i==\"string\"?a(i,s):i.comment?a(i.message,s):a(e,s):a(e,s)}var u=/{([^}]+)}/g;function a(r,n){return r.replace(u,(t,e)=>n[e]??t)}export{f as config,p as t};\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport * as l10n from '@vscode/l10n';\nexport class CSSIssueType {\n constructor(id, message) {\n this.id = id;\n this.message = message;\n }\n}\nexport const ParseError = {\n NumberExpected: new CSSIssueType('css-numberexpected', l10n.t(\"number expected\")),\n ConditionExpected: new CSSIssueType('css-conditionexpected', l10n.t(\"condition expected\")),\n RuleOrSelectorExpected: new CSSIssueType('css-ruleorselectorexpected', l10n.t(\"at-rule or selector expected\")),\n DotExpected: new CSSIssueType('css-dotexpected', l10n.t(\"dot expected\")),\n ColonExpected: new CSSIssueType('css-colonexpected', l10n.t(\"colon expected\")),\n SemiColonExpected: new CSSIssueType('css-semicolonexpected', l10n.t(\"semi-colon expected\")),\n TermExpected: new CSSIssueType('css-termexpected', l10n.t(\"term expected\")),\n ExpressionExpected: new CSSIssueType('css-expressionexpected', l10n.t(\"expression expected\")),\n OperatorExpected: new CSSIssueType('css-operatorexpected', l10n.t(\"operator expected\")),\n IdentifierExpected: new CSSIssueType('css-identifierexpected', l10n.t(\"identifier expected\")),\n PercentageExpected: new CSSIssueType('css-percentageexpected', l10n.t(\"percentage expected\")),\n URIOrStringExpected: new CSSIssueType('css-uriorstringexpected', l10n.t(\"uri or string expected\")),\n URIExpected: new CSSIssueType('css-uriexpected', l10n.t(\"URI expected\")),\n VariableNameExpected: new CSSIssueType('css-varnameexpected', l10n.t(\"variable name expected\")),\n VariableValueExpected: new CSSIssueType('css-varvalueexpected', l10n.t(\"variable value expected\")),\n PropertyValueExpected: new CSSIssueType('css-propertyvalueexpected', l10n.t(\"property value expected\")),\n LeftCurlyExpected: new CSSIssueType('css-lcurlyexpected', l10n.t(\"{ expected\")),\n RightCurlyExpected: new CSSIssueType('css-rcurlyexpected', l10n.t(\"} expected\")),\n LeftSquareBracketExpected: new CSSIssueType('css-rbracketexpected', l10n.t(\"[ expected\")),\n RightSquareBracketExpected: new CSSIssueType('css-lbracketexpected', l10n.t(\"] expected\")),\n LeftParenthesisExpected: new CSSIssueType('css-lparentexpected', l10n.t(\"( expected\")),\n RightParenthesisExpected: new CSSIssueType('css-rparentexpected', l10n.t(\") expected\")),\n CommaExpected: new CSSIssueType('css-commaexpected', l10n.t(\"comma expected\")),\n PageDirectiveOrDeclarationExpected: new CSSIssueType('css-pagedirordeclexpected', l10n.t(\"page directive or declaraton expected\")),\n UnknownAtRule: new CSSIssueType('css-unknownatrule', l10n.t(\"at-rule unknown\")),\n UnknownKeyword: new CSSIssueType('css-unknownkeyword', l10n.t(\"unknown keyword\")),\n SelectorExpected: new CSSIssueType('css-selectorexpected', l10n.t(\"selector expected\")),\n StringLiteralExpected: new CSSIssueType('css-stringliteralexpected', l10n.t(\"string literal expected\")),\n WhitespaceExpected: new CSSIssueType('css-whitespaceexpected', l10n.t(\"whitespace expected\")),\n MediaQueryExpected: new CSSIssueType('css-mediaqueryexpected', l10n.t(\"media query expected\")),\n IdentifierOrWildcardExpected: new CSSIssueType('css-idorwildcardexpected', l10n.t(\"identifier or wildcard expected\")),\n WildcardExpected: new CSSIssueType('css-wildcardexpected', l10n.t(\"wildcard expected\")),\n IdentifierOrVariableExpected: new CSSIssueType('css-idorvarexpected', l10n.t(\"identifier or variable expected\")),\n};\n", "/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\n'use strict';\nexport var DocumentUri;\n(function (DocumentUri) {\n function is(value) {\n return typeof value === 'string';\n }\n DocumentUri.is = is;\n})(DocumentUri || (DocumentUri = {}));\nexport var URI;\n(function (URI) {\n function is(value) {\n return typeof value === 'string';\n }\n URI.is = is;\n})(URI || (URI = {}));\nexport var integer;\n(function (integer) {\n integer.MIN_VALUE = -2147483648;\n integer.MAX_VALUE = 2147483647;\n function is(value) {\n return typeof value === 'number' && integer.MIN_VALUE <= value && value <= integer.MAX_VALUE;\n }\n integer.is = is;\n})(integer || (integer = {}));\nexport var uinteger;\n(function (uinteger) {\n uinteger.MIN_VALUE = 0;\n uinteger.MAX_VALUE = 2147483647;\n function is(value) {\n return typeof value === 'number' && uinteger.MIN_VALUE <= value && value <= uinteger.MAX_VALUE;\n }\n uinteger.is = is;\n})(uinteger || (uinteger = {}));\n/**\n * The Position namespace provides helper functions to work with\n * [Position](#Position) literals.\n */\nexport var Position;\n(function (Position) {\n /**\n * Creates a new Position literal from the given line and character.\n * @param line The position's line.\n * @param character The position's character.\n */\n function create(line, character) {\n if (line === Number.MAX_VALUE) {\n line = uinteger.MAX_VALUE;\n }\n if (character === Number.MAX_VALUE) {\n character = uinteger.MAX_VALUE;\n }\n return { line: line, character: character };\n }\n Position.create = create;\n /**\n * Checks whether the given literal conforms to the [Position](#Position) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Is.uinteger(candidate.line) && Is.uinteger(candidate.character);\n }\n Position.is = is;\n})(Position || (Position = {}));\n/**\n * The Range namespace provides helper functions to work with\n * [Range](#Range) literals.\n */\nexport var Range;\n(function (Range) {\n function create(one, two, three, four) {\n if (Is.uinteger(one) && Is.uinteger(two) && Is.uinteger(three) && Is.uinteger(four)) {\n return { start: Position.create(one, two), end: Position.create(three, four) };\n }\n else if (Position.is(one) && Position.is(two)) {\n return { start: one, end: two };\n }\n else {\n throw new Error(\"Range#create called with invalid arguments[\".concat(one, \", \").concat(two, \", \").concat(three, \", \").concat(four, \"]\"));\n }\n }\n Range.create = create;\n /**\n * Checks whether the given literal conforms to the [Range](#Range) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Position.is(candidate.start) && Position.is(candidate.end);\n }\n Range.is = is;\n})(Range || (Range = {}));\n/**\n * The Location namespace provides helper functions to work with\n * [Location](#Location) literals.\n */\nexport var Location;\n(function (Location) {\n /**\n * Creates a Location literal.\n * @param uri The location's uri.\n * @param range The location's range.\n */\n function create(uri, range) {\n return { uri: uri, range: range };\n }\n Location.create = create;\n /**\n * Checks whether the given literal conforms to the [Location](#Location) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Range.is(candidate.range) && (Is.string(candidate.uri) || Is.undefined(candidate.uri));\n }\n Location.is = is;\n})(Location || (Location = {}));\n/**\n * The LocationLink namespace provides helper functions to work with\n * [LocationLink](#LocationLink) literals.\n */\nexport var LocationLink;\n(function (LocationLink) {\n /**\n * Creates a LocationLink literal.\n * @param targetUri The definition's uri.\n * @param targetRange The full range of the definition.\n * @param targetSelectionRange The span of the symbol definition at the target.\n * @param originSelectionRange The span of the symbol being defined in the originating source file.\n */\n function create(targetUri, targetRange, targetSelectionRange, originSelectionRange) {\n return { targetUri: targetUri, targetRange: targetRange, targetSelectionRange: targetSelectionRange, originSelectionRange: originSelectionRange };\n }\n LocationLink.create = create;\n /**\n * Checks whether the given literal conforms to the [LocationLink](#LocationLink) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Range.is(candidate.targetRange) && Is.string(candidate.targetUri)\n && Range.is(candidate.targetSelectionRange)\n && (Range.is(candidate.originSelectionRange) || Is.undefined(candidate.originSelectionRange));\n }\n LocationLink.is = is;\n})(LocationLink || (LocationLink = {}));\n/**\n * The Color namespace provides helper functions to work with\n * [Color](#Color) literals.\n */\nexport var Color;\n(function (Color) {\n /**\n * Creates a new Color literal.\n */\n function create(red, green, blue, alpha) {\n return {\n red: red,\n green: green,\n blue: blue,\n alpha: alpha,\n };\n }\n Color.create = create;\n /**\n * Checks whether the given literal conforms to the [Color](#Color) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Is.numberRange(candidate.red, 0, 1)\n && Is.numberRange(candidate.green, 0, 1)\n && Is.numberRange(candidate.blue, 0, 1)\n && Is.numberRange(candidate.alpha, 0, 1);\n }\n Color.is = is;\n})(Color || (Color = {}));\n/**\n * The ColorInformation namespace provides helper functions to work with\n * [ColorInformation](#ColorInformation) literals.\n */\nexport var ColorInformation;\n(function (ColorInformation) {\n /**\n * Creates a new ColorInformation literal.\n */\n function create(range, color) {\n return {\n range: range,\n color: color,\n };\n }\n ColorInformation.create = create;\n /**\n * Checks whether the given literal conforms to the [ColorInformation](#ColorInformation) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Range.is(candidate.range) && Color.is(candidate.color);\n }\n ColorInformation.is = is;\n})(ColorInformation || (ColorInformation = {}));\n/**\n * The Color namespace provides helper functions to work with\n * [ColorPresentation](#ColorPresentation) literals.\n */\nexport var ColorPresentation;\n(function (ColorPresentation) {\n /**\n * Creates a new ColorInformation literal.\n */\n function create(label, textEdit, additionalTextEdits) {\n return {\n label: label,\n textEdit: textEdit,\n additionalTextEdits: additionalTextEdits,\n };\n }\n ColorPresentation.create = create;\n /**\n * Checks whether the given literal conforms to the [ColorInformation](#ColorInformation) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Is.string(candidate.label)\n && (Is.undefined(candidate.textEdit) || TextEdit.is(candidate))\n && (Is.undefined(candidate.additionalTextEdits) || Is.typedArray(candidate.additionalTextEdits, TextEdit.is));\n }\n ColorPresentation.is = is;\n})(ColorPresentation || (ColorPresentation = {}));\n/**\n * A set of predefined range kinds.\n */\nexport var FoldingRangeKind;\n(function (FoldingRangeKind) {\n /**\n * Folding range for a comment\n */\n FoldingRangeKind.Comment = 'comment';\n /**\n * Folding range for an import or include\n */\n FoldingRangeKind.Imports = 'imports';\n /**\n * Folding range for a region (e.g. `#region`)\n */\n FoldingRangeKind.Region = 'region';\n})(FoldingRangeKind || (FoldingRangeKind = {}));\n/**\n * The folding range namespace provides helper functions to work with\n * [FoldingRange](#FoldingRange) literals.\n */\nexport var FoldingRange;\n(function (FoldingRange) {\n /**\n * Creates a new FoldingRange literal.\n */\n function create(startLine, endLine, startCharacter, endCharacter, kind, collapsedText) {\n var result = {\n startLine: startLine,\n endLine: endLine\n };\n if (Is.defined(startCharacter)) {\n result.startCharacter = startCharacter;\n }\n if (Is.defined(endCharacter)) {\n result.endCharacter = endCharacter;\n }\n if (Is.defined(kind)) {\n result.kind = kind;\n }\n if (Is.defined(collapsedText)) {\n result.collapsedText = collapsedText;\n }\n return result;\n }\n FoldingRange.create = create;\n /**\n * Checks whether the given literal conforms to the [FoldingRange](#FoldingRange) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Is.uinteger(candidate.startLine) && Is.uinteger(candidate.startLine)\n && (Is.undefined(candidate.startCharacter) || Is.uinteger(candidate.startCharacter))\n && (Is.undefined(candidate.endCharacter) || Is.uinteger(candidate.endCharacter))\n && (Is.undefined(candidate.kind) || Is.string(candidate.kind));\n }\n FoldingRange.is = is;\n})(FoldingRange || (FoldingRange = {}));\n/**\n * The DiagnosticRelatedInformation namespace provides helper functions to work with\n * [DiagnosticRelatedInformation](#DiagnosticRelatedInformation) literals.\n */\nexport var DiagnosticRelatedInformation;\n(function (DiagnosticRelatedInformation) {\n /**\n * Creates a new DiagnosticRelatedInformation literal.\n */\n function create(location, message) {\n return {\n location: location,\n message: message\n };\n }\n DiagnosticRelatedInformation.create = create;\n /**\n * Checks whether the given literal conforms to the [DiagnosticRelatedInformation](#DiagnosticRelatedInformation) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Location.is(candidate.location) && Is.string(candidate.message);\n }\n DiagnosticRelatedInformation.is = is;\n})(DiagnosticRelatedInformation || (DiagnosticRelatedInformation = {}));\n/**\n * The diagnostic's severity.\n */\nexport var DiagnosticSeverity;\n(function (DiagnosticSeverity) {\n /**\n * Reports an error.\n */\n DiagnosticSeverity.Error = 1;\n /**\n * Reports a warning.\n */\n DiagnosticSeverity.Warning = 2;\n /**\n * Reports an information.\n */\n DiagnosticSeverity.Information = 3;\n /**\n * Reports a hint.\n */\n DiagnosticSeverity.Hint = 4;\n})(DiagnosticSeverity || (DiagnosticSeverity = {}));\n/**\n * The diagnostic tags.\n *\n * @since 3.15.0\n */\nexport var DiagnosticTag;\n(function (DiagnosticTag) {\n /**\n * Unused or unnecessary code.\n *\n * Clients are allowed to render diagnostics with this tag faded out instead of having\n * an error squiggle.\n */\n DiagnosticTag.Unnecessary = 1;\n /**\n * Deprecated or obsolete code.\n *\n * Clients are allowed to rendered diagnostics with this tag strike through.\n */\n DiagnosticTag.Deprecated = 2;\n})(DiagnosticTag || (DiagnosticTag = {}));\n/**\n * The CodeDescription namespace provides functions to deal with descriptions for diagnostic codes.\n *\n * @since 3.16.0\n */\nexport var CodeDescription;\n(function (CodeDescription) {\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Is.string(candidate.href);\n }\n CodeDescription.is = is;\n})(CodeDescription || (CodeDescription = {}));\n/**\n * The Diagnostic namespace provides helper functions to work with\n * [Diagnostic](#Diagnostic) literals.\n */\nexport var Diagnostic;\n(function (Diagnostic) {\n /**\n * Creates a new Diagnostic literal.\n */\n function create(range, message, severity, code, source, relatedInformation) {\n var result = { range: range, message: message };\n if (Is.defined(severity)) {\n result.severity = severity;\n }\n if (Is.defined(code)) {\n result.code = code;\n }\n if (Is.defined(source)) {\n result.source = source;\n }\n if (Is.defined(relatedInformation)) {\n result.relatedInformation = relatedInformation;\n }\n return result;\n }\n Diagnostic.create = create;\n /**\n * Checks whether the given literal conforms to the [Diagnostic](#Diagnostic) interface.\n */\n function is(value) {\n var _a;\n var candidate = value;\n return Is.defined(candidate)\n && Range.is(candidate.range)\n && Is.string(candidate.message)\n && (Is.number(candidate.severity) || Is.undefined(candidate.severity))\n && (Is.integer(candidate.code) || Is.string(candidate.code) || Is.undefined(candidate.code))\n && (Is.undefined(candidate.codeDescription) || (Is.string((_a = candidate.codeDescription) === null || _a === void 0 ? void 0 : _a.href)))\n && (Is.string(candidate.source) || Is.undefined(candidate.source))\n && (Is.undefined(candidate.relatedInformation) || Is.typedArray(candidate.relatedInformation, DiagnosticRelatedInformation.is));\n }\n Diagnostic.is = is;\n})(Diagnostic || (Diagnostic = {}));\n/**\n * The Command namespace provides helper functions to work with\n * [Command](#Command) literals.\n */\nexport var Command;\n(function (Command) {\n /**\n * Creates a new Command literal.\n */\n function create(title, command) {\n var args = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n args[_i - 2] = arguments[_i];\n }\n var result = { title: title, command: command };\n if (Is.defined(args) && args.length > 0) {\n result.arguments = args;\n }\n return result;\n }\n Command.create = create;\n /**\n * Checks whether the given literal conforms to the [Command](#Command) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.string(candidate.title) && Is.string(candidate.command);\n }\n Command.is = is;\n})(Command || (Command = {}));\n/**\n * The TextEdit namespace provides helper function to create replace,\n * insert and delete edits more easily.\n */\nexport var TextEdit;\n(function (TextEdit) {\n /**\n * Creates a replace text edit.\n * @param range The range of text to be replaced.\n * @param newText The new text.\n */\n function replace(range, newText) {\n return { range: range, newText: newText };\n }\n TextEdit.replace = replace;\n /**\n * Creates an insert text edit.\n * @param position The position to insert the text at.\n * @param newText The text to be inserted.\n */\n function insert(position, newText) {\n return { range: { start: position, end: position }, newText: newText };\n }\n TextEdit.insert = insert;\n /**\n * Creates a delete text edit.\n * @param range The range of text to be deleted.\n */\n function del(range) {\n return { range: range, newText: '' };\n }\n TextEdit.del = del;\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate)\n && Is.string(candidate.newText)\n && Range.is(candidate.range);\n }\n TextEdit.is = is;\n})(TextEdit || (TextEdit = {}));\nexport var ChangeAnnotation;\n(function (ChangeAnnotation) {\n function create(label, needsConfirmation, description) {\n var result = { label: label };\n if (needsConfirmation !== undefined) {\n result.needsConfirmation = needsConfirmation;\n }\n if (description !== undefined) {\n result.description = description;\n }\n return result;\n }\n ChangeAnnotation.create = create;\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Is.string(candidate.label) &&\n (Is.boolean(candidate.needsConfirmation) || candidate.needsConfirmation === undefined) &&\n (Is.string(candidate.description) || candidate.description === undefined);\n }\n ChangeAnnotation.is = is;\n})(ChangeAnnotation || (ChangeAnnotation = {}));\nexport var ChangeAnnotationIdentifier;\n(function (ChangeAnnotationIdentifier) {\n function is(value) {\n var candidate = value;\n return Is.string(candidate);\n }\n ChangeAnnotationIdentifier.is = is;\n})(ChangeAnnotationIdentifier || (ChangeAnnotationIdentifier = {}));\nexport var AnnotatedTextEdit;\n(function (AnnotatedTextEdit) {\n /**\n * Creates an annotated replace text edit.\n *\n * @param range The range of text to be replaced.\n * @param newText The new text.\n * @param annotation The annotation.\n */\n function replace(range, newText, annotation) {\n return { range: range, newText: newText, annotationId: annotation };\n }\n AnnotatedTextEdit.replace = replace;\n /**\n * Creates an annotated insert text edit.\n *\n * @param position The position to insert the text at.\n * @param newText The text to be inserted.\n * @param annotation The annotation.\n */\n function insert(position, newText, annotation) {\n return { range: { start: position, end: position }, newText: newText, annotationId: annotation };\n }\n AnnotatedTextEdit.insert = insert;\n /**\n * Creates an annotated delete text edit.\n *\n * @param range The range of text to be deleted.\n * @param annotation The annotation.\n */\n function del(range, annotation) {\n return { range: range, newText: '', annotationId: annotation };\n }\n AnnotatedTextEdit.del = del;\n function is(value) {\n var candidate = value;\n return TextEdit.is(candidate) && (ChangeAnnotation.is(candidate.annotationId) || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n AnnotatedTextEdit.is = is;\n})(AnnotatedTextEdit || (AnnotatedTextEdit = {}));\n/**\n * The TextDocumentEdit namespace provides helper function to create\n * an edit that manipulates a text document.\n */\nexport var TextDocumentEdit;\n(function (TextDocumentEdit) {\n /**\n * Creates a new `TextDocumentEdit`\n */\n function create(textDocument, edits) {\n return { textDocument: textDocument, edits: edits };\n }\n TextDocumentEdit.create = create;\n function is(value) {\n var candidate = value;\n return Is.defined(candidate)\n && OptionalVersionedTextDocumentIdentifier.is(candidate.textDocument)\n && Array.isArray(candidate.edits);\n }\n TextDocumentEdit.is = is;\n})(TextDocumentEdit || (TextDocumentEdit = {}));\nexport var CreateFile;\n(function (CreateFile) {\n function create(uri, options, annotation) {\n var result = {\n kind: 'create',\n uri: uri\n };\n if (options !== undefined && (options.overwrite !== undefined || options.ignoreIfExists !== undefined)) {\n result.options = options;\n }\n if (annotation !== undefined) {\n result.annotationId = annotation;\n }\n return result;\n }\n CreateFile.create = create;\n function is(value) {\n var candidate = value;\n return candidate && candidate.kind === 'create' && Is.string(candidate.uri) && (candidate.options === undefined ||\n ((candidate.options.overwrite === undefined || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === undefined || Is.boolean(candidate.options.ignoreIfExists)))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n CreateFile.is = is;\n})(CreateFile || (CreateFile = {}));\nexport var RenameFile;\n(function (RenameFile) {\n function create(oldUri, newUri, options, annotation) {\n var result = {\n kind: 'rename',\n oldUri: oldUri,\n newUri: newUri\n };\n if (options !== undefined && (options.overwrite !== undefined || options.ignoreIfExists !== undefined)) {\n result.options = options;\n }\n if (annotation !== undefined) {\n result.annotationId = annotation;\n }\n return result;\n }\n RenameFile.create = create;\n function is(value) {\n var candidate = value;\n return candidate && candidate.kind === 'rename' && Is.string(candidate.oldUri) && Is.string(candidate.newUri) && (candidate.options === undefined ||\n ((candidate.options.overwrite === undefined || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === undefined || Is.boolean(candidate.options.ignoreIfExists)))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n RenameFile.is = is;\n})(RenameFile || (RenameFile = {}));\nexport var DeleteFile;\n(function (DeleteFile) {\n function create(uri, options, annotation) {\n var result = {\n kind: 'delete',\n uri: uri\n };\n if (options !== undefined && (options.recursive !== undefined || options.ignoreIfNotExists !== undefined)) {\n result.options = options;\n }\n if (annotation !== undefined) {\n result.annotationId = annotation;\n }\n return result;\n }\n DeleteFile.create = create;\n function is(value) {\n var candidate = value;\n return candidate && candidate.kind === 'delete' && Is.string(candidate.uri) && (candidate.options === undefined ||\n ((candidate.options.recursive === undefined || Is.boolean(candidate.options.recursive)) && (candidate.options.ignoreIfNotExists === undefined || Is.boolean(candidate.options.ignoreIfNotExists)))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n DeleteFile.is = is;\n})(DeleteFile || (DeleteFile = {}));\nexport var WorkspaceEdit;\n(function (WorkspaceEdit) {\n function is(value) {\n var candidate = value;\n return candidate &&\n (candidate.changes !== undefined || candidate.documentChanges !== undefined) &&\n (candidate.documentChanges === undefined || candidate.documentChanges.every(function (change) {\n if (Is.string(change.kind)) {\n return CreateFile.is(change) || RenameFile.is(change) || DeleteFile.is(change);\n }\n else {\n return TextDocumentEdit.is(change);\n }\n }));\n }\n WorkspaceEdit.is = is;\n})(WorkspaceEdit || (WorkspaceEdit = {}));\nvar TextEditChangeImpl = /** @class */ (function () {\n function TextEditChangeImpl(edits, changeAnnotations) {\n this.edits = edits;\n this.changeAnnotations = changeAnnotations;\n }\n TextEditChangeImpl.prototype.insert = function (position, newText, annotation) {\n var edit;\n var id;\n if (annotation === undefined) {\n edit = TextEdit.insert(position, newText);\n }\n else if (ChangeAnnotationIdentifier.is(annotation)) {\n id = annotation;\n edit = AnnotatedTextEdit.insert(position, newText, annotation);\n }\n else {\n this.assertChangeAnnotations(this.changeAnnotations);\n id = this.changeAnnotations.manage(annotation);\n edit = AnnotatedTextEdit.insert(position, newText, id);\n }\n this.edits.push(edit);\n if (id !== undefined) {\n return id;\n }\n };\n TextEditChangeImpl.prototype.replace = function (range, newText, annotation) {\n var edit;\n var id;\n if (annotation === undefined) {\n edit = TextEdit.replace(range, newText);\n }\n else if (ChangeAnnotationIdentifier.is(annotation)) {\n id = annotation;\n edit = AnnotatedTextEdit.replace(range, newText, annotation);\n }\n else {\n this.assertChangeAnnotations(this.changeAnnotations);\n id = this.changeAnnotations.manage(annotation);\n edit = AnnotatedTextEdit.replace(range, newText, id);\n }\n this.edits.push(edit);\n if (id !== undefined) {\n return id;\n }\n };\n TextEditChangeImpl.prototype.delete = function (range, annotation) {\n var edit;\n var id;\n if (annotation === undefined) {\n edit = TextEdit.del(range);\n }\n else if (ChangeAnnotationIdentifier.is(annotation)) {\n id = annotation;\n edit = AnnotatedTextEdit.del(range, annotation);\n }\n else {\n this.assertChangeAnnotations(this.changeAnnotations);\n id = this.changeAnnotations.manage(annotation);\n edit = AnnotatedTextEdit.del(range, id);\n }\n this.edits.push(edit);\n if (id !== undefined) {\n return id;\n }\n };\n TextEditChangeImpl.prototype.add = function (edit) {\n this.edits.push(edit);\n };\n TextEditChangeImpl.prototype.all = function () {\n return this.edits;\n };\n TextEditChangeImpl.prototype.clear = function () {\n this.edits.splice(0, this.edits.length);\n };\n TextEditChangeImpl.prototype.assertChangeAnnotations = function (value) {\n if (value === undefined) {\n throw new Error(\"Text edit change is not configured to manage change annotations.\");\n }\n };\n return TextEditChangeImpl;\n}());\n/**\n * A helper class\n */\nvar ChangeAnnotations = /** @class */ (function () {\n function ChangeAnnotations(annotations) {\n this._annotations = annotations === undefined ? Object.create(null) : annotations;\n this._counter = 0;\n this._size = 0;\n }\n ChangeAnnotations.prototype.all = function () {\n return this._annotations;\n };\n Object.defineProperty(ChangeAnnotations.prototype, \"size\", {\n get: function () {\n return this._size;\n },\n enumerable: false,\n configurable: true\n });\n ChangeAnnotations.prototype.manage = function (idOrAnnotation, annotation) {\n var id;\n if (ChangeAnnotationIdentifier.is(idOrAnnotation)) {\n id = idOrAnnotation;\n }\n else {\n id = this.nextId();\n annotation = idOrAnnotation;\n }\n if (this._annotations[id] !== undefined) {\n throw new Error(\"Id \".concat(id, \" is already in use.\"));\n }\n if (annotation === undefined) {\n throw new Error(\"No annotation provided for id \".concat(id));\n }\n this._annotations[id] = annotation;\n this._size++;\n return id;\n };\n ChangeAnnotations.prototype.nextId = function () {\n this._counter++;\n return this._counter.toString();\n };\n return ChangeAnnotations;\n}());\n/**\n * A workspace change helps constructing changes to a workspace.\n */\nvar WorkspaceChange = /** @class */ (function () {\n function WorkspaceChange(workspaceEdit) {\n var _this = this;\n this._textEditChanges = Object.create(null);\n if (workspaceEdit !== undefined) {\n this._workspaceEdit = workspaceEdit;\n if (workspaceEdit.documentChanges) {\n this._changeAnnotations = new ChangeAnnotations(workspaceEdit.changeAnnotations);\n workspaceEdit.changeAnnotations = this._changeAnnotations.all();\n workspaceEdit.documentChanges.forEach(function (change) {\n if (TextDocumentEdit.is(change)) {\n var textEditChange = new TextEditChangeImpl(change.edits, _this._changeAnnotations);\n _this._textEditChanges[change.textDocument.uri] = textEditChange;\n }\n });\n }\n else if (workspaceEdit.changes) {\n Object.keys(workspaceEdit.changes).forEach(function (key) {\n var textEditChange = new TextEditChangeImpl(workspaceEdit.changes[key]);\n _this._textEditChanges[key] = textEditChange;\n });\n }\n }\n else {\n this._workspaceEdit = {};\n }\n }\n Object.defineProperty(WorkspaceChange.prototype, \"edit\", {\n /**\n * Returns the underlying [WorkspaceEdit](#WorkspaceEdit) literal\n * use to be returned from a workspace edit operation like rename.\n */\n get: function () {\n this.initDocumentChanges();\n if (this._changeAnnotations !== undefined) {\n if (this._changeAnnotations.size === 0) {\n this._workspaceEdit.changeAnnotations = undefined;\n }\n else {\n this._workspaceEdit.changeAnnotations = this._changeAnnotations.all();\n }\n }\n return this._workspaceEdit;\n },\n enumerable: false,\n configurable: true\n });\n WorkspaceChange.prototype.getTextEditChange = function (key) {\n if (OptionalVersionedTextDocumentIdentifier.is(key)) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n var textDocument = { uri: key.uri, version: key.version };\n var result = this._textEditChanges[textDocument.uri];\n if (!result) {\n var edits = [];\n var textDocumentEdit = {\n textDocument: textDocument,\n edits: edits\n };\n this._workspaceEdit.documentChanges.push(textDocumentEdit);\n result = new TextEditChangeImpl(edits, this._changeAnnotations);\n this._textEditChanges[textDocument.uri] = result;\n }\n return result;\n }\n else {\n this.initChanges();\n if (this._workspaceEdit.changes === undefined) {\n throw new Error('Workspace edit is not configured for normal text edit changes.');\n }\n var result = this._textEditChanges[key];\n if (!result) {\n var edits = [];\n this._workspaceEdit.changes[key] = edits;\n result = new TextEditChangeImpl(edits);\n this._textEditChanges[key] = result;\n }\n return result;\n }\n };\n WorkspaceChange.prototype.initDocumentChanges = function () {\n if (this._workspaceEdit.documentChanges === undefined && this._workspaceEdit.changes === undefined) {\n this._changeAnnotations = new ChangeAnnotations();\n this._workspaceEdit.documentChanges = [];\n this._workspaceEdit.changeAnnotations = this._changeAnnotations.all();\n }\n };\n WorkspaceChange.prototype.initChanges = function () {\n if (this._workspaceEdit.documentChanges === undefined && this._workspaceEdit.changes === undefined) {\n this._workspaceEdit.changes = Object.create(null);\n }\n };\n WorkspaceChange.prototype.createFile = function (uri, optionsOrAnnotation, options) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n var annotation;\n if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) {\n annotation = optionsOrAnnotation;\n }\n else {\n options = optionsOrAnnotation;\n }\n var operation;\n var id;\n if (annotation === undefined) {\n operation = CreateFile.create(uri, options);\n }\n else {\n id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation);\n operation = CreateFile.create(uri, options, id);\n }\n this._workspaceEdit.documentChanges.push(operation);\n if (id !== undefined) {\n return id;\n }\n };\n WorkspaceChange.prototype.renameFile = function (oldUri, newUri, optionsOrAnnotation, options) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n var annotation;\n if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) {\n annotation = optionsOrAnnotation;\n }\n else {\n options = optionsOrAnnotation;\n }\n var operation;\n var id;\n if (annotation === undefined) {\n operation = RenameFile.create(oldUri, newUri, options);\n }\n else {\n id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation);\n operation = RenameFile.create(oldUri, newUri, options, id);\n }\n this._workspaceEdit.documentChanges.push(operation);\n if (id !== undefined) {\n return id;\n }\n };\n WorkspaceChange.prototype.deleteFile = function (uri, optionsOrAnnotation, options) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n var annotation;\n if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) {\n annotation = optionsOrAnnotation;\n }\n else {\n options = optionsOrAnnotation;\n }\n var operation;\n var id;\n if (annotation === undefined) {\n operation = DeleteFile.create(uri, options);\n }\n else {\n id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation);\n operation = DeleteFile.create(uri, options, id);\n }\n this._workspaceEdit.documentChanges.push(operation);\n if (id !== undefined) {\n return id;\n }\n };\n return WorkspaceChange;\n}());\nexport { WorkspaceChange };\n/**\n * The TextDocumentIdentifier namespace provides helper functions to work with\n * [TextDocumentIdentifier](#TextDocumentIdentifier) literals.\n */\nexport var TextDocumentIdentifier;\n(function (TextDocumentIdentifier) {\n /**\n * Creates a new TextDocumentIdentifier literal.\n * @param uri The document's uri.\n */\n function create(uri) {\n return { uri: uri };\n }\n TextDocumentIdentifier.create = create;\n /**\n * Checks whether the given literal conforms to the [TextDocumentIdentifier](#TextDocumentIdentifier) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri);\n }\n TextDocumentIdentifier.is = is;\n})(TextDocumentIdentifier || (TextDocumentIdentifier = {}));\n/**\n * The VersionedTextDocumentIdentifier namespace provides helper functions to work with\n * [VersionedTextDocumentIdentifier](#VersionedTextDocumentIdentifier) literals.\n */\nexport var VersionedTextDocumentIdentifier;\n(function (VersionedTextDocumentIdentifier) {\n /**\n * Creates a new VersionedTextDocumentIdentifier literal.\n * @param uri The document's uri.\n * @param version The document's version.\n */\n function create(uri, version) {\n return { uri: uri, version: version };\n }\n VersionedTextDocumentIdentifier.create = create;\n /**\n * Checks whether the given literal conforms to the [VersionedTextDocumentIdentifier](#VersionedTextDocumentIdentifier) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && Is.integer(candidate.version);\n }\n VersionedTextDocumentIdentifier.is = is;\n})(VersionedTextDocumentIdentifier || (VersionedTextDocumentIdentifier = {}));\n/**\n * The OptionalVersionedTextDocumentIdentifier namespace provides helper functions to work with\n * [OptionalVersionedTextDocumentIdentifier](#OptionalVersionedTextDocumentIdentifier) literals.\n */\nexport var OptionalVersionedTextDocumentIdentifier;\n(function (OptionalVersionedTextDocumentIdentifier) {\n /**\n * Creates a new OptionalVersionedTextDocumentIdentifier literal.\n * @param uri The document's uri.\n * @param version The document's version.\n */\n function create(uri, version) {\n return { uri: uri, version: version };\n }\n OptionalVersionedTextDocumentIdentifier.create = create;\n /**\n * Checks whether the given literal conforms to the [OptionalVersionedTextDocumentIdentifier](#OptionalVersionedTextDocumentIdentifier) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && (candidate.version === null || Is.integer(candidate.version));\n }\n OptionalVersionedTextDocumentIdentifier.is = is;\n})(OptionalVersionedTextDocumentIdentifier || (OptionalVersionedTextDocumentIdentifier = {}));\n/**\n * The TextDocumentItem namespace provides helper functions to work with\n * [TextDocumentItem](#TextDocumentItem) literals.\n */\nexport var TextDocumentItem;\n(function (TextDocumentItem) {\n /**\n * Creates a new TextDocumentItem literal.\n * @param uri The document's uri.\n * @param languageId The document's language identifier.\n * @param version The document's version number.\n * @param text The document's text.\n */\n function create(uri, languageId, version, text) {\n return { uri: uri, languageId: languageId, version: version, text: text };\n }\n TextDocumentItem.create = create;\n /**\n * Checks whether the given literal conforms to the [TextDocumentItem](#TextDocumentItem) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && Is.string(candidate.languageId) && Is.integer(candidate.version) && Is.string(candidate.text);\n }\n TextDocumentItem.is = is;\n})(TextDocumentItem || (TextDocumentItem = {}));\n/**\n * Describes the content type that a client supports in various\n * result literals like `Hover`, `ParameterInfo` or `CompletionItem`.\n *\n * Please note that `MarkupKinds` must not start with a `$`. This kinds\n * are reserved for internal usage.\n */\nexport var MarkupKind;\n(function (MarkupKind) {\n /**\n * Plain text is supported as a content format\n */\n MarkupKind.PlainText = 'plaintext';\n /**\n * Markdown is supported as a content format\n */\n MarkupKind.Markdown = 'markdown';\n /**\n * Checks whether the given value is a value of the [MarkupKind](#MarkupKind) type.\n */\n function is(value) {\n var candidate = value;\n return candidate === MarkupKind.PlainText || candidate === MarkupKind.Markdown;\n }\n MarkupKind.is = is;\n})(MarkupKind || (MarkupKind = {}));\nexport var MarkupContent;\n(function (MarkupContent) {\n /**\n * Checks whether the given value conforms to the [MarkupContent](#MarkupContent) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(value) && MarkupKind.is(candidate.kind) && Is.string(candidate.value);\n }\n MarkupContent.is = is;\n})(MarkupContent || (MarkupContent = {}));\n/**\n * The kind of a completion entry.\n */\nexport var CompletionItemKind;\n(function (CompletionItemKind) {\n CompletionItemKind.Text = 1;\n CompletionItemKind.Method = 2;\n CompletionItemKind.Function = 3;\n CompletionItemKind.Constructor = 4;\n CompletionItemKind.Field = 5;\n CompletionItemKind.Variable = 6;\n CompletionItemKind.Class = 7;\n CompletionItemKind.Interface = 8;\n CompletionItemKind.Module = 9;\n CompletionItemKind.Property = 10;\n CompletionItemKind.Unit = 11;\n CompletionItemKind.Value = 12;\n CompletionItemKind.Enum = 13;\n CompletionItemKind.Keyword = 14;\n CompletionItemKind.Snippet = 15;\n CompletionItemKind.Color = 16;\n CompletionItemKind.File = 17;\n CompletionItemKind.Reference = 18;\n CompletionItemKind.Folder = 19;\n CompletionItemKind.EnumMember = 20;\n CompletionItemKind.Constant = 21;\n CompletionItemKind.Struct = 22;\n CompletionItemKind.Event = 23;\n CompletionItemKind.Operator = 24;\n CompletionItemKind.TypeParameter = 25;\n})(CompletionItemKind || (CompletionItemKind = {}));\n/**\n * Defines whether the insert text in a completion item should be interpreted as\n * plain text or a snippet.\n */\nexport var InsertTextFormat;\n(function (InsertTextFormat) {\n /**\n * The primary text to be inserted is treated as a plain string.\n */\n InsertTextFormat.PlainText = 1;\n /**\n * The primary text to be inserted is treated as a snippet.\n *\n * A snippet can define tab stops and placeholders with `$1`, `$2`\n * and `${3:foo}`. `$0` defines the final tab stop, it defaults to\n * the end of the snippet. Placeholders with equal identifiers are linked,\n * that is typing in one will update others too.\n *\n * See also: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#snippet_syntax\n */\n InsertTextFormat.Snippet = 2;\n})(InsertTextFormat || (InsertTextFormat = {}));\n/**\n * Completion item tags are extra annotations that tweak the rendering of a completion\n * item.\n *\n * @since 3.15.0\n */\nexport var CompletionItemTag;\n(function (CompletionItemTag) {\n /**\n * Render a completion as obsolete, usually using a strike-out.\n */\n CompletionItemTag.Deprecated = 1;\n})(CompletionItemTag || (CompletionItemTag = {}));\n/**\n * The InsertReplaceEdit namespace provides functions to deal with insert / replace edits.\n *\n * @since 3.16.0\n */\nexport var InsertReplaceEdit;\n(function (InsertReplaceEdit) {\n /**\n * Creates a new insert / replace edit\n */\n function create(newText, insert, replace) {\n return { newText: newText, insert: insert, replace: replace };\n }\n InsertReplaceEdit.create = create;\n /**\n * Checks whether the given literal conforms to the [InsertReplaceEdit](#InsertReplaceEdit) interface.\n */\n function is(value) {\n var candidate = value;\n return candidate && Is.string(candidate.newText) && Range.is(candidate.insert) && Range.is(candidate.replace);\n }\n InsertReplaceEdit.is = is;\n})(InsertReplaceEdit || (InsertReplaceEdit = {}));\n/**\n * How whitespace and indentation is handled during completion\n * item insertion.\n *\n * @since 3.16.0\n */\nexport var InsertTextMode;\n(function (InsertTextMode) {\n /**\n * The insertion or replace strings is taken as it is. If the\n * value is multi line the lines below the cursor will be\n * inserted using the indentation defined in the string value.\n * The client will not apply any kind of adjustments to the\n * string.\n */\n InsertTextMode.asIs = 1;\n /**\n * The editor adjusts leading whitespace of new lines so that\n * they match the indentation up to the cursor of the line for\n * which the item is accepted.\n *\n * Consider a line like this: <2tabs><cursor><3tabs>foo. Accepting a\n * multi line completion item is indented using 2 tabs and all\n * following lines inserted will be indented using 2 tabs as well.\n */\n InsertTextMode.adjustIndentation = 2;\n})(InsertTextMode || (InsertTextMode = {}));\nexport var CompletionItemLabelDetails;\n(function (CompletionItemLabelDetails) {\n function is(value) {\n var candidate = value;\n return candidate && (Is.string(candidate.detail) || candidate.detail === undefined) &&\n (Is.string(candidate.description) || candidate.description === undefined);\n }\n CompletionItemLabelDetails.is = is;\n})(CompletionItemLabelDetails || (CompletionItemLabelDetails = {}));\n/**\n * The CompletionItem namespace provides functions to deal with\n * completion items.\n */\nexport var CompletionItem;\n(function (CompletionItem) {\n /**\n * Create a completion item and seed it with a label.\n * @param label The completion item's label\n */\n function create(label) {\n return { label: label };\n }\n CompletionItem.create = create;\n})(CompletionItem || (CompletionItem = {}));\n/**\n * The CompletionList namespace provides functions to deal with\n * completion lists.\n */\nexport var CompletionList;\n(function (CompletionList) {\n /**\n * Creates a new completion list.\n *\n * @param items The completion items.\n * @param isIncomplete The list is not complete.\n */\n function create(items, isIncomplete) {\n return { items: items ? items : [], isIncomplete: !!isIncomplete };\n }\n CompletionList.create = create;\n})(CompletionList || (CompletionList = {}));\nexport var MarkedString;\n(function (MarkedString) {\n /**\n * Creates a marked string from plain text.\n *\n * @param plainText The plain text.\n */\n function fromPlainText(plainText) {\n return plainText.replace(/[\\\\`*_{}[\\]()#+\\-.!]/g, '\\\\$&'); // escape markdown syntax tokens: http://daringfireball.net/projects/markdown/syntax#backslash\n }\n MarkedString.fromPlainText = fromPlainText;\n /**\n * Checks whether the given value conforms to the [MarkedString](#MarkedString) type.\n */\n function is(value) {\n var candidate = value;\n return Is.string(candidate) || (Is.objectLiteral(candidate) && Is.string(candidate.language) && Is.string(candidate.value));\n }\n MarkedString.is = is;\n})(MarkedString || (MarkedString = {}));\nexport var Hover;\n(function (Hover) {\n /**\n * Checks whether the given value conforms to the [Hover](#Hover) interface.\n */\n function is(value) {\n var candidate = value;\n return !!candidate && Is.objectLiteral(candidate) && (MarkupContent.is(candidate.contents) ||\n MarkedString.is(candidate.contents) ||\n Is.typedArray(candidate.contents, MarkedString.is)) && (value.range === undefined || Range.is(value.range));\n }\n Hover.is = is;\n})(Hover || (Hover = {}));\n/**\n * The ParameterInformation namespace provides helper functions to work with\n * [ParameterInformation](#ParameterInformation) literals.\n */\nexport var ParameterInformation;\n(function (ParameterInformation) {\n /**\n * Creates a new parameter information literal.\n *\n * @param label A label string.\n * @param documentation A doc string.\n */\n function create(label, documentation) {\n return documentation ? { label: label, documentation: documentation } : { label: label };\n }\n ParameterInformation.create = create;\n})(ParameterInformation || (ParameterInformation = {}));\n/**\n * The SignatureInformation namespace provides helper functions to work with\n * [SignatureInformation](#SignatureInformation) literals.\n */\nexport var SignatureInformation;\n(function (SignatureInformation) {\n function create(label, documentation) {\n var parameters = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n parameters[_i - 2] = arguments[_i];\n }\n var result = { label: label };\n if (Is.defined(documentation)) {\n result.documentation = documentation;\n }\n if (Is.defined(parameters)) {\n result.parameters = parameters;\n }\n else {\n result.parameters = [];\n }\n return result;\n }\n SignatureInformation.create = create;\n})(SignatureInformation || (SignatureInformation = {}));\n/**\n * A document highlight kind.\n */\nexport var DocumentHighlightKind;\n(function (DocumentHighlightKind) {\n /**\n * A textual occurrence.\n */\n DocumentHighlightKind.Text = 1;\n /**\n * Read-access of a symbol, like reading a variable.\n */\n DocumentHighlightKind.Read = 2;\n /**\n * Write-access of a symbol, like writing to a variable.\n */\n DocumentHighlightKind.Write = 3;\n})(DocumentHighlightKind || (DocumentHighlightKind = {}));\n/**\n * DocumentHighlight namespace to provide helper functions to work with\n * [DocumentHighlight](#DocumentHighlight) literals.\n */\nexport var DocumentHighlight;\n(function (DocumentHighlight) {\n /**\n * Create a DocumentHighlight object.\n * @param range The range the highlight applies to.\n * @param kind The highlight kind\n */\n function create(range, kind) {\n var result = { range: range };\n if (Is.number(kind)) {\n result.kind = kind;\n }\n return result;\n }\n DocumentHighlight.create = create;\n})(DocumentHighlight || (DocumentHighlight = {}));\n/**\n * A symbol kind.\n */\nexport var SymbolKind;\n(function (SymbolKind) {\n SymbolKind.File = 1;\n SymbolKind.Module = 2;\n SymbolKind.Namespace = 3;\n SymbolKind.Package = 4;\n SymbolKind.Class = 5;\n SymbolKind.Method = 6;\n SymbolKind.Property = 7;\n SymbolKind.Field = 8;\n SymbolKind.Constructor = 9;\n SymbolKind.Enum = 10;\n SymbolKind.Interface = 11;\n SymbolKind.Function = 12;\n SymbolKind.Variable = 13;\n SymbolKind.Constant = 14;\n SymbolKind.String = 15;\n SymbolKind.Number = 16;\n SymbolKind.Boolean = 17;\n SymbolKind.Array = 18;\n SymbolKind.Object = 19;\n SymbolKind.Key = 20;\n SymbolKind.Null = 21;\n SymbolKind.EnumMember = 22;\n SymbolKind.Struct = 23;\n SymbolKind.Event = 24;\n SymbolKind.Operator = 25;\n SymbolKind.TypeParameter = 26;\n})(SymbolKind || (SymbolKind = {}));\n/**\n * Symbol tags are extra annotations that tweak the rendering of a symbol.\n *\n * @since 3.16\n */\nexport var SymbolTag;\n(function (SymbolTag) {\n /**\n * Render a symbol as obsolete, usually using a strike-out.\n */\n SymbolTag.Deprecated = 1;\n})(SymbolTag || (SymbolTag = {}));\nexport var SymbolInformation;\n(function (SymbolInformation) {\n /**\n * Creates a new symbol information literal.\n *\n * @param name The name of the symbol.\n * @param kind The kind of the symbol.\n * @param range The range of the location of the symbol.\n * @param uri The resource of the location of symbol.\n * @param containerName The name of the symbol containing the symbol.\n */\n function create(name, kind, range, uri, containerName) {\n var result = {\n name: name,\n kind: kind,\n location: { uri: uri, range: range }\n };\n if (containerName) {\n result.containerName = containerName;\n }\n return result;\n }\n SymbolInformation.create = create;\n})(SymbolInformation || (SymbolInformation = {}));\nexport var WorkspaceSymbol;\n(function (WorkspaceSymbol) {\n /**\n * Create a new workspace symbol.\n *\n * @param name The name of the symbol.\n * @param kind The kind of the symbol.\n * @param uri The resource of the location of the symbol.\n * @param range An options range of the location.\n * @returns A WorkspaceSymbol.\n */\n function create(name, kind, uri, range) {\n return range !== undefined\n ? { name: name, kind: kind, location: { uri: uri, range: range } }\n : { name: name, kind: kind, location: { uri: uri } };\n }\n WorkspaceSymbol.create = create;\n})(WorkspaceSymbol || (WorkspaceSymbol = {}));\nexport var DocumentSymbol;\n(function (DocumentSymbol) {\n /**\n * Creates a new symbol information literal.\n *\n * @param name The name of the symbol.\n * @param detail The detail of the symbol.\n * @param kind The kind of the symbol.\n * @param range The range of the symbol.\n * @param selectionRange The selectionRange of the symbol.\n * @param children Children of the symbol.\n */\n function create(name, detail, kind, range, selectionRange, children) {\n var result = {\n name: name,\n detail: detail,\n kind: kind,\n range: range,\n selectionRange: selectionRange\n };\n if (children !== undefined) {\n result.children = children;\n }\n return result;\n }\n DocumentSymbol.create = create;\n /**\n * Checks whether the given literal conforms to the [DocumentSymbol](#DocumentSymbol) interface.\n */\n function is(value) {\n var candidate = value;\n return candidate &&\n Is.string(candidate.name) && Is.number(candidate.kind) &&\n Range.is(candidate.range) && Range.is(candidate.selectionRange) &&\n (candidate.detail === undefined || Is.string(candidate.detail)) &&\n (candidate.deprecated === undefined || Is.boolean(candidate.deprecated)) &&\n (candidate.children === undefined || Array.isArray(candidate.children)) &&\n (candidate.tags === undefined || Array.isArray(candidate.tags));\n }\n DocumentSymbol.is = is;\n})(DocumentSymbol || (DocumentSymbol = {}));\n/**\n * A set of predefined code action kinds\n */\nexport var CodeActionKind;\n(function (CodeActionKind) {\n /**\n * Empty kind.\n */\n CodeActionKind.Empty = '';\n /**\n * Base kind for quickfix actions: 'quickfix'\n */\n CodeActionKind.QuickFix = 'quickfix';\n /**\n * Base kind for refactoring actions: 'refactor'\n */\n CodeActionKind.Refactor = 'refactor';\n /**\n * Base kind for refactoring extraction actions: 'refactor.extract'\n *\n * Example extract actions:\n *\n * - Extract method\n * - Extract function\n * - Extract variable\n * - Extract interface from class\n * - ...\n */\n CodeActionKind.RefactorExtract = 'refactor.extract';\n /**\n * Base kind for refactoring inline actions: 'refactor.inline'\n *\n * Example inline actions:\n *\n * - Inline function\n * - Inline variable\n * - Inline constant\n * - ...\n */\n CodeActionKind.RefactorInline = 'refactor.inline';\n /**\n * Base kind for refactoring rewrite actions: 'refactor.rewrite'\n *\n * Example rewrite actions:\n *\n * - Convert JavaScript function to class\n * - Add or remove parameter\n * - Encapsulate field\n * - Make method static\n * - Move method to base class\n * - ...\n */\n CodeActionKind.RefactorRewrite = 'refactor.rewrite';\n /**\n * Base kind for source actions: `source`\n *\n * Source code actions apply to the entire file.\n */\n CodeActionKind.Source = 'source';\n /**\n * Base kind for an organize imports source action: `source.organizeImports`\n */\n CodeActionKind.SourceOrganizeImports = 'source.organizeImports';\n /**\n * Base kind for auto-fix source actions: `source.fixAll`.\n *\n * Fix all actions automatically fix errors that have a clear fix that do not require user input.\n * They should not suppress errors or perform unsafe fixes such as generating new types or classes.\n *\n * @since 3.15.0\n */\n CodeActionKind.SourceFixAll = 'source.fixAll';\n})(CodeActionKind || (CodeActionKind = {}));\n/**\n * The reason why code actions were requested.\n *\n * @since 3.17.0\n */\nexport var CodeActionTriggerKind;\n(function (CodeActionTriggerKind) {\n /**\n * Code actions were explicitly requested by the user or by an extension.\n */\n CodeActionTriggerKind.Invoked = 1;\n /**\n * Code actions were requested automatically.\n *\n * This typically happens when current selection in a file changes, but can\n * also be triggered when file content changes.\n */\n CodeActionTriggerKind.Automatic = 2;\n})(CodeActionTriggerKind || (CodeActionTriggerKind = {}));\n/**\n * The CodeActionContext namespace provides helper functions to work with\n * [CodeActionContext](#CodeActionContext) literals.\n */\nexport var CodeActionContext;\n(function (CodeActionContext) {\n /**\n * Creates a new CodeActionContext literal.\n */\n function create(diagnostics, only, triggerKind) {\n var result = { diagnostics: diagnostics };\n if (only !== undefined && only !== null) {\n result.only = only;\n }\n if (triggerKind !== undefined && triggerKind !== null) {\n result.triggerKind = triggerKind;\n }\n return result;\n }\n CodeActionContext.create = create;\n /**\n * Checks whether the given literal conforms to the [CodeActionContext](#CodeActionContext) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.typedArray(candidate.diagnostics, Diagnostic.is)\n && (candidate.only === undefined || Is.typedArray(candidate.only, Is.string))\n && (candidate.triggerKind === undefined || candidate.triggerKind === CodeActionTriggerKind.Invoked || candidate.triggerKind === CodeActionTriggerKind.Automatic);\n }\n CodeActionContext.is = is;\n})(CodeActionContext || (CodeActionContext = {}));\nexport var CodeAction;\n(function (CodeAction) {\n function create(title, kindOrCommandOrEdit, kind) {\n var result = { title: title };\n var checkKind = true;\n if (typeof kindOrCommandOrEdit === 'string') {\n checkKind = false;\n result.kind = kindOrCommandOrEdit;\n }\n else if (Command.is(kindOrCommandOrEdit)) {\n result.command = kindOrCommandOrEdit;\n }\n else {\n result.edit = kindOrCommandOrEdit;\n }\n if (checkKind && kind !== undefined) {\n result.kind = kind;\n }\n return result;\n }\n CodeAction.create = create;\n function is(value) {\n var candidate = value;\n return candidate && Is.string(candidate.title) &&\n (candidate.diagnostics === undefined || Is.typedArray(candidate.diagnostics, Diagnostic.is)) &&\n (candidate.kind === undefined || Is.string(candidate.kind)) &&\n (candidate.edit !== undefined || candidate.command !== undefined) &&\n (candidate.command === undefined || Command.is(candidate.command)) &&\n (candidate.isPreferred === undefined || Is.boolean(candidate.isPreferred)) &&\n (candidate.edit === undefined || WorkspaceEdit.is(candidate.edit));\n }\n CodeAction.is = is;\n})(CodeAction || (CodeAction = {}));\n/**\n * The CodeLens namespace provides helper functions to work with\n * [CodeLens](#CodeLens) literals.\n */\nexport var CodeLens;\n(function (CodeLens) {\n /**\n * Creates a new CodeLens literal.\n */\n function create(range, data) {\n var result = { range: range };\n if (Is.defined(data)) {\n result.data = data;\n }\n return result;\n }\n CodeLens.create = create;\n /**\n * Checks whether the given literal conforms to the [CodeLens](#CodeLens) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.command) || Command.is(candidate.command));\n }\n CodeLens.is = is;\n})(CodeLens || (CodeLens = {}));\n/**\n * The FormattingOptions namespace provides helper functions to work with\n * [FormattingOptions](#FormattingOptions) literals.\n */\nexport var FormattingOptions;\n(function (FormattingOptions) {\n /**\n * Creates a new FormattingOptions literal.\n */\n function create(tabSize, insertSpaces) {\n return { tabSize: tabSize, insertSpaces: insertSpaces };\n }\n FormattingOptions.create = create;\n /**\n * Checks whether the given literal conforms to the [FormattingOptions](#FormattingOptions) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.uinteger(candidate.tabSize) && Is.boolean(candidate.insertSpaces);\n }\n FormattingOptions.is = is;\n})(FormattingOptions || (FormattingOptions = {}));\n/**\n * The DocumentLink namespace provides helper functions to work with\n * [DocumentLink](#DocumentLink) literals.\n */\nexport var DocumentLink;\n(function (DocumentLink) {\n /**\n * Creates a new DocumentLink literal.\n */\n function create(range, target, data) {\n return { range: range, target: target, data: data };\n }\n DocumentLink.create = create;\n /**\n * Checks whether the given literal conforms to the [DocumentLink](#DocumentLink) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.target) || Is.string(candidate.target));\n }\n DocumentLink.is = is;\n})(DocumentLink || (DocumentLink = {}));\n/**\n * The SelectionRange namespace provides helper function to work with\n * SelectionRange literals.\n */\nexport var SelectionRange;\n(function (SelectionRange) {\n /**\n * Creates a new SelectionRange\n * @param range the range.\n * @param parent an optional parent.\n */\n function create(range, parent) {\n return { range: range, parent: parent };\n }\n SelectionRange.create = create;\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Range.is(candidate.range) && (candidate.parent === undefined || SelectionRange.is(candidate.parent));\n }\n SelectionRange.is = is;\n})(SelectionRange || (SelectionRange = {}));\n/**\n * A set of predefined token types. This set is not fixed\n * an clients can specify additional token types via the\n * corresponding client capabilities.\n *\n * @since 3.16.0\n */\nexport var SemanticTokenTypes;\n(function (SemanticTokenTypes) {\n SemanticTokenTypes[\"namespace\"] = \"namespace\";\n /**\n * Represents a generic type. Acts as a fallback for types which can't be mapped to\n * a specific type like class or enum.\n */\n SemanticTokenTypes[\"type\"] = \"type\";\n SemanticTokenTypes[\"class\"] = \"class\";\n SemanticTokenTypes[\"enum\"] = \"enum\";\n SemanticTokenTypes[\"interface\"] = \"interface\";\n SemanticTokenTypes[\"struct\"] = \"struct\";\n SemanticTokenTypes[\"typeParameter\"] = \"typeParameter\";\n SemanticTokenTypes[\"parameter\"] = \"parameter\";\n SemanticTokenTypes[\"variable\"] = \"variable\";\n SemanticTokenTypes[\"property\"] = \"property\";\n SemanticTokenTypes[\"enumMember\"] = \"enumMember\";\n SemanticTokenTypes[\"event\"] = \"event\";\n SemanticTokenTypes[\"function\"] = \"function\";\n SemanticTokenTypes[\"method\"] = \"method\";\n SemanticTokenTypes[\"macro\"] = \"macro\";\n SemanticTokenTypes[\"keyword\"] = \"keyword\";\n SemanticTokenTypes[\"modifier\"] = \"modifier\";\n SemanticTokenTypes[\"comment\"] = \"comment\";\n SemanticTokenTypes[\"string\"] = \"string\";\n SemanticTokenTypes[\"number\"] = \"number\";\n SemanticTokenTypes[\"regexp\"] = \"regexp\";\n SemanticTokenTypes[\"operator\"] = \"operator\";\n /**\n * @since 3.17.0\n */\n SemanticTokenTypes[\"decorator\"] = \"decorator\";\n})(SemanticTokenTypes || (SemanticTokenTypes = {}));\n/**\n * A set of predefined token modifiers. This set is not fixed\n * an clients can specify additional token types via the\n * corresponding client capabilities.\n *\n * @since 3.16.0\n */\nexport var SemanticTokenModifiers;\n(function (SemanticTokenModifiers) {\n SemanticTokenModifiers[\"declaration\"] = \"declaration\";\n SemanticTokenModifiers[\"definition\"] = \"definition\";\n SemanticTokenModifiers[\"readonly\"] = \"readonly\";\n SemanticTokenModifiers[\"static\"] = \"static\";\n SemanticTokenModifiers[\"deprecated\"] = \"deprecated\";\n SemanticTokenModifiers[\"abstract\"] = \"abstract\";\n SemanticTokenModifiers[\"async\"] = \"async\";\n SemanticTokenModifiers[\"modification\"] = \"modification\";\n SemanticTokenModifiers[\"documentation\"] = \"documentation\";\n SemanticTokenModifiers[\"defaultLibrary\"] = \"defaultLibrary\";\n})(SemanticTokenModifiers || (SemanticTokenModifiers = {}));\n/**\n * @since 3.16.0\n */\nexport var SemanticTokens;\n(function (SemanticTokens) {\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && (candidate.resultId === undefined || typeof candidate.resultId === 'string') &&\n Array.isArray(candidate.data) && (candidate.data.length === 0 || typeof candidate.data[0] === 'number');\n }\n SemanticTokens.is = is;\n})(SemanticTokens || (SemanticTokens = {}));\n/**\n * The InlineValueText namespace provides functions to deal with InlineValueTexts.\n *\n * @since 3.17.0\n */\nexport var InlineValueText;\n(function (InlineValueText) {\n /**\n * Creates a new InlineValueText literal.\n */\n function create(range, text) {\n return { range: range, text: text };\n }\n InlineValueText.create = create;\n function is(value) {\n var candidate = value;\n return candidate !== undefined && candidate !== null && Range.is(candidate.range) && Is.string(candidate.text);\n }\n InlineValueText.is = is;\n})(InlineValueText || (InlineValueText = {}));\n/**\n * The InlineValueVariableLookup namespace provides functions to deal with InlineValueVariableLookups.\n *\n * @since 3.17.0\n */\nexport var InlineValueVariableLookup;\n(function (InlineValueVariableLookup) {\n /**\n * Creates a new InlineValueText literal.\n */\n function create(range, variableName, caseSensitiveLookup) {\n return { range: range, variableName: variableName, caseSensitiveLookup: caseSensitiveLookup };\n }\n InlineValueVariableLookup.create = create;\n function is(value) {\n var candidate = value;\n return candidate !== undefined && candidate !== null && Range.is(candidate.range) && Is.boolean(candidate.caseSensitiveLookup)\n && (Is.string(candidate.variableName) || candidate.variableName === undefined);\n }\n InlineValueVariableLookup.is = is;\n})(InlineValueVariableLookup || (InlineValueVariableLookup = {}));\n/**\n * The InlineValueEvaluatableExpression namespace provides functions to deal with InlineValueEvaluatableExpression.\n *\n * @since 3.17.0\n */\nexport var InlineValueEvaluatableExpression;\n(function (InlineValueEvaluatableExpression) {\n /**\n * Creates a new InlineValueEvaluatableExpression literal.\n */\n function create(range, expression) {\n return { range: range, expression: expression };\n }\n InlineValueEvaluatableExpression.create = create;\n function is(value) {\n var candidate = value;\n return candidate !== undefined && candidate !== null && Range.is(candidate.range)\n && (Is.string(candidate.expression) || candidate.expression === undefined);\n }\n InlineValueEvaluatableExpression.is = is;\n})(InlineValueEvaluatableExpression || (InlineValueEvaluatableExpression = {}));\n/**\n * The InlineValueContext namespace provides helper functions to work with\n * [InlineValueContext](#InlineValueContext) literals.\n *\n * @since 3.17.0\n */\nexport var InlineValueContext;\n(function (InlineValueContext) {\n /**\n * Creates a new InlineValueContext literal.\n */\n function create(frameId, stoppedLocation) {\n return { frameId: frameId, stoppedLocation: stoppedLocation };\n }\n InlineValueContext.create = create;\n /**\n * Checks whether the given literal conforms to the [InlineValueContext](#InlineValueContext) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Range.is(value.stoppedLocation);\n }\n InlineValueContext.is = is;\n})(InlineValueContext || (InlineValueContext = {}));\n/**\n * Inlay hint kinds.\n *\n * @since 3.17.0\n */\nexport var InlayHintKind;\n(function (InlayHintKind) {\n /**\n * An inlay hint that for a type annotation.\n */\n InlayHintKind.Type = 1;\n /**\n * An inlay hint that is for a parameter.\n */\n InlayHintKind.Parameter = 2;\n function is(value) {\n return value === 1 || value === 2;\n }\n InlayHintKind.is = is;\n})(InlayHintKind || (InlayHintKind = {}));\nexport var InlayHintLabelPart;\n(function (InlayHintLabelPart) {\n function create(value) {\n return { value: value };\n }\n InlayHintLabelPart.create = create;\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate)\n && (candidate.tooltip === undefined || Is.string(candidate.tooltip) || MarkupContent.is(candidate.tooltip))\n && (candidate.location === undefined || Location.is(candidate.location))\n && (candidate.command === undefined || Command.is(candidate.command));\n }\n InlayHintLabelPart.is = is;\n})(InlayHintLabelPart || (InlayHintLabelPart = {}));\nexport var InlayHint;\n(function (InlayHint) {\n function create(position, label, kind) {\n var result = { position: position, label: label };\n if (kind !== undefined) {\n result.kind = kind;\n }\n return result;\n }\n InlayHint.create = create;\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Position.is(candidate.position)\n && (Is.string(candidate.label) || Is.typedArray(candidate.label, InlayHintLabelPart.is))\n && (candidate.kind === undefined || InlayHintKind.is(candidate.kind))\n && (candidate.textEdits === undefined) || Is.typedArray(candidate.textEdits, TextEdit.is)\n && (candidate.tooltip === undefined || Is.string(candidate.tooltip) || MarkupContent.is(candidate.tooltip))\n && (candidate.paddingLeft === undefined || Is.boolean(candidate.paddingLeft))\n && (candidate.paddingRight === undefined || Is.boolean(candidate.paddingRight));\n }\n InlayHint.is = is;\n})(InlayHint || (InlayHint = {}));\nexport var WorkspaceFolder;\n(function (WorkspaceFolder) {\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && URI.is(candidate.uri) && Is.string(candidate.name);\n }\n WorkspaceFolder.is = is;\n})(WorkspaceFolder || (WorkspaceFolder = {}));\nexport var EOL = ['\\n', '\\r\\n', '\\r'];\n/**\n * @deprecated Use the text document from the new vscode-languageserver-textdocument package.\n */\nexport var TextDocument;\n(function (TextDocument) {\n /**\n * Creates a new ITextDocument literal from the given uri and content.\n * @param uri The document's uri.\n * @param languageId The document's language Id.\n * @param version The document's version.\n * @param content The document's content.\n */\n function create(uri, languageId, version, content) {\n return new FullTextDocument(uri, languageId, version, content);\n }\n TextDocument.create = create;\n /**\n * Checks whether the given literal conforms to the [ITextDocument](#ITextDocument) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && (Is.undefined(candidate.languageId) || Is.string(candidate.languageId)) && Is.uinteger(candidate.lineCount)\n && Is.func(candidate.getText) && Is.func(candidate.positionAt) && Is.func(candidate.offsetAt) ? true : false;\n }\n TextDocument.is = is;\n function applyEdits(document, edits) {\n var text = document.getText();\n var sortedEdits = mergeSort(edits, function (a, b) {\n var diff = a.range.start.line - b.range.start.line;\n if (diff === 0) {\n return a.range.start.character - b.range.start.character;\n }\n return diff;\n });\n var lastModifiedOffset = text.length;\n for (var i = sortedEdits.length - 1; i >= 0; i--) {\n var e = sortedEdits[i];\n var startOffset = document.offsetAt(e.range.start);\n var endOffset = document.offsetAt(e.range.end);\n if (endOffset <= lastModifiedOffset) {\n text = text.substring(0, startOffset) + e.newText + text.substring(endOffset, text.length);\n }\n else {\n throw new Error('Overlapping edit');\n }\n lastModifiedOffset = startOffset;\n }\n return text;\n }\n TextDocument.applyEdits = applyEdits;\n function mergeSort(data, compare) {\n if (data.length <= 1) {\n // sorted\n return data;\n }\n var p = (data.length / 2) | 0;\n var left = data.slice(0, p);\n var right = data.slice(p);\n mergeSort(left, compare);\n mergeSort(right, compare);\n var leftIdx = 0;\n var rightIdx = 0;\n var i = 0;\n while (leftIdx < left.length && rightIdx < right.length) {\n var ret = compare(left[leftIdx], right[rightIdx]);\n if (ret <= 0) {\n // smaller_equal -> take left to preserve order\n data[i++] = left[leftIdx++];\n }\n else {\n // greater -> take right\n data[i++] = right[rightIdx++];\n }\n }\n while (leftIdx < left.length) {\n data[i++] = left[leftIdx++];\n }\n while (rightIdx < right.length) {\n data[i++] = right[rightIdx++];\n }\n return data;\n }\n})(TextDocument || (TextDocument = {}));\n/**\n * @deprecated Use the text document from the new vscode-languageserver-textdocument package.\n */\nvar FullTextDocument = /** @class */ (function () {\n function FullTextDocument(uri, languageId, version, content) {\n this._uri = uri;\n this._languageId = languageId;\n this._version = version;\n this._content = content;\n this._lineOffsets = undefined;\n }\n Object.defineProperty(FullTextDocument.prototype, \"uri\", {\n get: function () {\n return this._uri;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(FullTextDocument.prototype, \"languageId\", {\n get: function () {\n return this._languageId;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(FullTextDocument.prototype, \"version\", {\n get: function () {\n return this._version;\n },\n enumerable: false,\n configurable: true\n });\n FullTextDocument.prototype.getText = function (range) {\n if (range) {\n var start = this.offsetAt(range.start);\n var end = this.offsetAt(range.end);\n return this._content.substring(start, end);\n }\n return this._content;\n };\n FullTextDocument.prototype.update = function (event, version) {\n this._content = event.text;\n this._version = version;\n this._lineOffsets = undefined;\n };\n FullTextDocument.prototype.getLineOffsets = function () {\n if (this._lineOffsets === undefined) {\n var lineOffsets = [];\n var text = this._content;\n var isLineStart = true;\n for (var i = 0; i < text.length; i++) {\n if (isLineStart) {\n lineOffsets.push(i);\n isLineStart = false;\n }\n var ch = text.charAt(i);\n isLineStart = (ch === '\\r' || ch === '\\n');\n if (ch === '\\r' && i + 1 < text.length && text.charAt(i + 1) === '\\n') {\n i++;\n }\n }\n if (isLineStart && text.length > 0) {\n lineOffsets.push(text.length);\n }\n this._lineOffsets = lineOffsets;\n }\n return this._lineOffsets;\n };\n FullTextDocument.prototype.positionAt = function (offset) {\n offset = Math.max(Math.min(offset, this._content.length), 0);\n var lineOffsets = this.getLineOffsets();\n var low = 0, high = lineOffsets.length;\n if (high === 0) {\n return Position.create(0, offset);\n }\n while (low < high) {\n var mid = Math.floor((low + high) / 2);\n if (lineOffsets[mid] > offset) {\n high = mid;\n }\n else {\n low = mid + 1;\n }\n }\n // low is the least x for which the line offset is larger than the current offset\n // or array.length if no line offset is larger than the current offset\n var line = low - 1;\n return Position.create(line, offset - lineOffsets[line]);\n };\n FullTextDocument.prototype.offsetAt = function (position) {\n var lineOffsets = this.getLineOffsets();\n if (position.line >= lineOffsets.length) {\n return this._content.length;\n }\n else if (position.line < 0) {\n return 0;\n }\n var lineOffset = lineOffsets[position.line];\n var nextLineOffset = (position.line + 1 < lineOffsets.length) ? lineOffsets[position.line + 1] : this._content.length;\n return Math.max(Math.min(lineOffset + position.character, nextLineOffset), lineOffset);\n };\n Object.defineProperty(FullTextDocument.prototype, \"lineCount\", {\n get: function () {\n return this.getLineOffsets().length;\n },\n enumerable: false,\n configurable: true\n });\n return FullTextDocument;\n}());\nvar Is;\n(function (Is) {\n var toString = Object.prototype.toString;\n function defined(value) {\n return typeof value !== 'undefined';\n }\n Is.defined = defined;\n function undefined(value) {\n return typeof value === 'undefined';\n }\n Is.undefined = undefined;\n function boolean(value) {\n return value === true || value === false;\n }\n Is.boolean = boolean;\n function string(value) {\n return toString.call(value) === '[object String]';\n }\n Is.string = string;\n function number(value) {\n return toString.call(value) === '[object Number]';\n }\n Is.number = number;\n function numberRange(value, min, max) {\n return toString.call(value) === '[object Number]' && min <= value && value <= max;\n }\n Is.numberRange = numberRange;\n function integer(value) {\n return toString.call(value) === '[object Number]' && -2147483648 <= value && value <= 2147483647;\n }\n Is.integer = integer;\n function uinteger(value) {\n return toString.call(value) === '[object Number]' && 0 <= value && value <= 2147483647;\n }\n Is.uinteger = uinteger;\n function func(value) {\n return toString.call(value) === '[object Function]';\n }\n Is.func = func;\n function objectLiteral(value) {\n // Strictly speaking class instances pass this check as well. Since the LSP\n // doesn't use classes we ignore this for now. If we do we need to add something\n // like this: `Object.getPrototypeOf(Object.getPrototypeOf(x)) === null`\n return value !== null && typeof value === 'object';\n }\n Is.objectLiteral = objectLiteral;\n function typedArray(value, check) {\n return Array.isArray(value) && value.every(check);\n }\n Is.typedArray = typedArray;\n})(Is || (Is = {}));\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport { Range, Position, DocumentUri, MarkupContent, MarkupKind, Color, ColorInformation, ColorPresentation, FoldingRange, FoldingRangeKind, SelectionRange, Diagnostic, DiagnosticSeverity, CompletionItem, CompletionItemKind, CompletionList, CompletionItemTag, InsertTextFormat, SymbolInformation, SymbolKind, DocumentSymbol, Location, Hover, MarkedString, CodeActionContext, Command, CodeAction, DocumentHighlight, DocumentLink, WorkspaceEdit, TextEdit, CodeActionKind, TextDocumentEdit, VersionedTextDocumentIdentifier, DocumentHighlightKind } from 'vscode-languageserver-types';\nimport { TextDocument } from 'vscode-languageserver-textdocument';\nexport { TextDocument, Range, Position, DocumentUri, MarkupContent, MarkupKind, Color, ColorInformation, ColorPresentation, FoldingRange, FoldingRangeKind, SelectionRange, Diagnostic, DiagnosticSeverity, CompletionItem, CompletionItemKind, CompletionList, CompletionItemTag, InsertTextFormat, SymbolInformation, SymbolKind, DocumentSymbol, Location, Hover, MarkedString, CodeActionContext, Command, CodeAction, DocumentHighlight, DocumentLink, WorkspaceEdit, TextEdit, CodeActionKind, TextDocumentEdit, VersionedTextDocumentIdentifier, DocumentHighlightKind };\nexport var ClientCapabilities;\n(function (ClientCapabilities) {\n ClientCapabilities.LATEST = {\n textDocument: {\n completion: {\n completionItem: {\n documentationFormat: [MarkupKind.Markdown, MarkupKind.PlainText]\n }\n },\n hover: {\n contentFormat: [MarkupKind.Markdown, MarkupKind.PlainText]\n }\n }\n };\n})(ClientCapabilities || (ClientCapabilities = {}));\nexport var FileType;\n(function (FileType) {\n /**\n * The file type is unknown.\n */\n FileType[FileType[\"Unknown\"] = 0] = \"Unknown\";\n /**\n * A regular file.\n */\n FileType[FileType[\"File\"] = 1] = \"File\";\n /**\n * A directory.\n */\n FileType[FileType[\"Directory\"] = 2] = \"Directory\";\n /**\n * A symbolic link to a file.\n */\n FileType[FileType[\"SymbolicLink\"] = 64] = \"SymbolicLink\";\n})(FileType || (FileType = {}));\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport { MarkupKind } from '../cssLanguageTypes';\nexport const browserNames = {\n E: 'Edge',\n FF: 'Firefox',\n S: 'Safari',\n C: 'Chrome',\n IE: 'IE',\n O: 'Opera'\n};\nfunction getEntryStatus(status) {\n switch (status) {\n case 'experimental':\n return '\u26A0\uFE0F Property is experimental. Be cautious when using it.\uFE0F\\n\\n';\n case 'nonstandard':\n return '\uD83D\uDEA8\uFE0F Property is nonstandard. Avoid using it.\\n\\n';\n case 'obsolete':\n return '\uD83D\uDEA8\uFE0F\uFE0F\uFE0F Property is obsolete. Avoid using it.\\n\\n';\n default:\n return '';\n }\n}\nexport function getEntryDescription(entry, doesSupportMarkdown, settings) {\n let result;\n if (doesSupportMarkdown) {\n result = {\n kind: 'markdown',\n value: getEntryMarkdownDescription(entry, settings)\n };\n }\n else {\n result = {\n kind: 'plaintext',\n value: getEntryStringDescription(entry, settings)\n };\n }\n if (result.value === '') {\n return undefined;\n }\n return result;\n}\nexport function textToMarkedString(text) {\n text = text.replace(/[\\\\`*_{}[\\]()#+\\-.!]/g, '\\\\$&'); // escape markdown syntax tokens: http://daringfireball.net/projects/markdown/syntax#backslash\n return text.replace(/</g, '<').replace(/>/g, '>');\n}\nfunction getEntryStringDescription(entry, settings) {\n if (!entry.description || entry.description === '') {\n return '';\n }\n if (typeof entry.description !== 'string') {\n return entry.description.value;\n }\n let result = '';\n if (settings?.documentation !== false) {\n if (entry.status) {\n result += getEntryStatus(entry.status);\n }\n result += entry.description;\n const browserLabel = getBrowserLabel(entry.browsers);\n if (browserLabel) {\n result += '\\n(' + browserLabel + ')';\n }\n if ('syntax' in entry) {\n result += `\\n\\nSyntax: ${entry.syntax}`;\n }\n }\n if (entry.references && entry.references.length > 0 && settings?.references !== false) {\n if (result.length > 0) {\n result += '\\n\\n';\n }\n result += entry.references.map(r => {\n return `${r.name}: ${r.url}`;\n }).join(' | ');\n }\n return result;\n}\nfunction getEntryMarkdownDescription(entry, settings) {\n if (!entry.description || entry.description === '') {\n return '';\n }\n let result = '';\n if (settings?.documentation !== false) {\n if (entry.status) {\n result += getEntryStatus(entry.status);\n }\n if (typeof entry.description === 'string') {\n result += textToMarkedString(entry.description);\n }\n else {\n result += entry.description.kind === MarkupKind.Markdown ? entry.description.value : textToMarkedString(entry.description.value);\n }\n const browserLabel = getBrowserLabel(entry.browsers);\n if (browserLabel) {\n result += '\\n\\n(' + textToMarkedString(browserLabel) + ')';\n }\n if ('syntax' in entry && entry.syntax) {\n result += `\\n\\nSyntax: ${textToMarkedString(entry.syntax)}`;\n }\n }\n if (entry.references && entry.references.length > 0 && settings?.references !== false) {\n if (result.length > 0) {\n result += '\\n\\n';\n }\n result += entry.references.map(r => {\n return `[${r.name}](${r.url})`;\n }).join(' | ');\n }\n return result;\n}\n/**\n * Input is like `[\"E12\",\"FF49\",\"C47\",\"IE\",\"O\"]`\n * Output is like `Edge 12, Firefox 49, Chrome 47, IE, Opera`\n */\nexport function getBrowserLabel(browsers = []) {\n if (browsers.length === 0) {\n return null;\n }\n return browsers\n .map(b => {\n let result = '';\n const matches = b.match(/([A-Z]+)(\\d+)?/);\n const name = matches[1];\n const version = matches[2];\n if (name in browserNames) {\n result += browserNames[name];\n }\n if (version) {\n result += ' ' + version;\n }\n return result;\n })\n .join(', ');\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport * as nodes from '../parser/cssNodes';\nimport * as l10n from '@vscode/l10n';\nexport const colorFunctions = [\n { func: 'rgb($red, $green, $blue)', desc: l10n.t('Creates a Color from red, green, and blue values.') },\n { func: 'rgba($red, $green, $blue, $alpha)', desc: l10n.t('Creates a Color from red, green, blue, and alpha values.') },\n { func: 'hsl($hue, $saturation, $lightness)', desc: l10n.t('Creates a Color from hue, saturation, and lightness values.') },\n { func: 'hsla($hue, $saturation, $lightness, $alpha)', desc: l10n.t('Creates a Color from hue, saturation, lightness, and alpha values.') },\n { func: 'hwb($hue $white $black)', desc: l10n.t('Creates a Color from hue, white and black.') }\n];\nexport const colors = {\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aqua: '#00ffff',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n black: '#000000',\n blanchedalmond: '#ffebcd',\n blue: '#0000ff',\n blueviolet: '#8a2be2',\n brown: '#a52a2a',\n burlywood: '#deb887',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n cyan: '#00ffff',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgrey: '#a9a9a9',\n darkgreen: '#006400',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkslategrey: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n fuchsia: '#ff00ff',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n gold: '#ffd700',\n goldenrod: '#daa520',\n gray: '#808080',\n grey: '#808080',\n green: '#008000',\n greenyellow: '#adff2f',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n indianred: '#cd5c5c',\n indigo: '#4b0082',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n lavender: '#e6e6fa',\n lavenderblush: '#fff0f5',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrodyellow: '#fafad2',\n lightgray: '#d3d3d3',\n lightgrey: '#d3d3d3',\n lightgreen: '#90ee90',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n lime: '#00ff00',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n magenta: '#ff00ff',\n maroon: '#800000',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370d8',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n navy: '#000080',\n oldlace: '#fdf5e6',\n olive: '#808000',\n olivedrab: '#6b8e23',\n orange: '#ffa500',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#d87093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n pink: '#ffc0cb',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n purple: '#800080',\n red: '#ff0000',\n rebeccapurple: '#663399',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n silver: '#c0c0c0',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n steelblue: '#4682b4',\n tan: '#d2b48c',\n teal: '#008080',\n thistle: '#d8bfd8',\n tomato: '#ff6347',\n turquoise: '#40e0d0',\n violet: '#ee82ee',\n wheat: '#f5deb3',\n white: '#ffffff',\n whitesmoke: '#f5f5f5',\n yellow: '#ffff00',\n yellowgreen: '#9acd32'\n};\nexport const colorKeywords = {\n 'currentColor': 'The value of the \\'color\\' property. The computed value of the \\'currentColor\\' keyword is the computed value of the \\'color\\' property. If the \\'currentColor\\' keyword is set on the \\'color\\' property itself, it is treated as \\'color:inherit\\' at parse time.',\n 'transparent': 'Fully transparent. This keyword can be considered a shorthand for rgba(0,0,0,0) which is its computed value.',\n};\nfunction getNumericValue(node, factor) {\n const val = node.getText();\n const m = val.match(/^([-+]?[0-9]*\\.?[0-9]+)(%?)$/);\n if (m) {\n if (m[2]) {\n factor = 100.0;\n }\n const result = parseFloat(m[1]) / factor;\n if (result >= 0 && result <= 1) {\n return result;\n }\n }\n throw new Error();\n}\nfunction getAngle(node) {\n const val = node.getText();\n const m = val.match(/^([-+]?[0-9]*\\.?[0-9]+)(deg|rad|grad|turn)?$/);\n if (m) {\n switch (m[2]) {\n case 'deg':\n return parseFloat(val) % 360;\n case 'rad':\n return (parseFloat(val) * 180 / Math.PI) % 360;\n case 'grad':\n return (parseFloat(val) * 0.9) % 360;\n case 'turn':\n return (parseFloat(val) * 360) % 360;\n default:\n if ('undefined' === typeof m[2]) {\n return parseFloat(val) % 360;\n }\n }\n }\n throw new Error();\n}\nexport function isColorConstructor(node) {\n const name = node.getName();\n if (!name) {\n return false;\n }\n return /^(rgb|rgba|hsl|hsla|hwb)$/gi.test(name);\n}\n/**\n * Returns true if the node is a color value - either\n * defined a hex number, as rgb or rgba function, or\n * as color name.\n */\nexport function isColorValue(node) {\n if (node.type === nodes.NodeType.HexColorValue) {\n return true;\n }\n else if (node.type === nodes.NodeType.Function) {\n return isColorConstructor(node);\n }\n else if (node.type === nodes.NodeType.Identifier) {\n if (node.parent && node.parent.type !== nodes.NodeType.Term) {\n return false;\n }\n const candidateColor = node.getText().toLowerCase();\n if (candidateColor === 'none') {\n return false;\n }\n if (colors[candidateColor]) {\n return true;\n }\n }\n return false;\n}\nconst Digit0 = 48;\nconst Digit9 = 57;\nconst A = 65;\nconst F = 70;\nconst a = 97;\nconst f = 102;\nexport function hexDigit(charCode) {\n if (charCode < Digit0) {\n return 0;\n }\n if (charCode <= Digit9) {\n return charCode - Digit0;\n }\n if (charCode < a) {\n charCode += (a - A);\n }\n if (charCode >= a && charCode <= f) {\n return charCode - a + 10;\n }\n return 0;\n}\nexport function colorFromHex(text) {\n if (text[0] !== '#') {\n return null;\n }\n switch (text.length) {\n case 4:\n return {\n red: (hexDigit(text.charCodeAt(1)) * 0x11) / 255.0,\n green: (hexDigit(text.charCodeAt(2)) * 0x11) / 255.0,\n blue: (hexDigit(text.charCodeAt(3)) * 0x11) / 255.0,\n alpha: 1\n };\n case 5:\n return {\n red: (hexDigit(text.charCodeAt(1)) * 0x11) / 255.0,\n green: (hexDigit(text.charCodeAt(2)) * 0x11) / 255.0,\n blue: (hexDigit(text.charCodeAt(3)) * 0x11) / 255.0,\n alpha: (hexDigit(text.charCodeAt(4)) * 0x11) / 255.0,\n };\n case 7:\n return {\n red: (hexDigit(text.charCodeAt(1)) * 0x10 + hexDigit(text.charCodeAt(2))) / 255.0,\n green: (hexDigit(text.charCodeAt(3)) * 0x10 + hexDigit(text.charCodeAt(4))) / 255.0,\n blue: (hexDigit(text.charCodeAt(5)) * 0x10 + hexDigit(text.charCodeAt(6))) / 255.0,\n alpha: 1\n };\n case 9:\n return {\n red: (hexDigit(text.charCodeAt(1)) * 0x10 + hexDigit(text.charCodeAt(2))) / 255.0,\n green: (hexDigit(text.charCodeAt(3)) * 0x10 + hexDigit(text.charCodeAt(4))) / 255.0,\n blue: (hexDigit(text.charCodeAt(5)) * 0x10 + hexDigit(text.charCodeAt(6))) / 255.0,\n alpha: (hexDigit(text.charCodeAt(7)) * 0x10 + hexDigit(text.charCodeAt(8))) / 255.0\n };\n }\n return null;\n}\nexport function colorFrom256RGB(red, green, blue, alpha = 1.0) {\n return {\n red: red / 255.0,\n green: green / 255.0,\n blue: blue / 255.0,\n alpha\n };\n}\nexport function colorFromHSL(hue, sat, light, alpha = 1.0) {\n hue = hue / 60.0;\n if (sat === 0) {\n return { red: light, green: light, blue: light, alpha };\n }\n else {\n const hueToRgb = (t1, t2, hue) => {\n while (hue < 0) {\n hue += 6;\n }\n while (hue >= 6) {\n hue -= 6;\n }\n if (hue < 1) {\n return (t2 - t1) * hue + t1;\n }\n if (hue < 3) {\n return t2;\n }\n if (hue < 4) {\n return (t2 - t1) * (4 - hue) + t1;\n }\n return t1;\n };\n const t2 = light <= 0.5 ? (light * (sat + 1)) : (light + sat - (light * sat));\n const t1 = light * 2 - t2;\n return { red: hueToRgb(t1, t2, hue + 2), green: hueToRgb(t1, t2, hue), blue: hueToRgb(t1, t2, hue - 2), alpha };\n }\n}\nexport function hslFromColor(rgba) {\n const r = rgba.red;\n const g = rgba.green;\n const b = rgba.blue;\n const a = rgba.alpha;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n const l = (min + max) / 2;\n const chroma = max - min;\n if (chroma > 0) {\n s = Math.min((l <= 0.5 ? chroma / (2 * l) : chroma / (2 - (2 * l))), 1);\n switch (max) {\n case r:\n h = (g - b) / chroma + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / chroma + 2;\n break;\n case b:\n h = (r - g) / chroma + 4;\n break;\n }\n h *= 60;\n h = Math.round(h);\n }\n return { h, s, l, a };\n}\nexport function colorFromHWB(hue, white, black, alpha = 1.0) {\n if (white + black >= 1) {\n const gray = white / (white + black);\n return { red: gray, green: gray, blue: gray, alpha };\n }\n const rgb = colorFromHSL(hue, 1, 0.5, alpha);\n let red = rgb.red;\n red *= (1 - white - black);\n red += white;\n let green = rgb.green;\n green *= (1 - white - black);\n green += white;\n let blue = rgb.blue;\n blue *= (1 - white - black);\n blue += white;\n return {\n red: red,\n green: green,\n blue: blue,\n alpha\n };\n}\nexport function hwbFromColor(rgba) {\n const hsl = hslFromColor(rgba);\n const white = Math.min(rgba.red, rgba.green, rgba.blue);\n const black = 1 - Math.max(rgba.red, rgba.green, rgba.blue);\n return {\n h: hsl.h,\n w: white,\n b: black,\n a: hsl.a\n };\n}\nexport function getColorValue(node) {\n if (node.type === nodes.NodeType.HexColorValue) {\n const text = node.getText();\n return colorFromHex(text);\n }\n else if (node.type === nodes.NodeType.Function) {\n const functionNode = node;\n const name = functionNode.getName();\n let colorValues = functionNode.getArguments().getChildren();\n if (colorValues.length === 1) {\n const functionArg = colorValues[0].getChildren();\n if (functionArg.length === 1 && functionArg[0].type === nodes.NodeType.Expression) {\n colorValues = functionArg[0].getChildren();\n if (colorValues.length === 3) {\n const lastValue = colorValues[2];\n if (lastValue instanceof nodes.BinaryExpression) {\n const left = lastValue.getLeft(), right = lastValue.getRight(), operator = lastValue.getOperator();\n if (left && right && operator && operator.matches('/')) {\n colorValues = [colorValues[0], colorValues[1], left, right];\n }\n }\n }\n }\n }\n if (!name || colorValues.length < 3 || colorValues.length > 4) {\n return null;\n }\n try {\n const alpha = colorValues.length === 4 ? getNumericValue(colorValues[3], 1) : 1;\n if (name === 'rgb' || name === 'rgba') {\n return {\n red: getNumericValue(colorValues[0], 255.0),\n green: getNumericValue(colorValues[1], 255.0),\n blue: getNumericValue(colorValues[2], 255.0),\n alpha\n };\n }\n else if (name === 'hsl' || name === 'hsla') {\n const h = getAngle(colorValues[0]);\n const s = getNumericValue(colorValues[1], 100.0);\n const l = getNumericValue(colorValues[2], 100.0);\n return colorFromHSL(h, s, l, alpha);\n }\n else if (name === 'hwb') {\n const h = getAngle(colorValues[0]);\n const w = getNumericValue(colorValues[1], 100.0);\n const b = getNumericValue(colorValues[2], 100.0);\n return colorFromHWB(h, w, b, alpha);\n }\n }\n catch (e) {\n // parse error on numeric value\n return null;\n }\n }\n else if (node.type === nodes.NodeType.Identifier) {\n if (node.parent && node.parent.type !== nodes.NodeType.Term) {\n return null;\n }\n const term = node.parent;\n if (term && term.parent && term.parent.type === nodes.NodeType.BinaryExpression) {\n const expression = term.parent;\n if (expression.parent && expression.parent.type === nodes.NodeType.ListEntry && expression.parent.key === expression) {\n return null;\n }\n }\n const candidateColor = node.getText().toLowerCase();\n if (candidateColor === 'none') {\n return null;\n }\n const colorHex = colors[candidateColor];\n if (colorHex) {\n return colorFromHex(colorHex);\n }\n }\n return null;\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nexport const positionKeywords = {\n 'bottom': 'Computes to \u2018100%\u2019 for the vertical position if one or two values are given, otherwise specifies the bottom edge as the origin for the next offset.',\n 'center': 'Computes to \u201850%\u2019 (\u2018left 50%\u2019) for the horizontal position if the horizontal position is not otherwise specified, or \u201850%\u2019 (\u2018top 50%\u2019) for the vertical position if it is.',\n 'left': 'Computes to \u20180%\u2019 for the horizontal position if one or two values are given, otherwise specifies the left edge as the origin for the next offset.',\n 'right': 'Computes to \u2018100%\u2019 for the horizontal position if one or two values are given, otherwise specifies the right edge as the origin for the next offset.',\n 'top': 'Computes to \u20180%\u2019 for the vertical position if one or two values are given, otherwise specifies the top edge as the origin for the next offset.'\n};\nexport const repeatStyleKeywords = {\n 'no-repeat': 'Placed once and not repeated in this direction.',\n 'repeat': 'Repeated in this direction as often as needed to cover the background painting area.',\n 'repeat-x': 'Computes to \u2018repeat no-repeat\u2019.',\n 'repeat-y': 'Computes to \u2018no-repeat repeat\u2019.',\n 'round': 'Repeated as often as will fit within the background positioning area. If it doesn\u2019t fit a whole number of times, it is rescaled so that it does.',\n 'space': 'Repeated as often as will fit within the background positioning area without being clipped and then the images are spaced out to fill the area.'\n};\nexport const lineStyleKeywords = {\n 'dashed': 'A series of square-ended dashes.',\n 'dotted': 'A series of round dots.',\n 'double': 'Two parallel solid lines with some space between them.',\n 'groove': 'Looks as if it were carved in the canvas.',\n 'hidden': 'Same as \u2018none\u2019, but has different behavior in the border conflict resolution rules for border-collapsed tables.',\n 'inset': 'Looks as if the content on the inside of the border is sunken into the canvas.',\n 'none': 'No border. Color and width are ignored.',\n 'outset': 'Looks as if the content on the inside of the border is coming out of the canvas.',\n 'ridge': 'Looks as if it were coming out of the canvas.',\n 'solid': 'A single line segment.'\n};\nexport const lineWidthKeywords = ['medium', 'thick', 'thin'];\nexport const boxKeywords = {\n 'border-box': 'The background is painted within (clipped to) the border box.',\n 'content-box': 'The background is painted within (clipped to) the content box.',\n 'padding-box': 'The background is painted within (clipped to) the padding box.'\n};\nexport const geometryBoxKeywords = {\n 'margin-box': 'Uses the margin box as reference box.',\n 'fill-box': 'Uses the object bounding box as reference box.',\n 'stroke-box': 'Uses the stroke bounding box as reference box.',\n 'view-box': 'Uses the nearest SVG viewport as reference box.'\n};\nexport const cssWideKeywords = {\n 'initial': 'Represents the value specified as the property\u2019s initial value.',\n 'inherit': 'Represents the computed value of the property on the element\u2019s parent.',\n 'unset': 'Acts as either `inherit` or `initial`, depending on whether the property is inherited or not.'\n};\nexport const cssWideFunctions = {\n 'var()': 'Evaluates the value of a custom variable.',\n 'calc()': 'Evaluates an mathematical expression. The following operators can be used: + - * /.'\n};\nexport const imageFunctions = {\n 'url()': 'Reference an image file by URL',\n 'image()': 'Provide image fallbacks and annotations.',\n '-webkit-image-set()': 'Provide multiple resolutions. Remember to use unprefixed image-set() in addition.',\n 'image-set()': 'Provide multiple resolutions of an image and const the UA decide which is most appropriate in a given situation.',\n '-moz-element()': 'Use an element in the document as an image. Remember to use unprefixed element() in addition.',\n 'element()': 'Use an element in the document as an image.',\n 'cross-fade()': 'Indicates the two images to be combined and how far along in the transition the combination is.',\n '-webkit-gradient()': 'Deprecated. Use modern linear-gradient() or radial-gradient() instead.',\n '-webkit-linear-gradient()': 'Linear gradient. Remember to use unprefixed version in addition.',\n '-moz-linear-gradient()': 'Linear gradient. Remember to use unprefixed version in addition.',\n '-o-linear-gradient()': 'Linear gradient. Remember to use unprefixed version in addition.',\n 'linear-gradient()': 'A linear gradient is created by specifying a straight gradient line, and then several colors placed along that line.',\n '-webkit-repeating-linear-gradient()': 'Repeating Linear gradient. Remember to use unprefixed version in addition.',\n '-moz-repeating-linear-gradient()': 'Repeating Linear gradient. Remember to use unprefixed version in addition.',\n '-o-repeating-linear-gradient()': 'Repeating Linear gradient. Remember to use unprefixed version in addition.',\n 'repeating-linear-gradient()': 'Same as linear-gradient, except the color-stops are repeated infinitely in both directions, with their positions shifted by multiples of the difference between the last specified color-stop\u2019s position and the first specified color-stop\u2019s position.',\n '-webkit-radial-gradient()': 'Radial gradient. Remember to use unprefixed version in addition.',\n '-moz-radial-gradient()': 'Radial gradient. Remember to use unprefixed version in addition.',\n 'radial-gradient()': 'Colors emerge from a single point and smoothly spread outward in a circular or elliptical shape.',\n '-webkit-repeating-radial-gradient()': 'Repeating radial gradient. Remember to use unprefixed version in addition.',\n '-moz-repeating-radial-gradient()': 'Repeating radial gradient. Remember to use unprefixed version in addition.',\n 'repeating-radial-gradient()': 'Same as radial-gradient, except the color-stops are repeated infinitely in both directions, with their positions shifted by multiples of the difference between the last specified color-stop\u2019s position and the first specified color-stop\u2019s position.'\n};\nexport const transitionTimingFunctions = {\n 'ease': 'Equivalent to cubic-bezier(0.25, 0.1, 0.25, 1.0).',\n 'ease-in': 'Equivalent to cubic-bezier(0.42, 0, 1.0, 1.0).',\n 'ease-in-out': 'Equivalent to cubic-bezier(0.42, 0, 0.58, 1.0).',\n 'ease-out': 'Equivalent to cubic-bezier(0, 0, 0.58, 1.0).',\n 'linear': 'Equivalent to cubic-bezier(0.0, 0.0, 1.0, 1.0).',\n 'step-end': 'Equivalent to steps(1, end).',\n 'step-start': 'Equivalent to steps(1, start).',\n 'steps()': 'The first parameter specifies the number of intervals in the function. The second parameter, which is optional, is either the value \u201Cstart\u201D or \u201Cend\u201D.',\n 'cubic-bezier()': 'Specifies a cubic-bezier curve. The four values specify points P1 and P2 of the curve as (x1, y1, x2, y2).',\n 'cubic-bezier(0.6, -0.28, 0.735, 0.045)': 'Ease-in Back. Overshoots.',\n 'cubic-bezier(0.68, -0.55, 0.265, 1.55)': 'Ease-in-out Back. Overshoots.',\n 'cubic-bezier(0.175, 0.885, 0.32, 1.275)': 'Ease-out Back. Overshoots.',\n 'cubic-bezier(0.6, 0.04, 0.98, 0.335)': 'Ease-in Circular. Based on half circle.',\n 'cubic-bezier(0.785, 0.135, 0.15, 0.86)': 'Ease-in-out Circular. Based on half circle.',\n 'cubic-bezier(0.075, 0.82, 0.165, 1)': 'Ease-out Circular. Based on half circle.',\n 'cubic-bezier(0.55, 0.055, 0.675, 0.19)': 'Ease-in Cubic. Based on power of three.',\n 'cubic-bezier(0.645, 0.045, 0.355, 1)': 'Ease-in-out Cubic. Based on power of three.',\n 'cubic-bezier(0.215, 0.610, 0.355, 1)': 'Ease-out Cubic. Based on power of three.',\n 'cubic-bezier(0.95, 0.05, 0.795, 0.035)': 'Ease-in Exponential. Based on two to the power ten.',\n 'cubic-bezier(1, 0, 0, 1)': 'Ease-in-out Exponential. Based on two to the power ten.',\n 'cubic-bezier(0.19, 1, 0.22, 1)': 'Ease-out Exponential. Based on two to the power ten.',\n 'cubic-bezier(0.47, 0, 0.745, 0.715)': 'Ease-in Sine.',\n 'cubic-bezier(0.445, 0.05, 0.55, 0.95)': 'Ease-in-out Sine.',\n 'cubic-bezier(0.39, 0.575, 0.565, 1)': 'Ease-out Sine.',\n 'cubic-bezier(0.55, 0.085, 0.68, 0.53)': 'Ease-in Quadratic. Based on power of two.',\n 'cubic-bezier(0.455, 0.03, 0.515, 0.955)': 'Ease-in-out Quadratic. Based on power of two.',\n 'cubic-bezier(0.25, 0.46, 0.45, 0.94)': 'Ease-out Quadratic. Based on power of two.',\n 'cubic-bezier(0.895, 0.03, 0.685, 0.22)': 'Ease-in Quartic. Based on power of four.',\n 'cubic-bezier(0.77, 0, 0.175, 1)': 'Ease-in-out Quartic. Based on power of four.',\n 'cubic-bezier(0.165, 0.84, 0.44, 1)': 'Ease-out Quartic. Based on power of four.',\n 'cubic-bezier(0.755, 0.05, 0.855, 0.06)': 'Ease-in Quintic. Based on power of five.',\n 'cubic-bezier(0.86, 0, 0.07, 1)': 'Ease-in-out Quintic. Based on power of five.',\n 'cubic-bezier(0.23, 1, 0.320, 1)': 'Ease-out Quintic. Based on power of five.'\n};\nexport const basicShapeFunctions = {\n 'circle()': 'Defines a circle.',\n 'ellipse()': 'Defines an ellipse.',\n 'inset()': 'Defines an inset rectangle.',\n 'polygon()': 'Defines a polygon.'\n};\nexport const units = {\n 'length': ['em', 'rem', 'ex', 'px', 'cm', 'mm', 'in', 'pt', 'pc', 'ch', 'vw', 'vh', 'vmin', 'vmax'],\n 'angle': ['deg', 'rad', 'grad', 'turn'],\n 'time': ['ms', 's'],\n 'frequency': ['Hz', 'kHz'],\n 'resolution': ['dpi', 'dpcm', 'dppx'],\n 'percentage': ['%', 'fr']\n};\nexport const html5Tags = ['a', 'abbr', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', 'bdi', 'bdo', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption',\n 'cite', 'code', 'col', 'colgroup', 'data', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'div', 'dl', 'dt', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'footer',\n 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'iframe', 'img', 'input', 'ins', 'kbd', 'keygen', 'label', 'legend', 'li', 'link',\n 'main', 'map', 'mark', 'menu', 'menuitem', 'meta', 'meter', 'nav', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'picture', 'pre', 'progress', 'q',\n 'rb', 'rp', 'rt', 'rtc', 'ruby', 's', 'samp', 'script', 'section', 'select', 'small', 'source', 'span', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td',\n 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'u', 'ul', 'const', 'video', 'wbr'];\nexport const svgElements = ['circle', 'clipPath', 'cursor', 'defs', 'desc', 'ellipse', 'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting',\n 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology',\n 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence', 'filter', 'foreignObject', 'g', 'hatch', 'hatchpath', 'image', 'line', 'linearGradient',\n 'marker', 'mask', 'mesh', 'meshpatch', 'meshrow', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'set', 'solidcolor', 'stop', 'svg', 'switch',\n 'symbol', 'text', 'textPath', 'tspan', 'use', 'view'];\nexport const pageBoxDirectives = [\n '@bottom-center', '@bottom-left', '@bottom-left-corner', '@bottom-right', '@bottom-right-corner',\n '@left-bottom', '@left-middle', '@left-top', '@right-bottom', '@right-middle', '@right-top',\n '@top-center', '@top-left', '@top-left-corner', '@top-right', '@top-right-corner'\n];\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nexport function values(obj) {\n return Object.keys(obj).map(key => obj[key]);\n}\nexport function isDefined(obj) {\n return typeof obj !== 'undefined';\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport { TokenType, Scanner } from './cssScanner';\nimport * as nodes from './cssNodes';\nimport { ParseError } from './cssErrors';\nimport * as languageFacts from '../languageFacts/facts';\nimport { isDefined } from '../utils/objects';\n/// <summary>\n/// A parser for the css core specification. See for reference:\n/// https://www.w3.org/TR/CSS21/grammar.html\n/// http://www.w3.org/TR/CSS21/syndata.html#tokenization\n/// </summary>\nexport class Parser {\n constructor(scnr = new Scanner()) {\n this.keyframeRegex = /^@(\\-(webkit|ms|moz|o)\\-)?keyframes$/i;\n this.scanner = scnr;\n this.token = { type: TokenType.EOF, offset: -1, len: 0, text: '' };\n this.prevToken = undefined;\n }\n peekIdent(text) {\n return TokenType.Ident === this.token.type && text.length === this.token.text.length && text === this.token.text.toLowerCase();\n }\n peekKeyword(text) {\n return TokenType.AtKeyword === this.token.type && text.length === this.token.text.length && text === this.token.text.toLowerCase();\n }\n peekDelim(text) {\n return TokenType.Delim === this.token.type && text === this.token.text;\n }\n peek(type) {\n return type === this.token.type;\n }\n peekOne(...types) {\n return types.indexOf(this.token.type) !== -1;\n }\n peekRegExp(type, regEx) {\n if (type !== this.token.type) {\n return false;\n }\n return regEx.test(this.token.text);\n }\n hasWhitespace() {\n return !!this.prevToken && (this.prevToken.offset + this.prevToken.len !== this.token.offset);\n }\n consumeToken() {\n this.prevToken = this.token;\n this.token = this.scanner.scan();\n }\n acceptUnicodeRange() {\n const token = this.scanner.tryScanUnicode();\n if (token) {\n this.prevToken = token;\n this.token = this.scanner.scan();\n return true;\n }\n return false;\n }\n mark() {\n return {\n prev: this.prevToken,\n curr: this.token,\n pos: this.scanner.pos()\n };\n }\n restoreAtMark(mark) {\n this.prevToken = mark.prev;\n this.token = mark.curr;\n this.scanner.goBackTo(mark.pos);\n }\n try(func) {\n const pos = this.mark();\n const node = func();\n if (!node) {\n this.restoreAtMark(pos);\n return null;\n }\n return node;\n }\n acceptOneKeyword(keywords) {\n if (TokenType.AtKeyword === this.token.type) {\n for (const keyword of keywords) {\n if (keyword.length === this.token.text.length && keyword === this.token.text.toLowerCase()) {\n this.consumeToken();\n return true;\n }\n }\n }\n return false;\n }\n accept(type) {\n if (type === this.token.type) {\n this.consumeToken();\n return true;\n }\n return false;\n }\n acceptIdent(text) {\n if (this.peekIdent(text)) {\n this.consumeToken();\n return true;\n }\n return false;\n }\n acceptKeyword(text) {\n if (this.peekKeyword(text)) {\n this.consumeToken();\n return true;\n }\n return false;\n }\n acceptDelim(text) {\n if (this.peekDelim(text)) {\n this.consumeToken();\n return true;\n }\n return false;\n }\n acceptRegexp(regEx) {\n if (regEx.test(this.token.text)) {\n this.consumeToken();\n return true;\n }\n return false;\n }\n _parseRegexp(regEx) {\n let node = this.createNode(nodes.NodeType.Identifier);\n do { } while (this.acceptRegexp(regEx));\n return this.finish(node);\n }\n acceptUnquotedString() {\n const pos = this.scanner.pos();\n this.scanner.goBackTo(this.token.offset);\n const unquoted = this.scanner.scanUnquotedString();\n if (unquoted) {\n this.token = unquoted;\n this.consumeToken();\n return true;\n }\n this.scanner.goBackTo(pos);\n return false;\n }\n resync(resyncTokens, resyncStopTokens) {\n while (true) {\n if (resyncTokens && resyncTokens.indexOf(this.token.type) !== -1) {\n this.consumeToken();\n return true;\n }\n else if (resyncStopTokens && resyncStopTokens.indexOf(this.token.type) !== -1) {\n return true;\n }\n else {\n if (this.token.type === TokenType.EOF) {\n return false;\n }\n this.token = this.scanner.scan();\n }\n }\n }\n createNode(nodeType) {\n return new nodes.Node(this.token.offset, this.token.len, nodeType);\n }\n create(ctor) {\n return new ctor(this.token.offset, this.token.len);\n }\n finish(node, error, resyncTokens, resyncStopTokens) {\n // parseNumeric misuses error for boolean flagging (however the real error mustn't be a false)\n // + nodelist offsets mustn't be modified, because there is a offset hack in rulesets for smartselection\n if (!(node instanceof nodes.Nodelist)) {\n if (error) {\n this.markError(node, error, resyncTokens, resyncStopTokens);\n }\n // set the node end position\n if (this.prevToken) {\n // length with more elements belonging together\n const prevEnd = this.prevToken.offset + this.prevToken.len;\n node.length = prevEnd > node.offset ? prevEnd - node.offset : 0; // offset is taken from current token, end from previous: Use 0 for empty nodes\n }\n }\n return node;\n }\n markError(node, error, resyncTokens, resyncStopTokens) {\n if (this.token !== this.lastErrorToken) { // do not report twice on the same token\n node.addIssue(new nodes.Marker(node, error, nodes.Level.Error, undefined, this.token.offset, this.token.len));\n this.lastErrorToken = this.token;\n }\n if (resyncTokens || resyncStopTokens) {\n this.resync(resyncTokens, resyncStopTokens);\n }\n }\n parseStylesheet(textDocument) {\n const versionId = textDocument.version;\n const text = textDocument.getText();\n const textProvider = (offset, length) => {\n if (textDocument.version !== versionId) {\n throw new Error('Underlying model has changed, AST is no longer valid');\n }\n return text.substr(offset, length);\n };\n return this.internalParse(text, this._parseStylesheet, textProvider);\n }\n internalParse(input, parseFunc, textProvider) {\n this.scanner.setSource(input);\n this.token = this.scanner.scan();\n const node = parseFunc.bind(this)();\n if (node) {\n if (textProvider) {\n node.textProvider = textProvider;\n }\n else {\n node.textProvider = (offset, length) => { return input.substr(offset, length); };\n }\n }\n return node;\n }\n _parseStylesheet() {\n const node = this.create(nodes.Stylesheet);\n while (node.addChild(this._parseStylesheetStart())) {\n // Parse statements only valid at the beginning of stylesheets.\n }\n let inRecovery = false;\n do {\n let hasMatch = false;\n do {\n hasMatch = false;\n const statement = this._parseStylesheetStatement();\n if (statement) {\n node.addChild(statement);\n hasMatch = true;\n inRecovery = false;\n if (!this.peek(TokenType.EOF) && this._needsSemicolonAfter(statement) && !this.accept(TokenType.SemiColon)) {\n this.markError(node, ParseError.SemiColonExpected);\n }\n }\n while (this.accept(TokenType.SemiColon) || this.accept(TokenType.CDO) || this.accept(TokenType.CDC)) {\n // accept empty statements\n hasMatch = true;\n inRecovery = false;\n }\n } while (hasMatch);\n if (this.peek(TokenType.EOF)) {\n break;\n }\n if (!inRecovery) {\n if (this.peek(TokenType.AtKeyword)) {\n this.markError(node, ParseError.UnknownAtRule);\n }\n else {\n this.markError(node, ParseError.RuleOrSelectorExpected);\n }\n inRecovery = true;\n }\n this.consumeToken();\n } while (!this.peek(TokenType.EOF));\n return this.finish(node);\n }\n _parseStylesheetStart() {\n return this._parseCharset();\n }\n _parseStylesheetStatement(isNested = false) {\n if (this.peek(TokenType.AtKeyword)) {\n return this._parseStylesheetAtStatement(isNested);\n }\n return this._parseRuleset(isNested);\n }\n _parseStylesheetAtStatement(isNested = false) {\n return this._parseImport()\n || this._parseMedia(isNested)\n || this._parsePage()\n || this._parseFontFace()\n || this._parseKeyframe()\n || this._parseSupports(isNested)\n || this._parseLayer()\n || this._parsePropertyAtRule()\n || this._parseViewPort()\n || this._parseNamespace()\n || this._parseDocument()\n || this._parseUnknownAtRule();\n }\n _tryParseRuleset(isNested) {\n const mark = this.mark();\n if (this._parseSelector(isNested)) {\n while (this.accept(TokenType.Comma) && this._parseSelector(isNested)) {\n // loop\n }\n if (this.accept(TokenType.CurlyL)) {\n this.restoreAtMark(mark);\n return this._parseRuleset(isNested);\n }\n }\n this.restoreAtMark(mark);\n return null;\n }\n _parseRuleset(isNested = false) {\n const node = this.create(nodes.RuleSet);\n const selectors = node.getSelectors();\n if (!selectors.addChild(this._parseSelector(isNested))) {\n return null;\n }\n while (this.accept(TokenType.Comma)) {\n if (!selectors.addChild(this._parseSelector(isNested))) {\n return this.finish(node, ParseError.SelectorExpected);\n }\n }\n return this._parseBody(node, this._parseRuleSetDeclaration.bind(this));\n }\n _parseRuleSetDeclarationAtStatement() {\n return this._parseUnknownAtRule();\n }\n _parseRuleSetDeclaration() {\n // https://www.w3.org/TR/css-syntax-3/#consume-a-list-of-declarations\n if (this.peek(TokenType.AtKeyword)) {\n return this._parseRuleSetDeclarationAtStatement();\n }\n return this._parseDeclaration();\n }\n _needsSemicolonAfter(node) {\n switch (node.type) {\n case nodes.NodeType.Keyframe:\n case nodes.NodeType.ViewPort:\n case nodes.NodeType.Media:\n case nodes.NodeType.Ruleset:\n case nodes.NodeType.Namespace:\n case nodes.NodeType.If:\n case nodes.NodeType.For:\n case nodes.NodeType.Each:\n case nodes.NodeType.While:\n case nodes.NodeType.MixinDeclaration:\n case nodes.NodeType.FunctionDeclaration:\n case nodes.NodeType.MixinContentDeclaration:\n return false;\n case nodes.NodeType.ExtendsReference:\n case nodes.NodeType.MixinContentReference:\n case nodes.NodeType.ReturnStatement:\n case nodes.NodeType.MediaQuery:\n case nodes.NodeType.Debug:\n case nodes.NodeType.Import:\n case nodes.NodeType.AtApplyRule:\n case nodes.NodeType.CustomPropertyDeclaration:\n return true;\n case nodes.NodeType.VariableDeclaration:\n return node.needsSemicolon;\n case nodes.NodeType.MixinReference:\n return !node.getContent();\n case nodes.NodeType.Declaration:\n return !node.getNestedProperties();\n }\n return false;\n }\n _parseDeclarations(parseDeclaration) {\n const node = this.create(nodes.Declarations);\n if (!this.accept(TokenType.CurlyL)) {\n return null;\n }\n let decl = parseDeclaration();\n while (node.addChild(decl)) {\n if (this.peek(TokenType.CurlyR)) {\n break;\n }\n if (this._needsSemicolonAfter(decl) && !this.accept(TokenType.SemiColon)) {\n return this.finish(node, ParseError.SemiColonExpected, [TokenType.SemiColon, TokenType.CurlyR]);\n }\n // We accepted semicolon token. Link it to declaration.\n if (decl && this.prevToken && this.prevToken.type === TokenType.SemiColon) {\n decl.semicolonPosition = this.prevToken.offset;\n }\n while (this.accept(TokenType.SemiColon)) {\n // accept empty statements\n }\n decl = parseDeclaration();\n }\n if (!this.accept(TokenType.CurlyR)) {\n return this.finish(node, ParseError.RightCurlyExpected, [TokenType.CurlyR, TokenType.SemiColon]);\n }\n return this.finish(node);\n }\n _parseBody(node, parseDeclaration) {\n if (!node.setDeclarations(this._parseDeclarations(parseDeclaration))) {\n return this.finish(node, ParseError.LeftCurlyExpected, [TokenType.CurlyR, TokenType.SemiColon]);\n }\n return this.finish(node);\n }\n _parseSelector(isNested) {\n const node = this.create(nodes.Selector);\n let hasContent = false;\n if (isNested) {\n // nested selectors can start with a combinator\n hasContent = node.addChild(this._parseCombinator());\n }\n while (node.addChild(this._parseSimpleSelector())) {\n hasContent = true;\n node.addChild(this._parseCombinator()); // optional\n }\n return hasContent ? this.finish(node) : null;\n }\n _parseDeclaration(stopTokens) {\n const custonProperty = this._tryParseCustomPropertyDeclaration(stopTokens);\n if (custonProperty) {\n return custonProperty;\n }\n const node = this.create(nodes.Declaration);\n if (!node.setProperty(this._parseProperty())) {\n return null;\n }\n if (!this.accept(TokenType.Colon)) {\n return this.finish(node, ParseError.ColonExpected, [TokenType.Colon], stopTokens || [TokenType.SemiColon]);\n }\n if (this.prevToken) {\n node.colonPosition = this.prevToken.offset;\n }\n if (!node.setValue(this._parseExpr())) {\n return this.finish(node, ParseError.PropertyValueExpected);\n }\n node.addChild(this._parsePrio());\n if (this.peek(TokenType.SemiColon)) {\n node.semicolonPosition = this.token.offset; // not part of the declaration, but useful information for code assist\n }\n return this.finish(node);\n }\n _tryParseCustomPropertyDeclaration(stopTokens) {\n if (!this.peekRegExp(TokenType.Ident, /^--/)) {\n return null;\n }\n const node = this.create(nodes.CustomPropertyDeclaration);\n if (!node.setProperty(this._parseProperty())) {\n return null;\n }\n if (!this.accept(TokenType.Colon)) {\n return this.finish(node, ParseError.ColonExpected, [TokenType.Colon]);\n }\n if (this.prevToken) {\n node.colonPosition = this.prevToken.offset;\n }\n const mark = this.mark();\n if (this.peek(TokenType.CurlyL)) {\n // try to parse it as nested declaration\n const propertySet = this.create(nodes.CustomPropertySet);\n const declarations = this._parseDeclarations(this._parseRuleSetDeclaration.bind(this));\n if (propertySet.setDeclarations(declarations) && !declarations.isErroneous(true)) {\n propertySet.addChild(this._parsePrio());\n if (this.peek(TokenType.SemiColon)) {\n this.finish(propertySet);\n node.setPropertySet(propertySet);\n node.semicolonPosition = this.token.offset; // not part of the declaration, but useful information for code assist\n return this.finish(node);\n }\n }\n this.restoreAtMark(mark);\n }\n // try to parse as expression\n const expression = this._parseExpr();\n if (expression && !expression.isErroneous(true)) {\n this._parsePrio();\n if (this.peekOne(...(stopTokens || []), TokenType.SemiColon, TokenType.EOF)) {\n node.setValue(expression);\n if (this.peek(TokenType.SemiColon)) {\n node.semicolonPosition = this.token.offset; // not part of the declaration, but useful information for code assist\n }\n return this.finish(node);\n }\n }\n this.restoreAtMark(mark);\n node.addChild(this._parseCustomPropertyValue(stopTokens));\n node.addChild(this._parsePrio());\n if (isDefined(node.colonPosition) && this.token.offset === node.colonPosition + 1) {\n return this.finish(node, ParseError.PropertyValueExpected);\n }\n return this.finish(node);\n }\n /**\n * Parse custom property values.\n *\n * Based on https://www.w3.org/TR/css-variables/#syntax\n *\n * This code is somewhat unusual, as the allowed syntax is incredibly broad,\n * parsing almost any sequence of tokens, save for a small set of exceptions.\n * Unbalanced delimitors, invalid tokens, and declaration\n * terminators like semicolons and !important directives (when not inside\n * of delimitors).\n */\n _parseCustomPropertyValue(stopTokens = [TokenType.CurlyR]) {\n const node = this.create(nodes.Node);\n const isTopLevel = () => curlyDepth === 0 && parensDepth === 0 && bracketsDepth === 0;\n const onStopToken = () => stopTokens.indexOf(this.token.type) !== -1;\n let curlyDepth = 0;\n let parensDepth = 0;\n let bracketsDepth = 0;\n done: while (true) {\n switch (this.token.type) {\n case TokenType.SemiColon:\n // A semicolon only ends things if we're not inside a delimitor.\n if (isTopLevel()) {\n break done;\n }\n break;\n case TokenType.Exclamation:\n // An exclamation ends the value if we're not inside delims.\n if (isTopLevel()) {\n break done;\n }\n break;\n case TokenType.CurlyL:\n curlyDepth++;\n break;\n case TokenType.CurlyR:\n curlyDepth--;\n if (curlyDepth < 0) {\n // The property value has been terminated without a semicolon, and\n // this is the last declaration in the ruleset.\n if (onStopToken() && parensDepth === 0 && bracketsDepth === 0) {\n break done;\n }\n return this.finish(node, ParseError.LeftCurlyExpected);\n }\n break;\n case TokenType.ParenthesisL:\n parensDepth++;\n break;\n case TokenType.ParenthesisR:\n parensDepth--;\n if (parensDepth < 0) {\n if (onStopToken() && bracketsDepth === 0 && curlyDepth === 0) {\n break done;\n }\n return this.finish(node, ParseError.LeftParenthesisExpected);\n }\n break;\n case TokenType.BracketL:\n bracketsDepth++;\n break;\n case TokenType.BracketR:\n bracketsDepth--;\n if (bracketsDepth < 0) {\n return this.finish(node, ParseError.LeftSquareBracketExpected);\n }\n break;\n case TokenType.BadString: // fall through\n break done;\n case TokenType.EOF:\n // We shouldn't have reached the end of input, something is\n // unterminated.\n let error = ParseError.RightCurlyExpected;\n if (bracketsDepth > 0) {\n error = ParseError.RightSquareBracketExpected;\n }\n else if (parensDepth > 0) {\n error = ParseError.RightParenthesisExpected;\n }\n return this.finish(node, error);\n }\n this.consumeToken();\n }\n return this.finish(node);\n }\n _tryToParseDeclaration(stopTokens) {\n const mark = this.mark();\n if (this._parseProperty() && this.accept(TokenType.Colon)) {\n // looks like a declaration, go ahead\n this.restoreAtMark(mark);\n return this._parseDeclaration(stopTokens);\n }\n this.restoreAtMark(mark);\n return null;\n }\n _parseProperty() {\n const node = this.create(nodes.Property);\n const mark = this.mark();\n if (this.acceptDelim('*') || this.acceptDelim('_')) {\n // support for IE 5.x, 6 and 7 star hack: see http://en.wikipedia.org/wiki/CSS_filter#Star_hack\n if (this.hasWhitespace()) {\n this.restoreAtMark(mark);\n return null;\n }\n }\n if (node.setIdentifier(this._parsePropertyIdentifier())) {\n return this.finish(node);\n }\n return null;\n }\n _parsePropertyIdentifier() {\n return this._parseIdent();\n }\n _parseCharset() {\n if (!this.peek(TokenType.Charset)) {\n return null;\n }\n const node = this.create(nodes.Node);\n this.consumeToken(); // charset\n if (!this.accept(TokenType.String)) {\n return this.finish(node, ParseError.IdentifierExpected);\n }\n if (!this.accept(TokenType.SemiColon)) {\n return this.finish(node, ParseError.SemiColonExpected);\n }\n return this.finish(node);\n }\n _parseImport() {\n // @import [ <url> | <string> ]\n // [ layer | layer(<layer-name>) ]?\n // <import-condition> ;\n // <import-conditions> = [ supports( [ <supports-condition> | <declaration> ] ) ]?\n // <media-query-list>?\n if (!this.peekKeyword('@import')) {\n return null;\n }\n const node = this.create(nodes.Import);\n this.consumeToken(); // @import\n if (!node.addChild(this._parseURILiteral()) && !node.addChild(this._parseStringLiteral())) {\n return this.finish(node, ParseError.URIOrStringExpected);\n }\n if (this.acceptIdent('layer')) {\n if (this.accept(TokenType.ParenthesisL)) {\n if (!node.addChild(this._parseLayerName())) {\n return this.finish(node, ParseError.IdentifierExpected, [TokenType.SemiColon]);\n }\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected, [TokenType.ParenthesisR], []);\n }\n }\n }\n if (this.acceptIdent('supports')) {\n if (this.accept(TokenType.ParenthesisL)) {\n node.addChild(this._tryToParseDeclaration() || this._parseSupportsCondition());\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected, [TokenType.ParenthesisR], []);\n }\n }\n }\n if (!this.peek(TokenType.SemiColon) && !this.peek(TokenType.EOF)) {\n node.setMedialist(this._parseMediaQueryList());\n }\n return this.finish(node);\n }\n _parseNamespace() {\n // http://www.w3.org/TR/css3-namespace/\n // namespace : NAMESPACE_SYM S* [IDENT S*]? [STRING|URI] S* ';' S*\n if (!this.peekKeyword('@namespace')) {\n return null;\n }\n const node = this.create(nodes.Namespace);\n this.consumeToken(); // @namespace\n if (!node.addChild(this._parseURILiteral())) { // url literal also starts with ident\n node.addChild(this._parseIdent()); // optional prefix\n if (!node.addChild(this._parseURILiteral()) && !node.addChild(this._parseStringLiteral())) {\n return this.finish(node, ParseError.URIExpected, [TokenType.SemiColon]);\n }\n }\n if (!this.accept(TokenType.SemiColon)) {\n return this.finish(node, ParseError.SemiColonExpected);\n }\n return this.finish(node);\n }\n _parseFontFace() {\n if (!this.peekKeyword('@font-face')) {\n return null;\n }\n const node = this.create(nodes.FontFace);\n this.consumeToken(); // @font-face\n return this._parseBody(node, this._parseRuleSetDeclaration.bind(this));\n }\n _parseViewPort() {\n if (!this.peekKeyword('@-ms-viewport') &&\n !this.peekKeyword('@-o-viewport') &&\n !this.peekKeyword('@viewport')) {\n return null;\n }\n const node = this.create(nodes.ViewPort);\n this.consumeToken(); // @-ms-viewport\n return this._parseBody(node, this._parseRuleSetDeclaration.bind(this));\n }\n _parseKeyframe() {\n if (!this.peekRegExp(TokenType.AtKeyword, this.keyframeRegex)) {\n return null;\n }\n const node = this.create(nodes.Keyframe);\n const atNode = this.create(nodes.Node);\n this.consumeToken(); // atkeyword\n node.setKeyword(this.finish(atNode));\n if (atNode.matches('@-ms-keyframes')) { // -ms-keyframes never existed\n this.markError(atNode, ParseError.UnknownKeyword);\n }\n if (!node.setIdentifier(this._parseKeyframeIdent())) {\n return this.finish(node, ParseError.IdentifierExpected, [TokenType.CurlyR]);\n }\n return this._parseBody(node, this._parseKeyframeSelector.bind(this));\n }\n _parseKeyframeIdent() {\n return this._parseIdent([nodes.ReferenceType.Keyframe]);\n }\n _parseKeyframeSelector() {\n const node = this.create(nodes.KeyframeSelector);\n if (!node.addChild(this._parseIdent()) && !this.accept(TokenType.Percentage)) {\n return null;\n }\n while (this.accept(TokenType.Comma)) {\n if (!node.addChild(this._parseIdent()) && !this.accept(TokenType.Percentage)) {\n return this.finish(node, ParseError.PercentageExpected);\n }\n }\n return this._parseBody(node, this._parseRuleSetDeclaration.bind(this));\n }\n _tryParseKeyframeSelector() {\n const node = this.create(nodes.KeyframeSelector);\n const pos = this.mark();\n if (!node.addChild(this._parseIdent()) && !this.accept(TokenType.Percentage)) {\n return null;\n }\n while (this.accept(TokenType.Comma)) {\n if (!node.addChild(this._parseIdent()) && !this.accept(TokenType.Percentage)) {\n this.restoreAtMark(pos);\n return null;\n }\n }\n if (!this.peek(TokenType.CurlyL)) {\n this.restoreAtMark(pos);\n return null;\n }\n return this._parseBody(node, this._parseRuleSetDeclaration.bind(this));\n }\n _parsePropertyAtRule() {\n // @property <custom-property-name> {\n // \t<declaration-list>\n // }\n if (!this.peekKeyword('@property')) {\n return null;\n }\n const node = this.create(nodes.PropertyAtRule);\n this.consumeToken(); // @layer\n if (!this.peekRegExp(TokenType.Ident, /^--/) || !node.setName(this._parseIdent([nodes.ReferenceType.Property]))) {\n return this.finish(node, ParseError.IdentifierExpected);\n }\n return this._parseBody(node, this._parseDeclaration.bind(this));\n }\n _parseLayer() {\n // @layer layer-name {rules}\n // @layer layer-name;\n // @layer layer-name, layer-name, layer-name;\n // @layer {rules}\n if (!this.peekKeyword('@layer')) {\n return null;\n }\n const node = this.create(nodes.Layer);\n this.consumeToken(); // @layer\n const names = this._parseLayerNameList();\n if (names) {\n node.setNames(names);\n }\n if ((!names || names.getChildren().length === 1) && this.peek(TokenType.CurlyL)) {\n return this._parseBody(node, this._parseStylesheetStatement.bind(this));\n }\n if (!this.accept(TokenType.SemiColon)) {\n return this.finish(node, ParseError.SemiColonExpected);\n }\n return this.finish(node);\n }\n _parseLayerNameList() {\n const node = this.createNode(nodes.NodeType.LayerNameList);\n if (!node.addChild(this._parseLayerName())) {\n return null;\n }\n while (this.accept(TokenType.Comma)) {\n if (!node.addChild(this._parseLayerName())) {\n return this.finish(node, ParseError.IdentifierExpected);\n }\n }\n return this.finish(node);\n }\n _parseLayerName() {\n // <layer-name> = <ident> [ '.' <ident> ]*\n if (!this.peek(TokenType.Ident)) {\n return null;\n }\n const node = this.createNode(nodes.NodeType.LayerName);\n node.addChild(this._parseIdent());\n while (!this.hasWhitespace() && this.acceptDelim('.')) {\n if (this.hasWhitespace() || !node.addChild(this._parseIdent())) {\n return this.finish(node, ParseError.IdentifierExpected);\n }\n }\n return this.finish(node);\n }\n _parseSupports(isNested = false) {\n // SUPPORTS_SYM S* supports_condition '{' S* ruleset* '}' S*\n if (!this.peekKeyword('@supports')) {\n return null;\n }\n const node = this.create(nodes.Supports);\n this.consumeToken(); // @supports\n node.addChild(this._parseSupportsCondition());\n return this._parseBody(node, this._parseSupportsDeclaration.bind(this, isNested));\n }\n _parseSupportsDeclaration(isNested = false) {\n if (isNested) {\n // if nested, the body can contain rulesets, but also declarations\n return this._tryParseRuleset(true)\n || this._tryToParseDeclaration()\n || this._parseStylesheetStatement(true);\n }\n return this._parseStylesheetStatement(false);\n }\n _parseSupportsCondition() {\n // supports_condition : supports_negation | supports_conjunction | supports_disjunction | supports_condition_in_parens ;\n // supports_condition_in_parens: ( '(' S* supports_condition S* ')' ) | supports_declaration_condition | general_enclosed ;\n // supports_negation: NOT S+ supports_condition_in_parens ;\n // supports_conjunction: supports_condition_in_parens ( S+ AND S+ supports_condition_in_parens )+;\n // supports_disjunction: supports_condition_in_parens ( S+ OR S+ supports_condition_in_parens )+;\n // supports_declaration_condition: '(' S* declaration ')';\n // general_enclosed: ( FUNCTION | '(' ) ( any | unused )* ')' ;\n const node = this.create(nodes.SupportsCondition);\n if (this.acceptIdent('not')) {\n node.addChild(this._parseSupportsConditionInParens());\n }\n else {\n node.addChild(this._parseSupportsConditionInParens());\n if (this.peekRegExp(TokenType.Ident, /^(and|or)$/i)) {\n const text = this.token.text.toLowerCase();\n while (this.acceptIdent(text)) {\n node.addChild(this._parseSupportsConditionInParens());\n }\n }\n }\n return this.finish(node);\n }\n _parseSupportsConditionInParens() {\n const node = this.create(nodes.SupportsCondition);\n if (this.accept(TokenType.ParenthesisL)) {\n if (this.prevToken) {\n node.lParent = this.prevToken.offset;\n }\n if (!node.addChild(this._tryToParseDeclaration([TokenType.ParenthesisR]))) {\n if (!this._parseSupportsCondition()) {\n return this.finish(node, ParseError.ConditionExpected);\n }\n }\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected, [TokenType.ParenthesisR], []);\n }\n if (this.prevToken) {\n node.rParent = this.prevToken.offset;\n }\n return this.finish(node);\n }\n else if (this.peek(TokenType.Ident)) {\n const pos = this.mark();\n this.consumeToken();\n if (!this.hasWhitespace() && this.accept(TokenType.ParenthesisL)) {\n let openParentCount = 1;\n while (this.token.type !== TokenType.EOF && openParentCount !== 0) {\n if (this.token.type === TokenType.ParenthesisL) {\n openParentCount++;\n }\n else if (this.token.type === TokenType.ParenthesisR) {\n openParentCount--;\n }\n this.consumeToken();\n }\n return this.finish(node);\n }\n else {\n this.restoreAtMark(pos);\n }\n }\n return this.finish(node, ParseError.LeftParenthesisExpected, [], [TokenType.ParenthesisL]);\n }\n _parseMediaDeclaration(isNested = false) {\n if (isNested) {\n // if nested, the body can contain rulesets, but also declarations\n return this._tryParseRuleset(true)\n || this._tryToParseDeclaration()\n || this._parseStylesheetStatement(true);\n }\n return this._parseStylesheetStatement(false);\n }\n _parseMedia(isNested = false) {\n // MEDIA_SYM S* media_query_list '{' S* ruleset* '}' S*\n // media_query_list : S* [media_query [ ',' S* media_query ]* ]?\n if (!this.peekKeyword('@media')) {\n return null;\n }\n const node = this.create(nodes.Media);\n this.consumeToken(); // @media\n if (!node.addChild(this._parseMediaQueryList())) {\n return this.finish(node, ParseError.MediaQueryExpected);\n }\n return this._parseBody(node, this._parseMediaDeclaration.bind(this, isNested));\n }\n _parseMediaQueryList() {\n const node = this.create(nodes.Medialist);\n if (!node.addChild(this._parseMediaQuery())) {\n return this.finish(node, ParseError.MediaQueryExpected);\n }\n while (this.accept(TokenType.Comma)) {\n if (!node.addChild(this._parseMediaQuery())) {\n return this.finish(node, ParseError.MediaQueryExpected);\n }\n }\n return this.finish(node);\n }\n _parseMediaQuery() {\n // <media-query> = <media-condition> | [ not | only ]? <media-type> [ and <media-condition-without-or> ]?\n const node = this.create(nodes.MediaQuery);\n const pos = this.mark();\n this.acceptIdent('not');\n if (!this.peek(TokenType.ParenthesisL)) {\n if (this.acceptIdent('only')) {\n // optional\n }\n if (!node.addChild(this._parseIdent())) {\n return null;\n }\n if (this.acceptIdent('and')) {\n node.addChild(this._parseMediaCondition());\n }\n }\n else {\n this.restoreAtMark(pos); // 'not' is part of the MediaCondition\n node.addChild(this._parseMediaCondition());\n }\n return this.finish(node);\n }\n _parseRatio() {\n const pos = this.mark();\n const node = this.create(nodes.RatioValue);\n if (!this._parseNumeric()) {\n return null;\n }\n if (!this.acceptDelim('/')) {\n this.restoreAtMark(pos);\n return null;\n }\n if (!this._parseNumeric()) {\n return this.finish(node, ParseError.NumberExpected);\n }\n return this.finish(node);\n }\n _parseMediaCondition() {\n // <media-condition> = <media-not> | <media-and> | <media-or> | <media-in-parens>\n // <media-not> = not <media-in-parens>\n // <media-and> = <media-in-parens> [ and <media-in-parens> ]+\n // <media-or> = <media-in-parens> [ or <media-in-parens> ]+\n // <media-in-parens> = ( <media-condition> ) | <media-feature> | <general-enclosed>\n const node = this.create(nodes.MediaCondition);\n this.acceptIdent('not');\n let parseExpression = true;\n while (parseExpression) {\n if (!this.accept(TokenType.ParenthesisL)) {\n return this.finish(node, ParseError.LeftParenthesisExpected, [], [TokenType.CurlyL]);\n }\n if (this.peek(TokenType.ParenthesisL) || this.peekIdent('not')) {\n // <media-condition>\n node.addChild(this._parseMediaCondition());\n }\n else {\n node.addChild(this._parseMediaFeature());\n }\n // not yet implemented: general enclosed\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected, [], [TokenType.CurlyL]);\n }\n parseExpression = this.acceptIdent('and') || this.acceptIdent('or');\n }\n return this.finish(node);\n }\n _parseMediaFeature() {\n const resyncStopToken = [TokenType.ParenthesisR];\n const node = this.create(nodes.MediaFeature);\n // <media-feature> = ( [ <mf-plain> | <mf-boolean> | <mf-range> ] )\n // <mf-plain> = <mf-name> : <mf-value>\n // <mf-boolean> = <mf-name>\n // <mf-range> = <mf-name> [ '<' | '>' ]? '='? <mf-value> | <mf-value> [ '<' | '>' ]? '='? <mf-name> | <mf-value> '<' '='? <mf-name> '<' '='? <mf-value> | <mf-value> '>' '='? <mf-name> '>' '='? <mf-value>\n if (node.addChild(this._parseMediaFeatureName())) {\n if (this.accept(TokenType.Colon)) {\n if (!node.addChild(this._parseMediaFeatureValue())) {\n return this.finish(node, ParseError.TermExpected, [], resyncStopToken);\n }\n }\n else if (this._parseMediaFeatureRangeOperator()) {\n if (!node.addChild(this._parseMediaFeatureValue())) {\n return this.finish(node, ParseError.TermExpected, [], resyncStopToken);\n }\n if (this._parseMediaFeatureRangeOperator()) {\n if (!node.addChild(this._parseMediaFeatureValue())) {\n return this.finish(node, ParseError.TermExpected, [], resyncStopToken);\n }\n }\n }\n else {\n // <mf-boolean> = <mf-name>\n }\n }\n else if (node.addChild(this._parseMediaFeatureValue())) {\n if (!this._parseMediaFeatureRangeOperator()) {\n return this.finish(node, ParseError.OperatorExpected, [], resyncStopToken);\n }\n if (!node.addChild(this._parseMediaFeatureName())) {\n return this.finish(node, ParseError.IdentifierExpected, [], resyncStopToken);\n }\n if (this._parseMediaFeatureRangeOperator()) {\n if (!node.addChild(this._parseMediaFeatureValue())) {\n return this.finish(node, ParseError.TermExpected, [], resyncStopToken);\n }\n }\n }\n else {\n return this.finish(node, ParseError.IdentifierExpected, [], resyncStopToken);\n }\n return this.finish(node);\n }\n _parseMediaFeatureRangeOperator() {\n if (this.acceptDelim('<') || this.acceptDelim('>')) {\n if (!this.hasWhitespace()) {\n this.acceptDelim('=');\n }\n return true;\n }\n else if (this.acceptDelim('=')) {\n return true;\n }\n return false;\n }\n _parseMediaFeatureName() {\n return this._parseIdent();\n }\n _parseMediaFeatureValue() {\n return this._parseRatio() || this._parseTermExpression();\n }\n _parseMedium() {\n const node = this.create(nodes.Node);\n if (node.addChild(this._parseIdent())) {\n return this.finish(node);\n }\n else {\n return null;\n }\n }\n _parsePageDeclaration() {\n return this._parsePageMarginBox() || this._parseRuleSetDeclaration();\n }\n _parsePage() {\n // http://www.w3.org/TR/css3-page/\n // page_rule : PAGE_SYM S* page_selector_list '{' S* page_body '}' S*\n // page_body : /* Can be empty */ declaration? [ ';' S* page_body ]? | page_margin_box page_body\n if (!this.peekKeyword('@page')) {\n return null;\n }\n const node = this.create(nodes.Page);\n this.consumeToken();\n if (node.addChild(this._parsePageSelector())) {\n while (this.accept(TokenType.Comma)) {\n if (!node.addChild(this._parsePageSelector())) {\n return this.finish(node, ParseError.IdentifierExpected);\n }\n }\n }\n return this._parseBody(node, this._parsePageDeclaration.bind(this));\n }\n _parsePageMarginBox() {\n // page_margin_box : margin_sym S* '{' S* declaration? [ ';' S* declaration? ]* '}' S*\n if (!this.peek(TokenType.AtKeyword)) {\n return null;\n }\n const node = this.create(nodes.PageBoxMarginBox);\n if (!this.acceptOneKeyword(languageFacts.pageBoxDirectives)) {\n this.markError(node, ParseError.UnknownAtRule, [], [TokenType.CurlyL]);\n }\n return this._parseBody(node, this._parseRuleSetDeclaration.bind(this));\n }\n _parsePageSelector() {\n // page_selector : pseudo_page+ | IDENT pseudo_page*\n // pseudo_page : ':' [ \"left\" | \"right\" | \"first\" | \"blank\" ];\n if (!this.peek(TokenType.Ident) && !this.peek(TokenType.Colon)) {\n return null;\n }\n const node = this.create(nodes.Node);\n node.addChild(this._parseIdent()); // optional ident\n if (this.accept(TokenType.Colon)) {\n if (!node.addChild(this._parseIdent())) { // optional ident\n return this.finish(node, ParseError.IdentifierExpected);\n }\n }\n return this.finish(node);\n }\n _parseDocument() {\n // -moz-document is experimental but has been pushed to css4\n if (!this.peekKeyword('@-moz-document')) {\n return null;\n }\n const node = this.create(nodes.Document);\n this.consumeToken(); // @-moz-document\n this.resync([], [TokenType.CurlyL]); // ignore all the rules\n return this._parseBody(node, this._parseStylesheetStatement.bind(this));\n }\n // https://www.w3.org/TR/css-syntax-3/#consume-an-at-rule\n _parseUnknownAtRule() {\n if (!this.peek(TokenType.AtKeyword)) {\n return null;\n }\n const node = this.create(nodes.UnknownAtRule);\n node.addChild(this._parseUnknownAtRuleName());\n const isTopLevel = () => curlyDepth === 0 && parensDepth === 0 && bracketsDepth === 0;\n let curlyLCount = 0;\n let curlyDepth = 0;\n let parensDepth = 0;\n let bracketsDepth = 0;\n done: while (true) {\n switch (this.token.type) {\n case TokenType.SemiColon:\n if (isTopLevel()) {\n break done;\n }\n break;\n case TokenType.EOF:\n if (curlyDepth > 0) {\n return this.finish(node, ParseError.RightCurlyExpected);\n }\n else if (bracketsDepth > 0) {\n return this.finish(node, ParseError.RightSquareBracketExpected);\n }\n else if (parensDepth > 0) {\n return this.finish(node, ParseError.RightParenthesisExpected);\n }\n else {\n return this.finish(node);\n }\n case TokenType.CurlyL:\n curlyLCount++;\n curlyDepth++;\n break;\n case TokenType.CurlyR:\n curlyDepth--;\n // End of at-rule, consume CurlyR and return node\n if (curlyLCount > 0 && curlyDepth === 0) {\n this.consumeToken();\n if (bracketsDepth > 0) {\n return this.finish(node, ParseError.RightSquareBracketExpected);\n }\n else if (parensDepth > 0) {\n return this.finish(node, ParseError.RightParenthesisExpected);\n }\n break done;\n }\n if (curlyDepth < 0) {\n // The property value has been terminated without a semicolon, and\n // this is the last declaration in the ruleset.\n if (parensDepth === 0 && bracketsDepth === 0) {\n break done;\n }\n return this.finish(node, ParseError.LeftCurlyExpected);\n }\n break;\n case TokenType.ParenthesisL:\n parensDepth++;\n break;\n case TokenType.ParenthesisR:\n parensDepth--;\n if (parensDepth < 0) {\n return this.finish(node, ParseError.LeftParenthesisExpected);\n }\n break;\n case TokenType.BracketL:\n bracketsDepth++;\n break;\n case TokenType.BracketR:\n bracketsDepth--;\n if (bracketsDepth < 0) {\n return this.finish(node, ParseError.LeftSquareBracketExpected);\n }\n break;\n }\n this.consumeToken();\n }\n return node;\n }\n _parseUnknownAtRuleName() {\n const node = this.create(nodes.Node);\n if (this.accept(TokenType.AtKeyword)) {\n return this.finish(node);\n }\n return node;\n }\n _parseOperator() {\n // these are operators for binary expressions\n if (this.peekDelim('/') ||\n this.peekDelim('*') ||\n this.peekDelim('+') ||\n this.peekDelim('-') ||\n this.peek(TokenType.Dashmatch) ||\n this.peek(TokenType.Includes) ||\n this.peek(TokenType.SubstringOperator) ||\n this.peek(TokenType.PrefixOperator) ||\n this.peek(TokenType.SuffixOperator) ||\n this.peekDelim('=')) { // doesn't stick to the standard here\n const node = this.createNode(nodes.NodeType.Operator);\n this.consumeToken();\n return this.finish(node);\n }\n else {\n return null;\n }\n }\n _parseUnaryOperator() {\n if (!this.peekDelim('+') && !this.peekDelim('-')) {\n return null;\n }\n const node = this.create(nodes.Node);\n this.consumeToken();\n return this.finish(node);\n }\n _parseCombinator() {\n if (this.peekDelim('>')) {\n const node = this.create(nodes.Node);\n this.consumeToken();\n const mark = this.mark();\n if (!this.hasWhitespace() && this.acceptDelim('>')) {\n if (!this.hasWhitespace() && this.acceptDelim('>')) {\n node.type = nodes.NodeType.SelectorCombinatorShadowPiercingDescendant;\n return this.finish(node);\n }\n this.restoreAtMark(mark);\n }\n node.type = nodes.NodeType.SelectorCombinatorParent;\n return this.finish(node);\n }\n else if (this.peekDelim('+')) {\n const node = this.create(nodes.Node);\n this.consumeToken();\n node.type = nodes.NodeType.SelectorCombinatorSibling;\n return this.finish(node);\n }\n else if (this.peekDelim('~')) {\n const node = this.create(nodes.Node);\n this.consumeToken();\n node.type = nodes.NodeType.SelectorCombinatorAllSiblings;\n return this.finish(node);\n }\n else if (this.peekDelim('/')) {\n const node = this.create(nodes.Node);\n this.consumeToken();\n const mark = this.mark();\n if (!this.hasWhitespace() && this.acceptIdent('deep') && !this.hasWhitespace() && this.acceptDelim('/')) {\n node.type = nodes.NodeType.SelectorCombinatorShadowPiercingDescendant;\n return this.finish(node);\n }\n this.restoreAtMark(mark);\n }\n return null;\n }\n _parseSimpleSelector() {\n // simple_selector\n // : element_name [ HASH | class | attrib | pseudo ]* | [ HASH | class | attrib | pseudo ]+ ;\n const node = this.create(nodes.SimpleSelector);\n let c = 0;\n if (node.addChild(this._parseElementName())) {\n c++;\n }\n while ((c === 0 || !this.hasWhitespace()) && node.addChild(this._parseSimpleSelectorBody())) {\n c++;\n }\n return c > 0 ? this.finish(node) : null;\n }\n _parseSimpleSelectorBody() {\n return this._parsePseudo() || this._parseHash() || this._parseClass() || this._parseAttrib();\n }\n _parseSelectorIdent() {\n return this._parseIdent();\n }\n _parseHash() {\n if (!this.peek(TokenType.Hash) && !this.peekDelim('#')) {\n return null;\n }\n const node = this.createNode(nodes.NodeType.IdentifierSelector);\n if (this.acceptDelim('#')) {\n if (this.hasWhitespace() || !node.addChild(this._parseSelectorIdent())) {\n return this.finish(node, ParseError.IdentifierExpected);\n }\n }\n else {\n this.consumeToken(); // TokenType.Hash\n }\n return this.finish(node);\n }\n _parseClass() {\n // class: '.' IDENT ;\n if (!this.peekDelim('.')) {\n return null;\n }\n const node = this.createNode(nodes.NodeType.ClassSelector);\n this.consumeToken(); // '.'\n if (this.hasWhitespace() || !node.addChild(this._parseSelectorIdent())) {\n return this.finish(node, ParseError.IdentifierExpected);\n }\n return this.finish(node);\n }\n _parseElementName() {\n // element_name: (ns? '|')? IDENT | '*';\n const pos = this.mark();\n const node = this.createNode(nodes.NodeType.ElementNameSelector);\n node.addChild(this._parseNamespacePrefix());\n if (!node.addChild(this._parseSelectorIdent()) && !this.acceptDelim('*')) {\n this.restoreAtMark(pos);\n return null;\n }\n return this.finish(node);\n }\n _parseNamespacePrefix() {\n const pos = this.mark();\n const node = this.createNode(nodes.NodeType.NamespacePrefix);\n if (!node.addChild(this._parseIdent()) && !this.acceptDelim('*')) {\n // ns is optional\n }\n if (!this.acceptDelim('|')) {\n this.restoreAtMark(pos);\n return null;\n }\n return this.finish(node);\n }\n _parseAttrib() {\n // attrib : '[' S* IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S* [ IDENT | STRING ] S* ]? ']'\n if (!this.peek(TokenType.BracketL)) {\n return null;\n }\n const node = this.create(nodes.AttributeSelector);\n this.consumeToken(); // BracketL\n // Optional attrib namespace\n node.setNamespacePrefix(this._parseNamespacePrefix());\n if (!node.setIdentifier(this._parseIdent())) {\n return this.finish(node, ParseError.IdentifierExpected);\n }\n if (node.setOperator(this._parseOperator())) {\n node.setValue(this._parseBinaryExpr());\n this.acceptIdent('i'); // case insensitive matching\n this.acceptIdent('s'); // case sensitive matching\n }\n if (!this.accept(TokenType.BracketR)) {\n return this.finish(node, ParseError.RightSquareBracketExpected);\n }\n return this.finish(node);\n }\n _parsePseudo() {\n // pseudo: ':' [ IDENT | FUNCTION S* [IDENT S*]? ')' ]\n const node = this._tryParsePseudoIdentifier();\n if (node) {\n if (!this.hasWhitespace() && this.accept(TokenType.ParenthesisL)) {\n const tryAsSelector = () => {\n const selectors = this.create(nodes.Node);\n if (!selectors.addChild(this._parseSelector(true))) {\n return null;\n }\n while (this.accept(TokenType.Comma) && selectors.addChild(this._parseSelector(true))) {\n // loop\n }\n if (this.peek(TokenType.ParenthesisR)) {\n return this.finish(selectors);\n }\n return null;\n };\n node.addChild(this.try(tryAsSelector) || this._parseBinaryExpr());\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected);\n }\n }\n return this.finish(node);\n }\n return null;\n }\n _tryParsePseudoIdentifier() {\n if (!this.peek(TokenType.Colon)) {\n return null;\n }\n const pos = this.mark();\n const node = this.createNode(nodes.NodeType.PseudoSelector);\n this.consumeToken(); // Colon\n if (this.hasWhitespace()) {\n this.restoreAtMark(pos);\n return null;\n }\n // optional, support ::\n this.accept(TokenType.Colon);\n if (this.hasWhitespace() || !node.addChild(this._parseIdent())) {\n return this.finish(node, ParseError.IdentifierExpected);\n }\n return this.finish(node);\n }\n _tryParsePrio() {\n const mark = this.mark();\n const prio = this._parsePrio();\n if (prio) {\n return prio;\n }\n this.restoreAtMark(mark);\n return null;\n }\n _parsePrio() {\n if (!this.peek(TokenType.Exclamation)) {\n return null;\n }\n const node = this.createNode(nodes.NodeType.Prio);\n if (this.accept(TokenType.Exclamation) && this.acceptIdent('important')) {\n return this.finish(node);\n }\n return null;\n }\n _parseExpr(stopOnComma = false) {\n const node = this.create(nodes.Expression);\n if (!node.addChild(this._parseBinaryExpr())) {\n return null;\n }\n while (true) {\n if (this.peek(TokenType.Comma)) { // optional\n if (stopOnComma) {\n return this.finish(node);\n }\n this.consumeToken();\n }\n if (!node.addChild(this._parseBinaryExpr())) {\n break;\n }\n }\n return this.finish(node);\n }\n _parseUnicodeRange() {\n if (!this.peekIdent('u')) {\n return null;\n }\n const node = this.create(nodes.UnicodeRange);\n if (!this.acceptUnicodeRange()) {\n return null;\n }\n return this.finish(node);\n }\n _parseNamedLine() {\n // https://www.w3.org/TR/css-grid-1/#named-lines\n if (!this.peek(TokenType.BracketL)) {\n return null;\n }\n const node = this.createNode(nodes.NodeType.GridLine);\n this.consumeToken();\n while (node.addChild(this._parseIdent())) {\n // repeat\n }\n if (!this.accept(TokenType.BracketR)) {\n return this.finish(node, ParseError.RightSquareBracketExpected);\n }\n return this.finish(node);\n }\n _parseBinaryExpr(preparsedLeft, preparsedOper) {\n let node = this.create(nodes.BinaryExpression);\n if (!node.setLeft((preparsedLeft || this._parseTerm()))) {\n return null;\n }\n if (!node.setOperator(preparsedOper || this._parseOperator())) {\n return this.finish(node);\n }\n if (!node.setRight(this._parseTerm())) {\n return this.finish(node, ParseError.TermExpected);\n }\n // things needed for multiple binary expressions\n node = this.finish(node);\n const operator = this._parseOperator();\n if (operator) {\n node = this._parseBinaryExpr(node, operator);\n }\n return this.finish(node);\n }\n _parseTerm() {\n let node = this.create(nodes.Term);\n node.setOperator(this._parseUnaryOperator()); // optional\n if (node.setExpression(this._parseTermExpression())) {\n return this.finish(node);\n }\n return null;\n }\n _parseTermExpression() {\n return this._parseURILiteral() || // url before function\n this._parseUnicodeRange() ||\n this._parseFunction() || // function before ident\n this._parseIdent() ||\n this._parseStringLiteral() ||\n this._parseNumeric() ||\n this._parseHexColor() ||\n this._parseOperation() ||\n this._parseNamedLine();\n }\n _parseOperation() {\n if (!this.peek(TokenType.ParenthesisL)) {\n return null;\n }\n const node = this.create(nodes.Node);\n this.consumeToken(); // ParenthesisL\n node.addChild(this._parseExpr());\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected);\n }\n return this.finish(node);\n }\n _parseNumeric() {\n if (this.peek(TokenType.Num) ||\n this.peek(TokenType.Percentage) ||\n this.peek(TokenType.Resolution) ||\n this.peek(TokenType.Length) ||\n this.peek(TokenType.EMS) ||\n this.peek(TokenType.EXS) ||\n this.peek(TokenType.Angle) ||\n this.peek(TokenType.Time) ||\n this.peek(TokenType.Dimension) ||\n this.peek(TokenType.Freq)) {\n const node = this.create(nodes.NumericValue);\n this.consumeToken();\n return this.finish(node);\n }\n return null;\n }\n _parseStringLiteral() {\n if (!this.peek(TokenType.String) && !this.peek(TokenType.BadString)) {\n return null;\n }\n const node = this.createNode(nodes.NodeType.StringLiteral);\n this.consumeToken();\n return this.finish(node);\n }\n _parseURILiteral() {\n if (!this.peekRegExp(TokenType.Ident, /^url(-prefix)?$/i)) {\n return null;\n }\n const pos = this.mark();\n const node = this.createNode(nodes.NodeType.URILiteral);\n this.accept(TokenType.Ident);\n if (this.hasWhitespace() || !this.peek(TokenType.ParenthesisL)) {\n this.restoreAtMark(pos);\n return null;\n }\n this.scanner.inURL = true;\n this.consumeToken(); // consume ()\n node.addChild(this._parseURLArgument()); // argument is optional\n this.scanner.inURL = false;\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected);\n }\n return this.finish(node);\n }\n _parseURLArgument() {\n const node = this.create(nodes.Node);\n if (!this.accept(TokenType.String) && !this.accept(TokenType.BadString) && !this.acceptUnquotedString()) {\n return null;\n }\n return this.finish(node);\n }\n _parseIdent(referenceTypes) {\n if (!this.peek(TokenType.Ident)) {\n return null;\n }\n const node = this.create(nodes.Identifier);\n if (referenceTypes) {\n node.referenceTypes = referenceTypes;\n }\n node.isCustomProperty = this.peekRegExp(TokenType.Ident, /^--/);\n this.consumeToken();\n return this.finish(node);\n }\n _parseFunction() {\n const pos = this.mark();\n const node = this.create(nodes.Function);\n if (!node.setIdentifier(this._parseFunctionIdentifier())) {\n return null;\n }\n if (this.hasWhitespace() || !this.accept(TokenType.ParenthesisL)) {\n this.restoreAtMark(pos);\n return null;\n }\n if (node.getArguments().addChild(this._parseFunctionArgument())) {\n while (this.accept(TokenType.Comma)) {\n if (this.peek(TokenType.ParenthesisR)) {\n break;\n }\n if (!node.getArguments().addChild(this._parseFunctionArgument())) {\n this.markError(node, ParseError.ExpressionExpected);\n }\n }\n }\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected);\n }\n return this.finish(node);\n }\n _parseFunctionIdentifier() {\n if (!this.peek(TokenType.Ident)) {\n return null;\n }\n const node = this.create(nodes.Identifier);\n node.referenceTypes = [nodes.ReferenceType.Function];\n if (this.acceptIdent('progid')) {\n // support for IE7 specific filters: 'progid:DXImageTransform.Microsoft.MotionBlur(strength=13, direction=310)'\n if (this.accept(TokenType.Colon)) {\n while (this.accept(TokenType.Ident) && this.acceptDelim('.')) {\n // loop\n }\n }\n return this.finish(node);\n }\n this.consumeToken();\n return this.finish(node);\n }\n _parseFunctionArgument() {\n const node = this.create(nodes.FunctionArgument);\n if (node.setValue(this._parseExpr(true))) {\n return this.finish(node);\n }\n return null;\n }\n _parseHexColor() {\n if (this.peekRegExp(TokenType.Hash, /^#([A-Fa-f0-9]{3}|[A-Fa-f0-9]{4}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/g)) {\n const node = this.create(nodes.HexColorValue);\n this.consumeToken();\n return this.finish(node);\n }\n else {\n return null;\n }\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\n/**\n * Takes a sorted array and a function p. The array is sorted in such a way that all elements where p(x) is false\n * are located before all elements where p(x) is true.\n * @returns the least x for which p(x) is true or array.length if no element fullfills the given function.\n */\nexport function findFirst(array, p) {\n let low = 0, high = array.length;\n if (high === 0) {\n return 0; // no children\n }\n while (low < high) {\n let mid = Math.floor((low + high) / 2);\n if (p(array[mid])) {\n high = mid;\n }\n else {\n low = mid + 1;\n }\n }\n return low;\n}\nexport function includes(array, item) {\n return array.indexOf(item) !== -1;\n}\nexport function union(...arrays) {\n const result = [];\n for (const array of arrays) {\n for (const item of array) {\n if (!includes(result, item)) {\n result.push(item);\n }\n }\n }\n return result;\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport * as nodes from './cssNodes';\nimport { findFirst } from '../utils/arrays';\nexport class Scope {\n constructor(offset, length) {\n this.offset = offset;\n this.length = length;\n this.symbols = [];\n this.parent = null;\n this.children = [];\n }\n addChild(scope) {\n this.children.push(scope);\n scope.setParent(this);\n }\n setParent(scope) {\n this.parent = scope;\n }\n findScope(offset, length = 0) {\n if (this.offset <= offset && this.offset + this.length > offset + length || this.offset === offset && this.length === length) {\n return this.findInScope(offset, length);\n }\n return null;\n }\n findInScope(offset, length = 0) {\n // find the first scope child that has an offset larger than offset + length\n const end = offset + length;\n const idx = findFirst(this.children, s => s.offset > end);\n if (idx === 0) {\n // all scopes have offsets larger than our end\n return this;\n }\n const res = this.children[idx - 1];\n if (res.offset <= offset && res.offset + res.length >= offset + length) {\n return res.findInScope(offset, length);\n }\n return this;\n }\n addSymbol(symbol) {\n this.symbols.push(symbol);\n }\n getSymbol(name, type) {\n for (let index = 0; index < this.symbols.length; index++) {\n const symbol = this.symbols[index];\n if (symbol.name === name && symbol.type === type) {\n return symbol;\n }\n }\n return null;\n }\n getSymbols() {\n return this.symbols;\n }\n}\nexport class GlobalScope extends Scope {\n constructor() {\n super(0, Number.MAX_VALUE);\n }\n}\nexport class Symbol {\n constructor(name, value, node, type) {\n this.name = name;\n this.value = value;\n this.node = node;\n this.type = type;\n }\n}\nexport class ScopeBuilder {\n constructor(scope) {\n this.scope = scope;\n }\n addSymbol(node, name, value, type) {\n if (node.offset !== -1) {\n const current = this.scope.findScope(node.offset, node.length);\n if (current) {\n current.addSymbol(new Symbol(name, value, node, type));\n }\n }\n }\n addScope(node) {\n if (node.offset !== -1) {\n const current = this.scope.findScope(node.offset, node.length);\n if (current && (current.offset !== node.offset || current.length !== node.length)) { // scope already known?\n const newScope = new Scope(node.offset, node.length);\n current.addChild(newScope);\n return newScope;\n }\n return current;\n }\n return null;\n }\n addSymbolToChildScope(scopeNode, node, name, value, type) {\n if (scopeNode && scopeNode.offset !== -1) {\n const current = this.addScope(scopeNode); // create the scope or gets the existing one\n if (current) {\n current.addSymbol(new Symbol(name, value, node, type));\n }\n }\n }\n visitNode(node) {\n switch (node.type) {\n case nodes.NodeType.Keyframe:\n this.addSymbol(node, node.getName(), void 0, nodes.ReferenceType.Keyframe);\n return true;\n case nodes.NodeType.CustomPropertyDeclaration:\n return this.visitCustomPropertyDeclarationNode(node);\n case nodes.NodeType.VariableDeclaration:\n return this.visitVariableDeclarationNode(node);\n case nodes.NodeType.Ruleset:\n return this.visitRuleSet(node);\n case nodes.NodeType.MixinDeclaration:\n this.addSymbol(node, node.getName(), void 0, nodes.ReferenceType.Mixin);\n return true;\n case nodes.NodeType.FunctionDeclaration:\n this.addSymbol(node, node.getName(), void 0, nodes.ReferenceType.Function);\n return true;\n case nodes.NodeType.FunctionParameter: {\n return this.visitFunctionParameterNode(node);\n }\n case nodes.NodeType.Declarations:\n this.addScope(node);\n return true;\n case nodes.NodeType.For:\n const forNode = node;\n const scopeNode = forNode.getDeclarations();\n if (scopeNode && forNode.variable) {\n this.addSymbolToChildScope(scopeNode, forNode.variable, forNode.variable.getName(), void 0, nodes.ReferenceType.Variable);\n }\n return true;\n case nodes.NodeType.Each: {\n const eachNode = node;\n const scopeNode = eachNode.getDeclarations();\n if (scopeNode) {\n const variables = eachNode.getVariables().getChildren();\n for (const variable of variables) {\n this.addSymbolToChildScope(scopeNode, variable, variable.getName(), void 0, nodes.ReferenceType.Variable);\n }\n }\n return true;\n }\n }\n return true;\n }\n visitRuleSet(node) {\n const current = this.scope.findScope(node.offset, node.length);\n if (current) {\n for (const child of node.getSelectors().getChildren()) {\n if (child instanceof nodes.Selector) {\n if (child.getChildren().length === 1) { // only selectors with a single element can be extended\n current.addSymbol(new Symbol(child.getChild(0).getText(), void 0, child, nodes.ReferenceType.Rule));\n }\n }\n }\n }\n return true;\n }\n visitVariableDeclarationNode(node) {\n const value = node.getValue() ? node.getValue().getText() : void 0;\n this.addSymbol(node, node.getName(), value, nodes.ReferenceType.Variable);\n return true;\n }\n visitFunctionParameterNode(node) {\n // parameters are part of the body scope\n const scopeNode = node.getParent().getDeclarations();\n if (scopeNode) {\n const valueNode = node.getDefaultValue();\n const value = valueNode ? valueNode.getText() : void 0;\n this.addSymbolToChildScope(scopeNode, node, node.getName(), value, nodes.ReferenceType.Variable);\n }\n return true;\n }\n visitCustomPropertyDeclarationNode(node) {\n const value = node.getValue() ? node.getValue().getText() : '';\n this.addCSSVariable(node.getProperty(), node.getProperty().getName(), value, nodes.ReferenceType.Variable);\n return true;\n }\n addCSSVariable(node, name, value, type) {\n if (node.offset !== -1) {\n this.scope.addSymbol(new Symbol(name, value, node, type));\n }\n }\n}\nexport class Symbols {\n constructor(node) {\n this.global = new GlobalScope();\n node.acceptVisitor(new ScopeBuilder(this.global));\n }\n findSymbolsAtOffset(offset, referenceType) {\n let scope = this.global.findScope(offset, 0);\n const result = [];\n const names = {};\n while (scope) {\n const symbols = scope.getSymbols();\n for (let i = 0; i < symbols.length; i++) {\n const symbol = symbols[i];\n if (symbol.type === referenceType && !names[symbol.name]) {\n result.push(symbol);\n names[symbol.name] = true;\n }\n }\n scope = scope.parent;\n }\n return result;\n }\n internalFindSymbol(node, referenceTypes) {\n let scopeNode = node;\n if (node.parent instanceof nodes.FunctionParameter && node.parent.getParent() instanceof nodes.BodyDeclaration) {\n scopeNode = node.parent.getParent().getDeclarations();\n }\n if (node.parent instanceof nodes.FunctionArgument && node.parent.getParent() instanceof nodes.Function) {\n const funcId = node.parent.getParent().getIdentifier();\n if (funcId) {\n const functionSymbol = this.internalFindSymbol(funcId, [nodes.ReferenceType.Function]);\n if (functionSymbol) {\n scopeNode = functionSymbol.node.getDeclarations();\n }\n }\n }\n if (!scopeNode) {\n return null;\n }\n const name = node.getText();\n let scope = this.global.findScope(scopeNode.offset, scopeNode.length);\n while (scope) {\n for (let index = 0; index < referenceTypes.length; index++) {\n const type = referenceTypes[index];\n const symbol = scope.getSymbol(name, type);\n if (symbol) {\n return symbol;\n }\n }\n scope = scope.parent;\n }\n return null;\n }\n evaluateReferenceTypes(node) {\n if (node instanceof nodes.Identifier) {\n const referenceTypes = node.referenceTypes;\n if (referenceTypes) {\n return referenceTypes;\n }\n else {\n if (node.isCustomProperty) {\n return [nodes.ReferenceType.Variable];\n }\n // are a reference to a keyframe?\n const decl = nodes.getParentDeclaration(node);\n if (decl) {\n const propertyName = decl.getNonPrefixedPropertyName();\n if ((propertyName === 'animation' || propertyName === 'animation-name')\n && decl.getValue() && decl.getValue().offset === node.offset) {\n return [nodes.ReferenceType.Keyframe];\n }\n }\n }\n }\n else if (node instanceof nodes.Variable) {\n return [nodes.ReferenceType.Variable];\n }\n const selector = node.findAParent(nodes.NodeType.Selector, nodes.NodeType.ExtendsReference);\n if (selector) {\n return [nodes.ReferenceType.Rule];\n }\n return null;\n }\n findSymbolFromNode(node) {\n if (!node) {\n return null;\n }\n while (node.type === nodes.NodeType.Interpolation) {\n node = node.getParent();\n }\n const referenceTypes = this.evaluateReferenceTypes(node);\n if (referenceTypes) {\n return this.internalFindSymbol(node, referenceTypes);\n }\n return null;\n }\n matchesSymbol(node, symbol) {\n if (!node) {\n return false;\n }\n while (node.type === nodes.NodeType.Interpolation) {\n node = node.getParent();\n }\n if (!node.matches(symbol.name)) {\n return false;\n }\n const referenceTypes = this.evaluateReferenceTypes(node);\n if (!referenceTypes || referenceTypes.indexOf(symbol.type) === -1) {\n return false;\n }\n const nodeSymbol = this.internalFindSymbol(node, referenceTypes);\n return nodeSymbol === symbol;\n }\n findSymbol(name, type, offset) {\n let scope = this.global.findScope(offset);\n while (scope) {\n const symbol = scope.getSymbol(name, type);\n if (symbol) {\n return symbol;\n }\n scope = scope.parent;\n }\n return null;\n }\n}\n", "// 'path' module extracted from Node.js v8.11.1 (only the posix part)\n// transplited with Babel\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nfunction assertPath(path) {\n if (typeof path !== 'string') {\n throw new TypeError('Path must be a string. Received ' + JSON.stringify(path));\n }\n}\n\n// Resolves . and .. elements in a path with directory names\nfunction normalizeStringPosix(path, allowAboveRoot) {\n var res = '';\n var lastSegmentLength = 0;\n var lastSlash = -1;\n var dots = 0;\n var code;\n for (var i = 0; i <= path.length; ++i) {\n if (i < path.length)\n code = path.charCodeAt(i);\n else if (code === 47 /*/*/)\n break;\n else\n code = 47 /*/*/;\n if (code === 47 /*/*/) {\n if (lastSlash === i - 1 || dots === 1) {\n // NOOP\n } else if (lastSlash !== i - 1 && dots === 2) {\n if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 /*.*/ || res.charCodeAt(res.length - 2) !== 46 /*.*/) {\n if (res.length > 2) {\n var lastSlashIndex = res.lastIndexOf('/');\n if (lastSlashIndex !== res.length - 1) {\n if (lastSlashIndex === -1) {\n res = '';\n lastSegmentLength = 0;\n } else {\n res = res.slice(0, lastSlashIndex);\n lastSegmentLength = res.length - 1 - res.lastIndexOf('/');\n }\n lastSlash = i;\n dots = 0;\n continue;\n }\n } else if (res.length === 2 || res.length === 1) {\n res = '';\n lastSegmentLength = 0;\n lastSlash = i;\n dots = 0;\n continue;\n }\n }\n if (allowAboveRoot) {\n if (res.length > 0)\n res += '/..';\n else\n res = '..';\n lastSegmentLength = 2;\n }\n } else {\n if (res.length > 0)\n res += '/' + path.slice(lastSlash + 1, i);\n else\n res = path.slice(lastSlash + 1, i);\n lastSegmentLength = i - lastSlash - 1;\n }\n lastSlash = i;\n dots = 0;\n } else if (code === 46 /*.*/ && dots !== -1) {\n ++dots;\n } else {\n dots = -1;\n }\n }\n return res;\n}\n\nfunction _format(sep, pathObject) {\n var dir = pathObject.dir || pathObject.root;\n var base = pathObject.base || (pathObject.name || '') + (pathObject.ext || '');\n if (!dir) {\n return base;\n }\n if (dir === pathObject.root) {\n return dir + base;\n }\n return dir + sep + base;\n}\n\nvar posix = {\n // path.resolve([from ...], to)\n resolve: function resolve() {\n var resolvedPath = '';\n var resolvedAbsolute = false;\n var cwd;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path;\n if (i >= 0)\n path = arguments[i];\n else {\n if (cwd === undefined)\n cwd = process.cwd();\n path = cwd;\n }\n\n assertPath(path);\n\n // Skip empty entries\n if (path.length === 0) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charCodeAt(0) === 47 /*/*/;\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute);\n\n if (resolvedAbsolute) {\n if (resolvedPath.length > 0)\n return '/' + resolvedPath;\n else\n return '/';\n } else if (resolvedPath.length > 0) {\n return resolvedPath;\n } else {\n return '.';\n }\n },\n\n normalize: function normalize(path) {\n assertPath(path);\n\n if (path.length === 0) return '.';\n\n var isAbsolute = path.charCodeAt(0) === 47 /*/*/;\n var trailingSeparator = path.charCodeAt(path.length - 1) === 47 /*/*/;\n\n // Normalize the path\n path = normalizeStringPosix(path, !isAbsolute);\n\n if (path.length === 0 && !isAbsolute) path = '.';\n if (path.length > 0 && trailingSeparator) path += '/';\n\n if (isAbsolute) return '/' + path;\n return path;\n },\n\n isAbsolute: function isAbsolute(path) {\n assertPath(path);\n return path.length > 0 && path.charCodeAt(0) === 47 /*/*/;\n },\n\n join: function join() {\n if (arguments.length === 0)\n return '.';\n var joined;\n for (var i = 0; i < arguments.length; ++i) {\n var arg = arguments[i];\n assertPath(arg);\n if (arg.length > 0) {\n if (joined === undefined)\n joined = arg;\n else\n joined += '/' + arg;\n }\n }\n if (joined === undefined)\n return '.';\n return posix.normalize(joined);\n },\n\n relative: function relative(from, to) {\n assertPath(from);\n assertPath(to);\n\n if (from === to) return '';\n\n from = posix.resolve(from);\n to = posix.resolve(to);\n\n if (from === to) return '';\n\n // Trim any leading backslashes\n var fromStart = 1;\n for (; fromStart < from.length; ++fromStart) {\n if (from.charCodeAt(fromStart) !== 47 /*/*/)\n break;\n }\n var fromEnd = from.length;\n var fromLen = fromEnd - fromStart;\n\n // Trim any leading backslashes\n var toStart = 1;\n for (; toStart < to.length; ++toStart) {\n if (to.charCodeAt(toStart) !== 47 /*/*/)\n break;\n }\n var toEnd = to.length;\n var toLen = toEnd - toStart;\n\n // Compare paths to find the longest common path from root\n var length = fromLen < toLen ? fromLen : toLen;\n var lastCommonSep = -1;\n var i = 0;\n for (; i <= length; ++i) {\n if (i === length) {\n if (toLen > length) {\n if (to.charCodeAt(toStart + i) === 47 /*/*/) {\n // We get here if `from` is the exact base path for `to`.\n // For example: from='/foo/bar'; to='/foo/bar/baz'\n return to.slice(toStart + i + 1);\n } else if (i === 0) {\n // We get here if `from` is the root\n // For example: from='/'; to='/foo'\n return to.slice(toStart + i);\n }\n } else if (fromLen > length) {\n if (from.charCodeAt(fromStart + i) === 47 /*/*/) {\n // We get here if `to` is the exact base path for `from`.\n // For example: from='/foo/bar/baz'; to='/foo/bar'\n lastCommonSep = i;\n } else if (i === 0) {\n // We get here if `to` is the root.\n // For example: from='/foo'; to='/'\n lastCommonSep = 0;\n }\n }\n break;\n }\n var fromCode = from.charCodeAt(fromStart + i);\n var toCode = to.charCodeAt(toStart + i);\n if (fromCode !== toCode)\n break;\n else if (fromCode === 47 /*/*/)\n lastCommonSep = i;\n }\n\n var out = '';\n // Generate the relative path based on the path difference between `to`\n // and `from`\n for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {\n if (i === fromEnd || from.charCodeAt(i) === 47 /*/*/) {\n if (out.length === 0)\n out += '..';\n else\n out += '/..';\n }\n }\n\n // Lastly, append the rest of the destination (`to`) path that comes after\n // the common path parts\n if (out.length > 0)\n return out + to.slice(toStart + lastCommonSep);\n else {\n toStart += lastCommonSep;\n if (to.charCodeAt(toStart) === 47 /*/*/)\n ++toStart;\n return to.slice(toStart);\n }\n },\n\n _makeLong: function _makeLong(path) {\n return path;\n },\n\n dirname: function dirname(path) {\n assertPath(path);\n if (path.length === 0) return '.';\n var code = path.charCodeAt(0);\n var hasRoot = code === 47 /*/*/;\n var end = -1;\n var matchedSlash = true;\n for (var i = path.length - 1; i >= 1; --i) {\n code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n } else {\n // We saw the first non-path separator\n matchedSlash = false;\n }\n }\n\n if (end === -1) return hasRoot ? '/' : '.';\n if (hasRoot && end === 1) return '//';\n return path.slice(0, end);\n },\n\n basename: function basename(path, ext) {\n if (ext !== undefined && typeof ext !== 'string') throw new TypeError('\"ext\" argument must be a string');\n assertPath(path);\n\n var start = 0;\n var end = -1;\n var matchedSlash = true;\n var i;\n\n if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {\n if (ext.length === path.length && ext === path) return '';\n var extIdx = ext.length - 1;\n var firstNonSlashEnd = -1;\n for (i = path.length - 1; i >= 0; --i) {\n var code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else {\n if (firstNonSlashEnd === -1) {\n // We saw the first non-path separator, remember this index in case\n // we need it if the extension ends up not matching\n matchedSlash = false;\n firstNonSlashEnd = i + 1;\n }\n if (extIdx >= 0) {\n // Try to match the explicit extension\n if (code === ext.charCodeAt(extIdx)) {\n if (--extIdx === -1) {\n // We matched the extension, so mark this as the end of our path\n // component\n end = i;\n }\n } else {\n // Extension does not match, so our result is the entire path\n // component\n extIdx = -1;\n end = firstNonSlashEnd;\n }\n }\n }\n }\n\n if (start === end) end = firstNonSlashEnd;else if (end === -1) end = path.length;\n return path.slice(start, end);\n } else {\n for (i = path.length - 1; i >= 0; --i) {\n if (path.charCodeAt(i) === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // path component\n matchedSlash = false;\n end = i + 1;\n }\n }\n\n if (end === -1) return '';\n return path.slice(start, end);\n }\n },\n\n extname: function extname(path) {\n assertPath(path);\n var startDot = -1;\n var startPart = 0;\n var end = -1;\n var matchedSlash = true;\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n var preDotState = 0;\n for (var i = path.length - 1; i >= 0; --i) {\n var code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46 /*.*/) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1)\n startDot = i;\n else if (preDotState !== 1)\n preDotState = 1;\n } else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (startDot === -1 || end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n return '';\n }\n return path.slice(startDot, end);\n },\n\n format: function format(pathObject) {\n if (pathObject === null || typeof pathObject !== 'object') {\n throw new TypeError('The \"pathObject\" argument must be of type Object. Received type ' + typeof pathObject);\n }\n return _format('/', pathObject);\n },\n\n parse: function parse(path) {\n assertPath(path);\n\n var ret = { root: '', dir: '', base: '', ext: '', name: '' };\n if (path.length === 0) return ret;\n var code = path.charCodeAt(0);\n var isAbsolute = code === 47 /*/*/;\n var start;\n if (isAbsolute) {\n ret.root = '/';\n start = 1;\n } else {\n start = 0;\n }\n var startDot = -1;\n var startPart = 0;\n var end = -1;\n var matchedSlash = true;\n var i = path.length - 1;\n\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n var preDotState = 0;\n\n // Get non-dir info\n for (; i >= start; --i) {\n code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46 /*.*/) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1) startDot = i;else if (preDotState !== 1) preDotState = 1;\n } else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (startDot === -1 || end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n if (end !== -1) {\n if (startPart === 0 && isAbsolute) ret.base = ret.name = path.slice(1, end);else ret.base = ret.name = path.slice(startPart, end);\n }\n } else {\n if (startPart === 0 && isAbsolute) {\n ret.name = path.slice(1, startDot);\n ret.base = path.slice(1, end);\n } else {\n ret.name = path.slice(startPart, startDot);\n ret.base = path.slice(startPart, end);\n }\n ret.ext = path.slice(startDot, end);\n }\n\n if (startPart > 0) ret.dir = path.slice(0, startPart - 1);else if (isAbsolute) ret.dir = '/';\n\n return ret;\n },\n\n sep: '/',\n delimiter: ':',\n win32: null,\n posix: null\n};\n\nposix.posix = posix;\n\nmodule.exports = posix;\n", "// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n", "// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};", "__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))", "// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\n\n// !!!!!\n// SEE https://github.com/microsoft/vscode/blob/master/src/vs/base/common/platform.ts\n// !!!!!\n\ndeclare const process: { platform: 'win32' };\ndeclare const navigator: { userAgent: string };\n\nexport let isWindows: boolean;\n\nif (typeof process === 'object') {\n\tisWindows = process.platform === 'win32';\n} else if (typeof navigator === 'object') {\n\tlet userAgent = navigator.userAgent;\n\tisWindows = userAgent.indexOf('Windows') >= 0;\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\n\nimport { CharCode } from './charCode'\nimport { isWindows } from './platform';\n\nconst _schemePattern = /^\\w[\\w\\d+.-]*$/;\nconst _singleSlashStart = /^\\//;\nconst _doubleSlashStart = /^\\/\\//;\n\nfunction _validateUri(ret: URI, _strict?: boolean): void {\n\n\t// scheme, must be set\n\tif (!ret.scheme && _strict) {\n\t\tthrow new Error(`[UriError]: Scheme is missing: {scheme: \"\", authority: \"${ret.authority}\", path: \"${ret.path}\", query: \"${ret.query}\", fragment: \"${ret.fragment}\"}`);\n\t}\n\n\t// scheme, https://tools.ietf.org/html/rfc3986#section-3.1\n\t// ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )\n\tif (ret.scheme && !_schemePattern.test(ret.scheme)) {\n\t\tthrow new Error('[UriError]: Scheme contains illegal characters.');\n\t}\n\n\t// path, http://tools.ietf.org/html/rfc3986#section-3.3\n\t// If a URI contains an authority component, then the path component\n\t// must either be empty or begin with a slash (\"/\") character. If a URI\n\t// does not contain an authority component, then the path cannot begin\n\t// with two slash characters (\"//\").\n\tif (ret.path) {\n\t\tif (ret.authority) {\n\t\t\tif (!_singleSlashStart.test(ret.path)) {\n\t\t\t\tthrow new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash (\"/\") character');\n\t\t\t}\n\t\t} else {\n\t\t\tif (_doubleSlashStart.test(ret.path)) {\n\t\t\t\tthrow new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters (\"//\")');\n\t\t\t}\n\t\t}\n\t}\n}\n\n// for a while we allowed uris *without* schemes and this is the migration\n// for them, e.g. an uri without scheme and without strict-mode warns and falls\n// back to the file-scheme. that should cause the least carnage and still be a\n// clear warning\nfunction _schemeFix(scheme: string, _strict: boolean): string {\n\tif (!scheme && !_strict) {\n\t\treturn 'file';\n\t}\n\treturn scheme;\n}\n\n// implements a bit of https://tools.ietf.org/html/rfc3986#section-5\nfunction _referenceResolution(scheme: string, path: string): string {\n\n\t// the slash-character is our 'default base' as we don't\n\t// support constructing URIs relative to other URIs. This\n\t// also means that we alter and potentially break paths.\n\t// see https://tools.ietf.org/html/rfc3986#section-5.1.4\n\tswitch (scheme) {\n\t\tcase 'https':\n\t\tcase 'http':\n\t\tcase 'file':\n\t\t\tif (!path) {\n\t\t\t\tpath = _slash;\n\t\t\t} else if (path[0] !== _slash) {\n\t\t\t\tpath = _slash + path;\n\t\t\t}\n\t\t\tbreak;\n\t}\n\treturn path;\n}\n\nconst _empty = '';\nconst _slash = '/';\nconst _regexp = /^(([^:/?#]+?):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?/;\n\n/**\n * Uniform Resource Identifier (URI) http://tools.ietf.org/html/rfc3986.\n * This class is a simple parser which creates the basic component parts\n * (http://tools.ietf.org/html/rfc3986#section-3) with minimal validation\n * and encoding.\n *\n * ```txt\n * foo://example.com:8042/over/there?name=ferret#nose\n * \\_/ \\______________/\\_________/ \\_________/ \\__/\n * | | | | |\n * scheme authority path query fragment\n * | _____________________|__\n * / \\ / \\\n * urn:example:animal:ferret:nose\n * ```\n */\nexport class URI implements UriComponents {\n\n\tstatic isUri(thing: any): thing is URI {\n\t\tif (thing instanceof URI) {\n\t\t\treturn true;\n\t\t}\n\t\tif (!thing) {\n\t\t\treturn false;\n\t\t}\n\t\treturn typeof (<URI>thing).authority === 'string'\n\t\t\t&& typeof (<URI>thing).fragment === 'string'\n\t\t\t&& typeof (<URI>thing).path === 'string'\n\t\t\t&& typeof (<URI>thing).query === 'string'\n\t\t\t&& typeof (<URI>thing).scheme === 'string'\n\t\t\t&& typeof (<URI>thing).fsPath === 'string'\n\t\t\t&& typeof (<URI>thing).with === 'function'\n\t\t\t&& typeof (<URI>thing).toString === 'function';\n\t}\n\n\t/**\n\t * scheme is the 'http' part of 'http://www.msft.com/some/path?query#fragment'.\n\t * The part before the first colon.\n\t */\n\treadonly scheme: string;\n\n\t/**\n\t * authority is the 'www.msft.com' part of 'http://www.msft.com/some/path?query#fragment'.\n\t * The part between the first double slashes and the next slash.\n\t */\n\treadonly authority: string;\n\n\t/**\n\t * path is the '/some/path' part of 'http://www.msft.com/some/path?query#fragment'.\n\t */\n\treadonly path: string;\n\n\t/**\n\t * query is the 'query' part of 'http://www.msft.com/some/path?query#fragment'.\n\t */\n\treadonly query: string;\n\n\t/**\n\t * fragment is the 'fragment' part of 'http://www.msft.com/some/path?query#fragment'.\n\t */\n\treadonly fragment: string;\n\n\t/**\n\t * @internal\n\t */\n\tprotected constructor(scheme: string, authority?: string, path?: string, query?: string, fragment?: string, _strict?: boolean);\n\n\t/**\n\t * @internal\n\t */\n\tprotected constructor(components: UriComponents);\n\n\t/**\n\t * @internal\n\t */\n\tprotected constructor(schemeOrData: string | UriComponents, authority?: string, path?: string, query?: string, fragment?: string, _strict: boolean = false) {\n\n\t\tif (typeof schemeOrData === 'object') {\n\t\t\tthis.scheme = schemeOrData.scheme || _empty;\n\t\t\tthis.authority = schemeOrData.authority || _empty;\n\t\t\tthis.path = schemeOrData.path || _empty;\n\t\t\tthis.query = schemeOrData.query || _empty;\n\t\t\tthis.fragment = schemeOrData.fragment || _empty;\n\t\t\t// no validation because it's this URI\n\t\t\t// that creates uri components.\n\t\t\t// _validateUri(this);\n\t\t} else {\n\t\t\tthis.scheme = _schemeFix(schemeOrData, _strict);\n\t\t\tthis.authority = authority || _empty;\n\t\t\tthis.path = _referenceResolution(this.scheme, path || _empty);\n\t\t\tthis.query = query || _empty;\n\t\t\tthis.fragment = fragment || _empty;\n\n\t\t\t_validateUri(this, _strict);\n\t\t}\n\t}\n\n\t// ---- filesystem path -----------------------\n\n\t/**\n\t * Returns a string representing the corresponding file system path of this URI.\n\t * Will handle UNC paths, normalizes windows drive letters to lower-case, and uses the\n\t * platform specific path separator.\n\t *\n\t * * Will *not* validate the path for invalid characters and semantics.\n\t * * Will *not* look at the scheme of this URI.\n\t * * The result shall *not* be used for display purposes but for accessing a file on disk.\n\t *\n\t *\n\t * The *difference* to `URI#path` is the use of the platform specific separator and the handling\n\t * of UNC paths. See the below sample of a file-uri with an authority (UNC path).\n\t *\n\t * ```ts\n\t\tconst u = URI.parse('file://server/c$/folder/file.txt')\n\t\tu.authority === 'server'\n\t\tu.path === '/shares/c$/file.txt'\n\t\tu.fsPath === '\\\\server\\c$\\folder\\file.txt'\n\t```\n\t *\n\t * Using `URI#path` to read a file (using fs-apis) would not be enough because parts of the path,\n\t * namely the server name, would be missing. Therefore `URI#fsPath` exists - it's sugar to ease working\n\t * with URIs that represent files on disk (`file` scheme).\n\t */\n\tget fsPath(): string {\n\t\t// if (this.scheme !== 'file') {\n\t\t// \tconsole.warn(`[UriError] calling fsPath with scheme ${this.scheme}`);\n\t\t// }\n\t\treturn uriToFsPath(this, false);\n\t}\n\n\t// ---- modify to new -------------------------\n\n\twith(change: { scheme?: string; authority?: string | null; path?: string | null; query?: string | null; fragment?: string | null }): URI {\n\n\t\tif (!change) {\n\t\t\treturn this;\n\t\t}\n\n\t\tlet { scheme, authority, path, query, fragment } = change;\n\t\tif (scheme === undefined) {\n\t\t\tscheme = this.scheme;\n\t\t} else if (scheme === null) {\n\t\t\tscheme = _empty;\n\t\t}\n\t\tif (authority === undefined) {\n\t\t\tauthority = this.authority;\n\t\t} else if (authority === null) {\n\t\t\tauthority = _empty;\n\t\t}\n\t\tif (path === undefined) {\n\t\t\tpath = this.path;\n\t\t} else if (path === null) {\n\t\t\tpath = _empty;\n\t\t}\n\t\tif (query === undefined) {\n\t\t\tquery = this.query;\n\t\t} else if (query === null) {\n\t\t\tquery = _empty;\n\t\t}\n\t\tif (fragment === undefined) {\n\t\t\tfragment = this.fragment;\n\t\t} else if (fragment === null) {\n\t\t\tfragment = _empty;\n\t\t}\n\n\t\tif (scheme === this.scheme\n\t\t\t&& authority === this.authority\n\t\t\t&& path === this.path\n\t\t\t&& query === this.query\n\t\t\t&& fragment === this.fragment) {\n\n\t\t\treturn this;\n\t\t}\n\n\t\treturn new Uri(scheme, authority, path, query, fragment);\n\t}\n\n\t// ---- parse & validate ------------------------\n\n\t/**\n\t * Creates a new URI from a string, e.g. `http://www.msft.com/some/path`,\n\t * `file:///usr/home`, or `scheme:with/path`.\n\t *\n\t * @param value A string which represents an URI (see `URI#toString`).\n\t */\n\tstatic parse(value: string, _strict: boolean = false): URI {\n\t\tconst match = _regexp.exec(value);\n\t\tif (!match) {\n\t\t\treturn new Uri(_empty, _empty, _empty, _empty, _empty);\n\t\t}\n\t\treturn new Uri(\n\t\t\tmatch[2] || _empty,\n\t\t\tpercentDecode(match[4] || _empty),\n\t\t\tpercentDecode(match[5] || _empty),\n\t\t\tpercentDecode(match[7] || _empty),\n\t\t\tpercentDecode(match[9] || _empty),\n\t\t\t_strict\n\t\t);\n\t}\n\n\t/**\n\t * Creates a new URI from a file system path, e.g. `c:\\my\\files`,\n\t * `/usr/home`, or `\\\\server\\share\\some\\path`.\n\t *\n\t * The *difference* between `URI#parse` and `URI#file` is that the latter treats the argument\n\t * as path, not as stringified-uri. E.g. `URI.file(path)` is **not the same as**\n\t * `URI.parse('file://' + path)` because the path might contain characters that are\n\t * interpreted (# and ?). See the following sample:\n\t * ```ts\n\tconst good = URI.file('/coding/c#/project1');\n\tgood.scheme === 'file';\n\tgood.path === '/coding/c#/project1';\n\tgood.fragment === '';\n\tconst bad = URI.parse('file://' + '/coding/c#/project1');\n\tbad.scheme === 'file';\n\tbad.path === '/coding/c'; // path is now broken\n\tbad.fragment === '/project1';\n\t```\n\t *\n\t * @param path A file system path (see `URI#fsPath`)\n\t */\n\tstatic file(path: string): URI {\n\n\t\tlet authority = _empty;\n\n\t\t// normalize to fwd-slashes on windows,\n\t\t// on other systems bwd-slashes are valid\n\t\t// filename character, eg /f\\oo/ba\\r.txt\n\t\tif (isWindows) {\n\t\t\tpath = path.replace(/\\\\/g, _slash);\n\t\t}\n\n\t\t// check for authority as used in UNC shares\n\t\t// or use the path as given\n\t\tif (path[0] === _slash && path[1] === _slash) {\n\t\t\tconst idx = path.indexOf(_slash, 2);\n\t\t\tif (idx === -1) {\n\t\t\t\tauthority = path.substring(2);\n\t\t\t\tpath = _slash;\n\t\t\t} else {\n\t\t\t\tauthority = path.substring(2, idx);\n\t\t\t\tpath = path.substring(idx) || _slash;\n\t\t\t}\n\t\t}\n\n\t\treturn new Uri('file', authority, path, _empty, _empty);\n\t}\n\n\tstatic from(components: { scheme: string; authority?: string; path?: string; query?: string; fragment?: string }): URI {\n\t\treturn new Uri(\n\t\t\tcomponents.scheme,\n\t\t\tcomponents.authority,\n\t\t\tcomponents.path,\n\t\t\tcomponents.query,\n\t\t\tcomponents.fragment,\n\t\t);\n\t}\n\n\t// ---- printing/externalize ---------------------------\n\n\t/**\n\t * Creates a string representation for this URI. It's guaranteed that calling\n\t * `URI.parse` with the result of this function creates an URI which is equal\n\t * to this URI.\n\t *\n\t * * The result shall *not* be used for display purposes but for externalization or transport.\n\t * * The result will be encoded using the percentage encoding and encoding happens mostly\n\t * ignore the scheme-specific encoding rules.\n\t *\n\t * @param skipEncoding Do not encode the result, default is `false`\n\t */\n\ttoString(skipEncoding: boolean = false): string {\n\t\treturn _asFormatted(this, skipEncoding);\n\t}\n\n\ttoJSON(): UriComponents {\n\t\treturn this;\n\t}\n\n\tstatic revive(data: UriComponents | URI): URI;\n\tstatic revive(data: UriComponents | URI | undefined): URI | undefined;\n\tstatic revive(data: UriComponents | URI | null): URI | null;\n\tstatic revive(data: UriComponents | URI | undefined | null): URI | undefined | null;\n\tstatic revive(data: UriComponents | URI | undefined | null): URI | undefined | null {\n\t\tif (!data) {\n\t\t\treturn <any>data;\n\t\t} else if (data instanceof URI) {\n\t\t\treturn data;\n\t\t} else {\n\t\t\tconst result = new Uri(data);\n\t\t\tresult._formatted = (<UriState>data).external;\n\t\t\tresult._fsPath = (<UriState>data)._sep === _pathSepMarker ? (<UriState>data).fsPath : null;\n\t\t\treturn result;\n\t\t}\n\t}\n}\n\nexport interface UriComponents {\n\tscheme: string;\n\tauthority: string;\n\tpath: string;\n\tquery: string;\n\tfragment: string;\n}\n\ninterface UriState extends UriComponents {\n\t$mid: number;\n\texternal: string;\n\tfsPath: string;\n\t_sep: 1 | undefined;\n}\n\nconst _pathSepMarker = isWindows ? 1 : undefined;\n\n// This class exists so that URI is compatibile with vscode.Uri (API).\nclass Uri extends URI {\n\n\t_formatted: string | null = null;\n\t_fsPath: string | null = null;\n\n\toverride get fsPath(): string {\n\t\tif (!this._fsPath) {\n\t\t\tthis._fsPath = uriToFsPath(this, false);\n\t\t}\n\t\treturn this._fsPath;\n\t}\n\n\toverride toString(skipEncoding: boolean = false): string {\n\t\tif (!skipEncoding) {\n\t\t\tif (!this._formatted) {\n\t\t\t\tthis._formatted = _asFormatted(this, false);\n\t\t\t}\n\t\t\treturn this._formatted;\n\t\t} else {\n\t\t\t// we don't cache that\n\t\t\treturn _asFormatted(this, true);\n\t\t}\n\t}\n\n\toverride toJSON(): UriComponents {\n\t\tconst res = <UriState>{\n\t\t\t$mid: 1\n\t\t};\n\t\t// cached state\n\t\tif (this._fsPath) {\n\t\t\tres.fsPath = this._fsPath;\n\t\t\tres._sep = _pathSepMarker;\n\t\t}\n\t\tif (this._formatted) {\n\t\t\tres.external = this._formatted;\n\t\t}\n\t\t// uri components\n\t\tif (this.path) {\n\t\t\tres.path = this.path;\n\t\t}\n\t\tif (this.scheme) {\n\t\t\tres.scheme = this.scheme;\n\t\t}\n\t\tif (this.authority) {\n\t\t\tres.authority = this.authority;\n\t\t}\n\t\tif (this.query) {\n\t\t\tres.query = this.query;\n\t\t}\n\t\tif (this.fragment) {\n\t\t\tres.fragment = this.fragment;\n\t\t}\n\t\treturn res;\n\t}\n}\n\n// reserved characters: https://tools.ietf.org/html/rfc3986#section-2.2\nconst encodeTable: { [ch: number]: string } = {\n\t[CharCode.Colon]: '%3A', // gen-delims\n\t[CharCode.Slash]: '%2F',\n\t[CharCode.QuestionMark]: '%3F',\n\t[CharCode.Hash]: '%23',\n\t[CharCode.OpenSquareBracket]: '%5B',\n\t[CharCode.CloseSquareBracket]: '%5D',\n\t[CharCode.AtSign]: '%40',\n\n\t[CharCode.ExclamationMark]: '%21', // sub-delims\n\t[CharCode.DollarSign]: '%24',\n\t[CharCode.Ampersand]: '%26',\n\t[CharCode.SingleQuote]: '%27',\n\t[CharCode.OpenParen]: '%28',\n\t[CharCode.CloseParen]: '%29',\n\t[CharCode.Asterisk]: '%2A',\n\t[CharCode.Plus]: '%2B',\n\t[CharCode.Comma]: '%2C',\n\t[CharCode.Semicolon]: '%3B',\n\t[CharCode.Equals]: '%3D',\n\n\t[CharCode.Space]: '%20',\n};\n\nfunction encodeURIComponentFast(uriComponent: string, allowSlash: boolean): string {\n\tlet res: string | undefined = undefined;\n\tlet nativeEncodePos = -1;\n\n\tfor (let pos = 0; pos < uriComponent.length; pos++) {\n\t\tconst code = uriComponent.charCodeAt(pos);\n\n\t\t// unreserved characters: https://tools.ietf.org/html/rfc3986#section-2.3\n\t\tif (\n\t\t\t(code >= CharCode.a && code <= CharCode.z)\n\t\t\t|| (code >= CharCode.A && code <= CharCode.Z)\n\t\t\t|| (code >= CharCode.Digit0 && code <= CharCode.Digit9)\n\t\t\t|| code === CharCode.Dash\n\t\t\t|| code === CharCode.Period\n\t\t\t|| code === CharCode.Underline\n\t\t\t|| code === CharCode.Tilde\n\t\t\t|| (allowSlash && code === CharCode.Slash)\n\t\t) {\n\t\t\t// check if we are delaying native encode\n\t\t\tif (nativeEncodePos !== -1) {\n\t\t\t\tres += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos));\n\t\t\t\tnativeEncodePos = -1;\n\t\t\t}\n\t\t\t// check if we write into a new string (by default we try to return the param)\n\t\t\tif (res !== undefined) {\n\t\t\t\tres += uriComponent.charAt(pos);\n\t\t\t}\n\n\t\t} else {\n\t\t\t// encoding needed, we need to allocate a new string\n\t\t\tif (res === undefined) {\n\t\t\t\tres = uriComponent.substr(0, pos);\n\t\t\t}\n\n\t\t\t// check with default table first\n\t\t\tconst escaped = encodeTable[code];\n\t\t\tif (escaped !== undefined) {\n\n\t\t\t\t// check if we are delaying native encode\n\t\t\t\tif (nativeEncodePos !== -1) {\n\t\t\t\t\tres += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos));\n\t\t\t\t\tnativeEncodePos = -1;\n\t\t\t\t}\n\n\t\t\t\t// append escaped variant to result\n\t\t\t\tres += escaped;\n\n\t\t\t} else if (nativeEncodePos === -1) {\n\t\t\t\t// use native encode only when needed\n\t\t\t\tnativeEncodePos = pos;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (nativeEncodePos !== -1) {\n\t\tres += encodeURIComponent(uriComponent.substring(nativeEncodePos));\n\t}\n\n\treturn res !== undefined ? res : uriComponent;\n}\n\nfunction encodeURIComponentMinimal(path: string): string {\n\tlet res: string | undefined = undefined;\n\tfor (let pos = 0; pos < path.length; pos++) {\n\t\tconst code = path.charCodeAt(pos);\n\t\tif (code === CharCode.Hash || code === CharCode.QuestionMark) {\n\t\t\tif (res === undefined) {\n\t\t\t\tres = path.substr(0, pos);\n\t\t\t}\n\t\t\tres += encodeTable[code];\n\t\t} else {\n\t\t\tif (res !== undefined) {\n\t\t\t\tres += path[pos];\n\t\t\t}\n\t\t}\n\t}\n\treturn res !== undefined ? res : path;\n}\n\n/**\n * Compute `fsPath` for the given uri\n */\nexport function uriToFsPath(uri: URI, keepDriveLetterCasing: boolean): string {\n\n\tlet value: string;\n\tif (uri.authority && uri.path.length > 1 && uri.scheme === 'file') {\n\t\t// unc path: file://shares/c$/far/boo\n\t\tvalue = `//${uri.authority}${uri.path}`;\n\t} else if (\n\t\turi.path.charCodeAt(0) === CharCode.Slash\n\t\t&& (uri.path.charCodeAt(1) >= CharCode.A && uri.path.charCodeAt(1) <= CharCode.Z || uri.path.charCodeAt(1) >= CharCode.a && uri.path.charCodeAt(1) <= CharCode.z)\n\t\t&& uri.path.charCodeAt(2) === CharCode.Colon\n\t) {\n\t\tif (!keepDriveLetterCasing) {\n\t\t\t// windows drive letter: file:///c:/far/boo\n\t\t\tvalue = uri.path[1].toLowerCase() + uri.path.substr(2);\n\t\t} else {\n\t\t\tvalue = uri.path.substr(1);\n\t\t}\n\t} else {\n\t\t// other path\n\t\tvalue = uri.path;\n\t}\n\tif (isWindows) {\n\t\tvalue = value.replace(/\\//g, '\\\\');\n\t}\n\treturn value;\n}\n\n/**\n * Create the external version of a uri\n */\nfunction _asFormatted(uri: URI, skipEncoding: boolean): string {\n\n\tconst encoder = !skipEncoding\n\t\t? encodeURIComponentFast\n\t\t: encodeURIComponentMinimal;\n\n\tlet res = '';\n\tlet { scheme, authority, path, query, fragment } = uri;\n\tif (scheme) {\n\t\tres += scheme;\n\t\tres += ':';\n\t}\n\tif (authority || scheme === 'file') {\n\t\tres += _slash;\n\t\tres += _slash;\n\t}\n\tif (authority) {\n\t\tlet idx = authority.indexOf('@');\n\t\tif (idx !== -1) {\n\t\t\t// <user>@<auth>\n\t\t\tconst userinfo = authority.substr(0, idx);\n\t\t\tauthority = authority.substr(idx + 1);\n\t\t\tidx = userinfo.indexOf(':');\n\t\t\tif (idx === -1) {\n\t\t\t\tres += encoder(userinfo, false);\n\t\t\t} else {\n\t\t\t\t// <user>:<pass>@<auth>\n\t\t\t\tres += encoder(userinfo.substr(0, idx), false);\n\t\t\t\tres += ':';\n\t\t\t\tres += encoder(userinfo.substr(idx + 1), false);\n\t\t\t}\n\t\t\tres += '@';\n\t\t}\n\t\tauthority = authority.toLowerCase();\n\t\tidx = authority.indexOf(':');\n\t\tif (idx === -1) {\n\t\t\tres += encoder(authority, false);\n\t\t} else {\n\t\t\t// <auth>:<port>\n\t\t\tres += encoder(authority.substr(0, idx), false);\n\t\t\tres += authority.substr(idx);\n\t\t}\n\t}\n\tif (path) {\n\t\t// lower-case windows drive letters in /C:/fff or C:/fff\n\t\tif (path.length >= 3 && path.charCodeAt(0) === CharCode.Slash && path.charCodeAt(2) === CharCode.Colon) {\n\t\t\tconst code = path.charCodeAt(1);\n\t\t\tif (code >= CharCode.A && code <= CharCode.Z) {\n\t\t\t\tpath = `/${String.fromCharCode(code + 32)}:${path.substr(3)}`; // \"/c:\".length === 3\n\t\t\t}\n\t\t} else if (path.length >= 2 && path.charCodeAt(1) === CharCode.Colon) {\n\t\t\tconst code = path.charCodeAt(0);\n\t\t\tif (code >= CharCode.A && code <= CharCode.Z) {\n\t\t\t\tpath = `${String.fromCharCode(code + 32)}:${path.substr(2)}`; // \"/c:\".length === 3\n\t\t\t}\n\t\t}\n\t\t// encode the rest of the path\n\t\tres += encoder(path, true);\n\t}\n\tif (query) {\n\t\tres += '?';\n\t\tres += encoder(query, false);\n\t}\n\tif (fragment) {\n\t\tres += '#';\n\t\tres += !skipEncoding ? encodeURIComponentFast(fragment, false) : fragment;\n\t}\n\treturn res;\n}\n\n// --- decode\n\nfunction decodeURIComponentGraceful(str: string): string {\n\ttry {\n\t\treturn decodeURIComponent(str);\n\t} catch {\n\t\tif (str.length > 3) {\n\t\t\treturn str.substr(0, 3) + decodeURIComponentGraceful(str.substr(3));\n\t\t} else {\n\t\t\treturn str;\n\t\t}\n\t}\n}\n\nconst _rEncodedAsHex = /(%[0-9A-Za-z][0-9A-Za-z])+/g;\n\nfunction percentDecode(str: string): string {\n\tif (!str.match(_rEncodedAsHex)) {\n\t\treturn str;\n\t}\n\treturn str.replace(_rEncodedAsHex, (match) => decodeURIComponentGraceful(match));\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n'use strict';\n\nimport { CharCode } from './charCode';\nimport { URI } from './uri';\nimport * as nodePath from 'path';\n\nconst posixPath = nodePath.posix || nodePath;\nconst slash = '/';\n\nexport namespace Utils {\n\n /**\n * Joins one or more input paths to the path of URI. \n * '/' is used as the directory separation character. \n * \n * The resolved path will be normalized. That means:\n * - all '..' and '.' segments are resolved.\n * - multiple, sequential occurences of '/' are replaced by a single instance of '/'.\n * - trailing separators are preserved.\n * \n * @param uri The input URI.\n * @param paths The paths to be joined with the path of URI.\n * @returns A URI with the joined path. All other properties of the URI (scheme, authority, query, fragments, ...) will be taken from the input URI.\n */\n export function joinPath(uri: URI, ...paths: string[]): URI {\n return uri.with({ path: posixPath.join(uri.path, ...paths) });\n }\n\n\n /**\n * Resolves one or more paths against the path of a URI. \n * '/' is used as the directory separation character. \n * \n * The resolved path will be normalized. That means:\n * - all '..' and '.' segments are resolved. \n * - multiple, sequential occurences of '/' are replaced by a single instance of '/'.\n * - trailing separators are removed.\n * \n * @param uri The input URI.\n * @param paths The paths to resolve against the path of URI.\n * @returns A URI with the resolved path. All other properties of the URI (scheme, authority, query, fragments, ...) will be taken from the input URI.\n */\n export function resolvePath(uri: URI, ...paths: string[]): URI {\n let path = uri.path; \n let slashAdded = false;\n if (path[0] !== slash) {\n path = slash + path; // make the path abstract: for posixPath.resolve the first segments has to be absolute or cwd is used.\n slashAdded = true;\n }\n let resolvedPath = posixPath.resolve(path, ...paths);\n if (slashAdded && resolvedPath[0] === slash && !uri.authority) {\n resolvedPath = resolvedPath.substring(1);\n }\n return uri.with({ path: resolvedPath });\n }\n\n /**\n * Returns a URI where the path is the directory name of the input uri, similar to the Unix dirname command. \n * In the path, '/' is recognized as the directory separation character. Trailing directory separators are ignored.\n * The orignal URI is returned if the URIs path is empty or does not contain any path segments.\n * \n * @param uri The input URI.\n * @return The last segment of the URIs path.\n */\n export function dirname(uri: URI): URI {\n if (uri.path.length === 0 || uri.path === slash) {\n return uri;\n }\n let path = posixPath.dirname(uri.path);\n if (path.length === 1 && path.charCodeAt(0) === CharCode.Period) {\n path = '';\n }\n return uri.with({ path });\n }\n\n /**\n * Returns the last segment of the path of a URI, similar to the Unix basename command. \n * In the path, '/' is recognized as the directory separation character. Trailing directory separators are ignored.\n * The empty string is returned if the URIs path is empty or does not contain any path segments.\n * \n * @param uri The input URI.\n * @return The base name of the URIs path.\n */\n export function basename(uri: URI): string {\n return posixPath.basename(uri.path);\n }\n\n /**\n * Returns the extension name of the path of a URI, similar to the Unix extname command. \n * In the path, '/' is recognized as the directory separation character. Trailing directory separators are ignored.\n * The empty string is returned if the URIs path is empty or does not contain any path segments.\n * \n * @param uri The input URI.\n * @return The extension name of the URIs path.\n */\n export function extname(uri: URI): string {\n return posixPath.extname(uri.path);\n }\n}", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { URI, Utils } from 'vscode-uri';\nexport function dirname(uriString) {\n return Utils.dirname(URI.parse(uriString)).toString(true);\n}\nexport function joinPath(uriString, ...paths) {\n return Utils.joinPath(URI.parse(uriString), ...paths).toString(true);\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { FileType, CompletionItemKind, TextEdit, Range, Position } from '../cssLanguageTypes';\nimport { startsWith, endsWith } from '../utils/strings';\nimport { joinPath } from '../utils/resources';\nexport class PathCompletionParticipant {\n constructor(readDirectory) {\n this.readDirectory = readDirectory;\n this.literalCompletions = [];\n this.importCompletions = [];\n }\n onCssURILiteralValue(context) {\n this.literalCompletions.push(context);\n }\n onCssImportPath(context) {\n this.importCompletions.push(context);\n }\n async computeCompletions(document, documentContext) {\n const result = { items: [], isIncomplete: false };\n for (const literalCompletion of this.literalCompletions) {\n const uriValue = literalCompletion.uriValue;\n const fullValue = stripQuotes(uriValue);\n if (fullValue === '.' || fullValue === '..') {\n result.isIncomplete = true;\n }\n else {\n const items = await this.providePathSuggestions(uriValue, literalCompletion.position, literalCompletion.range, document, documentContext);\n for (let item of items) {\n result.items.push(item);\n }\n }\n }\n for (const importCompletion of this.importCompletions) {\n const pathValue = importCompletion.pathValue;\n const fullValue = stripQuotes(pathValue);\n if (fullValue === '.' || fullValue === '..') {\n result.isIncomplete = true;\n }\n else {\n let suggestions = await this.providePathSuggestions(pathValue, importCompletion.position, importCompletion.range, document, documentContext);\n if (document.languageId === 'scss') {\n suggestions.forEach(s => {\n if (startsWith(s.label, '_') && endsWith(s.label, '.scss')) {\n if (s.textEdit) {\n s.textEdit.newText = s.label.slice(1, -5);\n }\n else {\n s.label = s.label.slice(1, -5);\n }\n }\n });\n }\n for (let item of suggestions) {\n result.items.push(item);\n }\n }\n }\n return result;\n }\n async providePathSuggestions(pathValue, position, range, document, documentContext) {\n const fullValue = stripQuotes(pathValue);\n const isValueQuoted = startsWith(pathValue, `'`) || startsWith(pathValue, `\"`);\n const valueBeforeCursor = isValueQuoted\n ? fullValue.slice(0, position.character - (range.start.character + 1))\n : fullValue.slice(0, position.character - range.start.character);\n const currentDocUri = document.uri;\n const fullValueRange = isValueQuoted ? shiftRange(range, 1, -1) : range;\n const replaceRange = pathToReplaceRange(valueBeforeCursor, fullValue, fullValueRange);\n const valueBeforeLastSlash = valueBeforeCursor.substring(0, valueBeforeCursor.lastIndexOf('/') + 1); // keep the last slash\n let parentDir = documentContext.resolveReference(valueBeforeLastSlash || '.', currentDocUri);\n if (parentDir) {\n try {\n const result = [];\n const infos = await this.readDirectory(parentDir);\n for (const [name, type] of infos) {\n // Exclude paths that start with `.`\n if (name.charCodeAt(0) !== CharCode_dot && (type === FileType.Directory || joinPath(parentDir, name) !== currentDocUri)) {\n result.push(createCompletionItem(name, type === FileType.Directory, replaceRange));\n }\n }\n return result;\n }\n catch (e) {\n // ignore\n }\n }\n return [];\n }\n}\nconst CharCode_dot = '.'.charCodeAt(0);\nfunction stripQuotes(fullValue) {\n if (startsWith(fullValue, `'`) || startsWith(fullValue, `\"`)) {\n return fullValue.slice(1, -1);\n }\n else {\n return fullValue;\n }\n}\nfunction pathToReplaceRange(valueBeforeCursor, fullValue, fullValueRange) {\n let replaceRange;\n const lastIndexOfSlash = valueBeforeCursor.lastIndexOf('/');\n if (lastIndexOfSlash === -1) {\n replaceRange = fullValueRange;\n }\n else {\n // For cases where cursor is in the middle of attribute value, like <script src=\"./s|rc/test.js\">\n // Find the last slash before cursor, and calculate the start of replace range from there\n const valueAfterLastSlash = fullValue.slice(lastIndexOfSlash + 1);\n const startPos = shiftPosition(fullValueRange.end, -valueAfterLastSlash.length);\n // If whitespace exists, replace until it\n const whitespaceIndex = valueAfterLastSlash.indexOf(' ');\n let endPos;\n if (whitespaceIndex !== -1) {\n endPos = shiftPosition(startPos, whitespaceIndex);\n }\n else {\n endPos = fullValueRange.end;\n }\n replaceRange = Range.create(startPos, endPos);\n }\n return replaceRange;\n}\nfunction createCompletionItem(name, isDir, replaceRange) {\n if (isDir) {\n name = name + '/';\n return {\n label: escapePath(name),\n kind: CompletionItemKind.Folder,\n textEdit: TextEdit.replace(replaceRange, escapePath(name)),\n command: {\n title: 'Suggest',\n command: 'editor.action.triggerSuggest'\n }\n };\n }\n else {\n return {\n label: escapePath(name),\n kind: CompletionItemKind.File,\n textEdit: TextEdit.replace(replaceRange, escapePath(name))\n };\n }\n}\n// Escape https://www.w3.org/TR/CSS1/#url\nfunction escapePath(p) {\n return p.replace(/(\\s|\\(|\\)|,|\"|')/g, '\\\\$1');\n}\nfunction shiftPosition(pos, offset) {\n return Position.create(pos.line, pos.character + offset);\n}\nfunction shiftRange(range, startOffset, endOffset) {\n const start = shiftPosition(range.start, startOffset);\n const end = shiftPosition(range.end, endOffset);\n return Range.create(start, end);\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport * as nodes from '../parser/cssNodes';\nimport { Symbols } from '../parser/cssSymbolScope';\nimport * as languageFacts from '../languageFacts/facts';\nimport * as strings from '../utils/strings';\nimport { Position, CompletionItemKind, Range, TextEdit, InsertTextFormat, MarkupKind, CompletionItemTag } from '../cssLanguageTypes';\nimport * as l10n from '@vscode/l10n';\nimport { isDefined } from '../utils/objects';\nimport { PathCompletionParticipant } from './pathCompletion';\nconst SnippetFormat = InsertTextFormat.Snippet;\nconst retriggerCommand = {\n title: 'Suggest',\n command: 'editor.action.triggerSuggest'\n};\nvar SortTexts;\n(function (SortTexts) {\n // char code 32, comes before everything\n SortTexts[\"Enums\"] = \" \";\n SortTexts[\"Normal\"] = \"d\";\n SortTexts[\"VendorPrefixed\"] = \"x\";\n SortTexts[\"Term\"] = \"y\";\n SortTexts[\"Variable\"] = \"z\";\n})(SortTexts || (SortTexts = {}));\nexport class CSSCompletion {\n constructor(variablePrefix = null, lsOptions, cssDataManager) {\n this.variablePrefix = variablePrefix;\n this.lsOptions = lsOptions;\n this.cssDataManager = cssDataManager;\n this.completionParticipants = [];\n }\n configure(settings) {\n this.defaultSettings = settings;\n }\n getSymbolContext() {\n if (!this.symbolContext) {\n this.symbolContext = new Symbols(this.styleSheet);\n }\n return this.symbolContext;\n }\n setCompletionParticipants(registeredCompletionParticipants) {\n this.completionParticipants = registeredCompletionParticipants || [];\n }\n async doComplete2(document, position, styleSheet, documentContext, completionSettings = this.defaultSettings) {\n if (!this.lsOptions.fileSystemProvider || !this.lsOptions.fileSystemProvider.readDirectory) {\n return this.doComplete(document, position, styleSheet, completionSettings);\n }\n const participant = new PathCompletionParticipant(this.lsOptions.fileSystemProvider.readDirectory);\n const contributedParticipants = this.completionParticipants;\n this.completionParticipants = [participant].concat(contributedParticipants);\n const result = this.doComplete(document, position, styleSheet, completionSettings);\n try {\n const pathCompletionResult = await participant.computeCompletions(document, documentContext);\n return {\n isIncomplete: result.isIncomplete || pathCompletionResult.isIncomplete,\n itemDefaults: result.itemDefaults,\n items: pathCompletionResult.items.concat(result.items)\n };\n }\n finally {\n this.completionParticipants = contributedParticipants;\n }\n }\n doComplete(document, position, styleSheet, documentSettings) {\n this.offset = document.offsetAt(position);\n this.position = position;\n this.currentWord = getCurrentWord(document, this.offset);\n this.defaultReplaceRange = Range.create(Position.create(this.position.line, this.position.character - this.currentWord.length), this.position);\n this.textDocument = document;\n this.styleSheet = styleSheet;\n this.documentSettings = documentSettings;\n try {\n const result = {\n isIncomplete: false,\n itemDefaults: {\n editRange: {\n start: { line: position.line, character: position.character - this.currentWord.length },\n end: position\n }\n },\n items: []\n };\n this.nodePath = nodes.getNodePath(this.styleSheet, this.offset);\n for (let i = this.nodePath.length - 1; i >= 0; i--) {\n const node = this.nodePath[i];\n if (node instanceof nodes.Property) {\n this.getCompletionsForDeclarationProperty(node.getParent(), result);\n }\n else if (node instanceof nodes.Expression) {\n if (node.parent instanceof nodes.Interpolation) {\n this.getVariableProposals(null, result);\n }\n else {\n this.getCompletionsForExpression(node, result);\n }\n }\n else if (node instanceof nodes.SimpleSelector) {\n const parentRef = node.findAParent(nodes.NodeType.ExtendsReference, nodes.NodeType.Ruleset);\n if (parentRef) {\n if (parentRef.type === nodes.NodeType.ExtendsReference) {\n this.getCompletionsForExtendsReference(parentRef, node, result);\n }\n else {\n const parentRuleSet = parentRef;\n this.getCompletionsForSelector(parentRuleSet, parentRuleSet && parentRuleSet.isNested(), result);\n }\n }\n }\n else if (node instanceof nodes.FunctionArgument) {\n this.getCompletionsForFunctionArgument(node, node.getParent(), result);\n }\n else if (node instanceof nodes.Declarations) {\n this.getCompletionsForDeclarations(node, result);\n }\n else if (node instanceof nodes.VariableDeclaration) {\n this.getCompletionsForVariableDeclaration(node, result);\n }\n else if (node instanceof nodes.RuleSet) {\n this.getCompletionsForRuleSet(node, result);\n }\n else if (node instanceof nodes.Interpolation) {\n this.getCompletionsForInterpolation(node, result);\n }\n else if (node instanceof nodes.FunctionDeclaration) {\n this.getCompletionsForFunctionDeclaration(node, result);\n }\n else if (node instanceof nodes.MixinReference) {\n this.getCompletionsForMixinReference(node, result);\n }\n else if (node instanceof nodes.Function) {\n this.getCompletionsForFunctionArgument(null, node, result);\n }\n else if (node instanceof nodes.Supports) {\n this.getCompletionsForSupports(node, result);\n }\n else if (node instanceof nodes.SupportsCondition) {\n this.getCompletionsForSupportsCondition(node, result);\n }\n else if (node instanceof nodes.ExtendsReference) {\n this.getCompletionsForExtendsReference(node, null, result);\n }\n else if (node.type === nodes.NodeType.URILiteral) {\n this.getCompletionForUriLiteralValue(node, result);\n }\n else if (node.parent === null) {\n this.getCompletionForTopLevel(result);\n }\n else if (node.type === nodes.NodeType.StringLiteral && this.isImportPathParent(node.parent.type)) {\n this.getCompletionForImportPath(node, result);\n // } else if (node instanceof nodes.Variable) {\n // this.getCompletionsForVariableDeclaration()\n }\n else {\n continue;\n }\n if (result.items.length > 0 || this.offset > node.offset) {\n return this.finalize(result);\n }\n }\n this.getCompletionsForStylesheet(result);\n if (result.items.length === 0) {\n if (this.variablePrefix && this.currentWord.indexOf(this.variablePrefix) === 0) {\n this.getVariableProposals(null, result);\n }\n }\n return this.finalize(result);\n }\n finally {\n // don't hold on any state, clear symbolContext\n this.position = null;\n this.currentWord = null;\n this.textDocument = null;\n this.styleSheet = null;\n this.symbolContext = null;\n this.defaultReplaceRange = null;\n this.nodePath = null;\n }\n }\n isImportPathParent(type) {\n return type === nodes.NodeType.Import;\n }\n finalize(result) {\n return result;\n }\n findInNodePath(...types) {\n for (let i = this.nodePath.length - 1; i >= 0; i--) {\n const node = this.nodePath[i];\n if (types.indexOf(node.type) !== -1) {\n return node;\n }\n }\n return null;\n }\n getCompletionsForDeclarationProperty(declaration, result) {\n return this.getPropertyProposals(declaration, result);\n }\n getPropertyProposals(declaration, result) {\n const triggerPropertyValueCompletion = this.isTriggerPropertyValueCompletionEnabled;\n const completePropertyWithSemicolon = this.isCompletePropertyWithSemicolonEnabled;\n const properties = this.cssDataManager.getProperties();\n properties.forEach(entry => {\n let range;\n let insertText;\n let retrigger = false;\n if (declaration) {\n range = this.getCompletionRange(declaration.getProperty());\n insertText = entry.name;\n if (!isDefined(declaration.colonPosition)) {\n insertText += ': ';\n retrigger = true;\n }\n }\n else {\n range = this.getCompletionRange(null);\n insertText = entry.name + ': ';\n retrigger = true;\n }\n // Empty .selector { | } case\n if (!declaration && completePropertyWithSemicolon) {\n insertText += '$0;';\n }\n // Cases such as .selector { p; } or .selector { p:; }\n if (declaration && !declaration.semicolonPosition) {\n if (completePropertyWithSemicolon && this.offset >= this.textDocument.offsetAt(range.end)) {\n insertText += '$0;';\n }\n }\n const item = {\n label: entry.name,\n documentation: languageFacts.getEntryDescription(entry, this.doesSupportMarkdown()),\n tags: isDeprecated(entry) ? [CompletionItemTag.Deprecated] : [],\n textEdit: TextEdit.replace(range, insertText),\n insertTextFormat: InsertTextFormat.Snippet,\n kind: CompletionItemKind.Property\n };\n if (!entry.restrictions) {\n retrigger = false;\n }\n if (triggerPropertyValueCompletion && retrigger) {\n item.command = retriggerCommand;\n }\n const relevance = typeof entry.relevance === 'number' ? Math.min(Math.max(entry.relevance, 0), 99) : 50;\n const sortTextSuffix = (255 - relevance).toString(16);\n const sortTextPrefix = strings.startsWith(entry.name, '-') ? SortTexts.VendorPrefixed : SortTexts.Normal;\n item.sortText = sortTextPrefix + '_' + sortTextSuffix;\n result.items.push(item);\n });\n this.completionParticipants.forEach(participant => {\n if (participant.onCssProperty) {\n participant.onCssProperty({\n propertyName: this.currentWord,\n range: this.defaultReplaceRange\n });\n }\n });\n return result;\n }\n get isTriggerPropertyValueCompletionEnabled() {\n return this.documentSettings?.triggerPropertyValueCompletion ?? true;\n }\n get isCompletePropertyWithSemicolonEnabled() {\n return this.documentSettings?.completePropertyWithSemicolon ?? true;\n }\n getCompletionsForDeclarationValue(node, result) {\n const propertyName = node.getFullPropertyName();\n const entry = this.cssDataManager.getProperty(propertyName);\n let existingNode = node.getValue() || null;\n while (existingNode && existingNode.hasChildren()) {\n existingNode = existingNode.findChildAtOffset(this.offset, false);\n }\n this.completionParticipants.forEach(participant => {\n if (participant.onCssPropertyValue) {\n participant.onCssPropertyValue({\n propertyName,\n propertyValue: this.currentWord,\n range: this.getCompletionRange(existingNode)\n });\n }\n });\n if (entry) {\n if (entry.restrictions) {\n for (const restriction of entry.restrictions) {\n switch (restriction) {\n case 'color':\n this.getColorProposals(entry, existingNode, result);\n break;\n case 'position':\n this.getPositionProposals(entry, existingNode, result);\n break;\n case 'repeat':\n this.getRepeatStyleProposals(entry, existingNode, result);\n break;\n case 'line-style':\n this.getLineStyleProposals(entry, existingNode, result);\n break;\n case 'line-width':\n this.getLineWidthProposals(entry, existingNode, result);\n break;\n case 'geometry-box':\n this.getGeometryBoxProposals(entry, existingNode, result);\n break;\n case 'box':\n this.getBoxProposals(entry, existingNode, result);\n break;\n case 'image':\n this.getImageProposals(entry, existingNode, result);\n break;\n case 'timing-function':\n this.getTimingFunctionProposals(entry, existingNode, result);\n break;\n case 'shape':\n this.getBasicShapeProposals(entry, existingNode, result);\n break;\n }\n }\n }\n this.getValueEnumProposals(entry, existingNode, result);\n this.getCSSWideKeywordProposals(entry, existingNode, result);\n this.getUnitProposals(entry, existingNode, result);\n }\n else {\n const existingValues = collectValues(this.styleSheet, node);\n for (const existingValue of existingValues.getEntries()) {\n result.items.push({\n label: existingValue,\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), existingValue),\n kind: CompletionItemKind.Value\n });\n }\n }\n this.getVariableProposals(existingNode, result);\n this.getTermProposals(entry, existingNode, result);\n return result;\n }\n getValueEnumProposals(entry, existingNode, result) {\n if (entry.values) {\n for (const value of entry.values) {\n let insertString = value.name;\n let insertTextFormat;\n if (strings.endsWith(insertString, ')')) {\n const from = insertString.lastIndexOf('(');\n if (from !== -1) {\n insertString = insertString.substring(0, from + 1) + '$1' + insertString.substring(from + 1);\n insertTextFormat = SnippetFormat;\n }\n }\n let sortText = SortTexts.Enums;\n if (strings.startsWith(value.name, '-')) {\n sortText += SortTexts.VendorPrefixed;\n }\n const item = {\n label: value.name,\n documentation: languageFacts.getEntryDescription(value, this.doesSupportMarkdown()),\n tags: isDeprecated(entry) ? [CompletionItemTag.Deprecated] : [],\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), insertString),\n sortText,\n kind: CompletionItemKind.Value,\n insertTextFormat\n };\n result.items.push(item);\n }\n }\n return result;\n }\n getCSSWideKeywordProposals(entry, existingNode, result) {\n for (const keywords in languageFacts.cssWideKeywords) {\n result.items.push({\n label: keywords,\n documentation: languageFacts.cssWideKeywords[keywords],\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), keywords),\n kind: CompletionItemKind.Value\n });\n }\n for (const func in languageFacts.cssWideFunctions) {\n const insertText = moveCursorInsideParenthesis(func);\n result.items.push({\n label: func,\n documentation: languageFacts.cssWideFunctions[func],\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), insertText),\n kind: CompletionItemKind.Function,\n insertTextFormat: SnippetFormat,\n command: strings.startsWith(func, 'var') ? retriggerCommand : undefined\n });\n }\n return result;\n }\n getCompletionsForInterpolation(node, result) {\n if (this.offset >= node.offset + 2) {\n this.getVariableProposals(null, result);\n }\n return result;\n }\n getVariableProposals(existingNode, result) {\n const symbols = this.getSymbolContext().findSymbolsAtOffset(this.offset, nodes.ReferenceType.Variable);\n for (const symbol of symbols) {\n const insertText = strings.startsWith(symbol.name, '--') ? `var(${symbol.name})` : symbol.name;\n const completionItem = {\n label: symbol.name,\n documentation: symbol.value ? strings.getLimitedString(symbol.value) : symbol.value,\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), insertText),\n kind: CompletionItemKind.Variable,\n sortText: SortTexts.Variable\n };\n if (typeof completionItem.documentation === 'string' && isColorString(completionItem.documentation)) {\n completionItem.kind = CompletionItemKind.Color;\n }\n if (symbol.node.type === nodes.NodeType.FunctionParameter) {\n const mixinNode = (symbol.node.getParent());\n if (mixinNode.type === nodes.NodeType.MixinDeclaration) {\n completionItem.detail = l10n.t('argument from \\'{0}\\'', mixinNode.getName());\n }\n }\n result.items.push(completionItem);\n }\n return result;\n }\n getVariableProposalsForCSSVarFunction(result) {\n const allReferencedVariables = new Set();\n this.styleSheet.acceptVisitor(new VariableCollector(allReferencedVariables, this.offset));\n let symbols = this.getSymbolContext().findSymbolsAtOffset(this.offset, nodes.ReferenceType.Variable);\n for (const symbol of symbols) {\n if (strings.startsWith(symbol.name, '--')) {\n const completionItem = {\n label: symbol.name,\n documentation: symbol.value ? strings.getLimitedString(symbol.value) : symbol.value,\n textEdit: TextEdit.replace(this.getCompletionRange(null), symbol.name),\n kind: CompletionItemKind.Variable\n };\n if (typeof completionItem.documentation === 'string' && isColorString(completionItem.documentation)) {\n completionItem.kind = CompletionItemKind.Color;\n }\n result.items.push(completionItem);\n }\n allReferencedVariables.remove(symbol.name);\n }\n for (const name of allReferencedVariables.getEntries()) {\n if (strings.startsWith(name, '--')) {\n const completionItem = {\n label: name,\n textEdit: TextEdit.replace(this.getCompletionRange(null), name),\n kind: CompletionItemKind.Variable\n };\n result.items.push(completionItem);\n }\n }\n return result;\n }\n getUnitProposals(entry, existingNode, result) {\n let currentWord = '0';\n if (this.currentWord.length > 0) {\n const numMatch = this.currentWord.match(/^-?\\d[\\.\\d+]*/);\n if (numMatch) {\n currentWord = numMatch[0];\n result.isIncomplete = currentWord.length === this.currentWord.length;\n }\n }\n else if (this.currentWord.length === 0) {\n result.isIncomplete = true;\n }\n if (existingNode && existingNode.parent && existingNode.parent.type === nodes.NodeType.Term) {\n existingNode = existingNode.getParent(); // include the unary operator\n }\n if (entry.restrictions) {\n for (const restriction of entry.restrictions) {\n const units = languageFacts.units[restriction];\n if (units) {\n for (const unit of units) {\n const insertText = currentWord + unit;\n result.items.push({\n label: insertText,\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), insertText),\n kind: CompletionItemKind.Unit\n });\n }\n }\n }\n }\n return result;\n }\n getCompletionRange(existingNode) {\n if (existingNode && existingNode.offset <= this.offset && this.offset <= existingNode.end) {\n const end = existingNode.end !== -1 ? this.textDocument.positionAt(existingNode.end) : this.position;\n const start = this.textDocument.positionAt(existingNode.offset);\n if (start.line === end.line) {\n return Range.create(start, end); // multi line edits are not allowed\n }\n }\n return this.defaultReplaceRange;\n }\n getColorProposals(entry, existingNode, result) {\n for (const color in languageFacts.colors) {\n result.items.push({\n label: color,\n documentation: languageFacts.colors[color],\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), color),\n kind: CompletionItemKind.Color\n });\n }\n for (const color in languageFacts.colorKeywords) {\n result.items.push({\n label: color,\n documentation: languageFacts.colorKeywords[color],\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), color),\n kind: CompletionItemKind.Value\n });\n }\n const colorValues = new Set();\n this.styleSheet.acceptVisitor(new ColorValueCollector(colorValues, this.offset));\n for (const color of colorValues.getEntries()) {\n result.items.push({\n label: color,\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), color),\n kind: CompletionItemKind.Color\n });\n }\n for (const p of languageFacts.colorFunctions) {\n let tabStop = 1;\n const replaceFunction = (_match, p1) => '${' + tabStop++ + ':' + p1 + '}';\n const insertText = p.func.replace(/\\[?\\$(\\w+)\\]?/g, replaceFunction);\n result.items.push({\n label: p.func.substr(0, p.func.indexOf('(')),\n detail: p.func,\n documentation: p.desc,\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), insertText),\n insertTextFormat: SnippetFormat,\n kind: CompletionItemKind.Function\n });\n }\n return result;\n }\n getPositionProposals(entry, existingNode, result) {\n for (const position in languageFacts.positionKeywords) {\n result.items.push({\n label: position,\n documentation: languageFacts.positionKeywords[position],\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), position),\n kind: CompletionItemKind.Value\n });\n }\n return result;\n }\n getRepeatStyleProposals(entry, existingNode, result) {\n for (const repeat in languageFacts.repeatStyleKeywords) {\n result.items.push({\n label: repeat,\n documentation: languageFacts.repeatStyleKeywords[repeat],\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), repeat),\n kind: CompletionItemKind.Value\n });\n }\n return result;\n }\n getLineStyleProposals(entry, existingNode, result) {\n for (const lineStyle in languageFacts.lineStyleKeywords) {\n result.items.push({\n label: lineStyle,\n documentation: languageFacts.lineStyleKeywords[lineStyle],\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), lineStyle),\n kind: CompletionItemKind.Value\n });\n }\n return result;\n }\n getLineWidthProposals(entry, existingNode, result) {\n for (const lineWidth of languageFacts.lineWidthKeywords) {\n result.items.push({\n label: lineWidth,\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), lineWidth),\n kind: CompletionItemKind.Value\n });\n }\n return result;\n }\n getGeometryBoxProposals(entry, existingNode, result) {\n for (const box in languageFacts.geometryBoxKeywords) {\n result.items.push({\n label: box,\n documentation: languageFacts.geometryBoxKeywords[box],\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), box),\n kind: CompletionItemKind.Value\n });\n }\n return result;\n }\n getBoxProposals(entry, existingNode, result) {\n for (const box in languageFacts.boxKeywords) {\n result.items.push({\n label: box,\n documentation: languageFacts.boxKeywords[box],\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), box),\n kind: CompletionItemKind.Value\n });\n }\n return result;\n }\n getImageProposals(entry, existingNode, result) {\n for (const image in languageFacts.imageFunctions) {\n const insertText = moveCursorInsideParenthesis(image);\n result.items.push({\n label: image,\n documentation: languageFacts.imageFunctions[image],\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), insertText),\n kind: CompletionItemKind.Function,\n insertTextFormat: image !== insertText ? SnippetFormat : void 0\n });\n }\n return result;\n }\n getTimingFunctionProposals(entry, existingNode, result) {\n for (const timing in languageFacts.transitionTimingFunctions) {\n const insertText = moveCursorInsideParenthesis(timing);\n result.items.push({\n label: timing,\n documentation: languageFacts.transitionTimingFunctions[timing],\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), insertText),\n kind: CompletionItemKind.Function,\n insertTextFormat: timing !== insertText ? SnippetFormat : void 0\n });\n }\n return result;\n }\n getBasicShapeProposals(entry, existingNode, result) {\n for (const shape in languageFacts.basicShapeFunctions) {\n const insertText = moveCursorInsideParenthesis(shape);\n result.items.push({\n label: shape,\n documentation: languageFacts.basicShapeFunctions[shape],\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), insertText),\n kind: CompletionItemKind.Function,\n insertTextFormat: shape !== insertText ? SnippetFormat : void 0\n });\n }\n return result;\n }\n getCompletionsForStylesheet(result) {\n const node = this.styleSheet.findFirstChildBeforeOffset(this.offset);\n if (!node) {\n return this.getCompletionForTopLevel(result);\n }\n if (node instanceof nodes.RuleSet) {\n return this.getCompletionsForRuleSet(node, result);\n }\n if (node instanceof nodes.Supports) {\n return this.getCompletionsForSupports(node, result);\n }\n return result;\n }\n getCompletionForTopLevel(result) {\n this.cssDataManager.getAtDirectives().forEach(entry => {\n result.items.push({\n label: entry.name,\n textEdit: TextEdit.replace(this.getCompletionRange(null), entry.name),\n documentation: languageFacts.getEntryDescription(entry, this.doesSupportMarkdown()),\n tags: isDeprecated(entry) ? [CompletionItemTag.Deprecated] : [],\n kind: CompletionItemKind.Keyword\n });\n });\n this.getCompletionsForSelector(null, false, result);\n return result;\n }\n getCompletionsForRuleSet(ruleSet, result) {\n const declarations = ruleSet.getDeclarations();\n const isAfter = declarations && declarations.endsWith('}') && this.offset >= declarations.end;\n if (isAfter) {\n return this.getCompletionForTopLevel(result);\n }\n const isInSelectors = !declarations || this.offset <= declarations.offset;\n if (isInSelectors) {\n return this.getCompletionsForSelector(ruleSet, ruleSet.isNested(), result);\n }\n return this.getCompletionsForDeclarations(ruleSet.getDeclarations(), result);\n }\n getCompletionsForSelector(ruleSet, isNested, result) {\n const existingNode = this.findInNodePath(nodes.NodeType.PseudoSelector, nodes.NodeType.IdentifierSelector, nodes.NodeType.ClassSelector, nodes.NodeType.ElementNameSelector);\n if (!existingNode && this.hasCharacterAtPosition(this.offset - this.currentWord.length - 1, ':')) {\n // after the ':' of a pseudo selector, no node generated for just ':'\n this.currentWord = ':' + this.currentWord;\n if (this.hasCharacterAtPosition(this.offset - this.currentWord.length - 1, ':')) {\n this.currentWord = ':' + this.currentWord; // for '::'\n }\n this.defaultReplaceRange = Range.create(Position.create(this.position.line, this.position.character - this.currentWord.length), this.position);\n }\n const pseudoClasses = this.cssDataManager.getPseudoClasses();\n pseudoClasses.forEach(entry => {\n const insertText = moveCursorInsideParenthesis(entry.name);\n const item = {\n label: entry.name,\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), insertText),\n documentation: languageFacts.getEntryDescription(entry, this.doesSupportMarkdown()),\n tags: isDeprecated(entry) ? [CompletionItemTag.Deprecated] : [],\n kind: CompletionItemKind.Function,\n insertTextFormat: entry.name !== insertText ? SnippetFormat : void 0\n };\n if (strings.startsWith(entry.name, ':-')) {\n item.sortText = SortTexts.VendorPrefixed;\n }\n result.items.push(item);\n });\n const pseudoElements = this.cssDataManager.getPseudoElements();\n pseudoElements.forEach(entry => {\n const insertText = moveCursorInsideParenthesis(entry.name);\n const item = {\n label: entry.name,\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), insertText),\n documentation: languageFacts.getEntryDescription(entry, this.doesSupportMarkdown()),\n tags: isDeprecated(entry) ? [CompletionItemTag.Deprecated] : [],\n kind: CompletionItemKind.Function,\n insertTextFormat: entry.name !== insertText ? SnippetFormat : void 0\n };\n if (strings.startsWith(entry.name, '::-')) {\n item.sortText = SortTexts.VendorPrefixed;\n }\n result.items.push(item);\n });\n if (!isNested) { // show html tags only for top level\n for (const entry of languageFacts.html5Tags) {\n result.items.push({\n label: entry,\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), entry),\n kind: CompletionItemKind.Keyword\n });\n }\n for (const entry of languageFacts.svgElements) {\n result.items.push({\n label: entry,\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), entry),\n kind: CompletionItemKind.Keyword\n });\n }\n }\n const visited = {};\n visited[this.currentWord] = true;\n const docText = this.textDocument.getText();\n this.styleSheet.accept(n => {\n if (n.type === nodes.NodeType.SimpleSelector && n.length > 0) {\n const selector = docText.substr(n.offset, n.length);\n if (selector.charAt(0) === '.' && !visited[selector]) {\n visited[selector] = true;\n result.items.push({\n label: selector,\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), selector),\n kind: CompletionItemKind.Keyword\n });\n }\n return false;\n }\n return true;\n });\n if (ruleSet && ruleSet.isNested()) {\n const selector = ruleSet.getSelectors().findFirstChildBeforeOffset(this.offset);\n if (selector && ruleSet.getSelectors().getChildren().indexOf(selector) === 0) {\n this.getPropertyProposals(null, result);\n }\n }\n return result;\n }\n getCompletionsForDeclarations(declarations, result) {\n if (!declarations || this.offset === declarations.offset) { // incomplete nodes\n return result;\n }\n const node = declarations.findFirstChildBeforeOffset(this.offset);\n if (!node) {\n return this.getCompletionsForDeclarationProperty(null, result);\n }\n if (node instanceof nodes.AbstractDeclaration) {\n const declaration = node;\n if (!isDefined(declaration.colonPosition) || this.offset <= declaration.colonPosition) {\n // complete property\n return this.getCompletionsForDeclarationProperty(declaration, result);\n }\n else if ((isDefined(declaration.semicolonPosition) && declaration.semicolonPosition < this.offset)) {\n if (this.offset === declaration.semicolonPosition + 1) {\n return result; // don't show new properties right after semicolon (see Bug 15421:[intellisense] [css] Be less aggressive when manually typing CSS)\n }\n // complete next property\n return this.getCompletionsForDeclarationProperty(null, result);\n }\n if (declaration instanceof nodes.Declaration) {\n // complete value\n return this.getCompletionsForDeclarationValue(declaration, result);\n }\n }\n else if (node instanceof nodes.ExtendsReference) {\n this.getCompletionsForExtendsReference(node, null, result);\n }\n else if (this.currentWord && this.currentWord[0] === '@') {\n this.getCompletionsForDeclarationProperty(null, result);\n }\n else if (node instanceof nodes.RuleSet) {\n this.getCompletionsForDeclarationProperty(null, result);\n }\n return result;\n }\n getCompletionsForVariableDeclaration(declaration, result) {\n if (this.offset && isDefined(declaration.colonPosition) && this.offset > declaration.colonPosition) {\n this.getVariableProposals(declaration.getValue() || null, result);\n }\n return result;\n }\n getCompletionsForExpression(expression, result) {\n const parent = expression.getParent();\n if (parent instanceof nodes.FunctionArgument) {\n this.getCompletionsForFunctionArgument(parent, parent.getParent(), result);\n return result;\n }\n const declaration = expression.findParent(nodes.NodeType.Declaration);\n if (!declaration) {\n this.getTermProposals(undefined, null, result);\n return result;\n }\n const node = expression.findChildAtOffset(this.offset, true);\n if (!node) {\n return this.getCompletionsForDeclarationValue(declaration, result);\n }\n if (node instanceof nodes.NumericValue || node instanceof nodes.Identifier) {\n return this.getCompletionsForDeclarationValue(declaration, result);\n }\n return result;\n }\n getCompletionsForFunctionArgument(arg, func, result) {\n const identifier = func.getIdentifier();\n if (identifier && identifier.matches('var')) {\n if (!func.getArguments().hasChildren() || func.getArguments().getChild(0) === arg) {\n this.getVariableProposalsForCSSVarFunction(result);\n }\n }\n return result;\n }\n getCompletionsForFunctionDeclaration(decl, result) {\n const declarations = decl.getDeclarations();\n if (declarations && this.offset > declarations.offset && this.offset < declarations.end) {\n this.getTermProposals(undefined, null, result);\n }\n return result;\n }\n getCompletionsForMixinReference(ref, result) {\n const allMixins = this.getSymbolContext().findSymbolsAtOffset(this.offset, nodes.ReferenceType.Mixin);\n for (const mixinSymbol of allMixins) {\n if (mixinSymbol.node instanceof nodes.MixinDeclaration) {\n result.items.push(this.makeTermProposal(mixinSymbol, mixinSymbol.node.getParameters(), null));\n }\n }\n const identifierNode = ref.getIdentifier() || null;\n this.completionParticipants.forEach(participant => {\n if (participant.onCssMixinReference) {\n participant.onCssMixinReference({\n mixinName: this.currentWord,\n range: this.getCompletionRange(identifierNode)\n });\n }\n });\n return result;\n }\n getTermProposals(entry, existingNode, result) {\n const allFunctions = this.getSymbolContext().findSymbolsAtOffset(this.offset, nodes.ReferenceType.Function);\n for (const functionSymbol of allFunctions) {\n if (functionSymbol.node instanceof nodes.FunctionDeclaration) {\n result.items.push(this.makeTermProposal(functionSymbol, functionSymbol.node.getParameters(), existingNode));\n }\n }\n return result;\n }\n makeTermProposal(symbol, parameters, existingNode) {\n const decl = symbol.node;\n const params = parameters.getChildren().map((c) => {\n return (c instanceof nodes.FunctionParameter) ? c.getName() : c.getText();\n });\n const insertText = symbol.name + '(' + params.map((p, index) => '${' + (index + 1) + ':' + p + '}').join(', ') + ')';\n return {\n label: symbol.name,\n detail: symbol.name + '(' + params.join(', ') + ')',\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), insertText),\n insertTextFormat: SnippetFormat,\n kind: CompletionItemKind.Function,\n sortText: SortTexts.Term\n };\n }\n getCompletionsForSupportsCondition(supportsCondition, result) {\n const child = supportsCondition.findFirstChildBeforeOffset(this.offset);\n if (child) {\n if (child instanceof nodes.Declaration) {\n if (!isDefined(child.colonPosition) || this.offset <= child.colonPosition) {\n return this.getCompletionsForDeclarationProperty(child, result);\n }\n else {\n return this.getCompletionsForDeclarationValue(child, result);\n }\n }\n else if (child instanceof nodes.SupportsCondition) {\n return this.getCompletionsForSupportsCondition(child, result);\n }\n }\n if (isDefined(supportsCondition.lParent) && this.offset > supportsCondition.lParent && (!isDefined(supportsCondition.rParent) || this.offset <= supportsCondition.rParent)) {\n return this.getCompletionsForDeclarationProperty(null, result);\n }\n return result;\n }\n getCompletionsForSupports(supports, result) {\n const declarations = supports.getDeclarations();\n const inInCondition = !declarations || this.offset <= declarations.offset;\n if (inInCondition) {\n const child = supports.findFirstChildBeforeOffset(this.offset);\n if (child instanceof nodes.SupportsCondition) {\n return this.getCompletionsForSupportsCondition(child, result);\n }\n return result;\n }\n return this.getCompletionForTopLevel(result);\n }\n getCompletionsForExtendsReference(extendsRef, existingNode, result) {\n return result;\n }\n getCompletionForUriLiteralValue(uriLiteralNode, result) {\n let uriValue;\n let position;\n let range;\n // No children, empty value\n if (!uriLiteralNode.hasChildren()) {\n uriValue = '';\n position = this.position;\n const emptyURIValuePosition = this.textDocument.positionAt(uriLiteralNode.offset + 'url('.length);\n range = Range.create(emptyURIValuePosition, emptyURIValuePosition);\n }\n else {\n const uriValueNode = uriLiteralNode.getChild(0);\n uriValue = uriValueNode.getText();\n position = this.position;\n range = this.getCompletionRange(uriValueNode);\n }\n this.completionParticipants.forEach(participant => {\n if (participant.onCssURILiteralValue) {\n participant.onCssURILiteralValue({\n uriValue,\n position,\n range\n });\n }\n });\n return result;\n }\n getCompletionForImportPath(importPathNode, result) {\n this.completionParticipants.forEach(participant => {\n if (participant.onCssImportPath) {\n participant.onCssImportPath({\n pathValue: importPathNode.getText(),\n position: this.position,\n range: this.getCompletionRange(importPathNode)\n });\n }\n });\n return result;\n }\n hasCharacterAtPosition(offset, char) {\n const text = this.textDocument.getText();\n return (offset >= 0 && offset < text.length) && text.charAt(offset) === char;\n }\n doesSupportMarkdown() {\n if (!isDefined(this.supportsMarkdown)) {\n if (!isDefined(this.lsOptions.clientCapabilities)) {\n this.supportsMarkdown = true;\n return this.supportsMarkdown;\n }\n const documentationFormat = this.lsOptions.clientCapabilities.textDocument?.completion?.completionItem?.documentationFormat;\n this.supportsMarkdown = Array.isArray(documentationFormat) && documentationFormat.indexOf(MarkupKind.Markdown) !== -1;\n }\n return this.supportsMarkdown;\n }\n}\nfunction isDeprecated(entry) {\n if (entry.status && (entry.status === 'nonstandard' || entry.status === 'obsolete')) {\n return true;\n }\n return false;\n}\nclass Set {\n constructor() {\n this.entries = {};\n }\n add(entry) {\n this.entries[entry] = true;\n }\n remove(entry) {\n delete this.entries[entry];\n }\n getEntries() {\n return Object.keys(this.entries);\n }\n}\nfunction moveCursorInsideParenthesis(text) {\n return text.replace(/\\(\\)$/, \"($1)\");\n}\nfunction collectValues(styleSheet, declaration) {\n const fullPropertyName = declaration.getFullPropertyName();\n const entries = new Set();\n function visitValue(node) {\n if (node instanceof nodes.Identifier || node instanceof nodes.NumericValue || node instanceof nodes.HexColorValue) {\n entries.add(node.getText());\n }\n return true;\n }\n function matchesProperty(decl) {\n const propertyName = decl.getFullPropertyName();\n return fullPropertyName === propertyName;\n }\n function vistNode(node) {\n if (node instanceof nodes.Declaration && node !== declaration) {\n if (matchesProperty(node)) {\n const value = node.getValue();\n if (value) {\n value.accept(visitValue);\n }\n }\n }\n return true;\n }\n styleSheet.accept(vistNode);\n return entries;\n}\nclass ColorValueCollector {\n constructor(entries, currentOffset) {\n this.entries = entries;\n this.currentOffset = currentOffset;\n // nothing to do\n }\n visitNode(node) {\n if (node instanceof nodes.HexColorValue || (node instanceof nodes.Function && languageFacts.isColorConstructor(node))) {\n if (this.currentOffset < node.offset || node.end < this.currentOffset) {\n this.entries.add(node.getText());\n }\n }\n return true;\n }\n}\nclass VariableCollector {\n constructor(entries, currentOffset) {\n this.entries = entries;\n this.currentOffset = currentOffset;\n // nothing to do\n }\n visitNode(node) {\n if (node instanceof nodes.Identifier && node.isCustomProperty) {\n if (this.currentOffset < node.offset || node.end < this.currentOffset) {\n this.entries.add(node.getText());\n }\n }\n return true;\n }\n}\nfunction getCurrentWord(document, offset) {\n let i = offset - 1;\n const text = document.getText();\n while (i >= 0 && ' \\t\\n\\r\":{[()]},*>+'.indexOf(text.charAt(i)) === -1) {\n i--;\n }\n return text.substring(i + 1, offset);\n}\nfunction isColorString(s) {\n // From https://stackoverflow.com/questions/8027423/how-to-check-if-a-string-is-a-valid-hex-color-representation/8027444\n return (s.toLowerCase() in languageFacts.colors) || /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(s);\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport * as nodes from '../parser/cssNodes';\nimport { Scanner } from '../parser/cssScanner';\nimport * as l10n from '@vscode/l10n';\nexport class Element {\n constructor() {\n this.parent = null;\n this.children = null;\n this.attributes = null;\n }\n findAttribute(name) {\n if (this.attributes) {\n for (const attribute of this.attributes) {\n if (attribute.name === name) {\n return attribute.value;\n }\n }\n }\n return null;\n }\n addChild(child) {\n if (child instanceof Element) {\n child.parent = this;\n }\n if (!this.children) {\n this.children = [];\n }\n this.children.push(child);\n }\n append(text) {\n if (this.attributes) {\n const last = this.attributes[this.attributes.length - 1];\n last.value = last.value + text;\n }\n }\n prepend(text) {\n if (this.attributes) {\n const first = this.attributes[0];\n first.value = text + first.value;\n }\n }\n findRoot() {\n let curr = this;\n while (curr.parent && !(curr.parent instanceof RootElement)) {\n curr = curr.parent;\n }\n return curr;\n }\n removeChild(child) {\n if (this.children) {\n const index = this.children.indexOf(child);\n if (index !== -1) {\n this.children.splice(index, 1);\n return true;\n }\n }\n return false;\n }\n addAttr(name, value) {\n if (!this.attributes) {\n this.attributes = [];\n }\n for (const attribute of this.attributes) {\n if (attribute.name === name) {\n attribute.value += ' ' + value;\n return;\n }\n }\n this.attributes.push({ name, value });\n }\n clone(cloneChildren = true) {\n const elem = new Element();\n if (this.attributes) {\n elem.attributes = [];\n for (const attribute of this.attributes) {\n elem.addAttr(attribute.name, attribute.value);\n }\n }\n if (cloneChildren && this.children) {\n elem.children = [];\n for (let index = 0; index < this.children.length; index++) {\n elem.addChild(this.children[index].clone());\n }\n }\n return elem;\n }\n cloneWithParent() {\n const clone = this.clone(false);\n if (this.parent && !(this.parent instanceof RootElement)) {\n const parentClone = this.parent.cloneWithParent();\n parentClone.addChild(clone);\n }\n return clone;\n }\n}\nexport class RootElement extends Element {\n}\nexport class LabelElement extends Element {\n constructor(label) {\n super();\n this.addAttr('name', label);\n }\n}\nclass MarkedStringPrinter {\n constructor(quote) {\n this.quote = quote;\n this.result = [];\n // empty\n }\n print(element) {\n this.result = [];\n if (element instanceof RootElement) {\n if (element.children) {\n this.doPrint(element.children, 0);\n }\n }\n else {\n this.doPrint([element], 0);\n }\n const value = this.result.join('\\n');\n return [{ language: 'html', value }];\n }\n doPrint(elements, indent) {\n for (const element of elements) {\n this.doPrintElement(element, indent);\n if (element.children) {\n this.doPrint(element.children, indent + 1);\n }\n }\n }\n writeLine(level, content) {\n const indent = new Array(level + 1).join(' ');\n this.result.push(indent + content);\n }\n doPrintElement(element, indent) {\n const name = element.findAttribute('name');\n // special case: a simple label\n if (element instanceof LabelElement || name === '\\u2026') {\n this.writeLine(indent, name);\n return;\n }\n // the real deal\n const content = ['<'];\n // element name\n if (name) {\n content.push(name);\n }\n else {\n content.push('element');\n }\n // attributes\n if (element.attributes) {\n for (const attr of element.attributes) {\n if (attr.name !== 'name') {\n content.push(' ');\n content.push(attr.name);\n const value = attr.value;\n if (value) {\n content.push('=');\n content.push(quotes.ensure(value, this.quote));\n }\n }\n }\n }\n content.push('>');\n this.writeLine(indent, content.join(''));\n }\n}\nvar quotes;\n(function (quotes) {\n function ensure(value, which) {\n return which + remove(value) + which;\n }\n quotes.ensure = ensure;\n function remove(value) {\n const match = value.match(/^['\"](.*)[\"']$/);\n if (match) {\n return match[1];\n }\n return value;\n }\n quotes.remove = remove;\n})(quotes || (quotes = {}));\nclass Specificity {\n constructor() {\n /** Count of identifiers (e.g., `#app`) */\n this.id = 0;\n /** Count of attributes (`[type=\"number\"]`), classes (`.container-fluid`), and pseudo-classes (`:hover`) */\n this.attr = 0;\n /** Count of tag names (`div`), and pseudo-elements (`::before`) */\n this.tag = 0;\n }\n}\nexport function toElement(node, parentElement) {\n let result = new Element();\n for (const child of node.getChildren()) {\n switch (child.type) {\n case nodes.NodeType.SelectorCombinator:\n if (parentElement) {\n const segments = child.getText().split('&');\n if (segments.length === 1) {\n // should not happen\n result.addAttr('name', segments[0]);\n break;\n }\n result = parentElement.cloneWithParent();\n if (segments[0]) {\n const root = result.findRoot();\n root.prepend(segments[0]);\n }\n for (let i = 1; i < segments.length; i++) {\n if (i > 1) {\n const clone = parentElement.cloneWithParent();\n result.addChild(clone.findRoot());\n result = clone;\n }\n result.append(segments[i]);\n }\n }\n break;\n case nodes.NodeType.SelectorPlaceholder:\n if (child.matches('@at-root')) {\n return result;\n }\n // fall through\n case nodes.NodeType.ElementNameSelector:\n const text = child.getText();\n result.addAttr('name', text === '*' ? 'element' : unescape(text));\n break;\n case nodes.NodeType.ClassSelector:\n result.addAttr('class', unescape(child.getText().substring(1)));\n break;\n case nodes.NodeType.IdentifierSelector:\n result.addAttr('id', unescape(child.getText().substring(1)));\n break;\n case nodes.NodeType.MixinDeclaration:\n result.addAttr('class', child.getName());\n break;\n case nodes.NodeType.PseudoSelector:\n result.addAttr(unescape(child.getText()), '');\n break;\n case nodes.NodeType.AttributeSelector:\n const selector = child;\n const identifier = selector.getIdentifier();\n if (identifier) {\n const expression = selector.getValue();\n const operator = selector.getOperator();\n let value;\n if (expression && operator) {\n switch (unescape(operator.getText())) {\n case '|=':\n // excatly or followed by -words\n value = `${quotes.remove(unescape(expression.getText()))}-\\u2026`;\n break;\n case '^=':\n // prefix\n value = `${quotes.remove(unescape(expression.getText()))}\\u2026`;\n break;\n case '$=':\n // suffix\n value = `\\u2026${quotes.remove(unescape(expression.getText()))}`;\n break;\n case '~=':\n // one of a list of words\n value = ` \\u2026 ${quotes.remove(unescape(expression.getText()))} \\u2026 `;\n break;\n case '*=':\n // substring\n value = `\\u2026${quotes.remove(unescape(expression.getText()))}\\u2026`;\n break;\n default:\n value = quotes.remove(unescape(expression.getText()));\n break;\n }\n }\n result.addAttr(unescape(identifier.getText()), value);\n }\n break;\n }\n }\n return result;\n}\nfunction unescape(content) {\n const scanner = new Scanner();\n scanner.setSource(content);\n const token = scanner.scanUnquotedString();\n if (token) {\n return token.text;\n }\n return content;\n}\nexport class SelectorPrinting {\n constructor(cssDataManager) {\n this.cssDataManager = cssDataManager;\n }\n selectorToMarkedString(node) {\n const root = selectorToElement(node);\n if (root) {\n const markedStrings = new MarkedStringPrinter('\"').print(root);\n markedStrings.push(this.selectorToSpecificityMarkedString(node));\n return markedStrings;\n }\n else {\n return [];\n }\n }\n simpleSelectorToMarkedString(node) {\n const element = toElement(node);\n const markedStrings = new MarkedStringPrinter('\"').print(element);\n markedStrings.push(this.selectorToSpecificityMarkedString(node));\n return markedStrings;\n }\n isPseudoElementIdentifier(text) {\n const match = text.match(/^::?([\\w-]+)/);\n if (!match) {\n return false;\n }\n return !!this.cssDataManager.getPseudoElement(\"::\" + match[1]);\n }\n selectorToSpecificityMarkedString(node) {\n //https://www.w3.org/TR/selectors-3/#specificity\n const calculateScore = (node) => {\n const specificity = new Specificity();\n elementLoop: for (const element of node.getChildren()) {\n switch (element.type) {\n case nodes.NodeType.IdentifierSelector:\n specificity.id++;\n break;\n case nodes.NodeType.ClassSelector:\n case nodes.NodeType.AttributeSelector:\n specificity.attr++;\n break;\n case nodes.NodeType.ElementNameSelector:\n //ignore universal selector\n if (element.matches(\"*\")) {\n break;\n }\n specificity.tag++;\n break;\n case nodes.NodeType.PseudoSelector:\n const text = element.getText();\n if (this.isPseudoElementIdentifier(text)) {\n specificity.tag++; // pseudo element\n continue elementLoop;\n }\n // where and child selectors have zero specificity\n if (text.match(/^:where/i)) {\n continue elementLoop;\n }\n // the most specific child selector\n if (text.match(/^:(not|has|is)/i) && element.getChildren().length > 0) {\n let mostSpecificListItem = new Specificity();\n for (const containerElement of element.getChildren()) {\n let list;\n if (containerElement.type === nodes.NodeType.Undefined) { // containerElement is a list of selectors\n list = containerElement.getChildren();\n }\n else { // containerElement is a selector\n list = [containerElement];\n }\n for (const childElement of containerElement.getChildren()) {\n const itemSpecificity = calculateScore(childElement);\n if (itemSpecificity.id > mostSpecificListItem.id) {\n mostSpecificListItem = itemSpecificity;\n continue;\n }\n else if (itemSpecificity.id < mostSpecificListItem.id) {\n continue;\n }\n if (itemSpecificity.attr > mostSpecificListItem.attr) {\n mostSpecificListItem = itemSpecificity;\n continue;\n }\n else if (itemSpecificity.attr < mostSpecificListItem.attr) {\n continue;\n }\n if (itemSpecificity.tag > mostSpecificListItem.tag) {\n mostSpecificListItem = itemSpecificity;\n continue;\n }\n }\n }\n specificity.id += mostSpecificListItem.id;\n specificity.attr += mostSpecificListItem.attr;\n specificity.tag += mostSpecificListItem.tag;\n continue elementLoop;\n }\n specificity.attr++; //pseudo class\n continue elementLoop;\n }\n if (element.getChildren().length > 0) {\n const itemSpecificity = calculateScore(element);\n specificity.id += itemSpecificity.id;\n specificity.attr += itemSpecificity.attr;\n specificity.tag += itemSpecificity.tag;\n }\n }\n return specificity;\n };\n const specificity = calculateScore(node);\n ;\n return l10n.t(\"[Selector Specificity](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity): ({0}, {1}, {2})\", specificity.id, specificity.attr, specificity.tag);\n }\n}\nclass SelectorElementBuilder {\n constructor(element) {\n this.prev = null;\n this.element = element;\n }\n processSelector(selector) {\n let parentElement = null;\n if (!(this.element instanceof RootElement)) {\n if (selector.getChildren().some((c) => c.hasChildren() && c.getChild(0).type === nodes.NodeType.SelectorCombinator)) {\n const curr = this.element.findRoot();\n if (curr.parent instanceof RootElement) {\n parentElement = this.element;\n this.element = curr.parent;\n this.element.removeChild(curr);\n this.prev = null;\n }\n }\n }\n for (const selectorChild of selector.getChildren()) {\n if (selectorChild instanceof nodes.SimpleSelector) {\n if (this.prev instanceof nodes.SimpleSelector) {\n const labelElement = new LabelElement('\\u2026');\n this.element.addChild(labelElement);\n this.element = labelElement;\n }\n else if (this.prev && (this.prev.matches('+') || this.prev.matches('~')) && this.element.parent) {\n this.element = this.element.parent;\n }\n if (this.prev && this.prev.matches('~')) {\n this.element.addChild(new LabelElement('\\u22EE'));\n }\n const thisElement = toElement(selectorChild, parentElement);\n const root = thisElement.findRoot();\n this.element.addChild(root);\n this.element = thisElement;\n }\n if (selectorChild instanceof nodes.SimpleSelector ||\n selectorChild.type === nodes.NodeType.SelectorCombinatorParent ||\n selectorChild.type === nodes.NodeType.SelectorCombinatorShadowPiercingDescendant ||\n selectorChild.type === nodes.NodeType.SelectorCombinatorSibling ||\n selectorChild.type === nodes.NodeType.SelectorCombinatorAllSiblings) {\n this.prev = selectorChild;\n }\n }\n }\n}\nfunction isNewSelectorContext(node) {\n switch (node.type) {\n case nodes.NodeType.MixinDeclaration:\n case nodes.NodeType.Stylesheet:\n return true;\n }\n return false;\n}\nexport function selectorToElement(node) {\n if (node.matches('@at-root')) {\n return null;\n }\n const root = new RootElement();\n const parentRuleSets = [];\n const ruleSet = node.getParent();\n if (ruleSet instanceof nodes.RuleSet) {\n let parent = ruleSet.getParent(); // parent of the selector's ruleset\n while (parent && !isNewSelectorContext(parent)) {\n if (parent instanceof nodes.RuleSet) {\n if (parent.getSelectors().matches('@at-root')) {\n break;\n }\n parentRuleSets.push(parent);\n }\n parent = parent.getParent();\n }\n }\n const builder = new SelectorElementBuilder(root);\n for (let i = parentRuleSets.length - 1; i >= 0; i--) {\n const selector = parentRuleSets[i].getSelectors().getChild(0);\n if (selector) {\n builder.processSelector(selector);\n }\n }\n builder.processSelector(node);\n return root;\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport * as nodes from '../parser/cssNodes';\nimport * as languageFacts from '../languageFacts/facts';\nimport { SelectorPrinting } from './selectorPrinting';\nimport { startsWith } from '../utils/strings';\nimport { Range, MarkupKind } from '../cssLanguageTypes';\nimport { isDefined } from '../utils/objects';\nexport class CSSHover {\n constructor(clientCapabilities, cssDataManager) {\n this.clientCapabilities = clientCapabilities;\n this.cssDataManager = cssDataManager;\n this.selectorPrinting = new SelectorPrinting(cssDataManager);\n }\n configure(settings) {\n this.defaultSettings = settings;\n }\n doHover(document, position, stylesheet, settings = this.defaultSettings) {\n function getRange(node) {\n return Range.create(document.positionAt(node.offset), document.positionAt(node.end));\n }\n const offset = document.offsetAt(position);\n const nodepath = nodes.getNodePath(stylesheet, offset);\n /**\n * nodepath is top-down\n * Build up the hover by appending inner node's information\n */\n let hover = null;\n for (let i = 0; i < nodepath.length; i++) {\n const node = nodepath[i];\n if (node instanceof nodes.Selector) {\n hover = {\n contents: this.selectorPrinting.selectorToMarkedString(node),\n range: getRange(node)\n };\n break;\n }\n if (node instanceof nodes.SimpleSelector) {\n /**\n * Some sass specific at rules such as `@at-root` are parsed as `SimpleSelector`\n */\n if (!startsWith(node.getText(), '@')) {\n hover = {\n contents: this.selectorPrinting.simpleSelectorToMarkedString(node),\n range: getRange(node)\n };\n }\n break;\n }\n if (node instanceof nodes.Declaration) {\n const propertyName = node.getFullPropertyName();\n const entry = this.cssDataManager.getProperty(propertyName);\n if (entry) {\n const contents = languageFacts.getEntryDescription(entry, this.doesSupportMarkdown(), settings);\n if (contents) {\n hover = {\n contents,\n range: getRange(node)\n };\n }\n else {\n hover = null;\n }\n }\n continue;\n }\n if (node instanceof nodes.UnknownAtRule) {\n const atRuleName = node.getText();\n const entry = this.cssDataManager.getAtDirective(atRuleName);\n if (entry) {\n const contents = languageFacts.getEntryDescription(entry, this.doesSupportMarkdown(), settings);\n if (contents) {\n hover = {\n contents,\n range: getRange(node)\n };\n }\n else {\n hover = null;\n }\n }\n continue;\n }\n if (node instanceof nodes.Node && node.type === nodes.NodeType.PseudoSelector) {\n const selectorName = node.getText();\n const entry = selectorName.slice(0, 2) === '::'\n ? this.cssDataManager.getPseudoElement(selectorName)\n : this.cssDataManager.getPseudoClass(selectorName);\n if (entry) {\n const contents = languageFacts.getEntryDescription(entry, this.doesSupportMarkdown(), settings);\n if (contents) {\n hover = {\n contents,\n range: getRange(node)\n };\n }\n else {\n hover = null;\n }\n }\n continue;\n }\n }\n if (hover) {\n hover.contents = this.convertContents(hover.contents);\n }\n return hover;\n }\n convertContents(contents) {\n if (!this.doesSupportMarkdown()) {\n if (typeof contents === 'string') {\n return contents;\n }\n // MarkupContent\n else if ('kind' in contents) {\n return {\n kind: 'plaintext',\n value: contents.value\n };\n }\n // MarkedString[]\n else if (Array.isArray(contents)) {\n return contents.map(c => {\n return typeof c === 'string' ? c : c.value;\n });\n }\n // MarkedString\n else {\n return contents.value;\n }\n }\n return contents;\n }\n doesSupportMarkdown() {\n if (!isDefined(this.supportsMarkdown)) {\n if (!isDefined(this.clientCapabilities)) {\n this.supportsMarkdown = true;\n return this.supportsMarkdown;\n }\n const hover = this.clientCapabilities.textDocument && this.clientCapabilities.textDocument.hover;\n this.supportsMarkdown = hover && hover.contentFormat && Array.isArray(hover.contentFormat) && hover.contentFormat.indexOf(MarkupKind.Markdown) !== -1;\n }\n return this.supportsMarkdown;\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport { DocumentHighlightKind, Location, Range, SymbolKind, TextEdit, FileType } from '../cssLanguageTypes';\nimport * as l10n from '@vscode/l10n';\nimport * as nodes from '../parser/cssNodes';\nimport { Symbols } from '../parser/cssSymbolScope';\nimport { getColorValue, hslFromColor, hwbFromColor } from '../languageFacts/facts';\nimport { startsWith } from '../utils/strings';\nimport { dirname, joinPath } from '../utils/resources';\nconst startsWithSchemeRegex = /^\\w+:\\/\\//;\nconst startsWithData = /^data:/;\nexport class CSSNavigation {\n constructor(fileSystemProvider, resolveModuleReferences) {\n this.fileSystemProvider = fileSystemProvider;\n this.resolveModuleReferences = resolveModuleReferences;\n }\n findDefinition(document, position, stylesheet) {\n const symbols = new Symbols(stylesheet);\n const offset = document.offsetAt(position);\n const node = nodes.getNodeAtOffset(stylesheet, offset);\n if (!node) {\n return null;\n }\n const symbol = symbols.findSymbolFromNode(node);\n if (!symbol) {\n return null;\n }\n return {\n uri: document.uri,\n range: getRange(symbol.node, document)\n };\n }\n findReferences(document, position, stylesheet) {\n const highlights = this.findDocumentHighlights(document, position, stylesheet);\n return highlights.map(h => {\n return {\n uri: document.uri,\n range: h.range\n };\n });\n }\n getHighlightNode(document, position, stylesheet) {\n const offset = document.offsetAt(position);\n let node = nodes.getNodeAtOffset(stylesheet, offset);\n if (!node || node.type === nodes.NodeType.Stylesheet || node.type === nodes.NodeType.Declarations) {\n return;\n }\n if (node.type === nodes.NodeType.Identifier && node.parent && node.parent.type === nodes.NodeType.ClassSelector) {\n node = node.parent;\n }\n return node;\n }\n findDocumentHighlights(document, position, stylesheet) {\n const result = [];\n const node = this.getHighlightNode(document, position, stylesheet);\n if (!node) {\n return result;\n }\n const symbols = new Symbols(stylesheet);\n const symbol = symbols.findSymbolFromNode(node);\n const name = node.getText();\n stylesheet.accept(candidate => {\n if (symbol) {\n if (symbols.matchesSymbol(candidate, symbol)) {\n result.push({\n kind: getHighlightKind(candidate),\n range: getRange(candidate, document)\n });\n return false;\n }\n }\n else if (node && node.type === candidate.type && candidate.matches(name)) {\n // Same node type and data\n result.push({\n kind: getHighlightKind(candidate),\n range: getRange(candidate, document)\n });\n }\n return true;\n });\n return result;\n }\n isRawStringDocumentLinkNode(node) {\n return node.type === nodes.NodeType.Import;\n }\n findDocumentLinks(document, stylesheet, documentContext) {\n const linkData = this.findUnresolvedLinks(document, stylesheet);\n const resolvedLinks = [];\n for (let data of linkData) {\n const link = data.link;\n const target = link.target;\n if (!target || startsWithData.test(target)) {\n // no links for data:\n }\n else if (startsWithSchemeRegex.test(target)) {\n resolvedLinks.push(link);\n }\n else {\n const resolved = documentContext.resolveReference(target, document.uri);\n if (resolved) {\n link.target = resolved;\n }\n resolvedLinks.push(link);\n }\n }\n return resolvedLinks;\n }\n async findDocumentLinks2(document, stylesheet, documentContext) {\n const linkData = this.findUnresolvedLinks(document, stylesheet);\n const resolvedLinks = [];\n for (let data of linkData) {\n const link = data.link;\n const target = link.target;\n if (!target || startsWithData.test(target)) {\n // no links for data:\n }\n else if (startsWithSchemeRegex.test(target)) {\n resolvedLinks.push(link);\n }\n else {\n const resolvedTarget = await this.resolveReference(target, document.uri, documentContext, data.isRawLink);\n if (resolvedTarget !== undefined) {\n link.target = resolvedTarget;\n resolvedLinks.push(link);\n }\n }\n }\n return resolvedLinks;\n }\n findUnresolvedLinks(document, stylesheet) {\n const result = [];\n const collect = (uriStringNode) => {\n let rawUri = uriStringNode.getText();\n const range = getRange(uriStringNode, document);\n // Make sure the range is not empty\n if (range.start.line === range.end.line && range.start.character === range.end.character) {\n return;\n }\n if (startsWith(rawUri, `'`) || startsWith(rawUri, `\"`)) {\n rawUri = rawUri.slice(1, -1);\n }\n const isRawLink = uriStringNode.parent ? this.isRawStringDocumentLinkNode(uriStringNode.parent) : false;\n result.push({ link: { target: rawUri, range }, isRawLink });\n };\n stylesheet.accept(candidate => {\n if (candidate.type === nodes.NodeType.URILiteral) {\n const first = candidate.getChild(0);\n if (first) {\n collect(first);\n }\n return false;\n }\n /**\n * In @import, it is possible to include links that do not use `url()`\n * For example, `@import 'foo.css';`\n */\n if (candidate.parent && this.isRawStringDocumentLinkNode(candidate.parent)) {\n const rawText = candidate.getText();\n if (startsWith(rawText, `'`) || startsWith(rawText, `\"`)) {\n collect(candidate);\n }\n return false;\n }\n return true;\n });\n return result;\n }\n findSymbolInformations(document, stylesheet) {\n const result = [];\n const addSymbolInformation = (name, kind, symbolNodeOrRange) => {\n const range = symbolNodeOrRange instanceof nodes.Node ? getRange(symbolNodeOrRange, document) : symbolNodeOrRange;\n const entry = {\n name,\n kind,\n location: Location.create(document.uri, range)\n };\n result.push(entry);\n };\n this.collectDocumentSymbols(document, stylesheet, addSymbolInformation);\n return result;\n }\n findDocumentSymbols(document, stylesheet) {\n const result = [];\n const parents = [];\n const addDocumentSymbol = (name, kind, symbolNodeOrRange, nameNodeOrRange, bodyNode) => {\n const range = symbolNodeOrRange instanceof nodes.Node ? getRange(symbolNodeOrRange, document) : symbolNodeOrRange;\n const selectionRange = (nameNodeOrRange instanceof nodes.Node ? getRange(nameNodeOrRange, document) : nameNodeOrRange) ?? Range.create(range.start, range.start);\n const entry = {\n name,\n kind,\n range,\n selectionRange\n };\n let top = parents.pop();\n while (top && !containsRange(top[1], range)) {\n top = parents.pop();\n }\n if (top) {\n const topSymbol = top[0];\n if (!topSymbol.children) {\n topSymbol.children = [];\n }\n topSymbol.children.push(entry);\n parents.push(top); // put back top\n }\n else {\n result.push(entry);\n }\n if (bodyNode) {\n parents.push([entry, getRange(bodyNode, document)]);\n }\n };\n this.collectDocumentSymbols(document, stylesheet, addDocumentSymbol);\n return result;\n }\n collectDocumentSymbols(document, stylesheet, collect) {\n stylesheet.accept(node => {\n if (node instanceof nodes.RuleSet) {\n for (const selector of node.getSelectors().getChildren()) {\n if (selector instanceof nodes.Selector) {\n const range = Range.create(document.positionAt(selector.offset), document.positionAt(node.end));\n collect(selector.getText(), SymbolKind.Class, range, selector, node.getDeclarations());\n }\n }\n }\n else if (node instanceof nodes.VariableDeclaration) {\n collect(node.getName(), SymbolKind.Variable, node, node.getVariable(), undefined);\n }\n else if (node instanceof nodes.MixinDeclaration) {\n collect(node.getName(), SymbolKind.Method, node, node.getIdentifier(), node.getDeclarations());\n }\n else if (node instanceof nodes.FunctionDeclaration) {\n collect(node.getName(), SymbolKind.Function, node, node.getIdentifier(), node.getDeclarations());\n }\n else if (node instanceof nodes.Keyframe) {\n const name = l10n.t(\"@keyframes {0}\", node.getName());\n collect(name, SymbolKind.Class, node, node.getIdentifier(), node.getDeclarations());\n }\n else if (node instanceof nodes.FontFace) {\n const name = l10n.t(\"@font-face\");\n collect(name, SymbolKind.Class, node, undefined, node.getDeclarations());\n }\n else if (node instanceof nodes.Media) {\n const mediaList = node.getChild(0);\n if (mediaList instanceof nodes.Medialist) {\n const name = '@media ' + mediaList.getText();\n collect(name, SymbolKind.Module, node, mediaList, node.getDeclarations());\n }\n }\n return true;\n });\n }\n findDocumentColors(document, stylesheet) {\n const result = [];\n stylesheet.accept((node) => {\n const colorInfo = getColorInformation(node, document);\n if (colorInfo) {\n result.push(colorInfo);\n }\n return true;\n });\n return result;\n }\n getColorPresentations(document, stylesheet, color, range) {\n const result = [];\n const red256 = Math.round(color.red * 255), green256 = Math.round(color.green * 255), blue256 = Math.round(color.blue * 255);\n let label;\n if (color.alpha === 1) {\n label = `rgb(${red256}, ${green256}, ${blue256})`;\n }\n else {\n label = `rgba(${red256}, ${green256}, ${blue256}, ${color.alpha})`;\n }\n result.push({ label: label, textEdit: TextEdit.replace(range, label) });\n if (color.alpha === 1) {\n label = `#${toTwoDigitHex(red256)}${toTwoDigitHex(green256)}${toTwoDigitHex(blue256)}`;\n }\n else {\n label = `#${toTwoDigitHex(red256)}${toTwoDigitHex(green256)}${toTwoDigitHex(blue256)}${toTwoDigitHex(Math.round(color.alpha * 255))}`;\n }\n result.push({ label: label, textEdit: TextEdit.replace(range, label) });\n const hsl = hslFromColor(color);\n if (hsl.a === 1) {\n label = `hsl(${hsl.h}, ${Math.round(hsl.s * 100)}%, ${Math.round(hsl.l * 100)}%)`;\n }\n else {\n label = `hsla(${hsl.h}, ${Math.round(hsl.s * 100)}%, ${Math.round(hsl.l * 100)}%, ${hsl.a})`;\n }\n result.push({ label: label, textEdit: TextEdit.replace(range, label) });\n const hwb = hwbFromColor(color);\n if (hwb.a === 1) {\n label = `hwb(${hwb.h} ${Math.round(hwb.w * 100)}% ${Math.round(hwb.b * 100)}%)`;\n }\n else {\n label = `hwb(${hwb.h} ${Math.round(hwb.w * 100)}% ${Math.round(hwb.b * 100)}% / ${hwb.a})`;\n }\n result.push({ label: label, textEdit: TextEdit.replace(range, label) });\n return result;\n }\n prepareRename(document, position, stylesheet) {\n const node = this.getHighlightNode(document, position, stylesheet);\n if (node) {\n return Range.create(document.positionAt(node.offset), document.positionAt(node.end));\n }\n }\n doRename(document, position, newName, stylesheet) {\n const highlights = this.findDocumentHighlights(document, position, stylesheet);\n const edits = highlights.map(h => TextEdit.replace(h.range, newName));\n return {\n changes: { [document.uri]: edits }\n };\n }\n async resolveModuleReference(ref, documentUri, documentContext) {\n if (startsWith(documentUri, 'file://')) {\n const moduleName = getModuleNameFromPath(ref);\n if (moduleName && moduleName !== '.' && moduleName !== '..') {\n const rootFolderUri = documentContext.resolveReference('/', documentUri);\n const documentFolderUri = dirname(documentUri);\n const modulePath = await this.resolvePathToModule(moduleName, documentFolderUri, rootFolderUri);\n if (modulePath) {\n const pathWithinModule = ref.substring(moduleName.length + 1);\n return joinPath(modulePath, pathWithinModule);\n }\n }\n }\n return undefined;\n }\n async mapReference(target, isRawLink) {\n return target;\n }\n async resolveReference(target, documentUri, documentContext, isRawLink = false) {\n // Following [css-loader](https://github.com/webpack-contrib/css-loader#url)\n // and [sass-loader's](https://github.com/webpack-contrib/sass-loader#imports)\n // convention, if an import path starts with ~ then use node module resolution\n // *unless* it starts with \"~/\" as this refers to the user's home directory.\n if (target[0] === '~' && target[1] !== '/' && this.fileSystemProvider) {\n target = target.substring(1);\n return this.mapReference(await this.resolveModuleReference(target, documentUri, documentContext), isRawLink);\n }\n const ref = await this.mapReference(documentContext.resolveReference(target, documentUri), isRawLink);\n // Following [less-loader](https://github.com/webpack-contrib/less-loader#imports)\n // and [sass-loader's](https://github.com/webpack-contrib/sass-loader#resolving-import-at-rules)\n // new resolving import at-rules (~ is deprecated). The loader will first try to resolve @import as a relative path. If it cannot be resolved,\n // then the loader will try to resolve @import inside node_modules.\n if (this.resolveModuleReferences) {\n if (ref && await this.fileExists(ref)) {\n return ref;\n }\n const moduleReference = await this.mapReference(await this.resolveModuleReference(target, documentUri, documentContext), isRawLink);\n if (moduleReference) {\n return moduleReference;\n }\n }\n // fall back. it might not exists\n return ref;\n }\n async resolvePathToModule(_moduleName, documentFolderUri, rootFolderUri) {\n // resolve the module relative to the document. We can't use `require` here as the code is webpacked.\n const packPath = joinPath(documentFolderUri, 'node_modules', _moduleName, 'package.json');\n if (await this.fileExists(packPath)) {\n return dirname(packPath);\n }\n else if (rootFolderUri && documentFolderUri.startsWith(rootFolderUri) && (documentFolderUri.length !== rootFolderUri.length)) {\n return this.resolvePathToModule(_moduleName, dirname(documentFolderUri), rootFolderUri);\n }\n return undefined;\n }\n async fileExists(uri) {\n if (!this.fileSystemProvider) {\n return false;\n }\n try {\n const stat = await this.fileSystemProvider.stat(uri);\n if (stat.type === FileType.Unknown && stat.size === -1) {\n return false;\n }\n return true;\n }\n catch (err) {\n return false;\n }\n }\n}\nfunction getColorInformation(node, document) {\n const color = getColorValue(node);\n if (color) {\n const range = getRange(node, document);\n return { color, range };\n }\n return null;\n}\nfunction getRange(node, document) {\n return Range.create(document.positionAt(node.offset), document.positionAt(node.end));\n}\n/**\n * Test if `otherRange` is in `range`. If the ranges are equal, will return true.\n */\nfunction containsRange(range, otherRange) {\n const otherStartLine = otherRange.start.line, otherEndLine = otherRange.end.line;\n const rangeStartLine = range.start.line, rangeEndLine = range.end.line;\n if (otherStartLine < rangeStartLine || otherEndLine < rangeStartLine) {\n return false;\n }\n if (otherStartLine > rangeEndLine || otherEndLine > rangeEndLine) {\n return false;\n }\n if (otherStartLine === rangeStartLine && otherRange.start.character < range.start.character) {\n return false;\n }\n if (otherEndLine === rangeEndLine && otherRange.end.character > range.end.character) {\n return false;\n }\n return true;\n}\nfunction getHighlightKind(node) {\n if (node.type === nodes.NodeType.Selector) {\n return DocumentHighlightKind.Write;\n }\n if (node instanceof nodes.Identifier) {\n if (node.parent && node.parent instanceof nodes.Property) {\n if (node.isCustomProperty) {\n return DocumentHighlightKind.Write;\n }\n }\n }\n if (node.parent) {\n switch (node.parent.type) {\n case nodes.NodeType.FunctionDeclaration:\n case nodes.NodeType.MixinDeclaration:\n case nodes.NodeType.Keyframe:\n case nodes.NodeType.VariableDeclaration:\n case nodes.NodeType.FunctionParameter:\n return DocumentHighlightKind.Write;\n }\n }\n return DocumentHighlightKind.Read;\n}\nfunction toTwoDigitHex(n) {\n const r = n.toString(16);\n return r.length !== 2 ? '0' + r : r;\n}\nfunction getModuleNameFromPath(path) {\n const firstSlash = path.indexOf('/');\n if (firstSlash === -1) {\n return '';\n }\n // If a scoped module (starts with @) then get up until second instance of '/', or to the end of the string for root-level imports.\n if (path[0] === '@') {\n const secondSlash = path.indexOf('/', firstSlash + 1);\n if (secondSlash === -1) {\n return path;\n }\n return path.substring(0, secondSlash);\n }\n // Otherwise get until first instance of '/'\n return path.substring(0, firstSlash);\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport * as nodes from '../parser/cssNodes';\nimport * as l10n from '@vscode/l10n';\nconst Warning = nodes.Level.Warning;\nconst Error = nodes.Level.Error;\nconst Ignore = nodes.Level.Ignore;\nexport class Rule {\n constructor(id, message, defaultValue) {\n this.id = id;\n this.message = message;\n this.defaultValue = defaultValue;\n // nothing to do\n }\n}\nexport class Setting {\n constructor(id, message, defaultValue) {\n this.id = id;\n this.message = message;\n this.defaultValue = defaultValue;\n // nothing to do\n }\n}\nexport const Rules = {\n AllVendorPrefixes: new Rule('compatibleVendorPrefixes', l10n.t(\"When using a vendor-specific prefix make sure to also include all other vendor-specific properties\"), Ignore),\n IncludeStandardPropertyWhenUsingVendorPrefix: new Rule('vendorPrefix', l10n.t(\"When using a vendor-specific prefix also include the standard property\"), Warning),\n DuplicateDeclarations: new Rule('duplicateProperties', l10n.t(\"Do not use duplicate style definitions\"), Ignore),\n EmptyRuleSet: new Rule('emptyRules', l10n.t(\"Do not use empty rulesets\"), Warning),\n ImportStatemement: new Rule('importStatement', l10n.t(\"Import statements do not load in parallel\"), Ignore),\n BewareOfBoxModelSize: new Rule('boxModel', l10n.t(\"Do not use width or height when using padding or border\"), Ignore),\n UniversalSelector: new Rule('universalSelector', l10n.t(\"The universal selector (*) is known to be slow\"), Ignore),\n ZeroWithUnit: new Rule('zeroUnits', l10n.t(\"No unit for zero needed\"), Ignore),\n RequiredPropertiesForFontFace: new Rule('fontFaceProperties', l10n.t(\"@font-face rule must define 'src' and 'font-family' properties\"), Warning),\n HexColorLength: new Rule('hexColorLength', l10n.t(\"Hex colors must consist of three, four, six or eight hex numbers\"), Error),\n ArgsInColorFunction: new Rule('argumentsInColorFunction', l10n.t(\"Invalid number of parameters\"), Error),\n UnknownProperty: new Rule('unknownProperties', l10n.t(\"Unknown property.\"), Warning),\n UnknownAtRules: new Rule('unknownAtRules', l10n.t(\"Unknown at-rule.\"), Warning),\n IEStarHack: new Rule('ieHack', l10n.t(\"IE hacks are only necessary when supporting IE7 and older\"), Ignore),\n UnknownVendorSpecificProperty: new Rule('unknownVendorSpecificProperties', l10n.t(\"Unknown vendor specific property.\"), Ignore),\n PropertyIgnoredDueToDisplay: new Rule('propertyIgnoredDueToDisplay', l10n.t(\"Property is ignored due to the display.\"), Warning),\n AvoidImportant: new Rule('important', l10n.t(\"Avoid using !important. It is an indication that the specificity of the entire CSS has gotten out of control and needs to be refactored.\"), Ignore),\n AvoidFloat: new Rule('float', l10n.t(\"Avoid using 'float'. Floats lead to fragile CSS that is easy to break if one aspect of the layout changes.\"), Ignore),\n AvoidIdSelector: new Rule('idSelector', l10n.t(\"Selectors should not contain IDs because these rules are too tightly coupled with the HTML.\"), Ignore),\n};\nexport const Settings = {\n ValidProperties: new Setting('validProperties', l10n.t(\"A list of properties that are not validated against the `unknownProperties` rule.\"), [])\n};\nexport class LintConfigurationSettings {\n constructor(conf = {}) {\n this.conf = conf;\n }\n getRule(rule) {\n if (this.conf.hasOwnProperty(rule.id)) {\n const level = toLevel(this.conf[rule.id]);\n if (level) {\n return level;\n }\n }\n return rule.defaultValue;\n }\n getSetting(setting) {\n return this.conf[setting.id];\n }\n}\nfunction toLevel(level) {\n switch (level) {\n case 'ignore': return nodes.Level.Ignore;\n case 'warning': return nodes.Level.Warning;\n case 'error': return nodes.Level.Error;\n }\n return null;\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport * as nodes from '../parser/cssNodes';\nimport { difference } from '../utils/strings';\nimport { Rules } from '../services/lintRules';\nimport { Command, TextEdit, CodeAction, CodeActionKind, TextDocumentEdit, VersionedTextDocumentIdentifier } from '../cssLanguageTypes';\nimport * as l10n from '@vscode/l10n';\nexport class CSSCodeActions {\n constructor(cssDataManager) {\n this.cssDataManager = cssDataManager;\n }\n doCodeActions(document, range, context, stylesheet) {\n return this.doCodeActions2(document, range, context, stylesheet).map(ca => {\n const textDocumentEdit = ca.edit && ca.edit.documentChanges && ca.edit.documentChanges[0];\n return Command.create(ca.title, '_css.applyCodeAction', document.uri, document.version, textDocumentEdit && textDocumentEdit.edits);\n });\n }\n doCodeActions2(document, range, context, stylesheet) {\n const result = [];\n if (context.diagnostics) {\n for (const diagnostic of context.diagnostics) {\n this.appendFixesForMarker(document, stylesheet, diagnostic, result);\n }\n }\n return result;\n }\n getFixesForUnknownProperty(document, property, marker, result) {\n const propertyName = property.getName();\n const candidates = [];\n this.cssDataManager.getProperties().forEach(p => {\n const score = difference(propertyName, p.name);\n if (score >= propertyName.length / 2 /*score_lim*/) {\n candidates.push({ property: p.name, score });\n }\n });\n // Sort in descending order.\n candidates.sort((a, b) => {\n return b.score - a.score || a.property.localeCompare(b.property);\n });\n let maxActions = 3;\n for (const candidate of candidates) {\n const propertyName = candidate.property;\n const title = l10n.t(\"Rename to '{0}'\", propertyName);\n const edit = TextEdit.replace(marker.range, propertyName);\n const documentIdentifier = VersionedTextDocumentIdentifier.create(document.uri, document.version);\n const workspaceEdit = { documentChanges: [TextDocumentEdit.create(documentIdentifier, [edit])] };\n const codeAction = CodeAction.create(title, workspaceEdit, CodeActionKind.QuickFix);\n codeAction.diagnostics = [marker];\n result.push(codeAction);\n if (--maxActions <= 0) {\n return;\n }\n }\n }\n appendFixesForMarker(document, stylesheet, marker, result) {\n if (marker.code !== Rules.UnknownProperty.id) {\n return;\n }\n const offset = document.offsetAt(marker.range.start);\n const end = document.offsetAt(marker.range.end);\n const nodepath = nodes.getNodePath(stylesheet, offset);\n for (let i = nodepath.length - 1; i >= 0; i--) {\n const node = nodepath[i];\n if (node instanceof nodes.Declaration) {\n const property = node.getProperty();\n if (property && property.offset === offset && property.end === end) {\n this.getFixesForUnknownProperty(document, property, marker, result);\n return;\n }\n }\n }\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport { includes } from '../utils/arrays';\nexport class Element {\n constructor(decl) {\n this.fullPropertyName = decl.getFullPropertyName().toLowerCase();\n this.node = decl;\n }\n}\nfunction setSide(model, side, value, property) {\n const state = model[side];\n state.value = value;\n if (value) {\n if (!includes(state.properties, property)) {\n state.properties.push(property);\n }\n }\n}\nfunction setAllSides(model, value, property) {\n setSide(model, 'top', value, property);\n setSide(model, 'right', value, property);\n setSide(model, 'bottom', value, property);\n setSide(model, 'left', value, property);\n}\nfunction updateModelWithValue(model, side, value, property) {\n if (side === 'top' || side === 'right' ||\n side === 'bottom' || side === 'left') {\n setSide(model, side, value, property);\n }\n else {\n setAllSides(model, value, property);\n }\n}\nfunction updateModelWithList(model, values, property) {\n switch (values.length) {\n case 1:\n updateModelWithValue(model, undefined, values[0], property);\n break;\n case 2:\n updateModelWithValue(model, 'top', values[0], property);\n updateModelWithValue(model, 'bottom', values[0], property);\n updateModelWithValue(model, 'right', values[1], property);\n updateModelWithValue(model, 'left', values[1], property);\n break;\n case 3:\n updateModelWithValue(model, 'top', values[0], property);\n updateModelWithValue(model, 'right', values[1], property);\n updateModelWithValue(model, 'left', values[1], property);\n updateModelWithValue(model, 'bottom', values[2], property);\n break;\n case 4:\n updateModelWithValue(model, 'top', values[0], property);\n updateModelWithValue(model, 'right', values[1], property);\n updateModelWithValue(model, 'bottom', values[2], property);\n updateModelWithValue(model, 'left', values[3], property);\n break;\n }\n}\nfunction matches(value, candidates) {\n for (let candidate of candidates) {\n if (value.matches(candidate)) {\n return true;\n }\n }\n return false;\n}\n/**\n * @param allowsKeywords whether the initial value of property is zero, so keywords `initial` and `unset` count as zero\n * @return `true` if this node represents a non-zero border; otherwise, `false`\n */\nfunction checkLineWidth(value, allowsKeywords = true) {\n if (allowsKeywords && matches(value, ['initial', 'unset'])) {\n return false;\n }\n // a <length> is a value and a unit\n // so use `parseFloat` to strip the unit\n return parseFloat(value.getText()) !== 0;\n}\nfunction checkLineWidthList(nodes, allowsKeywords = true) {\n return nodes.map(node => checkLineWidth(node, allowsKeywords));\n}\n/**\n * @param allowsKeywords whether keywords `initial` and `unset` count as zero\n * @return `true` if this node represents a non-zero border; otherwise, `false`\n */\nfunction checkLineStyle(valueNode, allowsKeywords = true) {\n if (matches(valueNode, ['none', 'hidden'])) {\n return false;\n }\n if (allowsKeywords && matches(valueNode, ['initial', 'unset'])) {\n return false;\n }\n return true;\n}\nfunction checkLineStyleList(nodes, allowsKeywords = true) {\n return nodes.map(node => checkLineStyle(node, allowsKeywords));\n}\nfunction checkBorderShorthand(node) {\n const children = node.getChildren();\n // the only child can be a keyword, a <line-width>, or a <line-style>\n // if either check returns false, the result is no border\n if (children.length === 1) {\n const value = children[0];\n return checkLineWidth(value) && checkLineStyle(value);\n }\n // multiple children can't contain keywords\n // if any child means no border, the result is no border\n for (const child of children) {\n const value = child;\n if (!checkLineWidth(value, /* allowsKeywords: */ false) ||\n !checkLineStyle(value, /* allowsKeywords: */ false)) {\n return false;\n }\n }\n return true;\n}\nexport default function calculateBoxModel(propertyTable) {\n const model = {\n top: { value: false, properties: [] },\n right: { value: false, properties: [] },\n bottom: { value: false, properties: [] },\n left: { value: false, properties: [] },\n };\n for (const property of propertyTable) {\n const value = property.node.value;\n if (typeof value === 'undefined') {\n continue;\n }\n switch (property.fullPropertyName) {\n case 'box-sizing':\n // has `box-sizing`, bail out\n return {\n top: { value: false, properties: [] },\n right: { value: false, properties: [] },\n bottom: { value: false, properties: [] },\n left: { value: false, properties: [] },\n };\n case 'width':\n model.width = property;\n break;\n case 'height':\n model.height = property;\n break;\n default:\n const segments = property.fullPropertyName.split('-');\n switch (segments[0]) {\n case 'border':\n switch (segments[1]) {\n case undefined:\n case 'top':\n case 'right':\n case 'bottom':\n case 'left':\n switch (segments[2]) {\n case undefined:\n updateModelWithValue(model, segments[1], checkBorderShorthand(value), property);\n break;\n case 'width':\n // the initial value of `border-width` is `medium`, not zero\n updateModelWithValue(model, segments[1], checkLineWidth(value, false), property);\n break;\n case 'style':\n // the initial value of `border-style` is `none`\n updateModelWithValue(model, segments[1], checkLineStyle(value, true), property);\n break;\n }\n break;\n case 'width':\n // the initial value of `border-width` is `medium`, not zero\n updateModelWithList(model, checkLineWidthList(value.getChildren(), false), property);\n break;\n case 'style':\n // the initial value of `border-style` is `none`\n updateModelWithList(model, checkLineStyleList(value.getChildren(), true), property);\n break;\n }\n break;\n case 'padding':\n if (segments.length === 1) {\n // the initial value of `padding` is zero\n updateModelWithList(model, checkLineWidthList(value.getChildren(), true), property);\n }\n else {\n // the initial value of `padding` is zero\n updateModelWithValue(model, segments[1], checkLineWidth(value, true), property);\n }\n break;\n }\n break;\n }\n }\n return model;\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport * as l10n from '@vscode/l10n';\nimport * as languageFacts from '../languageFacts/facts';\nimport * as nodes from '../parser/cssNodes';\nimport { union } from '../utils/arrays';\nimport { Rules, Settings } from './lintRules';\nimport calculateBoxModel, { Element } from './lintUtil';\nclass NodesByRootMap {\n constructor() {\n this.data = {};\n }\n add(root, name, node) {\n let entry = this.data[root];\n if (!entry) {\n entry = { nodes: [], names: [] };\n this.data[root] = entry;\n }\n entry.names.push(name);\n if (node) {\n entry.nodes.push(node);\n }\n }\n}\nexport class LintVisitor {\n static entries(node, document, settings, cssDataManager, entryFilter) {\n const visitor = new LintVisitor(document, settings, cssDataManager);\n node.acceptVisitor(visitor);\n visitor.completeValidations();\n return visitor.getEntries(entryFilter);\n }\n constructor(document, settings, cssDataManager) {\n this.cssDataManager = cssDataManager;\n this.warnings = [];\n this.settings = settings;\n this.documentText = document.getText();\n this.keyframes = new NodesByRootMap();\n this.validProperties = {};\n const properties = settings.getSetting(Settings.ValidProperties);\n if (Array.isArray(properties)) {\n properties.forEach((p) => {\n if (typeof p === 'string') {\n const name = p.trim().toLowerCase();\n if (name.length) {\n this.validProperties[name] = true;\n }\n }\n });\n }\n }\n isValidPropertyDeclaration(element) {\n const propertyName = element.fullPropertyName;\n return this.validProperties[propertyName];\n }\n fetch(input, s) {\n const elements = [];\n for (const curr of input) {\n if (curr.fullPropertyName === s) {\n elements.push(curr);\n }\n }\n return elements;\n }\n fetchWithValue(input, s, v) {\n const elements = [];\n for (const inputElement of input) {\n if (inputElement.fullPropertyName === s) {\n const expression = inputElement.node.getValue();\n if (expression && this.findValueInExpression(expression, v)) {\n elements.push(inputElement);\n }\n }\n }\n return elements;\n }\n findValueInExpression(expression, v) {\n let found = false;\n expression.accept(node => {\n if (node.type === nodes.NodeType.Identifier && node.matches(v)) {\n found = true;\n }\n return !found;\n });\n return found;\n }\n getEntries(filter = (nodes.Level.Warning | nodes.Level.Error)) {\n return this.warnings.filter(entry => {\n return (entry.getLevel() & filter) !== 0;\n });\n }\n addEntry(node, rule, details) {\n const entry = new nodes.Marker(node, rule, this.settings.getRule(rule), details);\n this.warnings.push(entry);\n }\n getMissingNames(expected, actual) {\n const expectedClone = expected.slice(0); // clone\n for (let i = 0; i < actual.length; i++) {\n const k = expectedClone.indexOf(actual[i]);\n if (k !== -1) {\n expectedClone[k] = null;\n }\n }\n let result = null;\n for (let i = 0; i < expectedClone.length; i++) {\n const curr = expectedClone[i];\n if (curr) {\n if (result === null) {\n result = l10n.t(\"'{0}'\", curr);\n }\n else {\n result = l10n.t(\"{0}, '{1}'\", result, curr);\n }\n }\n }\n return result;\n }\n visitNode(node) {\n switch (node.type) {\n case nodes.NodeType.UnknownAtRule:\n return this.visitUnknownAtRule(node);\n case nodes.NodeType.Keyframe:\n return this.visitKeyframe(node);\n case nodes.NodeType.FontFace:\n return this.visitFontFace(node);\n case nodes.NodeType.Ruleset:\n return this.visitRuleSet(node);\n case nodes.NodeType.SimpleSelector:\n return this.visitSimpleSelector(node);\n case nodes.NodeType.Function:\n return this.visitFunction(node);\n case nodes.NodeType.NumericValue:\n return this.visitNumericValue(node);\n case nodes.NodeType.Import:\n return this.visitImport(node);\n case nodes.NodeType.HexColorValue:\n return this.visitHexColorValue(node);\n case nodes.NodeType.Prio:\n return this.visitPrio(node);\n case nodes.NodeType.IdentifierSelector:\n return this.visitIdentifierSelector(node);\n }\n return true;\n }\n completeValidations() {\n this.validateKeyframes();\n }\n visitUnknownAtRule(node) {\n const atRuleName = node.getChild(0);\n if (!atRuleName) {\n return false;\n }\n const atDirective = this.cssDataManager.getAtDirective(atRuleName.getText());\n if (atDirective) {\n return false;\n }\n this.addEntry(atRuleName, Rules.UnknownAtRules, `Unknown at rule ${atRuleName.getText()}`);\n return true;\n }\n visitKeyframe(node) {\n const keyword = node.getKeyword();\n if (!keyword) {\n return false;\n }\n const text = keyword.getText();\n this.keyframes.add(node.getName(), text, (text !== '@keyframes') ? keyword : null);\n return true;\n }\n validateKeyframes() {\n // @keyframe and it's vendor specific alternatives\n // @keyframe should be included\n const expected = ['@-webkit-keyframes', '@-moz-keyframes', '@-o-keyframes'];\n for (const name in this.keyframes.data) {\n const actual = this.keyframes.data[name].names;\n const needsStandard = (actual.indexOf('@keyframes') === -1);\n if (!needsStandard && actual.length === 1) {\n continue; // only the non-vendor specific keyword is used, that's fine, no warning\n }\n const missingVendorSpecific = this.getMissingNames(expected, actual);\n if (missingVendorSpecific || needsStandard) {\n for (const node of this.keyframes.data[name].nodes) {\n if (needsStandard) {\n const message = l10n.t(\"Always define standard rule '@keyframes' when defining keyframes.\");\n this.addEntry(node, Rules.IncludeStandardPropertyWhenUsingVendorPrefix, message);\n }\n if (missingVendorSpecific) {\n const message = l10n.t(\"Always include all vendor specific rules: Missing: {0}\", missingVendorSpecific);\n this.addEntry(node, Rules.AllVendorPrefixes, message);\n }\n }\n }\n }\n return true;\n }\n visitSimpleSelector(node) {\n /////////////////////////////////////////////////////////////\n //\tLint - The universal selector (*) is known to be slow.\n /////////////////////////////////////////////////////////////\n const firstChar = this.documentText.charAt(node.offset);\n if (node.length === 1 && firstChar === '*') {\n this.addEntry(node, Rules.UniversalSelector);\n }\n return true;\n }\n visitIdentifierSelector(node) {\n /////////////////////////////////////////////////////////////\n //\tLint - Avoid id selectors\n /////////////////////////////////////////////////////////////\n this.addEntry(node, Rules.AvoidIdSelector);\n return true;\n }\n visitImport(node) {\n /////////////////////////////////////////////////////////////\n //\tLint - Import statements shouldn't be used, because they aren't offering parallel downloads.\n /////////////////////////////////////////////////////////////\n this.addEntry(node, Rules.ImportStatemement);\n return true;\n }\n visitRuleSet(node) {\n /////////////////////////////////////////////////////////////\n //\tLint - Don't use empty rulesets.\n /////////////////////////////////////////////////////////////\n const declarations = node.getDeclarations();\n if (!declarations) {\n // syntax error\n return false;\n }\n if (!declarations.hasChildren()) {\n this.addEntry(node.getSelectors(), Rules.EmptyRuleSet);\n }\n const propertyTable = [];\n for (const element of declarations.getChildren()) {\n if (element instanceof nodes.Declaration) {\n propertyTable.push(new Element(element));\n }\n }\n /////////////////////////////////////////////////////////////\n // the rule warns when it finds:\n // width being used with border, border-left, border-right, padding, padding-left, or padding-right\n // height being used with border, border-top, border-bottom, padding, padding-top, or padding-bottom\n // No error when box-sizing property is specified, as it assumes the user knows what he's doing.\n // see https://github.com/CSSLint/csslint/wiki/Beware-of-box-model-size\n /////////////////////////////////////////////////////////////\n const boxModel = calculateBoxModel(propertyTable);\n if (boxModel.width) {\n let properties = [];\n if (boxModel.right.value) {\n properties = union(properties, boxModel.right.properties);\n }\n if (boxModel.left.value) {\n properties = union(properties, boxModel.left.properties);\n }\n if (properties.length !== 0) {\n for (const item of properties) {\n this.addEntry(item.node, Rules.BewareOfBoxModelSize);\n }\n this.addEntry(boxModel.width.node, Rules.BewareOfBoxModelSize);\n }\n }\n if (boxModel.height) {\n let properties = [];\n if (boxModel.top.value) {\n properties = union(properties, boxModel.top.properties);\n }\n if (boxModel.bottom.value) {\n properties = union(properties, boxModel.bottom.properties);\n }\n if (properties.length !== 0) {\n for (const item of properties) {\n this.addEntry(item.node, Rules.BewareOfBoxModelSize);\n }\n this.addEntry(boxModel.height.node, Rules.BewareOfBoxModelSize);\n }\n }\n /////////////////////////////////////////////////////////////\n //\tProperties ignored due to display\n /////////////////////////////////////////////////////////////\n // With 'display: inline-block', 'float' has no effect\n let displayElems = this.fetchWithValue(propertyTable, 'display', 'inline-block');\n if (displayElems.length > 0) {\n const elem = this.fetch(propertyTable, 'float');\n for (let index = 0; index < elem.length; index++) {\n const node = elem[index].node;\n const value = node.getValue();\n if (value && !value.matches('none')) {\n this.addEntry(node, Rules.PropertyIgnoredDueToDisplay, l10n.t(\"inline-block is ignored due to the float. If 'float' has a value other than 'none', the box is floated and 'display' is treated as 'block'\"));\n }\n }\n }\n // With 'display: block', 'vertical-align' has no effect\n displayElems = this.fetchWithValue(propertyTable, 'display', 'block');\n if (displayElems.length > 0) {\n const elem = this.fetch(propertyTable, 'vertical-align');\n for (let index = 0; index < elem.length; index++) {\n this.addEntry(elem[index].node, Rules.PropertyIgnoredDueToDisplay, l10n.t(\"Property is ignored due to the display. With 'display: block', vertical-align should not be used.\"));\n }\n }\n /////////////////////////////////////////////////////////////\n //\tAvoid 'float'\n /////////////////////////////////////////////////////////////\n const elements = this.fetch(propertyTable, 'float');\n for (let index = 0; index < elements.length; index++) {\n const element = elements[index];\n if (!this.isValidPropertyDeclaration(element)) {\n this.addEntry(element.node, Rules.AvoidFloat);\n }\n }\n /////////////////////////////////////////////////////////////\n //\tDon't use duplicate declarations.\n /////////////////////////////////////////////////////////////\n for (let i = 0; i < propertyTable.length; i++) {\n const element = propertyTable[i];\n if (element.fullPropertyName !== 'background' && !this.validProperties[element.fullPropertyName]) {\n const value = element.node.getValue();\n if (value && this.documentText.charAt(value.offset) !== '-') {\n const elements = this.fetch(propertyTable, element.fullPropertyName);\n if (elements.length > 1) {\n for (let k = 0; k < elements.length; k++) {\n const value = elements[k].node.getValue();\n if (value && this.documentText.charAt(value.offset) !== '-' && elements[k] !== element) {\n this.addEntry(element.node, Rules.DuplicateDeclarations);\n }\n }\n }\n }\n }\n }\n /////////////////////////////////////////////////////////////\n //\tUnknown propery & When using a vendor-prefixed gradient, make sure to use them all.\n /////////////////////////////////////////////////////////////\n const isExportBlock = node.getSelectors().matches(\":export\");\n if (!isExportBlock) {\n const propertiesBySuffix = new NodesByRootMap();\n let containsUnknowns = false;\n for (const element of propertyTable) {\n const decl = element.node;\n if (this.isCSSDeclaration(decl)) {\n let name = element.fullPropertyName;\n const firstChar = name.charAt(0);\n if (firstChar === '-') {\n if (name.charAt(1) !== '-') { // avoid css variables\n if (!this.cssDataManager.isKnownProperty(name) && !this.validProperties[name]) {\n this.addEntry(decl.getProperty(), Rules.UnknownVendorSpecificProperty);\n }\n const nonPrefixedName = decl.getNonPrefixedPropertyName();\n propertiesBySuffix.add(nonPrefixedName, name, decl.getProperty());\n }\n }\n else {\n const fullName = name;\n if (firstChar === '*' || firstChar === '_') {\n this.addEntry(decl.getProperty(), Rules.IEStarHack);\n name = name.substr(1);\n }\n // _property and *property might be contributed via custom data\n if (!this.cssDataManager.isKnownProperty(fullName) && !this.cssDataManager.isKnownProperty(name)) {\n if (!this.validProperties[name]) {\n this.addEntry(decl.getProperty(), Rules.UnknownProperty, l10n.t(\"Unknown property: '{0}'\", decl.getFullPropertyName()));\n }\n }\n propertiesBySuffix.add(name, name, null); // don't pass the node as we don't show errors on the standard\n }\n }\n else {\n containsUnknowns = true;\n }\n }\n if (!containsUnknowns) { // don't perform this test if there are\n for (const suffix in propertiesBySuffix.data) {\n const entry = propertiesBySuffix.data[suffix];\n const actual = entry.names;\n const needsStandard = this.cssDataManager.isStandardProperty(suffix) && (actual.indexOf(suffix) === -1);\n if (!needsStandard && actual.length === 1) {\n continue; // only the non-vendor specific rule is used, that's fine, no warning\n }\n /**\n * We should ignore missing standard properties, if there's an explicit contextual reference to a\n * vendor specific pseudo-element selector with the same vendor (prefix)\n *\n * (See https://github.com/microsoft/vscode/issues/164350)\n */\n const entriesThatNeedStandard = new Set(needsStandard ? entry.nodes : []);\n if (needsStandard) {\n const pseudoElements = this.getContextualVendorSpecificPseudoElements(node);\n for (const node of entry.nodes) {\n const propertyName = node.getName();\n const prefix = propertyName.substring(0, propertyName.length - suffix.length);\n if (pseudoElements.some(x => x.startsWith(prefix))) {\n entriesThatNeedStandard.delete(node);\n }\n }\n }\n const expected = [];\n for (let i = 0, len = LintVisitor.prefixes.length; i < len; i++) {\n const prefix = LintVisitor.prefixes[i];\n if (this.cssDataManager.isStandardProperty(prefix + suffix)) {\n expected.push(prefix + suffix);\n }\n }\n const missingVendorSpecific = this.getMissingNames(expected, actual);\n if (missingVendorSpecific || needsStandard) {\n for (const node of entry.nodes) {\n if (needsStandard && entriesThatNeedStandard.has(node)) {\n const message = l10n.t(\"Also define the standard property '{0}' for compatibility\", suffix);\n this.addEntry(node, Rules.IncludeStandardPropertyWhenUsingVendorPrefix, message);\n }\n if (missingVendorSpecific) {\n const message = l10n.t(\"Always include all vendor specific properties: Missing: {0}\", missingVendorSpecific);\n this.addEntry(node, Rules.AllVendorPrefixes, message);\n }\n }\n }\n }\n }\n }\n return true;\n }\n /**\n * Walks up the syntax tree (starting from given `node`) and captures vendor\n * specific pseudo-element selectors.\n * @returns An array of vendor specific pseudo-elements; or empty if none\n * was found.\n */\n getContextualVendorSpecificPseudoElements(node) {\n function walkDown(s, n) {\n for (const child of n.getChildren()) {\n if (child.type === nodes.NodeType.PseudoSelector) {\n const pseudoElement = child.getChildren()[0]?.getText();\n if (pseudoElement) {\n s.add(pseudoElement);\n }\n }\n walkDown(s, child);\n }\n }\n function walkUp(s, n) {\n if (n.type === nodes.NodeType.Ruleset) {\n for (const selector of n.getSelectors().getChildren()) {\n walkDown(s, selector);\n }\n }\n return n.parent ? walkUp(s, n.parent) : undefined;\n }\n const result = new Set();\n walkUp(result, node);\n return Array.from(result);\n }\n visitPrio(node) {\n /////////////////////////////////////////////////////////////\n //\tDon't use !important\n /////////////////////////////////////////////////////////////\n this.addEntry(node, Rules.AvoidImportant);\n return true;\n }\n visitNumericValue(node) {\n /////////////////////////////////////////////////////////////\n //\t0 has no following unit\n /////////////////////////////////////////////////////////////\n const funcDecl = node.findParent(nodes.NodeType.Function);\n if (funcDecl && funcDecl.getName() === 'calc') {\n return true;\n }\n const decl = node.findParent(nodes.NodeType.Declaration);\n if (decl) {\n const declValue = decl.getValue();\n if (declValue) {\n const value = node.getValue();\n if (!value.unit || languageFacts.units.length.indexOf(value.unit.toLowerCase()) === -1) {\n return true;\n }\n if (parseFloat(value.value) === 0.0 && !!value.unit && !this.validProperties[decl.getFullPropertyName()]) {\n this.addEntry(node, Rules.ZeroWithUnit);\n }\n }\n }\n return true;\n }\n visitFontFace(node) {\n const declarations = node.getDeclarations();\n if (!declarations) {\n // syntax error\n return false;\n }\n let definesSrc = false, definesFontFamily = false;\n let containsUnknowns = false;\n for (const node of declarations.getChildren()) {\n if (this.isCSSDeclaration(node)) {\n const name = node.getProperty().getName().toLowerCase();\n if (name === 'src') {\n definesSrc = true;\n }\n if (name === 'font-family') {\n definesFontFamily = true;\n }\n }\n else {\n containsUnknowns = true;\n }\n }\n if (!containsUnknowns && (!definesSrc || !definesFontFamily)) {\n this.addEntry(node, Rules.RequiredPropertiesForFontFace);\n }\n return true;\n }\n isCSSDeclaration(node) {\n if (node instanceof nodes.Declaration) {\n if (!node.getValue()) {\n return false;\n }\n const property = node.getProperty();\n if (!property) {\n return false;\n }\n const identifier = property.getIdentifier();\n if (!identifier || identifier.containsInterpolation()) {\n return false;\n }\n return true;\n }\n return false;\n }\n visitHexColorValue(node) {\n // Rule: #eeff0011 or #eeff00 or #ef01 or #ef0\n const length = node.length;\n if (length !== 9 && length !== 7 && length !== 5 && length !== 4) {\n this.addEntry(node, Rules.HexColorLength);\n }\n return false;\n }\n visitFunction(node) {\n const fnName = node.getName().toLowerCase();\n let expectedAttrCount = -1;\n let actualAttrCount = 0;\n switch (fnName) {\n case 'rgb(':\n case 'hsl(':\n expectedAttrCount = 3;\n break;\n case 'rgba(':\n case 'hsla(':\n expectedAttrCount = 4;\n break;\n }\n if (expectedAttrCount !== -1) {\n node.getArguments().accept(n => {\n if (n instanceof nodes.BinaryExpression) {\n actualAttrCount += 1;\n return false;\n }\n return true;\n });\n if (actualAttrCount !== expectedAttrCount) {\n this.addEntry(node, Rules.ArgsInColorFunction);\n }\n }\n return true;\n }\n}\nLintVisitor.prefixes = [\n '-ms-', '-moz-', '-o-', '-webkit-', // Quite common\n //\t\t'-xv-', '-atsc-', '-wap-', '-khtml-', 'mso-', 'prince-', '-ah-', '-hp-', '-ro-', '-rim-', '-tc-' // Quite un-common\n];\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport * as nodes from '../parser/cssNodes';\nimport { LintConfigurationSettings, Rules } from './lintRules';\nimport { LintVisitor } from './lint';\nimport { Range, DiagnosticSeverity } from '../cssLanguageTypes';\nexport class CSSValidation {\n constructor(cssDataManager) {\n this.cssDataManager = cssDataManager;\n }\n configure(settings) {\n this.settings = settings;\n }\n doValidation(document, stylesheet, settings = this.settings) {\n if (settings && settings.validate === false) {\n return [];\n }\n const entries = [];\n entries.push.apply(entries, nodes.ParseErrorCollector.entries(stylesheet));\n entries.push.apply(entries, LintVisitor.entries(stylesheet, document, new LintConfigurationSettings(settings && settings.lint), this.cssDataManager));\n const ruleIds = [];\n for (const r in Rules) {\n ruleIds.push(Rules[r].id);\n }\n function toDiagnostic(marker) {\n const range = Range.create(document.positionAt(marker.getOffset()), document.positionAt(marker.getOffset() + marker.getLength()));\n const source = document.languageId;\n return {\n code: marker.getRule().id,\n source: source,\n message: marker.getMessage(),\n severity: marker.getLevel() === nodes.Level.Warning ? DiagnosticSeverity.Warning : DiagnosticSeverity.Error,\n range: range\n };\n }\n return entries.filter(entry => entry.getLevel() !== nodes.Level.Ignore).map(toDiagnostic);\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport { TokenType, Scanner } from './cssScanner';\nconst _FSL = '/'.charCodeAt(0);\nconst _NWL = '\\n'.charCodeAt(0);\nconst _CAR = '\\r'.charCodeAt(0);\nconst _LFD = '\\f'.charCodeAt(0);\nconst _DLR = '$'.charCodeAt(0);\nconst _HSH = '#'.charCodeAt(0);\nconst _CUL = '{'.charCodeAt(0);\nconst _EQS = '='.charCodeAt(0);\nconst _BNG = '!'.charCodeAt(0);\nconst _LAN = '<'.charCodeAt(0);\nconst _RAN = '>'.charCodeAt(0);\nconst _DOT = '.'.charCodeAt(0);\nconst _ATS = '@'.charCodeAt(0);\nlet customTokenValue = TokenType.CustomToken;\nexport const VariableName = customTokenValue++;\nexport const InterpolationFunction = customTokenValue++;\nexport const Default = customTokenValue++;\nexport const EqualsOperator = customTokenValue++;\nexport const NotEqualsOperator = customTokenValue++;\nexport const GreaterEqualsOperator = customTokenValue++;\nexport const SmallerEqualsOperator = customTokenValue++;\nexport const Ellipsis = customTokenValue++;\nexport const Module = customTokenValue++;\nexport class SCSSScanner extends Scanner {\n scanNext(offset) {\n // scss variable\n if (this.stream.advanceIfChar(_DLR)) {\n const content = ['$'];\n if (this.ident(content)) {\n return this.finishToken(offset, VariableName, content.join(''));\n }\n else {\n this.stream.goBackTo(offset);\n }\n }\n // scss: interpolation function #{..})\n if (this.stream.advanceIfChars([_HSH, _CUL])) {\n return this.finishToken(offset, InterpolationFunction);\n }\n // operator ==\n if (this.stream.advanceIfChars([_EQS, _EQS])) {\n return this.finishToken(offset, EqualsOperator);\n }\n // operator !=\n if (this.stream.advanceIfChars([_BNG, _EQS])) {\n return this.finishToken(offset, NotEqualsOperator);\n }\n // operators <, <=\n if (this.stream.advanceIfChar(_LAN)) {\n if (this.stream.advanceIfChar(_EQS)) {\n return this.finishToken(offset, SmallerEqualsOperator);\n }\n return this.finishToken(offset, TokenType.Delim);\n }\n // ooperators >, >=\n if (this.stream.advanceIfChar(_RAN)) {\n if (this.stream.advanceIfChar(_EQS)) {\n return this.finishToken(offset, GreaterEqualsOperator);\n }\n return this.finishToken(offset, TokenType.Delim);\n }\n // ellipis\n if (this.stream.advanceIfChars([_DOT, _DOT, _DOT])) {\n return this.finishToken(offset, Ellipsis);\n }\n return super.scanNext(offset);\n }\n comment() {\n if (super.comment()) {\n return true;\n }\n if (!this.inURL && this.stream.advanceIfChars([_FSL, _FSL])) {\n this.stream.advanceWhileChar((ch) => {\n switch (ch) {\n case _NWL:\n case _CAR:\n case _LFD:\n return false;\n default:\n return true;\n }\n });\n return true;\n }\n else {\n return false;\n }\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport * as l10n from '@vscode/l10n';\nexport class SCSSIssueType {\n constructor(id, message) {\n this.id = id;\n this.message = message;\n }\n}\nexport const SCSSParseError = {\n FromExpected: new SCSSIssueType('scss-fromexpected', l10n.t(\"'from' expected\")),\n ThroughOrToExpected: new SCSSIssueType('scss-throughexpected', l10n.t(\"'through' or 'to' expected\")),\n InExpected: new SCSSIssueType('scss-fromexpected', l10n.t(\"'in' expected\")),\n};\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport * as scssScanner from './scssScanner';\nimport { TokenType } from './cssScanner';\nimport * as cssParser from './cssParser';\nimport * as nodes from './cssNodes';\nimport { SCSSParseError } from './scssErrors';\nimport { ParseError } from './cssErrors';\n/// <summary>\n/// A parser for scss\n/// http://sass-lang.com/documentation/file.SASS_REFERENCE.html\n/// </summary>\nexport class SCSSParser extends cssParser.Parser {\n constructor() {\n super(new scssScanner.SCSSScanner());\n }\n _parseStylesheetStatement(isNested = false) {\n if (this.peek(TokenType.AtKeyword)) {\n return this._parseWarnAndDebug() // @warn, @debug and @error statements\n || this._parseControlStatement() // @if, @while, @for, @each\n || this._parseMixinDeclaration() // @mixin\n || this._parseMixinContent() // @content\n || this._parseMixinReference() // @include\n || this._parseFunctionDeclaration() // @function\n || this._parseForward() // @forward\n || this._parseUse() // @use\n || this._parseRuleset(isNested) // @at-rule\n || super._parseStylesheetAtStatement(isNested);\n }\n return this._parseRuleset(true) || this._parseVariableDeclaration();\n }\n _parseImport() {\n if (!this.peekKeyword('@import')) {\n return null;\n }\n const node = this.create(nodes.Import);\n this.consumeToken();\n if (!node.addChild(this._parseURILiteral()) && !node.addChild(this._parseStringLiteral())) {\n return this.finish(node, ParseError.URIOrStringExpected);\n }\n while (this.accept(TokenType.Comma)) {\n if (!node.addChild(this._parseURILiteral()) && !node.addChild(this._parseStringLiteral())) {\n return this.finish(node, ParseError.URIOrStringExpected);\n }\n }\n if (!this.peek(TokenType.SemiColon) && !this.peek(TokenType.EOF)) {\n node.setMedialist(this._parseMediaQueryList());\n }\n return this.finish(node);\n }\n // scss variables: $font-size: 12px;\n _parseVariableDeclaration(panic = []) {\n if (!this.peek(scssScanner.VariableName)) {\n return null;\n }\n const node = this.create(nodes.VariableDeclaration);\n if (!node.setVariable(this._parseVariable())) {\n return null;\n }\n if (!this.accept(TokenType.Colon)) {\n return this.finish(node, ParseError.ColonExpected);\n }\n if (this.prevToken) {\n node.colonPosition = this.prevToken.offset;\n }\n if (!node.setValue(this._parseExpr())) {\n return this.finish(node, ParseError.VariableValueExpected, [], panic);\n }\n while (this.peek(TokenType.Exclamation)) {\n if (node.addChild(this._tryParsePrio())) {\n // !important\n }\n else {\n this.consumeToken();\n if (!this.peekRegExp(TokenType.Ident, /^(default|global)$/)) {\n return this.finish(node, ParseError.UnknownKeyword);\n }\n this.consumeToken();\n }\n }\n if (this.peek(TokenType.SemiColon)) {\n node.semicolonPosition = this.token.offset; // not part of the declaration, but useful information for code assist\n }\n return this.finish(node);\n }\n _parseMediaCondition() {\n return this._parseInterpolation() || super._parseMediaCondition();\n }\n _parseMediaFeatureRangeOperator() {\n return this.accept(scssScanner.SmallerEqualsOperator) || this.accept(scssScanner.GreaterEqualsOperator) || super._parseMediaFeatureRangeOperator();\n }\n _parseMediaFeatureName() {\n return this._parseModuleMember()\n || this._parseFunction() // function before ident\n || this._parseIdent()\n || this._parseVariable();\n }\n _parseKeyframeSelector() {\n return this._tryParseKeyframeSelector()\n || this._parseControlStatement(this._parseKeyframeSelector.bind(this))\n || this._parseVariableDeclaration()\n || this._parseMixinContent();\n }\n _parseVariable() {\n if (!this.peek(scssScanner.VariableName)) {\n return null;\n }\n const node = this.create(nodes.Variable);\n this.consumeToken();\n return node;\n }\n _parseModuleMember() {\n const pos = this.mark();\n const node = this.create(nodes.Module);\n if (!node.setIdentifier(this._parseIdent([nodes.ReferenceType.Module]))) {\n return null;\n }\n if (this.hasWhitespace()\n || !this.acceptDelim('.')\n || this.hasWhitespace()) {\n this.restoreAtMark(pos);\n return null;\n }\n if (!node.addChild(this._parseVariable() || this._parseFunction())) {\n return this.finish(node, ParseError.IdentifierOrVariableExpected);\n }\n return node;\n }\n _parseIdent(referenceTypes) {\n if (!this.peek(TokenType.Ident) && !this.peek(scssScanner.InterpolationFunction) && !this.peekDelim('-')) {\n return null;\n }\n const node = this.create(nodes.Identifier);\n node.referenceTypes = referenceTypes;\n node.isCustomProperty = this.peekRegExp(TokenType.Ident, /^--/);\n let hasContent = false;\n const indentInterpolation = () => {\n const pos = this.mark();\n if (this.acceptDelim('-')) {\n if (!this.hasWhitespace()) {\n this.acceptDelim('-');\n }\n if (this.hasWhitespace()) {\n this.restoreAtMark(pos);\n return null;\n }\n }\n return this._parseInterpolation();\n };\n while (this.accept(TokenType.Ident) || node.addChild(indentInterpolation()) || (hasContent && this.acceptRegexp(/^[\\w-]/))) {\n hasContent = true;\n if (this.hasWhitespace()) {\n break;\n }\n }\n return hasContent ? this.finish(node) : null;\n }\n _parseTermExpression() {\n return this._parseModuleMember() ||\n this._parseVariable() ||\n this._parseSelectorCombinator() ||\n //this._tryParsePrio() ||\n super._parseTermExpression();\n }\n _parseInterpolation() {\n if (this.peek(scssScanner.InterpolationFunction)) {\n const node = this.create(nodes.Interpolation);\n this.consumeToken();\n if (!node.addChild(this._parseExpr()) && !this._parseSelectorCombinator()) {\n if (this.accept(TokenType.CurlyR)) {\n return this.finish(node);\n }\n return this.finish(node, ParseError.ExpressionExpected);\n }\n if (!this.accept(TokenType.CurlyR)) {\n return this.finish(node, ParseError.RightCurlyExpected);\n }\n return this.finish(node);\n }\n return null;\n }\n _parseOperator() {\n if (this.peek(scssScanner.EqualsOperator) || this.peek(scssScanner.NotEqualsOperator)\n || this.peek(scssScanner.GreaterEqualsOperator) || this.peek(scssScanner.SmallerEqualsOperator)\n || this.peekDelim('>') || this.peekDelim('<')\n || this.peekIdent('and') || this.peekIdent('or')\n || this.peekDelim('%')) {\n const node = this.createNode(nodes.NodeType.Operator);\n this.consumeToken();\n return this.finish(node);\n }\n return super._parseOperator();\n }\n _parseUnaryOperator() {\n if (this.peekIdent('not')) {\n const node = this.create(nodes.Node);\n this.consumeToken();\n return this.finish(node);\n }\n return super._parseUnaryOperator();\n }\n _parseRuleSetDeclaration() {\n if (this.peek(TokenType.AtKeyword)) {\n return this._parseKeyframe() // nested @keyframe\n || this._parseImport() // nested @import\n || this._parseMedia(true) // nested @media\n || this._parseFontFace() // nested @font-face\n || this._parseWarnAndDebug() // @warn, @debug and @error statements\n || this._parseControlStatement() // @if, @while, @for, @each\n || this._parseFunctionDeclaration() // @function\n || this._parseExtends() // @extends\n || this._parseMixinReference() // @include\n || this._parseMixinContent() // @content\n || this._parseMixinDeclaration() // nested @mixin\n || this._parseRuleset(true) // @at-rule\n || this._parseSupports(true) // @supports\n || this._parseLayer() // @layer\n || this._parsePropertyAtRule() // @property\n || super._parseRuleSetDeclarationAtStatement();\n }\n return this._parseVariableDeclaration() // variable declaration\n || this._tryParseRuleset(true) // nested ruleset\n || super._parseRuleSetDeclaration(); // try css ruleset declaration as last so in the error case, the ast will contain a declaration\n }\n _parseDeclaration(stopTokens) {\n const custonProperty = this._tryParseCustomPropertyDeclaration(stopTokens);\n if (custonProperty) {\n return custonProperty;\n }\n const node = this.create(nodes.Declaration);\n if (!node.setProperty(this._parseProperty())) {\n return null;\n }\n if (!this.accept(TokenType.Colon)) {\n return this.finish(node, ParseError.ColonExpected, [TokenType.Colon], stopTokens || [TokenType.SemiColon]);\n }\n if (this.prevToken) {\n node.colonPosition = this.prevToken.offset;\n }\n let hasContent = false;\n if (node.setValue(this._parseExpr())) {\n hasContent = true;\n node.addChild(this._parsePrio());\n }\n if (this.peek(TokenType.CurlyL)) {\n node.setNestedProperties(this._parseNestedProperties());\n }\n else {\n if (!hasContent) {\n return this.finish(node, ParseError.PropertyValueExpected);\n }\n }\n if (this.peek(TokenType.SemiColon)) {\n node.semicolonPosition = this.token.offset; // not part of the declaration, but useful information for code assist\n }\n return this.finish(node);\n }\n _parseNestedProperties() {\n const node = this.create(nodes.NestedProperties);\n return this._parseBody(node, this._parseDeclaration.bind(this));\n }\n _parseExtends() {\n if (this.peekKeyword('@extend')) {\n const node = this.create(nodes.ExtendsReference);\n this.consumeToken();\n if (!node.getSelectors().addChild(this._parseSimpleSelector())) {\n return this.finish(node, ParseError.SelectorExpected);\n }\n while (this.accept(TokenType.Comma)) {\n node.getSelectors().addChild(this._parseSimpleSelector());\n }\n if (this.accept(TokenType.Exclamation)) {\n if (!this.acceptIdent('optional')) {\n return this.finish(node, ParseError.UnknownKeyword);\n }\n }\n return this.finish(node);\n }\n return null;\n }\n _parseSimpleSelectorBody() {\n return this._parseSelectorCombinator() || this._parseSelectorPlaceholder() || super._parseSimpleSelectorBody();\n }\n _parseSelectorCombinator() {\n if (this.peekDelim('&')) {\n const node = this.createNode(nodes.NodeType.SelectorCombinator);\n this.consumeToken();\n while (!this.hasWhitespace() && (this.acceptDelim('-') || this.accept(TokenType.Num) || this.accept(TokenType.Dimension) || node.addChild(this._parseIdent()) || this.acceptDelim('&'))) {\n // support &-foo-1\n }\n return this.finish(node);\n }\n return null;\n }\n _parseSelectorPlaceholder() {\n if (this.peekDelim('%')) {\n const node = this.createNode(nodes.NodeType.SelectorPlaceholder);\n this.consumeToken();\n this._parseIdent();\n return this.finish(node);\n }\n else if (this.peekKeyword('@at-root')) {\n const node = this.createNode(nodes.NodeType.SelectorPlaceholder);\n this.consumeToken();\n if (this.accept(TokenType.ParenthesisL)) {\n if (!this.acceptIdent('with') && !this.acceptIdent('without')) {\n return this.finish(node, ParseError.IdentifierExpected);\n }\n if (!this.accept(TokenType.Colon)) {\n return this.finish(node, ParseError.ColonExpected);\n }\n if (!node.addChild(this._parseIdent())) {\n return this.finish(node, ParseError.IdentifierExpected);\n }\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected, [TokenType.CurlyR]);\n }\n }\n return this.finish(node);\n }\n return null;\n }\n _parseElementName() {\n const pos = this.mark();\n const node = super._parseElementName();\n if (node && !this.hasWhitespace() && this.peek(TokenType.ParenthesisL)) { // for #49589\n this.restoreAtMark(pos);\n return null;\n }\n return node;\n }\n _tryParsePseudoIdentifier() {\n return this._parseInterpolation() || super._tryParsePseudoIdentifier(); // for #49589\n }\n _parseWarnAndDebug() {\n if (!this.peekKeyword('@debug')\n && !this.peekKeyword('@warn')\n && !this.peekKeyword('@error')) {\n return null;\n }\n const node = this.createNode(nodes.NodeType.Debug);\n this.consumeToken(); // @debug, @warn or @error\n node.addChild(this._parseExpr()); // optional\n return this.finish(node);\n }\n _parseControlStatement(parseStatement = this._parseRuleSetDeclaration.bind(this)) {\n if (!this.peek(TokenType.AtKeyword)) {\n return null;\n }\n return this._parseIfStatement(parseStatement) || this._parseForStatement(parseStatement)\n || this._parseEachStatement(parseStatement) || this._parseWhileStatement(parseStatement);\n }\n _parseIfStatement(parseStatement) {\n if (!this.peekKeyword('@if')) {\n return null;\n }\n return this._internalParseIfStatement(parseStatement);\n }\n _internalParseIfStatement(parseStatement) {\n const node = this.create(nodes.IfStatement);\n this.consumeToken(); // @if or if\n if (!node.setExpression(this._parseExpr(true))) {\n return this.finish(node, ParseError.ExpressionExpected);\n }\n this._parseBody(node, parseStatement);\n if (this.acceptKeyword('@else')) {\n if (this.peekIdent('if')) {\n node.setElseClause(this._internalParseIfStatement(parseStatement));\n }\n else if (this.peek(TokenType.CurlyL)) {\n const elseNode = this.create(nodes.ElseStatement);\n this._parseBody(elseNode, parseStatement);\n node.setElseClause(elseNode);\n }\n }\n return this.finish(node);\n }\n _parseForStatement(parseStatement) {\n if (!this.peekKeyword('@for')) {\n return null;\n }\n const node = this.create(nodes.ForStatement);\n this.consumeToken(); // @for\n if (!node.setVariable(this._parseVariable())) {\n return this.finish(node, ParseError.VariableNameExpected, [TokenType.CurlyR]);\n }\n if (!this.acceptIdent('from')) {\n return this.finish(node, SCSSParseError.FromExpected, [TokenType.CurlyR]);\n }\n if (!node.addChild(this._parseBinaryExpr())) {\n return this.finish(node, ParseError.ExpressionExpected, [TokenType.CurlyR]);\n }\n if (!this.acceptIdent('to') && !this.acceptIdent('through')) {\n return this.finish(node, SCSSParseError.ThroughOrToExpected, [TokenType.CurlyR]);\n }\n if (!node.addChild(this._parseBinaryExpr())) {\n return this.finish(node, ParseError.ExpressionExpected, [TokenType.CurlyR]);\n }\n return this._parseBody(node, parseStatement);\n }\n _parseEachStatement(parseStatement) {\n if (!this.peekKeyword('@each')) {\n return null;\n }\n const node = this.create(nodes.EachStatement);\n this.consumeToken(); // @each\n const variables = node.getVariables();\n if (!variables.addChild(this._parseVariable())) {\n return this.finish(node, ParseError.VariableNameExpected, [TokenType.CurlyR]);\n }\n while (this.accept(TokenType.Comma)) {\n if (!variables.addChild(this._parseVariable())) {\n return this.finish(node, ParseError.VariableNameExpected, [TokenType.CurlyR]);\n }\n }\n this.finish(variables);\n if (!this.acceptIdent('in')) {\n return this.finish(node, SCSSParseError.InExpected, [TokenType.CurlyR]);\n }\n if (!node.addChild(this._parseExpr())) {\n return this.finish(node, ParseError.ExpressionExpected, [TokenType.CurlyR]);\n }\n return this._parseBody(node, parseStatement);\n }\n _parseWhileStatement(parseStatement) {\n if (!this.peekKeyword('@while')) {\n return null;\n }\n const node = this.create(nodes.WhileStatement);\n this.consumeToken(); // @while\n if (!node.addChild(this._parseBinaryExpr())) {\n return this.finish(node, ParseError.ExpressionExpected, [TokenType.CurlyR]);\n }\n return this._parseBody(node, parseStatement);\n }\n _parseFunctionBodyDeclaration() {\n return this._parseVariableDeclaration() || this._parseReturnStatement() || this._parseWarnAndDebug()\n || this._parseControlStatement(this._parseFunctionBodyDeclaration.bind(this));\n }\n _parseFunctionDeclaration() {\n if (!this.peekKeyword('@function')) {\n return null;\n }\n const node = this.create(nodes.FunctionDeclaration);\n this.consumeToken(); // @function\n if (!node.setIdentifier(this._parseIdent([nodes.ReferenceType.Function]))) {\n return this.finish(node, ParseError.IdentifierExpected, [TokenType.CurlyR]);\n }\n if (!this.accept(TokenType.ParenthesisL)) {\n return this.finish(node, ParseError.LeftParenthesisExpected, [TokenType.CurlyR]);\n }\n if (node.getParameters().addChild(this._parseParameterDeclaration())) {\n while (this.accept(TokenType.Comma)) {\n if (this.peek(TokenType.ParenthesisR)) {\n break;\n }\n if (!node.getParameters().addChild(this._parseParameterDeclaration())) {\n return this.finish(node, ParseError.VariableNameExpected);\n }\n }\n }\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected, [TokenType.CurlyR]);\n }\n return this._parseBody(node, this._parseFunctionBodyDeclaration.bind(this));\n }\n _parseReturnStatement() {\n if (!this.peekKeyword('@return')) {\n return null;\n }\n const node = this.createNode(nodes.NodeType.ReturnStatement);\n this.consumeToken(); // @function\n if (!node.addChild(this._parseExpr())) {\n return this.finish(node, ParseError.ExpressionExpected);\n }\n return this.finish(node);\n }\n _parseMixinDeclaration() {\n if (!this.peekKeyword('@mixin')) {\n return null;\n }\n const node = this.create(nodes.MixinDeclaration);\n this.consumeToken();\n if (!node.setIdentifier(this._parseIdent([nodes.ReferenceType.Mixin]))) {\n return this.finish(node, ParseError.IdentifierExpected, [TokenType.CurlyR]);\n }\n if (this.accept(TokenType.ParenthesisL)) {\n if (node.getParameters().addChild(this._parseParameterDeclaration())) {\n while (this.accept(TokenType.Comma)) {\n if (this.peek(TokenType.ParenthesisR)) {\n break;\n }\n if (!node.getParameters().addChild(this._parseParameterDeclaration())) {\n return this.finish(node, ParseError.VariableNameExpected);\n }\n }\n }\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected, [TokenType.CurlyR]);\n }\n }\n return this._parseBody(node, this._parseRuleSetDeclaration.bind(this));\n }\n _parseParameterDeclaration() {\n const node = this.create(nodes.FunctionParameter);\n if (!node.setIdentifier(this._parseVariable())) {\n return null;\n }\n if (this.accept(scssScanner.Ellipsis)) {\n // ok\n }\n if (this.accept(TokenType.Colon)) {\n if (!node.setDefaultValue(this._parseExpr(true))) {\n return this.finish(node, ParseError.VariableValueExpected, [], [TokenType.Comma, TokenType.ParenthesisR]);\n }\n }\n return this.finish(node);\n }\n _parseMixinContent() {\n if (!this.peekKeyword('@content')) {\n return null;\n }\n const node = this.create(nodes.MixinContentReference);\n this.consumeToken();\n if (this.accept(TokenType.ParenthesisL)) {\n if (node.getArguments().addChild(this._parseFunctionArgument())) {\n while (this.accept(TokenType.Comma)) {\n if (this.peek(TokenType.ParenthesisR)) {\n break;\n }\n if (!node.getArguments().addChild(this._parseFunctionArgument())) {\n return this.finish(node, ParseError.ExpressionExpected);\n }\n }\n }\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected);\n }\n }\n return this.finish(node);\n }\n _parseMixinReference() {\n if (!this.peekKeyword('@include')) {\n return null;\n }\n const node = this.create(nodes.MixinReference);\n this.consumeToken();\n // Could be module or mixin identifier, set as mixin as default.\n const firstIdent = this._parseIdent([nodes.ReferenceType.Mixin]);\n if (!node.setIdentifier(firstIdent)) {\n return this.finish(node, ParseError.IdentifierExpected, [TokenType.CurlyR]);\n }\n // Is a module accessor.\n if (!this.hasWhitespace() && this.acceptDelim('.') && !this.hasWhitespace()) {\n const secondIdent = this._parseIdent([nodes.ReferenceType.Mixin]);\n if (!secondIdent) {\n return this.finish(node, ParseError.IdentifierExpected, [TokenType.CurlyR]);\n }\n const moduleToken = this.create(nodes.Module);\n // Re-purpose first matched ident as identifier for module token.\n firstIdent.referenceTypes = [nodes.ReferenceType.Module];\n moduleToken.setIdentifier(firstIdent);\n // Override identifier with second ident.\n node.setIdentifier(secondIdent);\n node.addChild(moduleToken);\n }\n if (this.accept(TokenType.ParenthesisL)) {\n if (node.getArguments().addChild(this._parseFunctionArgument())) {\n while (this.accept(TokenType.Comma)) {\n if (this.peek(TokenType.ParenthesisR)) {\n break;\n }\n if (!node.getArguments().addChild(this._parseFunctionArgument())) {\n return this.finish(node, ParseError.ExpressionExpected);\n }\n }\n }\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected);\n }\n }\n if (this.peekIdent('using') || this.peek(TokenType.CurlyL)) {\n node.setContent(this._parseMixinContentDeclaration());\n }\n return this.finish(node);\n }\n _parseMixinContentDeclaration() {\n const node = this.create(nodes.MixinContentDeclaration);\n if (this.acceptIdent('using')) {\n if (!this.accept(TokenType.ParenthesisL)) {\n return this.finish(node, ParseError.LeftParenthesisExpected, [TokenType.CurlyL]);\n }\n if (node.getParameters().addChild(this._parseParameterDeclaration())) {\n while (this.accept(TokenType.Comma)) {\n if (this.peek(TokenType.ParenthesisR)) {\n break;\n }\n if (!node.getParameters().addChild(this._parseParameterDeclaration())) {\n return this.finish(node, ParseError.VariableNameExpected);\n }\n }\n }\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected, [TokenType.CurlyL]);\n }\n }\n if (this.peek(TokenType.CurlyL)) {\n this._parseBody(node, this._parseMixinReferenceBodyStatement.bind(this));\n }\n return this.finish(node);\n }\n _parseMixinReferenceBodyStatement() {\n return this._tryParseKeyframeSelector() || this._parseRuleSetDeclaration();\n }\n _parseFunctionArgument() {\n // [variableName ':'] expression | variableName '...'\n const node = this.create(nodes.FunctionArgument);\n const pos = this.mark();\n const argument = this._parseVariable();\n if (argument) {\n if (!this.accept(TokenType.Colon)) {\n if (this.accept(scssScanner.Ellipsis)) { // optional\n node.setValue(argument);\n return this.finish(node);\n }\n else {\n this.restoreAtMark(pos);\n }\n }\n else {\n node.setIdentifier(argument);\n }\n }\n if (node.setValue(this._parseExpr(true))) {\n this.accept(scssScanner.Ellipsis); // #43746\n node.addChild(this._parsePrio()); // #9859\n return this.finish(node);\n }\n else if (node.setValue(this._tryParsePrio())) {\n return this.finish(node);\n }\n return null;\n }\n _parseURLArgument() {\n const pos = this.mark();\n const node = super._parseURLArgument();\n if (!node || !this.peek(TokenType.ParenthesisR)) {\n this.restoreAtMark(pos);\n const node = this.create(nodes.Node);\n node.addChild(this._parseBinaryExpr());\n return this.finish(node);\n }\n return node;\n }\n _parseOperation() {\n if (!this.peek(TokenType.ParenthesisL)) {\n return null;\n }\n const node = this.create(nodes.Node);\n this.consumeToken();\n while (node.addChild(this._parseListElement())) {\n this.accept(TokenType.Comma); // optional\n }\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected);\n }\n return this.finish(node);\n }\n _parseListElement() {\n const node = this.create(nodes.ListEntry);\n const child = this._parseBinaryExpr();\n if (!child) {\n return null;\n }\n if (this.accept(TokenType.Colon)) {\n node.setKey(child);\n if (!node.setValue(this._parseBinaryExpr())) {\n return this.finish(node, ParseError.ExpressionExpected);\n }\n }\n else {\n node.setValue(child);\n }\n return this.finish(node);\n }\n _parseUse() {\n if (!this.peekKeyword('@use')) {\n return null;\n }\n const node = this.create(nodes.Use);\n this.consumeToken(); // @use\n if (!node.addChild(this._parseStringLiteral())) {\n return this.finish(node, ParseError.StringLiteralExpected);\n }\n if (!this.peek(TokenType.SemiColon) && !this.peek(TokenType.EOF)) {\n if (!this.peekRegExp(TokenType.Ident, /as|with/)) {\n return this.finish(node, ParseError.UnknownKeyword);\n }\n if (this.acceptIdent('as') &&\n (!node.setIdentifier(this._parseIdent([nodes.ReferenceType.Module])) && !this.acceptDelim('*'))) {\n return this.finish(node, ParseError.IdentifierOrWildcardExpected);\n }\n if (this.acceptIdent('with')) {\n if (!this.accept(TokenType.ParenthesisL)) {\n return this.finish(node, ParseError.LeftParenthesisExpected, [TokenType.ParenthesisR]);\n }\n // First variable statement, no comma.\n if (!node.getParameters().addChild(this._parseModuleConfigDeclaration())) {\n return this.finish(node, ParseError.VariableNameExpected);\n }\n while (this.accept(TokenType.Comma)) {\n if (this.peek(TokenType.ParenthesisR)) {\n break;\n }\n if (!node.getParameters().addChild(this._parseModuleConfigDeclaration())) {\n return this.finish(node, ParseError.VariableNameExpected);\n }\n }\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected);\n }\n }\n }\n if (!this.accept(TokenType.SemiColon) && !this.accept(TokenType.EOF)) {\n return this.finish(node, ParseError.SemiColonExpected);\n }\n return this.finish(node);\n }\n _parseModuleConfigDeclaration() {\n const node = this.create(nodes.ModuleConfiguration);\n if (!node.setIdentifier(this._parseVariable())) {\n return null;\n }\n if (!this.accept(TokenType.Colon) || !node.setValue(this._parseExpr(true))) {\n return this.finish(node, ParseError.VariableValueExpected, [], [TokenType.Comma, TokenType.ParenthesisR]);\n }\n if (this.accept(TokenType.Exclamation)) {\n if (this.hasWhitespace() || !this.acceptIdent('default')) {\n return this.finish(node, ParseError.UnknownKeyword);\n }\n }\n return this.finish(node);\n }\n _parseForward() {\n if (!this.peekKeyword('@forward')) {\n return null;\n }\n const node = this.create(nodes.Forward);\n this.consumeToken();\n if (!node.addChild(this._parseStringLiteral())) {\n return this.finish(node, ParseError.StringLiteralExpected);\n }\n if (this.acceptIdent('as')) {\n const identifier = this._parseIdent([nodes.ReferenceType.Forward]);\n if (!node.setIdentifier(identifier)) {\n return this.finish(node, ParseError.IdentifierExpected);\n }\n // Wildcard must be the next character after the identifier string.\n if (this.hasWhitespace() || !this.acceptDelim('*')) {\n return this.finish(node, ParseError.WildcardExpected);\n }\n }\n if (this.acceptIdent('with')) {\n if (!this.accept(TokenType.ParenthesisL)) {\n return this.finish(node, ParseError.LeftParenthesisExpected, [TokenType.ParenthesisR]);\n }\n // First variable statement, no comma.\n if (!node.getParameters().addChild(this._parseModuleConfigDeclaration())) {\n return this.finish(node, ParseError.VariableNameExpected);\n }\n while (this.accept(TokenType.Comma)) {\n if (this.peek(TokenType.ParenthesisR)) {\n break;\n }\n if (!node.getParameters().addChild(this._parseModuleConfigDeclaration())) {\n return this.finish(node, ParseError.VariableNameExpected);\n }\n }\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected);\n }\n }\n else if (this.peekIdent('hide') || this.peekIdent('show')) {\n if (!node.addChild(this._parseForwardVisibility())) {\n return this.finish(node, ParseError.IdentifierOrVariableExpected);\n }\n }\n if (!this.accept(TokenType.SemiColon) && !this.accept(TokenType.EOF)) {\n return this.finish(node, ParseError.SemiColonExpected);\n }\n return this.finish(node);\n }\n _parseForwardVisibility() {\n const node = this.create(nodes.ForwardVisibility);\n // Assume to be \"hide\" or \"show\".\n node.setIdentifier(this._parseIdent());\n while (node.addChild(this._parseVariable() || this._parseIdent())) {\n // Consume all variables and idents ahead.\n this.accept(TokenType.Comma);\n }\n // More than just identifier \n return node.getChildren().length > 1 ? node : null;\n }\n _parseSupportsCondition() {\n return this._parseInterpolation() || super._parseSupportsCondition();\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport { CSSCompletion } from './cssCompletion';\nimport * as nodes from '../parser/cssNodes';\nimport { CompletionItemKind, TextEdit, InsertTextFormat } from '../cssLanguageTypes';\nimport * as l10n from '@vscode/l10n';\nconst sassDocumentationName = l10n.t('Sass documentation');\nexport class SCSSCompletion extends CSSCompletion {\n constructor(lsServiceOptions, cssDataManager) {\n super('$', lsServiceOptions, cssDataManager);\n addReferencesToDocumentation(SCSSCompletion.scssModuleLoaders);\n addReferencesToDocumentation(SCSSCompletion.scssModuleBuiltIns);\n }\n isImportPathParent(type) {\n return type === nodes.NodeType.Forward\n || type === nodes.NodeType.Use\n || super.isImportPathParent(type);\n }\n getCompletionForImportPath(importPathNode, result) {\n const parentType = importPathNode.getParent().type;\n if (parentType === nodes.NodeType.Forward || parentType === nodes.NodeType.Use) {\n for (let p of SCSSCompletion.scssModuleBuiltIns) {\n const item = {\n label: p.label,\n documentation: p.documentation,\n textEdit: TextEdit.replace(this.getCompletionRange(importPathNode), `'${p.label}'`),\n kind: CompletionItemKind.Module\n };\n result.items.push(item);\n }\n }\n return super.getCompletionForImportPath(importPathNode, result);\n }\n createReplaceFunction() {\n let tabStopCounter = 1;\n return (_match, p1) => {\n return '\\\\' + p1 + ': ${' + tabStopCounter++ + ':' + (SCSSCompletion.variableDefaults[p1] || '') + '}';\n };\n }\n createFunctionProposals(proposals, existingNode, sortToEnd, result) {\n for (const p of proposals) {\n const insertText = p.func.replace(/\\[?(\\$\\w+)\\]?/g, this.createReplaceFunction());\n const label = p.func.substr(0, p.func.indexOf('('));\n const item = {\n label: label,\n detail: p.func,\n documentation: p.desc,\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), insertText),\n insertTextFormat: InsertTextFormat.Snippet,\n kind: CompletionItemKind.Function\n };\n if (sortToEnd) {\n item.sortText = 'z';\n }\n result.items.push(item);\n }\n return result;\n }\n getCompletionsForSelector(ruleSet, isNested, result) {\n this.createFunctionProposals(SCSSCompletion.selectorFuncs, null, true, result);\n return super.getCompletionsForSelector(ruleSet, isNested, result);\n }\n getTermProposals(entry, existingNode, result) {\n let functions = SCSSCompletion.builtInFuncs;\n if (entry) {\n functions = functions.filter(f => !f.type || !entry.restrictions || entry.restrictions.indexOf(f.type) !== -1);\n }\n this.createFunctionProposals(functions, existingNode, true, result);\n return super.getTermProposals(entry, existingNode, result);\n }\n getColorProposals(entry, existingNode, result) {\n this.createFunctionProposals(SCSSCompletion.colorProposals, existingNode, false, result);\n return super.getColorProposals(entry, existingNode, result);\n }\n getCompletionsForDeclarationProperty(declaration, result) {\n this.getCompletionForAtDirectives(result);\n this.getCompletionsForSelector(null, true, result);\n return super.getCompletionsForDeclarationProperty(declaration, result);\n }\n getCompletionsForExtendsReference(_extendsRef, existingNode, result) {\n const symbols = this.getSymbolContext().findSymbolsAtOffset(this.offset, nodes.ReferenceType.Rule);\n for (const symbol of symbols) {\n const suggest = {\n label: symbol.name,\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), symbol.name),\n kind: CompletionItemKind.Function,\n };\n result.items.push(suggest);\n }\n return result;\n }\n getCompletionForAtDirectives(result) {\n result.items.push(...SCSSCompletion.scssAtDirectives);\n return result;\n }\n getCompletionForTopLevel(result) {\n this.getCompletionForAtDirectives(result);\n this.getCompletionForModuleLoaders(result);\n super.getCompletionForTopLevel(result);\n return result;\n }\n getCompletionForModuleLoaders(result) {\n result.items.push(...SCSSCompletion.scssModuleLoaders);\n return result;\n }\n}\nSCSSCompletion.variableDefaults = {\n '$red': '1',\n '$green': '2',\n '$blue': '3',\n '$alpha': '1.0',\n '$color': '#000000',\n '$weight': '0.5',\n '$hue': '0',\n '$saturation': '0%',\n '$lightness': '0%',\n '$degrees': '0',\n '$amount': '0',\n '$string': '\"\"',\n '$substring': '\"s\"',\n '$number': '0',\n '$limit': '1'\n};\nSCSSCompletion.colorProposals = [\n { func: 'red($color)', desc: l10n.t('Gets the red component of a color.') },\n { func: 'green($color)', desc: l10n.t('Gets the green component of a color.') },\n { func: 'blue($color)', desc: l10n.t('Gets the blue component of a color.') },\n { func: 'mix($color, $color, [$weight])', desc: l10n.t('Mixes two colors together.') },\n { func: 'hue($color)', desc: l10n.t('Gets the hue component of a color.') },\n { func: 'saturation($color)', desc: l10n.t('Gets the saturation component of a color.') },\n { func: 'lightness($color)', desc: l10n.t('Gets the lightness component of a color.') },\n { func: 'adjust-hue($color, $degrees)', desc: l10n.t('Changes the hue of a color.') },\n { func: 'lighten($color, $amount)', desc: l10n.t('Makes a color lighter.') },\n { func: 'darken($color, $amount)', desc: l10n.t('Makes a color darker.') },\n { func: 'saturate($color, $amount)', desc: l10n.t('Makes a color more saturated.') },\n { func: 'desaturate($color, $amount)', desc: l10n.t('Makes a color less saturated.') },\n { func: 'grayscale($color)', desc: l10n.t('Converts a color to grayscale.') },\n { func: 'complement($color)', desc: l10n.t('Returns the complement of a color.') },\n { func: 'invert($color)', desc: l10n.t('Returns the inverse of a color.') },\n { func: 'alpha($color)', desc: l10n.t('Gets the opacity component of a color.') },\n { func: 'opacity($color)', desc: 'Gets the alpha component (opacity) of a color.' },\n { func: 'rgba($color, $alpha)', desc: l10n.t('Changes the alpha component for a color.') },\n { func: 'opacify($color, $amount)', desc: l10n.t('Makes a color more opaque.') },\n { func: 'fade-in($color, $amount)', desc: l10n.t('Makes a color more opaque.') },\n { func: 'transparentize($color, $amount)', desc: l10n.t('Makes a color more transparent.') },\n { func: 'fade-out($color, $amount)', desc: l10n.t('Makes a color more transparent.') },\n { func: 'adjust-color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha])', desc: l10n.t('Increases or decreases one or more components of a color.') },\n { func: 'scale-color($color, [$red], [$green], [$blue], [$saturation], [$lightness], [$alpha])', desc: l10n.t('Fluidly scales one or more properties of a color.') },\n { func: 'change-color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha])', desc: l10n.t('Changes one or more properties of a color.') },\n { func: 'ie-hex-str($color)', desc: l10n.t('Converts a color into the format understood by IE filters.') }\n];\nSCSSCompletion.selectorFuncs = [\n { func: 'selector-nest($selectors\u2026)', desc: l10n.t('Nests selector beneath one another like they would be nested in the stylesheet.') },\n { func: 'selector-append($selectors\u2026)', desc: l10n.t('Appends selectors to one another without spaces in between.') },\n { func: 'selector-extend($selector, $extendee, $extender)', desc: l10n.t('Extends $extendee with $extender within $selector.') },\n { func: 'selector-replace($selector, $original, $replacement)', desc: l10n.t('Replaces $original with $replacement within $selector.') },\n { func: 'selector-unify($selector1, $selector2)', desc: l10n.t('Unifies two selectors to produce a selector that matches elements matched by both.') },\n { func: 'is-superselector($super, $sub)', desc: l10n.t('Returns whether $super matches all the elements $sub does, and possibly more.') },\n { func: 'simple-selectors($selector)', desc: l10n.t('Returns the simple selectors that comprise a compound selector.') },\n { func: 'selector-parse($selector)', desc: l10n.t('Parses a selector into the format returned by &.') }\n];\nSCSSCompletion.builtInFuncs = [\n { func: 'unquote($string)', desc: l10n.t('Removes quotes from a string.') },\n { func: 'quote($string)', desc: l10n.t('Adds quotes to a string.') },\n { func: 'str-length($string)', desc: l10n.t('Returns the number of characters in a string.') },\n { func: 'str-insert($string, $insert, $index)', desc: l10n.t('Inserts $insert into $string at $index.') },\n { func: 'str-index($string, $substring)', desc: l10n.t('Returns the index of the first occurance of $substring in $string.') },\n { func: 'str-slice($string, $start-at, [$end-at])', desc: l10n.t('Extracts a substring from $string.') },\n { func: 'to-upper-case($string)', desc: l10n.t('Converts a string to upper case.') },\n { func: 'to-lower-case($string)', desc: l10n.t('Converts a string to lower case.') },\n { func: 'percentage($number)', desc: l10n.t('Converts a unitless number to a percentage.'), type: 'percentage' },\n { func: 'round($number)', desc: l10n.t('Rounds a number to the nearest whole number.') },\n { func: 'ceil($number)', desc: l10n.t('Rounds a number up to the next whole number.') },\n { func: 'floor($number)', desc: l10n.t('Rounds a number down to the previous whole number.') },\n { func: 'abs($number)', desc: l10n.t('Returns the absolute value of a number.') },\n { func: 'min($numbers)', desc: l10n.t('Finds the minimum of several numbers.') },\n { func: 'max($numbers)', desc: l10n.t('Finds the maximum of several numbers.') },\n { func: 'random([$limit])', desc: l10n.t('Returns a random number.') },\n { func: 'length($list)', desc: l10n.t('Returns the length of a list.') },\n { func: 'nth($list, $n)', desc: l10n.t('Returns a specific item in a list.') },\n { func: 'set-nth($list, $n, $value)', desc: l10n.t('Replaces the nth item in a list.') },\n { func: 'join($list1, $list2, [$separator])', desc: l10n.t('Joins together two lists into one.') },\n { func: 'append($list1, $val, [$separator])', desc: l10n.t('Appends a single value onto the end of a list.') },\n { func: 'zip($lists)', desc: l10n.t('Combines several lists into a single multidimensional list.') },\n { func: 'index($list, $value)', desc: l10n.t('Returns the position of a value within a list.') },\n { func: 'list-separator(#list)', desc: l10n.t('Returns the separator of a list.') },\n { func: 'map-get($map, $key)', desc: l10n.t('Returns the value in a map associated with a given key.') },\n { func: 'map-merge($map1, $map2)', desc: l10n.t('Merges two maps together into a new map.') },\n { func: 'map-remove($map, $keys)', desc: l10n.t('Returns a new map with keys removed.') },\n { func: 'map-keys($map)', desc: l10n.t('Returns a list of all keys in a map.') },\n { func: 'map-values($map)', desc: l10n.t('Returns a list of all values in a map.') },\n { func: 'map-has-key($map, $key)', desc: l10n.t('Returns whether a map has a value associated with a given key.') },\n { func: 'keywords($args)', desc: l10n.t('Returns the keywords passed to a function that takes variable arguments.') },\n { func: 'feature-exists($feature)', desc: l10n.t('Returns whether a feature exists in the current Sass runtime.') },\n { func: 'variable-exists($name)', desc: l10n.t('Returns whether a variable with the given name exists in the current scope.') },\n { func: 'global-variable-exists($name)', desc: l10n.t('Returns whether a variable with the given name exists in the global scope.') },\n { func: 'function-exists($name)', desc: l10n.t('Returns whether a function with the given name exists.') },\n { func: 'mixin-exists($name)', desc: l10n.t('Returns whether a mixin with the given name exists.') },\n { func: 'inspect($value)', desc: l10n.t('Returns the string representation of a value as it would be represented in Sass.') },\n { func: 'type-of($value)', desc: l10n.t('Returns the type of a value.') },\n { func: 'unit($number)', desc: l10n.t('Returns the unit(s) associated with a number.') },\n { func: 'unitless($number)', desc: l10n.t('Returns whether a number has units.') },\n { func: 'comparable($number1, $number2)', desc: l10n.t('Returns whether two numbers can be added, subtracted, or compared.') },\n { func: 'call($name, $args\u2026)', desc: l10n.t('Dynamically calls a Sass function.') }\n];\nSCSSCompletion.scssAtDirectives = [\n {\n label: \"@extend\",\n documentation: l10n.t(\"Inherits the styles of another selector.\"),\n kind: CompletionItemKind.Keyword\n },\n {\n label: \"@at-root\",\n documentation: l10n.t(\"Causes one or more rules to be emitted at the root of the document.\"),\n kind: CompletionItemKind.Keyword\n },\n {\n label: \"@debug\",\n documentation: l10n.t(\"Prints the value of an expression to the standard error output stream. Useful for debugging complicated Sass files.\"),\n kind: CompletionItemKind.Keyword\n },\n {\n label: \"@warn\",\n documentation: l10n.t(\"Prints the value of an expression to the standard error output stream. Useful for libraries that need to warn users of deprecations or recovering from minor mixin usage mistakes. Warnings can be turned off with the `--quiet` command-line option or the `:quiet` Sass option.\"),\n kind: CompletionItemKind.Keyword\n },\n {\n label: \"@error\",\n documentation: l10n.t(\"Throws the value of an expression as a fatal error with stack trace. Useful for validating arguments to mixins and functions.\"),\n kind: CompletionItemKind.Keyword\n },\n {\n label: \"@if\",\n documentation: l10n.t(\"Includes the body if the expression does not evaluate to `false` or `null`.\"),\n insertText: \"@if ${1:expr} {\\n\\t$0\\n}\",\n insertTextFormat: InsertTextFormat.Snippet,\n kind: CompletionItemKind.Keyword\n },\n {\n label: \"@for\",\n documentation: l10n.t(\"For loop that repeatedly outputs a set of styles for each `$var` in the `from/through` or `from/to` clause.\"),\n insertText: \"@for \\\\$${1:var} from ${2:start} ${3|to,through|} ${4:end} {\\n\\t$0\\n}\",\n insertTextFormat: InsertTextFormat.Snippet,\n kind: CompletionItemKind.Keyword\n },\n {\n label: \"@each\",\n documentation: l10n.t(\"Each loop that sets `$var` to each item in the list or map, then outputs the styles it contains using that value of `$var`.\"),\n insertText: \"@each \\\\$${1:var} in ${2:list} {\\n\\t$0\\n}\",\n insertTextFormat: InsertTextFormat.Snippet,\n kind: CompletionItemKind.Keyword\n },\n {\n label: \"@while\",\n documentation: l10n.t(\"While loop that takes an expression and repeatedly outputs the nested styles until the statement evaluates to `false`.\"),\n insertText: \"@while ${1:condition} {\\n\\t$0\\n}\",\n insertTextFormat: InsertTextFormat.Snippet,\n kind: CompletionItemKind.Keyword\n },\n {\n label: \"@mixin\",\n documentation: l10n.t(\"Defines styles that can be re-used throughout the stylesheet with `@include`.\"),\n insertText: \"@mixin ${1:name} {\\n\\t$0\\n}\",\n insertTextFormat: InsertTextFormat.Snippet,\n kind: CompletionItemKind.Keyword\n },\n {\n label: \"@include\",\n documentation: l10n.t(\"Includes the styles defined by another mixin into the current rule.\"),\n kind: CompletionItemKind.Keyword\n },\n {\n label: \"@function\",\n documentation: l10n.t(\"Defines complex operations that can be re-used throughout stylesheets.\"),\n kind: CompletionItemKind.Keyword\n }\n];\nSCSSCompletion.scssModuleLoaders = [\n {\n label: \"@use\",\n documentation: l10n.t(\"Loads mixins, functions, and variables from other Sass stylesheets as 'modules', and combines CSS from multiple stylesheets together.\"),\n references: [{ name: sassDocumentationName, url: 'https://sass-lang.com/documentation/at-rules/use' }],\n insertText: \"@use $0;\",\n insertTextFormat: InsertTextFormat.Snippet,\n kind: CompletionItemKind.Keyword\n },\n {\n label: \"@forward\",\n documentation: l10n.t(\"Loads a Sass stylesheet and makes its mixins, functions, and variables available when this stylesheet is loaded with the @use rule.\"),\n references: [{ name: sassDocumentationName, url: 'https://sass-lang.com/documentation/at-rules/forward' }],\n insertText: \"@forward $0;\",\n insertTextFormat: InsertTextFormat.Snippet,\n kind: CompletionItemKind.Keyword\n },\n];\nSCSSCompletion.scssModuleBuiltIns = [\n {\n label: 'sass:math',\n documentation: l10n.t('Provides functions that operate on numbers.'),\n references: [{ name: sassDocumentationName, url: 'https://sass-lang.com/documentation/modules/math' }]\n },\n {\n label: 'sass:string',\n documentation: l10n.t('Makes it easy to combine, search, or split apart strings.'),\n references: [{ name: sassDocumentationName, url: 'https://sass-lang.com/documentation/modules/string' }]\n },\n {\n label: 'sass:color',\n documentation: l10n.t('Generates new colors based on existing ones, making it easy to build color themes.'),\n references: [{ name: sassDocumentationName, url: 'https://sass-lang.com/documentation/modules/color' }]\n },\n {\n label: 'sass:list',\n documentation: l10n.t('Lets you access and modify values in lists.'),\n references: [{ name: sassDocumentationName, url: 'https://sass-lang.com/documentation/modules/list' }]\n },\n {\n label: 'sass:map',\n documentation: l10n.t('Makes it possible to look up the value associated with a key in a map, and much more.'),\n references: [{ name: sassDocumentationName, url: 'https://sass-lang.com/documentation/modules/map' }]\n },\n {\n label: 'sass:selector',\n documentation: l10n.t('Provides access to Sass\u2019s powerful selector engine.'),\n references: [{ name: sassDocumentationName, url: 'https://sass-lang.com/documentation/modules/selector' }]\n },\n {\n label: 'sass:meta',\n documentation: l10n.t('Exposes the details of Sass\u2019s inner workings.'),\n references: [{ name: sassDocumentationName, url: 'https://sass-lang.com/documentation/modules/meta' }]\n },\n];\n/**\n * Todo @Pine: Remove this and do it through custom data\n */\nfunction addReferencesToDocumentation(items) {\n items.forEach(i => {\n if (i.documentation && i.references && i.references.length > 0) {\n const markdownDoc = typeof i.documentation === 'string'\n ? { kind: 'markdown', value: i.documentation }\n : { kind: 'markdown', value: i.documentation.value };\n markdownDoc.value += '\\n\\n';\n markdownDoc.value += i.references\n .map(r => {\n return `[${r.name}](${r.url})`;\n })\n .join(' | ');\n i.documentation = markdownDoc;\n }\n });\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport * as scanner from './cssScanner';\nconst _FSL = '/'.charCodeAt(0);\nconst _NWL = '\\n'.charCodeAt(0);\nconst _CAR = '\\r'.charCodeAt(0);\nconst _LFD = '\\f'.charCodeAt(0);\nconst _TIC = '`'.charCodeAt(0);\nconst _DOT = '.'.charCodeAt(0);\nlet customTokenValue = scanner.TokenType.CustomToken;\nexport const Ellipsis = customTokenValue++;\nexport class LESSScanner extends scanner.Scanner {\n scanNext(offset) {\n // LESS: escaped JavaScript code `const a = \"dddd\"`\n const tokenType = this.escapedJavaScript();\n if (tokenType !== null) {\n return this.finishToken(offset, tokenType);\n }\n if (this.stream.advanceIfChars([_DOT, _DOT, _DOT])) {\n return this.finishToken(offset, Ellipsis);\n }\n return super.scanNext(offset);\n }\n comment() {\n if (super.comment()) {\n return true;\n }\n if (!this.inURL && this.stream.advanceIfChars([_FSL, _FSL])) {\n this.stream.advanceWhileChar((ch) => {\n switch (ch) {\n case _NWL:\n case _CAR:\n case _LFD:\n return false;\n default:\n return true;\n }\n });\n return true;\n }\n else {\n return false;\n }\n }\n escapedJavaScript() {\n const ch = this.stream.peekChar();\n if (ch === _TIC) {\n this.stream.advance(1);\n this.stream.advanceWhileChar((ch) => { return ch !== _TIC; });\n return this.stream.advanceIfChar(_TIC) ? scanner.TokenType.EscapedJavaScript : scanner.TokenType.BadEscapedJavaScript;\n }\n return null;\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport * as lessScanner from './lessScanner';\nimport { TokenType } from './cssScanner';\nimport * as cssParser from './cssParser';\nimport * as nodes from './cssNodes';\nimport { ParseError } from './cssErrors';\n/// <summary>\n/// A parser for LESS\n/// http://lesscss.org/\n/// </summary>\nexport class LESSParser extends cssParser.Parser {\n constructor() {\n super(new lessScanner.LESSScanner());\n }\n _parseStylesheetStatement(isNested = false) {\n if (this.peek(TokenType.AtKeyword)) {\n return this._parseVariableDeclaration()\n || this._parsePlugin()\n || super._parseStylesheetAtStatement(isNested);\n }\n return this._tryParseMixinDeclaration()\n || this._tryParseMixinReference()\n || this._parseFunction()\n || this._parseRuleset(true);\n }\n _parseImport() {\n if (!this.peekKeyword('@import') && !this.peekKeyword('@import-once') /* deprecated in less 1.4.1 */) {\n return null;\n }\n const node = this.create(nodes.Import);\n this.consumeToken();\n // less 1.4.1: @import (css) \"lib\"\n if (this.accept(TokenType.ParenthesisL)) {\n if (!this.accept(TokenType.Ident)) {\n return this.finish(node, ParseError.IdentifierExpected, [TokenType.SemiColon]);\n }\n do {\n if (!this.accept(TokenType.Comma)) {\n break;\n }\n } while (this.accept(TokenType.Ident));\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected, [TokenType.SemiColon]);\n }\n }\n if (!node.addChild(this._parseURILiteral()) && !node.addChild(this._parseStringLiteral())) {\n return this.finish(node, ParseError.URIOrStringExpected, [TokenType.SemiColon]);\n }\n if (!this.peek(TokenType.SemiColon) && !this.peek(TokenType.EOF)) {\n node.setMedialist(this._parseMediaQueryList());\n }\n return this.finish(node);\n }\n _parsePlugin() {\n if (!this.peekKeyword('@plugin')) {\n return null;\n }\n const node = this.createNode(nodes.NodeType.Plugin);\n this.consumeToken(); // @import\n if (!node.addChild(this._parseStringLiteral())) {\n return this.finish(node, ParseError.StringLiteralExpected);\n }\n if (!this.accept(TokenType.SemiColon)) {\n return this.finish(node, ParseError.SemiColonExpected);\n }\n return this.finish(node);\n }\n _parseMediaQuery() {\n const node = super._parseMediaQuery();\n if (!node) {\n const node = this.create(nodes.MediaQuery);\n if (node.addChild(this._parseVariable())) {\n return this.finish(node);\n }\n return null;\n }\n return node;\n }\n _parseMediaDeclaration(isNested = false) {\n return this._tryParseRuleset(isNested)\n || this._tryToParseDeclaration()\n || this._tryParseMixinDeclaration()\n || this._tryParseMixinReference()\n || this._parseDetachedRuleSetMixin()\n || this._parseStylesheetStatement(isNested);\n }\n _parseMediaFeatureName() {\n return this._parseIdent() || this._parseVariable();\n }\n _parseVariableDeclaration(panic = []) {\n const node = this.create(nodes.VariableDeclaration);\n const mark = this.mark();\n if (!node.setVariable(this._parseVariable(true))) {\n return null;\n }\n if (this.accept(TokenType.Colon)) {\n if (this.prevToken) {\n node.colonPosition = this.prevToken.offset;\n }\n if (node.setValue(this._parseDetachedRuleSet())) {\n node.needsSemicolon = false;\n }\n else if (!node.setValue(this._parseExpr())) {\n return this.finish(node, ParseError.VariableValueExpected, [], panic);\n }\n node.addChild(this._parsePrio());\n }\n else {\n this.restoreAtMark(mark);\n return null; // at keyword, but no ':', not a variable declaration but some at keyword\n }\n if (this.peek(TokenType.SemiColon)) {\n node.semicolonPosition = this.token.offset; // not part of the declaration, but useful information for code assist\n }\n return this.finish(node);\n }\n _parseDetachedRuleSet() {\n let mark = this.mark();\n // \"Anonymous mixin\" used in each() and possibly a generic type in the future\n if (this.peekDelim('#') || this.peekDelim('.')) {\n this.consumeToken();\n if (!this.hasWhitespace() && this.accept(TokenType.ParenthesisL)) {\n let node = this.create(nodes.MixinDeclaration);\n if (node.getParameters().addChild(this._parseMixinParameter())) {\n while (this.accept(TokenType.Comma) || this.accept(TokenType.SemiColon)) {\n if (this.peek(TokenType.ParenthesisR)) {\n break;\n }\n if (!node.getParameters().addChild(this._parseMixinParameter())) {\n this.markError(node, ParseError.IdentifierExpected, [], [TokenType.ParenthesisR]);\n }\n }\n }\n if (!this.accept(TokenType.ParenthesisR)) {\n this.restoreAtMark(mark);\n return null;\n }\n }\n else {\n this.restoreAtMark(mark);\n return null;\n }\n }\n if (!this.peek(TokenType.CurlyL)) {\n return null;\n }\n const content = this.create(nodes.BodyDeclaration);\n this._parseBody(content, this._parseDetachedRuleSetBody.bind(this));\n return this.finish(content);\n }\n _parseDetachedRuleSetBody() {\n return this._tryParseKeyframeSelector() || this._parseRuleSetDeclaration();\n }\n _addLookupChildren(node) {\n if (!node.addChild(this._parseLookupValue())) {\n return false;\n }\n let expectsValue = false;\n while (true) {\n if (this.peek(TokenType.BracketL)) {\n expectsValue = true;\n }\n if (!node.addChild(this._parseLookupValue())) {\n break;\n }\n expectsValue = false;\n }\n return !expectsValue;\n }\n _parseLookupValue() {\n const node = this.create(nodes.Node);\n const mark = this.mark();\n if (!this.accept(TokenType.BracketL)) {\n this.restoreAtMark(mark);\n return null;\n }\n if (((node.addChild(this._parseVariable(false, true)) ||\n node.addChild(this._parsePropertyIdentifier())) &&\n this.accept(TokenType.BracketR)) || this.accept(TokenType.BracketR)) {\n return node;\n }\n this.restoreAtMark(mark);\n return null;\n }\n _parseVariable(declaration = false, insideLookup = false) {\n const isPropertyReference = !declaration && this.peekDelim('$');\n if (!this.peekDelim('@') && !isPropertyReference && !this.peek(TokenType.AtKeyword)) {\n return null;\n }\n const node = this.create(nodes.Variable);\n const mark = this.mark();\n while (this.acceptDelim('@') || (!declaration && this.acceptDelim('$'))) {\n if (this.hasWhitespace()) {\n this.restoreAtMark(mark);\n return null;\n }\n }\n if (!this.accept(TokenType.AtKeyword) && !this.accept(TokenType.Ident)) {\n this.restoreAtMark(mark);\n return null;\n }\n if (!insideLookup && this.peek(TokenType.BracketL)) {\n if (!this._addLookupChildren(node)) {\n this.restoreAtMark(mark);\n return null;\n }\n }\n return node;\n }\n _parseTermExpression() {\n return this._parseVariable() ||\n this._parseEscaped() ||\n super._parseTermExpression() || // preference for colors before mixin references\n this._tryParseMixinReference(false);\n }\n _parseEscaped() {\n if (this.peek(TokenType.EscapedJavaScript) ||\n this.peek(TokenType.BadEscapedJavaScript)) {\n const node = this.createNode(nodes.NodeType.EscapedValue);\n this.consumeToken();\n return this.finish(node);\n }\n if (this.peekDelim('~')) {\n const node = this.createNode(nodes.NodeType.EscapedValue);\n this.consumeToken();\n if (this.accept(TokenType.String) || this.accept(TokenType.EscapedJavaScript)) {\n return this.finish(node);\n }\n else {\n return this.finish(node, ParseError.TermExpected);\n }\n }\n return null;\n }\n _parseOperator() {\n const node = this._parseGuardOperator();\n if (node) {\n return node;\n }\n else {\n return super._parseOperator();\n }\n }\n _parseGuardOperator() {\n if (this.peekDelim('>')) {\n const node = this.createNode(nodes.NodeType.Operator);\n this.consumeToken();\n this.acceptDelim('=');\n return node;\n }\n else if (this.peekDelim('=')) {\n const node = this.createNode(nodes.NodeType.Operator);\n this.consumeToken();\n this.acceptDelim('<');\n return node;\n }\n else if (this.peekDelim('<')) {\n const node = this.createNode(nodes.NodeType.Operator);\n this.consumeToken();\n this.acceptDelim('=');\n return node;\n }\n return null;\n }\n _parseRuleSetDeclaration() {\n if (this.peek(TokenType.AtKeyword)) {\n return this._parseKeyframe()\n || this._parseMedia(true)\n || this._parseImport()\n || this._parseSupports(true) // @supports\n || this._parseLayer() // @layer\n || this._parsePropertyAtRule() // @property\n || this._parseDetachedRuleSetMixin() // less detached ruleset mixin\n || this._parseVariableDeclaration() // Variable declarations\n || super._parseRuleSetDeclarationAtStatement();\n }\n return this._tryParseMixinDeclaration()\n || this._tryParseRuleset(true) // nested ruleset\n || this._tryParseMixinReference() // less mixin reference\n || this._parseFunction()\n || this._parseExtend() // less extend declaration\n || super._parseRuleSetDeclaration(); // try css ruleset declaration as the last option\n }\n _parseKeyframeIdent() {\n return this._parseIdent([nodes.ReferenceType.Keyframe]) || this._parseVariable();\n }\n _parseKeyframeSelector() {\n return this._parseDetachedRuleSetMixin() // less detached ruleset mixin\n || super._parseKeyframeSelector();\n }\n _parseSimpleSelectorBody() {\n return this._parseSelectorCombinator() || super._parseSimpleSelectorBody();\n }\n _parseSelector(isNested) {\n // CSS Guards\n const node = this.create(nodes.Selector);\n let hasContent = false;\n if (isNested) {\n // nested selectors can start with a combinator\n hasContent = node.addChild(this._parseCombinator());\n }\n while (node.addChild(this._parseSimpleSelector())) {\n hasContent = true;\n const mark = this.mark();\n if (node.addChild(this._parseGuard()) && this.peek(TokenType.CurlyL)) {\n break;\n }\n this.restoreAtMark(mark);\n node.addChild(this._parseCombinator()); // optional\n }\n return hasContent ? this.finish(node) : null;\n }\n _parseSelectorCombinator() {\n if (this.peekDelim('&')) {\n const node = this.createNode(nodes.NodeType.SelectorCombinator);\n this.consumeToken();\n while (!this.hasWhitespace() && (this.acceptDelim('-') || this.accept(TokenType.Num) || this.accept(TokenType.Dimension) || node.addChild(this._parseIdent()) || this.acceptDelim('&'))) {\n // support &-foo\n }\n return this.finish(node);\n }\n return null;\n }\n _parseSelectorIdent() {\n if (!this.peekInterpolatedIdent()) {\n return null;\n }\n const node = this.createNode(nodes.NodeType.SelectorInterpolation);\n const hasContent = this._acceptInterpolatedIdent(node);\n return hasContent ? this.finish(node) : null;\n }\n _parsePropertyIdentifier(inLookup = false) {\n const propertyRegex = /^[\\w-]+/;\n if (!this.peekInterpolatedIdent() && !this.peekRegExp(this.token.type, propertyRegex)) {\n return null;\n }\n const mark = this.mark();\n const node = this.create(nodes.Identifier);\n node.isCustomProperty = this.acceptDelim('-') && this.acceptDelim('-');\n let childAdded = false;\n if (!inLookup) {\n if (node.isCustomProperty) {\n childAdded = this._acceptInterpolatedIdent(node);\n }\n else {\n childAdded = this._acceptInterpolatedIdent(node, propertyRegex);\n }\n }\n else {\n if (node.isCustomProperty) {\n childAdded = node.addChild(this._parseIdent());\n }\n else {\n childAdded = node.addChild(this._parseRegexp(propertyRegex));\n }\n }\n if (!childAdded) {\n this.restoreAtMark(mark);\n return null;\n }\n if (!inLookup && !this.hasWhitespace()) {\n this.acceptDelim('+');\n if (!this.hasWhitespace()) {\n this.acceptIdent('_');\n }\n }\n return this.finish(node);\n }\n peekInterpolatedIdent() {\n return this.peek(TokenType.Ident) ||\n this.peekDelim('@') ||\n this.peekDelim('$') ||\n this.peekDelim('-');\n }\n _acceptInterpolatedIdent(node, identRegex) {\n let hasContent = false;\n const indentInterpolation = () => {\n const pos = this.mark();\n if (this.acceptDelim('-')) {\n if (!this.hasWhitespace()) {\n this.acceptDelim('-');\n }\n if (this.hasWhitespace()) {\n this.restoreAtMark(pos);\n return null;\n }\n }\n return this._parseInterpolation();\n };\n const accept = identRegex ?\n () => this.acceptRegexp(identRegex) :\n () => this.accept(TokenType.Ident);\n while (accept() ||\n node.addChild(this._parseInterpolation() ||\n this.try(indentInterpolation))) {\n hasContent = true;\n if (this.hasWhitespace()) {\n break;\n }\n }\n return hasContent;\n }\n _parseInterpolation() {\n // @{name} Variable or\n // ${name} Property\n const mark = this.mark();\n if (this.peekDelim('@') || this.peekDelim('$')) {\n const node = this.createNode(nodes.NodeType.Interpolation);\n this.consumeToken();\n if (this.hasWhitespace() || !this.accept(TokenType.CurlyL)) {\n this.restoreAtMark(mark);\n return null;\n }\n if (!node.addChild(this._parseIdent())) {\n return this.finish(node, ParseError.IdentifierExpected);\n }\n if (!this.accept(TokenType.CurlyR)) {\n return this.finish(node, ParseError.RightCurlyExpected);\n }\n return this.finish(node);\n }\n return null;\n }\n _tryParseMixinDeclaration() {\n const mark = this.mark();\n const node = this.create(nodes.MixinDeclaration);\n if (!node.setIdentifier(this._parseMixinDeclarationIdentifier()) || !this.accept(TokenType.ParenthesisL)) {\n this.restoreAtMark(mark);\n return null;\n }\n if (node.getParameters().addChild(this._parseMixinParameter())) {\n while (this.accept(TokenType.Comma) || this.accept(TokenType.SemiColon)) {\n if (this.peek(TokenType.ParenthesisR)) {\n break;\n }\n if (!node.getParameters().addChild(this._parseMixinParameter())) {\n this.markError(node, ParseError.IdentifierExpected, [], [TokenType.ParenthesisR]);\n }\n }\n }\n if (!this.accept(TokenType.ParenthesisR)) {\n this.restoreAtMark(mark);\n return null;\n }\n node.setGuard(this._parseGuard());\n if (!this.peek(TokenType.CurlyL)) {\n this.restoreAtMark(mark);\n return null;\n }\n return this._parseBody(node, this._parseMixInBodyDeclaration.bind(this));\n }\n _parseMixInBodyDeclaration() {\n return this._parseFontFace() || this._parseRuleSetDeclaration();\n }\n _parseMixinDeclarationIdentifier() {\n let identifier;\n if (this.peekDelim('#') || this.peekDelim('.')) {\n identifier = this.create(nodes.Identifier);\n this.consumeToken(); // # or .\n if (this.hasWhitespace() || !identifier.addChild(this._parseIdent())) {\n return null;\n }\n }\n else if (this.peek(TokenType.Hash)) {\n identifier = this.create(nodes.Identifier);\n this.consumeToken(); // TokenType.Hash\n }\n else {\n return null;\n }\n identifier.referenceTypes = [nodes.ReferenceType.Mixin];\n return this.finish(identifier);\n }\n _parsePseudo() {\n if (!this.peek(TokenType.Colon)) {\n return null;\n }\n const mark = this.mark();\n const node = this.create(nodes.ExtendsReference);\n this.consumeToken(); // :\n if (this.acceptIdent('extend')) {\n return this._completeExtends(node);\n }\n this.restoreAtMark(mark);\n return super._parsePseudo();\n }\n _parseExtend() {\n if (!this.peekDelim('&')) {\n return null;\n }\n const mark = this.mark();\n const node = this.create(nodes.ExtendsReference);\n this.consumeToken(); // &\n if (this.hasWhitespace() || !this.accept(TokenType.Colon) || !this.acceptIdent('extend')) {\n this.restoreAtMark(mark);\n return null;\n }\n return this._completeExtends(node);\n }\n _completeExtends(node) {\n if (!this.accept(TokenType.ParenthesisL)) {\n return this.finish(node, ParseError.LeftParenthesisExpected);\n }\n const selectors = node.getSelectors();\n if (!selectors.addChild(this._parseSelector(true))) {\n return this.finish(node, ParseError.SelectorExpected);\n }\n while (this.accept(TokenType.Comma)) {\n if (!selectors.addChild(this._parseSelector(true))) {\n return this.finish(node, ParseError.SelectorExpected);\n }\n }\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected);\n }\n return this.finish(node);\n }\n _parseDetachedRuleSetMixin() {\n if (!this.peek(TokenType.AtKeyword)) {\n return null;\n }\n const mark = this.mark();\n const node = this.create(nodes.MixinReference);\n if (node.addChild(this._parseVariable(true)) && (this.hasWhitespace() || !this.accept(TokenType.ParenthesisL))) {\n this.restoreAtMark(mark);\n return null;\n }\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected);\n }\n return this.finish(node);\n }\n _tryParseMixinReference(atRoot = true) {\n const mark = this.mark();\n const node = this.create(nodes.MixinReference);\n let identifier = this._parseMixinDeclarationIdentifier();\n while (identifier) {\n this.acceptDelim('>');\n const nextId = this._parseMixinDeclarationIdentifier();\n if (nextId) {\n node.getNamespaces().addChild(identifier);\n identifier = nextId;\n }\n else {\n break;\n }\n }\n if (!node.setIdentifier(identifier)) {\n this.restoreAtMark(mark);\n return null;\n }\n let hasArguments = false;\n if (this.accept(TokenType.ParenthesisL)) {\n hasArguments = true;\n if (node.getArguments().addChild(this._parseMixinArgument())) {\n while (this.accept(TokenType.Comma) || this.accept(TokenType.SemiColon)) {\n if (this.peek(TokenType.ParenthesisR)) {\n break;\n }\n if (!node.getArguments().addChild(this._parseMixinArgument())) {\n return this.finish(node, ParseError.ExpressionExpected);\n }\n }\n }\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected);\n }\n identifier.referenceTypes = [nodes.ReferenceType.Mixin];\n }\n else {\n identifier.referenceTypes = [nodes.ReferenceType.Mixin, nodes.ReferenceType.Rule];\n }\n if (this.peek(TokenType.BracketL)) {\n if (!atRoot) {\n this._addLookupChildren(node);\n }\n }\n else {\n node.addChild(this._parsePrio());\n }\n if (!hasArguments && !this.peek(TokenType.SemiColon) && !this.peek(TokenType.CurlyR) && !this.peek(TokenType.EOF)) {\n this.restoreAtMark(mark);\n return null;\n }\n return this.finish(node);\n }\n _parseMixinArgument() {\n // [variableName ':'] expression | variableName '...'\n const node = this.create(nodes.FunctionArgument);\n const pos = this.mark();\n const argument = this._parseVariable();\n if (argument) {\n if (!this.accept(TokenType.Colon)) {\n this.restoreAtMark(pos);\n }\n else {\n node.setIdentifier(argument);\n }\n }\n if (node.setValue(this._parseDetachedRuleSet() || this._parseExpr(true))) {\n return this.finish(node);\n }\n this.restoreAtMark(pos);\n return null;\n }\n _parseMixinParameter() {\n const node = this.create(nodes.FunctionParameter);\n // special rest variable: @rest...\n if (this.peekKeyword('@rest')) {\n const restNode = this.create(nodes.Node);\n this.consumeToken();\n if (!this.accept(lessScanner.Ellipsis)) {\n return this.finish(node, ParseError.DotExpected, [], [TokenType.Comma, TokenType.ParenthesisR]);\n }\n node.setIdentifier(this.finish(restNode));\n return this.finish(node);\n }\n // special const args: ...\n if (this.peek(lessScanner.Ellipsis)) {\n const varargsNode = this.create(nodes.Node);\n this.consumeToken();\n node.setIdentifier(this.finish(varargsNode));\n return this.finish(node);\n }\n let hasContent = false;\n // default variable declaration: @param: 12 or @name\n if (node.setIdentifier(this._parseVariable())) {\n this.accept(TokenType.Colon);\n hasContent = true;\n }\n if (!node.setDefaultValue(this._parseDetachedRuleSet() || this._parseExpr(true)) && !hasContent) {\n return null;\n }\n return this.finish(node);\n }\n _parseGuard() {\n if (!this.peekIdent('when')) {\n return null;\n }\n const node = this.create(nodes.LessGuard);\n this.consumeToken(); // when\n node.isNegated = this.acceptIdent('not');\n if (!node.getConditions().addChild(this._parseGuardCondition())) {\n return this.finish(node, ParseError.ConditionExpected);\n }\n while (this.acceptIdent('and') || this.accept(TokenType.Comma)) {\n if (!node.getConditions().addChild(this._parseGuardCondition())) {\n return this.finish(node, ParseError.ConditionExpected);\n }\n }\n return this.finish(node);\n }\n _parseGuardCondition() {\n if (!this.peek(TokenType.ParenthesisL)) {\n return null;\n }\n const node = this.create(nodes.GuardCondition);\n this.consumeToken(); // ParenthesisL\n if (!node.addChild(this._parseExpr())) {\n // empty (?)\n }\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected);\n }\n return this.finish(node);\n }\n _parseFunction() {\n const pos = this.mark();\n const node = this.create(nodes.Function);\n if (!node.setIdentifier(this._parseFunctionIdentifier())) {\n return null;\n }\n if (this.hasWhitespace() || !this.accept(TokenType.ParenthesisL)) {\n this.restoreAtMark(pos);\n return null;\n }\n if (node.getArguments().addChild(this._parseMixinArgument())) {\n while (this.accept(TokenType.Comma) || this.accept(TokenType.SemiColon)) {\n if (this.peek(TokenType.ParenthesisR)) {\n break;\n }\n if (!node.getArguments().addChild(this._parseMixinArgument())) {\n return this.finish(node, ParseError.ExpressionExpected);\n }\n }\n }\n if (!this.accept(TokenType.ParenthesisR)) {\n return this.finish(node, ParseError.RightParenthesisExpected);\n }\n return this.finish(node);\n }\n _parseFunctionIdentifier() {\n if (this.peekDelim('%')) {\n const node = this.create(nodes.Identifier);\n node.referenceTypes = [nodes.ReferenceType.Function];\n this.consumeToken();\n return this.finish(node);\n }\n return super._parseFunctionIdentifier();\n }\n _parseURLArgument() {\n const pos = this.mark();\n const node = super._parseURLArgument();\n if (!node || !this.peek(TokenType.ParenthesisR)) {\n this.restoreAtMark(pos);\n const node = this.create(nodes.Node);\n node.addChild(this._parseBinaryExpr());\n return this.finish(node);\n }\n return node;\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport { CSSCompletion } from './cssCompletion';\nimport { CompletionItemKind, InsertTextFormat, TextEdit } from '../cssLanguageTypes';\nimport * as l10n from '@vscode/l10n';\nexport class LESSCompletion extends CSSCompletion {\n constructor(lsOptions, cssDataManager) {\n super('@', lsOptions, cssDataManager);\n }\n createFunctionProposals(proposals, existingNode, sortToEnd, result) {\n for (const p of proposals) {\n const item = {\n label: p.name,\n detail: p.example,\n documentation: p.description,\n textEdit: TextEdit.replace(this.getCompletionRange(existingNode), p.name + '($0)'),\n insertTextFormat: InsertTextFormat.Snippet,\n kind: CompletionItemKind.Function\n };\n if (sortToEnd) {\n item.sortText = 'z';\n }\n result.items.push(item);\n }\n return result;\n }\n getTermProposals(entry, existingNode, result) {\n let functions = LESSCompletion.builtInProposals;\n if (entry) {\n functions = functions.filter(f => !f.type || !entry.restrictions || entry.restrictions.indexOf(f.type) !== -1);\n }\n this.createFunctionProposals(functions, existingNode, true, result);\n return super.getTermProposals(entry, existingNode, result);\n }\n getColorProposals(entry, existingNode, result) {\n this.createFunctionProposals(LESSCompletion.colorProposals, existingNode, false, result);\n return super.getColorProposals(entry, existingNode, result);\n }\n getCompletionsForDeclarationProperty(declaration, result) {\n this.getCompletionsForSelector(null, true, result);\n return super.getCompletionsForDeclarationProperty(declaration, result);\n }\n}\nLESSCompletion.builtInProposals = [\n // Boolean functions\n {\n 'name': 'if',\n 'example': 'if(condition, trueValue [, falseValue]);',\n 'description': l10n.t('returns one of two values depending on a condition.')\n },\n {\n 'name': 'boolean',\n 'example': 'boolean(condition);',\n 'description': l10n.t('\"store\" a boolean test for later evaluation in a guard or if().')\n },\n // List functions\n {\n 'name': 'length',\n 'example': 'length(@list);',\n 'description': l10n.t('returns the number of elements in a value list')\n },\n {\n 'name': 'extract',\n 'example': 'extract(@list, index);',\n 'description': l10n.t('returns a value at the specified position in the list')\n },\n {\n 'name': 'range',\n 'example': 'range([start, ] end [, step]);',\n 'description': l10n.t('generate a list spanning a range of values')\n },\n {\n 'name': 'each',\n 'example': 'each(@list, ruleset);',\n 'description': l10n.t('bind the evaluation of a ruleset to each member of a list.')\n },\n // Other built-ins\n {\n 'name': 'escape',\n 'example': 'escape(@string);',\n 'description': l10n.t('URL encodes a string')\n },\n {\n 'name': 'e',\n 'example': 'e(@string);',\n 'description': l10n.t('escape string content')\n },\n {\n 'name': 'replace',\n 'example': 'replace(@string, @pattern, @replacement[, @flags]);',\n 'description': l10n.t('string replace')\n },\n {\n 'name': 'unit',\n 'example': 'unit(@dimension, [@unit: \\'\\']);',\n 'description': l10n.t('remove or change the unit of a dimension')\n },\n {\n 'name': 'color',\n 'example': 'color(@string);',\n 'description': l10n.t('parses a string to a color'),\n 'type': 'color'\n },\n {\n 'name': 'convert',\n 'example': 'convert(@value, unit);',\n 'description': l10n.t('converts numbers from one type into another')\n },\n {\n 'name': 'data-uri',\n 'example': 'data-uri([mimetype,] url);',\n 'description': l10n.t('inlines a resource and falls back to `url()`'),\n 'type': 'url'\n },\n {\n 'name': 'abs',\n 'description': l10n.t('absolute value of a number'),\n 'example': 'abs(number);'\n },\n {\n 'name': 'acos',\n 'description': l10n.t('arccosine - inverse of cosine function'),\n 'example': 'acos(number);'\n },\n {\n 'name': 'asin',\n 'description': l10n.t('arcsine - inverse of sine function'),\n 'example': 'asin(number);'\n },\n {\n 'name': 'ceil',\n 'example': 'ceil(@number);',\n 'description': l10n.t('rounds up to an integer')\n },\n {\n 'name': 'cos',\n 'description': l10n.t('cosine function'),\n 'example': 'cos(number);'\n },\n {\n 'name': 'floor',\n 'description': l10n.t('rounds down to an integer'),\n 'example': 'floor(@number);'\n },\n {\n 'name': 'percentage',\n 'description': l10n.t('converts to a %, e.g. 0.5 > 50%'),\n 'example': 'percentage(@number);',\n 'type': 'percentage'\n },\n {\n 'name': 'round',\n 'description': l10n.t('rounds a number to a number of places'),\n 'example': 'round(number, [places: 0]);'\n },\n {\n 'name': 'sqrt',\n 'description': l10n.t('calculates square root of a number'),\n 'example': 'sqrt(number);'\n },\n {\n 'name': 'sin',\n 'description': l10n.t('sine function'),\n 'example': 'sin(number);'\n },\n {\n 'name': 'tan',\n 'description': l10n.t('tangent function'),\n 'example': 'tan(number);'\n },\n {\n 'name': 'atan',\n 'description': l10n.t('arctangent - inverse of tangent function'),\n 'example': 'atan(number);'\n },\n {\n 'name': 'pi',\n 'description': l10n.t('returns pi'),\n 'example': 'pi();'\n },\n {\n 'name': 'pow',\n 'description': l10n.t('first argument raised to the power of the second argument'),\n 'example': 'pow(@base, @exponent);'\n },\n {\n 'name': 'mod',\n 'description': l10n.t('first argument modulus second argument'),\n 'example': 'mod(number, number);'\n },\n {\n 'name': 'min',\n 'description': l10n.t('returns the lowest of one or more values'),\n 'example': 'min(@x, @y);'\n },\n {\n 'name': 'max',\n 'description': l10n.t('returns the lowest of one or more values'),\n 'example': 'max(@x, @y);'\n }\n];\nLESSCompletion.colorProposals = [\n {\n 'name': 'argb',\n 'example': 'argb(@color);',\n 'description': l10n.t('creates a #AARRGGBB')\n },\n {\n 'name': 'hsl',\n 'example': 'hsl(@hue, @saturation, @lightness);',\n 'description': l10n.t('creates a color')\n },\n {\n 'name': 'hsla',\n 'example': 'hsla(@hue, @saturation, @lightness, @alpha);',\n 'description': l10n.t('creates a color')\n },\n {\n 'name': 'hsv',\n 'example': 'hsv(@hue, @saturation, @value);',\n 'description': l10n.t('creates a color')\n },\n {\n 'name': 'hsva',\n 'example': 'hsva(@hue, @saturation, @value, @alpha);',\n 'description': l10n.t('creates a color')\n },\n {\n 'name': 'hue',\n 'example': 'hue(@color);',\n 'description': l10n.t('returns the `hue` channel of `@color` in the HSL space')\n },\n {\n 'name': 'saturation',\n 'example': 'saturation(@color);',\n 'description': l10n.t('returns the `saturation` channel of `@color` in the HSL space')\n },\n {\n 'name': 'lightness',\n 'example': 'lightness(@color);',\n 'description': l10n.t('returns the `lightness` channel of `@color` in the HSL space')\n },\n {\n 'name': 'hsvhue',\n 'example': 'hsvhue(@color);',\n 'description': l10n.t('returns the `hue` channel of `@color` in the HSV space')\n },\n {\n 'name': 'hsvsaturation',\n 'example': 'hsvsaturation(@color);',\n 'description': l10n.t('returns the `saturation` channel of `@color` in the HSV space')\n },\n {\n 'name': 'hsvvalue',\n 'example': 'hsvvalue(@color);',\n 'description': l10n.t('returns the `value` channel of `@color` in the HSV space')\n },\n {\n 'name': 'red',\n 'example': 'red(@color);',\n 'description': l10n.t('returns the `red` channel of `@color`')\n },\n {\n 'name': 'green',\n 'example': 'green(@color);',\n 'description': l10n.t('returns the `green` channel of `@color`')\n },\n {\n 'name': 'blue',\n 'example': 'blue(@color);',\n 'description': l10n.t('returns the `blue` channel of `@color`')\n },\n {\n 'name': 'alpha',\n 'example': 'alpha(@color);',\n 'description': l10n.t('returns the `alpha` channel of `@color`')\n },\n {\n 'name': 'luma',\n 'example': 'luma(@color);',\n 'description': l10n.t('returns the `luma` value (perceptual brightness) of `@color`')\n },\n {\n 'name': 'saturate',\n 'example': 'saturate(@color, 10%);',\n 'description': l10n.t('return `@color` 10% points more saturated')\n },\n {\n 'name': 'desaturate',\n 'example': 'desaturate(@color, 10%);',\n 'description': l10n.t('return `@color` 10% points less saturated')\n },\n {\n 'name': 'lighten',\n 'example': 'lighten(@color, 10%);',\n 'description': l10n.t('return `@color` 10% points lighter')\n },\n {\n 'name': 'darken',\n 'example': 'darken(@color, 10%);',\n 'description': l10n.t('return `@color` 10% points darker')\n },\n {\n 'name': 'fadein',\n 'example': 'fadein(@color, 10%);',\n 'description': l10n.t('return `@color` 10% points less transparent')\n },\n {\n 'name': 'fadeout',\n 'example': 'fadeout(@color, 10%);',\n 'description': l10n.t('return `@color` 10% points more transparent')\n },\n {\n 'name': 'fade',\n 'example': 'fade(@color, 50%);',\n 'description': l10n.t('return `@color` with 50% transparency')\n },\n {\n 'name': 'spin',\n 'example': 'spin(@color, 10);',\n 'description': l10n.t('return `@color` with a 10 degree larger in hue')\n },\n {\n 'name': 'mix',\n 'example': 'mix(@color1, @color2, [@weight: 50%]);',\n 'description': l10n.t('return a mix of `@color1` and `@color2`')\n },\n {\n 'name': 'greyscale',\n 'example': 'greyscale(@color);',\n 'description': l10n.t('returns a grey, 100% desaturated color'),\n },\n {\n 'name': 'contrast',\n 'example': 'contrast(@color1, [@darkcolor: black], [@lightcolor: white], [@threshold: 43%]);',\n 'description': l10n.t('return `@darkcolor` if `@color1 is> 43% luma` otherwise return `@lightcolor`, see notes')\n },\n {\n 'name': 'multiply',\n 'example': 'multiply(@color1, @color2);'\n },\n {\n 'name': 'screen',\n 'example': 'screen(@color1, @color2);'\n },\n {\n 'name': 'overlay',\n 'example': 'overlay(@color1, @color2);'\n },\n {\n 'name': 'softlight',\n 'example': 'softlight(@color1, @color2);'\n },\n {\n 'name': 'hardlight',\n 'example': 'hardlight(@color1, @color2);'\n },\n {\n 'name': 'difference',\n 'example': 'difference(@color1, @color2);'\n },\n {\n 'name': 'exclusion',\n 'example': 'exclusion(@color1, @color2);'\n },\n {\n 'name': 'average',\n 'example': 'average(@color1, @color2);'\n },\n {\n 'name': 'negation',\n 'example': 'negation(@color1, @color2);'\n }\n];\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport { TokenType, Scanner } from '../parser/cssScanner';\nimport { SCSSScanner, InterpolationFunction } from '../parser/scssScanner';\nimport { LESSScanner } from '../parser/lessScanner';\nexport function getFoldingRanges(document, context) {\n const ranges = computeFoldingRanges(document);\n return limitFoldingRanges(ranges, context);\n}\nfunction computeFoldingRanges(document) {\n function getStartLine(t) {\n return document.positionAt(t.offset).line;\n }\n function getEndLine(t) {\n return document.positionAt(t.offset + t.len).line;\n }\n function getScanner() {\n switch (document.languageId) {\n case 'scss':\n return new SCSSScanner();\n case 'less':\n return new LESSScanner();\n default:\n return new Scanner();\n }\n }\n function tokenToRange(t, kind) {\n const startLine = getStartLine(t);\n const endLine = getEndLine(t);\n if (startLine !== endLine) {\n return {\n startLine,\n endLine,\n kind\n };\n }\n else {\n return null;\n }\n }\n const ranges = [];\n const delimiterStack = [];\n const scanner = getScanner();\n scanner.ignoreComment = false;\n scanner.setSource(document.getText());\n let token = scanner.scan();\n let prevToken = null;\n while (token.type !== TokenType.EOF) {\n switch (token.type) {\n case TokenType.CurlyL:\n case InterpolationFunction:\n {\n delimiterStack.push({ line: getStartLine(token), type: 'brace', isStart: true });\n break;\n }\n case TokenType.CurlyR: {\n if (delimiterStack.length !== 0) {\n const prevDelimiter = popPrevStartDelimiterOfType(delimiterStack, 'brace');\n if (!prevDelimiter) {\n break;\n }\n let endLine = getEndLine(token);\n if (prevDelimiter.type === 'brace') {\n /**\n * Other than the case when curly brace is not on a new line by itself, for example\n * .foo {\n * color: red; }\n * Use endLine minus one to show ending curly brace\n */\n if (prevToken && getEndLine(prevToken) !== endLine) {\n endLine--;\n }\n if (prevDelimiter.line !== endLine) {\n ranges.push({\n startLine: prevDelimiter.line,\n endLine,\n kind: undefined\n });\n }\n }\n }\n break;\n }\n /**\n * In CSS, there is no single line comment prefixed with //\n * All comments are marked as `Comment`\n */\n case TokenType.Comment: {\n const commentRegionMarkerToDelimiter = (marker) => {\n if (marker === '#region') {\n return { line: getStartLine(token), type: 'comment', isStart: true };\n }\n else {\n return { line: getEndLine(token), type: 'comment', isStart: false };\n }\n };\n const getCurrDelimiter = (token) => {\n const matches = token.text.match(/^\\s*\\/\\*\\s*(#region|#endregion)\\b\\s*(.*?)\\s*\\*\\//);\n if (matches) {\n return commentRegionMarkerToDelimiter(matches[1]);\n }\n else if (document.languageId === 'scss' || document.languageId === 'less') {\n const matches = token.text.match(/^\\s*\\/\\/\\s*(#region|#endregion)\\b\\s*(.*?)\\s*/);\n if (matches) {\n return commentRegionMarkerToDelimiter(matches[1]);\n }\n }\n return null;\n };\n const currDelimiter = getCurrDelimiter(token);\n // /* */ comment region folding\n // All #region and #endregion cases\n if (currDelimiter) {\n if (currDelimiter.isStart) {\n delimiterStack.push(currDelimiter);\n }\n else {\n const prevDelimiter = popPrevStartDelimiterOfType(delimiterStack, 'comment');\n if (!prevDelimiter) {\n break;\n }\n if (prevDelimiter.type === 'comment') {\n if (prevDelimiter.line !== currDelimiter.line) {\n ranges.push({\n startLine: prevDelimiter.line,\n endLine: currDelimiter.line,\n kind: 'region'\n });\n }\n }\n }\n }\n // Multiline comment case\n else {\n const range = tokenToRange(token, 'comment');\n if (range) {\n ranges.push(range);\n }\n }\n break;\n }\n }\n prevToken = token;\n token = scanner.scan();\n }\n return ranges;\n}\nfunction popPrevStartDelimiterOfType(stack, type) {\n if (stack.length === 0) {\n return null;\n }\n for (let i = stack.length - 1; i >= 0; i--) {\n if (stack[i].type === type && stack[i].isStart) {\n return stack.splice(i, 1)[0];\n }\n }\n return null;\n}\n/**\n * - Sort regions\n * - Remove invalid regions (intersections)\n * - If limit exceeds, only return `rangeLimit` amount of ranges\n */\nfunction limitFoldingRanges(ranges, context) {\n const maxRanges = context && context.rangeLimit || Number.MAX_VALUE;\n const sortedRanges = ranges.sort((r1, r2) => {\n let diff = r1.startLine - r2.startLine;\n if (diff === 0) {\n diff = r1.endLine - r2.endLine;\n }\n return diff;\n });\n const validRanges = [];\n let prevEndLine = -1;\n sortedRanges.forEach(r => {\n if (!(r.startLine < prevEndLine && prevEndLine < r.endLine)) {\n validRanges.push(r);\n prevEndLine = r.endLine;\n }\n });\n if (validRanges.length < maxRanges) {\n return validRanges;\n }\n else {\n return validRanges.slice(0, maxRanges);\n }\n}\n", "// copied from js-beautify/js/lib/beautify-css.js\n// version: 1.14.7\n/* AUTO-GENERATED. DO NOT MODIFY. */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n\n CSS Beautifier\n---------------\n\n Written by Harutyun Amirjanyan, (amirjanyan@gmail.com)\n\n Based on code initially developed by: Einar Lielmanis, <einar@beautifier.io>\n https://beautifier.io/\n\n Usage:\n css_beautify(source_text);\n css_beautify(source_text, options);\n\n The options are (default in brackets):\n indent_size (4) \u2014 indentation size,\n indent_char (space) \u2014 character to indent with,\n selector_separator_newline (true) - separate selectors with newline or\n not (e.g. \"a,\\nbr\" or \"a, br\")\n end_with_newline (false) - end with a newline\n newline_between_rules (true) - add a new line after every css rule\n space_around_selector_separator (false) - ensure space around selector separators:\n '>', '+', '~' (e.g. \"a>b\" -> \"a > b\")\n e.g\n\n css_beautify(css_source_text, {\n 'indent_size': 1,\n 'indent_char': '\\t',\n 'selector_separator': ' ',\n 'end_with_newline': false,\n 'newline_between_rules': true,\n 'space_around_selector_separator': true\n });\n*/\n\n// http://www.w3.org/TR/CSS21/syndata.html#tokenization\n// http://www.w3.org/TR/css3-syntax/\n\nvar legacy_beautify_css;\n/******/ (function() { // webpackBootstrap\n/******/ \t\"use strict\";\n/******/ \tvar __webpack_modules__ = ([\n/* 0 */,\n/* 1 */,\n/* 2 */\n/***/ (function(module) {\n\n/*jshint node:true */\n/*\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n\n\nfunction OutputLine(parent) {\n this.__parent = parent;\n this.__character_count = 0;\n // use indent_count as a marker for this.__lines that have preserved indentation\n this.__indent_count = -1;\n this.__alignment_count = 0;\n this.__wrap_point_index = 0;\n this.__wrap_point_character_count = 0;\n this.__wrap_point_indent_count = -1;\n this.__wrap_point_alignment_count = 0;\n\n this.__items = [];\n}\n\nOutputLine.prototype.clone_empty = function() {\n var line = new OutputLine(this.__parent);\n line.set_indent(this.__indent_count, this.__alignment_count);\n return line;\n};\n\nOutputLine.prototype.item = function(index) {\n if (index < 0) {\n return this.__items[this.__items.length + index];\n } else {\n return this.__items[index];\n }\n};\n\nOutputLine.prototype.has_match = function(pattern) {\n for (var lastCheckedOutput = this.__items.length - 1; lastCheckedOutput >= 0; lastCheckedOutput--) {\n if (this.__items[lastCheckedOutput].match(pattern)) {\n return true;\n }\n }\n return false;\n};\n\nOutputLine.prototype.set_indent = function(indent, alignment) {\n if (this.is_empty()) {\n this.__indent_count = indent || 0;\n this.__alignment_count = alignment || 0;\n this.__character_count = this.__parent.get_indent_size(this.__indent_count, this.__alignment_count);\n }\n};\n\nOutputLine.prototype._set_wrap_point = function() {\n if (this.__parent.wrap_line_length) {\n this.__wrap_point_index = this.__items.length;\n this.__wrap_point_character_count = this.__character_count;\n this.__wrap_point_indent_count = this.__parent.next_line.__indent_count;\n this.__wrap_point_alignment_count = this.__parent.next_line.__alignment_count;\n }\n};\n\nOutputLine.prototype._should_wrap = function() {\n return this.__wrap_point_index &&\n this.__character_count > this.__parent.wrap_line_length &&\n this.__wrap_point_character_count > this.__parent.next_line.__character_count;\n};\n\nOutputLine.prototype._allow_wrap = function() {\n if (this._should_wrap()) {\n this.__parent.add_new_line();\n var next = this.__parent.current_line;\n next.set_indent(this.__wrap_point_indent_count, this.__wrap_point_alignment_count);\n next.__items = this.__items.slice(this.__wrap_point_index);\n this.__items = this.__items.slice(0, this.__wrap_point_index);\n\n next.__character_count += this.__character_count - this.__wrap_point_character_count;\n this.__character_count = this.__wrap_point_character_count;\n\n if (next.__items[0] === \" \") {\n next.__items.splice(0, 1);\n next.__character_count -= 1;\n }\n return true;\n }\n return false;\n};\n\nOutputLine.prototype.is_empty = function() {\n return this.__items.length === 0;\n};\n\nOutputLine.prototype.last = function() {\n if (!this.is_empty()) {\n return this.__items[this.__items.length - 1];\n } else {\n return null;\n }\n};\n\nOutputLine.prototype.push = function(item) {\n this.__items.push(item);\n var last_newline_index = item.lastIndexOf('\\n');\n if (last_newline_index !== -1) {\n this.__character_count = item.length - last_newline_index;\n } else {\n this.__character_count += item.length;\n }\n};\n\nOutputLine.prototype.pop = function() {\n var item = null;\n if (!this.is_empty()) {\n item = this.__items.pop();\n this.__character_count -= item.length;\n }\n return item;\n};\n\n\nOutputLine.prototype._remove_indent = function() {\n if (this.__indent_count > 0) {\n this.__indent_count -= 1;\n this.__character_count -= this.__parent.indent_size;\n }\n};\n\nOutputLine.prototype._remove_wrap_indent = function() {\n if (this.__wrap_point_indent_count > 0) {\n this.__wrap_point_indent_count -= 1;\n }\n};\nOutputLine.prototype.trim = function() {\n while (this.last() === ' ') {\n this.__items.pop();\n this.__character_count -= 1;\n }\n};\n\nOutputLine.prototype.toString = function() {\n var result = '';\n if (this.is_empty()) {\n if (this.__parent.indent_empty_lines) {\n result = this.__parent.get_indent_string(this.__indent_count);\n }\n } else {\n result = this.__parent.get_indent_string(this.__indent_count, this.__alignment_count);\n result += this.__items.join('');\n }\n return result;\n};\n\nfunction IndentStringCache(options, baseIndentString) {\n this.__cache = [''];\n this.__indent_size = options.indent_size;\n this.__indent_string = options.indent_char;\n if (!options.indent_with_tabs) {\n this.__indent_string = new Array(options.indent_size + 1).join(options.indent_char);\n }\n\n // Set to null to continue support for auto detection of base indent\n baseIndentString = baseIndentString || '';\n if (options.indent_level > 0) {\n baseIndentString = new Array(options.indent_level + 1).join(this.__indent_string);\n }\n\n this.__base_string = baseIndentString;\n this.__base_string_length = baseIndentString.length;\n}\n\nIndentStringCache.prototype.get_indent_size = function(indent, column) {\n var result = this.__base_string_length;\n column = column || 0;\n if (indent < 0) {\n result = 0;\n }\n result += indent * this.__indent_size;\n result += column;\n return result;\n};\n\nIndentStringCache.prototype.get_indent_string = function(indent_level, column) {\n var result = this.__base_string;\n column = column || 0;\n if (indent_level < 0) {\n indent_level = 0;\n result = '';\n }\n column += indent_level * this.__indent_size;\n this.__ensure_cache(column);\n result += this.__cache[column];\n return result;\n};\n\nIndentStringCache.prototype.__ensure_cache = function(column) {\n while (column >= this.__cache.length) {\n this.__add_column();\n }\n};\n\nIndentStringCache.prototype.__add_column = function() {\n var column = this.__cache.length;\n var indent = 0;\n var result = '';\n if (this.__indent_size && column >= this.__indent_size) {\n indent = Math.floor(column / this.__indent_size);\n column -= indent * this.__indent_size;\n result = new Array(indent + 1).join(this.__indent_string);\n }\n if (column) {\n result += new Array(column + 1).join(' ');\n }\n\n this.__cache.push(result);\n};\n\nfunction Output(options, baseIndentString) {\n this.__indent_cache = new IndentStringCache(options, baseIndentString);\n this.raw = false;\n this._end_with_newline = options.end_with_newline;\n this.indent_size = options.indent_size;\n this.wrap_line_length = options.wrap_line_length;\n this.indent_empty_lines = options.indent_empty_lines;\n this.__lines = [];\n this.previous_line = null;\n this.current_line = null;\n this.next_line = new OutputLine(this);\n this.space_before_token = false;\n this.non_breaking_space = false;\n this.previous_token_wrapped = false;\n // initialize\n this.__add_outputline();\n}\n\nOutput.prototype.__add_outputline = function() {\n this.previous_line = this.current_line;\n this.current_line = this.next_line.clone_empty();\n this.__lines.push(this.current_line);\n};\n\nOutput.prototype.get_line_number = function() {\n return this.__lines.length;\n};\n\nOutput.prototype.get_indent_string = function(indent, column) {\n return this.__indent_cache.get_indent_string(indent, column);\n};\n\nOutput.prototype.get_indent_size = function(indent, column) {\n return this.__indent_cache.get_indent_size(indent, column);\n};\n\nOutput.prototype.is_empty = function() {\n return !this.previous_line && this.current_line.is_empty();\n};\n\nOutput.prototype.add_new_line = function(force_newline) {\n // never newline at the start of file\n // otherwise, newline only if we didn't just add one or we're forced\n if (this.is_empty() ||\n (!force_newline && this.just_added_newline())) {\n return false;\n }\n\n // if raw output is enabled, don't print additional newlines,\n // but still return True as though you had\n if (!this.raw) {\n this.__add_outputline();\n }\n return true;\n};\n\nOutput.prototype.get_code = function(eol) {\n this.trim(true);\n\n // handle some edge cases where the last tokens\n // has text that ends with newline(s)\n var last_item = this.current_line.pop();\n if (last_item) {\n if (last_item[last_item.length - 1] === '\\n') {\n last_item = last_item.replace(/\\n+$/g, '');\n }\n this.current_line.push(last_item);\n }\n\n if (this._end_with_newline) {\n this.__add_outputline();\n }\n\n var sweet_code = this.__lines.join('\\n');\n\n if (eol !== '\\n') {\n sweet_code = sweet_code.replace(/[\\n]/g, eol);\n }\n return sweet_code;\n};\n\nOutput.prototype.set_wrap_point = function() {\n this.current_line._set_wrap_point();\n};\n\nOutput.prototype.set_indent = function(indent, alignment) {\n indent = indent || 0;\n alignment = alignment || 0;\n\n // Next line stores alignment values\n this.next_line.set_indent(indent, alignment);\n\n // Never indent your first output indent at the start of the file\n if (this.__lines.length > 1) {\n this.current_line.set_indent(indent, alignment);\n return true;\n }\n\n this.current_line.set_indent();\n return false;\n};\n\nOutput.prototype.add_raw_token = function(token) {\n for (var x = 0; x < token.newlines; x++) {\n this.__add_outputline();\n }\n this.current_line.set_indent(-1);\n this.current_line.push(token.whitespace_before);\n this.current_line.push(token.text);\n this.space_before_token = false;\n this.non_breaking_space = false;\n this.previous_token_wrapped = false;\n};\n\nOutput.prototype.add_token = function(printable_token) {\n this.__add_space_before_token();\n this.current_line.push(printable_token);\n this.space_before_token = false;\n this.non_breaking_space = false;\n this.previous_token_wrapped = this.current_line._allow_wrap();\n};\n\nOutput.prototype.__add_space_before_token = function() {\n if (this.space_before_token && !this.just_added_newline()) {\n if (!this.non_breaking_space) {\n this.set_wrap_point();\n }\n this.current_line.push(' ');\n }\n};\n\nOutput.prototype.remove_indent = function(index) {\n var output_length = this.__lines.length;\n while (index < output_length) {\n this.__lines[index]._remove_indent();\n index++;\n }\n this.current_line._remove_wrap_indent();\n};\n\nOutput.prototype.trim = function(eat_newlines) {\n eat_newlines = (eat_newlines === undefined) ? false : eat_newlines;\n\n this.current_line.trim();\n\n while (eat_newlines && this.__lines.length > 1 &&\n this.current_line.is_empty()) {\n this.__lines.pop();\n this.current_line = this.__lines[this.__lines.length - 1];\n this.current_line.trim();\n }\n\n this.previous_line = this.__lines.length > 1 ?\n this.__lines[this.__lines.length - 2] : null;\n};\n\nOutput.prototype.just_added_newline = function() {\n return this.current_line.is_empty();\n};\n\nOutput.prototype.just_added_blankline = function() {\n return this.is_empty() ||\n (this.current_line.is_empty() && this.previous_line.is_empty());\n};\n\nOutput.prototype.ensure_empty_line_above = function(starts_with, ends_with) {\n var index = this.__lines.length - 2;\n while (index >= 0) {\n var potentialEmptyLine = this.__lines[index];\n if (potentialEmptyLine.is_empty()) {\n break;\n } else if (potentialEmptyLine.item(0).indexOf(starts_with) !== 0 &&\n potentialEmptyLine.item(-1) !== ends_with) {\n this.__lines.splice(index + 1, 0, new OutputLine(this));\n this.previous_line = this.__lines[this.__lines.length - 2];\n break;\n }\n index--;\n }\n};\n\nmodule.exports.Output = Output;\n\n\n/***/ }),\n/* 3 */,\n/* 4 */,\n/* 5 */,\n/* 6 */\n/***/ (function(module) {\n\n/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n\n\nfunction Options(options, merge_child_field) {\n this.raw_options = _mergeOpts(options, merge_child_field);\n\n // Support passing the source text back with no change\n this.disabled = this._get_boolean('disabled');\n\n this.eol = this._get_characters('eol', 'auto');\n this.end_with_newline = this._get_boolean('end_with_newline');\n this.indent_size = this._get_number('indent_size', 4);\n this.indent_char = this._get_characters('indent_char', ' ');\n this.indent_level = this._get_number('indent_level');\n\n this.preserve_newlines = this._get_boolean('preserve_newlines', true);\n this.max_preserve_newlines = this._get_number('max_preserve_newlines', 32786);\n if (!this.preserve_newlines) {\n this.max_preserve_newlines = 0;\n }\n\n this.indent_with_tabs = this._get_boolean('indent_with_tabs', this.indent_char === '\\t');\n if (this.indent_with_tabs) {\n this.indent_char = '\\t';\n\n // indent_size behavior changed after 1.8.6\n // It used to be that indent_size would be\n // set to 1 for indent_with_tabs. That is no longer needed and\n // actually doesn't make sense - why not use spaces? Further,\n // that might produce unexpected behavior - tabs being used\n // for single-column alignment. So, when indent_with_tabs is true\n // and indent_size is 1, reset indent_size to 4.\n if (this.indent_size === 1) {\n this.indent_size = 4;\n }\n }\n\n // Backwards compat with 1.3.x\n this.wrap_line_length = this._get_number('wrap_line_length', this._get_number('max_char'));\n\n this.indent_empty_lines = this._get_boolean('indent_empty_lines');\n\n // valid templating languages ['django', 'erb', 'handlebars', 'php', 'smarty']\n // For now, 'auto' = all off for javascript, all on for html (and inline javascript).\n // other values ignored\n this.templating = this._get_selection_list('templating', ['auto', 'none', 'django', 'erb', 'handlebars', 'php', 'smarty'], ['auto']);\n}\n\nOptions.prototype._get_array = function(name, default_value) {\n var option_value = this.raw_options[name];\n var result = default_value || [];\n if (typeof option_value === 'object') {\n if (option_value !== null && typeof option_value.concat === 'function') {\n result = option_value.concat();\n }\n } else if (typeof option_value === 'string') {\n result = option_value.split(/[^a-zA-Z0-9_\\/\\-]+/);\n }\n return result;\n};\n\nOptions.prototype._get_boolean = function(name, default_value) {\n var option_value = this.raw_options[name];\n var result = option_value === undefined ? !!default_value : !!option_value;\n return result;\n};\n\nOptions.prototype._get_characters = function(name, default_value) {\n var option_value = this.raw_options[name];\n var result = default_value || '';\n if (typeof option_value === 'string') {\n result = option_value.replace(/\\\\r/, '\\r').replace(/\\\\n/, '\\n').replace(/\\\\t/, '\\t');\n }\n return result;\n};\n\nOptions.prototype._get_number = function(name, default_value) {\n var option_value = this.raw_options[name];\n default_value = parseInt(default_value, 10);\n if (isNaN(default_value)) {\n default_value = 0;\n }\n var result = parseInt(option_value, 10);\n if (isNaN(result)) {\n result = default_value;\n }\n return result;\n};\n\nOptions.prototype._get_selection = function(name, selection_list, default_value) {\n var result = this._get_selection_list(name, selection_list, default_value);\n if (result.length !== 1) {\n throw new Error(\n \"Invalid Option Value: The option '\" + name + \"' can only be one of the following values:\\n\" +\n selection_list + \"\\nYou passed in: '\" + this.raw_options[name] + \"'\");\n }\n\n return result[0];\n};\n\n\nOptions.prototype._get_selection_list = function(name, selection_list, default_value) {\n if (!selection_list || selection_list.length === 0) {\n throw new Error(\"Selection list cannot be empty.\");\n }\n\n default_value = default_value || [selection_list[0]];\n if (!this._is_valid_selection(default_value, selection_list)) {\n throw new Error(\"Invalid Default Value!\");\n }\n\n var result = this._get_array(name, default_value);\n if (!this._is_valid_selection(result, selection_list)) {\n throw new Error(\n \"Invalid Option Value: The option '\" + name + \"' can contain only the following values:\\n\" +\n selection_list + \"\\nYou passed in: '\" + this.raw_options[name] + \"'\");\n }\n\n return result;\n};\n\nOptions.prototype._is_valid_selection = function(result, selection_list) {\n return result.length && selection_list.length &&\n !result.some(function(item) { return selection_list.indexOf(item) === -1; });\n};\n\n\n// merges child options up with the parent options object\n// Example: obj = {a: 1, b: {a: 2}}\n// mergeOpts(obj, 'b')\n//\n// Returns: {a: 2}\nfunction _mergeOpts(allOptions, childFieldName) {\n var finalOpts = {};\n allOptions = _normalizeOpts(allOptions);\n var name;\n\n for (name in allOptions) {\n if (name !== childFieldName) {\n finalOpts[name] = allOptions[name];\n }\n }\n\n //merge in the per type settings for the childFieldName\n if (childFieldName && allOptions[childFieldName]) {\n for (name in allOptions[childFieldName]) {\n finalOpts[name] = allOptions[childFieldName][name];\n }\n }\n return finalOpts;\n}\n\nfunction _normalizeOpts(options) {\n var convertedOpts = {};\n var key;\n\n for (key in options) {\n var newKey = key.replace(/-/g, \"_\");\n convertedOpts[newKey] = options[key];\n }\n return convertedOpts;\n}\n\nmodule.exports.Options = Options;\nmodule.exports.normalizeOpts = _normalizeOpts;\nmodule.exports.mergeOpts = _mergeOpts;\n\n\n/***/ }),\n/* 7 */,\n/* 8 */\n/***/ (function(module) {\n\n/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n\n\nvar regexp_has_sticky = RegExp.prototype.hasOwnProperty('sticky');\n\nfunction InputScanner(input_string) {\n this.__input = input_string || '';\n this.__input_length = this.__input.length;\n this.__position = 0;\n}\n\nInputScanner.prototype.restart = function() {\n this.__position = 0;\n};\n\nInputScanner.prototype.back = function() {\n if (this.__position > 0) {\n this.__position -= 1;\n }\n};\n\nInputScanner.prototype.hasNext = function() {\n return this.__position < this.__input_length;\n};\n\nInputScanner.prototype.next = function() {\n var val = null;\n if (this.hasNext()) {\n val = this.__input.charAt(this.__position);\n this.__position += 1;\n }\n return val;\n};\n\nInputScanner.prototype.peek = function(index) {\n var val = null;\n index = index || 0;\n index += this.__position;\n if (index >= 0 && index < this.__input_length) {\n val = this.__input.charAt(index);\n }\n return val;\n};\n\n// This is a JavaScript only helper function (not in python)\n// Javascript doesn't have a match method\n// and not all implementation support \"sticky\" flag.\n// If they do not support sticky then both this.match() and this.test() method\n// must get the match and check the index of the match.\n// If sticky is supported and set, this method will use it.\n// Otherwise it will check that global is set, and fall back to the slower method.\nInputScanner.prototype.__match = function(pattern, index) {\n pattern.lastIndex = index;\n var pattern_match = pattern.exec(this.__input);\n\n if (pattern_match && !(regexp_has_sticky && pattern.sticky)) {\n if (pattern_match.index !== index) {\n pattern_match = null;\n }\n }\n\n return pattern_match;\n};\n\nInputScanner.prototype.test = function(pattern, index) {\n index = index || 0;\n index += this.__position;\n\n if (index >= 0 && index < this.__input_length) {\n return !!this.__match(pattern, index);\n } else {\n return false;\n }\n};\n\nInputScanner.prototype.testChar = function(pattern, index) {\n // test one character regex match\n var val = this.peek(index);\n pattern.lastIndex = 0;\n return val !== null && pattern.test(val);\n};\n\nInputScanner.prototype.match = function(pattern) {\n var pattern_match = this.__match(pattern, this.__position);\n if (pattern_match) {\n this.__position += pattern_match[0].length;\n } else {\n pattern_match = null;\n }\n return pattern_match;\n};\n\nInputScanner.prototype.read = function(starting_pattern, until_pattern, until_after) {\n var val = '';\n var match;\n if (starting_pattern) {\n match = this.match(starting_pattern);\n if (match) {\n val += match[0];\n }\n }\n if (until_pattern && (match || !starting_pattern)) {\n val += this.readUntil(until_pattern, until_after);\n }\n return val;\n};\n\nInputScanner.prototype.readUntil = function(pattern, until_after) {\n var val = '';\n var match_index = this.__position;\n pattern.lastIndex = this.__position;\n var pattern_match = pattern.exec(this.__input);\n if (pattern_match) {\n match_index = pattern_match.index;\n if (until_after) {\n match_index += pattern_match[0].length;\n }\n } else {\n match_index = this.__input_length;\n }\n\n val = this.__input.substring(this.__position, match_index);\n this.__position = match_index;\n return val;\n};\n\nInputScanner.prototype.readUntilAfter = function(pattern) {\n return this.readUntil(pattern, true);\n};\n\nInputScanner.prototype.get_regexp = function(pattern, match_from) {\n var result = null;\n var flags = 'g';\n if (match_from && regexp_has_sticky) {\n flags = 'y';\n }\n // strings are converted to regexp\n if (typeof pattern === \"string\" && pattern !== '') {\n // result = new RegExp(pattern.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'), flags);\n result = new RegExp(pattern, flags);\n } else if (pattern) {\n result = new RegExp(pattern.source, flags);\n }\n return result;\n};\n\nInputScanner.prototype.get_literal_regexp = function(literal_string) {\n return RegExp(literal_string.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'));\n};\n\n/* css beautifier legacy helpers */\nInputScanner.prototype.peekUntilAfter = function(pattern) {\n var start = this.__position;\n var val = this.readUntilAfter(pattern);\n this.__position = start;\n return val;\n};\n\nInputScanner.prototype.lookBack = function(testVal) {\n var start = this.__position - 1;\n return start >= testVal.length && this.__input.substring(start - testVal.length, start)\n .toLowerCase() === testVal;\n};\n\nmodule.exports.InputScanner = InputScanner;\n\n\n/***/ }),\n/* 9 */,\n/* 10 */,\n/* 11 */,\n/* 12 */,\n/* 13 */\n/***/ (function(module) {\n\n/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n\n\nfunction Directives(start_block_pattern, end_block_pattern) {\n start_block_pattern = typeof start_block_pattern === 'string' ? start_block_pattern : start_block_pattern.source;\n end_block_pattern = typeof end_block_pattern === 'string' ? end_block_pattern : end_block_pattern.source;\n this.__directives_block_pattern = new RegExp(start_block_pattern + / beautify( \\w+[:]\\w+)+ /.source + end_block_pattern, 'g');\n this.__directive_pattern = / (\\w+)[:](\\w+)/g;\n\n this.__directives_end_ignore_pattern = new RegExp(start_block_pattern + /\\sbeautify\\signore:end\\s/.source + end_block_pattern, 'g');\n}\n\nDirectives.prototype.get_directives = function(text) {\n if (!text.match(this.__directives_block_pattern)) {\n return null;\n }\n\n var directives = {};\n this.__directive_pattern.lastIndex = 0;\n var directive_match = this.__directive_pattern.exec(text);\n\n while (directive_match) {\n directives[directive_match[1]] = directive_match[2];\n directive_match = this.__directive_pattern.exec(text);\n }\n\n return directives;\n};\n\nDirectives.prototype.readIgnored = function(input) {\n return input.readUntilAfter(this.__directives_end_ignore_pattern);\n};\n\n\nmodule.exports.Directives = Directives;\n\n\n/***/ }),\n/* 14 */,\n/* 15 */\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\n/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n\n\nvar Beautifier = (__webpack_require__(16).Beautifier),\n Options = (__webpack_require__(17).Options);\n\nfunction css_beautify(source_text, options) {\n var beautifier = new Beautifier(source_text, options);\n return beautifier.beautify();\n}\n\nmodule.exports = css_beautify;\nmodule.exports.defaultOptions = function() {\n return new Options();\n};\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\n/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n\n\nvar Options = (__webpack_require__(17).Options);\nvar Output = (__webpack_require__(2).Output);\nvar InputScanner = (__webpack_require__(8).InputScanner);\nvar Directives = (__webpack_require__(13).Directives);\n\nvar directives_core = new Directives(/\\/\\*/, /\\*\\//);\n\nvar lineBreak = /\\r\\n|[\\r\\n]/;\nvar allLineBreaks = /\\r\\n|[\\r\\n]/g;\n\n// tokenizer\nvar whitespaceChar = /\\s/;\nvar whitespacePattern = /(?:\\s|\\n)+/g;\nvar block_comment_pattern = /\\/\\*(?:[\\s\\S]*?)((?:\\*\\/)|$)/g;\nvar comment_pattern = /\\/\\/(?:[^\\n\\r\\u2028\\u2029]*)/g;\n\nfunction Beautifier(source_text, options) {\n this._source_text = source_text || '';\n // Allow the setting of language/file-type specific options\n // with inheritance of overall settings\n this._options = new Options(options);\n this._ch = null;\n this._input = null;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/At-rule\n this.NESTED_AT_RULE = {\n \"@page\": true,\n \"@font-face\": true,\n \"@keyframes\": true,\n // also in CONDITIONAL_GROUP_RULE below\n \"@media\": true,\n \"@supports\": true,\n \"@document\": true\n };\n this.CONDITIONAL_GROUP_RULE = {\n \"@media\": true,\n \"@supports\": true,\n \"@document\": true\n };\n this.NON_SEMICOLON_NEWLINE_PROPERTY = [\n \"grid-template-areas\",\n \"grid-template\"\n ];\n\n}\n\nBeautifier.prototype.eatString = function(endChars) {\n var result = '';\n this._ch = this._input.next();\n while (this._ch) {\n result += this._ch;\n if (this._ch === \"\\\\\") {\n result += this._input.next();\n } else if (endChars.indexOf(this._ch) !== -1 || this._ch === \"\\n\") {\n break;\n }\n this._ch = this._input.next();\n }\n return result;\n};\n\n// Skips any white space in the source text from the current position.\n// When allowAtLeastOneNewLine is true, will output new lines for each\n// newline character found; if the user has preserve_newlines off, only\n// the first newline will be output\nBeautifier.prototype.eatWhitespace = function(allowAtLeastOneNewLine) {\n var result = whitespaceChar.test(this._input.peek());\n var newline_count = 0;\n while (whitespaceChar.test(this._input.peek())) {\n this._ch = this._input.next();\n if (allowAtLeastOneNewLine && this._ch === '\\n') {\n if (newline_count === 0 || newline_count < this._options.max_preserve_newlines) {\n newline_count++;\n this._output.add_new_line(true);\n }\n }\n }\n return result;\n};\n\n// Nested pseudo-class if we are insideRule\n// and the next special character found opens\n// a new block\nBeautifier.prototype.foundNestedPseudoClass = function() {\n var openParen = 0;\n var i = 1;\n var ch = this._input.peek(i);\n while (ch) {\n if (ch === \"{\") {\n return true;\n } else if (ch === '(') {\n // pseudoclasses can contain ()\n openParen += 1;\n } else if (ch === ')') {\n if (openParen === 0) {\n return false;\n }\n openParen -= 1;\n } else if (ch === \";\" || ch === \"}\") {\n return false;\n }\n i++;\n ch = this._input.peek(i);\n }\n return false;\n};\n\nBeautifier.prototype.print_string = function(output_string) {\n this._output.set_indent(this._indentLevel);\n this._output.non_breaking_space = true;\n this._output.add_token(output_string);\n};\n\nBeautifier.prototype.preserveSingleSpace = function(isAfterSpace) {\n if (isAfterSpace) {\n this._output.space_before_token = true;\n }\n};\n\nBeautifier.prototype.indent = function() {\n this._indentLevel++;\n};\n\nBeautifier.prototype.outdent = function() {\n if (this._indentLevel > 0) {\n this._indentLevel--;\n }\n};\n\n/*_____________________--------------------_____________________*/\n\nBeautifier.prototype.beautify = function() {\n if (this._options.disabled) {\n return this._source_text;\n }\n\n var source_text = this._source_text;\n var eol = this._options.eol;\n if (eol === 'auto') {\n eol = '\\n';\n if (source_text && lineBreak.test(source_text || '')) {\n eol = source_text.match(lineBreak)[0];\n }\n }\n\n\n // HACK: newline parsing inconsistent. This brute force normalizes the this._input.\n source_text = source_text.replace(allLineBreaks, '\\n');\n\n // reset\n var baseIndentString = source_text.match(/^[\\t ]*/)[0];\n\n this._output = new Output(this._options, baseIndentString);\n this._input = new InputScanner(source_text);\n this._indentLevel = 0;\n this._nestedLevel = 0;\n\n this._ch = null;\n var parenLevel = 0;\n\n var insideRule = false;\n // This is the value side of a property value pair (blue in the following ex)\n // label { content: blue }\n var insidePropertyValue = false;\n var enteringConditionalGroup = false;\n var insideAtExtend = false;\n var insideAtImport = false;\n var insideScssMap = false;\n var topCharacter = this._ch;\n var insideNonSemiColonValues = false;\n var whitespace;\n var isAfterSpace;\n var previous_ch;\n\n while (true) {\n whitespace = this._input.read(whitespacePattern);\n isAfterSpace = whitespace !== '';\n previous_ch = topCharacter;\n this._ch = this._input.next();\n if (this._ch === '\\\\' && this._input.hasNext()) {\n this._ch += this._input.next();\n }\n topCharacter = this._ch;\n\n if (!this._ch) {\n break;\n } else if (this._ch === '/' && this._input.peek() === '*') {\n // /* css comment */\n // Always start block comments on a new line.\n // This handles scenarios where a block comment immediately\n // follows a property definition on the same line or where\n // minified code is being beautified.\n this._output.add_new_line();\n this._input.back();\n\n var comment = this._input.read(block_comment_pattern);\n\n // Handle ignore directive\n var directives = directives_core.get_directives(comment);\n if (directives && directives.ignore === 'start') {\n comment += directives_core.readIgnored(this._input);\n }\n\n this.print_string(comment);\n\n // Ensures any new lines following the comment are preserved\n this.eatWhitespace(true);\n\n // Block comments are followed by a new line so they don't\n // share a line with other properties\n this._output.add_new_line();\n } else if (this._ch === '/' && this._input.peek() === '/') {\n // // single line comment\n // Preserves the space before a comment\n // on the same line as a rule\n this._output.space_before_token = true;\n this._input.back();\n this.print_string(this._input.read(comment_pattern));\n\n // Ensures any new lines following the comment are preserved\n this.eatWhitespace(true);\n } else if (this._ch === '@' || this._ch === '$') {\n this.preserveSingleSpace(isAfterSpace);\n\n // deal with less propery mixins @{...}\n if (this._input.peek() === '{') {\n this.print_string(this._ch + this.eatString('}'));\n } else {\n this.print_string(this._ch);\n\n // strip trailing space, if present, for hash property checks\n var variableOrRule = this._input.peekUntilAfter(/[: ,;{}()[\\]\\/='\"]/g);\n\n if (variableOrRule.match(/[ :]$/)) {\n // we have a variable or pseudo-class, add it and insert one space before continuing\n variableOrRule = this.eatString(\": \").replace(/\\s$/, '');\n this.print_string(variableOrRule);\n this._output.space_before_token = true;\n }\n\n variableOrRule = variableOrRule.replace(/\\s$/, '');\n\n if (variableOrRule === 'extend') {\n insideAtExtend = true;\n } else if (variableOrRule === 'import') {\n insideAtImport = true;\n }\n\n // might be a nesting at-rule\n if (variableOrRule in this.NESTED_AT_RULE) {\n this._nestedLevel += 1;\n if (variableOrRule in this.CONDITIONAL_GROUP_RULE) {\n enteringConditionalGroup = true;\n }\n // might be less variable\n } else if (!insideRule && parenLevel === 0 && variableOrRule.indexOf(':') !== -1) {\n insidePropertyValue = true;\n this.indent();\n }\n }\n } else if (this._ch === '#' && this._input.peek() === '{') {\n this.preserveSingleSpace(isAfterSpace);\n this.print_string(this._ch + this.eatString('}'));\n } else if (this._ch === '{') {\n if (insidePropertyValue) {\n insidePropertyValue = false;\n this.outdent();\n }\n\n // when entering conditional groups, only rulesets are allowed\n if (enteringConditionalGroup) {\n enteringConditionalGroup = false;\n insideRule = (this._indentLevel >= this._nestedLevel);\n } else {\n // otherwise, declarations are also allowed\n insideRule = (this._indentLevel >= this._nestedLevel - 1);\n }\n if (this._options.newline_between_rules && insideRule) {\n if (this._output.previous_line && this._output.previous_line.item(-1) !== '{') {\n this._output.ensure_empty_line_above('/', ',');\n }\n }\n\n this._output.space_before_token = true;\n\n // The difference in print_string and indent order is necessary to indent the '{' correctly\n if (this._options.brace_style === 'expand') {\n this._output.add_new_line();\n this.print_string(this._ch);\n this.indent();\n this._output.set_indent(this._indentLevel);\n } else {\n // inside mixin and first param is object\n if (previous_ch === '(') {\n this._output.space_before_token = false;\n } else if (previous_ch !== ',') {\n this.indent();\n }\n this.print_string(this._ch);\n }\n\n this.eatWhitespace(true);\n this._output.add_new_line();\n } else if (this._ch === '}') {\n this.outdent();\n this._output.add_new_line();\n if (previous_ch === '{') {\n this._output.trim(true);\n }\n insideAtImport = false;\n insideAtExtend = false;\n if (insidePropertyValue) {\n this.outdent();\n insidePropertyValue = false;\n }\n this.print_string(this._ch);\n insideRule = false;\n if (this._nestedLevel) {\n this._nestedLevel--;\n }\n\n this.eatWhitespace(true);\n this._output.add_new_line();\n\n if (this._options.newline_between_rules && !this._output.just_added_blankline()) {\n if (this._input.peek() !== '}') {\n this._output.add_new_line(true);\n }\n }\n if (this._input.peek() === ')') {\n this._output.trim(true);\n if (this._options.brace_style === \"expand\") {\n this._output.add_new_line(true);\n }\n }\n } else if (this._ch === \":\") {\n\n for (var i = 0; i < this.NON_SEMICOLON_NEWLINE_PROPERTY.length; i++) {\n if (this._input.lookBack(this.NON_SEMICOLON_NEWLINE_PROPERTY[i])) {\n insideNonSemiColonValues = true;\n break;\n }\n }\n\n if ((insideRule || enteringConditionalGroup) && !(this._input.lookBack(\"&\") || this.foundNestedPseudoClass()) && !this._input.lookBack(\"(\") && !insideAtExtend && parenLevel === 0) {\n // 'property: value' delimiter\n // which could be in a conditional group query\n this.print_string(':');\n if (!insidePropertyValue) {\n insidePropertyValue = true;\n this._output.space_before_token = true;\n this.eatWhitespace(true);\n this.indent();\n }\n } else {\n // sass/less parent reference don't use a space\n // sass nested pseudo-class don't use a space\n\n // preserve space before pseudoclasses/pseudoelements, as it means \"in any child\"\n if (this._input.lookBack(\" \")) {\n this._output.space_before_token = true;\n }\n if (this._input.peek() === \":\") {\n // pseudo-element\n this._ch = this._input.next();\n this.print_string(\"::\");\n } else {\n // pseudo-class\n this.print_string(':');\n }\n }\n } else if (this._ch === '\"' || this._ch === '\\'') {\n var preserveQuoteSpace = previous_ch === '\"' || previous_ch === '\\'';\n this.preserveSingleSpace(preserveQuoteSpace || isAfterSpace);\n this.print_string(this._ch + this.eatString(this._ch));\n this.eatWhitespace(true);\n } else if (this._ch === ';') {\n insideNonSemiColonValues = false;\n if (parenLevel === 0) {\n if (insidePropertyValue) {\n this.outdent();\n insidePropertyValue = false;\n }\n insideAtExtend = false;\n insideAtImport = false;\n this.print_string(this._ch);\n this.eatWhitespace(true);\n\n // This maintains single line comments on the same\n // line. Block comments are also affected, but\n // a new line is always output before one inside\n // that section\n if (this._input.peek() !== '/') {\n this._output.add_new_line();\n }\n } else {\n this.print_string(this._ch);\n this.eatWhitespace(true);\n this._output.space_before_token = true;\n }\n } else if (this._ch === '(') { // may be a url\n if (this._input.lookBack(\"url\")) {\n this.print_string(this._ch);\n this.eatWhitespace();\n parenLevel++;\n this.indent();\n this._ch = this._input.next();\n if (this._ch === ')' || this._ch === '\"' || this._ch === '\\'') {\n this._input.back();\n } else if (this._ch) {\n this.print_string(this._ch + this.eatString(')'));\n if (parenLevel) {\n parenLevel--;\n this.outdent();\n }\n }\n } else {\n var space_needed = false;\n if (this._input.lookBack(\"with\")) {\n // look back is not an accurate solution, we need tokens to confirm without whitespaces\n space_needed = true;\n }\n this.preserveSingleSpace(isAfterSpace || space_needed);\n this.print_string(this._ch);\n\n // handle scss/sass map\n if (insidePropertyValue && previous_ch === \"$\" && this._options.selector_separator_newline) {\n this._output.add_new_line();\n insideScssMap = true;\n } else {\n this.eatWhitespace();\n parenLevel++;\n this.indent();\n }\n }\n } else if (this._ch === ')') {\n if (parenLevel) {\n parenLevel--;\n this.outdent();\n }\n if (insideScssMap && this._input.peek() === \";\" && this._options.selector_separator_newline) {\n insideScssMap = false;\n this.outdent();\n this._output.add_new_line();\n }\n this.print_string(this._ch);\n } else if (this._ch === ',') {\n this.print_string(this._ch);\n this.eatWhitespace(true);\n if (this._options.selector_separator_newline && (!insidePropertyValue || insideScssMap) && parenLevel === 0 && !insideAtImport && !insideAtExtend) {\n this._output.add_new_line();\n } else {\n this._output.space_before_token = true;\n }\n } else if ((this._ch === '>' || this._ch === '+' || this._ch === '~') && !insidePropertyValue && parenLevel === 0) {\n //handle combinator spacing\n if (this._options.space_around_combinator) {\n this._output.space_before_token = true;\n this.print_string(this._ch);\n this._output.space_before_token = true;\n } else {\n this.print_string(this._ch);\n this.eatWhitespace();\n // squash extra whitespace\n if (this._ch && whitespaceChar.test(this._ch)) {\n this._ch = '';\n }\n }\n } else if (this._ch === ']') {\n this.print_string(this._ch);\n } else if (this._ch === '[') {\n this.preserveSingleSpace(isAfterSpace);\n this.print_string(this._ch);\n } else if (this._ch === '=') { // no whitespace before or after\n this.eatWhitespace();\n this.print_string('=');\n if (whitespaceChar.test(this._ch)) {\n this._ch = '';\n }\n } else if (this._ch === '!' && !this._input.lookBack(\"\\\\\")) { // !important\n this._output.space_before_token = true;\n this.print_string(this._ch);\n } else {\n var preserveAfterSpace = previous_ch === '\"' || previous_ch === '\\'';\n this.preserveSingleSpace(preserveAfterSpace || isAfterSpace);\n this.print_string(this._ch);\n\n if (!this._output.just_added_newline() && this._input.peek() === '\\n' && insideNonSemiColonValues) {\n this._output.add_new_line();\n }\n }\n }\n\n var sweetCode = this._output.get_code(eol);\n\n return sweetCode;\n};\n\nmodule.exports.Beautifier = Beautifier;\n\n\n/***/ }),\n/* 17 */\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\n/*jshint node:true */\n/*\n\n The MIT License (MIT)\n\n Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n Permission is hereby granted, free of charge, to any person\n obtaining a copy of this software and associated documentation files\n (the \"Software\"), to deal in the Software without restriction,\n including without limitation the rights to use, copy, modify, merge,\n publish, distribute, sublicense, and/or sell copies of the Software,\n and to permit persons to whom the Software is furnished to do so,\n subject to the following conditions:\n\n The above copyright notice and this permission notice shall be\n included in all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n*/\n\n\n\nvar BaseOptions = (__webpack_require__(6).Options);\n\nfunction Options(options) {\n BaseOptions.call(this, options, 'css');\n\n this.selector_separator_newline = this._get_boolean('selector_separator_newline', true);\n this.newline_between_rules = this._get_boolean('newline_between_rules', true);\n var space_around_selector_separator = this._get_boolean('space_around_selector_separator');\n this.space_around_combinator = this._get_boolean('space_around_combinator') || space_around_selector_separator;\n\n var brace_style_split = this._get_selection_list('brace_style', ['collapse', 'expand', 'end-expand', 'none', 'preserve-inline']);\n this.brace_style = 'collapse';\n for (var bs = 0; bs < brace_style_split.length; bs++) {\n if (brace_style_split[bs] !== 'expand') {\n // default to collapse, as only collapse|expand is implemented for now\n this.brace_style = 'collapse';\n } else {\n this.brace_style = brace_style_split[bs];\n }\n }\n}\nOptions.prototype = new BaseOptions();\n\n\n\nmodule.exports.Options = Options;\n\n\n/***/ })\n/******/ \t]);\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \t// This entry module is referenced by other modules so it can't be inlined\n/******/ \tvar __webpack_exports__ = __webpack_require__(15);\n/******/ \tlegacy_beautify_css = __webpack_exports__;\n/******/ \t\n/******/ })()\n;\n\nexport var css_beautify = legacy_beautify_css;", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { Range, Position } from '../cssLanguageTypes';\nimport { css_beautify } from '../beautify/beautify-css';\nimport { repeat } from '../utils/strings';\nexport function format(document, range, options) {\n let value = document.getText();\n let includesEnd = true;\n let initialIndentLevel = 0;\n let inRule = false;\n const tabSize = options.tabSize || 4;\n if (range) {\n let startOffset = document.offsetAt(range.start);\n // include all leading whitespace iff at the beginning of the line\n let extendedStart = startOffset;\n while (extendedStart > 0 && isWhitespace(value, extendedStart - 1)) {\n extendedStart--;\n }\n if (extendedStart === 0 || isEOL(value, extendedStart - 1)) {\n startOffset = extendedStart;\n }\n else {\n // else keep at least one whitespace\n if (extendedStart < startOffset) {\n startOffset = extendedStart + 1;\n }\n }\n // include all following whitespace until the end of the line\n let endOffset = document.offsetAt(range.end);\n let extendedEnd = endOffset;\n while (extendedEnd < value.length && isWhitespace(value, extendedEnd)) {\n extendedEnd++;\n }\n if (extendedEnd === value.length || isEOL(value, extendedEnd)) {\n endOffset = extendedEnd;\n }\n range = Range.create(document.positionAt(startOffset), document.positionAt(endOffset));\n // Test if inside a rule\n inRule = isInRule(value, startOffset);\n includesEnd = endOffset === value.length;\n value = value.substring(startOffset, endOffset);\n if (startOffset !== 0) {\n const startOfLineOffset = document.offsetAt(Position.create(range.start.line, 0));\n initialIndentLevel = computeIndentLevel(document.getText(), startOfLineOffset, options);\n }\n if (inRule) {\n value = `{\\n${trimLeft(value)}`;\n }\n }\n else {\n range = Range.create(Position.create(0, 0), document.positionAt(value.length));\n }\n const cssOptions = {\n indent_size: tabSize,\n indent_char: options.insertSpaces ? ' ' : '\\t',\n end_with_newline: includesEnd && getFormatOption(options, 'insertFinalNewline', false),\n selector_separator_newline: getFormatOption(options, 'newlineBetweenSelectors', true),\n newline_between_rules: getFormatOption(options, 'newlineBetweenRules', true),\n space_around_selector_separator: getFormatOption(options, 'spaceAroundSelectorSeparator', false),\n brace_style: getFormatOption(options, 'braceStyle', 'collapse'),\n indent_empty_lines: getFormatOption(options, 'indentEmptyLines', false),\n max_preserve_newlines: getFormatOption(options, 'maxPreserveNewLines', undefined),\n preserve_newlines: getFormatOption(options, 'preserveNewLines', true),\n wrap_line_length: getFormatOption(options, 'wrapLineLength', undefined),\n eol: '\\n'\n };\n let result = css_beautify(value, cssOptions);\n if (inRule) {\n result = trimLeft(result.substring(2));\n }\n if (initialIndentLevel > 0) {\n const indent = options.insertSpaces ? repeat(' ', tabSize * initialIndentLevel) : repeat('\\t', initialIndentLevel);\n result = result.split('\\n').join('\\n' + indent);\n if (range.start.character === 0) {\n result = indent + result; // keep the indent\n }\n }\n return [{\n range: range,\n newText: result\n }];\n}\nfunction trimLeft(str) {\n return str.replace(/^\\s+/, '');\n}\nconst _CUL = '{'.charCodeAt(0);\nconst _CUR = '}'.charCodeAt(0);\nfunction isInRule(str, offset) {\n while (offset >= 0) {\n const ch = str.charCodeAt(offset);\n if (ch === _CUL) {\n return true;\n }\n else if (ch === _CUR) {\n return false;\n }\n offset--;\n }\n return false;\n}\nfunction getFormatOption(options, key, dflt) {\n if (options && options.hasOwnProperty(key)) {\n const value = options[key];\n if (value !== null) {\n return value;\n }\n }\n return dflt;\n}\nfunction computeIndentLevel(content, offset, options) {\n let i = offset;\n let nChars = 0;\n const tabSize = options.tabSize || 4;\n while (i < content.length) {\n const ch = content.charAt(i);\n if (ch === ' ') {\n nChars++;\n }\n else if (ch === '\\t') {\n nChars += tabSize;\n }\n else {\n break;\n }\n i++;\n }\n return Math.floor(nChars / tabSize);\n}\nfunction isEOL(text, offset) {\n return '\\r\\n'.indexOf(text.charAt(offset)) !== -1;\n}\nfunction isWhitespace(text, offset) {\n return ' \\t'.indexOf(text.charAt(offset)) !== -1;\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n// file generated from @vscode/web-custom-data NPM package\nexport const cssData = {\n \"version\": 1.1,\n \"properties\": [\n {\n \"name\": \"additive-symbols\",\n \"browsers\": [\n \"FF33\"\n ],\n \"syntax\": \"[ <integer> && <symbol> ]#\",\n \"relevance\": 50,\n \"description\": \"@counter-style descriptor. Specifies the symbols used by the marker-construction algorithm specified by the system descriptor. Needs to be specified if the counter system is 'additive'.\",\n \"restrictions\": [\n \"integer\",\n \"string\",\n \"image\",\n \"identifier\"\n ]\n },\n {\n \"name\": \"align-content\",\n \"browsers\": [\n \"E12\",\n \"FF28\",\n \"S9\",\n \"C29\",\n \"IE11\",\n \"O16\"\n ],\n \"values\": [\n {\n \"name\": \"center\",\n \"description\": \"Lines are packed toward the center of the flex container.\"\n },\n {\n \"name\": \"flex-end\",\n \"description\": \"Lines are packed toward the end of the flex container.\"\n },\n {\n \"name\": \"flex-start\",\n \"description\": \"Lines are packed toward the start of the flex container.\"\n },\n {\n \"name\": \"space-around\",\n \"description\": \"Lines are evenly distributed in the flex container, with half-size spaces on either end.\"\n },\n {\n \"name\": \"space-between\",\n \"description\": \"Lines are evenly distributed in the flex container.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"Lines stretch to take up the remaining space.\"\n }\n ],\n \"syntax\": \"normal | <baseline-position> | <content-distribution> | <overflow-position>? <content-position>\",\n \"relevance\": 64,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/align-content\"\n }\n ],\n \"description\": \"Aligns a flex container's lines within the flex container when there is extra space in the cross-axis, similar to how 'justify-content' aligns individual items within the main-axis.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"align-items\",\n \"browsers\": [\n \"E12\",\n \"FF20\",\n \"S9\",\n \"C29\",\n \"IE11\",\n \"O16\"\n ],\n \"values\": [\n {\n \"name\": \"baseline\",\n \"description\": \"If the flex item's inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment.\"\n },\n {\n \"name\": \"center\",\n \"description\": \"The flex item's margin box is centered in the cross axis within the line.\"\n },\n {\n \"name\": \"flex-end\",\n \"description\": \"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line.\"\n },\n {\n \"name\": \"flex-start\",\n \"description\": \"The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched.\"\n }\n ],\n \"syntax\": \"normal | stretch | <baseline-position> | [ <overflow-position>? <self-position> ]\",\n \"relevance\": 86,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/align-items\"\n }\n ],\n \"description\": \"Aligns flex items along the cross axis of the current line of the flex container.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"justify-items\",\n \"browsers\": [\n \"E12\",\n \"FF20\",\n \"S9\",\n \"C52\",\n \"IE11\",\n \"O12.1\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"normal\"\n },\n {\n \"name\": \"end\"\n },\n {\n \"name\": \"start\"\n },\n {\n \"name\": \"flex-end\",\n \"description\": \"\\\"Flex items are packed toward the end of the line.\\\"\"\n },\n {\n \"name\": \"flex-start\",\n \"description\": \"\\\"Flex items are packed toward the start of the line.\\\"\"\n },\n {\n \"name\": \"self-end\",\n \"description\": \"The item is packed flush to the edge of the alignment container of the end side of the item, in the appropriate axis.\"\n },\n {\n \"name\": \"self-start\",\n \"description\": \"The item is packed flush to the edge of the alignment container of the start side of the item, in the appropriate axis..\"\n },\n {\n \"name\": \"center\",\n \"description\": \"The items are packed flush to each other toward the center of the of the alignment container.\"\n },\n {\n \"name\": \"left\"\n },\n {\n \"name\": \"right\"\n },\n {\n \"name\": \"baseline\"\n },\n {\n \"name\": \"first baseline\"\n },\n {\n \"name\": \"last baseline\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched.\"\n },\n {\n \"name\": \"save\"\n },\n {\n \"name\": \"unsave\"\n },\n {\n \"name\": \"legacy\"\n }\n ],\n \"syntax\": \"normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ] | legacy | legacy && [ left | right | center ]\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/justify-items\"\n }\n ],\n \"description\": \"Defines the default justify-self for all items of the box, giving them the default way of justifying each box along the appropriate axis\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"justify-self\",\n \"browsers\": [\n \"E16\",\n \"FF45\",\n \"S10.1\",\n \"C57\",\n \"IE10\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"normal\"\n },\n {\n \"name\": \"end\"\n },\n {\n \"name\": \"start\"\n },\n {\n \"name\": \"flex-end\",\n \"description\": \"\\\"Flex items are packed toward the end of the line.\\\"\"\n },\n {\n \"name\": \"flex-start\",\n \"description\": \"\\\"Flex items are packed toward the start of the line.\\\"\"\n },\n {\n \"name\": \"self-end\",\n \"description\": \"The item is packed flush to the edge of the alignment container of the end side of the item, in the appropriate axis.\"\n },\n {\n \"name\": \"self-start\",\n \"description\": \"The item is packed flush to the edge of the alignment container of the start side of the item, in the appropriate axis..\"\n },\n {\n \"name\": \"center\",\n \"description\": \"The items are packed flush to each other toward the center of the of the alignment container.\"\n },\n {\n \"name\": \"left\"\n },\n {\n \"name\": \"right\"\n },\n {\n \"name\": \"baseline\"\n },\n {\n \"name\": \"first baseline\"\n },\n {\n \"name\": \"last baseline\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched.\"\n },\n {\n \"name\": \"save\"\n },\n {\n \"name\": \"unsave\"\n }\n ],\n \"syntax\": \"auto | normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ]\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/justify-self\"\n }\n ],\n \"description\": \"Defines the way of justifying a box inside its container along the appropriate axis.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"align-self\",\n \"browsers\": [\n \"E12\",\n \"FF20\",\n \"S9\",\n \"C29\",\n \"IE10\",\n \"O12.1\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Computes to the value of 'align-items' on the element's parent, or 'stretch' if the element has no parent. On absolutely positioned elements, it computes to itself.\"\n },\n {\n \"name\": \"baseline\",\n \"description\": \"If the flex item's inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment.\"\n },\n {\n \"name\": \"center\",\n \"description\": \"The flex item's margin box is centered in the cross axis within the line.\"\n },\n {\n \"name\": \"flex-end\",\n \"description\": \"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line.\"\n },\n {\n \"name\": \"flex-start\",\n \"description\": \"The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched.\"\n }\n ],\n \"syntax\": \"auto | normal | stretch | <baseline-position> | <overflow-position>? <self-position>\",\n \"relevance\": 73,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/align-self\"\n }\n ],\n \"description\": \"Allows the default alignment along the cross axis to be overridden for individual flex items.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"all\",\n \"browsers\": [\n \"E79\",\n \"FF27\",\n \"S9.1\",\n \"C37\",\n \"O24\"\n ],\n \"values\": [],\n \"syntax\": \"initial | inherit | unset | revert | revert-layer\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/all\"\n }\n ],\n \"description\": \"Shorthand that resets all properties except 'direction' and 'unicode-bidi'.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"alt\",\n \"browsers\": [\n \"S9\"\n ],\n \"values\": [],\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/alt\"\n }\n ],\n \"description\": \"Provides alternative text for assistive technology to replace the generated content of a ::before or ::after element.\",\n \"restrictions\": [\n \"string\",\n \"enum\"\n ]\n },\n {\n \"name\": \"animation\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C43\",\n \"IE10\",\n \"O30\"\n ],\n \"values\": [\n {\n \"name\": \"alternate\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction.\"\n },\n {\n \"name\": \"alternate-reverse\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction.\"\n },\n {\n \"name\": \"backwards\",\n \"description\": \"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'.\"\n },\n {\n \"name\": \"both\",\n \"description\": \"Both forwards and backwards fill modes are applied.\"\n },\n {\n \"name\": \"forwards\",\n \"description\": \"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes.\"\n },\n {\n \"name\": \"infinite\",\n \"description\": \"Causes the animation to repeat forever.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No animation is performed\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Normal playback.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"All iterations of the animation are played in the reverse direction from the way they were specified.\"\n }\n ],\n \"syntax\": \"<single-animation>#\",\n \"relevance\": 83,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/animation\"\n }\n ],\n \"description\": \"Shorthand property combines six of the animation properties into a single property.\",\n \"restrictions\": [\n \"time\",\n \"timing-function\",\n \"enum\",\n \"identifier\",\n \"number\"\n ]\n },\n {\n \"name\": \"animation-delay\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C43\",\n \"IE10\",\n \"O30\"\n ],\n \"syntax\": \"<time>#\",\n \"relevance\": 65,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/animation-delay\"\n }\n ],\n \"description\": \"Defines when the animation will start.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"animation-direction\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C43\",\n \"IE10\",\n \"O30\"\n ],\n \"values\": [\n {\n \"name\": \"alternate\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction.\"\n },\n {\n \"name\": \"alternate-reverse\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Normal playback.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"All iterations of the animation are played in the reverse direction from the way they were specified.\"\n }\n ],\n \"syntax\": \"<single-animation-direction>#\",\n \"relevance\": 56,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/animation-direction\"\n }\n ],\n \"description\": \"Defines whether or not the animation should play in reverse on alternate cycles.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"animation-duration\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C43\",\n \"IE10\",\n \"O30\"\n ],\n \"syntax\": \"<time>#\",\n \"relevance\": 71,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/animation-duration\"\n }\n ],\n \"description\": \"Defines the length of time that an animation takes to complete one cycle.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"animation-fill-mode\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C43\",\n \"IE10\",\n \"O30\"\n ],\n \"values\": [\n {\n \"name\": \"backwards\",\n \"description\": \"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'.\"\n },\n {\n \"name\": \"both\",\n \"description\": \"Both forwards and backwards fill modes are applied.\"\n },\n {\n \"name\": \"forwards\",\n \"description\": \"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"There is no change to the property value between the time the animation is applied and the time the animation begins playing or after the animation completes.\"\n }\n ],\n \"syntax\": \"<single-animation-fill-mode>#\",\n \"relevance\": 65,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/animation-fill-mode\"\n }\n ],\n \"description\": \"Defines what values are applied by the animation outside the time it is executing.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"animation-iteration-count\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C43\",\n \"IE10\",\n \"O30\"\n ],\n \"values\": [\n {\n \"name\": \"infinite\",\n \"description\": \"Causes the animation to repeat forever.\"\n }\n ],\n \"syntax\": \"<single-animation-iteration-count>#\",\n \"relevance\": 63,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/animation-iteration-count\"\n }\n ],\n \"description\": \"Defines the number of times an animation cycle is played. The default value is one, meaning the animation will play from beginning to end once.\",\n \"restrictions\": [\n \"number\",\n \"enum\"\n ]\n },\n {\n \"name\": \"animation-name\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C43\",\n \"IE10\",\n \"O30\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No animation is performed\"\n }\n ],\n \"syntax\": \"[ none | <keyframes-name> ]#\",\n \"relevance\": 71,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/animation-name\"\n }\n ],\n \"description\": \"Defines a list of animations that apply. Each name is used to select the keyframe at-rule that provides the property values for the animation.\",\n \"restrictions\": [\n \"identifier\",\n \"enum\"\n ]\n },\n {\n \"name\": \"animation-play-state\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C43\",\n \"IE10\",\n \"O30\"\n ],\n \"values\": [\n {\n \"name\": \"paused\",\n \"description\": \"A running animation will be paused.\"\n },\n {\n \"name\": \"running\",\n \"description\": \"Resume playback of a paused animation.\"\n }\n ],\n \"syntax\": \"<single-animation-play-state>#\",\n \"relevance\": 54,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/animation-play-state\"\n }\n ],\n \"description\": \"Defines whether the animation is running or paused.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"animation-timing-function\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C43\",\n \"IE10\",\n \"O30\"\n ],\n \"syntax\": \"<easing-function>#\",\n \"relevance\": 72,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/animation-timing-function\"\n }\n ],\n \"description\": \"Describes how the animation will progress over one cycle of its duration.\",\n \"restrictions\": [\n \"timing-function\"\n ]\n },\n {\n \"name\": \"backface-visibility\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S15.4\",\n \"C36\",\n \"IE10\",\n \"O23\"\n ],\n \"values\": [\n {\n \"name\": \"hidden\",\n \"description\": \"Back side is hidden.\"\n },\n {\n \"name\": \"visible\",\n \"description\": \"Back side is visible.\"\n }\n ],\n \"syntax\": \"visible | hidden\",\n \"relevance\": 59,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/backface-visibility\"\n }\n ],\n \"description\": \"Determines whether or not the 'back' side of a transformed element is visible when facing the viewer. With an identity transform, the front side of an element faces the viewer.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"background\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"values\": [\n {\n \"name\": \"fixed\",\n \"description\": \"The background is fixed with regard to the viewport. In paged media where there is no viewport, a 'fixed' background is fixed with respect to the page box and therefore replicated on every page.\"\n },\n {\n \"name\": \"local\",\n \"description\": \"The background is fixed with regard to the element's contents: if the element has a scrolling mechanism, the background scrolls with the element's contents.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"A value of 'none' counts as an image layer but draws nothing.\"\n },\n {\n \"name\": \"scroll\",\n \"description\": \"The background is fixed with regard to the element itself and does not scroll with its contents. (It is effectively attached to the element's border.)\"\n }\n ],\n \"syntax\": \"[ <bg-layer> , ]* <final-bg-layer>\",\n \"relevance\": 93,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background\"\n }\n ],\n \"description\": \"Shorthand property for setting most background properties at the same place in the style sheet.\",\n \"restrictions\": [\n \"enum\",\n \"image\",\n \"color\",\n \"position\",\n \"length\",\n \"repeat\",\n \"percentage\",\n \"box\"\n ]\n },\n {\n \"name\": \"background-attachment\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"values\": [\n {\n \"name\": \"fixed\",\n \"description\": \"The background is fixed with regard to the viewport. In paged media where there is no viewport, a 'fixed' background is fixed with respect to the page box and therefore replicated on every page.\"\n },\n {\n \"name\": \"local\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"description\": \"The background is fixed with regard to the element's contents: if the element has a scrolling mechanism, the background scrolls with the element's contents.\"\n },\n {\n \"name\": \"scroll\",\n \"description\": \"The background is fixed with regard to the element itself and does not scroll with its contents. (It is effectively attached to the element's border.)\"\n }\n ],\n \"syntax\": \"<attachment>#\",\n \"relevance\": 54,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-attachment\"\n }\n ],\n \"description\": \"Specifies whether the background images are fixed with regard to the viewport ('fixed') or scroll along with the element ('scroll') or its contents ('local').\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"background-blend-mode\",\n \"browsers\": [\n \"E79\",\n \"FF30\",\n \"S8\",\n \"C35\",\n \"O22\"\n ],\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"Default attribute which specifies no blending\"\n },\n {\n \"name\": \"multiply\",\n \"description\": \"The source color is multiplied by the destination color and replaces the destination.\"\n },\n {\n \"name\": \"screen\",\n \"description\": \"Multiplies the complements of the backdrop and source color values, then complements the result.\"\n },\n {\n \"name\": \"overlay\",\n \"description\": \"Multiplies or screens the colors, depending on the backdrop color value.\"\n },\n {\n \"name\": \"darken\",\n \"description\": \"Selects the darker of the backdrop and source colors.\"\n },\n {\n \"name\": \"lighten\",\n \"description\": \"Selects the lighter of the backdrop and source colors.\"\n },\n {\n \"name\": \"color-dodge\",\n \"description\": \"Brightens the backdrop color to reflect the source color.\"\n },\n {\n \"name\": \"color-burn\",\n \"description\": \"Darkens the backdrop color to reflect the source color.\"\n },\n {\n \"name\": \"hard-light\",\n \"description\": \"Multiplies or screens the colors, depending on the source color value.\"\n },\n {\n \"name\": \"soft-light\",\n \"description\": \"Darkens or lightens the colors, depending on the source color value.\"\n },\n {\n \"name\": \"difference\",\n \"description\": \"Subtracts the darker of the two constituent colors from the lighter color..\"\n },\n {\n \"name\": \"exclusion\",\n \"description\": \"Produces an effect similar to that of the Difference mode but lower in contrast.\"\n },\n {\n \"name\": \"hue\",\n \"browsers\": [\n \"E79\",\n \"FF30\",\n \"S8\",\n \"C35\",\n \"O22\"\n ],\n \"description\": \"Creates a color with the hue of the source color and the saturation and luminosity of the backdrop color.\"\n },\n {\n \"name\": \"saturation\",\n \"browsers\": [\n \"E79\",\n \"FF30\",\n \"S8\",\n \"C35\",\n \"O22\"\n ],\n \"description\": \"Creates a color with the saturation of the source color and the hue and luminosity of the backdrop color.\"\n },\n {\n \"name\": \"color\",\n \"browsers\": [\n \"E79\",\n \"FF30\",\n \"S8\",\n \"C35\",\n \"O22\"\n ],\n \"description\": \"Creates a color with the hue and saturation of the source color and the luminosity of the backdrop color.\"\n },\n {\n \"name\": \"luminosity\",\n \"browsers\": [\n \"E79\",\n \"FF30\",\n \"S8\",\n \"C35\",\n \"O22\"\n ],\n \"description\": \"Creates a color with the luminosity of the source color and the hue and saturation of the backdrop color.\"\n }\n ],\n \"syntax\": \"<blend-mode>#\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-blend-mode\"\n }\n ],\n \"description\": \"Defines the blending mode of each background layer.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"background-clip\",\n \"browsers\": [\n \"E12\",\n \"FF4\",\n \"S14\",\n \"C1\",\n \"IE9\",\n \"O10.5\"\n ],\n \"syntax\": \"<box>#\",\n \"relevance\": 66,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-clip\"\n }\n ],\n \"description\": \"Determines the background painting area.\",\n \"restrictions\": [\n \"box\"\n ]\n },\n {\n \"name\": \"background-color\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"syntax\": \"<color>\",\n \"relevance\": 94,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-color\"\n }\n ],\n \"description\": \"Sets the background color of an element.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"background-image\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Counts as an image layer but draws nothing.\"\n }\n ],\n \"syntax\": \"<bg-image>#\",\n \"relevance\": 88,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-image\"\n }\n ],\n \"description\": \"Sets the background image(s) of an element.\",\n \"restrictions\": [\n \"image\",\n \"enum\"\n ]\n },\n {\n \"name\": \"background-origin\",\n \"browsers\": [\n \"E12\",\n \"FF4\",\n \"S3\",\n \"C1\",\n \"IE9\",\n \"O10.5\"\n ],\n \"syntax\": \"<box>#\",\n \"relevance\": 54,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-origin\"\n }\n ],\n \"description\": \"For elements rendered as a single box, specifies the background positioning area. For elements rendered as multiple boxes (e.g., inline boxes on several lines, boxes on several pages) specifies which boxes 'box-decoration-break' operates on to determine the background positioning area(s).\",\n \"restrictions\": [\n \"box\"\n ]\n },\n {\n \"name\": \"background-position\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"syntax\": \"<bg-position>#\",\n \"relevance\": 88,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-position\"\n }\n ],\n \"description\": \"Specifies the initial position of the background image(s) (after any resizing) within their corresponding background positioning area.\",\n \"restrictions\": [\n \"position\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"background-position-x\",\n \"browsers\": [\n \"E12\",\n \"FF49\",\n \"S1\",\n \"C1\",\n \"IE6\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"center\",\n \"description\": \"Equivalent to '50%' ('left 50%') for the horizontal position if the horizontal position is not otherwise specified, or '50%' ('top 50%') for the vertical position if it is.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"Equivalent to '0%' for the horizontal position if one or two values are given, otherwise specifies the left edge as the origin for the next offset.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"Equivalent to '100%' for the horizontal position if one or two values are given, otherwise specifies the right edge as the origin for the next offset.\"\n }\n ],\n \"syntax\": \"[ center | [ [ left | right | x-start | x-end ]? <length-percentage>? ]! ]#\",\n \"relevance\": 55,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-position-x\"\n }\n ],\n \"description\": \"If background images have been specified, this property specifies their initial position (after any resizing) within their corresponding background positioning area.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"background-position-y\",\n \"browsers\": [\n \"E12\",\n \"FF49\",\n \"S1\",\n \"C1\",\n \"IE6\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"bottom\",\n \"description\": \"Equivalent to '100%' for the vertical position if one or two values are given, otherwise specifies the bottom edge as the origin for the next offset.\"\n },\n {\n \"name\": \"center\",\n \"description\": \"Equivalent to '50%' ('left 50%') for the horizontal position if the horizontal position is not otherwise specified, or '50%' ('top 50%') for the vertical position if it is.\"\n },\n {\n \"name\": \"top\",\n \"description\": \"Equivalent to '0%' for the vertical position if one or two values are given, otherwise specifies the top edge as the origin for the next offset.\"\n }\n ],\n \"syntax\": \"[ center | [ [ top | bottom | y-start | y-end ]? <length-percentage>? ]! ]#\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-position-y\"\n }\n ],\n \"description\": \"If background images have been specified, this property specifies their initial position (after any resizing) within their corresponding background positioning area.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"background-repeat\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"values\": [],\n \"syntax\": \"<repeat-style>#\",\n \"relevance\": 86,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-repeat\"\n }\n ],\n \"description\": \"Specifies how background images are tiled after they have been sized and positioned.\",\n \"restrictions\": [\n \"repeat\"\n ]\n },\n {\n \"name\": \"background-size\",\n \"browsers\": [\n \"E12\",\n \"FF4\",\n \"S5\",\n \"C3\",\n \"IE9\",\n \"O10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Resolved by using the image's intrinsic ratio and the size of the other dimension, or failing that, using the image's intrinsic size, or failing that, treating it as 100%.\"\n },\n {\n \"name\": \"contain\",\n \"description\": \"Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest size such that both its width and its height can fit inside the background positioning area.\"\n },\n {\n \"name\": \"cover\",\n \"description\": \"Scale the image, while preserving its intrinsic aspect ratio (if any), to the smallest size such that both its width and its height can completely cover the background positioning area.\"\n }\n ],\n \"syntax\": \"<bg-size>#\",\n \"relevance\": 86,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-size\"\n }\n ],\n \"description\": \"Specifies the size of the background images.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"behavior\",\n \"browsers\": [\n \"IE6\"\n ],\n \"relevance\": 50,\n \"description\": \"IE only. Used to extend behaviors of the browser.\",\n \"restrictions\": [\n \"url\"\n ]\n },\n {\n \"name\": \"block-size\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Depends on the values of other properties.\"\n }\n ],\n \"syntax\": \"<'width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/block-size\"\n }\n ],\n \"description\": \"Size of an element in the direction opposite that of the direction specified by 'writing-mode'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"border\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"syntax\": \"<line-width> || <line-style> || <color>\",\n \"relevance\": 95,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border\"\n }\n ],\n \"description\": \"Shorthand property for setting border width, style, and color.\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"border-block-end\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-width'> || <'border-top-style'> || <color>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-end\"\n }\n ],\n \"description\": \"Logical 'border-bottom'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"border-block-start\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-width'> || <'border-top-style'> || <color>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-start\"\n }\n ],\n \"description\": \"Logical 'border-top'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"border-block-end-color\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-color'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-end-color\"\n }\n ],\n \"description\": \"Logical 'border-bottom-color'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"border-block-start-color\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-color'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-start-color\"\n }\n ],\n \"description\": \"Logical 'border-top-color'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"border-block-end-style\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-style'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-end-style\"\n }\n ],\n \"description\": \"Logical 'border-bottom-style'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"border-block-start-style\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-style'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-start-style\"\n }\n ],\n \"description\": \"Logical 'border-top-style'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"border-block-end-width\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-end-width\"\n }\n ],\n \"description\": \"Logical 'border-bottom-width'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"border-block-start-width\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-start-width\"\n }\n ],\n \"description\": \"Logical 'border-top-width'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"border-bottom\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"syntax\": \"<line-width> || <line-style> || <color>\",\n \"relevance\": 88,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-bottom\"\n }\n ],\n \"description\": \"Shorthand property for setting border width, style and color.\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"border-bottom-color\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"syntax\": \"<'border-top-color'>\",\n \"relevance\": 71,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-bottom-color\"\n }\n ],\n \"description\": \"Sets the color of the bottom border.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"border-bottom-left-radius\",\n \"browsers\": [\n \"E12\",\n \"FF4\",\n \"S5\",\n \"C4\",\n \"IE9\",\n \"O10.5\"\n ],\n \"syntax\": \"<length-percentage>{1,2}\",\n \"relevance\": 75,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-bottom-left-radius\"\n }\n ],\n \"description\": \"Defines the radii of the bottom left outer border edge.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"border-bottom-right-radius\",\n \"browsers\": [\n \"E12\",\n \"FF4\",\n \"S5\",\n \"C4\",\n \"IE9\",\n \"O10.5\"\n ],\n \"syntax\": \"<length-percentage>{1,2}\",\n \"relevance\": 75,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-bottom-right-radius\"\n }\n ],\n \"description\": \"Defines the radii of the bottom right outer border edge.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"border-bottom-style\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE5.5\",\n \"O9.2\"\n ],\n \"syntax\": \"<line-style>\",\n \"relevance\": 59,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-bottom-style\"\n }\n ],\n \"description\": \"Sets the style of the bottom border.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"border-bottom-width\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"syntax\": \"<line-width>\",\n \"relevance\": 64,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-bottom-width\"\n }\n ],\n \"description\": \"Sets the thickness of the bottom border.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"border-collapse\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.2\",\n \"C1\",\n \"IE5\",\n \"O4\"\n ],\n \"values\": [\n {\n \"name\": \"collapse\",\n \"description\": \"Selects the collapsing borders model.\"\n },\n {\n \"name\": \"separate\",\n \"description\": \"Selects the separated borders border model.\"\n }\n ],\n \"syntax\": \"collapse | separate\",\n \"relevance\": 74,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-collapse\"\n }\n ],\n \"description\": \"Selects a table's border model.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"border-color\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"values\": [],\n \"syntax\": \"<color>{1,4}\",\n \"relevance\": 87,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-color\"\n }\n ],\n \"description\": \"The color of the border around all four edges of an element.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"border-image\",\n \"browsers\": [\n \"E12\",\n \"FF15\",\n \"S6\",\n \"C16\",\n \"IE11\",\n \"O11\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"If 'auto' is specified then the border image width is the intrinsic width or height (whichever is applicable) of the corresponding image slice. If the image does not have the required intrinsic dimension then the corresponding border-width is used instead.\"\n },\n {\n \"name\": \"fill\",\n \"description\": \"Causes the middle part of the border-image to be preserved.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Use the border styles.\"\n },\n {\n \"name\": \"repeat\",\n \"description\": \"The image is tiled (repeated) to fill the area.\"\n },\n {\n \"name\": \"round\",\n \"description\": \"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the image is rescaled so that it does.\"\n },\n {\n \"name\": \"space\",\n \"description\": \"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the extra space is distributed around the tiles.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"The image is stretched to fill the area.\"\n },\n {\n \"name\": \"url()\"\n }\n ],\n \"syntax\": \"<'border-image-source'> || <'border-image-slice'> [ / <'border-image-width'> | / <'border-image-width'>? / <'border-image-outset'> ]? || <'border-image-repeat'>\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-image\"\n }\n ],\n \"description\": \"Shorthand property for setting 'border-image-source', 'border-image-slice', 'border-image-width', 'border-image-outset' and 'border-image-repeat'. Omitted values are set to their initial values.\",\n \"restrictions\": [\n \"length\",\n \"percentage\",\n \"number\",\n \"url\",\n \"enum\"\n ]\n },\n {\n \"name\": \"border-image-outset\",\n \"browsers\": [\n \"E12\",\n \"FF15\",\n \"S6\",\n \"C15\",\n \"IE11\",\n \"O15\"\n ],\n \"syntax\": \"[ <length> | <number> ]{1,4}\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-image-outset\"\n }\n ],\n \"description\": \"The values specify the amount by which the border image area extends beyond the border box on the top, right, bottom, and left sides respectively. If the fourth value is absent, it is the same as the second. If the third one is also absent, it is the same as the first. If the second one is also absent, it is the same as the first. Numbers represent multiples of the corresponding border-width.\",\n \"restrictions\": [\n \"length\",\n \"number\"\n ]\n },\n {\n \"name\": \"border-image-repeat\",\n \"browsers\": [\n \"E12\",\n \"FF15\",\n \"S6\",\n \"C15\",\n \"IE11\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"repeat\",\n \"description\": \"The image is tiled (repeated) to fill the area.\"\n },\n {\n \"name\": \"round\",\n \"description\": \"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the image is rescaled so that it does.\"\n },\n {\n \"name\": \"space\",\n \"description\": \"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the extra space is distributed around the tiles.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"The image is stretched to fill the area.\"\n }\n ],\n \"syntax\": \"[ stretch | repeat | round | space ]{1,2}\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-image-repeat\"\n }\n ],\n \"description\": \"Specifies how the images for the sides and the middle part of the border image are scaled and tiled. If the second keyword is absent, it is assumed to be the same as the first.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"border-image-slice\",\n \"browsers\": [\n \"E12\",\n \"FF15\",\n \"S6\",\n \"C15\",\n \"IE11\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"fill\",\n \"description\": \"Causes the middle part of the border-image to be preserved.\"\n }\n ],\n \"syntax\": \"<number-percentage>{1,4} && fill?\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-image-slice\"\n }\n ],\n \"description\": \"Specifies inward offsets from the top, right, bottom, and left edges of the image, dividing it into nine regions: four corners, four edges and a middle.\",\n \"restrictions\": [\n \"number\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"border-image-source\",\n \"browsers\": [\n \"E12\",\n \"FF15\",\n \"S6\",\n \"C15\",\n \"IE11\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Use the border styles.\"\n }\n ],\n \"syntax\": \"none | <image>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-image-source\"\n }\n ],\n \"description\": \"Specifies an image to use instead of the border styles given by the 'border-style' properties and as an additional background layer for the element. If the value is 'none' or if the image cannot be displayed, the border styles will be used.\",\n \"restrictions\": [\n \"image\"\n ]\n },\n {\n \"name\": \"border-image-width\",\n \"browsers\": [\n \"E12\",\n \"FF13\",\n \"S6\",\n \"C15\",\n \"IE11\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The border image width is the intrinsic width or height (whichever is applicable) of the corresponding image slice. If the image does not have the required intrinsic dimension then the corresponding border-width is used instead.\"\n }\n ],\n \"syntax\": \"[ <length-percentage> | <number> | auto ]{1,4}\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-image-width\"\n }\n ],\n \"description\": \"The four values of 'border-image-width' specify offsets that are used to divide the border image area into nine parts. They represent inward distances from the top, right, bottom, and left sides of the area, respectively.\",\n \"restrictions\": [\n \"length\",\n \"percentage\",\n \"number\"\n ]\n },\n {\n \"name\": \"border-inline-end\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-width'> || <'border-top-style'> || <color>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-end\"\n }\n ],\n \"description\": \"Logical 'border-right'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"border-inline-start\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-width'> || <'border-top-style'> || <color>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-start\"\n }\n ],\n \"description\": \"Logical 'border-left'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"border-inline-end-color\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-color'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-end-color\"\n }\n ],\n \"description\": \"Logical 'border-right-color'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"border-inline-start-color\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-color'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-start-color\"\n }\n ],\n \"description\": \"Logical 'border-left-color'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"border-inline-end-style\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-style'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-end-style\"\n }\n ],\n \"description\": \"Logical 'border-right-style'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"border-inline-start-style\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-style'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-start-style\"\n }\n ],\n \"description\": \"Logical 'border-left-style'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"border-inline-end-width\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-end-width\"\n }\n ],\n \"description\": \"Logical 'border-right-width'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"border-inline-start-width\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-start-width\"\n }\n ],\n \"description\": \"Logical 'border-left-width'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"border-left\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"syntax\": \"<line-width> || <line-style> || <color>\",\n \"relevance\": 82,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-left\"\n }\n ],\n \"description\": \"Shorthand property for setting border width, style and color\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"border-left-color\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"syntax\": \"<color>\",\n \"relevance\": 67,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-left-color\"\n }\n ],\n \"description\": \"Sets the color of the left border.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"border-left-style\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE5.5\",\n \"O9.2\"\n ],\n \"syntax\": \"<line-style>\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-left-style\"\n }\n ],\n \"description\": \"Sets the style of the left border.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"border-left-width\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"syntax\": \"<line-width>\",\n \"relevance\": 59,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-left-width\"\n }\n ],\n \"description\": \"Sets the thickness of the left border.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"border-radius\",\n \"browsers\": [\n \"E12\",\n \"FF4\",\n \"S5\",\n \"C4\",\n \"IE9\",\n \"O10.5\"\n ],\n \"syntax\": \"<length-percentage>{1,4} [ / <length-percentage>{1,4} ]?\",\n \"relevance\": 92,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-radius\"\n }\n ],\n \"description\": \"Defines the radii of the outer border edge.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"border-right\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE5.5\",\n \"O9.2\"\n ],\n \"syntax\": \"<line-width> || <line-style> || <color>\",\n \"relevance\": 81,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-right\"\n }\n ],\n \"description\": \"Shorthand property for setting border width, style and color\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"border-right-color\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"syntax\": \"<color>\",\n \"relevance\": 66,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-right-color\"\n }\n ],\n \"description\": \"Sets the color of the right border.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"border-right-style\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE5.5\",\n \"O9.2\"\n ],\n \"syntax\": \"<line-style>\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-right-style\"\n }\n ],\n \"description\": \"Sets the style of the right border.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"border-right-width\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"syntax\": \"<line-width>\",\n \"relevance\": 59,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-right-width\"\n }\n ],\n \"description\": \"Sets the thickness of the right border.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"border-spacing\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE8\",\n \"O4\"\n ],\n \"syntax\": \"<length> <length>?\",\n \"relevance\": 68,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-spacing\"\n }\n ],\n \"description\": \"The lengths specify the distance that separates adjoining cell borders. If one length is specified, it gives both the horizontal and vertical spacing. If two are specified, the first gives the horizontal spacing and the second the vertical spacing. Lengths may not be negative.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"border-style\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"values\": [],\n \"syntax\": \"<line-style>{1,4}\",\n \"relevance\": 80,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-style\"\n }\n ],\n \"description\": \"The style of the border around edges of an element.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"border-top\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"syntax\": \"<line-width> || <line-style> || <color>\",\n \"relevance\": 87,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-top\"\n }\n ],\n \"description\": \"Shorthand property for setting border width, style and color\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"border-top-color\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"syntax\": \"<color>\",\n \"relevance\": 71,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-top-color\"\n }\n ],\n \"description\": \"Sets the color of the top border.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"border-top-left-radius\",\n \"browsers\": [\n \"E12\",\n \"FF4\",\n \"S5\",\n \"C4\",\n \"IE9\",\n \"O10.5\"\n ],\n \"syntax\": \"<length-percentage>{1,2}\",\n \"relevance\": 76,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-top-left-radius\"\n }\n ],\n \"description\": \"Defines the radii of the top left outer border edge.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"border-top-right-radius\",\n \"browsers\": [\n \"E12\",\n \"FF4\",\n \"S5\",\n \"C4\",\n \"IE9\",\n \"O10.5\"\n ],\n \"syntax\": \"<length-percentage>{1,2}\",\n \"relevance\": 76,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-top-right-radius\"\n }\n ],\n \"description\": \"Defines the radii of the top right outer border edge.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"border-top-style\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE5.5\",\n \"O9.2\"\n ],\n \"syntax\": \"<line-style>\",\n \"relevance\": 58,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-top-style\"\n }\n ],\n \"description\": \"Sets the style of the top border.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"border-top-width\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"syntax\": \"<line-width>\",\n \"relevance\": 62,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-top-width\"\n }\n ],\n \"description\": \"Sets the thickness of the top border.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"border-width\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"values\": [],\n \"syntax\": \"<line-width>{1,4}\",\n \"relevance\": 81,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-width\"\n }\n ],\n \"description\": \"Shorthand that sets the four 'border-*-width' properties. If it has four values, they set top, right, bottom and left in that order. If left is missing, it is the same as right; if bottom is missing, it is the same as top; if right is missing, it is the same as top.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"bottom\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE5\",\n \"O6\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well\"\n }\n ],\n \"syntax\": \"<length> | <percentage> | auto\",\n \"relevance\": 90,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/bottom\"\n }\n ],\n \"description\": \"Specifies how far an absolutely positioned box's bottom margin edge is offset above the bottom edge of the box's 'containing block'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"box-decoration-break\",\n \"browsers\": [\n \"E79\",\n \"FF32\",\n \"S7\",\n \"C22\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"clone\",\n \"description\": \"Each box is independently wrapped with the border and padding.\"\n },\n {\n \"name\": \"slice\",\n \"description\": \"The effect is as though the element were rendered with no breaks present, and then sliced by the breaks afterward.\"\n }\n ],\n \"syntax\": \"slice | clone\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-decoration-break\"\n }\n ],\n \"description\": \"Specifies whether individual boxes are treated as broken pieces of one continuous box, or whether each box is individually wrapped with the border and padding.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"box-shadow\",\n \"browsers\": [\n \"E12\",\n \"FF4\",\n \"S5.1\",\n \"C10\",\n \"IE9\",\n \"O10.5\"\n ],\n \"values\": [\n {\n \"name\": \"inset\",\n \"description\": \"Changes the drop shadow from an outer shadow (one that shadows the box onto the canvas, as if it were lifted above the canvas) to an inner shadow (one that shadows the canvas onto the box, as if the box were cut out of the canvas and shifted behind it).\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No shadow.\"\n }\n ],\n \"syntax\": \"none | <shadow>#\",\n \"relevance\": 90,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-shadow\"\n }\n ],\n \"description\": \"Attaches one or more drop-shadows to the box. The property is a comma-separated list of shadows, each specified by 2-4 length values, an optional color, and an optional 'inset' keyword. Omitted lengths are 0; omitted colors are a user agent chosen color.\",\n \"restrictions\": [\n \"length\",\n \"color\",\n \"enum\"\n ]\n },\n {\n \"name\": \"box-sizing\",\n \"browsers\": [\n \"E12\",\n \"FF29\",\n \"S5.1\",\n \"C10\",\n \"IE8\",\n \"O7\"\n ],\n \"values\": [\n {\n \"name\": \"border-box\",\n \"description\": \"The specified width and height (and respective min/max properties) on this element determine the border box of the element.\"\n },\n {\n \"name\": \"content-box\",\n \"description\": \"Behavior of width and height as specified by CSS2.1. The specified width and height (and respective min/max properties) apply to the width and height respectively of the content box of the element.\"\n }\n ],\n \"syntax\": \"content-box | border-box\",\n \"relevance\": 92,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-sizing\"\n }\n ],\n \"description\": \"Specifies the behavior of the 'width' and 'height' properties.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"break-after\",\n \"browsers\": [\n \"E12\",\n \"FF65\",\n \"S10\",\n \"C50\",\n \"IE10\",\n \"O37\"\n ],\n \"values\": [\n {\n \"name\": \"always\",\n \"description\": \"Always force a page break before/after the generated box.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page/column break before/after the principal box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a break before/after the principal box.\"\n },\n {\n \"name\": \"avoid-column\",\n \"description\": \"Avoid a column break before/after the principal box.\"\n },\n {\n \"name\": \"avoid-page\",\n \"description\": \"Avoid a page break before/after the principal box.\"\n },\n {\n \"name\": \"column\",\n \"description\": \"Always force a column break before/after the principal box.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a left page.\"\n },\n {\n \"name\": \"page\",\n \"description\": \"Always force a page break before/after the principal box.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a right page.\"\n }\n ],\n \"syntax\": \"auto | avoid | always | all | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/break-after\"\n }\n ],\n \"description\": \"Describes the page/column/region break behavior after the generated box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"break-before\",\n \"browsers\": [\n \"E12\",\n \"FF65\",\n \"S10\",\n \"C50\",\n \"IE10\",\n \"O37\"\n ],\n \"values\": [\n {\n \"name\": \"always\",\n \"description\": \"Always force a page break before/after the generated box.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page/column break before/after the principal box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a break before/after the principal box.\"\n },\n {\n \"name\": \"avoid-column\",\n \"description\": \"Avoid a column break before/after the principal box.\"\n },\n {\n \"name\": \"avoid-page\",\n \"description\": \"Avoid a page break before/after the principal box.\"\n },\n {\n \"name\": \"column\",\n \"description\": \"Always force a column break before/after the principal box.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a left page.\"\n },\n {\n \"name\": \"page\",\n \"description\": \"Always force a page break before/after the principal box.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a right page.\"\n }\n ],\n \"syntax\": \"auto | avoid | always | all | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/break-before\"\n }\n ],\n \"description\": \"Describes the page/column/region break behavior before the generated box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"break-inside\",\n \"browsers\": [\n \"E12\",\n \"FF65\",\n \"S10\",\n \"C50\",\n \"IE10\",\n \"O37\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Impose no additional breaking constraints within the box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid breaks within the box.\"\n },\n {\n \"name\": \"avoid-column\",\n \"description\": \"Avoid a column break within the box.\"\n },\n {\n \"name\": \"avoid-page\",\n \"description\": \"Avoid a page break within the box.\"\n }\n ],\n \"syntax\": \"auto | avoid | avoid-page | avoid-column | avoid-region\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/break-inside\"\n }\n ],\n \"description\": \"Describes the page/column/region break behavior inside the principal box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"caption-side\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE8\",\n \"O4\"\n ],\n \"values\": [\n {\n \"name\": \"bottom\",\n \"description\": \"Positions the caption box below the table box.\"\n },\n {\n \"name\": \"top\",\n \"description\": \"Positions the caption box above the table box.\"\n }\n ],\n \"syntax\": \"top | bottom | block-start | block-end | inline-start | inline-end\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/caption-side\"\n }\n ],\n \"description\": \"Specifies the position of the caption box with respect to the table box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"caret-color\",\n \"browsers\": [\n \"E79\",\n \"FF53\",\n \"S11.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The user agent selects an appropriate color for the caret. This is generally currentcolor, but the user agent may choose a different color to ensure good visibility and contrast with the surrounding content, taking into account the value of currentcolor, the background, shadows, and other factors.\"\n }\n ],\n \"syntax\": \"auto | <color>\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/caret-color\"\n }\n ],\n \"description\": \"Controls the color of the text insertion indicator.\",\n \"restrictions\": [\n \"color\",\n \"enum\"\n ]\n },\n {\n \"name\": \"clear\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"values\": [\n {\n \"name\": \"both\",\n \"description\": \"The clearance of the generated box is set to the amount necessary to place the top border edge below the bottom outer edge of any right-floating and left-floating boxes that resulted from elements earlier in the source document.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"The clearance of the generated box is set to the amount necessary to place the top border edge below the bottom outer edge of any left-floating boxes that resulted from elements earlier in the source document.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No constraint on the box's position with respect to floats.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"The clearance of the generated box is set to the amount necessary to place the top border edge below the bottom outer edge of any right-floating boxes that resulted from elements earlier in the source document.\"\n }\n ],\n \"syntax\": \"none | left | right | both | inline-start | inline-end\",\n \"relevance\": 85,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/clear\"\n }\n ],\n \"description\": \"Indicates which sides of an element's box(es) may not be adjacent to an earlier floating box. The 'clear' property does not consider floats inside the element itself or in other block formatting contexts.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"clip\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The element does not clip.\"\n },\n {\n \"name\": \"rect()\",\n \"description\": \"Specifies offsets from the edges of the border box.\"\n }\n ],\n \"syntax\": \"<shape> | auto\",\n \"relevance\": 74,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/clip\"\n }\n ],\n \"description\": \"Deprecated. Use the 'clip-path' property when support allows. Defines the visible portion of an element's box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"clip-path\",\n \"browsers\": [\n \"E79\",\n \"FF3.5\",\n \"S9.1\",\n \"C55\",\n \"IE10\",\n \"O42\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No clipping path gets created.\"\n },\n {\n \"name\": \"url()\",\n \"description\": \"References a <clipPath> element to create a clipping path.\"\n }\n ],\n \"syntax\": \"<clip-source> | [ <basic-shape> || <geometry-box> ] | none\",\n \"relevance\": 61,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/clip-path\"\n }\n ],\n \"description\": \"Specifies a clipping path where everything inside the path is visible and everything outside is clipped out.\",\n \"restrictions\": [\n \"url\",\n \"shape\",\n \"geometry-box\",\n \"enum\"\n ]\n },\n {\n \"name\": \"clip-rule\",\n \"browsers\": [\n \"E\",\n \"C5\",\n \"FF3\",\n \"IE10\",\n \"O9\",\n \"S6\"\n ],\n \"values\": [\n {\n \"name\": \"evenodd\",\n \"description\": \"Determines the 'insideness' of a point on the canvas by drawing a ray from that point to infinity in any direction and counting the number of path segments from the given shape that the ray crosses.\"\n },\n {\n \"name\": \"nonzero\",\n \"description\": \"Determines the 'insideness' of a point on the canvas by drawing a ray from that point to infinity in any direction and then examining the places where a segment of the shape crosses the ray.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Indicates the algorithm which is to be used to determine what parts of the canvas are included inside the shape.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"color\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE3\",\n \"O3.5\"\n ],\n \"syntax\": \"<color>\",\n \"relevance\": 95,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/color\"\n }\n ],\n \"description\": \"Sets the color of an element's text\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"color-interpolation-filters\",\n \"browsers\": [\n \"E\",\n \"C5\",\n \"FF3\",\n \"IE10\",\n \"O9\",\n \"S6\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Color operations are not required to occur in a particular color space.\"\n },\n {\n \"name\": \"linearRGB\",\n \"description\": \"Color operations should occur in the linearized RGB color space.\"\n },\n {\n \"name\": \"sRGB\",\n \"description\": \"Color operations should occur in the sRGB color space.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the color space for imaging operations performed via filter effects.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"column-count\",\n \"browsers\": [\n \"E12\",\n \"FF52\",\n \"S9\",\n \"C50\",\n \"IE10\",\n \"O11.1\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Determines the number of columns by the 'column-width' property and the element width.\"\n }\n ],\n \"syntax\": \"<integer> | auto\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/column-count\"\n }\n ],\n \"description\": \"Describes the optimal number of columns into which the content of the element will be flowed.\",\n \"restrictions\": [\n \"integer\",\n \"enum\"\n ]\n },\n {\n \"name\": \"column-fill\",\n \"browsers\": [\n \"E12\",\n \"FF52\",\n \"S9\",\n \"C50\",\n \"IE10\",\n \"O37\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Fills columns sequentially.\"\n },\n {\n \"name\": \"balance\",\n \"description\": \"Balance content equally between columns, if possible.\"\n }\n ],\n \"syntax\": \"auto | balance | balance-all\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/column-fill\"\n }\n ],\n \"description\": \"In continuous media, this property will only be consulted if the length of columns has been constrained. Otherwise, columns will automatically be balanced.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"column-gap\",\n \"browsers\": [\n \"E12\",\n \"FF1.5\",\n \"S3\",\n \"C1\",\n \"IE10\",\n \"O11.1\"\n ],\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"User agent specific and typically equivalent to 1em.\"\n }\n ],\n \"syntax\": \"normal | <length-percentage>\",\n \"relevance\": 56,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/column-gap\"\n }\n ],\n \"description\": \"Sets the gap between columns. If there is a column rule between columns, it will appear in the middle of the gap.\",\n \"restrictions\": [\n \"length\",\n \"enum\"\n ]\n },\n {\n \"name\": \"column-rule\",\n \"browsers\": [\n \"E12\",\n \"FF52\",\n \"S9\",\n \"C50\",\n \"IE10\",\n \"O11.1\"\n ],\n \"syntax\": \"<'column-rule-width'> || <'column-rule-style'> || <'column-rule-color'>\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/column-rule\"\n }\n ],\n \"description\": \"Shorthand for setting 'column-rule-width', 'column-rule-style', and 'column-rule-color' at the same place in the style sheet. Omitted values are set to their initial values.\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"column-rule-color\",\n \"browsers\": [\n \"E12\",\n \"FF52\",\n \"S9\",\n \"C50\",\n \"IE10\",\n \"O11.1\"\n ],\n \"syntax\": \"<color>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/column-rule-color\"\n }\n ],\n \"description\": \"Sets the color of the column rule\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"column-rule-style\",\n \"browsers\": [\n \"E12\",\n \"FF52\",\n \"S9\",\n \"C50\",\n \"IE10\",\n \"O11.1\"\n ],\n \"syntax\": \"<'border-style'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/column-rule-style\"\n }\n ],\n \"description\": \"Sets the style of the rule between columns of an element.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"column-rule-width\",\n \"browsers\": [\n \"E12\",\n \"FF52\",\n \"S9\",\n \"C50\",\n \"IE10\",\n \"O11.1\"\n ],\n \"syntax\": \"<'border-width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/column-rule-width\"\n }\n ],\n \"description\": \"Sets the width of the rule between columns. Negative values are not allowed.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"columns\",\n \"browsers\": [\n \"E12\",\n \"FF52\",\n \"S9\",\n \"C50\",\n \"IE10\",\n \"O11.1\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The width depends on the values of other properties.\"\n }\n ],\n \"syntax\": \"<'column-width'> || <'column-count'>\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/columns\"\n }\n ],\n \"description\": \"A shorthand property which sets both 'column-width' and 'column-count'.\",\n \"restrictions\": [\n \"length\",\n \"integer\",\n \"enum\"\n ]\n },\n {\n \"name\": \"column-span\",\n \"browsers\": [\n \"E12\",\n \"FF71\",\n \"S9\",\n \"C50\",\n \"IE10\",\n \"O11.1\"\n ],\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"The element spans across all columns. Content in the normal flow that appears before the element is automatically balanced across all columns before the element appear.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The element does not span multiple columns.\"\n }\n ],\n \"syntax\": \"none | all\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/column-span\"\n }\n ],\n \"description\": \"Describes the page/column break behavior after the generated box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"column-width\",\n \"browsers\": [\n \"E12\",\n \"FF50\",\n \"S9\",\n \"C50\",\n \"IE10\",\n \"O11.1\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The width depends on the values of other properties.\"\n }\n ],\n \"syntax\": \"<length> | auto\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/column-width\"\n }\n ],\n \"description\": \"Describes the width of columns in multicol elements.\",\n \"restrictions\": [\n \"length\",\n \"enum\"\n ]\n },\n {\n \"name\": \"contain\",\n \"browsers\": [\n \"E79\",\n \"FF69\",\n \"S15.4\",\n \"C52\",\n \"O39\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Indicates that the property has no effect.\"\n },\n {\n \"name\": \"strict\",\n \"description\": \"Turns on all forms of containment for the element.\"\n },\n {\n \"name\": \"content\",\n \"description\": \"All containment rules except size are applied to the element.\"\n },\n {\n \"name\": \"size\",\n \"description\": \"For properties that can have effects on more than just an element and its descendants, those effects don't escape the containing element.\"\n },\n {\n \"name\": \"layout\",\n \"description\": \"Turns on layout containment for the element.\"\n },\n {\n \"name\": \"style\",\n \"description\": \"Turns on style containment for the element.\"\n },\n {\n \"name\": \"paint\",\n \"description\": \"Turns on paint containment for the element.\"\n }\n ],\n \"syntax\": \"none | strict | content | [ [ size || inline-size ] || layout || style || paint ]\",\n \"relevance\": 59,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/contain\"\n }\n ],\n \"description\": \"Indicates that an element and its contents are, as much as possible, independent of the rest of the document tree.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"content\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE8\",\n \"O4\"\n ],\n \"values\": [\n {\n \"name\": \"attr()\",\n \"description\": \"The attr(n) function returns as a string the value of attribute n for the subject of the selector.\"\n },\n {\n \"name\": \"counter(name)\",\n \"description\": \"Counters are denoted by identifiers (see the 'counter-increment' and 'counter-reset' properties).\"\n },\n {\n \"name\": \"icon\",\n \"description\": \"The (pseudo-)element is replaced in its entirety by the resource referenced by its 'icon' property, and treated as a replaced element.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"On elements, this inhibits the children of the element from being rendered as children of this element, as if the element was empty. On pseudo-elements it causes the pseudo-element to have no content.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"See http://www.w3.org/TR/css3-content/#content for computation rules.\"\n },\n {\n \"name\": \"url()\"\n }\n ],\n \"syntax\": \"normal | none | [ <content-replacement> | <content-list> ] [/ [ <string> | <counter> ]+ ]?\",\n \"relevance\": 90,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/content\"\n }\n ],\n \"description\": \"Determines which page-based occurrence of a given element is applied to a counter or string value.\",\n \"restrictions\": [\n \"string\",\n \"url\"\n ]\n },\n {\n \"name\": \"counter-increment\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S3\",\n \"C2\",\n \"IE8\",\n \"O9.2\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"This element does not alter the value of any counters.\"\n }\n ],\n \"syntax\": \"[ <counter-name> <integer>? ]+ | none\",\n \"relevance\": 54,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/counter-increment\"\n }\n ],\n \"description\": \"Manipulate the value of existing counters.\",\n \"restrictions\": [\n \"identifier\",\n \"integer\"\n ]\n },\n {\n \"name\": \"counter-reset\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S3\",\n \"C2\",\n \"IE8\",\n \"O9.2\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The counter is not modified.\"\n }\n ],\n \"syntax\": \"[ <counter-name> <integer>? | <reversed-counter-name> <integer>? ]+ | none\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/counter-reset\"\n }\n ],\n \"description\": \"Property accepts one or more names of counters (identifiers), each one optionally followed by an integer. The integer gives the value that the counter is set to on each occurrence of the element.\",\n \"restrictions\": [\n \"identifier\",\n \"integer\"\n ]\n },\n {\n \"name\": \"cursor\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.2\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"values\": [\n {\n \"name\": \"alias\",\n \"description\": \"Indicates an alias of/shortcut to something is to be created. Often rendered as an arrow with a small curved arrow next to it.\"\n },\n {\n \"name\": \"all-scroll\",\n \"description\": \"Indicates that the something can be scrolled in any direction. Often rendered as arrows pointing up, down, left, and right with a dot in the middle.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"The UA determines the cursor to display based on the current context.\"\n },\n {\n \"name\": \"cell\",\n \"description\": \"Indicates that a cell or set of cells may be selected. Often rendered as a thick plus-sign with a dot in the middle.\"\n },\n {\n \"name\": \"col-resize\",\n \"description\": \"Indicates that the item/column can be resized horizontally. Often rendered as arrows pointing left and right with a vertical bar separating them.\"\n },\n {\n \"name\": \"context-menu\",\n \"description\": \"A context menu is available for the object under the cursor. Often rendered as an arrow with a small menu-like graphic next to it.\"\n },\n {\n \"name\": \"copy\",\n \"description\": \"Indicates something is to be copied. Often rendered as an arrow with a small plus sign next to it.\"\n },\n {\n \"name\": \"crosshair\",\n \"description\": \"A simple crosshair (e.g., short line segments resembling a '+' sign). Often used to indicate a two dimensional bitmap selection mode.\"\n },\n {\n \"name\": \"default\",\n \"description\": \"The platform-dependent default cursor. Often rendered as an arrow.\"\n },\n {\n \"name\": \"e-resize\",\n \"description\": \"Indicates that east edge is to be moved.\"\n },\n {\n \"name\": \"ew-resize\",\n \"description\": \"Indicates a bidirectional east-west resize cursor.\"\n },\n {\n \"name\": \"grab\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.2\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Indicates that something can be grabbed.\"\n },\n {\n \"name\": \"grabbing\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.2\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Indicates that something is being grabbed.\"\n },\n {\n \"name\": \"help\",\n \"description\": \"Help is available for the object under the cursor. Often rendered as a question mark or a balloon.\"\n },\n {\n \"name\": \"move\",\n \"description\": \"Indicates something is to be moved.\"\n },\n {\n \"name\": \"-moz-grab\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.2\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Indicates that something can be grabbed.\"\n },\n {\n \"name\": \"-moz-grabbing\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.2\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Indicates that something is being grabbed.\"\n },\n {\n \"name\": \"-moz-zoom-in\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.2\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Indicates that something can be zoomed (magnified) in.\"\n },\n {\n \"name\": \"-moz-zoom-out\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.2\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Indicates that something can be zoomed (magnified) out.\"\n },\n {\n \"name\": \"ne-resize\",\n \"description\": \"Indicates that movement starts from north-east corner.\"\n },\n {\n \"name\": \"nesw-resize\",\n \"description\": \"Indicates a bidirectional north-east/south-west cursor.\"\n },\n {\n \"name\": \"no-drop\",\n \"description\": \"Indicates that the dragged item cannot be dropped at the current cursor location. Often rendered as a hand or pointer with a small circle with a line through it.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No cursor is rendered for the element.\"\n },\n {\n \"name\": \"not-allowed\",\n \"description\": \"Indicates that the requested action will not be carried out. Often rendered as a circle with a line through it.\"\n },\n {\n \"name\": \"n-resize\",\n \"description\": \"Indicates that north edge is to be moved.\"\n },\n {\n \"name\": \"ns-resize\",\n \"description\": \"Indicates a bidirectional north-south cursor.\"\n },\n {\n \"name\": \"nw-resize\",\n \"description\": \"Indicates that movement starts from north-west corner.\"\n },\n {\n \"name\": \"nwse-resize\",\n \"description\": \"Indicates a bidirectional north-west/south-east cursor.\"\n },\n {\n \"name\": \"pointer\",\n \"description\": \"The cursor is a pointer that indicates a link.\"\n },\n {\n \"name\": \"progress\",\n \"description\": \"A progress indicator. The program is performing some processing, but is different from 'wait' in that the user may still interact with the program. Often rendered as a spinning beach ball, or an arrow with a watch or hourglass.\"\n },\n {\n \"name\": \"row-resize\",\n \"description\": \"Indicates that the item/row can be resized vertically. Often rendered as arrows pointing up and down with a horizontal bar separating them.\"\n },\n {\n \"name\": \"se-resize\",\n \"description\": \"Indicates that movement starts from south-east corner.\"\n },\n {\n \"name\": \"s-resize\",\n \"description\": \"Indicates that south edge is to be moved.\"\n },\n {\n \"name\": \"sw-resize\",\n \"description\": \"Indicates that movement starts from south-west corner.\"\n },\n {\n \"name\": \"text\",\n \"description\": \"Indicates text that may be selected. Often rendered as a vertical I-beam.\"\n },\n {\n \"name\": \"vertical-text\",\n \"description\": \"Indicates vertical-text that may be selected. Often rendered as a horizontal I-beam.\"\n },\n {\n \"name\": \"wait\",\n \"description\": \"Indicates that the program is busy and the user should wait. Often rendered as a watch or hourglass.\"\n },\n {\n \"name\": \"-webkit-grab\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.2\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Indicates that something can be grabbed.\"\n },\n {\n \"name\": \"-webkit-grabbing\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.2\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Indicates that something is being grabbed.\"\n },\n {\n \"name\": \"-webkit-zoom-in\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.2\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Indicates that something can be zoomed (magnified) in.\"\n },\n {\n \"name\": \"-webkit-zoom-out\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.2\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Indicates that something can be zoomed (magnified) out.\"\n },\n {\n \"name\": \"w-resize\",\n \"description\": \"Indicates that west edge is to be moved.\"\n },\n {\n \"name\": \"zoom-in\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.2\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Indicates that something can be zoomed (magnified) in.\"\n },\n {\n \"name\": \"zoom-out\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.2\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Indicates that something can be zoomed (magnified) out.\"\n }\n ],\n \"syntax\": \"[ [ <url> [ <x> <y> ]? , ]* [ auto | default | none | context-menu | help | pointer | progress | wait | cell | crosshair | text | vertical-text | alias | copy | move | no-drop | not-allowed | e-resize | n-resize | ne-resize | nw-resize | s-resize | se-resize | sw-resize | w-resize | ew-resize | ns-resize | nesw-resize | nwse-resize | col-resize | row-resize | all-scroll | zoom-in | zoom-out | grab | grabbing ] ]\",\n \"relevance\": 92,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/cursor\"\n }\n ],\n \"description\": \"Allows control over cursor appearance in an element\",\n \"restrictions\": [\n \"url\",\n \"number\",\n \"enum\"\n ]\n },\n {\n \"name\": \"direction\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C2\",\n \"IE5.5\",\n \"O9.2\"\n ],\n \"values\": [\n {\n \"name\": \"ltr\",\n \"description\": \"Left-to-right direction.\"\n },\n {\n \"name\": \"rtl\",\n \"description\": \"Right-to-left direction.\"\n }\n ],\n \"syntax\": \"ltr | rtl\",\n \"relevance\": 71,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/direction\"\n }\n ],\n \"description\": \"Specifies the inline base direction or directionality of any bidi paragraph, embedding, isolate, or override established by the box. Note: for HTML content use the 'dir' attribute and 'bdo' element rather than this property.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"display\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"values\": [\n {\n \"name\": \"block\",\n \"description\": \"The element generates a block-level box\"\n },\n {\n \"name\": \"contents\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"The element itself does not generate any boxes, but its children and pseudo-elements still generate boxes as normal.\"\n },\n {\n \"name\": \"flex\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"The element generates a principal flex container box and establishes a flex formatting context.\"\n },\n {\n \"name\": \"flexbox\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"The element lays out its contents using flow layout (block-and-inline layout). Standardized as 'flex'.\"\n },\n {\n \"name\": \"flow-root\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"The element generates a block container box, and lays out its contents using flow layout.\"\n },\n {\n \"name\": \"grid\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"The element generates a principal grid container box, and establishes a grid formatting context.\"\n },\n {\n \"name\": \"inline\",\n \"description\": \"The element generates an inline-level box.\"\n },\n {\n \"name\": \"inline-block\",\n \"description\": \"A block box, which itself is flowed as a single inline box, similar to a replaced element. The inside of an inline-block is formatted as a block box, and the box itself is formatted as an inline box.\"\n },\n {\n \"name\": \"inline-flex\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Inline-level flex container.\"\n },\n {\n \"name\": \"inline-flexbox\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Inline-level flex container. Standardized as 'inline-flex'\"\n },\n {\n \"name\": \"inline-table\",\n \"description\": \"Inline-level table wrapper box containing table box.\"\n },\n {\n \"name\": \"list-item\",\n \"description\": \"One or more block boxes and one marker box.\"\n },\n {\n \"name\": \"-moz-box\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"The element lays out its contents using flow layout (block-and-inline layout). Standardized as 'flex'.\"\n },\n {\n \"name\": \"-moz-deck\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ]\n },\n {\n \"name\": \"-moz-grid\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ]\n },\n {\n \"name\": \"-moz-grid-group\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ]\n },\n {\n \"name\": \"-moz-grid-line\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ]\n },\n {\n \"name\": \"-moz-groupbox\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ]\n },\n {\n \"name\": \"-moz-inline-box\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Inline-level flex container. Standardized as 'inline-flex'\"\n },\n {\n \"name\": \"-moz-inline-grid\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ]\n },\n {\n \"name\": \"-moz-inline-stack\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ]\n },\n {\n \"name\": \"-moz-marker\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ]\n },\n {\n \"name\": \"-moz-popup\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ]\n },\n {\n \"name\": \"-moz-stack\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ]\n },\n {\n \"name\": \"-ms-flexbox\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"The element lays out its contents using flow layout (block-and-inline layout). Standardized as 'flex'.\"\n },\n {\n \"name\": \"-ms-grid\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"The element generates a principal grid container box, and establishes a grid formatting context.\"\n },\n {\n \"name\": \"-ms-inline-flexbox\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Inline-level flex container. Standardized as 'inline-flex'\"\n },\n {\n \"name\": \"-ms-inline-grid\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Inline-level grid container.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The element and its descendants generates no boxes.\"\n },\n {\n \"name\": \"ruby\",\n \"description\": \"The element generates a principal ruby container box, and establishes a ruby formatting context.\"\n },\n {\n \"name\": \"ruby-base\"\n },\n {\n \"name\": \"ruby-base-container\"\n },\n {\n \"name\": \"ruby-text\"\n },\n {\n \"name\": \"ruby-text-container\"\n },\n {\n \"name\": \"run-in\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"The element generates a run-in box. Run-in elements act like inlines or blocks, depending on the surrounding elements.\"\n },\n {\n \"name\": \"table\",\n \"description\": \"The element generates a principal table wrapper box containing an additionally-generated table box, and establishes a table formatting context.\"\n },\n {\n \"name\": \"table-caption\"\n },\n {\n \"name\": \"table-cell\"\n },\n {\n \"name\": \"table-column\"\n },\n {\n \"name\": \"table-column-group\"\n },\n {\n \"name\": \"table-footer-group\"\n },\n {\n \"name\": \"table-header-group\"\n },\n {\n \"name\": \"table-row\"\n },\n {\n \"name\": \"table-row-group\"\n },\n {\n \"name\": \"-webkit-box\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"The element lays out its contents using flow layout (block-and-inline layout). Standardized as 'flex'.\"\n },\n {\n \"name\": \"-webkit-flex\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"The element lays out its contents using flow layout (block-and-inline layout).\"\n },\n {\n \"name\": \"-webkit-inline-box\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Inline-level flex container. Standardized as 'inline-flex'\"\n },\n {\n \"name\": \"-webkit-inline-flex\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Inline-level flex container.\"\n }\n ],\n \"syntax\": \"[ <display-outside> || <display-inside> ] | <display-listitem> | <display-internal> | <display-box> | <display-legacy>\",\n \"relevance\": 96,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/display\"\n }\n ],\n \"description\": \"In combination with 'float' and 'position', determines the type of box or boxes that are generated for an element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"empty-cells\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.2\",\n \"C1\",\n \"IE8\",\n \"O4\"\n ],\n \"values\": [\n {\n \"name\": \"hide\",\n \"description\": \"No borders or backgrounds are drawn around/behind empty cells.\"\n },\n {\n \"name\": \"-moz-show-background\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.2\",\n \"C1\",\n \"IE8\",\n \"O4\"\n ]\n },\n {\n \"name\": \"show\",\n \"description\": \"Borders and backgrounds are drawn around/behind empty cells (like normal cells).\"\n }\n ],\n \"syntax\": \"show | hide\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/empty-cells\"\n }\n ],\n \"description\": \"In the separated borders model, this property controls the rendering of borders and backgrounds around cells that have no visible content.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"enable-background\",\n \"values\": [\n {\n \"name\": \"accumulate\",\n \"description\": \"If the ancestor container element has a property of new, then all graphics elements within the current container are rendered both on the parent's background image and onto the target.\"\n },\n {\n \"name\": \"new\",\n \"description\": \"Create a new background image canvas. All children of the current container element can access the background, and they will be rendered onto both the parent's background image canvas in addition to the target device.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Deprecated. Use 'isolation' property instead when support allows. Specifies how the accumulation of the background image is managed.\",\n \"restrictions\": [\n \"integer\",\n \"length\",\n \"percentage\",\n \"enum\"\n ]\n },\n {\n \"name\": \"fallback\",\n \"browsers\": [\n \"FF33\"\n ],\n \"syntax\": \"<counter-style-name>\",\n \"relevance\": 50,\n \"description\": \"@counter-style descriptor. Specifies a fallback counter style to be used when the current counter style can't create a representation for a given counter value.\",\n \"restrictions\": [\n \"identifier\"\n ]\n },\n {\n \"name\": \"fill\",\n \"values\": [\n {\n \"name\": \"url()\",\n \"description\": \"A URL reference to a paint server element, which is an element that defines a paint server: 'hatch', 'linearGradient', 'mesh', 'pattern', 'radialGradient' and 'solidcolor'.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No paint is applied in this layer.\"\n }\n ],\n \"relevance\": 77,\n \"description\": \"Paints the interior of the given graphical element.\",\n \"restrictions\": [\n \"color\",\n \"enum\",\n \"url\"\n ]\n },\n {\n \"name\": \"fill-opacity\",\n \"relevance\": 52,\n \"description\": \"Specifies the opacity of the painting operation used to paint the interior the current object.\",\n \"restrictions\": [\n \"number(0-1)\"\n ]\n },\n {\n \"name\": \"fill-rule\",\n \"values\": [\n {\n \"name\": \"evenodd\",\n \"description\": \"Determines the 'insideness' of a point on the canvas by drawing a ray from that point to infinity in any direction and counting the number of path segments from the given shape that the ray crosses.\"\n },\n {\n \"name\": \"nonzero\",\n \"description\": \"Determines the 'insideness' of a point on the canvas by drawing a ray from that point to infinity in any direction and then examining the places where a segment of the shape crosses the ray.\"\n }\n ],\n \"relevance\": 51,\n \"description\": \"Indicates the algorithm (or winding rule) which is to be used to determine what parts of the canvas are included inside the shape.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"filter\",\n \"browsers\": [\n \"E12\",\n \"FF35\",\n \"S9.1\",\n \"C53\",\n \"O40\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No filter effects are applied.\"\n },\n {\n \"name\": \"blur()\",\n \"description\": \"Applies a Gaussian blur to the input image.\"\n },\n {\n \"name\": \"brightness()\",\n \"description\": \"Applies a linear multiplier to input image, making it appear more or less bright.\"\n },\n {\n \"name\": \"contrast()\",\n \"description\": \"Adjusts the contrast of the input.\"\n },\n {\n \"name\": \"drop-shadow()\",\n \"description\": \"Applies a drop shadow effect to the input image.\"\n },\n {\n \"name\": \"grayscale()\",\n \"description\": \"Converts the input image to grayscale.\"\n },\n {\n \"name\": \"hue-rotate()\",\n \"description\": \"Applies a hue rotation on the input image. \"\n },\n {\n \"name\": \"invert()\",\n \"description\": \"Inverts the samples in the input image.\"\n },\n {\n \"name\": \"opacity()\",\n \"description\": \"Applies transparency to the samples in the input image.\"\n },\n {\n \"name\": \"saturate()\",\n \"description\": \"Saturates the input image.\"\n },\n {\n \"name\": \"sepia()\",\n \"description\": \"Converts the input image to sepia.\"\n },\n {\n \"name\": \"url()\",\n \"browsers\": [\n \"E12\",\n \"FF35\",\n \"S9.1\",\n \"C53\",\n \"O40\"\n ],\n \"description\": \"A filter reference to a <filter> element.\"\n }\n ],\n \"syntax\": \"none | <filter-function-list>\",\n \"relevance\": 67,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/filter\"\n }\n ],\n \"description\": \"Processes an element's rendering before it is displayed in the document, by applying one or more filter effects.\",\n \"restrictions\": [\n \"enum\",\n \"url\"\n ]\n },\n {\n \"name\": \"flex\",\n \"browsers\": [\n \"E12\",\n \"FF20\",\n \"S9\",\n \"C29\",\n \"IE11\",\n \"O12.1\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Retrieves the value of the main size property as the used 'flex-basis'.\"\n },\n {\n \"name\": \"content\",\n \"browsers\": [\n \"E12\",\n \"FF20\",\n \"S9\",\n \"C29\",\n \"IE11\",\n \"O12.1\"\n ],\n \"description\": \"Indicates automatic sizing, based on the flex item's content.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Expands to '0 0 auto'.\"\n }\n ],\n \"syntax\": \"none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]\",\n \"relevance\": 80,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/flex\"\n }\n ],\n \"description\": \"Specifies the components of a flexible length: the flex grow factor and flex shrink factor, and the flex basis.\",\n \"restrictions\": [\n \"length\",\n \"number\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"flex-basis\",\n \"browsers\": [\n \"E12\",\n \"FF22\",\n \"S9\",\n \"C29\",\n \"IE11\",\n \"O12.1\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Retrieves the value of the main size property as the used 'flex-basis'.\"\n },\n {\n \"name\": \"content\",\n \"browsers\": [\n \"E12\",\n \"FF22\",\n \"S9\",\n \"C29\",\n \"IE11\",\n \"O12.1\"\n ],\n \"description\": \"Indicates automatic sizing, based on the flex item's content.\"\n }\n ],\n \"syntax\": \"content | <'width'>\",\n \"relevance\": 68,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/flex-basis\"\n }\n ],\n \"description\": \"Sets the flex basis.\",\n \"restrictions\": [\n \"length\",\n \"number\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"flex-direction\",\n \"browsers\": [\n \"E12\",\n \"FF81\",\n \"S9\",\n \"C29\",\n \"IE11\",\n \"O12.1\"\n ],\n \"values\": [\n {\n \"name\": \"column\",\n \"description\": \"The flex container's main axis has the same orientation as the block axis of the current writing mode.\"\n },\n {\n \"name\": \"column-reverse\",\n \"description\": \"Same as 'column', except the main-start and main-end directions are swapped.\"\n },\n {\n \"name\": \"row\",\n \"description\": \"The flex container's main axis has the same orientation as the inline axis of the current writing mode.\"\n },\n {\n \"name\": \"row-reverse\",\n \"description\": \"Same as 'row', except the main-start and main-end directions are swapped.\"\n }\n ],\n \"syntax\": \"row | row-reverse | column | column-reverse\",\n \"relevance\": 83,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/flex-direction\"\n }\n ],\n \"description\": \"Specifies how flex items are placed in the flex container, by setting the direction of the flex container's main axis.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"flex-flow\",\n \"browsers\": [\n \"E12\",\n \"FF28\",\n \"S9\",\n \"C29\",\n \"IE11\",\n \"O12.1\"\n ],\n \"values\": [\n {\n \"name\": \"column\",\n \"description\": \"The flex container's main axis has the same orientation as the block axis of the current writing mode.\"\n },\n {\n \"name\": \"column-reverse\",\n \"description\": \"Same as 'column', except the main-start and main-end directions are swapped.\"\n },\n {\n \"name\": \"nowrap\",\n \"description\": \"The flex container is single-line.\"\n },\n {\n \"name\": \"row\",\n \"description\": \"The flex container's main axis has the same orientation as the inline axis of the current writing mode.\"\n },\n {\n \"name\": \"row-reverse\",\n \"description\": \"Same as 'row', except the main-start and main-end directions are swapped.\"\n },\n {\n \"name\": \"wrap\",\n \"description\": \"The flexbox is multi-line.\"\n },\n {\n \"name\": \"wrap-reverse\",\n \"description\": \"Same as 'wrap', except the cross-start and cross-end directions are swapped.\"\n }\n ],\n \"syntax\": \"<'flex-direction'> || <'flex-wrap'>\",\n \"relevance\": 66,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/flex-flow\"\n }\n ],\n \"description\": \"Specifies how flexbox items are placed in the flexbox.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"flex-grow\",\n \"browsers\": [\n \"E12\",\n \"FF20\",\n \"S9\",\n \"C29\",\n \"IE11\",\n \"O12.1\"\n ],\n \"syntax\": \"<number>\",\n \"relevance\": 76,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/flex-grow\"\n }\n ],\n \"description\": \"Sets the flex grow factor. Negative numbers are invalid.\",\n \"restrictions\": [\n \"number\"\n ]\n },\n {\n \"name\": \"flex-shrink\",\n \"browsers\": [\n \"E12\",\n \"FF20\",\n \"S9\",\n \"C29\",\n \"IE10\",\n \"O12.1\"\n ],\n \"syntax\": \"<number>\",\n \"relevance\": 75,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/flex-shrink\"\n }\n ],\n \"description\": \"Sets the flex shrink factor. Negative numbers are invalid.\",\n \"restrictions\": [\n \"number\"\n ]\n },\n {\n \"name\": \"flex-wrap\",\n \"browsers\": [\n \"E12\",\n \"FF28\",\n \"S9\",\n \"C29\",\n \"IE11\",\n \"O17\"\n ],\n \"values\": [\n {\n \"name\": \"nowrap\",\n \"description\": \"The flex container is single-line.\"\n },\n {\n \"name\": \"wrap\",\n \"description\": \"The flexbox is multi-line.\"\n },\n {\n \"name\": \"wrap-reverse\",\n \"description\": \"Same as 'wrap', except the cross-start and cross-end directions are swapped.\"\n }\n ],\n \"syntax\": \"nowrap | wrap | wrap-reverse\",\n \"relevance\": 80,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/flex-wrap\"\n }\n ],\n \"description\": \"Controls whether the flex container is single-line or multi-line, and the direction of the cross-axis, which determines the direction new lines are stacked in.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"float\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"values\": [\n {\n \"name\": \"inline-end\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"A keyword indicating that the element must float on the end side of its containing block. That is the right side with ltr scripts, and the left side with rtl scripts.\"\n },\n {\n \"name\": \"inline-start\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"A keyword indicating that the element must float on the start side of its containing block. That is the left side with ltr scripts, and the right side with rtl scripts.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"The element generates a block box that is floated to the left. Content flows on the right side of the box, starting at the top (subject to the 'clear' property).\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The box is not floated.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"Similar to 'left', except the box is floated to the right, and content flows on the left side of the box, starting at the top.\"\n }\n ],\n \"syntax\": \"left | right | none | inline-start | inline-end\",\n \"relevance\": 91,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/float\"\n }\n ],\n \"description\": \"Specifies how a box should be floated. It may be set for any element, but only applies to elements that generate boxes that are not absolutely positioned.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"flood-color\",\n \"browsers\": [\n \"E\",\n \"C5\",\n \"FF3\",\n \"IE10\",\n \"O9\",\n \"S6\"\n ],\n \"relevance\": 50,\n \"description\": \"Indicates what color to use to flood the current filter primitive subregion.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"flood-opacity\",\n \"browsers\": [\n \"E\",\n \"C5\",\n \"FF3\",\n \"IE10\",\n \"O9\",\n \"S6\"\n ],\n \"relevance\": 50,\n \"description\": \"Indicates what opacity to use to flood the current filter primitive subregion.\",\n \"restrictions\": [\n \"number(0-1)\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"font\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE3\",\n \"O3.5\"\n ],\n \"values\": [\n {\n \"name\": \"100\",\n \"description\": \"Thin\"\n },\n {\n \"name\": \"200\",\n \"description\": \"Extra Light (Ultra Light)\"\n },\n {\n \"name\": \"300\",\n \"description\": \"Light\"\n },\n {\n \"name\": \"400\",\n \"description\": \"Normal\"\n },\n {\n \"name\": \"500\",\n \"description\": \"Medium\"\n },\n {\n \"name\": \"600\",\n \"description\": \"Semi Bold (Demi Bold)\"\n },\n {\n \"name\": \"700\",\n \"description\": \"Bold\"\n },\n {\n \"name\": \"800\",\n \"description\": \"Extra Bold (Ultra Bold)\"\n },\n {\n \"name\": \"900\",\n \"description\": \"Black (Heavy)\"\n },\n {\n \"name\": \"bold\",\n \"description\": \"Same as 700\"\n },\n {\n \"name\": \"bolder\",\n \"description\": \"Specifies the weight of the face bolder than the inherited value.\"\n },\n {\n \"name\": \"caption\",\n \"description\": \"The font used for captioned controls (e.g., buttons, drop-downs, etc.).\"\n },\n {\n \"name\": \"icon\",\n \"description\": \"The font used to label icons.\"\n },\n {\n \"name\": \"italic\",\n \"description\": \"Selects a font that is labeled 'italic', or, if that is not available, one labeled 'oblique'.\"\n },\n {\n \"name\": \"large\"\n },\n {\n \"name\": \"larger\"\n },\n {\n \"name\": \"lighter\",\n \"description\": \"Specifies the weight of the face lighter than the inherited value.\"\n },\n {\n \"name\": \"medium\"\n },\n {\n \"name\": \"menu\",\n \"description\": \"The font used in menus (e.g., dropdown menus and menu lists).\"\n },\n {\n \"name\": \"message-box\",\n \"description\": \"The font used in dialog boxes.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Specifies a face that is not labeled as a small-caps font.\"\n },\n {\n \"name\": \"oblique\",\n \"description\": \"Selects a font that is labeled 'oblique'.\"\n },\n {\n \"name\": \"small\"\n },\n {\n \"name\": \"small-caps\",\n \"description\": \"Specifies a font that is labeled as a small-caps font. If a genuine small-caps font is not available, user agents should simulate a small-caps font.\"\n },\n {\n \"name\": \"small-caption\",\n \"description\": \"The font used for labeling small controls.\"\n },\n {\n \"name\": \"smaller\"\n },\n {\n \"name\": \"status-bar\",\n \"description\": \"The font used in window status bars.\"\n },\n {\n \"name\": \"x-large\"\n },\n {\n \"name\": \"x-small\"\n },\n {\n \"name\": \"xx-large\"\n },\n {\n \"name\": \"xx-small\"\n }\n ],\n \"syntax\": \"[ [ <'font-style'> || <font-variant-css21> || <'font-weight'> || <'font-stretch'> ]? <'font-size'> [ / <'line-height'> ]? <'font-family'> ] | caption | icon | menu | message-box | small-caption | status-bar\",\n \"relevance\": 83,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font\"\n }\n ],\n \"description\": \"Shorthand property for setting 'font-style', 'font-variant', 'font-weight', 'font-size', 'line-height', and 'font-family', at the same place in the style sheet. The syntax of this property is based on a traditional typographical shorthand notation to set multiple properties related to fonts.\",\n \"restrictions\": [\n \"font\"\n ]\n },\n {\n \"name\": \"font-family\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE3\",\n \"O3.5\"\n ],\n \"values\": [\n {\n \"name\": \"system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif\"\n },\n {\n \"name\": \"Arial, Helvetica, sans-serif\"\n },\n {\n \"name\": \"Cambria, Cochin, Georgia, Times, 'Times New Roman', serif\"\n },\n {\n \"name\": \"'Courier New', Courier, monospace\"\n },\n {\n \"name\": \"cursive\"\n },\n {\n \"name\": \"fantasy\"\n },\n {\n \"name\": \"'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif\"\n },\n {\n \"name\": \"Georgia, 'Times New Roman', Times, serif\"\n },\n {\n \"name\": \"'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif\"\n },\n {\n \"name\": \"Impact, Haettenschweiler, 'Arial Narrow Bold', sans-serif\"\n },\n {\n \"name\": \"'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif\"\n },\n {\n \"name\": \"monospace\"\n },\n {\n \"name\": \"sans-serif\"\n },\n {\n \"name\": \"'Segoe UI', Tahoma, Geneva, Verdana, sans-serif\"\n },\n {\n \"name\": \"serif\"\n },\n {\n \"name\": \"'Times New Roman', Times, serif\"\n },\n {\n \"name\": \"'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif\"\n },\n {\n \"name\": \"Verdana, Geneva, Tahoma, sans-serif\"\n }\n ],\n \"syntax\": \"<family-name>\",\n \"relevance\": 93,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-family\"\n }\n ],\n \"description\": \"Specifies a prioritized list of font family names or generic family names. A user agent iterates through the list of family names until it matches an available font that contains a glyph for the character to be rendered.\",\n \"restrictions\": [\n \"font\"\n ]\n },\n {\n \"name\": \"font-feature-settings\",\n \"browsers\": [\n \"E15\",\n \"FF34\",\n \"S9.1\",\n \"C48\",\n \"IE10\",\n \"O35\"\n ],\n \"values\": [\n {\n \"name\": \"\\\"aalt\\\"\",\n \"description\": \"Access All Alternates.\"\n },\n {\n \"name\": \"\\\"abvf\\\"\",\n \"description\": \"Above-base Forms. Required in Khmer script.\"\n },\n {\n \"name\": \"\\\"abvm\\\"\",\n \"description\": \"Above-base Mark Positioning. Required in Indic scripts.\"\n },\n {\n \"name\": \"\\\"abvs\\\"\",\n \"description\": \"Above-base Substitutions. Required in Indic scripts.\"\n },\n {\n \"name\": \"\\\"afrc\\\"\",\n \"description\": \"Alternative Fractions.\"\n },\n {\n \"name\": \"\\\"akhn\\\"\",\n \"description\": \"Akhand. Required in most Indic scripts.\"\n },\n {\n \"name\": \"\\\"blwf\\\"\",\n \"description\": \"Below-base Form. Required in a number of Indic scripts.\"\n },\n {\n \"name\": \"\\\"blwm\\\"\",\n \"description\": \"Below-base Mark Positioning. Required in Indic scripts.\"\n },\n {\n \"name\": \"\\\"blws\\\"\",\n \"description\": \"Below-base Substitutions. Required in Indic scripts.\"\n },\n {\n \"name\": \"\\\"calt\\\"\",\n \"description\": \"Contextual Alternates.\"\n },\n {\n \"name\": \"\\\"case\\\"\",\n \"description\": \"Case-Sensitive Forms. Applies only to European scripts; particularly prominent in Spanish-language setting.\"\n },\n {\n \"name\": \"\\\"ccmp\\\"\",\n \"description\": \"Glyph Composition/Decomposition.\"\n },\n {\n \"name\": \"\\\"cfar\\\"\",\n \"description\": \"Conjunct Form After Ro. Required in Khmer scripts.\"\n },\n {\n \"name\": \"\\\"cjct\\\"\",\n \"description\": \"Conjunct Forms. Required in Indic scripts that show similarity to Devanagari.\"\n },\n {\n \"name\": \"\\\"clig\\\"\",\n \"description\": \"Contextual Ligatures.\"\n },\n {\n \"name\": \"\\\"cpct\\\"\",\n \"description\": \"Centered CJK Punctuation. Used primarily in Chinese fonts.\"\n },\n {\n \"name\": \"\\\"cpsp\\\"\",\n \"description\": \"Capital Spacing. Should not be used in connecting scripts (e.g. most Arabic).\"\n },\n {\n \"name\": \"\\\"cswh\\\"\",\n \"description\": \"Contextual Swash.\"\n },\n {\n \"name\": \"\\\"curs\\\"\",\n \"description\": \"Cursive Positioning. Can be used in any cursive script.\"\n },\n {\n \"name\": \"\\\"c2pc\\\"\",\n \"description\": \"Petite Capitals From Capitals. Applies only to bicameral scripts.\"\n },\n {\n \"name\": \"\\\"c2sc\\\"\",\n \"description\": \"Small Capitals From Capitals. Applies only to bicameral scripts.\"\n },\n {\n \"name\": \"\\\"dist\\\"\",\n \"description\": \"Distances. Required in Indic scripts.\"\n },\n {\n \"name\": \"\\\"dlig\\\"\",\n \"description\": \"Discretionary ligatures.\"\n },\n {\n \"name\": \"\\\"dnom\\\"\",\n \"description\": \"Denominators.\"\n },\n {\n \"name\": \"\\\"dtls\\\"\",\n \"description\": \"Dotless Forms. Applied to math formula layout.\"\n },\n {\n \"name\": \"\\\"expt\\\"\",\n \"description\": \"Expert Forms. Applies only to Japanese.\"\n },\n {\n \"name\": \"\\\"falt\\\"\",\n \"description\": \"Final Glyph on Line Alternates. Can be used in any cursive script.\"\n },\n {\n \"name\": \"\\\"fin2\\\"\",\n \"description\": \"Terminal Form #2. Used only with the Syriac script.\"\n },\n {\n \"name\": \"\\\"fin3\\\"\",\n \"description\": \"Terminal Form #3. Used only with the Syriac script.\"\n },\n {\n \"name\": \"\\\"fina\\\"\",\n \"description\": \"Terminal Forms. Can be used in any alphabetic script.\"\n },\n {\n \"name\": \"\\\"flac\\\"\",\n \"description\": \"Flattened ascent forms. Applied to math formula layout.\"\n },\n {\n \"name\": \"\\\"frac\\\"\",\n \"description\": \"Fractions.\"\n },\n {\n \"name\": \"\\\"fwid\\\"\",\n \"description\": \"Full Widths. Applies to any script which can use monospaced forms.\"\n },\n {\n \"name\": \"\\\"half\\\"\",\n \"description\": \"Half Forms. Required in Indic scripts that show similarity to Devanagari.\"\n },\n {\n \"name\": \"\\\"haln\\\"\",\n \"description\": \"Halant Forms. Required in Indic scripts.\"\n },\n {\n \"name\": \"\\\"halt\\\"\",\n \"description\": \"Alternate Half Widths. Used only in CJKV fonts.\"\n },\n {\n \"name\": \"\\\"hist\\\"\",\n \"description\": \"Historical Forms.\"\n },\n {\n \"name\": \"\\\"hkna\\\"\",\n \"description\": \"Horizontal Kana Alternates. Applies only to fonts that support kana (hiragana and katakana).\"\n },\n {\n \"name\": \"\\\"hlig\\\"\",\n \"description\": \"Historical Ligatures.\"\n },\n {\n \"name\": \"\\\"hngl\\\"\",\n \"description\": \"Hangul. Korean only.\"\n },\n {\n \"name\": \"\\\"hojo\\\"\",\n \"description\": \"Hojo Kanji Forms (JIS X 0212-1990 Kanji Forms). Used only with Kanji script.\"\n },\n {\n \"name\": \"\\\"hwid\\\"\",\n \"description\": \"Half Widths. Generally used only in CJKV fonts.\"\n },\n {\n \"name\": \"\\\"init\\\"\",\n \"description\": \"Initial Forms. Can be used in any alphabetic script.\"\n },\n {\n \"name\": \"\\\"isol\\\"\",\n \"description\": \"Isolated Forms. Can be used in any cursive script.\"\n },\n {\n \"name\": \"\\\"ital\\\"\",\n \"description\": \"Italics. Applies mostly to Latin; note that many non-Latin fonts contain Latin as well.\"\n },\n {\n \"name\": \"\\\"jalt\\\"\",\n \"description\": \"Justification Alternates. Can be used in any cursive script.\"\n },\n {\n \"name\": \"\\\"jp78\\\"\",\n \"description\": \"JIS78 Forms. Applies only to Japanese.\"\n },\n {\n \"name\": \"\\\"jp83\\\"\",\n \"description\": \"JIS83 Forms. Applies only to Japanese.\"\n },\n {\n \"name\": \"\\\"jp90\\\"\",\n \"description\": \"JIS90 Forms. Applies only to Japanese.\"\n },\n {\n \"name\": \"\\\"jp04\\\"\",\n \"description\": \"JIS2004 Forms. Applies only to Japanese.\"\n },\n {\n \"name\": \"\\\"kern\\\"\",\n \"description\": \"Kerning.\"\n },\n {\n \"name\": \"\\\"lfbd\\\"\",\n \"description\": \"Left Bounds.\"\n },\n {\n \"name\": \"\\\"liga\\\"\",\n \"description\": \"Standard Ligatures.\"\n },\n {\n \"name\": \"\\\"ljmo\\\"\",\n \"description\": \"Leading Jamo Forms. Required for Hangul script when Ancient Hangul writing system is supported.\"\n },\n {\n \"name\": \"\\\"lnum\\\"\",\n \"description\": \"Lining Figures.\"\n },\n {\n \"name\": \"\\\"locl\\\"\",\n \"description\": \"Localized Forms.\"\n },\n {\n \"name\": \"\\\"ltra\\\"\",\n \"description\": \"Left-to-right glyph alternates.\"\n },\n {\n \"name\": \"\\\"ltrm\\\"\",\n \"description\": \"Left-to-right mirrored forms.\"\n },\n {\n \"name\": \"\\\"mark\\\"\",\n \"description\": \"Mark Positioning.\"\n },\n {\n \"name\": \"\\\"med2\\\"\",\n \"description\": \"Medial Form #2. Used only with the Syriac script.\"\n },\n {\n \"name\": \"\\\"medi\\\"\",\n \"description\": \"Medial Forms.\"\n },\n {\n \"name\": \"\\\"mgrk\\\"\",\n \"description\": \"Mathematical Greek.\"\n },\n {\n \"name\": \"\\\"mkmk\\\"\",\n \"description\": \"Mark to Mark Positioning.\"\n },\n {\n \"name\": \"\\\"nalt\\\"\",\n \"description\": \"Alternate Annotation Forms.\"\n },\n {\n \"name\": \"\\\"nlck\\\"\",\n \"description\": \"NLC Kanji Forms. Used only with Kanji script.\"\n },\n {\n \"name\": \"\\\"nukt\\\"\",\n \"description\": \"Nukta Forms. Required in Indic scripts..\"\n },\n {\n \"name\": \"\\\"numr\\\"\",\n \"description\": \"Numerators.\"\n },\n {\n \"name\": \"\\\"onum\\\"\",\n \"description\": \"Oldstyle Figures.\"\n },\n {\n \"name\": \"\\\"opbd\\\"\",\n \"description\": \"Optical Bounds.\"\n },\n {\n \"name\": \"\\\"ordn\\\"\",\n \"description\": \"Ordinals. Applies mostly to Latin script.\"\n },\n {\n \"name\": \"\\\"ornm\\\"\",\n \"description\": \"Ornaments.\"\n },\n {\n \"name\": \"\\\"palt\\\"\",\n \"description\": \"Proportional Alternate Widths. Used mostly in CJKV fonts.\"\n },\n {\n \"name\": \"\\\"pcap\\\"\",\n \"description\": \"Petite Capitals.\"\n },\n {\n \"name\": \"\\\"pkna\\\"\",\n \"description\": \"Proportional Kana. Generally used only in Japanese fonts.\"\n },\n {\n \"name\": \"\\\"pnum\\\"\",\n \"description\": \"Proportional Figures.\"\n },\n {\n \"name\": \"\\\"pref\\\"\",\n \"description\": \"Pre-base Forms. Required in Khmer and Myanmar (Burmese) scripts and southern Indic scripts that may display a pre-base form of Ra.\"\n },\n {\n \"name\": \"\\\"pres\\\"\",\n \"description\": \"Pre-base Substitutions. Required in Indic scripts.\"\n },\n {\n \"name\": \"\\\"pstf\\\"\",\n \"description\": \"Post-base Forms. Required in scripts of south and southeast Asia that have post-base forms for consonants eg: Gurmukhi, Malayalam, Khmer.\"\n },\n {\n \"name\": \"\\\"psts\\\"\",\n \"description\": \"Post-base Substitutions.\"\n },\n {\n \"name\": \"\\\"pwid\\\"\",\n \"description\": \"Proportional Widths.\"\n },\n {\n \"name\": \"\\\"qwid\\\"\",\n \"description\": \"Quarter Widths. Generally used only in CJKV fonts.\"\n },\n {\n \"name\": \"\\\"rand\\\"\",\n \"description\": \"Randomize.\"\n },\n {\n \"name\": \"\\\"rclt\\\"\",\n \"description\": \"Required Contextual Alternates. May apply to any script, but is especially important for many styles of Arabic.\"\n },\n {\n \"name\": \"\\\"rlig\\\"\",\n \"description\": \"Required Ligatures. Applies to Arabic and Syriac. May apply to some other scripts.\"\n },\n {\n \"name\": \"\\\"rkrf\\\"\",\n \"description\": \"Rakar Forms. Required in Devanagari and Gujarati scripts.\"\n },\n {\n \"name\": \"\\\"rphf\\\"\",\n \"description\": \"Reph Form. Required in Indic scripts. E.g. Devanagari, Kannada.\"\n },\n {\n \"name\": \"\\\"rtbd\\\"\",\n \"description\": \"Right Bounds.\"\n },\n {\n \"name\": \"\\\"rtla\\\"\",\n \"description\": \"Right-to-left alternates.\"\n },\n {\n \"name\": \"\\\"rtlm\\\"\",\n \"description\": \"Right-to-left mirrored forms.\"\n },\n {\n \"name\": \"\\\"ruby\\\"\",\n \"description\": \"Ruby Notation Forms. Applies only to Japanese.\"\n },\n {\n \"name\": \"\\\"salt\\\"\",\n \"description\": \"Stylistic Alternates.\"\n },\n {\n \"name\": \"\\\"sinf\\\"\",\n \"description\": \"Scientific Inferiors.\"\n },\n {\n \"name\": \"\\\"size\\\"\",\n \"description\": \"Optical size.\"\n },\n {\n \"name\": \"\\\"smcp\\\"\",\n \"description\": \"Small Capitals. Applies only to bicameral scripts.\"\n },\n {\n \"name\": \"\\\"smpl\\\"\",\n \"description\": \"Simplified Forms. Applies only to Chinese and Japanese.\"\n },\n {\n \"name\": \"\\\"ssty\\\"\",\n \"description\": \"Math script style alternates.\"\n },\n {\n \"name\": \"\\\"stch\\\"\",\n \"description\": \"Stretching Glyph Decomposition.\"\n },\n {\n \"name\": \"\\\"subs\\\"\",\n \"description\": \"Subscript.\"\n },\n {\n \"name\": \"\\\"sups\\\"\",\n \"description\": \"Superscript.\"\n },\n {\n \"name\": \"\\\"swsh\\\"\",\n \"description\": \"Swash. Does not apply to ideographic scripts.\"\n },\n {\n \"name\": \"\\\"titl\\\"\",\n \"description\": \"Titling.\"\n },\n {\n \"name\": \"\\\"tjmo\\\"\",\n \"description\": \"Trailing Jamo Forms. Required for Hangul script when Ancient Hangul writing system is supported.\"\n },\n {\n \"name\": \"\\\"tnam\\\"\",\n \"description\": \"Traditional Name Forms. Applies only to Japanese.\"\n },\n {\n \"name\": \"\\\"tnum\\\"\",\n \"description\": \"Tabular Figures.\"\n },\n {\n \"name\": \"\\\"trad\\\"\",\n \"description\": \"Traditional Forms. Applies only to Chinese and Japanese.\"\n },\n {\n \"name\": \"\\\"twid\\\"\",\n \"description\": \"Third Widths. Generally used only in CJKV fonts.\"\n },\n {\n \"name\": \"\\\"unic\\\"\",\n \"description\": \"Unicase.\"\n },\n {\n \"name\": \"\\\"valt\\\"\",\n \"description\": \"Alternate Vertical Metrics. Applies only to scripts with vertical writing modes.\"\n },\n {\n \"name\": \"\\\"vatu\\\"\",\n \"description\": \"Vattu Variants. Used for Indic scripts. E.g. Devanagari.\"\n },\n {\n \"name\": \"\\\"vert\\\"\",\n \"description\": \"Vertical Alternates. Applies only to scripts with vertical writing modes.\"\n },\n {\n \"name\": \"\\\"vhal\\\"\",\n \"description\": \"Alternate Vertical Half Metrics. Used only in CJKV fonts.\"\n },\n {\n \"name\": \"\\\"vjmo\\\"\",\n \"description\": \"Vowel Jamo Forms. Required for Hangul script when Ancient Hangul writing system is supported.\"\n },\n {\n \"name\": \"\\\"vkna\\\"\",\n \"description\": \"Vertical Kana Alternates. Applies only to fonts that support kana (hiragana and katakana).\"\n },\n {\n \"name\": \"\\\"vkrn\\\"\",\n \"description\": \"Vertical Kerning.\"\n },\n {\n \"name\": \"\\\"vpal\\\"\",\n \"description\": \"Proportional Alternate Vertical Metrics. Used mostly in CJKV fonts.\"\n },\n {\n \"name\": \"\\\"vrt2\\\"\",\n \"description\": \"Vertical Alternates and Rotation. Applies only to scripts with vertical writing modes.\"\n },\n {\n \"name\": \"\\\"zero\\\"\",\n \"description\": \"Slashed Zero.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"No change in glyph substitution or positioning occurs.\"\n },\n {\n \"name\": \"off\",\n \"description\": \"Disable feature.\"\n },\n {\n \"name\": \"on\",\n \"description\": \"Enable feature.\"\n }\n ],\n \"syntax\": \"normal | <feature-tag-value>#\",\n \"relevance\": 59,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-feature-settings\"\n }\n ],\n \"description\": \"Provides low-level control over OpenType font features. It is intended as a way of providing access to font features that are not widely used but are needed for a particular use case.\",\n \"restrictions\": [\n \"string\",\n \"integer\"\n ]\n },\n {\n \"name\": \"font-kerning\",\n \"browsers\": [\n \"E79\",\n \"FF32\",\n \"S9\",\n \"C33\",\n \"O20\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Specifies that kerning is applied at the discretion of the user agent.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Specifies that kerning is not applied.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Specifies that kerning is applied.\"\n }\n ],\n \"syntax\": \"auto | normal | none\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-kerning\"\n }\n ],\n \"description\": \"Kerning is the contextual adjustment of inter-glyph spacing. This property controls metric kerning, kerning that utilizes adjustment data contained in the font.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-language-override\",\n \"browsers\": [\n \"FF34\"\n ],\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"Implies that when rendering with OpenType fonts the language of the document is used to infer the OpenType language system, used to select language specific features when rendering.\"\n }\n ],\n \"syntax\": \"normal | <string>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-language-override\"\n }\n ],\n \"description\": \"The value of 'normal' implies that when rendering with OpenType fonts the language of the document is used to infer the OpenType language system, used to select language specific features when rendering.\",\n \"restrictions\": [\n \"string\"\n ]\n },\n {\n \"name\": \"font-size\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE5.5\",\n \"O7\"\n ],\n \"values\": [\n {\n \"name\": \"large\"\n },\n {\n \"name\": \"larger\"\n },\n {\n \"name\": \"medium\"\n },\n {\n \"name\": \"small\"\n },\n {\n \"name\": \"smaller\"\n },\n {\n \"name\": \"x-large\"\n },\n {\n \"name\": \"x-small\"\n },\n {\n \"name\": \"xx-large\"\n },\n {\n \"name\": \"xx-small\"\n }\n ],\n \"syntax\": \"<absolute-size> | <relative-size> | <length-percentage>\",\n \"relevance\": 94,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-size\"\n }\n ],\n \"description\": \"Indicates the desired height of glyphs from the font. For scalable fonts, the font-size is a scale factor applied to the EM unit of the font. (Note that certain glyphs may bleed outside their EM box.) For non-scalable fonts, the font-size is converted into absolute units and matched against the declared font-size of the font, using the same absolute coordinate space for both of the matched values.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"font-size-adjust\",\n \"browsers\": [\n \"FF3\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Do not preserve the font's x-height.\"\n }\n ],\n \"syntax\": \"none | [ ex-height | cap-height | ch-width | ic-width | ic-height ]? [ from-font | <number> ]\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-size-adjust\"\n }\n ],\n \"description\": \"Preserves the readability of text when font fallback occurs by adjusting the font-size so that the x-height is the same regardless of the font used.\",\n \"restrictions\": [\n \"number\"\n ]\n },\n {\n \"name\": \"font-stretch\",\n \"browsers\": [\n \"E12\",\n \"FF9\",\n \"S11\",\n \"C60\",\n \"IE9\",\n \"O47\"\n ],\n \"values\": [\n {\n \"name\": \"condensed\"\n },\n {\n \"name\": \"expanded\"\n },\n {\n \"name\": \"extra-condensed\"\n },\n {\n \"name\": \"extra-expanded\"\n },\n {\n \"name\": \"narrower\",\n \"browsers\": [\n \"E12\",\n \"FF9\",\n \"S11\",\n \"C60\",\n \"IE9\",\n \"O47\"\n ],\n \"description\": \"Indicates a narrower value relative to the width of the parent element.\"\n },\n {\n \"name\": \"normal\"\n },\n {\n \"name\": \"semi-condensed\"\n },\n {\n \"name\": \"semi-expanded\"\n },\n {\n \"name\": \"ultra-condensed\"\n },\n {\n \"name\": \"ultra-expanded\"\n },\n {\n \"name\": \"wider\",\n \"browsers\": [\n \"E12\",\n \"FF9\",\n \"S11\",\n \"C60\",\n \"IE9\",\n \"O47\"\n ],\n \"description\": \"Indicates a wider value relative to the width of the parent element.\"\n }\n ],\n \"syntax\": \"<font-stretch-absolute>{1,2}\",\n \"relevance\": 56,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-stretch\"\n }\n ],\n \"description\": \"Selects a normal, condensed, or expanded face from a font family.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-style\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"values\": [\n {\n \"name\": \"italic\",\n \"description\": \"Selects a font that is labeled as an 'italic' face, or an 'oblique' face if one is not\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Selects a face that is classified as 'normal'.\"\n },\n {\n \"name\": \"oblique\",\n \"description\": \"Selects a font that is labeled as an 'oblique' face, or an 'italic' face if one is not.\"\n }\n ],\n \"syntax\": \"normal | italic | oblique <angle>{0,2}\",\n \"relevance\": 89,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-style\"\n }\n ],\n \"description\": \"Allows italic or oblique faces to be selected. Italic forms are generally cursive in nature while oblique faces are typically sloped versions of the regular face.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-synthesis\",\n \"browsers\": [\n \"E97\",\n \"FF34\",\n \"S9\",\n \"C97\",\n \"O83\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Disallow all synthetic faces.\"\n },\n {\n \"name\": \"style\",\n \"description\": \"Allow synthetic italic faces.\"\n },\n {\n \"name\": \"weight\",\n \"description\": \"Allow synthetic bold faces.\"\n }\n ],\n \"syntax\": \"none | [ weight || style || small-caps ]\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-synthesis\"\n }\n ],\n \"description\": \"Controls whether user agents are allowed to synthesize bold or oblique font faces when a font family lacks bold or italic faces.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-variant\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"Specifies a face that is not labeled as a small-caps font.\"\n },\n {\n \"name\": \"small-caps\",\n \"description\": \"Specifies a font that is labeled as a small-caps font. If a genuine small-caps font is not available, user agents should simulate a small-caps font.\"\n }\n ],\n \"syntax\": \"normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> || stylistic(<feature-value-name>) || historical-forms || styleset(<feature-value-name>#) || character-variant(<feature-value-name>#) || swash(<feature-value-name>) || ornaments(<feature-value-name>) || annotation(<feature-value-name>) || [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] || <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero || <east-asian-variant-values> || <east-asian-width-values> || ruby ]\",\n \"relevance\": 65,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-variant\"\n }\n ],\n \"description\": \"Specifies variant representations of the font\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-variant-alternates\",\n \"browsers\": [\n \"FF34\",\n \"S9.1\"\n ],\n \"values\": [\n {\n \"name\": \"annotation()\",\n \"description\": \"Enables display of alternate annotation forms.\"\n },\n {\n \"name\": \"character-variant()\",\n \"description\": \"Enables display of specific character variants.\"\n },\n {\n \"name\": \"historical-forms\",\n \"description\": \"Enables display of historical forms.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"None of the features are enabled.\"\n },\n {\n \"name\": \"ornaments()\",\n \"description\": \"Enables replacement of default glyphs with ornaments, if provided in the font.\"\n },\n {\n \"name\": \"styleset()\",\n \"description\": \"Enables display with stylistic sets.\"\n },\n {\n \"name\": \"stylistic()\",\n \"description\": \"Enables display of stylistic alternates.\"\n },\n {\n \"name\": \"swash()\",\n \"description\": \"Enables display of swash glyphs.\"\n }\n ],\n \"syntax\": \"normal | [ stylistic( <feature-value-name> ) || historical-forms || styleset( <feature-value-name># ) || character-variant( <feature-value-name># ) || swash( <feature-value-name> ) || ornaments( <feature-value-name> ) || annotation( <feature-value-name> ) ]\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates\"\n }\n ],\n \"description\": \"For any given character, fonts can provide a variety of alternate glyphs in addition to the default glyph for that character. This property provides control over the selection of these alternate glyphs.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-variant-caps\",\n \"browsers\": [\n \"E79\",\n \"FF34\",\n \"S9.1\",\n \"C52\",\n \"O39\"\n ],\n \"values\": [\n {\n \"name\": \"all-petite-caps\",\n \"description\": \"Enables display of petite capitals for both upper and lowercase letters.\"\n },\n {\n \"name\": \"all-small-caps\",\n \"description\": \"Enables display of small capitals for both upper and lowercase letters.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"None of the features are enabled.\"\n },\n {\n \"name\": \"petite-caps\",\n \"description\": \"Enables display of petite capitals.\"\n },\n {\n \"name\": \"small-caps\",\n \"description\": \"Enables display of small capitals. Small-caps glyphs typically use the form of uppercase letters but are reduced to the size of lowercase letters.\"\n },\n {\n \"name\": \"titling-caps\",\n \"description\": \"Enables display of titling capitals.\"\n },\n {\n \"name\": \"unicase\",\n \"description\": \"Enables display of mixture of small capitals for uppercase letters with normal lowercase letters.\"\n }\n ],\n \"syntax\": \"normal | small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-variant-caps\"\n }\n ],\n \"description\": \"Specifies control over capitalized forms.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-variant-east-asian\",\n \"browsers\": [\n \"E79\",\n \"FF34\",\n \"S9.1\",\n \"C63\",\n \"O50\"\n ],\n \"values\": [\n {\n \"name\": \"full-width\",\n \"description\": \"Enables rendering of full-width variants.\"\n },\n {\n \"name\": \"jis04\",\n \"description\": \"Enables rendering of JIS04 forms.\"\n },\n {\n \"name\": \"jis78\",\n \"description\": \"Enables rendering of JIS78 forms.\"\n },\n {\n \"name\": \"jis83\",\n \"description\": \"Enables rendering of JIS83 forms.\"\n },\n {\n \"name\": \"jis90\",\n \"description\": \"Enables rendering of JIS90 forms.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"None of the features are enabled.\"\n },\n {\n \"name\": \"proportional-width\",\n \"description\": \"Enables rendering of proportionally-spaced variants.\"\n },\n {\n \"name\": \"ruby\",\n \"description\": \"Enables display of ruby variant glyphs.\"\n },\n {\n \"name\": \"simplified\",\n \"description\": \"Enables rendering of simplified forms.\"\n },\n {\n \"name\": \"traditional\",\n \"description\": \"Enables rendering of traditional forms.\"\n }\n ],\n \"syntax\": \"normal | [ <east-asian-variant-values> || <east-asian-width-values> || ruby ]\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-variant-east-asian\"\n }\n ],\n \"description\": \"Allows control of glyph substitute and positioning in East Asian text.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-variant-ligatures\",\n \"browsers\": [\n \"E79\",\n \"FF34\",\n \"S9.1\",\n \"C34\",\n \"O21\"\n ],\n \"values\": [\n {\n \"name\": \"additional-ligatures\",\n \"description\": \"Enables display of additional ligatures.\"\n },\n {\n \"name\": \"common-ligatures\",\n \"description\": \"Enables display of common ligatures.\"\n },\n {\n \"name\": \"contextual\",\n \"browsers\": [\n \"E79\",\n \"FF34\",\n \"S9.1\",\n \"C34\",\n \"O21\"\n ],\n \"description\": \"Enables display of contextual alternates.\"\n },\n {\n \"name\": \"discretionary-ligatures\",\n \"description\": \"Enables display of discretionary ligatures.\"\n },\n {\n \"name\": \"historical-ligatures\",\n \"description\": \"Enables display of historical ligatures.\"\n },\n {\n \"name\": \"no-additional-ligatures\",\n \"description\": \"Disables display of additional ligatures.\"\n },\n {\n \"name\": \"no-common-ligatures\",\n \"description\": \"Disables display of common ligatures.\"\n },\n {\n \"name\": \"no-contextual\",\n \"browsers\": [\n \"E79\",\n \"FF34\",\n \"S9.1\",\n \"C34\",\n \"O21\"\n ],\n \"description\": \"Disables display of contextual alternates.\"\n },\n {\n \"name\": \"no-discretionary-ligatures\",\n \"description\": \"Disables display of discretionary ligatures.\"\n },\n {\n \"name\": \"no-historical-ligatures\",\n \"description\": \"Disables display of historical ligatures.\"\n },\n {\n \"name\": \"none\",\n \"browsers\": [\n \"E79\",\n \"FF34\",\n \"S9.1\",\n \"C34\",\n \"O21\"\n ],\n \"description\": \"Disables all ligatures.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Implies that the defaults set by the font are used.\"\n }\n ],\n \"syntax\": \"normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> ]\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-variant-ligatures\"\n }\n ],\n \"description\": \"Specifies control over which ligatures are enabled or disabled. A value of 'normal' implies that the defaults set by the font are used.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-variant-numeric\",\n \"browsers\": [\n \"E79\",\n \"FF34\",\n \"S9.1\",\n \"C52\",\n \"O39\"\n ],\n \"values\": [\n {\n \"name\": \"diagonal-fractions\",\n \"description\": \"Enables display of lining diagonal fractions.\"\n },\n {\n \"name\": \"lining-nums\",\n \"description\": \"Enables display of lining numerals.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"None of the features are enabled.\"\n },\n {\n \"name\": \"oldstyle-nums\",\n \"description\": \"Enables display of old-style numerals.\"\n },\n {\n \"name\": \"ordinal\",\n \"description\": \"Enables display of letter forms used with ordinal numbers.\"\n },\n {\n \"name\": \"proportional-nums\",\n \"description\": \"Enables display of proportional numerals.\"\n },\n {\n \"name\": \"slashed-zero\",\n \"description\": \"Enables display of slashed zeros.\"\n },\n {\n \"name\": \"stacked-fractions\",\n \"description\": \"Enables display of lining stacked fractions.\"\n },\n {\n \"name\": \"tabular-nums\",\n \"description\": \"Enables display of tabular numerals.\"\n }\n ],\n \"syntax\": \"normal | [ <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero ]\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-variant-numeric\"\n }\n ],\n \"description\": \"Specifies control over numerical forms.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-variant-position\",\n \"browsers\": [\n \"FF34\",\n \"S9.1\"\n ],\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"None of the features are enabled.\"\n },\n {\n \"name\": \"sub\",\n \"description\": \"Enables display of subscript variants (OpenType feature: subs).\"\n },\n {\n \"name\": \"super\",\n \"description\": \"Enables display of superscript variants (OpenType feature: sups).\"\n }\n ],\n \"syntax\": \"normal | sub | super\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-variant-position\"\n }\n ],\n \"description\": \"Specifies the vertical position\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-weight\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C2\",\n \"IE3\",\n \"O3.5\"\n ],\n \"values\": [\n {\n \"name\": \"100\",\n \"description\": \"Thin\"\n },\n {\n \"name\": \"200\",\n \"description\": \"Extra Light (Ultra Light)\"\n },\n {\n \"name\": \"300\",\n \"description\": \"Light\"\n },\n {\n \"name\": \"400\",\n \"description\": \"Normal\"\n },\n {\n \"name\": \"500\",\n \"description\": \"Medium\"\n },\n {\n \"name\": \"600\",\n \"description\": \"Semi Bold (Demi Bold)\"\n },\n {\n \"name\": \"700\",\n \"description\": \"Bold\"\n },\n {\n \"name\": \"800\",\n \"description\": \"Extra Bold (Ultra Bold)\"\n },\n {\n \"name\": \"900\",\n \"description\": \"Black (Heavy)\"\n },\n {\n \"name\": \"bold\",\n \"description\": \"Same as 700\"\n },\n {\n \"name\": \"bolder\",\n \"description\": \"Specifies the weight of the face bolder than the inherited value.\"\n },\n {\n \"name\": \"lighter\",\n \"description\": \"Specifies the weight of the face lighter than the inherited value.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Same as 400\"\n }\n ],\n \"syntax\": \"<font-weight-absolute>{1,2}\",\n \"relevance\": 94,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-weight\"\n }\n ],\n \"description\": \"Specifies weight of glyphs in the font, their degree of blackness or stroke thickness.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"glyph-orientation-horizontal\",\n \"relevance\": 50,\n \"description\": \"Controls glyph orientation when the inline-progression-direction is horizontal.\",\n \"restrictions\": [\n \"angle\",\n \"number\"\n ]\n },\n {\n \"name\": \"glyph-orientation-vertical\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Sets the orientation based on the fullwidth or non-fullwidth characters and the most common orientation.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Controls glyph orientation when the inline-progression-direction is vertical.\",\n \"restrictions\": [\n \"angle\",\n \"number\",\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-area\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The property contributes nothing to the grid item's placement, indicating auto-placement, an automatic span, or a default span of one.\"\n },\n {\n \"name\": \"span\",\n \"description\": \"Contributes a grid span to the grid item's placement such that the corresponding edge of the grid item's grid area is N lines from its opposite edge.\"\n }\n ],\n \"syntax\": \"<grid-line> [ / <grid-line> ]{0,3}\",\n \"relevance\": 56,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-area\"\n }\n ],\n \"description\": \"Determine a grid item's size and location within the grid by contributing a line, a span, or nothing (automatic) to its grid placement. Shorthand for 'grid-row-start', 'grid-column-start', 'grid-row-end', and 'grid-column-end'.\",\n \"restrictions\": [\n \"identifier\",\n \"integer\"\n ]\n },\n {\n \"name\": \"grid\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"syntax\": \"<'grid-template'> | <'grid-template-rows'> / [ auto-flow && dense? ] <'grid-auto-columns'>? | [ auto-flow && dense? ] <'grid-auto-rows'>? / <'grid-template-columns'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid\"\n }\n ],\n \"description\": \"The grid CSS property is a shorthand property that sets all of the explicit grid properties ('grid-template-rows', 'grid-template-columns', and 'grid-template-areas'), and all the implicit grid properties ('grid-auto-rows', 'grid-auto-columns', and 'grid-auto-flow'), in a single declaration.\",\n \"restrictions\": [\n \"identifier\",\n \"length\",\n \"percentage\",\n \"string\",\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-auto-columns\",\n \"browsers\": [\n \"E16\",\n \"FF70\",\n \"S10.1\",\n \"C57\",\n \"IE10\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"min-content\",\n \"description\": \"Represents the largest min-content contribution of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"max-content\",\n \"description\": \"Represents the largest max-content contribution of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"As a maximum, identical to 'max-content'. As a minimum, represents the largest minimum size (as specified by min-width/min-height) of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"minmax()\",\n \"description\": \"Defines a size range greater than or equal to min and less than or equal to max.\"\n }\n ],\n \"syntax\": \"<track-size>+\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-auto-columns\"\n }\n ],\n \"description\": \"Specifies the size of implicitly created columns.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"grid-auto-flow\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"row\",\n \"description\": \"The auto-placement algorithm places items by filling each row in turn, adding new rows as necessary.\"\n },\n {\n \"name\": \"column\",\n \"description\": \"The auto-placement algorithm places items by filling each column in turn, adding new columns as necessary.\"\n },\n {\n \"name\": \"dense\",\n \"description\": \"If specified, the auto-placement algorithm uses a \\\"dense\\\" packing algorithm, which attempts to fill in holes earlier in the grid if smaller items come up later.\"\n }\n ],\n \"syntax\": \"[ row | column ] || dense\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-auto-flow\"\n }\n ],\n \"description\": \"Controls how the auto-placement algorithm works, specifying exactly how auto-placed items get flowed into the grid.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-auto-rows\",\n \"browsers\": [\n \"E16\",\n \"FF70\",\n \"S10.1\",\n \"C57\",\n \"IE10\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"min-content\",\n \"description\": \"Represents the largest min-content contribution of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"max-content\",\n \"description\": \"Represents the largest max-content contribution of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"As a maximum, identical to 'max-content'. As a minimum, represents the largest minimum size (as specified by min-width/min-height) of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"minmax()\",\n \"description\": \"Defines a size range greater than or equal to min and less than or equal to max.\"\n }\n ],\n \"syntax\": \"<track-size>+\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-auto-rows\"\n }\n ],\n \"description\": \"Specifies the size of implicitly created rows.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"grid-column\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The property contributes nothing to the grid item's placement, indicating auto-placement, an automatic span, or a default span of one.\"\n },\n {\n \"name\": \"span\",\n \"description\": \"Contributes a grid span to the grid item's placement such that the corresponding edge of the grid item's grid area is N lines from its opposite edge.\"\n }\n ],\n \"syntax\": \"<grid-line> [ / <grid-line> ]?\",\n \"relevance\": 54,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-column\"\n }\n ],\n \"description\": \"Shorthand for 'grid-column-start' and 'grid-column-end'.\",\n \"restrictions\": [\n \"identifier\",\n \"integer\",\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-column-end\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The property contributes nothing to the grid item's placement, indicating auto-placement, an automatic span, or a default span of one.\"\n },\n {\n \"name\": \"span\",\n \"description\": \"Contributes a grid span to the grid item's placement such that the corresponding edge of the grid item's grid area is N lines from its opposite edge.\"\n }\n ],\n \"syntax\": \"<grid-line>\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-column-end\"\n }\n ],\n \"description\": \"Determine a grid item's size and location within the grid by contributing a line, a span, or nothing (automatic) to its grid placement.\",\n \"restrictions\": [\n \"identifier\",\n \"integer\",\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-column-gap\",\n \"browsers\": [\n \"FF52\",\n \"C57\",\n \"S10.1\",\n \"O44\"\n ],\n \"status\": \"obsolete\",\n \"syntax\": \"<length-percentage>\",\n \"relevance\": 3,\n \"description\": \"Specifies the gutters between grid columns. Replaced by 'column-gap' property.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"grid-column-start\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The property contributes nothing to the grid item's placement, indicating auto-placement, an automatic span, or a default span of one.\"\n },\n {\n \"name\": \"span\",\n \"description\": \"Contributes a grid span to the grid item's placement such that the corresponding edge of the grid item's grid area is N lines from its opposite edge.\"\n }\n ],\n \"syntax\": \"<grid-line>\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-column-start\"\n }\n ],\n \"description\": \"Determine a grid item's size and location within the grid by contributing a line, a span, or nothing (automatic) to its grid placement.\",\n \"restrictions\": [\n \"identifier\",\n \"integer\",\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-gap\",\n \"browsers\": [\n \"FF52\",\n \"C57\",\n \"S10.1\",\n \"O44\"\n ],\n \"status\": \"obsolete\",\n \"syntax\": \"<'grid-row-gap'> <'grid-column-gap'>?\",\n \"relevance\": 4,\n \"description\": \"Shorthand that specifies the gutters between grid columns and grid rows in one declaration. Replaced by 'gap' property.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"grid-row\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The property contributes nothing to the grid item's placement, indicating auto-placement, an automatic span, or a default span of one.\"\n },\n {\n \"name\": \"span\",\n \"description\": \"Contributes a grid span to the grid item's placement such that the corresponding edge of the grid item's grid area is N lines from its opposite edge.\"\n }\n ],\n \"syntax\": \"<grid-line> [ / <grid-line> ]?\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-row\"\n }\n ],\n \"description\": \"Shorthand for 'grid-row-start' and 'grid-row-end'.\",\n \"restrictions\": [\n \"identifier\",\n \"integer\",\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-row-end\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The property contributes nothing to the grid item's placement, indicating auto-placement, an automatic span, or a default span of one.\"\n },\n {\n \"name\": \"span\",\n \"description\": \"Contributes a grid span to the grid item's placement such that the corresponding edge of the grid item's grid area is N lines from its opposite edge.\"\n }\n ],\n \"syntax\": \"<grid-line>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-row-end\"\n }\n ],\n \"description\": \"Determine a grid item's size and location within the grid by contributing a line, a span, or nothing (automatic) to its grid placement.\",\n \"restrictions\": [\n \"identifier\",\n \"integer\",\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-row-gap\",\n \"browsers\": [\n \"FF52\",\n \"C57\",\n \"S10.1\",\n \"O44\"\n ],\n \"status\": \"obsolete\",\n \"syntax\": \"<length-percentage>\",\n \"relevance\": 2,\n \"description\": \"Specifies the gutters between grid rows. Replaced by 'row-gap' property.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"grid-row-start\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The property contributes nothing to the grid item's placement, indicating auto-placement, an automatic span, or a default span of one.\"\n },\n {\n \"name\": \"span\",\n \"description\": \"Contributes a grid span to the grid item's placement such that the corresponding edge of the grid item's grid area is N lines from its opposite edge.\"\n }\n ],\n \"syntax\": \"<grid-line>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-row-start\"\n }\n ],\n \"description\": \"Determine a grid item's size and location within the grid by contributing a line, a span, or nothing (automatic) to its grid placement.\",\n \"restrictions\": [\n \"identifier\",\n \"integer\",\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-template\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Sets all three properties to their initial values.\"\n },\n {\n \"name\": \"min-content\",\n \"description\": \"Represents the largest min-content contribution of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"max-content\",\n \"description\": \"Represents the largest max-content contribution of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"As a maximum, identical to 'max-content'. As a minimum, represents the largest minimum size (as specified by min-width/min-height) of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"subgrid\",\n \"description\": \"Sets 'grid-template-rows' and 'grid-template-columns' to 'subgrid', and 'grid-template-areas' to its initial value.\"\n },\n {\n \"name\": \"minmax()\",\n \"description\": \"Defines a size range greater than or equal to min and less than or equal to max.\"\n },\n {\n \"name\": \"repeat()\",\n \"description\": \"Represents a repeated fragment of the track list, allowing a large number of columns or rows that exhibit a recurring pattern to be written in a more compact form.\"\n }\n ],\n \"syntax\": \"none | [ <'grid-template-rows'> / <'grid-template-columns'> ] | [ <line-names>? <string> <track-size>? <line-names>? ]+ [ / <explicit-track-list> ]?\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-template\"\n }\n ],\n \"description\": \"Shorthand for setting grid-template-columns, grid-template-rows, and grid-template-areas in a single declaration.\",\n \"restrictions\": [\n \"identifier\",\n \"length\",\n \"percentage\",\n \"string\",\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-template-areas\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The grid container doesn't define any named grid areas.\"\n }\n ],\n \"syntax\": \"none | <string>+\",\n \"relevance\": 54,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-template-areas\"\n }\n ],\n \"description\": \"Specifies named grid areas, which are not associated with any particular grid item, but can be referenced from the grid-placement properties.\",\n \"restrictions\": [\n \"string\"\n ]\n },\n {\n \"name\": \"grid-template-columns\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"IE10\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"There is no explicit grid; any rows/columns will be implicitly generated.\"\n },\n {\n \"name\": \"min-content\",\n \"description\": \"Represents the largest min-content contribution of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"max-content\",\n \"description\": \"Represents the largest max-content contribution of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"As a maximum, identical to 'max-content'. As a minimum, represents the largest minimum size (as specified by min-width/min-height) of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"subgrid\",\n \"description\": \"Indicates that the grid will align to its parent grid in that axis.\"\n },\n {\n \"name\": \"minmax()\",\n \"description\": \"Defines a size range greater than or equal to min and less than or equal to max.\"\n },\n {\n \"name\": \"repeat()\",\n \"description\": \"Represents a repeated fragment of the track list, allowing a large number of columns or rows that exhibit a recurring pattern to be written in a more compact form.\"\n }\n ],\n \"syntax\": \"none | <track-list> | <auto-track-list> | subgrid <line-name-list>?\",\n \"relevance\": 60,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-template-columns\"\n }\n ],\n \"description\": \"specifies, as a space-separated track list, the line names and track sizing functions of the grid.\",\n \"restrictions\": [\n \"identifier\",\n \"length\",\n \"percentage\",\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-template-rows\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"IE10\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"There is no explicit grid; any rows/columns will be implicitly generated.\"\n },\n {\n \"name\": \"min-content\",\n \"description\": \"Represents the largest min-content contribution of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"max-content\",\n \"description\": \"Represents the largest max-content contribution of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"As a maximum, identical to 'max-content'. As a minimum, represents the largest minimum size (as specified by min-width/min-height) of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"subgrid\",\n \"description\": \"Indicates that the grid will align to its parent grid in that axis.\"\n },\n {\n \"name\": \"minmax()\",\n \"description\": \"Defines a size range greater than or equal to min and less than or equal to max.\"\n },\n {\n \"name\": \"repeat()\",\n \"description\": \"Represents a repeated fragment of the track list, allowing a large number of columns or rows that exhibit a recurring pattern to be written in a more compact form.\"\n }\n ],\n \"syntax\": \"none | <track-list> | <auto-track-list> | subgrid <line-name-list>?\",\n \"relevance\": 54,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-template-rows\"\n }\n ],\n \"description\": \"specifies, as a space-separated track list, the line names and track sizing functions of the grid.\",\n \"restrictions\": [\n \"identifier\",\n \"length\",\n \"percentage\",\n \"string\",\n \"enum\"\n ]\n },\n {\n \"name\": \"height\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The height depends on the values of other properties.\"\n },\n {\n \"name\": \"fit-content\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Use the fit-content inline size or fit-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"max-content\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Use the max-content inline size or max-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"min-content\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Use the min-content inline size or min-content block size, as appropriate to the writing mode.\"\n }\n ],\n \"syntax\": \"<viewport-length>{1,2}\",\n \"relevance\": 96,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/height\"\n }\n ],\n \"description\": \"Specifies the height of the content area, padding area or border area (depending on 'box-sizing') of certain boxes.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"hyphens\",\n \"browsers\": [\n \"E79\",\n \"FF43\",\n \"S5.1\",\n \"C55\",\n \"IE10\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Conditional hyphenation characters inside a word, if present, take priority over automatic resources when determining hyphenation points within the word.\"\n },\n {\n \"name\": \"manual\",\n \"description\": \"Words are only broken at line breaks where there are characters inside the word that suggest line break opportunities\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Words are not broken at line breaks, even if characters inside the word suggest line break points.\"\n }\n ],\n \"syntax\": \"none | manual | auto\",\n \"relevance\": 57,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/hyphens\"\n }\n ],\n \"description\": \"Controls whether hyphenation is allowed to create more break opportunities within a line of text.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"image-orientation\",\n \"browsers\": [\n \"E81\",\n \"FF26\",\n \"S13.1\",\n \"C81\",\n \"O67\"\n ],\n \"values\": [\n {\n \"name\": \"flip\",\n \"description\": \"After rotating by the precededing angle, the image is flipped horizontally. Defaults to 0deg if the angle is ommitted.\"\n },\n {\n \"name\": \"from-image\",\n \"description\": \"If the image has an orientation specified in its metadata, such as EXIF, this value computes to the angle that the metadata specifies is necessary to correctly orient the image.\"\n }\n ],\n \"syntax\": \"from-image | <angle> | [ <angle>? flip ]\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/image-orientation\"\n }\n ],\n \"description\": \"Specifies an orthogonal rotation to be applied to an image before it is laid out.\",\n \"restrictions\": [\n \"angle\"\n ]\n },\n {\n \"name\": \"image-rendering\",\n \"browsers\": [\n \"E79\",\n \"FF3.6\",\n \"S6\",\n \"C13\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The image should be scaled with an algorithm that maximizes the appearance of the image.\"\n },\n {\n \"name\": \"crisp-edges\",\n \"description\": \"The image must be scaled with an algorithm that preserves contrast and edges in the image, and which does not smooth colors or introduce blur to the image in the process.\"\n },\n {\n \"name\": \"-moz-crisp-edges\",\n \"browsers\": [\n \"E79\",\n \"FF3.6\",\n \"S6\",\n \"C13\",\n \"O15\"\n ]\n },\n {\n \"name\": \"optimizeQuality\",\n \"description\": \"Deprecated.\"\n },\n {\n \"name\": \"optimizeSpeed\",\n \"description\": \"Deprecated.\"\n },\n {\n \"name\": \"pixelated\",\n \"description\": \"When scaling the image up, the 'nearest neighbor' or similar algorithm must be used, so that the image appears to be simply composed of very large pixels.\"\n }\n ],\n \"syntax\": \"auto | crisp-edges | pixelated\",\n \"relevance\": 55,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/image-rendering\"\n }\n ],\n \"description\": \"Provides a hint to the user-agent about what aspects of an image are most important to preserve when the image is scaled, to aid the user-agent in the choice of an appropriate scaling algorithm.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"ime-mode\",\n \"browsers\": [\n \"E12\",\n \"FF3\",\n \"IE5\"\n ],\n \"values\": [\n {\n \"name\": \"active\",\n \"description\": \"The input method editor is initially active; text entry is performed using it unless the user specifically dismisses it.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"No change is made to the current input method editor state. This is the default.\"\n },\n {\n \"name\": \"disabled\",\n \"description\": \"The input method editor is disabled and may not be activated by the user.\"\n },\n {\n \"name\": \"inactive\",\n \"description\": \"The input method editor is initially inactive, but the user may activate it if they wish.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"The IME state should be normal; this value can be used in a user style sheet to override the page setting.\"\n }\n ],\n \"status\": \"obsolete\",\n \"syntax\": \"auto | normal | active | inactive | disabled\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/ime-mode\"\n }\n ],\n \"description\": \"Controls the state of the input method editor for text fields.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"inline-size\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Depends on the values of other properties.\"\n }\n ],\n \"syntax\": \"<'width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/inline-size\"\n }\n ],\n \"description\": \"Size of an element in the direction specified by 'writing-mode'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"isolation\",\n \"browsers\": [\n \"E79\",\n \"FF36\",\n \"S8\",\n \"C41\",\n \"O30\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Elements are not isolated unless an operation is applied that causes the creation of a stacking context.\"\n },\n {\n \"name\": \"isolate\",\n \"description\": \"In CSS will turn the element into a stacking context.\"\n }\n ],\n \"syntax\": \"auto | isolate\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/isolation\"\n }\n ],\n \"description\": \"In CSS setting to 'isolate' will turn the element into a stacking context. In SVG, it defines whether an element is isolated or not.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"justify-content\",\n \"browsers\": [\n \"E12\",\n \"FF20\",\n \"S9\",\n \"C29\",\n \"IE11\",\n \"O12.1\"\n ],\n \"values\": [\n {\n \"name\": \"center\",\n \"description\": \"Flex items are packed toward the center of the line.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"The items are packed flush to each other toward the start edge of the alignment container in the main axis.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"The items are packed flush to each other toward the end edge of the alignment container in the main axis.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"The items are packed flush to each other toward the left edge of the alignment container in the main axis.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"The items are packed flush to each other toward the right edge of the alignment container in the main axis.\"\n },\n {\n \"name\": \"safe\",\n \"description\": \"If the size of the item overflows the alignment container, the item is instead aligned as if the alignment mode were start.\"\n },\n {\n \"name\": \"unsafe\",\n \"description\": \"Regardless of the relative sizes of the item and alignment container, the given alignment value is honored.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"If the combined size of the alignment subjects is less than the size of the alignment container, any auto-sized alignment subjects have their size increased equally (not proportionally), while still respecting the constraints imposed by max-height/max-width (or equivalent functionality), so that the combined size exactly fills the alignment container.\"\n },\n {\n \"name\": \"space-evenly\",\n \"description\": \"The items are evenly distributed within the alignment container along the main axis.\"\n },\n {\n \"name\": \"flex-end\",\n \"description\": \"Flex items are packed toward the end of the line.\"\n },\n {\n \"name\": \"flex-start\",\n \"description\": \"Flex items are packed toward the start of the line.\"\n },\n {\n \"name\": \"space-around\",\n \"description\": \"Flex items are evenly distributed in the line, with half-size spaces on either end.\"\n },\n {\n \"name\": \"space-between\",\n \"description\": \"Flex items are evenly distributed in the line.\"\n },\n {\n \"name\": \"baseline\",\n \"description\": \"Specifies participation in first-baseline alignment.\"\n },\n {\n \"name\": \"first baseline\",\n \"description\": \"Specifies participation in first-baseline alignment.\"\n },\n {\n \"name\": \"last baseline\",\n \"description\": \"Specifies participation in last-baseline alignment.\"\n }\n ],\n \"syntax\": \"normal | <content-distribution> | <overflow-position>? [ <content-position> | left | right ]\",\n \"relevance\": 86,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/justify-content\"\n }\n ],\n \"description\": \"Aligns flex items along the main axis of the current line of the flex container.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"kerning\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Indicates that the user agent should adjust inter-glyph spacing based on kerning tables that are included in the font that will be used.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Indicates whether the user agent should adjust inter-glyph spacing based on kerning tables that are included in the relevant font or instead disable auto-kerning and set inter-character spacing to a specific length.\",\n \"restrictions\": [\n \"length\",\n \"enum\"\n ]\n },\n {\n \"name\": \"left\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE5.5\",\n \"O5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well\"\n }\n ],\n \"syntax\": \"<length> | <percentage> | auto\",\n \"relevance\": 95,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/left\"\n }\n ],\n \"description\": \"Specifies how far an absolutely positioned box's left margin edge is offset to the right of the left edge of the box's 'containing block'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"letter-spacing\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"The spacing is the normal spacing for the current font. It is typically zero-length.\"\n }\n ],\n \"syntax\": \"normal | <length>\",\n \"relevance\": 82,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/letter-spacing\"\n }\n ],\n \"description\": \"Specifies the minimum, maximum, and optimal spacing between grapheme clusters.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"lighting-color\",\n \"browsers\": [\n \"E\",\n \"C5\",\n \"FF3\",\n \"IE10\",\n \"O9\",\n \"S6\"\n ],\n \"relevance\": 50,\n \"description\": \"Defines the color of the light source for filter primitives 'feDiffuseLighting' and 'feSpecularLighting'.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"line-break\",\n \"browsers\": [\n \"E14\",\n \"FF69\",\n \"S11\",\n \"C58\",\n \"IE5.5\",\n \"O45\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The UA determines the set of line-breaking restrictions to use for CJK scripts, and it may vary the restrictions based on the length of the line; e.g., use a less restrictive set of line-break rules for short lines.\"\n },\n {\n \"name\": \"loose\",\n \"description\": \"Breaks text using the least restrictive set of line-breaking rules. Typically used for short lines, such as in newspapers.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Breaks text using the most common set of line-breaking rules.\"\n },\n {\n \"name\": \"strict\",\n \"description\": \"Breaks CJK scripts using a more restrictive set of line-breaking rules than 'normal'.\"\n },\n {\n \"name\": \"anywhere\",\n \"description\": \"There is a soft wrap opportunity around every typographic character unit, including around any punctuation character or preserved white spaces, or in the middle of words, disregarding any prohibition against line breaks, even those introduced by characters with the GL, WJ, or ZWJ line breaking classes or mandated by the word-break property.\"\n }\n ],\n \"syntax\": \"auto | loose | normal | strict | anywhere\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/line-break\"\n }\n ],\n \"description\": \"Specifies what set of line breaking restrictions are in effect within the element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"line-height\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"Tells user agents to set the computed value to a 'reasonable' value based on the font size of the element.\"\n }\n ],\n \"syntax\": \"normal | <number> | <length> | <percentage>\",\n \"relevance\": 93,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/line-height\"\n }\n ],\n \"description\": \"Determines the block-progression dimension of the text content area of an inline box.\",\n \"restrictions\": [\n \"number\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"list-style\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"values\": [\n {\n \"name\": \"armenian\"\n },\n {\n \"name\": \"circle\",\n \"description\": \"A hollow circle.\"\n },\n {\n \"name\": \"decimal\"\n },\n {\n \"name\": \"decimal-leading-zero\"\n },\n {\n \"name\": \"disc\",\n \"description\": \"A filled circle.\"\n },\n {\n \"name\": \"georgian\"\n },\n {\n \"name\": \"inside\",\n \"description\": \"The marker box is outside the principal block box, as described in the section on the ::marker pseudo-element below.\"\n },\n {\n \"name\": \"lower-alpha\"\n },\n {\n \"name\": \"lower-greek\"\n },\n {\n \"name\": \"lower-latin\"\n },\n {\n \"name\": \"lower-roman\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"outside\",\n \"description\": \"The ::marker pseudo-element is an inline element placed immediately before all ::before pseudo-elements in the principal block box, after which the element's content flows.\"\n },\n {\n \"name\": \"square\",\n \"description\": \"A filled square.\"\n },\n {\n \"name\": \"symbols()\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Allows a counter style to be defined inline.\"\n },\n {\n \"name\": \"upper-alpha\"\n },\n {\n \"name\": \"upper-latin\"\n },\n {\n \"name\": \"upper-roman\"\n },\n {\n \"name\": \"url()\"\n }\n ],\n \"syntax\": \"<'list-style-type'> || <'list-style-position'> || <'list-style-image'>\",\n \"relevance\": 85,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/list-style\"\n }\n ],\n \"description\": \"Shorthand for setting 'list-style-type', 'list-style-position' and 'list-style-image'\",\n \"restrictions\": [\n \"image\",\n \"enum\",\n \"url\"\n ]\n },\n {\n \"name\": \"list-style-image\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The default contents of the of the list item's marker are given by 'list-style-type' instead.\"\n }\n ],\n \"syntax\": \"<image> | none\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/list-style-image\"\n }\n ],\n \"description\": \"Sets the image that will be used as the list item marker. When the image is available, it will replace the marker set with the 'list-style-type' marker.\",\n \"restrictions\": [\n \"image\"\n ]\n },\n {\n \"name\": \"list-style-position\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"values\": [\n {\n \"name\": \"inside\",\n \"description\": \"The marker box is outside the principal block box, as described in the section on the ::marker pseudo-element below.\"\n },\n {\n \"name\": \"outside\",\n \"description\": \"The ::marker pseudo-element is an inline element placed immediately before all ::before pseudo-elements in the principal block box, after which the element's content flows.\"\n }\n ],\n \"syntax\": \"inside | outside\",\n \"relevance\": 55,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/list-style-position\"\n }\n ],\n \"description\": \"Specifies the position of the '::marker' pseudo-element's box in the list item.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"list-style-type\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"values\": [\n {\n \"name\": \"armenian\",\n \"description\": \"Traditional uppercase Armenian numbering.\"\n },\n {\n \"name\": \"circle\",\n \"description\": \"A hollow circle.\"\n },\n {\n \"name\": \"decimal\",\n \"description\": \"Western decimal numbers.\"\n },\n {\n \"name\": \"decimal-leading-zero\",\n \"description\": \"Decimal numbers padded by initial zeros.\"\n },\n {\n \"name\": \"disc\",\n \"description\": \"A filled circle.\"\n },\n {\n \"name\": \"georgian\",\n \"description\": \"Traditional Georgian numbering.\"\n },\n {\n \"name\": \"lower-alpha\",\n \"description\": \"Lowercase ASCII letters.\"\n },\n {\n \"name\": \"lower-greek\",\n \"description\": \"Lowercase classical Greek.\"\n },\n {\n \"name\": \"lower-latin\",\n \"description\": \"Lowercase ASCII letters.\"\n },\n {\n \"name\": \"lower-roman\",\n \"description\": \"Lowercase ASCII Roman numerals.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No marker\"\n },\n {\n \"name\": \"square\",\n \"description\": \"A filled square.\"\n },\n {\n \"name\": \"symbols()\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"description\": \"Allows a counter style to be defined inline.\"\n },\n {\n \"name\": \"upper-alpha\",\n \"description\": \"Uppercase ASCII letters.\"\n },\n {\n \"name\": \"upper-latin\",\n \"description\": \"Uppercase ASCII letters.\"\n },\n {\n \"name\": \"upper-roman\",\n \"description\": \"Uppercase ASCII Roman numerals.\"\n }\n ],\n \"syntax\": \"<counter-style> | <string> | none\",\n \"relevance\": 75,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/list-style-type\"\n }\n ],\n \"description\": \"Used to construct the default contents of a list item's marker\",\n \"restrictions\": [\n \"enum\",\n \"string\"\n ]\n },\n {\n \"name\": \"margin\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE3\",\n \"O3.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"syntax\": \"[ <length> | <percentage> | auto ]{1,4}\",\n \"relevance\": 96,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin\"\n }\n ],\n \"description\": \"Shorthand property to set values for the thickness of the margin area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. Negative values for margin properties are allowed, but there may be implementation-specific limits.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"margin-block-end\",\n \"browsers\": [\n \"E87\",\n \"FF41\",\n \"S12.1\",\n \"C87\",\n \"O73\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"syntax\": \"<'margin-left'>\",\n \"relevance\": 54,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-block-end\"\n }\n ],\n \"description\": \"Logical 'margin-bottom'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"margin-block-start\",\n \"browsers\": [\n \"E87\",\n \"FF41\",\n \"S12.1\",\n \"C87\",\n \"O73\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"syntax\": \"<'margin-left'>\",\n \"relevance\": 54,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-block-start\"\n }\n ],\n \"description\": \"Logical 'margin-top'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"margin-bottom\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE3\",\n \"O3.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"syntax\": \"<length> | <percentage> | auto\",\n \"relevance\": 91,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-bottom\"\n }\n ],\n \"description\": \"Shorthand property to set values for the thickness of the margin area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. Negative values for margin properties are allowed, but there may be implementation-specific limits..\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"margin-inline-end\",\n \"browsers\": [\n \"E87\",\n \"FF41\",\n \"S12.1\",\n \"C87\",\n \"O73\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"syntax\": \"<'margin-left'>\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-inline-end\"\n }\n ],\n \"description\": \"Logical 'margin-right'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"margin-inline-start\",\n \"browsers\": [\n \"E87\",\n \"FF41\",\n \"S12.1\",\n \"C87\",\n \"O73\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"syntax\": \"<'margin-left'>\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-inline-start\"\n }\n ],\n \"description\": \"Logical 'margin-left'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"margin-left\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE3\",\n \"O3.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"syntax\": \"<length> | <percentage> | auto\",\n \"relevance\": 92,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-left\"\n }\n ],\n \"description\": \"Shorthand property to set values for the thickness of the margin area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. Negative values for margin properties are allowed, but there may be implementation-specific limits..\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"margin-right\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE3\",\n \"O3.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"syntax\": \"<length> | <percentage> | auto\",\n \"relevance\": 91,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-right\"\n }\n ],\n \"description\": \"Shorthand property to set values for the thickness of the margin area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. Negative values for margin properties are allowed, but there may be implementation-specific limits..\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"margin-top\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE3\",\n \"O3.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"syntax\": \"<length> | <percentage> | auto\",\n \"relevance\": 94,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-top\"\n }\n ],\n \"description\": \"Shorthand property to set values for the thickness of the margin area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. Negative values for margin properties are allowed, but there may be implementation-specific limits..\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"marker\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Indicates that no marker symbol will be drawn at the given vertex or vertices.\"\n },\n {\n \"name\": \"url()\",\n \"description\": \"Indicates that the <marker> element referenced will be used.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the marker symbol that shall be used for all points on the sets the value for all vertices on the given 'path' element or basic shape.\",\n \"restrictions\": [\n \"url\"\n ]\n },\n {\n \"name\": \"marker-end\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Indicates that no marker symbol will be drawn at the given vertex or vertices.\"\n },\n {\n \"name\": \"url()\",\n \"description\": \"Indicates that the <marker> element referenced will be used.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the marker that will be drawn at the last vertices of the given markable element.\",\n \"restrictions\": [\n \"url\"\n ]\n },\n {\n \"name\": \"marker-mid\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Indicates that no marker symbol will be drawn at the given vertex or vertices.\"\n },\n {\n \"name\": \"url()\",\n \"description\": \"Indicates that the <marker> element referenced will be used.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the marker that will be drawn at all vertices except the first and last.\",\n \"restrictions\": [\n \"url\"\n ]\n },\n {\n \"name\": \"marker-start\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Indicates that no marker symbol will be drawn at the given vertex or vertices.\"\n },\n {\n \"name\": \"url()\",\n \"description\": \"Indicates that the <marker> element referenced will be used.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the marker that will be drawn at the first vertices of the given markable element.\",\n \"restrictions\": [\n \"url\"\n ]\n },\n {\n \"name\": \"mask-image\",\n \"browsers\": [\n \"E79\",\n \"FF53\",\n \"S15.4\",\n \"C1\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Counts as a transparent black image layer.\"\n },\n {\n \"name\": \"url()\",\n \"description\": \"Reference to a <mask element or to a CSS image.\"\n }\n ],\n \"syntax\": \"<mask-reference>#\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-image\"\n }\n ],\n \"description\": \"Sets the mask layer image of an element.\",\n \"restrictions\": [\n \"url\",\n \"image\",\n \"enum\"\n ]\n },\n {\n \"name\": \"mask-mode\",\n \"browsers\": [\n \"FF53\",\n \"S15.4\"\n ],\n \"values\": [\n {\n \"name\": \"alpha\",\n \"description\": \"Alpha values of the mask layer image should be used as the mask values.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"Use alpha values if 'mask-image' is an image, luminance if a <mask> element or a CSS image.\"\n },\n {\n \"name\": \"luminance\",\n \"description\": \"Luminance values of the mask layer image should be used as the mask values.\"\n }\n ],\n \"syntax\": \"<masking-mode>#\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-mode\"\n }\n ],\n \"description\": \"Indicates whether the mask layer image is treated as luminance mask or alpha mask.\",\n \"restrictions\": [\n \"url\",\n \"image\",\n \"enum\"\n ]\n },\n {\n \"name\": \"mask-origin\",\n \"browsers\": [\n \"E79\",\n \"FF53\",\n \"S15.4\",\n \"C1\",\n \"O15\"\n ],\n \"syntax\": \"<geometry-box>#\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-origin\"\n }\n ],\n \"description\": \"Specifies the mask positioning area.\",\n \"restrictions\": [\n \"geometry-box\",\n \"enum\"\n ]\n },\n {\n \"name\": \"mask-position\",\n \"browsers\": [\n \"E79\",\n \"FF53\",\n \"S15.4\",\n \"C1\",\n \"O15\"\n ],\n \"syntax\": \"<position>#\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-position\"\n }\n ],\n \"description\": \"Specifies how mask layer images are positioned.\",\n \"restrictions\": [\n \"position\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"mask-repeat\",\n \"browsers\": [\n \"E79\",\n \"FF53\",\n \"S15.4\",\n \"C1\",\n \"O15\"\n ],\n \"syntax\": \"<repeat-style>#\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-repeat\"\n }\n ],\n \"description\": \"Specifies how mask layer images are tiled after they have been sized and positioned.\",\n \"restrictions\": [\n \"repeat\"\n ]\n },\n {\n \"name\": \"mask-size\",\n \"browsers\": [\n \"E79\",\n \"FF53\",\n \"S15.4\",\n \"C4\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Resolved by using the image's intrinsic ratio and the size of the other dimension, or failing that, using the image's intrinsic size, or failing that, treating it as 100%.\"\n },\n {\n \"name\": \"contain\",\n \"description\": \"Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest size such that both its width and its height can fit inside the background positioning area.\"\n },\n {\n \"name\": \"cover\",\n \"description\": \"Scale the image, while preserving its intrinsic aspect ratio (if any), to the smallest size such that both its width and its height can completely cover the background positioning area.\"\n }\n ],\n \"syntax\": \"<bg-size>#\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-size\"\n }\n ],\n \"description\": \"Specifies the size of the mask layer images.\",\n \"restrictions\": [\n \"length\",\n \"percentage\",\n \"enum\"\n ]\n },\n {\n \"name\": \"mask-type\",\n \"browsers\": [\n \"E79\",\n \"FF35\",\n \"S7\",\n \"C24\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"alpha\",\n \"description\": \"Indicates that the alpha values of the mask should be used.\"\n },\n {\n \"name\": \"luminance\",\n \"description\": \"Indicates that the luminance values of the mask should be used.\"\n }\n ],\n \"syntax\": \"luminance | alpha\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-type\"\n }\n ],\n \"description\": \"Defines whether the content of the <mask> element is treated as as luminance mask or alpha mask.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"max-block-size\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No limit on the width of the box.\"\n }\n ],\n \"syntax\": \"<'max-width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/max-block-size\"\n }\n ],\n \"description\": \"Maximum size of an element in the direction opposite that of the direction specified by 'writing-mode'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"max-height\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.3\",\n \"C18\",\n \"IE7\",\n \"O7\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No limit on the height of the box.\"\n },\n {\n \"name\": \"fit-content\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.3\",\n \"C18\",\n \"IE7\",\n \"O7\"\n ],\n \"description\": \"Use the fit-content inline size or fit-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"max-content\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.3\",\n \"C18\",\n \"IE7\",\n \"O7\"\n ],\n \"description\": \"Use the max-content inline size or max-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"min-content\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.3\",\n \"C18\",\n \"IE7\",\n \"O7\"\n ],\n \"description\": \"Use the min-content inline size or min-content block size, as appropriate to the writing mode.\"\n }\n ],\n \"syntax\": \"<viewport-length>\",\n \"relevance\": 86,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/max-height\"\n }\n ],\n \"description\": \"Allows authors to constrain content height to a certain range.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"max-inline-size\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No limit on the height of the box.\"\n }\n ],\n \"syntax\": \"<'max-width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/max-inline-size\"\n }\n ],\n \"description\": \"Maximum size of an element in the direction specified by 'writing-mode'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"max-width\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE7\",\n \"O4\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No limit on the width of the box.\"\n },\n {\n \"name\": \"fit-content\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE7\",\n \"O4\"\n ],\n \"description\": \"Use the fit-content inline size or fit-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"max-content\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE7\",\n \"O4\"\n ],\n \"description\": \"Use the max-content inline size or max-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"min-content\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE7\",\n \"O4\"\n ],\n \"description\": \"Use the min-content inline size or min-content block size, as appropriate to the writing mode.\"\n }\n ],\n \"syntax\": \"<viewport-length>\",\n \"relevance\": 91,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/max-width\"\n }\n ],\n \"description\": \"Allows authors to constrain content width to a certain range.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"min-block-size\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C57\",\n \"O44\"\n ],\n \"syntax\": \"<'min-width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/min-block-size\"\n }\n ],\n \"description\": \"Minimal size of an element in the direction opposite that of the direction specified by 'writing-mode'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"min-height\",\n \"browsers\": [\n \"E12\",\n \"FF3\",\n \"S1.3\",\n \"C1\",\n \"IE7\",\n \"O4\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"browsers\": [\n \"E12\",\n \"FF3\",\n \"S1.3\",\n \"C1\",\n \"IE7\",\n \"O4\"\n ]\n },\n {\n \"name\": \"fit-content\",\n \"browsers\": [\n \"E12\",\n \"FF3\",\n \"S1.3\",\n \"C1\",\n \"IE7\",\n \"O4\"\n ],\n \"description\": \"Use the fit-content inline size or fit-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"max-content\",\n \"browsers\": [\n \"E12\",\n \"FF3\",\n \"S1.3\",\n \"C1\",\n \"IE7\",\n \"O4\"\n ],\n \"description\": \"Use the max-content inline size or max-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"min-content\",\n \"browsers\": [\n \"E12\",\n \"FF3\",\n \"S1.3\",\n \"C1\",\n \"IE7\",\n \"O4\"\n ],\n \"description\": \"Use the min-content inline size or min-content block size, as appropriate to the writing mode.\"\n }\n ],\n \"syntax\": \"<viewport-length>\",\n \"relevance\": 89,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/min-height\"\n }\n ],\n \"description\": \"Allows authors to constrain content height to a certain range.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"min-inline-size\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C57\",\n \"O44\"\n ],\n \"syntax\": \"<'min-width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/min-inline-size\"\n }\n ],\n \"description\": \"Minimal size of an element in the direction specified by 'writing-mode'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"min-width\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE7\",\n \"O4\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE7\",\n \"O4\"\n ]\n },\n {\n \"name\": \"fit-content\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE7\",\n \"O4\"\n ],\n \"description\": \"Use the fit-content inline size or fit-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"max-content\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE7\",\n \"O4\"\n ],\n \"description\": \"Use the max-content inline size or max-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"min-content\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE7\",\n \"O4\"\n ],\n \"description\": \"Use the min-content inline size or min-content block size, as appropriate to the writing mode.\"\n }\n ],\n \"syntax\": \"<viewport-length>\",\n \"relevance\": 88,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/min-width\"\n }\n ],\n \"description\": \"Allows authors to constrain content width to a certain range.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"mix-blend-mode\",\n \"browsers\": [\n \"E79\",\n \"FF32\",\n \"S8\",\n \"C41\",\n \"O28\"\n ],\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"Default attribute which specifies no blending\"\n },\n {\n \"name\": \"multiply\",\n \"description\": \"The source color is multiplied by the destination color and replaces the destination.\"\n },\n {\n \"name\": \"screen\",\n \"description\": \"Multiplies the complements of the backdrop and source color values, then complements the result.\"\n },\n {\n \"name\": \"overlay\",\n \"description\": \"Multiplies or screens the colors, depending on the backdrop color value.\"\n },\n {\n \"name\": \"darken\",\n \"description\": \"Selects the darker of the backdrop and source colors.\"\n },\n {\n \"name\": \"lighten\",\n \"description\": \"Selects the lighter of the backdrop and source colors.\"\n },\n {\n \"name\": \"color-dodge\",\n \"description\": \"Brightens the backdrop color to reflect the source color.\"\n },\n {\n \"name\": \"color-burn\",\n \"description\": \"Darkens the backdrop color to reflect the source color.\"\n },\n {\n \"name\": \"hard-light\",\n \"description\": \"Multiplies or screens the colors, depending on the source color value.\"\n },\n {\n \"name\": \"soft-light\",\n \"description\": \"Darkens or lightens the colors, depending on the source color value.\"\n },\n {\n \"name\": \"difference\",\n \"description\": \"Subtracts the darker of the two constituent colors from the lighter color..\"\n },\n {\n \"name\": \"exclusion\",\n \"description\": \"Produces an effect similar to that of the Difference mode but lower in contrast.\"\n },\n {\n \"name\": \"hue\",\n \"browsers\": [\n \"E79\",\n \"FF32\",\n \"S8\",\n \"C41\",\n \"O28\"\n ],\n \"description\": \"Creates a color with the hue of the source color and the saturation and luminosity of the backdrop color.\"\n },\n {\n \"name\": \"saturation\",\n \"browsers\": [\n \"E79\",\n \"FF32\",\n \"S8\",\n \"C41\",\n \"O28\"\n ],\n \"description\": \"Creates a color with the saturation of the source color and the hue and luminosity of the backdrop color.\"\n },\n {\n \"name\": \"color\",\n \"browsers\": [\n \"E79\",\n \"FF32\",\n \"S8\",\n \"C41\",\n \"O28\"\n ],\n \"description\": \"Creates a color with the hue and saturation of the source color and the luminosity of the backdrop color.\"\n },\n {\n \"name\": \"luminosity\",\n \"browsers\": [\n \"E79\",\n \"FF32\",\n \"S8\",\n \"C41\",\n \"O28\"\n ],\n \"description\": \"Creates a color with the luminosity of the source color and the hue and saturation of the backdrop color.\"\n }\n ],\n \"syntax\": \"<blend-mode> | plus-lighter\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mix-blend-mode\"\n }\n ],\n \"description\": \"Defines the formula that must be used to mix the colors with the backdrop.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"motion\",\n \"browsers\": [\n \"C46\",\n \"O33\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No motion path gets created.\"\n },\n {\n \"name\": \"path()\",\n \"description\": \"Defines an SVG path as a string, with optional 'fill-rule' as the first argument.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"Indicates that the object is rotated by the angle of the direction of the motion path.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"Indicates that the object is rotated by the angle of the direction of the motion path plus 180 degrees.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property for setting 'motion-path', 'motion-offset' and 'motion-rotation'.\",\n \"restrictions\": [\n \"url\",\n \"length\",\n \"percentage\",\n \"angle\",\n \"shape\",\n \"geometry-box\",\n \"enum\"\n ]\n },\n {\n \"name\": \"motion-offset\",\n \"browsers\": [\n \"C46\",\n \"O33\"\n ],\n \"relevance\": 50,\n \"description\": \"A distance that describes the position along the specified motion path.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"motion-path\",\n \"browsers\": [\n \"C46\",\n \"O33\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No motion path gets created.\"\n },\n {\n \"name\": \"path()\",\n \"description\": \"Defines an SVG path as a string, with optional 'fill-rule' as the first argument.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the motion path the element gets positioned at.\",\n \"restrictions\": [\n \"url\",\n \"shape\",\n \"geometry-box\",\n \"enum\"\n ]\n },\n {\n \"name\": \"motion-rotation\",\n \"browsers\": [\n \"C46\",\n \"O33\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Indicates that the object is rotated by the angle of the direction of the motion path.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"Indicates that the object is rotated by the angle of the direction of the motion path plus 180 degrees.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines the direction of the element while positioning along the motion path.\",\n \"restrictions\": [\n \"angle\"\n ]\n },\n {\n \"name\": \"-moz-animation\",\n \"browsers\": [\n \"FF9\"\n ],\n \"values\": [\n {\n \"name\": \"alternate\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction.\"\n },\n {\n \"name\": \"alternate-reverse\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction.\"\n },\n {\n \"name\": \"backwards\",\n \"description\": \"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'.\"\n },\n {\n \"name\": \"both\",\n \"description\": \"Both forwards and backwards fill modes are applied.\"\n },\n {\n \"name\": \"forwards\",\n \"description\": \"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes.\"\n },\n {\n \"name\": \"infinite\",\n \"description\": \"Causes the animation to repeat forever.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No animation is performed\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Normal playback.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"All iterations of the animation are played in the reverse direction from the way they were specified.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property combines six of the animation properties into a single property.\",\n \"restrictions\": [\n \"time\",\n \"enum\",\n \"timing-function\",\n \"identifier\",\n \"number\"\n ]\n },\n {\n \"name\": \"-moz-animation-delay\",\n \"browsers\": [\n \"FF9\"\n ],\n \"relevance\": 50,\n \"description\": \"Defines when the animation will start.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-moz-animation-direction\",\n \"browsers\": [\n \"FF9\"\n ],\n \"values\": [\n {\n \"name\": \"alternate\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction.\"\n },\n {\n \"name\": \"alternate-reverse\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Normal playback.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"All iterations of the animation are played in the reverse direction from the way they were specified.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines whether or not the animation should play in reverse on alternate cycles.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-animation-duration\",\n \"browsers\": [\n \"FF9\"\n ],\n \"relevance\": 50,\n \"description\": \"Defines the length of time that an animation takes to complete one cycle.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-moz-animation-iteration-count\",\n \"browsers\": [\n \"FF9\"\n ],\n \"values\": [\n {\n \"name\": \"infinite\",\n \"description\": \"Causes the animation to repeat forever.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines the number of times an animation cycle is played. The default value is one, meaning the animation will play from beginning to end once.\",\n \"restrictions\": [\n \"number\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-animation-name\",\n \"browsers\": [\n \"FF9\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No animation is performed\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines a list of animations that apply. Each name is used to select the keyframe at-rule that provides the property values for the animation.\",\n \"restrictions\": [\n \"identifier\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-animation-play-state\",\n \"browsers\": [\n \"FF9\"\n ],\n \"values\": [\n {\n \"name\": \"paused\",\n \"description\": \"A running animation will be paused.\"\n },\n {\n \"name\": \"running\",\n \"description\": \"Resume playback of a paused animation.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines whether the animation is running or paused.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-animation-timing-function\",\n \"browsers\": [\n \"FF9\"\n ],\n \"relevance\": 50,\n \"description\": \"Describes how the animation will progress over one cycle of its duration. See the 'transition-timing-function'.\",\n \"restrictions\": [\n \"timing-function\"\n ]\n },\n {\n \"name\": \"-moz-appearance\",\n \"browsers\": [\n \"FF1\"\n ],\n \"values\": [\n {\n \"name\": \"button\"\n },\n {\n \"name\": \"button-arrow-down\"\n },\n {\n \"name\": \"button-arrow-next\"\n },\n {\n \"name\": \"button-arrow-previous\"\n },\n {\n \"name\": \"button-arrow-up\"\n },\n {\n \"name\": \"button-bevel\"\n },\n {\n \"name\": \"checkbox\"\n },\n {\n \"name\": \"checkbox-container\"\n },\n {\n \"name\": \"checkbox-label\"\n },\n {\n \"name\": \"dialog\"\n },\n {\n \"name\": \"groupbox\"\n },\n {\n \"name\": \"listbox\"\n },\n {\n \"name\": \"menuarrow\"\n },\n {\n \"name\": \"menuimage\"\n },\n {\n \"name\": \"menuitem\"\n },\n {\n \"name\": \"menuitemtext\"\n },\n {\n \"name\": \"menulist\"\n },\n {\n \"name\": \"menulist-button\"\n },\n {\n \"name\": \"menulist-text\"\n },\n {\n \"name\": \"menulist-textfield\"\n },\n {\n \"name\": \"menupopup\"\n },\n {\n \"name\": \"menuradio\"\n },\n {\n \"name\": \"menuseparator\"\n },\n {\n \"name\": \"-moz-mac-unified-toolbar\"\n },\n {\n \"name\": \"-moz-win-borderless-glass\"\n },\n {\n \"name\": \"-moz-win-browsertabbar-toolbox\"\n },\n {\n \"name\": \"-moz-win-communications-toolbox\"\n },\n {\n \"name\": \"-moz-win-glass\"\n },\n {\n \"name\": \"-moz-win-media-toolbox\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"progressbar\"\n },\n {\n \"name\": \"progresschunk\"\n },\n {\n \"name\": \"radio\"\n },\n {\n \"name\": \"radio-container\"\n },\n {\n \"name\": \"radio-label\"\n },\n {\n \"name\": \"radiomenuitem\"\n },\n {\n \"name\": \"resizer\"\n },\n {\n \"name\": \"resizerpanel\"\n },\n {\n \"name\": \"scrollbarbutton-down\"\n },\n {\n \"name\": \"scrollbarbutton-left\"\n },\n {\n \"name\": \"scrollbarbutton-right\"\n },\n {\n \"name\": \"scrollbarbutton-up\"\n },\n {\n \"name\": \"scrollbar-small\"\n },\n {\n \"name\": \"scrollbartrack-horizontal\"\n },\n {\n \"name\": \"scrollbartrack-vertical\"\n },\n {\n \"name\": \"separator\"\n },\n {\n \"name\": \"spinner\"\n },\n {\n \"name\": \"spinner-downbutton\"\n },\n {\n \"name\": \"spinner-textfield\"\n },\n {\n \"name\": \"spinner-upbutton\"\n },\n {\n \"name\": \"statusbar\"\n },\n {\n \"name\": \"statusbarpanel\"\n },\n {\n \"name\": \"tab\"\n },\n {\n \"name\": \"tabpanels\"\n },\n {\n \"name\": \"tab-scroll-arrow-back\"\n },\n {\n \"name\": \"tab-scroll-arrow-forward\"\n },\n {\n \"name\": \"textfield\"\n },\n {\n \"name\": \"textfield-multiline\"\n },\n {\n \"name\": \"toolbar\"\n },\n {\n \"name\": \"toolbox\"\n },\n {\n \"name\": \"tooltip\"\n },\n {\n \"name\": \"treeheadercell\"\n },\n {\n \"name\": \"treeheadersortarrow\"\n },\n {\n \"name\": \"treeitem\"\n },\n {\n \"name\": \"treetwistyopen\"\n },\n {\n \"name\": \"treeview\"\n },\n {\n \"name\": \"treewisty\"\n },\n {\n \"name\": \"window\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | button | button-arrow-down | button-arrow-next | button-arrow-previous | button-arrow-up | button-bevel | button-focus | caret | checkbox | checkbox-container | checkbox-label | checkmenuitem | dualbutton | groupbox | listbox | listitem | menuarrow | menubar | menucheckbox | menuimage | menuitem | menuitemtext | menulist | menulist-button | menulist-text | menulist-textfield | menupopup | menuradio | menuseparator | meterbar | meterchunk | progressbar | progressbar-vertical | progresschunk | progresschunk-vertical | radio | radio-container | radio-label | radiomenuitem | range | range-thumb | resizer | resizerpanel | scale-horizontal | scalethumbend | scalethumb-horizontal | scalethumbstart | scalethumbtick | scalethumb-vertical | scale-vertical | scrollbarbutton-down | scrollbarbutton-left | scrollbarbutton-right | scrollbarbutton-up | scrollbarthumb-horizontal | scrollbarthumb-vertical | scrollbartrack-horizontal | scrollbartrack-vertical | searchfield | separator | sheet | spinner | spinner-downbutton | spinner-textfield | spinner-upbutton | splitter | statusbar | statusbarpanel | tab | tabpanel | tabpanels | tab-scroll-arrow-back | tab-scroll-arrow-forward | textfield | textfield-multiline | toolbar | toolbarbutton | toolbarbutton-dropdown | toolbargripper | toolbox | tooltip | treeheader | treeheadercell | treeheadersortarrow | treeitem | treeline | treetwisty | treetwistyopen | treeview | -moz-mac-unified-toolbar | -moz-win-borderless-glass | -moz-win-browsertabbar-toolbox | -moz-win-communicationstext | -moz-win-communications-toolbox | -moz-win-exclude-glass | -moz-win-glass | -moz-win-mediatext | -moz-win-media-toolbox | -moz-window-button-box | -moz-window-button-box-maximized | -moz-window-button-close | -moz-window-button-maximize | -moz-window-button-minimize | -moz-window-button-restore | -moz-window-frame-bottom | -moz-window-frame-left | -moz-window-frame-right | -moz-window-titlebar | -moz-window-titlebar-maximized\",\n \"relevance\": 0,\n \"description\": \"Used in Gecko (Firefox) to display an element using a platform-native styling based on the operating system's theme.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-backface-visibility\",\n \"browsers\": [\n \"FF10\"\n ],\n \"values\": [\n {\n \"name\": \"hidden\"\n },\n {\n \"name\": \"visible\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Determines whether or not the 'back' side of a transformed element is visible when facing the viewer. With an identity transform, the front side of an element faces the viewer.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-background-clip\",\n \"browsers\": [\n \"FF1-3.6\"\n ],\n \"values\": [\n {\n \"name\": \"padding\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Determines the background painting area.\",\n \"restrictions\": [\n \"box\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-background-inline-policy\",\n \"browsers\": [\n \"FF1\"\n ],\n \"values\": [\n {\n \"name\": \"bounding-box\"\n },\n {\n \"name\": \"continuous\"\n },\n {\n \"name\": \"each-box\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"In Gecko-based applications like Firefox, the -moz-background-inline-policy CSS property specifies how the background image of an inline element is determined when the content of the inline element wraps onto multiple lines. The choice of position has significant effects on repetition.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-background-origin\",\n \"browsers\": [\n \"FF1\"\n ],\n \"relevance\": 50,\n \"description\": \"For elements rendered as a single box, specifies the background positioning area. For elements rendered as multiple boxes (e.g., inline boxes on several lines, boxes on several pages) specifies which boxes 'box-decoration-break' operates on to determine the background positioning area(s).\",\n \"restrictions\": [\n \"box\"\n ]\n },\n {\n \"name\": \"-moz-border-bottom-colors\",\n \"browsers\": [\n \"FF1\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>+ | none\",\n \"relevance\": 0,\n \"description\": \"Sets a list of colors for the bottom border.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-moz-border-image\",\n \"browsers\": [\n \"FF3.6\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"If 'auto' is specified then the border image width is the intrinsic width or height (whichever is applicable) of the corresponding image slice. If the image does not have the required intrinsic dimension then the corresponding border-width is used instead.\"\n },\n {\n \"name\": \"fill\",\n \"description\": \"Causes the middle part of the border-image to be preserved.\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"repeat\",\n \"description\": \"The image is tiled (repeated) to fill the area.\"\n },\n {\n \"name\": \"round\",\n \"description\": \"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the image is rescaled so that it does.\"\n },\n {\n \"name\": \"space\",\n \"description\": \"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the extra space is distributed around the tiles.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"The image is stretched to fill the area.\"\n },\n {\n \"name\": \"url()\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property for setting 'border-image-source', 'border-image-slice', 'border-image-width', 'border-image-outset' and 'border-image-repeat'. Omitted values are set to their initial values.\",\n \"restrictions\": [\n \"length\",\n \"percentage\",\n \"number\",\n \"url\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-border-left-colors\",\n \"browsers\": [\n \"FF1\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>+ | none\",\n \"relevance\": 0,\n \"description\": \"Sets a list of colors for the bottom border.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-moz-border-right-colors\",\n \"browsers\": [\n \"FF1\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>+ | none\",\n \"relevance\": 0,\n \"description\": \"Sets a list of colors for the bottom border.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-moz-border-top-colors\",\n \"browsers\": [\n \"FF1\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>+ | none\",\n \"relevance\": 0,\n \"description\": \"Ske Firefox, -moz-border-bottom-colors sets a list of colors for the bottom border.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-moz-box-align\",\n \"browsers\": [\n \"FF1\"\n ],\n \"values\": [\n {\n \"name\": \"baseline\",\n \"description\": \"If this box orientation is inline-axis or horizontal, all children are placed with their baselines aligned, and extra space placed before or after as necessary. For block flows, the baseline of the first non-empty line box located within the element is used. For tables, the baseline of the first cell is used.\"\n },\n {\n \"name\": \"center\",\n \"description\": \"Any extra space is divided evenly, with half placed above the child and the other half placed after the child.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"For normal direction boxes, the bottom edge of each child is placed along the bottom of the box. Extra space is placed above the element. For reverse direction boxes, the top edge of each child is placed along the top of the box. Extra space is placed below the element.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"For normal direction boxes, the top edge of each child is placed along the top of the box. Extra space is placed below the element. For reverse direction boxes, the bottom edge of each child is placed along the bottom of the box. Extra space is placed above the element.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"The height of each child is adjusted to that of the containing block.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies how a XUL box aligns its contents across (perpendicular to) the direction of its layout. The effect of this is only visible if there is extra space in the box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-box-direction\",\n \"browsers\": [\n \"FF1\"\n ],\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"A box with a computed value of horizontal for box-orient displays its children from left to right. A box with a computed value of vertical displays its children from top to bottom.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"A box with a computed value of horizontal for box-orient displays its children from right to left. A box with a computed value of vertical displays its children from bottom to top.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies whether a box lays out its contents normally (from the top or left edge), or in reverse (from the bottom or right edge).\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-box-flex\",\n \"browsers\": [\n \"FF1\"\n ],\n \"relevance\": 50,\n \"description\": \"Specifies how a box grows to fill the box that contains it, in the direction of the containing box's layout.\",\n \"restrictions\": [\n \"number\"\n ]\n },\n {\n \"name\": \"-moz-box-flexgroup\",\n \"browsers\": [\n \"FF1\"\n ],\n \"relevance\": 50,\n \"description\": \"Flexible elements can be assigned to flex groups using the 'box-flex-group' property.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-moz-box-ordinal-group\",\n \"browsers\": [\n \"FF1\"\n ],\n \"relevance\": 50,\n \"description\": \"Indicates the ordinal group the element belongs to. Elements with a lower ordinal group are displayed before those with a higher ordinal group.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-moz-box-orient\",\n \"browsers\": [\n \"FF1\"\n ],\n \"values\": [\n {\n \"name\": \"block-axis\",\n \"description\": \"Elements are oriented along the box's axis.\"\n },\n {\n \"name\": \"horizontal\",\n \"description\": \"The box displays its children from left to right in a horizontal line.\"\n },\n {\n \"name\": \"inline-axis\",\n \"description\": \"Elements are oriented vertically.\"\n },\n {\n \"name\": \"vertical\",\n \"description\": \"The box displays its children from stacked from top to bottom vertically.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"In Mozilla applications, -moz-box-orient specifies whether a box lays out its contents horizontally or vertically.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-box-pack\",\n \"browsers\": [\n \"FF1\"\n ],\n \"values\": [\n {\n \"name\": \"center\",\n \"description\": \"The extra space is divided evenly, with half placed before the first child and the other half placed after the last child.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"For normal direction boxes, the right edge of the last child is placed at the right side, with all extra space placed before the first child. For reverse direction boxes, the left edge of the first child is placed at the left side, with all extra space placed after the last child.\"\n },\n {\n \"name\": \"justify\",\n \"description\": \"The space is divided evenly in-between each child, with none of the extra space placed before the first child or after the last child. If there is only one child, treat the pack value as if it were start.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"For normal direction boxes, the left edge of the first child is placed at the left side, with all extra space placed after the last child. For reverse direction boxes, the right edge of the last child is placed at the right side, with all extra space placed before the first child.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies how a box packs its contents in the direction of its layout. The effect of this is only visible if there is extra space in the box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-box-sizing\",\n \"browsers\": [\n \"FF1\"\n ],\n \"values\": [\n {\n \"name\": \"border-box\",\n \"description\": \"The specified width and height (and respective min/max properties) on this element determine the border box of the element.\"\n },\n {\n \"name\": \"content-box\",\n \"description\": \"Behavior of width and height as specified by CSS2.1. The specified width and height (and respective min/max properties) apply to the width and height respectively of the content box of the element.\"\n },\n {\n \"name\": \"padding-box\",\n \"description\": \"The specified width and height (and respective min/max properties) on this element determine the padding box of the element.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Box Model addition in CSS3.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-column-count\",\n \"browsers\": [\n \"FF3.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Determines the number of columns by the 'column-width' property and the element width.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes the optimal number of columns into which the content of the element will be flowed.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-moz-column-gap\",\n \"browsers\": [\n \"FF3.5\"\n ],\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"User agent specific and typically equivalent to 1em.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Sets the gap between columns. If there is a column rule between columns, it will appear in the middle of the gap.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-moz-column-rule\",\n \"browsers\": [\n \"FF3.5\"\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand for setting 'column-rule-width', 'column-rule-style', and 'column-rule-color' at the same place in the style sheet. Omitted values are set to their initial values.\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"-moz-column-rule-color\",\n \"browsers\": [\n \"FF3.5\"\n ],\n \"relevance\": 50,\n \"description\": \"Sets the color of the column rule\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-moz-column-rule-style\",\n \"browsers\": [\n \"FF3.5\"\n ],\n \"relevance\": 50,\n \"description\": \"Sets the style of the rule between columns of an element.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"-moz-column-rule-width\",\n \"browsers\": [\n \"FF3.5\"\n ],\n \"relevance\": 50,\n \"description\": \"Sets the width of the rule between columns. Negative values are not allowed.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"-moz-columns\",\n \"browsers\": [\n \"FF9\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The width depends on the values of other properties.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"A shorthand property which sets both 'column-width' and 'column-count'.\",\n \"restrictions\": [\n \"length\",\n \"integer\"\n ]\n },\n {\n \"name\": \"-moz-column-width\",\n \"browsers\": [\n \"FF3.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The width depends on the values of other properties.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"This property describes the width of columns in multicol elements.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-moz-font-feature-settings\",\n \"browsers\": [\n \"FF4\"\n ],\n \"values\": [\n {\n \"name\": \"\\\"c2cs\\\"\"\n },\n {\n \"name\": \"\\\"dlig\\\"\"\n },\n {\n \"name\": \"\\\"kern\\\"\"\n },\n {\n \"name\": \"\\\"liga\\\"\"\n },\n {\n \"name\": \"\\\"lnum\\\"\"\n },\n {\n \"name\": \"\\\"onum\\\"\"\n },\n {\n \"name\": \"\\\"smcp\\\"\"\n },\n {\n \"name\": \"\\\"swsh\\\"\"\n },\n {\n \"name\": \"\\\"tnum\\\"\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"No change in glyph substitution or positioning occurs.\"\n },\n {\n \"name\": \"off\",\n \"browsers\": [\n \"FF4\"\n ]\n },\n {\n \"name\": \"on\",\n \"browsers\": [\n \"FF4\"\n ]\n }\n ],\n \"relevance\": 50,\n \"description\": \"Provides low-level control over OpenType font features. It is intended as a way of providing access to font features that are not widely used but are needed for a particular use case.\",\n \"restrictions\": [\n \"string\",\n \"integer\"\n ]\n },\n {\n \"name\": \"-moz-hyphens\",\n \"browsers\": [\n \"FF9\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Conditional hyphenation characters inside a word, if present, take priority over automatic resources when determining hyphenation points within the word.\"\n },\n {\n \"name\": \"manual\",\n \"description\": \"Words are only broken at line breaks where there are characters inside the word that suggest line break opportunities\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Words are not broken at line breaks, even if characters inside the word suggest line break points.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Controls whether hyphenation is allowed to create more break opportunities within a line of text.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-perspective\",\n \"browsers\": [\n \"FF10\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No perspective transform is applied.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Applies the same transform as the perspective(<number>) transform function, except that it applies only to the positioned or transformed children of the element, not to the transform on the element itself.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-moz-perspective-origin\",\n \"browsers\": [\n \"FF10\"\n ],\n \"relevance\": 50,\n \"description\": \"Establishes the origin for the perspective property. It effectively sets the X and Y position at which the viewer appears to be looking at the children of the element.\",\n \"restrictions\": [\n \"position\",\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"-moz-text-align-last\",\n \"browsers\": [\n \"FF12\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"center\",\n \"description\": \"The inline contents are centered within the line box.\"\n },\n {\n \"name\": \"justify\",\n \"description\": \"The text is justified according to the method specified by the 'text-justify' property.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"The inline contents are aligned to the left edge of the line box. In vertical text, 'left' aligns to the edge of the line box that would be the start edge for left-to-right text.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"The inline contents are aligned to the right edge of the line box. In vertical text, 'right' aligns to the edge of the line box that would be the end edge for left-to-right text.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes how the last line of a block or a line right before a forced line break is aligned when 'text-align' is set to 'justify'.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-text-decoration-color\",\n \"browsers\": [\n \"FF6\"\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the color of text decoration (underlines overlines, and line-throughs) set on the element with text-decoration-line.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-moz-text-decoration-line\",\n \"browsers\": [\n \"FF6\"\n ],\n \"values\": [\n {\n \"name\": \"line-through\",\n \"description\": \"Each line of text has a line through the middle.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Neither produces nor inhibits text decoration.\"\n },\n {\n \"name\": \"overline\",\n \"description\": \"Each line of text has a line above it.\"\n },\n {\n \"name\": \"underline\",\n \"description\": \"Each line of text is underlined.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies what line decorations, if any, are added to the element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-text-decoration-style\",\n \"browsers\": [\n \"FF6\"\n ],\n \"values\": [\n {\n \"name\": \"dashed\",\n \"description\": \"Produces a dashed line style.\"\n },\n {\n \"name\": \"dotted\",\n \"description\": \"Produces a dotted line.\"\n },\n {\n \"name\": \"double\",\n \"description\": \"Produces a double line.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Produces no line.\"\n },\n {\n \"name\": \"solid\",\n \"description\": \"Produces a solid line.\"\n },\n {\n \"name\": \"wavy\",\n \"description\": \"Produces a wavy line.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the line style for underline, line-through and overline text decoration.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-text-size-adjust\",\n \"browsers\": [\n \"FF\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Renderers must use the default size adjustment when displaying on a small device.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Renderers must not do size adjustment when displaying on a small device.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies a size adjustment for displaying text content in mobile browsers.\",\n \"restrictions\": [\n \"enum\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-moz-transform\",\n \"browsers\": [\n \"FF3.5\"\n ],\n \"values\": [\n {\n \"name\": \"matrix()\",\n \"description\": \"Specifies a 2D transformation in the form of a transformation matrix of six values. matrix(a,b,c,d,e,f) is equivalent to applying the transformation matrix [a b c d e f]\"\n },\n {\n \"name\": \"matrix3d()\",\n \"description\": \"Specifies a 3D transformation as a 4x4 homogeneous matrix of 16 values in column-major order.\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"perspective\",\n \"description\": \"Specifies a perspective projection matrix.\"\n },\n {\n \"name\": \"rotate()\",\n \"description\": \"Specifies a 2D rotation by the angle specified in the parameter about the origin of the element, as defined by the transform-origin property.\"\n },\n {\n \"name\": \"rotate3d()\",\n \"description\": \"Specifies a clockwise 3D rotation by the angle specified in last parameter about the [x,y,z] direction vector described by the first 3 parameters.\"\n },\n {\n \"name\": \"rotateX('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the X axis.\"\n },\n {\n \"name\": \"rotateY('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the Y axis.\"\n },\n {\n \"name\": \"rotateZ('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the Z axis.\"\n },\n {\n \"name\": \"scale()\",\n \"description\": \"Specifies a 2D scale operation by the [sx,sy] scaling vector described by the 2 parameters. If the second parameter is not provided, it is takes a value equal to the first.\"\n },\n {\n \"name\": \"scale3d()\",\n \"description\": \"Specifies a 3D scale operation by the [sx,sy,sz] scaling vector described by the 3 parameters.\"\n },\n {\n \"name\": \"scaleX()\",\n \"description\": \"Specifies a scale operation using the [sx,1] scaling vector, where sx is given as the parameter.\"\n },\n {\n \"name\": \"scaleY()\",\n \"description\": \"Specifies a scale operation using the [sy,1] scaling vector, where sy is given as the parameter.\"\n },\n {\n \"name\": \"scaleZ()\",\n \"description\": \"Specifies a scale operation using the [1,1,sz] scaling vector, where sz is given as the parameter.\"\n },\n {\n \"name\": \"skew()\",\n \"description\": \"Specifies a skew transformation along the X and Y axes. The first angle parameter specifies the skew on the X axis. The second angle parameter specifies the skew on the Y axis. If the second parameter is not given then a value of 0 is used for the Y angle (ie: no skew on the Y axis).\"\n },\n {\n \"name\": \"skewX()\",\n \"description\": \"Specifies a skew transformation along the X axis by the given angle.\"\n },\n {\n \"name\": \"skewY()\",\n \"description\": \"Specifies a skew transformation along the Y axis by the given angle.\"\n },\n {\n \"name\": \"translate()\",\n \"description\": \"Specifies a 2D translation by the vector [tx, ty], where tx is the first translation-value parameter and ty is the optional second translation-value parameter.\"\n },\n {\n \"name\": \"translate3d()\",\n \"description\": \"Specifies a 3D translation by the vector [tx,ty,tz], with tx, ty and tz being the first, second and third translation-value parameters respectively.\"\n },\n {\n \"name\": \"translateX()\",\n \"description\": \"Specifies a translation by the given amount in the X direction.\"\n },\n {\n \"name\": \"translateY()\",\n \"description\": \"Specifies a translation by the given amount in the Y direction.\"\n },\n {\n \"name\": \"translateZ()\",\n \"description\": \"Specifies a translation by the given amount in the Z direction. Note that percentage values are not allowed in the translateZ translation-value, and if present are evaluated as 0.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"A two-dimensional transformation is applied to an element through the 'transform' property. This property contains a list of transform functions similar to those allowed by SVG.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-transform-origin\",\n \"browsers\": [\n \"FF3.5\"\n ],\n \"relevance\": 50,\n \"description\": \"Establishes the origin of transformation for an element.\",\n \"restrictions\": [\n \"position\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-moz-transition\",\n \"browsers\": [\n \"FF4\"\n ],\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"Every property that is able to undergo a transition will do so.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No property will transition.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property combines four of the transition properties into a single property.\",\n \"restrictions\": [\n \"time\",\n \"property\",\n \"timing-function\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-transition-delay\",\n \"browsers\": [\n \"FF4\"\n ],\n \"relevance\": 50,\n \"description\": \"Defines when the transition will start. It allows a transition to begin execution some period of time from when it is applied.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-moz-transition-duration\",\n \"browsers\": [\n \"FF4\"\n ],\n \"relevance\": 50,\n \"description\": \"Specifies how long the transition from the old value to the new value should take.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-moz-transition-property\",\n \"browsers\": [\n \"FF4\"\n ],\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"Every property that is able to undergo a transition will do so.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No property will transition.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the name of the CSS property to which the transition is applied.\",\n \"restrictions\": [\n \"property\"\n ]\n },\n {\n \"name\": \"-moz-transition-timing-function\",\n \"browsers\": [\n \"FF4\"\n ],\n \"relevance\": 50,\n \"description\": \"Describes how the intermediate values used during a transition will be calculated.\",\n \"restrictions\": [\n \"timing-function\"\n ]\n },\n {\n \"name\": \"-moz-user-focus\",\n \"browsers\": [\n \"FF1\"\n ],\n \"values\": [\n {\n \"name\": \"ignore\"\n },\n {\n \"name\": \"normal\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"ignore | normal | select-after | select-before | select-menu | select-same | select-all | none\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-user-focus\"\n }\n ],\n \"description\": \"Used to indicate whether the element can have focus.\"\n },\n {\n \"name\": \"-moz-user-select\",\n \"browsers\": [\n \"FF1.5\"\n ],\n \"values\": [\n {\n \"name\": \"all\"\n },\n {\n \"name\": \"element\"\n },\n {\n \"name\": \"elements\"\n },\n {\n \"name\": \"-moz-all\"\n },\n {\n \"name\": \"-moz-none\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"text\"\n },\n {\n \"name\": \"toggle\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Controls the appearance of selection.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-accelerator\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"false\",\n \"description\": \"The element does not contain an accelerator key sequence.\"\n },\n {\n \"name\": \"true\",\n \"description\": \"The element contains an accelerator key sequence.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"false | true\",\n \"relevance\": 0,\n \"description\": \"IE only. Has the ability to turn off its system underlines for accelerator keys until the ALT key is pressed\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-behavior\",\n \"browsers\": [\n \"IE8\"\n ],\n \"relevance\": 50,\n \"description\": \"IE only. Used to extend behaviors of the browser\",\n \"restrictions\": [\n \"url\"\n ]\n },\n {\n \"name\": \"-ms-block-progression\",\n \"browsers\": [\n \"IE8\"\n ],\n \"values\": [\n {\n \"name\": \"bt\",\n \"description\": \"Bottom-to-top block flow. Layout is horizontal.\"\n },\n {\n \"name\": \"lr\",\n \"description\": \"Left-to-right direction. The flow orientation is vertical.\"\n },\n {\n \"name\": \"rl\",\n \"description\": \"Right-to-left direction. The flow orientation is vertical.\"\n },\n {\n \"name\": \"tb\",\n \"description\": \"Top-to-bottom direction. The flow orientation is horizontal.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"tb | rl | bt | lr\",\n \"relevance\": 0,\n \"description\": \"Sets the block-progression value and the flow orientation\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-content-zoom-chaining\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"chained\",\n \"description\": \"The nearest zoomable parent element begins zooming when the user hits a zoom limit during a manipulation. No bounce effect is shown.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"A bounce effect is shown when the user hits a zoom limit during a manipulation.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | chained\",\n \"relevance\": 0,\n \"description\": \"Specifies the zoom behavior that occurs when a user hits the zoom limit during a manipulation.\"\n },\n {\n \"name\": \"-ms-content-zooming\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The element is not zoomable.\"\n },\n {\n \"name\": \"zoom\",\n \"description\": \"The element is zoomable.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | zoom\",\n \"relevance\": 0,\n \"description\": \"Specifies whether zooming is enabled.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-content-zoom-limit\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>\",\n \"relevance\": 0,\n \"description\": \"Shorthand property for the -ms-content-zoom-limit-min and -ms-content-zoom-limit-max properties.\",\n \"restrictions\": [\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-content-zoom-limit-max\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<percentage>\",\n \"relevance\": 0,\n \"description\": \"Specifies the maximum zoom factor.\",\n \"restrictions\": [\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-content-zoom-limit-min\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<percentage>\",\n \"relevance\": 0,\n \"description\": \"Specifies the minimum zoom factor.\",\n \"restrictions\": [\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-content-zoom-snap\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"mandatory\",\n \"description\": \"Indicates that the motion of the content after the contact is picked up is always adjusted so that it lands on a snap-point.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Indicates that zooming is unaffected by any defined snap-points.\"\n },\n {\n \"name\": \"proximity\",\n \"description\": \"Indicates that the motion of the content after the contact is picked up may be adjusted if the content would normally stop \\\"close enough\\\" to a snap-point.\"\n },\n {\n \"name\": \"snapInterval(100%, 100%)\",\n \"description\": \"Specifies where the snap-points will be placed.\"\n },\n {\n \"name\": \"snapList()\",\n \"description\": \"Specifies the position of individual snap-points as a comma-separated list of zoom factors.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<'-ms-content-zoom-snap-type'> || <'-ms-content-zoom-snap-points'>\",\n \"relevance\": 0,\n \"description\": \"Shorthand property for the -ms-content-zoom-snap-type and -ms-content-zoom-snap-points properties.\"\n },\n {\n \"name\": \"-ms-content-zoom-snap-points\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"snapInterval(100%, 100%)\",\n \"description\": \"Specifies where the snap-points will be placed.\"\n },\n {\n \"name\": \"snapList()\",\n \"description\": \"Specifies the position of individual snap-points as a comma-separated list of zoom factors.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"snapInterval( <percentage>, <percentage> ) | snapList( <percentage># )\",\n \"relevance\": 0,\n \"description\": \"Defines where zoom snap-points are located.\"\n },\n {\n \"name\": \"-ms-content-zoom-snap-type\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"mandatory\",\n \"description\": \"Indicates that the motion of the content after the contact is picked up is always adjusted so that it lands on a snap-point.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Indicates that zooming is unaffected by any defined snap-points.\"\n },\n {\n \"name\": \"proximity\",\n \"description\": \"Indicates that the motion of the content after the contact is picked up may be adjusted if the content would normally stop \\\"close enough\\\" to a snap-point.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | proximity | mandatory\",\n \"relevance\": 0,\n \"description\": \"Specifies how zooming is affected by defined snap-points.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-filter\",\n \"browsers\": [\n \"IE8-9\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<string>\",\n \"relevance\": 0,\n \"description\": \"IE only. Used to produce visual effects.\",\n \"restrictions\": [\n \"string\"\n ]\n },\n {\n \"name\": \"-ms-flex\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Retrieves the value of the main size property as the used 'flex-basis'.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Expands to '0 0 auto'.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"specifies the parameters of a flexible length: the positive and negative flexibility, and the preferred size.\",\n \"restrictions\": [\n \"length\",\n \"number\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-flex-align\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"baseline\",\n \"description\": \"If the flex item's inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment.\"\n },\n {\n \"name\": \"center\",\n \"description\": \"The flex item's margin box is centered in the cross axis within the line.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"The cross-start margin edge of the flexbox item is placed flush with the cross-start edge of the line.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"If the cross size property of the flexbox item is anything other than 'auto', this value is identical to 'start'.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Aligns flex items along the cross axis of the current line of the flex container.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-flex-direction\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"column\",\n \"description\": \"The flex container's main axis has the same orientation as the block axis of the current writing mode.\"\n },\n {\n \"name\": \"column-reverse\",\n \"description\": \"Same as 'column', except the main-start and main-end directions are swapped.\"\n },\n {\n \"name\": \"row\",\n \"description\": \"The flex container's main axis has the same orientation as the inline axis of the current writing mode.\"\n },\n {\n \"name\": \"row-reverse\",\n \"description\": \"Same as 'row', except the main-start and main-end directions are swapped.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies how flex items are placed in the flex container, by setting the direction of the flex container's main axis.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-flex-flow\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"column\",\n \"description\": \"The flex container's main axis has the same orientation as the block axis of the current writing mode.\"\n },\n {\n \"name\": \"column-reverse\",\n \"description\": \"Same as 'column', except the main-start and main-end directions are swapped.\"\n },\n {\n \"name\": \"nowrap\",\n \"description\": \"The flex container is single-line.\"\n },\n {\n \"name\": \"row\",\n \"description\": \"The flex container's main axis has the same orientation as the inline axis of the current writing mode.\"\n },\n {\n \"name\": \"wrap\",\n \"description\": \"The flexbox is multi-line.\"\n },\n {\n \"name\": \"wrap-reverse\",\n \"description\": \"Same as 'wrap', except the cross-start and cross-end directions are swapped.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies how flexbox items are placed in the flexbox.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-flex-item-align\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Computes to the value of 'align-items' on the element's parent, or 'stretch' if the element has no parent. On absolutely positioned elements, it computes to itself.\"\n },\n {\n \"name\": \"baseline\",\n \"description\": \"If the flex item's inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment.\"\n },\n {\n \"name\": \"center\",\n \"description\": \"The flex item's margin box is centered in the cross axis within the line.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Allows the default alignment along the cross axis to be overridden for individual flex items.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-flex-line-pack\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"center\",\n \"description\": \"Lines are packed toward the center of the flex container.\"\n },\n {\n \"name\": \"distribute\",\n \"description\": \"Lines are evenly distributed in the flex container, with half-size spaces on either end.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"Lines are packed toward the end of the flex container.\"\n },\n {\n \"name\": \"justify\",\n \"description\": \"Lines are evenly distributed in the flex container.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"Lines are packed toward the start of the flex container.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"Lines stretch to take up the remaining space.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Aligns a flex container's lines within the flex container when there is extra space in the cross-axis, similar to how 'justify-content' aligns individual items within the main-axis.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-flex-order\",\n \"browsers\": [\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"Controls the order in which children of a flex container appear within the flex container, by assigning them to ordinal groups.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-ms-flex-pack\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"center\",\n \"description\": \"Flex items are packed toward the center of the line.\"\n },\n {\n \"name\": \"distribute\",\n \"description\": \"Flex items are evenly distributed in the line, with half-size spaces on either end.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"Flex items are packed toward the end of the line.\"\n },\n {\n \"name\": \"justify\",\n \"description\": \"Flex items are evenly distributed in the line.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"Flex items are packed toward the start of the line.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Aligns flex items along the main axis of the current line of the flex container.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-flex-wrap\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"nowrap\",\n \"description\": \"The flex container is single-line.\"\n },\n {\n \"name\": \"wrap\",\n \"description\": \"The flexbox is multi-line.\"\n },\n {\n \"name\": \"wrap-reverse\",\n \"description\": \"Same as 'wrap', except the cross-start and cross-end directions are swapped.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Controls whether the flex container is single-line or multi-line, and the direction of the cross-axis, which determines the direction new lines are stacked in.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-flow-from\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The block container is not a CSS Region.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"[ none | <custom-ident> ]#\",\n \"relevance\": 0,\n \"description\": \"Makes a block container a region and associates it with a named flow.\",\n \"restrictions\": [\n \"identifier\"\n ]\n },\n {\n \"name\": \"-ms-flow-into\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The element is not moved to a named flow and normal CSS processing takes place.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"[ none | <custom-ident> ]#\",\n \"relevance\": 0,\n \"description\": \"Places an element or its contents into a named flow.\",\n \"restrictions\": [\n \"identifier\"\n ]\n },\n {\n \"name\": \"-ms-grid-column\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"end\"\n },\n {\n \"name\": \"start\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Used to place grid items and explicitly defined grid cells in the Grid.\",\n \"restrictions\": [\n \"integer\",\n \"string\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-grid-column-align\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"center\",\n \"description\": \"Places the center of the Grid Item's margin box at the center of the Grid Item's column.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"Aligns the end edge of the Grid Item's margin box to the end edge of the Grid Item's column.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"Aligns the starting edge of the Grid Item's margin box to the starting edge of the Grid Item's column.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"Ensures that the Grid Item's margin box is equal to the size of the Grid Item's column.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Aligns the columns in a grid.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-grid-columns\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | <track-list> | <auto-track-list>\",\n \"relevance\": 0,\n \"description\": \"Lays out the columns of the grid.\"\n },\n {\n \"name\": \"-ms-grid-column-span\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the number of columns to span.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-ms-grid-layer\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"Grid-layer is similar in concept to z-index, but avoids overloading the meaning of the z-index property, which is applicable only to positioned elements.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-ms-grid-row\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"end\"\n },\n {\n \"name\": \"start\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"grid-row is used to place grid items and explicitly defined grid cells in the Grid.\",\n \"restrictions\": [\n \"integer\",\n \"string\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-grid-row-align\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"center\",\n \"description\": \"Places the center of the Grid Item's margin box at the center of the Grid Item's row.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"Aligns the end edge of the Grid Item's margin box to the end edge of the Grid Item's row.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"Aligns the starting edge of the Grid Item's margin box to the starting edge of the Grid Item's row.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"Ensures that the Grid Item's margin box is equal to the size of the Grid Item's row.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Aligns the rows in a grid.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-grid-rows\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | <track-list> | <auto-track-list>\",\n \"relevance\": 0,\n \"description\": \"Lays out the columns of the grid.\"\n },\n {\n \"name\": \"-ms-grid-row-span\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the number of rows to span.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-ms-high-contrast-adjust\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Properties will be adjusted as applicable.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No adjustments will be applied.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"auto | none\",\n \"relevance\": 0,\n \"description\": \"Specifies if properties should be adjusted in high contrast mode.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-hyphenate-limit-chars\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The user agent chooses a value that adapts to the current layout.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"auto | <integer>{1,3}\",\n \"relevance\": 0,\n \"description\": \"Specifies the minimum number of characters in a hyphenated word.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-ms-hyphenate-limit-lines\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"no-limit\",\n \"description\": \"There is no limit.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"no-limit | <integer>\",\n \"relevance\": 0,\n \"description\": \"Indicates the maximum number of successive hyphenated lines in an element.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-ms-hyphenate-limit-zone\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<percentage> | <length>\",\n \"relevance\": 0,\n \"description\": \"Specifies the maximum amount of unfilled space (before justification) that may be left in the line box before hyphenation is triggered to pull part of a word from the next line back up into the current line.\",\n \"restrictions\": [\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-hyphens\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Conditional hyphenation characters inside a word, if present, take priority over automatic resources when determining hyphenation points within the word.\"\n },\n {\n \"name\": \"manual\",\n \"description\": \"Words are only broken at line breaks where there are characters inside the word that suggest line break opportunities\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Words are not broken at line breaks, even if characters inside the word suggest line break points.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Controls whether hyphenation is allowed to create more break opportunities within a line of text.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-ime-mode\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"active\",\n \"description\": \"The input method editor is initially active; text entry is performed using it unless the user specifically dismisses it.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"No change is made to the current input method editor state. This is the default.\"\n },\n {\n \"name\": \"disabled\",\n \"description\": \"The input method editor is disabled and may not be activated by the user.\"\n },\n {\n \"name\": \"inactive\",\n \"description\": \"The input method editor is initially inactive, but the user may activate it if they wish.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"The IME state should be normal; this value can be used in a user style sheet to override the page setting.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Controls the state of the input method editor for text fields.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-interpolation-mode\",\n \"browsers\": [\n \"IE7\"\n ],\n \"values\": [\n {\n \"name\": \"bicubic\"\n },\n {\n \"name\": \"nearest-neighbor\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Gets or sets the interpolation (resampling) method used to stretch images.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-layout-grid\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"char\",\n \"description\": \"Any of the range of character values available to the -ms-layout-grid-char property.\"\n },\n {\n \"name\": \"line\",\n \"description\": \"Any of the range of line values available to the -ms-layout-grid-line property.\"\n },\n {\n \"name\": \"mode\",\n \"description\": \"Any of the range of mode values available to the -ms-layout-grid-mode property.\"\n },\n {\n \"name\": \"type\",\n \"description\": \"Any of the range of type values available to the -ms-layout-grid-type property.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Sets or retrieves the composite document grid properties that specify the layout of text characters.\"\n },\n {\n \"name\": \"-ms-layout-grid-char\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Largest character in the font of the element is used to set the character grid.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Default. No character grid is set.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Sets or retrieves the size of the character grid used for rendering the text content of an element.\",\n \"restrictions\": [\n \"enum\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-layout-grid-line\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Largest character in the font of the element is used to set the character grid.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Default. No grid line is set.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Sets or retrieves the gridline value used for rendering the text content of an element.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-layout-grid-mode\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"both\",\n \"description\": \"Default. Both the char and line grid modes are enabled. This setting is necessary to fully enable the layout grid on an element.\"\n },\n {\n \"name\": \"char\",\n \"description\": \"Only a character grid is used. This is recommended for use with block-level elements, such as a blockquote, where the line grid is intended to be disabled.\"\n },\n {\n \"name\": \"line\",\n \"description\": \"Only a line grid is used. This is recommended for use with inline elements, such as a span, to disable the horizontal grid on runs of text that act as a single entity in the grid layout.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No grid is used.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Gets or sets whether the text layout grid uses two dimensions.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-layout-grid-type\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"fixed\",\n \"description\": \"Grid used for monospaced layout. All noncursive characters are treated as equal; every character is centered within a single grid space by default.\"\n },\n {\n \"name\": \"loose\",\n \"description\": \"Default. Grid used for Japanese and Korean characters.\"\n },\n {\n \"name\": \"strict\",\n \"description\": \"Grid used for Chinese, as well as Japanese (Genko) and Korean characters. Only the ideographs, kanas, and wide characters are snapped to the grid.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Sets or retrieves the type of grid used for rendering the text content of an element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-line-break\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The UA determines the set of line-breaking restrictions to use for CJK scripts, and it may vary the restrictions based on the length of the line; e.g., use a less restrictive set of line-break rules for short lines.\"\n },\n {\n \"name\": \"keep-all\",\n \"description\": \"Sequences of CJK characters can no longer break on implied break points. This option should only be used where the presence of word separator characters still creates line-breaking opportunities, as in Korean.\"\n },\n {\n \"name\": \"newspaper\",\n \"description\": \"Breaks CJK scripts using the least restrictive set of line-breaking rules. Typically used for short lines, such as in newspapers.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Breaks CJK scripts using a normal set of line-breaking rules.\"\n },\n {\n \"name\": \"strict\",\n \"description\": \"Breaks CJK scripts using a more restrictive set of line-breaking rules than 'normal'.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies what set of line breaking restrictions are in effect within the element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-overflow-style\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"No preference, UA should use the first scrolling method in the list that it supports.\"\n },\n {\n \"name\": \"-ms-autohiding-scrollbar\",\n \"description\": \"Indicates the element displays auto-hiding scrollbars during mouse interactions and panning indicators during touch and keyboard interactions.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Indicates the element does not display scrollbars or panning indicators, even when its content overflows.\"\n },\n {\n \"name\": \"scrollbar\",\n \"description\": \"Scrollbars are typically narrow strips inserted on one or two edges of an element and which often have arrows to click on and a \\\"thumb\\\" to drag up and down (or left and right) to move the contents of the element.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"auto | none | scrollbar | -ms-autohiding-scrollbar\",\n \"relevance\": 0,\n \"description\": \"Specify whether content is clipped when it overflows the element's content area.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-perspective\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No perspective transform is applied.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Applies the same transform as the perspective(<number>) transform function, except that it applies only to the positioned or transformed children of the element, not to the transform on the element itself.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-perspective-origin\",\n \"browsers\": [\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"Establishes the origin for the perspective property. It effectively sets the X and Y position at which the viewer appears to be looking at the children of the element.\",\n \"restrictions\": [\n \"position\",\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-perspective-origin-x\",\n \"browsers\": [\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"Establishes the origin for the perspective property. It effectively sets the X position at which the viewer appears to be looking at the children of the element.\",\n \"restrictions\": [\n \"position\",\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-perspective-origin-y\",\n \"browsers\": [\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"Establishes the origin for the perspective property. It effectively sets the Y position at which the viewer appears to be looking at the children of the element.\",\n \"restrictions\": [\n \"position\",\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-progress-appearance\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"bar\"\n },\n {\n \"name\": \"ring\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Gets or sets a value that specifies whether a progress control displays as a bar or a ring.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-scrollbar-3dlight-color\",\n \"browsers\": [\n \"IE8\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"description\": \"Determines the color of the top and left edges of the scroll box and scroll arrows of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-ms-scrollbar-arrow-color\",\n \"browsers\": [\n \"IE8\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"description\": \"Determines the color of the arrow elements of a scroll arrow.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-ms-scrollbar-base-color\",\n \"browsers\": [\n \"IE8\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"description\": \"Determines the color of the main elements of a scroll bar, which include the scroll box, track, and scroll arrows.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-ms-scrollbar-darkshadow-color\",\n \"browsers\": [\n \"IE8\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"description\": \"Determines the color of the gutter of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-ms-scrollbar-face-color\",\n \"browsers\": [\n \"IE8\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"description\": \"Determines the color of the scroll box and scroll arrows of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-ms-scrollbar-highlight-color\",\n \"browsers\": [\n \"IE8\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"description\": \"Determines the color of the top and left edges of the scroll box and scroll arrows of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-ms-scrollbar-shadow-color\",\n \"browsers\": [\n \"IE8\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"description\": \"Determines the color of the bottom and right edges of the scroll box and scroll arrows of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-ms-scrollbar-track-color\",\n \"browsers\": [\n \"IE8\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"description\": \"Determines the color of the track element of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-ms-scroll-chaining\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"chained\"\n },\n {\n \"name\": \"none\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"chained | none\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that indicates the scrolling behavior that occurs when a user hits the content boundary during a manipulation.\",\n \"restrictions\": [\n \"enum\",\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-scroll-limit\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a shorthand value that sets values for the -ms-scroll-limit-x-min, -ms-scroll-limit-y-min, -ms-scroll-limit-x-max, and -ms-scroll-limit-y-max properties.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-scroll-limit-x-max\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"auto | <length>\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that specifies the maximum value for the scrollLeft property.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-scroll-limit-x-min\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<length>\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that specifies the minimum value for the scrollLeft property.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-scroll-limit-y-max\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"auto | <length>\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that specifies the maximum value for the scrollTop property.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-scroll-limit-y-min\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<length>\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that specifies the minimum value for the scrollTop property.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-scroll-rails\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"railed\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | railed\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that indicates whether or not small motions perpendicular to the primary axis of motion will result in either changes to both the scrollTop and scrollLeft properties or a change to the primary axis (for instance, either the scrollTop or scrollLeft properties will change, but not both).\",\n \"restrictions\": [\n \"enum\",\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-scroll-snap-points-x\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"snapInterval(100%, 100%)\"\n },\n {\n \"name\": \"snapList()\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"snapInterval( <length-percentage>, <length-percentage> ) | snapList( <length-percentage># )\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that defines where snap-points will be located along the x-axis.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-scroll-snap-points-y\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"snapInterval(100%, 100%)\"\n },\n {\n \"name\": \"snapList()\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"snapInterval( <length-percentage>, <length-percentage> ) | snapList( <length-percentage># )\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that defines where snap-points will be located along the y-axis.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-scroll-snap-type\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The visual viewport of this scroll container must ignore snap points, if any, when scrolled.\"\n },\n {\n \"name\": \"mandatory\",\n \"description\": \"The visual viewport of this scroll container is guaranteed to rest on a snap point when there are no active scrolling operations.\"\n },\n {\n \"name\": \"proximity\",\n \"description\": \"The visual viewport of this scroll container may come to rest on a snap point at the termination of a scroll at the discretion of the UA given the parameters of the scroll.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | proximity | mandatory\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that defines what type of snap-point should be used for the current element. There are two type of snap-points, with the primary difference being whether or not the user is guaranteed to always stop on a snap-point.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-scroll-snap-x\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"mandatory\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"proximity\"\n },\n {\n \"name\": \"snapInterval(100%, 100%)\"\n },\n {\n \"name\": \"snapList()\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a shorthand value that sets values for the -ms-scroll-snap-type and -ms-scroll-snap-points-x properties.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-scroll-snap-y\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"mandatory\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"proximity\"\n },\n {\n \"name\": \"snapInterval(100%, 100%)\"\n },\n {\n \"name\": \"snapList()\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a shorthand value that sets values for the -ms-scroll-snap-type and -ms-scroll-snap-points-y properties.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-scroll-translation\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"vertical-to-horizontal\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | vertical-to-horizontal\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that specifies whether vertical-to-horizontal scroll wheel translation occurs on the specified element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-text-align-last\",\n \"browsers\": [\n \"E\",\n \"IE8\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"center\",\n \"description\": \"The inline contents are centered within the line box.\"\n },\n {\n \"name\": \"justify\",\n \"description\": \"The text is justified according to the method specified by the 'text-justify' property.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"The inline contents are aligned to the left edge of the line box. In vertical text, 'left' aligns to the edge of the line box that would be the start edge for left-to-right text.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"The inline contents are aligned to the right edge of the line box. In vertical text, 'right' aligns to the edge of the line box that would be the end edge for left-to-right text.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes how the last line of a block or a line right before a forced line break is aligned when 'text-align' is set to 'justify'.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-text-autospace\",\n \"browsers\": [\n \"E\",\n \"IE8\"\n ],\n \"values\": [\n {\n \"name\": \"ideograph-alpha\",\n \"description\": \"Creates 1/4em extra spacing between runs of ideographic letters and non-ideographic letters, such as Latin-based, Cyrillic, Greek, Arabic or Hebrew.\"\n },\n {\n \"name\": \"ideograph-numeric\",\n \"description\": \"Creates 1/4em extra spacing between runs of ideographic letters and numeric glyphs.\"\n },\n {\n \"name\": \"ideograph-parenthesis\",\n \"description\": \"Creates extra spacing between normal (non wide) parenthesis and ideographs.\"\n },\n {\n \"name\": \"ideograph-space\",\n \"description\": \"Extends the width of the space character while surrounded by ideographs.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No extra space is created.\"\n },\n {\n \"name\": \"punctuation\",\n \"description\": \"Creates extra non-breaking spacing around punctuation as required by language-specific typographic conventions.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | ideograph-alpha | ideograph-numeric | ideograph-parenthesis | ideograph-space\",\n \"relevance\": 0,\n \"description\": \"Determines whether or not a full-width punctuation mark character should be trimmed if it appears at the beginning of a line, so that its 'ink' lines up with the first glyph in the line above and below.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-text-combine-horizontal\",\n \"browsers\": [\n \"E\",\n \"IE11\"\n ],\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"Attempt to typeset horizontally all consecutive characters within the box such that they take up the space of a single character within the vertical line box.\"\n },\n {\n \"name\": \"digits\",\n \"description\": \"Attempt to typeset horizontally each maximal sequence of consecutive ASCII digits (U+0030-U+0039) that has as many or fewer characters than the specified integer such that it takes up the space of a single character within the vertical line box.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No special processing.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"This property specifies the combination of multiple characters into the space of a single character.\",\n \"restrictions\": [\n \"enum\",\n \"integer\"\n ]\n },\n {\n \"name\": \"-ms-text-justify\",\n \"browsers\": [\n \"E\",\n \"IE8\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The UA determines the justification algorithm to follow, based on a balance between performance and adequate presentation quality.\"\n },\n {\n \"name\": \"distribute\",\n \"description\": \"Justification primarily changes spacing both at word separators and at grapheme cluster boundaries in all scripts except those in the connected and cursive groups. This value is sometimes used in e.g. Japanese, often with the 'text-align-last' property.\"\n },\n {\n \"name\": \"inter-cluster\",\n \"description\": \"Justification primarily changes spacing at word separators and at grapheme cluster boundaries in clustered scripts. This value is typically used for Southeast Asian scripts such as Thai.\"\n },\n {\n \"name\": \"inter-ideograph\",\n \"description\": \"Justification primarily changes spacing at word separators and at inter-graphemic boundaries in scripts that use no word spaces. This value is typically used for CJK languages.\"\n },\n {\n \"name\": \"inter-word\",\n \"description\": \"Justification primarily changes spacing at word separators. This value is typically used for languages that separate words using spaces, like English or (sometimes) Korean.\"\n },\n {\n \"name\": \"kashida\",\n \"description\": \"Justification primarily stretches Arabic and related scripts through the use of kashida or other calligraphic elongation.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Selects the justification algorithm used when 'text-align' is set to 'justify'. The property applies to block containers, but the UA may (but is not required to) also support it on inline elements.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-text-kashida-space\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"Sets or retrieves the ratio of kashida expansion to white space expansion when justifying lines of text in the object.\",\n \"restrictions\": [\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-text-overflow\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"clip\",\n \"description\": \"Clip inline content that overflows. Characters may be only partially rendered.\"\n },\n {\n \"name\": \"ellipsis\",\n \"description\": \"Render an ellipsis character (U+2026) to represent clipped inline content.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Text can overflow for example when it is prevented from wrapping\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-text-size-adjust\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Renderers must use the default size adjustment when displaying on a small device.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Renderers must not do size adjustment when displaying on a small device.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies a size adjustment for displaying text content in mobile browsers.\",\n \"restrictions\": [\n \"enum\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-text-underline-position\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"alphabetic\",\n \"description\": \"The underline is aligned with the alphabetic baseline. In this case the underline is likely to cross some descenders.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"The user agent may use any algorithm to determine the underline's position. In horizontal line layout, the underline should be aligned as for alphabetic. In vertical line layout, if the language is set to Japanese or Korean, the underline should be aligned as for over.\"\n },\n {\n \"name\": \"over\",\n \"description\": \"The underline is aligned with the 'top' (right in vertical writing) edge of the element's em-box. In this mode, an overline also switches sides.\"\n },\n {\n \"name\": \"under\",\n \"description\": \"The underline is aligned with the 'bottom' (left in vertical writing) edge of the element's em-box. In this case the underline usually does not cross the descenders. This is sometimes called 'accounting' underline.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Sets the position of an underline specified on the same element: it does not affect underlines specified by ancestor elements.This property is typically used in vertical writing contexts such as in Japanese documents where it often desired to have the underline appear 'over' (to the right of) the affected run of text\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-touch-action\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The element is a passive element, with several exceptions.\"\n },\n {\n \"name\": \"double-tap-zoom\",\n \"description\": \"The element will zoom on double-tap.\"\n },\n {\n \"name\": \"manipulation\",\n \"description\": \"The element is a manipulation-causing element.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The element is a manipulation-blocking element.\"\n },\n {\n \"name\": \"pan-x\",\n \"description\": \"The element permits touch-driven panning on the horizontal axis. The touch pan is performed on the nearest ancestor with horizontally scrollable content.\"\n },\n {\n \"name\": \"pan-y\",\n \"description\": \"The element permits touch-driven panning on the vertical axis. The touch pan is performed on the nearest ancestor with vertically scrollable content.\"\n },\n {\n \"name\": \"pinch-zoom\",\n \"description\": \"The element permits pinch-zooming. The pinch-zoom is performed on the nearest ancestor with zoomable content.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Gets or sets a value that indicates whether and how a given region can be manipulated by the user.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-touch-select\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"grippers\",\n \"description\": \"Grippers are always on.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Grippers are always off.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"grippers | none\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that toggles the 'gripper' visual elements that enable touch text selection.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-transform\",\n \"browsers\": [\n \"IE9-9\"\n ],\n \"values\": [\n {\n \"name\": \"matrix()\",\n \"description\": \"Specifies a 2D transformation in the form of a transformation matrix of six values. matrix(a,b,c,d,e,f) is equivalent to applying the transformation matrix [a b c d e f]\"\n },\n {\n \"name\": \"matrix3d()\",\n \"description\": \"Specifies a 3D transformation as a 4x4 homogeneous matrix of 16 values in column-major order.\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"rotate()\",\n \"description\": \"Specifies a 2D rotation by the angle specified in the parameter about the origin of the element, as defined by the transform-origin property.\"\n },\n {\n \"name\": \"rotate3d()\",\n \"description\": \"Specifies a clockwise 3D rotation by the angle specified in last parameter about the [x,y,z] direction vector described by the first 3 parameters.\"\n },\n {\n \"name\": \"rotateX('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the X axis.\"\n },\n {\n \"name\": \"rotateY('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the Y axis.\"\n },\n {\n \"name\": \"rotateZ('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the Z axis.\"\n },\n {\n \"name\": \"scale()\",\n \"description\": \"Specifies a 2D scale operation by the [sx,sy] scaling vector described by the 2 parameters. If the second parameter is not provided, it is takes a value equal to the first.\"\n },\n {\n \"name\": \"scale3d()\",\n \"description\": \"Specifies a 3D scale operation by the [sx,sy,sz] scaling vector described by the 3 parameters.\"\n },\n {\n \"name\": \"scaleX()\",\n \"description\": \"Specifies a scale operation using the [sx,1] scaling vector, where sx is given as the parameter.\"\n },\n {\n \"name\": \"scaleY()\",\n \"description\": \"Specifies a scale operation using the [sy,1] scaling vector, where sy is given as the parameter.\"\n },\n {\n \"name\": \"scaleZ()\",\n \"description\": \"Specifies a scale operation using the [1,1,sz] scaling vector, where sz is given as the parameter.\"\n },\n {\n \"name\": \"skew()\",\n \"description\": \"Specifies a skew transformation along the X and Y axes. The first angle parameter specifies the skew on the X axis. The second angle parameter specifies the skew on the Y axis. If the second parameter is not given then a value of 0 is used for the Y angle (ie: no skew on the Y axis).\"\n },\n {\n \"name\": \"skewX()\",\n \"description\": \"Specifies a skew transformation along the X axis by the given angle.\"\n },\n {\n \"name\": \"skewY()\",\n \"description\": \"Specifies a skew transformation along the Y axis by the given angle.\"\n },\n {\n \"name\": \"translate()\",\n \"description\": \"Specifies a 2D translation by the vector [tx, ty], where tx is the first translation-value parameter and ty is the optional second translation-value parameter.\"\n },\n {\n \"name\": \"translate3d()\",\n \"description\": \"Specifies a 3D translation by the vector [tx,ty,tz], with tx, ty and tz being the first, second and third translation-value parameters respectively.\"\n },\n {\n \"name\": \"translateX()\",\n \"description\": \"Specifies a translation by the given amount in the X direction.\"\n },\n {\n \"name\": \"translateY()\",\n \"description\": \"Specifies a translation by the given amount in the Y direction.\"\n },\n {\n \"name\": \"translateZ()\",\n \"description\": \"Specifies a translation by the given amount in the Z direction. Note that percentage values are not allowed in the translateZ translation-value, and if present are evaluated as 0.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"A two-dimensional transformation is applied to an element through the 'transform' property. This property contains a list of transform functions similar to those allowed by SVG.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-transform-origin\",\n \"browsers\": [\n \"IE9-9\"\n ],\n \"relevance\": 50,\n \"description\": \"Establishes the origin of transformation for an element.\",\n \"restrictions\": [\n \"position\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-transform-origin-x\",\n \"browsers\": [\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"The x coordinate of the origin for transforms applied to an element with respect to its border box.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-transform-origin-y\",\n \"browsers\": [\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"The y coordinate of the origin for transforms applied to an element with respect to its border box.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-transform-origin-z\",\n \"browsers\": [\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"The z coordinate of the origin for transforms applied to an element with respect to its border box.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-user-select\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"element\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"text\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | element | text\",\n \"relevance\": 0,\n \"description\": \"Controls the appearance of selection.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-word-break\",\n \"browsers\": [\n \"IE8\"\n ],\n \"values\": [\n {\n \"name\": \"break-all\",\n \"description\": \"Lines may break between any two grapheme clusters for non-CJK scripts.\"\n },\n {\n \"name\": \"keep-all\",\n \"description\": \"Block characters can no longer create implied break points.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Breaks non-CJK scripts according to their own rules.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies line break opportunities for non-CJK scripts.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-word-wrap\",\n \"browsers\": [\n \"IE8\"\n ],\n \"values\": [\n {\n \"name\": \"break-word\",\n \"description\": \"An unbreakable 'word' may be broken at an arbitrary point if there are no otherwise-acceptable break points in the line.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Lines may break only at allowed break points.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies whether the UA may break within a word to prevent overflow when an otherwise-unbreakable string is too long to fit.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-wrap-flow\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"For floats an exclusion is created, for all other elements an exclusion is not created.\"\n },\n {\n \"name\": \"both\",\n \"description\": \"Inline flow content can flow on all sides of the exclusion.\"\n },\n {\n \"name\": \"clear\",\n \"description\": \"Inline flow content can only wrap on top and bottom of the exclusion and must leave the areas to the start and end edges of the exclusion box empty.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"Inline flow content can wrap on the end side of the exclusion area but must leave the area to the start edge of the exclusion area empty.\"\n },\n {\n \"name\": \"maximum\",\n \"description\": \"Inline flow content can wrap on the side of the exclusion with the largest available space for the given line, and must leave the other side of the exclusion empty.\"\n },\n {\n \"name\": \"minimum\",\n \"description\": \"Inline flow content can flow around the edge of the exclusion with the smallest available space within the flow content's containing block, and must leave the other edge of the exclusion empty.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"Inline flow content can wrap on the start edge of the exclusion area but must leave the area to end edge of the exclusion area empty.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"auto | both | start | end | maximum | clear\",\n \"relevance\": 0,\n \"description\": \"An element becomes an exclusion when its 'wrap-flow' property has a computed value other than 'auto'.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-wrap-margin\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<length>\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that is used to offset the inner wrap shape from other shapes.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-wrap-through\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The exclusion element does not inherit its parent node's wrapping context. Its descendants are only subject to exclusion shapes defined inside the element.\"\n },\n {\n \"name\": \"wrap\",\n \"description\": \"The exclusion element inherits its parent node's wrapping context. Its descendant inline content wraps around exclusions defined outside the element.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"wrap | none\",\n \"relevance\": 0,\n \"description\": \"Specifies if an element inherits its parent wrapping context. In other words if it is subject to the exclusions defined outside the element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-writing-mode\",\n \"browsers\": [\n \"IE8\"\n ],\n \"values\": [\n {\n \"name\": \"bt-lr\"\n },\n {\n \"name\": \"bt-rl\"\n },\n {\n \"name\": \"lr-bt\"\n },\n {\n \"name\": \"lr-tb\"\n },\n {\n \"name\": \"rl-bt\"\n },\n {\n \"name\": \"rl-tb\"\n },\n {\n \"name\": \"tb-lr\"\n },\n {\n \"name\": \"tb-rl\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property for both 'direction' and 'block-progression'.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-zoom\",\n \"browsers\": [\n \"IE8\"\n ],\n \"values\": [\n {\n \"name\": \"normal\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Sets or retrieves the magnification scale of the object.\",\n \"restrictions\": [\n \"enum\",\n \"integer\",\n \"number\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-zoom-animation\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"default\"\n },\n {\n \"name\": \"none\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Gets or sets a value that indicates whether an animation is used when zooming.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"nav-down\",\n \"browsers\": [\n \"O9.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The user agent automatically determines which element to navigate the focus to in response to directional navigational input.\"\n },\n {\n \"name\": \"current\",\n \"description\": \"Indicates that the user agent should target the frame that the element is in.\"\n },\n {\n \"name\": \"root\",\n \"description\": \"Indicates that the user agent should target the full window.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Provides an way to control directional focus navigation.\",\n \"restrictions\": [\n \"enum\",\n \"identifier\",\n \"string\"\n ]\n },\n {\n \"name\": \"nav-index\",\n \"browsers\": [\n \"O9.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The element's sequential navigation order is assigned automatically by the user agent.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Provides an input-method-neutral way of specifying the sequential navigation order (also known as 'tabbing order').\",\n \"restrictions\": [\n \"number\"\n ]\n },\n {\n \"name\": \"nav-left\",\n \"browsers\": [\n \"O9.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The user agent automatically determines which element to navigate the focus to in response to directional navigational input.\"\n },\n {\n \"name\": \"current\",\n \"description\": \"Indicates that the user agent should target the frame that the element is in.\"\n },\n {\n \"name\": \"root\",\n \"description\": \"Indicates that the user agent should target the full window.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Provides an way to control directional focus navigation.\",\n \"restrictions\": [\n \"enum\",\n \"identifier\",\n \"string\"\n ]\n },\n {\n \"name\": \"nav-right\",\n \"browsers\": [\n \"O9.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The user agent automatically determines which element to navigate the focus to in response to directional navigational input.\"\n },\n {\n \"name\": \"current\",\n \"description\": \"Indicates that the user agent should target the frame that the element is in.\"\n },\n {\n \"name\": \"root\",\n \"description\": \"Indicates that the user agent should target the full window.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Provides an way to control directional focus navigation.\",\n \"restrictions\": [\n \"enum\",\n \"identifier\",\n \"string\"\n ]\n },\n {\n \"name\": \"nav-up\",\n \"browsers\": [\n \"O9.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The user agent automatically determines which element to navigate the focus to in response to directional navigational input.\"\n },\n {\n \"name\": \"current\",\n \"description\": \"Indicates that the user agent should target the frame that the element is in.\"\n },\n {\n \"name\": \"root\",\n \"description\": \"Indicates that the user agent should target the full window.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Provides an way to control directional focus navigation.\",\n \"restrictions\": [\n \"enum\",\n \"identifier\",\n \"string\"\n ]\n },\n {\n \"name\": \"negative\",\n \"browsers\": [\n \"FF33\"\n ],\n \"syntax\": \"<symbol> <symbol>?\",\n \"relevance\": 50,\n \"description\": \"@counter-style descriptor. Defines how to alter the representation when the counter value is negative.\",\n \"restrictions\": [\n \"image\",\n \"identifier\",\n \"string\"\n ]\n },\n {\n \"name\": \"-o-animation\",\n \"browsers\": [\n \"O12\"\n ],\n \"values\": [\n {\n \"name\": \"alternate\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction.\"\n },\n {\n \"name\": \"alternate-reverse\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction.\"\n },\n {\n \"name\": \"backwards\",\n \"description\": \"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'.\"\n },\n {\n \"name\": \"both\",\n \"description\": \"Both forwards and backwards fill modes are applied.\"\n },\n {\n \"name\": \"forwards\",\n \"description\": \"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes.\"\n },\n {\n \"name\": \"infinite\",\n \"description\": \"Causes the animation to repeat forever.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No animation is performed\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Normal playback.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"All iterations of the animation are played in the reverse direction from the way they were specified.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property combines six of the animation properties into a single property.\",\n \"restrictions\": [\n \"time\",\n \"enum\",\n \"timing-function\",\n \"identifier\",\n \"number\"\n ]\n },\n {\n \"name\": \"-o-animation-delay\",\n \"browsers\": [\n \"O12\"\n ],\n \"relevance\": 50,\n \"description\": \"Defines when the animation will start.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-o-animation-direction\",\n \"browsers\": [\n \"O12\"\n ],\n \"values\": [\n {\n \"name\": \"alternate\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction.\"\n },\n {\n \"name\": \"alternate-reverse\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Normal playback.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"All iterations of the animation are played in the reverse direction from the way they were specified.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines whether or not the animation should play in reverse on alternate cycles.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-o-animation-duration\",\n \"browsers\": [\n \"O12\"\n ],\n \"relevance\": 50,\n \"description\": \"Defines the length of time that an animation takes to complete one cycle.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-o-animation-fill-mode\",\n \"browsers\": [\n \"O12\"\n ],\n \"values\": [\n {\n \"name\": \"backwards\",\n \"description\": \"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'.\"\n },\n {\n \"name\": \"both\",\n \"description\": \"Both forwards and backwards fill modes are applied.\"\n },\n {\n \"name\": \"forwards\",\n \"description\": \"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"There is no change to the property value between the time the animation is applied and the time the animation begins playing or after the animation completes.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines what values are applied by the animation outside the time it is executing.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-o-animation-iteration-count\",\n \"browsers\": [\n \"O12\"\n ],\n \"values\": [\n {\n \"name\": \"infinite\",\n \"description\": \"Causes the animation to repeat forever.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines the number of times an animation cycle is played. The default value is one, meaning the animation will play from beginning to end once.\",\n \"restrictions\": [\n \"number\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-o-animation-name\",\n \"browsers\": [\n \"O12\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No animation is performed\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines a list of animations that apply. Each name is used to select the keyframe at-rule that provides the property values for the animation.\",\n \"restrictions\": [\n \"identifier\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-o-animation-play-state\",\n \"browsers\": [\n \"O12\"\n ],\n \"values\": [\n {\n \"name\": \"paused\",\n \"description\": \"A running animation will be paused.\"\n },\n {\n \"name\": \"running\",\n \"description\": \"Resume playback of a paused animation.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines whether the animation is running or paused.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-o-animation-timing-function\",\n \"browsers\": [\n \"O12\"\n ],\n \"relevance\": 50,\n \"description\": \"Describes how the animation will progress over one cycle of its duration. See the 'transition-timing-function'.\",\n \"restrictions\": [\n \"timing-function\"\n ]\n },\n {\n \"name\": \"object-fit\",\n \"browsers\": [\n \"E79\",\n \"FF36\",\n \"S10\",\n \"C32\",\n \"O19\"\n ],\n \"values\": [\n {\n \"name\": \"contain\",\n \"description\": \"The replaced content is sized to maintain its aspect ratio while fitting within the element's content box: its concrete object size is resolved as a contain constraint against the element's used width and height.\"\n },\n {\n \"name\": \"cover\",\n \"description\": \"The replaced content is sized to maintain its aspect ratio while filling the element's entire content box: its concrete object size is resolved as a cover constraint against the element's used width and height.\"\n },\n {\n \"name\": \"fill\",\n \"description\": \"The replaced content is sized to fill the element's content box: the object's concrete object size is the element's used width and height.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The replaced content is not resized to fit inside the element's content box\"\n },\n {\n \"name\": \"scale-down\",\n \"description\": \"Size the content as if 'none' or 'contain' were specified, whichever would result in a smaller concrete object size.\"\n }\n ],\n \"syntax\": \"fill | contain | cover | none | scale-down\",\n \"relevance\": 70,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/object-fit\"\n }\n ],\n \"description\": \"Specifies how the contents of a replaced element should be scaled relative to the box established by its used height and width.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"object-position\",\n \"browsers\": [\n \"E79\",\n \"FF36\",\n \"S10\",\n \"C32\",\n \"O19\"\n ],\n \"syntax\": \"<position>\",\n \"relevance\": 56,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/object-position\"\n }\n ],\n \"description\": \"Determines the alignment of the replaced element inside its box.\",\n \"restrictions\": [\n \"position\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-o-border-image\",\n \"browsers\": [\n \"O11.6\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"If 'auto' is specified then the border image width is the intrinsic width or height (whichever is applicable) of the corresponding image slice. If the image does not have the required intrinsic dimension then the corresponding border-width is used instead.\"\n },\n {\n \"name\": \"fill\",\n \"description\": \"Causes the middle part of the border-image to be preserved.\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"repeat\",\n \"description\": \"The image is tiled (repeated) to fill the area.\"\n },\n {\n \"name\": \"round\",\n \"description\": \"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the image is rescaled so that it does.\"\n },\n {\n \"name\": \"space\",\n \"description\": \"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the extra space is distributed around the tiles.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"The image is stretched to fill the area.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property for setting 'border-image-source', 'border-image-slice', 'border-image-width', 'border-image-outset' and 'border-image-repeat'. Omitted values are set to their initial values.\",\n \"restrictions\": [\n \"length\",\n \"percentage\",\n \"number\",\n \"image\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-o-object-fit\",\n \"browsers\": [\n \"O10.6\"\n ],\n \"values\": [\n {\n \"name\": \"contain\",\n \"description\": \"The replaced content is sized to maintain its aspect ratio while fitting within the element's content box: its concrete object size is resolved as a contain constraint against the element's used width and height.\"\n },\n {\n \"name\": \"cover\",\n \"description\": \"The replaced content is sized to maintain its aspect ratio while filling the element's entire content box: its concrete object size is resolved as a cover constraint against the element's used width and height.\"\n },\n {\n \"name\": \"fill\",\n \"description\": \"The replaced content is sized to fill the element's content box: the object's concrete object size is the element's used width and height.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The replaced content is not resized to fit inside the element's content box\"\n },\n {\n \"name\": \"scale-down\",\n \"description\": \"Size the content as if 'none' or 'contain' were specified, whichever would result in a smaller concrete object size.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies how the contents of a replaced element should be scaled relative to the box established by its used height and width.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-o-object-position\",\n \"browsers\": [\n \"O10.6\"\n ],\n \"relevance\": 50,\n \"description\": \"Determines the alignment of the replaced element inside its box.\",\n \"restrictions\": [\n \"position\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"opacity\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S2\",\n \"C1\",\n \"IE9\",\n \"O9\"\n ],\n \"syntax\": \"<alpha-value>\",\n \"relevance\": 93,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/opacity\"\n }\n ],\n \"description\": \"Opacity of an element's text, where 1 is opaque and 0 is entirely transparent.\",\n \"restrictions\": [\n \"number(0-1)\"\n ]\n },\n {\n \"name\": \"order\",\n \"browsers\": [\n \"E12\",\n \"FF20\",\n \"S9\",\n \"C29\",\n \"IE11\",\n \"O12.1\"\n ],\n \"syntax\": \"<integer>\",\n \"relevance\": 64,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/order\"\n }\n ],\n \"description\": \"Controls the order in which children of a flex container appear within the flex container, by assigning them to ordinal groups.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"orphans\",\n \"browsers\": [\n \"E12\",\n \"S1.3\",\n \"C25\",\n \"IE8\",\n \"O9.2\"\n ],\n \"syntax\": \"<integer>\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/orphans\"\n }\n ],\n \"description\": \"Specifies the minimum number of line boxes in a block container that must be left in a fragment before a fragmentation break.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-o-table-baseline\",\n \"browsers\": [\n \"O9.6\"\n ],\n \"relevance\": 50,\n \"description\": \"Determines which row of a inline-table should be used as baseline of inline-table.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-o-tab-size\",\n \"browsers\": [\n \"O10.6\"\n ],\n \"relevance\": 50,\n \"description\": \"This property determines the width of the tab character (U+0009), in space characters (U+0020), when rendered.\",\n \"restrictions\": [\n \"integer\",\n \"length\"\n ]\n },\n {\n \"name\": \"-o-text-overflow\",\n \"browsers\": [\n \"O10\"\n ],\n \"values\": [\n {\n \"name\": \"clip\",\n \"description\": \"Clip inline content that overflows. Characters may be only partially rendered.\"\n },\n {\n \"name\": \"ellipsis\",\n \"description\": \"Render an ellipsis character (U+2026) to represent clipped inline content.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Text can overflow for example when it is prevented from wrapping\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-o-transform\",\n \"browsers\": [\n \"O10.5\"\n ],\n \"values\": [\n {\n \"name\": \"matrix()\",\n \"description\": \"Specifies a 2D transformation in the form of a transformation matrix of six values. matrix(a,b,c,d,e,f) is equivalent to applying the transformation matrix [a b c d e f]\"\n },\n {\n \"name\": \"matrix3d()\",\n \"description\": \"Specifies a 3D transformation as a 4x4 homogeneous matrix of 16 values in column-major order.\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"rotate()\",\n \"description\": \"Specifies a 2D rotation by the angle specified in the parameter about the origin of the element, as defined by the transform-origin property.\"\n },\n {\n \"name\": \"rotate3d()\",\n \"description\": \"Specifies a clockwise 3D rotation by the angle specified in last parameter about the [x,y,z] direction vector described by the first 3 parameters.\"\n },\n {\n \"name\": \"rotateX('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the X axis.\"\n },\n {\n \"name\": \"rotateY('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the Y axis.\"\n },\n {\n \"name\": \"rotateZ('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the Z axis.\"\n },\n {\n \"name\": \"scale()\",\n \"description\": \"Specifies a 2D scale operation by the [sx,sy] scaling vector described by the 2 parameters. If the second parameter is not provided, it is takes a value equal to the first.\"\n },\n {\n \"name\": \"scale3d()\",\n \"description\": \"Specifies a 3D scale operation by the [sx,sy,sz] scaling vector described by the 3 parameters.\"\n },\n {\n \"name\": \"scaleX()\",\n \"description\": \"Specifies a scale operation using the [sx,1] scaling vector, where sx is given as the parameter.\"\n },\n {\n \"name\": \"scaleY()\",\n \"description\": \"Specifies a scale operation using the [sy,1] scaling vector, where sy is given as the parameter.\"\n },\n {\n \"name\": \"scaleZ()\",\n \"description\": \"Specifies a scale operation using the [1,1,sz] scaling vector, where sz is given as the parameter.\"\n },\n {\n \"name\": \"skew()\",\n \"description\": \"Specifies a skew transformation along the X and Y axes. The first angle parameter specifies the skew on the X axis. The second angle parameter specifies the skew on the Y axis. If the second parameter is not given then a value of 0 is used for the Y angle (ie: no skew on the Y axis).\"\n },\n {\n \"name\": \"skewX()\",\n \"description\": \"Specifies a skew transformation along the X axis by the given angle.\"\n },\n {\n \"name\": \"skewY()\",\n \"description\": \"Specifies a skew transformation along the Y axis by the given angle.\"\n },\n {\n \"name\": \"translate()\",\n \"description\": \"Specifies a 2D translation by the vector [tx, ty], where tx is the first translation-value parameter and ty is the optional second translation-value parameter.\"\n },\n {\n \"name\": \"translate3d()\",\n \"description\": \"Specifies a 3D translation by the vector [tx,ty,tz], with tx, ty and tz being the first, second and third translation-value parameters respectively.\"\n },\n {\n \"name\": \"translateX()\",\n \"description\": \"Specifies a translation by the given amount in the X direction.\"\n },\n {\n \"name\": \"translateY()\",\n \"description\": \"Specifies a translation by the given amount in the Y direction.\"\n },\n {\n \"name\": \"translateZ()\",\n \"description\": \"Specifies a translation by the given amount in the Z direction. Note that percentage values are not allowed in the translateZ translation-value, and if present are evaluated as 0.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"A two-dimensional transformation is applied to an element through the 'transform' property. This property contains a list of transform functions similar to those allowed by SVG.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-o-transform-origin\",\n \"browsers\": [\n \"O10.5\"\n ],\n \"relevance\": 50,\n \"description\": \"Establishes the origin of transformation for an element.\",\n \"restrictions\": [\n \"positon\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-o-transition\",\n \"browsers\": [\n \"O11.5\"\n ],\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"Every property that is able to undergo a transition will do so.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No property will transition.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property combines four of the transition properties into a single property.\",\n \"restrictions\": [\n \"time\",\n \"property\",\n \"timing-function\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-o-transition-delay\",\n \"browsers\": [\n \"O11.5\"\n ],\n \"relevance\": 50,\n \"description\": \"Defines when the transition will start. It allows a transition to begin execution some period of time from when it is applied.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-o-transition-duration\",\n \"browsers\": [\n \"O11.5\"\n ],\n \"relevance\": 50,\n \"description\": \"Specifies how long the transition from the old value to the new value should take.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-o-transition-property\",\n \"browsers\": [\n \"O11.5\"\n ],\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"Every property that is able to undergo a transition will do so.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No property will transition.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the name of the CSS property to which the transition is applied.\",\n \"restrictions\": [\n \"property\"\n ]\n },\n {\n \"name\": \"-o-transition-timing-function\",\n \"browsers\": [\n \"O11.5\"\n ],\n \"relevance\": 50,\n \"description\": \"Describes how the intermediate values used during a transition will be calculated.\",\n \"restrictions\": [\n \"timing-function\"\n ]\n },\n {\n \"name\": \"offset-block-end\",\n \"browsers\": [\n \"FF41\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Logical 'bottom'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"offset-block-start\",\n \"browsers\": [\n \"FF41\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Logical 'top'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"offset-inline-end\",\n \"browsers\": [\n \"FF41\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Logical 'right'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"offset-inline-start\",\n \"browsers\": [\n \"FF41\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Logical 'left'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"outline\",\n \"browsers\": [\n \"E94\",\n \"FF88\",\n \"S1.2\",\n \"C94\",\n \"IE8\",\n \"O80\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Permits the user agent to render a custom outline style, typically the default platform style.\"\n },\n {\n \"name\": \"invert\",\n \"browsers\": [\n \"E94\",\n \"FF88\",\n \"S1.2\",\n \"C94\",\n \"IE8\",\n \"O80\"\n ],\n \"description\": \"Performs a color inversion on the pixels on the screen.\"\n }\n ],\n \"syntax\": \"[ <'outline-color'> || <'outline-style'> || <'outline-width'> ]\",\n \"relevance\": 88,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/outline\"\n }\n ],\n \"description\": \"Shorthand property for 'outline-style', 'outline-width', and 'outline-color'.\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\",\n \"enum\"\n ]\n },\n {\n \"name\": \"outline-color\",\n \"browsers\": [\n \"E12\",\n \"FF1.5\",\n \"S1.2\",\n \"C1\",\n \"IE8\",\n \"O7\"\n ],\n \"values\": [\n {\n \"name\": \"invert\",\n \"browsers\": [\n \"E12\",\n \"FF1.5\",\n \"S1.2\",\n \"C1\",\n \"IE8\",\n \"O7\"\n ],\n \"description\": \"Performs a color inversion on the pixels on the screen.\"\n }\n ],\n \"syntax\": \"<color> | invert\",\n \"relevance\": 55,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/outline-color\"\n }\n ],\n \"description\": \"The color of the outline.\",\n \"restrictions\": [\n \"enum\",\n \"color\"\n ]\n },\n {\n \"name\": \"outline-offset\",\n \"browsers\": [\n \"E15\",\n \"FF1.5\",\n \"S1.2\",\n \"C1\",\n \"O9.5\"\n ],\n \"syntax\": \"<length>\",\n \"relevance\": 69,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/outline-offset\"\n }\n ],\n \"description\": \"Offset the outline and draw it beyond the border edge.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"outline-style\",\n \"browsers\": [\n \"E12\",\n \"FF1.5\",\n \"S1.2\",\n \"C1\",\n \"IE8\",\n \"O7\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Permits the user agent to render a custom outline style, typically the default platform style.\"\n }\n ],\n \"syntax\": \"auto | <'border-style'>\",\n \"relevance\": 62,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/outline-style\"\n }\n ],\n \"description\": \"Style of the outline.\",\n \"restrictions\": [\n \"line-style\",\n \"enum\"\n ]\n },\n {\n \"name\": \"outline-width\",\n \"browsers\": [\n \"E12\",\n \"FF1.5\",\n \"S1.2\",\n \"C1\",\n \"IE8\",\n \"O7\"\n ],\n \"syntax\": \"<line-width>\",\n \"relevance\": 61,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/outline-width\"\n }\n ],\n \"description\": \"Width of the outline.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"overflow\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The behavior of the 'auto' value is UA-dependent, but should cause a scrolling mechanism to be provided for overflowing boxes.\"\n },\n {\n \"name\": \"hidden\",\n \"description\": \"Content is clipped and no scrolling mechanism should be provided to view the content outside the clipping region.\"\n },\n {\n \"name\": \"-moz-hidden-unscrollable\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"description\": \"Same as the standardized 'clip', except doesn't establish a block formatting context.\"\n },\n {\n \"name\": \"scroll\",\n \"description\": \"Content is clipped and if the user agent uses a scrolling mechanism that is visible on the screen (such as a scroll bar or a panner), that mechanism should be displayed for a box whether or not any of its content is clipped.\"\n },\n {\n \"name\": \"visible\",\n \"description\": \"Content is not clipped, i.e., it may be rendered outside the content box.\"\n }\n ],\n \"syntax\": \"[ visible | hidden | clip | scroll | auto ]{1,2}\",\n \"relevance\": 93,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overflow\"\n }\n ],\n \"description\": \"Shorthand for setting 'overflow-x' and 'overflow-y'.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"overflow-wrap\",\n \"browsers\": [\n \"E18\",\n \"FF49\",\n \"S7\",\n \"C23\",\n \"IE5.5\",\n \"O12.1\"\n ],\n \"values\": [\n {\n \"name\": \"break-word\",\n \"description\": \"An otherwise unbreakable sequence of characters may be broken at an arbitrary point if there are no otherwise-acceptable break points in the line.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Lines may break only at allowed break points.\"\n }\n ],\n \"syntax\": \"normal | break-word | anywhere\",\n \"relevance\": 65,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overflow-wrap\"\n }\n ],\n \"description\": \"Specifies whether the UA may break within a word to prevent overflow when an otherwise-unbreakable string is too long to fit within the line box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"overflow-x\",\n \"browsers\": [\n \"E12\",\n \"FF3.5\",\n \"S3\",\n \"C1\",\n \"IE5\",\n \"O9.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The behavior of the 'auto' value is UA-dependent, but should cause a scrolling mechanism to be provided for overflowing boxes.\"\n },\n {\n \"name\": \"hidden\",\n \"description\": \"Content is clipped and no scrolling mechanism should be provided to view the content outside the clipping region.\"\n },\n {\n \"name\": \"scroll\",\n \"description\": \"Content is clipped and if the user agent uses a scrolling mechanism that is visible on the screen (such as a scroll bar or a panner), that mechanism should be displayed for a box whether or not any of its content is clipped.\"\n },\n {\n \"name\": \"visible\",\n \"description\": \"Content is not clipped, i.e., it may be rendered outside the content box.\"\n }\n ],\n \"syntax\": \"visible | hidden | clip | scroll | auto\",\n \"relevance\": 81,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overflow-x\"\n }\n ],\n \"description\": \"Specifies the handling of overflow in the horizontal direction.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"overflow-y\",\n \"browsers\": [\n \"E12\",\n \"FF3.5\",\n \"S3\",\n \"C1\",\n \"IE5\",\n \"O9.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The behavior of the 'auto' value is UA-dependent, but should cause a scrolling mechanism to be provided for overflowing boxes.\"\n },\n {\n \"name\": \"hidden\",\n \"description\": \"Content is clipped and no scrolling mechanism should be provided to view the content outside the clipping region.\"\n },\n {\n \"name\": \"scroll\",\n \"description\": \"Content is clipped and if the user agent uses a scrolling mechanism that is visible on the screen (such as a scroll bar or a panner), that mechanism should be displayed for a box whether or not any of its content is clipped.\"\n },\n {\n \"name\": \"visible\",\n \"description\": \"Content is not clipped, i.e., it may be rendered outside the content box.\"\n }\n ],\n \"syntax\": \"visible | hidden | clip | scroll | auto\",\n \"relevance\": 83,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overflow-y\"\n }\n ],\n \"description\": \"Specifies the handling of overflow in the vertical direction.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"pad\",\n \"browsers\": [\n \"FF33\"\n ],\n \"syntax\": \"<integer> && <symbol>\",\n \"relevance\": 50,\n \"description\": \"@counter-style descriptor. Specifies a \\\"fixed-width\\\" counter style, where representations shorter than the pad value are padded with a particular <symbol>\",\n \"restrictions\": [\n \"integer\",\n \"image\",\n \"string\",\n \"identifier\"\n ]\n },\n {\n \"name\": \"padding\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"values\": [],\n \"syntax\": \"[ <length> | <percentage> ]{1,4}\",\n \"relevance\": 95,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding\"\n }\n ],\n \"description\": \"Shorthand property to set values for the thickness of the padding area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. The value may not be negative.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"padding-bottom\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"syntax\": \"<length> | <percentage>\",\n \"relevance\": 89,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding-bottom\"\n }\n ],\n \"description\": \"Shorthand property to set values for the thickness of the padding area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. The value may not be negative.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"padding-block-end\",\n \"browsers\": [\n \"E87\",\n \"FF41\",\n \"S12.1\",\n \"C87\",\n \"O73\"\n ],\n \"syntax\": \"<'padding-left'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding-block-end\"\n }\n ],\n \"description\": \"Logical 'padding-bottom'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"padding-block-start\",\n \"browsers\": [\n \"E87\",\n \"FF41\",\n \"S12.1\",\n \"C87\",\n \"O73\"\n ],\n \"syntax\": \"<'padding-left'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding-block-start\"\n }\n ],\n \"description\": \"Logical 'padding-top'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"padding-inline-end\",\n \"browsers\": [\n \"E87\",\n \"FF41\",\n \"S12.1\",\n \"C87\",\n \"O73\"\n ],\n \"syntax\": \"<'padding-left'>\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding-inline-end\"\n }\n ],\n \"description\": \"Logical 'padding-right'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"padding-inline-start\",\n \"browsers\": [\n \"E87\",\n \"FF41\",\n \"S12.1\",\n \"C87\",\n \"O73\"\n ],\n \"syntax\": \"<'padding-left'>\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding-inline-start\"\n }\n ],\n \"description\": \"Logical 'padding-left'. Mapping depends on the parent element's 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"padding-left\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"syntax\": \"<length> | <percentage>\",\n \"relevance\": 90,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding-left\"\n }\n ],\n \"description\": \"Shorthand property to set values for the thickness of the padding area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. The value may not be negative.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"padding-right\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"syntax\": \"<length> | <percentage>\",\n \"relevance\": 89,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding-right\"\n }\n ],\n \"description\": \"Shorthand property to set values for the thickness of the padding area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. The value may not be negative.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"padding-top\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"syntax\": \"<length> | <percentage>\",\n \"relevance\": 90,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding-top\"\n }\n ],\n \"description\": \"Shorthand property to set values for the thickness of the padding area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. The value may not be negative.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"page-break-after\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.2\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"values\": [\n {\n \"name\": \"always\",\n \"description\": \"Always force a page break after the generated box.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page break after generated box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a page break after the generated box.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"Force one or two page breaks after the generated box so that the next page is formatted as a left page.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"Force one or two page breaks after the generated box so that the next page is formatted as a right page.\"\n }\n ],\n \"syntax\": \"auto | always | avoid | left | right | recto | verso\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/page-break-after\"\n }\n ],\n \"description\": \"Defines rules for page breaks after an element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"page-break-before\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.2\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"values\": [\n {\n \"name\": \"always\",\n \"description\": \"Always force a page break before the generated box.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page break before the generated box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a page break before the generated box.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"Force one or two page breaks before the generated box so that the next page is formatted as a left page.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"Force one or two page breaks before the generated box so that the next page is formatted as a right page.\"\n }\n ],\n \"syntax\": \"auto | always | avoid | left | right | recto | verso\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/page-break-before\"\n }\n ],\n \"description\": \"Defines rules for page breaks before an element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"page-break-inside\",\n \"browsers\": [\n \"E12\",\n \"FF19\",\n \"S1.3\",\n \"C1\",\n \"IE8\",\n \"O7\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page break inside the generated box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a page break inside the generated box.\"\n }\n ],\n \"syntax\": \"auto | avoid\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/page-break-inside\"\n }\n ],\n \"description\": \"Defines rules for page breaks inside an element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"paint-order\",\n \"browsers\": [\n \"E17\",\n \"FF60\",\n \"S8\",\n \"C35\",\n \"O22\"\n ],\n \"values\": [\n {\n \"name\": \"fill\"\n },\n {\n \"name\": \"markers\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"The element is painted with the standard order of painting operations: the 'fill' is painted first, then its 'stroke' and finally its markers.\"\n },\n {\n \"name\": \"stroke\"\n }\n ],\n \"syntax\": \"normal | [ fill || stroke || markers ]\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/paint-order\"\n }\n ],\n \"description\": \"Controls the order that the three paint operations that shapes and text are rendered with: their fill, their stroke and any markers they might have.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"perspective\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C36\",\n \"IE10\",\n \"O23\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No perspective transform is applied.\"\n }\n ],\n \"syntax\": \"none | <length>\",\n \"relevance\": 55,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/perspective\"\n }\n ],\n \"description\": \"Applies the same transform as the perspective(<number>) transform function, except that it applies only to the positioned or transformed children of the element, not to the transform on the element itself.\",\n \"restrictions\": [\n \"length\",\n \"enum\"\n ]\n },\n {\n \"name\": \"perspective-origin\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C36\",\n \"IE10\",\n \"O23\"\n ],\n \"syntax\": \"<position>\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/perspective-origin\"\n }\n ],\n \"description\": \"Establishes the origin for the perspective property. It effectively sets the X and Y position at which the viewer appears to be looking at the children of the element.\",\n \"restrictions\": [\n \"position\",\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"pointer-events\",\n \"browsers\": [\n \"E12\",\n \"FF1.5\",\n \"S4\",\n \"C1\",\n \"IE11\",\n \"O9\"\n ],\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"The given element can be the target element for pointer events whenever the pointer is over either the interior or the perimeter of the element.\"\n },\n {\n \"name\": \"fill\",\n \"description\": \"The given element can be the target element for pointer events whenever the pointer is over the interior of the element.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The given element does not receive pointer events.\"\n },\n {\n \"name\": \"painted\",\n \"description\": \"The given element can be the target element for pointer events when the pointer is over a \\\"painted\\\" area. \"\n },\n {\n \"name\": \"stroke\",\n \"description\": \"The given element can be the target element for pointer events whenever the pointer is over the perimeter of the element.\"\n },\n {\n \"name\": \"visible\",\n \"description\": \"The given element can be the target element for pointer events when the 'visibility' property is set to visible and the pointer is over either the interior or the perimeter of the element.\"\n },\n {\n \"name\": \"visibleFill\",\n \"description\": \"The given element can be the target element for pointer events when the 'visibility' property is set to visible and when the pointer is over the interior of the element.\"\n },\n {\n \"name\": \"visiblePainted\",\n \"description\": \"The given element can be the target element for pointer events when the 'visibility' property is set to visible and when the pointer is over a 'painted' area.\"\n },\n {\n \"name\": \"visibleStroke\",\n \"description\": \"The given element can be the target element for pointer events when the 'visibility' property is set to visible and when the pointer is over the perimeter of the element.\"\n }\n ],\n \"syntax\": \"auto | none | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | inherit\",\n \"relevance\": 82,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/pointer-events\"\n }\n ],\n \"description\": \"Specifies under what circumstances a given element can be the target element for a pointer event.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"position\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O4\"\n ],\n \"values\": [\n {\n \"name\": \"absolute\",\n \"description\": \"The box's position (and possibly size) is specified with the 'top', 'right', 'bottom', and 'left' properties. These properties specify offsets with respect to the box's 'containing block'.\"\n },\n {\n \"name\": \"fixed\",\n \"description\": \"The box's position is calculated according to the 'absolute' model, but in addition, the box is fixed with respect to some reference. As with the 'absolute' model, the box's margins do not collapse with any other margins.\"\n },\n {\n \"name\": \"-ms-page\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O4\"\n ],\n \"description\": \"The box's position is calculated according to the 'absolute' model.\"\n },\n {\n \"name\": \"relative\",\n \"description\": \"The box's position is calculated according to the normal flow (this is called the position in normal flow). Then the box is offset relative to its normal position.\"\n },\n {\n \"name\": \"static\",\n \"description\": \"The box is a normal box, laid out according to the normal flow. The 'top', 'right', 'bottom', and 'left' properties do not apply.\"\n },\n {\n \"name\": \"sticky\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O4\"\n ],\n \"description\": \"The box's position is calculated according to the normal flow. Then the box is offset relative to its flow root and containing block and in all cases, including table elements, does not affect the position of any following boxes.\"\n },\n {\n \"name\": \"-webkit-sticky\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O4\"\n ],\n \"description\": \"The box's position is calculated according to the normal flow. Then the box is offset relative to its flow root and containing block and in all cases, including table elements, does not affect the position of any following boxes.\"\n }\n ],\n \"syntax\": \"static | relative | absolute | sticky | fixed\",\n \"relevance\": 95,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/position\"\n }\n ],\n \"description\": \"The position CSS property sets how an element is positioned in a document. The top, right, bottom, and left properties determine the final location of positioned elements.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"prefix\",\n \"browsers\": [\n \"FF33\"\n ],\n \"syntax\": \"<symbol>\",\n \"relevance\": 50,\n \"description\": \"@counter-style descriptor. Specifies a <symbol> that is prepended to the marker representation.\",\n \"restrictions\": [\n \"image\",\n \"string\",\n \"identifier\"\n ]\n },\n {\n \"name\": \"quotes\",\n \"browsers\": [\n \"E12\",\n \"FF1.5\",\n \"S9\",\n \"C11\",\n \"IE8\",\n \"O4\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The 'open-quote' and 'close-quote' values of the 'content' property produce no quotations marks, as if they were 'no-open-quote' and 'no-close-quote' respectively.\"\n }\n ],\n \"syntax\": \"none | auto | [ <string> <string> ]+\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/quotes\"\n }\n ],\n \"description\": \"Specifies quotation marks for any number of embedded quotations.\",\n \"restrictions\": [\n \"string\"\n ]\n },\n {\n \"name\": \"range\",\n \"browsers\": [\n \"FF33\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The range depends on the counter system.\"\n },\n {\n \"name\": \"infinite\",\n \"description\": \"If used as the first value in a range, it represents negative infinity; if used as the second value, it represents positive infinity.\"\n }\n ],\n \"syntax\": \"[ [ <integer> | infinite ]{2} ]# | auto\",\n \"relevance\": 50,\n \"description\": \"@counter-style descriptor. Defines the ranges over which the counter style is defined.\",\n \"restrictions\": [\n \"integer\",\n \"enum\"\n ]\n },\n {\n \"name\": \"resize\",\n \"browsers\": [\n \"E79\",\n \"FF4\",\n \"S3\",\n \"C1\",\n \"O12.1\"\n ],\n \"values\": [\n {\n \"name\": \"both\",\n \"description\": \"The UA presents a bidirectional resizing mechanism to allow the user to adjust both the height and the width of the element.\"\n },\n {\n \"name\": \"horizontal\",\n \"description\": \"The UA presents a unidirectional horizontal resizing mechanism to allow the user to adjust only the width of the element.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The UA does not present a resizing mechanism on the element, and the user is given no direct manipulation mechanism to resize the element.\"\n },\n {\n \"name\": \"vertical\",\n \"description\": \"The UA presents a unidirectional vertical resizing mechanism to allow the user to adjust only the height of the element.\"\n }\n ],\n \"syntax\": \"none | both | horizontal | vertical | block | inline\",\n \"relevance\": 60,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/resize\"\n }\n ],\n \"description\": \"Specifies whether or not an element is resizable by the user, and if so, along which axis/axes.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"right\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE5.5\",\n \"O5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well\"\n }\n ],\n \"syntax\": \"<length> | <percentage> | auto\",\n \"relevance\": 91,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/right\"\n }\n ],\n \"description\": \"Specifies how far an absolutely positioned box's right margin edge is offset to the left of the right edge of the box's 'containing block'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"ruby-align\",\n \"browsers\": [\n \"FF38\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"browsers\": [\n \"FF38\"\n ],\n \"description\": \"The user agent determines how the ruby contents are aligned. This is the initial value.\"\n },\n {\n \"name\": \"center\",\n \"description\": \"The ruby content is centered within its box.\"\n },\n {\n \"name\": \"distribute-letter\",\n \"browsers\": [\n \"FF38\"\n ],\n \"description\": \"If the width of the ruby text is smaller than that of the base, then the ruby text contents are evenly distributed across the width of the base, with the first and last ruby text glyphs lining up with the corresponding first and last base glyphs. If the width of the ruby text is at least the width of the base, then the letters of the base are evenly distributed across the width of the ruby text.\"\n },\n {\n \"name\": \"distribute-space\",\n \"browsers\": [\n \"FF38\"\n ],\n \"description\": \"If the width of the ruby text is smaller than that of the base, then the ruby text contents are evenly distributed across the width of the base, with a certain amount of white space preceding the first and following the last character in the ruby text. That amount of white space is normally equal to half the amount of inter-character space of the ruby text.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"The ruby text content is aligned with the start edge of the base.\"\n },\n {\n \"name\": \"line-edge\",\n \"browsers\": [\n \"FF38\"\n ],\n \"description\": \"If the ruby text is not adjacent to a line edge, it is aligned as in 'auto'. If it is adjacent to a line edge, then it is still aligned as in auto, but the side of the ruby text that touches the end of the line is lined up with the corresponding edge of the base.\"\n },\n {\n \"name\": \"right\",\n \"browsers\": [\n \"FF38\"\n ],\n \"description\": \"The ruby text content is aligned with the end edge of the base.\"\n },\n {\n \"name\": \"start\",\n \"browsers\": [\n \"FF38\"\n ],\n \"description\": \"The ruby text content is aligned with the start edge of the base.\"\n },\n {\n \"name\": \"space-between\",\n \"browsers\": [\n \"FF38\"\n ],\n \"description\": \"The ruby content expands as defined for normal text justification (as defined by 'text-justify'),\"\n },\n {\n \"name\": \"space-around\",\n \"browsers\": [\n \"FF38\"\n ],\n \"description\": \"As for 'space-between' except that there exists an extra justification opportunities whose space is distributed half before and half after the ruby content.\"\n }\n ],\n \"status\": \"experimental\",\n \"syntax\": \"start | center | space-between | space-around\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/ruby-align\"\n }\n ],\n \"description\": \"Specifies how text is distributed within the various ruby boxes when their contents do not exactly fill their respective boxes.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"ruby-overhang\",\n \"browsers\": [\n \"FF10\",\n \"IE5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The ruby text can overhang text adjacent to the base on either side. This is the initial value.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"The ruby text can overhang the text that follows it.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The ruby text cannot overhang any text adjacent to its base, only its own base.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"The ruby text can overhang the text that precedes it.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Determines whether, and on which side, ruby text is allowed to partially overhang any adjacent text in addition to its own base, when the ruby text is wider than the ruby base.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"ruby-position\",\n \"browsers\": [\n \"E84\",\n \"FF38\",\n \"S7\",\n \"C84\",\n \"O70\"\n ],\n \"values\": [\n {\n \"name\": \"after\",\n \"description\": \"The ruby text appears after the base. This is a relatively rare setting used in ideographic East Asian writing systems, most easily found in educational text.\"\n },\n {\n \"name\": \"before\",\n \"description\": \"The ruby text appears before the base. This is the most common setting used in ideographic East Asian writing systems.\"\n },\n {\n \"name\": \"inline\"\n },\n {\n \"name\": \"right\",\n \"description\": \"The ruby text appears on the right of the base. Unlike 'before' and 'after', this value is not relative to the text flow direction.\"\n }\n ],\n \"syntax\": \"[ alternate || [ over | under ] ] | inter-character\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/ruby-position\"\n }\n ],\n \"description\": \"Used by the parent of elements with display: ruby-text to control the position of the ruby text with respect to its base.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"ruby-span\",\n \"browsers\": [\n \"FF10\"\n ],\n \"values\": [\n {\n \"name\": \"attr(x)\",\n \"description\": \"The value of attribute 'x' is a string value. The string value is evaluated as a <number> to determine the number of ruby base elements to be spanned by the annotation element.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No spanning. The computed value is '1'.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Determines whether, and on which side, ruby text is allowed to partially overhang any adjacent text in addition to its own base, when the ruby text is wider than the ruby base.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"scrollbar-3dlight-color\",\n \"browsers\": [\n \"IE5\"\n ],\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scrollbar-3dlight-color\"\n }\n ],\n \"description\": \"Determines the color of the top and left edges of the scroll box and scroll arrows of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"scrollbar-arrow-color\",\n \"browsers\": [\n \"IE5\"\n ],\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scrollbar-arrow-color\"\n }\n ],\n \"description\": \"Determines the color of the arrow elements of a scroll arrow.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"scrollbar-base-color\",\n \"browsers\": [\n \"IE5\"\n ],\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scrollbar-base-color\"\n }\n ],\n \"description\": \"Determines the color of the main elements of a scroll bar, which include the scroll box, track, and scroll arrows.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"scrollbar-darkshadow-color\",\n \"browsers\": [\n \"IE5\"\n ],\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scrollbar-darkshadow-color\"\n }\n ],\n \"description\": \"Determines the color of the gutter of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"scrollbar-face-color\",\n \"browsers\": [\n \"IE5\"\n ],\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scrollbar-face-color\"\n }\n ],\n \"description\": \"Determines the color of the scroll box and scroll arrows of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"scrollbar-highlight-color\",\n \"browsers\": [\n \"IE5\"\n ],\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scrollbar-highlight-color\"\n }\n ],\n \"description\": \"Determines the color of the top and left edges of the scroll box and scroll arrows of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"scrollbar-shadow-color\",\n \"browsers\": [\n \"IE5\"\n ],\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scrollbar-shadow-color\"\n }\n ],\n \"description\": \"Determines the color of the bottom and right edges of the scroll box and scroll arrows of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"scrollbar-track-color\",\n \"browsers\": [\n \"IE6\"\n ],\n \"relevance\": 50,\n \"description\": \"Determines the color of the track element of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"scroll-behavior\",\n \"browsers\": [\n \"E79\",\n \"FF36\",\n \"S15.4\",\n \"C61\",\n \"O48\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Scrolls in an instant fashion.\"\n },\n {\n \"name\": \"smooth\",\n \"description\": \"Scrolls in a smooth fashion using a user-agent-defined timing function and time period.\"\n }\n ],\n \"syntax\": \"auto | smooth\",\n \"relevance\": 54,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-behavior\"\n }\n ],\n \"description\": \"Specifies the scrolling behavior for a scrolling box, when scrolling happens due to navigation or CSSOM scrolling APIs.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"scroll-snap-coordinate\",\n \"browsers\": [\n \"FF39\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Specifies that this element does not contribute a snap point.\"\n }\n ],\n \"status\": \"obsolete\",\n \"syntax\": \"none | <position>#\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-coordinate\"\n }\n ],\n \"description\": \"Defines the x and y coordinate within the element which will align with the nearest ancestor scroll container's snap-destination for the respective axis.\",\n \"restrictions\": [\n \"position\",\n \"length\",\n \"percentage\",\n \"enum\"\n ]\n },\n {\n \"name\": \"scroll-snap-destination\",\n \"browsers\": [\n \"FF39\"\n ],\n \"status\": \"obsolete\",\n \"syntax\": \"<position>\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-destination\"\n }\n ],\n \"description\": \"Define the x and y coordinate within the scroll container's visual viewport which element snap points will align with.\",\n \"restrictions\": [\n \"position\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"scroll-snap-points-x\",\n \"browsers\": [\n \"FF39\",\n \"S9\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No snap points are defined by this scroll container.\"\n },\n {\n \"name\": \"repeat()\",\n \"description\": \"Defines an interval at which snap points are defined, starting from the container's relevant start edge.\"\n }\n ],\n \"status\": \"obsolete\",\n \"syntax\": \"none | repeat( <length-percentage> )\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-points-x\"\n }\n ],\n \"description\": \"Defines the positioning of snap points along the x axis of the scroll container it is applied to.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"scroll-snap-points-y\",\n \"browsers\": [\n \"FF39\",\n \"S9\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No snap points are defined by this scroll container.\"\n },\n {\n \"name\": \"repeat()\",\n \"description\": \"Defines an interval at which snap points are defined, starting from the container's relevant start edge.\"\n }\n ],\n \"status\": \"obsolete\",\n \"syntax\": \"none | repeat( <length-percentage> )\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-points-y\"\n }\n ],\n \"description\": \"Defines the positioning of snap points along the y axis of the scroll container it is applied to.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"scroll-snap-type\",\n \"browsers\": [\n \"E79\",\n \"FF99\",\n \"S11\",\n \"C69\",\n \"IE10\",\n \"O56\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The visual viewport of this scroll container must ignore snap points, if any, when scrolled.\"\n },\n {\n \"name\": \"mandatory\",\n \"description\": \"The visual viewport of this scroll container is guaranteed to rest on a snap point when there are no active scrolling operations.\"\n },\n {\n \"name\": \"proximity\",\n \"description\": \"The visual viewport of this scroll container may come to rest on a snap point at the termination of a scroll at the discretion of the UA given the parameters of the scroll.\"\n }\n ],\n \"syntax\": \"none | [ x | y | block | inline | both ] [ mandatory | proximity ]?\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type\"\n }\n ],\n \"description\": \"Defines how strictly snap points are enforced on the scroll container.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"shape-image-threshold\",\n \"browsers\": [\n \"E79\",\n \"FF62\",\n \"S10.1\",\n \"C37\",\n \"O24\"\n ],\n \"syntax\": \"<alpha-value>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/shape-image-threshold\"\n }\n ],\n \"description\": \"Defines the alpha channel threshold used to extract the shape using an image. A value of 0.5 means that the shape will enclose all the pixels that are more than 50% opaque.\",\n \"restrictions\": [\n \"number\"\n ]\n },\n {\n \"name\": \"shape-margin\",\n \"browsers\": [\n \"E79\",\n \"FF62\",\n \"S10.1\",\n \"C37\",\n \"O24\"\n ],\n \"syntax\": \"<length-percentage>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/shape-margin\"\n }\n ],\n \"description\": \"Adds a margin to a 'shape-outside'. This defines a new shape that is the smallest contour that includes all the points that are the 'shape-margin' distance outward in the perpendicular direction from a point on the underlying shape.\",\n \"restrictions\": [\n \"url\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"shape-outside\",\n \"browsers\": [\n \"E79\",\n \"FF62\",\n \"S10.1\",\n \"C37\",\n \"O24\"\n ],\n \"values\": [\n {\n \"name\": \"margin-box\",\n \"description\": \"The background is painted within (clipped to) the margin box.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The float area is unaffected.\"\n }\n ],\n \"syntax\": \"none | [ <shape-box> || <basic-shape> ] | <image>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/shape-outside\"\n }\n ],\n \"description\": \"Specifies an orthogonal rotation to be applied to an image before it is laid out.\",\n \"restrictions\": [\n \"image\",\n \"box\",\n \"shape\",\n \"enum\"\n ]\n },\n {\n \"name\": \"shape-rendering\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Suppresses aural rendering.\"\n },\n {\n \"name\": \"crispEdges\",\n \"description\": \"Emphasize the contrast between clean edges of artwork over rendering speed and geometric precision.\"\n },\n {\n \"name\": \"geometricPrecision\",\n \"description\": \"Emphasize geometric precision over speed and crisp edges.\"\n },\n {\n \"name\": \"optimizeSpeed\",\n \"description\": \"Emphasize rendering speed over geometric precision and crisp edges.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Provides hints about what tradeoffs to make as it renders vector graphics elements such as <path> elements and basic shapes such as circles and rectangles.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"size\",\n \"browsers\": [\n \"C\",\n \"O8\"\n ],\n \"syntax\": \"<length>{1,2} | auto | [ <page-size> || [ portrait | landscape ] ]\",\n \"relevance\": 53,\n \"description\": \"The size CSS at-rule descriptor, used with the @page at-rule, defines the size and orientation of the box which is used to represent a page. Most of the time, this size corresponds to the target size of the printed page if applicable.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"src\",\n \"values\": [\n {\n \"name\": \"url()\",\n \"description\": \"Reference font by URL\"\n },\n {\n \"name\": \"format()\",\n \"description\": \"Optional hint describing the format of the font resource.\"\n },\n {\n \"name\": \"local()\",\n \"description\": \"Format-specific string that identifies a locally available copy of a given font.\"\n }\n ],\n \"syntax\": \"[ <url> [ format( <string># ) ]? | local( <family-name> ) ]#\",\n \"relevance\": 87,\n \"description\": \"@font-face descriptor. Specifies the resource containing font data. It is required, whether the font is downloadable or locally installed.\",\n \"restrictions\": [\n \"enum\",\n \"url\",\n \"identifier\"\n ]\n },\n {\n \"name\": \"stop-color\",\n \"relevance\": 51,\n \"description\": \"Indicates what color to use at that gradient stop.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"stop-opacity\",\n \"relevance\": 50,\n \"description\": \"Defines the opacity of a given gradient stop.\",\n \"restrictions\": [\n \"number(0-1)\"\n ]\n },\n {\n \"name\": \"stroke\",\n \"values\": [\n {\n \"name\": \"url()\",\n \"description\": \"A URL reference to a paint server element, which is an element that defines a paint server: 'hatch', 'linearGradient', 'mesh', 'pattern', 'radialGradient' and 'solidcolor'.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No paint is applied in this layer.\"\n }\n ],\n \"relevance\": 67,\n \"description\": \"Paints along the outline of the given graphical element.\",\n \"restrictions\": [\n \"color\",\n \"enum\",\n \"url\"\n ]\n },\n {\n \"name\": \"stroke-dasharray\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Indicates that no dashing is used.\"\n }\n ],\n \"relevance\": 62,\n \"description\": \"Controls the pattern of dashes and gaps used to stroke paths.\",\n \"restrictions\": [\n \"length\",\n \"percentage\",\n \"number\",\n \"enum\"\n ]\n },\n {\n \"name\": \"stroke-dashoffset\",\n \"relevance\": 62,\n \"description\": \"Specifies the distance into the dash pattern to start the dash.\",\n \"restrictions\": [\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"stroke-linecap\",\n \"values\": [\n {\n \"name\": \"butt\",\n \"description\": \"Indicates that the stroke for each subpath does not extend beyond its two endpoints.\"\n },\n {\n \"name\": \"round\",\n \"description\": \"Indicates that at each end of each subpath, the shape representing the stroke will be extended by a half circle with a radius equal to the stroke width.\"\n },\n {\n \"name\": \"square\",\n \"description\": \"Indicates that at the end of each subpath, the shape representing the stroke will be extended by a rectangle with the same width as the stroke width and whose length is half of the stroke width.\"\n }\n ],\n \"relevance\": 53,\n \"description\": \"Specifies the shape to be used at the end of open subpaths when they are stroked.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"stroke-linejoin\",\n \"values\": [\n {\n \"name\": \"bevel\",\n \"description\": \"Indicates that a bevelled corner is to be used to join path segments.\"\n },\n {\n \"name\": \"miter\",\n \"description\": \"Indicates that a sharp corner is to be used to join path segments.\"\n },\n {\n \"name\": \"round\",\n \"description\": \"Indicates that a round corner is to be used to join path segments.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the shape to be used at the corners of paths or basic shapes when they are stroked.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"stroke-miterlimit\",\n \"relevance\": 50,\n \"description\": \"When two line segments meet at a sharp angle and miter joins have been specified for 'stroke-linejoin', it is possible for the miter to extend far beyond the thickness of the line stroking the path.\",\n \"restrictions\": [\n \"number\"\n ]\n },\n {\n \"name\": \"stroke-opacity\",\n \"relevance\": 52,\n \"description\": \"Specifies the opacity of the painting operation used to stroke the current object.\",\n \"restrictions\": [\n \"number(0-1)\"\n ]\n },\n {\n \"name\": \"stroke-width\",\n \"relevance\": 64,\n \"description\": \"Specifies the width of the stroke on the current object.\",\n \"restrictions\": [\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"suffix\",\n \"browsers\": [\n \"FF33\"\n ],\n \"syntax\": \"<symbol>\",\n \"relevance\": 50,\n \"description\": \"@counter-style descriptor. Specifies a <symbol> that is appended to the marker representation.\",\n \"restrictions\": [\n \"image\",\n \"string\",\n \"identifier\"\n ]\n },\n {\n \"name\": \"system\",\n \"browsers\": [\n \"FF33\"\n ],\n \"values\": [\n {\n \"name\": \"additive\",\n \"description\": \"Represents \\\"sign-value\\\" numbering systems, which, rather than using reusing digits in different positions to change their value, define additional digits with much larger values, so that the value of the number can be obtained by adding all the digits together.\"\n },\n {\n \"name\": \"alphabetic\",\n \"description\": \"Interprets the list of counter symbols as digits to an alphabetic numbering system, similar to the default lower-alpha counter style, which wraps from \\\"a\\\", \\\"b\\\", \\\"c\\\", to \\\"aa\\\", \\\"ab\\\", \\\"ac\\\".\"\n },\n {\n \"name\": \"cyclic\",\n \"description\": \"Cycles repeatedly through its provided symbols, looping back to the beginning when it reaches the end of the list.\"\n },\n {\n \"name\": \"extends\",\n \"description\": \"Use the algorithm of another counter style, but alter other aspects.\"\n },\n {\n \"name\": \"fixed\",\n \"description\": \"Runs through its list of counter symbols once, then falls back.\"\n },\n {\n \"name\": \"numeric\",\n \"description\": \"interprets the list of counter symbols as digits to a \\\"place-value\\\" numbering system, similar to the default 'decimal' counter style.\"\n },\n {\n \"name\": \"symbolic\",\n \"description\": \"Cycles repeatedly through its provided symbols, doubling, tripling, etc. the symbols on each successive pass through the list.\"\n }\n ],\n \"syntax\": \"cyclic | numeric | alphabetic | symbolic | additive | [ fixed <integer>? ] | [ extends <counter-style-name> ]\",\n \"relevance\": 50,\n \"description\": \"@counter-style descriptor. Specifies which algorithm will be used to construct the counter's representation based on the counter value.\",\n \"restrictions\": [\n \"enum\",\n \"integer\"\n ]\n },\n {\n \"name\": \"symbols\",\n \"browsers\": [\n \"FF33\"\n ],\n \"syntax\": \"<symbol>+\",\n \"relevance\": 50,\n \"description\": \"@counter-style descriptor. Specifies the symbols used by the marker-construction algorithm specified by the system descriptor.\",\n \"restrictions\": [\n \"image\",\n \"string\",\n \"identifier\"\n ]\n },\n {\n \"name\": \"table-layout\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C14\",\n \"IE5\",\n \"O7\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Use any automatic table layout algorithm.\"\n },\n {\n \"name\": \"fixed\",\n \"description\": \"Use the fixed table layout algorithm.\"\n }\n ],\n \"syntax\": \"auto | fixed\",\n \"relevance\": 60,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/table-layout\"\n }\n ],\n \"description\": \"Controls the algorithm used to lay out the table cells, rows, and columns.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"tab-size\",\n \"browsers\": [\n \"E79\",\n \"FF91\",\n \"S7\",\n \"C21\",\n \"O15\"\n ],\n \"syntax\": \"<integer> | <length>\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/tab-size\"\n }\n ],\n \"description\": \"Determines the width of the tab character (U+0009), in space characters (U+0020), when rendered.\",\n \"restrictions\": [\n \"integer\",\n \"length\"\n ]\n },\n {\n \"name\": \"text-align\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE3\",\n \"O3.5\"\n ],\n \"values\": [\n {\n \"name\": \"center\",\n \"description\": \"The inline contents are centered within the line box.\"\n },\n {\n \"name\": \"end\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE3\",\n \"O3.5\"\n ],\n \"description\": \"The inline contents are aligned to the end edge of the line box.\"\n },\n {\n \"name\": \"justify\",\n \"description\": \"The text is justified according to the method specified by the 'text-justify' property.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"The inline contents are aligned to the left edge of the line box. In vertical text, 'left' aligns to the edge of the line box that would be the start edge for left-to-right text.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"The inline contents are aligned to the right edge of the line box. In vertical text, 'right' aligns to the edge of the line box that would be the end edge for left-to-right text.\"\n },\n {\n \"name\": \"start\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE3\",\n \"O3.5\"\n ],\n \"description\": \"The inline contents are aligned to the start edge of the line box.\"\n }\n ],\n \"syntax\": \"start | end | left | right | center | justify | match-parent\",\n \"relevance\": 94,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-align\"\n }\n ],\n \"description\": \"Describes how inline contents of a block are horizontally aligned if the contents do not completely fill the line box.\",\n \"restrictions\": [\n \"string\"\n ]\n },\n {\n \"name\": \"text-align-last\",\n \"browsers\": [\n \"E12\",\n \"FF49\",\n \"S16\",\n \"C47\",\n \"IE5.5\",\n \"O34\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Content on the affected line is aligned per 'text-align' unless 'text-align' is set to 'justify', in which case it is 'start-aligned'.\"\n },\n {\n \"name\": \"center\",\n \"description\": \"The inline contents are centered within the line box.\"\n },\n {\n \"name\": \"justify\",\n \"description\": \"The text is justified according to the method specified by the 'text-justify' property.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"The inline contents are aligned to the left edge of the line box. In vertical text, 'left' aligns to the edge of the line box that would be the start edge for left-to-right text.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"The inline contents are aligned to the right edge of the line box. In vertical text, 'right' aligns to the edge of the line box that would be the end edge for left-to-right text.\"\n }\n ],\n \"syntax\": \"auto | start | end | left | right | center | justify\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-align-last\"\n }\n ],\n \"description\": \"Describes how the last line of a block or a line right before a forced line break is aligned when 'text-align' is set to 'justify'.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"text-anchor\",\n \"values\": [\n {\n \"name\": \"end\",\n \"description\": \"The rendered characters are aligned such that the end of the resulting rendered text is at the initial current text position.\"\n },\n {\n \"name\": \"middle\",\n \"description\": \"The rendered characters are aligned such that the geometric middle of the resulting rendered text is at the initial current text position.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"The rendered characters are aligned such that the start of the resulting rendered text is at the initial current text position.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Used to align (start-, middle- or end-alignment) a string of text relative to a given point.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"text-decoration\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE3\",\n \"O3.5\"\n ],\n \"values\": [\n {\n \"name\": \"dashed\",\n \"description\": \"Produces a dashed line style.\"\n },\n {\n \"name\": \"dotted\",\n \"description\": \"Produces a dotted line.\"\n },\n {\n \"name\": \"double\",\n \"description\": \"Produces a double line.\"\n },\n {\n \"name\": \"line-through\",\n \"description\": \"Each line of text has a line through the middle.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Produces no line.\"\n },\n {\n \"name\": \"overline\",\n \"description\": \"Each line of text has a line above it.\"\n },\n {\n \"name\": \"solid\",\n \"description\": \"Produces a solid line.\"\n },\n {\n \"name\": \"underline\",\n \"description\": \"Each line of text is underlined.\"\n },\n {\n \"name\": \"wavy\",\n \"description\": \"Produces a wavy line.\"\n }\n ],\n \"syntax\": \"<'text-decoration-line'> || <'text-decoration-style'> || <'text-decoration-color'> || <'text-decoration-thickness'>\",\n \"relevance\": 92,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-decoration\"\n }\n ],\n \"description\": \"Decorations applied to font used for an element's text.\",\n \"restrictions\": [\n \"enum\",\n \"color\"\n ]\n },\n {\n \"name\": \"text-decoration-color\",\n \"browsers\": [\n \"E79\",\n \"FF36\",\n \"S12.1\",\n \"C57\",\n \"O44\"\n ],\n \"syntax\": \"<color>\",\n \"relevance\": 55,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-decoration-color\"\n }\n ],\n \"description\": \"Specifies the color of text decoration (underlines overlines, and line-throughs) set on the element with text-decoration-line.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"text-decoration-line\",\n \"browsers\": [\n \"E79\",\n \"FF36\",\n \"S12.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"line-through\",\n \"description\": \"Each line of text has a line through the middle.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Neither produces nor inhibits text decoration.\"\n },\n {\n \"name\": \"overline\",\n \"description\": \"Each line of text has a line above it.\"\n },\n {\n \"name\": \"underline\",\n \"description\": \"Each line of text is underlined.\"\n }\n ],\n \"syntax\": \"none | [ underline || overline || line-through || blink ] | spelling-error | grammar-error\",\n \"relevance\": 56,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-decoration-line\"\n }\n ],\n \"description\": \"Specifies what line decorations, if any, are added to the element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"text-decoration-style\",\n \"browsers\": [\n \"E79\",\n \"FF36\",\n \"S12.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"dashed\",\n \"description\": \"Produces a dashed line style.\"\n },\n {\n \"name\": \"dotted\",\n \"description\": \"Produces a dotted line.\"\n },\n {\n \"name\": \"double\",\n \"description\": \"Produces a double line.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Produces no line.\"\n },\n {\n \"name\": \"solid\",\n \"description\": \"Produces a solid line.\"\n },\n {\n \"name\": \"wavy\",\n \"description\": \"Produces a wavy line.\"\n }\n ],\n \"syntax\": \"solid | double | dotted | dashed | wavy\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-decoration-style\"\n }\n ],\n \"description\": \"Specifies the line style for underline, line-through and overline text decoration.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"text-indent\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE3\",\n \"O3.5\"\n ],\n \"values\": [],\n \"syntax\": \"<length-percentage> && hanging? && each-line?\",\n \"relevance\": 69,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-indent\"\n }\n ],\n \"description\": \"Specifies the indentation applied to lines of inline content in a block. The indentation only affects the first line of inline content in the block unless the 'hanging' keyword is specified, in which case it affects all lines except the first.\",\n \"restrictions\": [\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"text-justify\",\n \"browsers\": [\n \"E12\",\n \"FF55\",\n \"C32\",\n \"IE11\",\n \"O19\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The UA determines the justification algorithm to follow, based on a balance between performance and adequate presentation quality.\"\n },\n {\n \"name\": \"distribute\",\n \"description\": \"Justification primarily changes spacing both at word separators and at grapheme cluster boundaries in all scripts except those in the connected and cursive groups. This value is sometimes used in e.g. Japanese, often with the 'text-align-last' property.\"\n },\n {\n \"name\": \"distribute-all-lines\"\n },\n {\n \"name\": \"inter-cluster\",\n \"description\": \"Justification primarily changes spacing at word separators and at grapheme cluster boundaries in clustered scripts. This value is typically used for Southeast Asian scripts such as Thai.\"\n },\n {\n \"name\": \"inter-ideograph\",\n \"description\": \"Justification primarily changes spacing at word separators and at inter-graphemic boundaries in scripts that use no word spaces. This value is typically used for CJK languages.\"\n },\n {\n \"name\": \"inter-word\",\n \"description\": \"Justification primarily changes spacing at word separators. This value is typically used for languages that separate words using spaces, like English or (sometimes) Korean.\"\n },\n {\n \"name\": \"kashida\",\n \"description\": \"Justification primarily stretches Arabic and related scripts through the use of kashida or other calligraphic elongation.\"\n },\n {\n \"name\": \"newspaper\"\n }\n ],\n \"syntax\": \"auto | inter-character | inter-word | none\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-justify\"\n }\n ],\n \"description\": \"Selects the justification algorithm used when 'text-align' is set to 'justify'. The property applies to block containers, but the UA may (but is not required to) also support it on inline elements.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"text-orientation\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S14\",\n \"C48\",\n \"O35\"\n ],\n \"values\": [\n {\n \"name\": \"sideways\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S14\",\n \"C48\",\n \"O35\"\n ],\n \"description\": \"This value is equivalent to 'sideways-right' in 'vertical-rl' writing mode and equivalent to 'sideways-left' in 'vertical-lr' writing mode.\"\n },\n {\n \"name\": \"sideways-right\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S14\",\n \"C48\",\n \"O35\"\n ],\n \"description\": \"In vertical writing modes, this causes text to be set as if in a horizontal layout, but rotated 90\u00B0 clockwise.\"\n },\n {\n \"name\": \"upright\",\n \"description\": \"In vertical writing modes, characters from horizontal-only scripts are rendered upright, i.e. in their standard horizontal orientation.\"\n }\n ],\n \"syntax\": \"mixed | upright | sideways\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-orientation\"\n }\n ],\n \"description\": \"Specifies the orientation of text within a line.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"text-overflow\",\n \"browsers\": [\n \"E12\",\n \"FF7\",\n \"S1.3\",\n \"C1\",\n \"IE6\",\n \"O11\"\n ],\n \"values\": [\n {\n \"name\": \"clip\",\n \"description\": \"Clip inline content that overflows. Characters may be only partially rendered.\"\n },\n {\n \"name\": \"ellipsis\",\n \"description\": \"Render an ellipsis character (U+2026) to represent clipped inline content.\"\n }\n ],\n \"syntax\": \"[ clip | ellipsis | <string> ]{1,2}\",\n \"relevance\": 82,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-overflow\"\n }\n ],\n \"description\": \"Text can overflow for example when it is prevented from wrapping.\",\n \"restrictions\": [\n \"enum\",\n \"string\"\n ]\n },\n {\n \"name\": \"text-rendering\",\n \"browsers\": [\n \"E79\",\n \"FF1\",\n \"S5\",\n \"C4\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"geometricPrecision\",\n \"description\": \"Indicates that the user agent shall emphasize geometric precision over legibility and rendering speed.\"\n },\n {\n \"name\": \"optimizeLegibility\",\n \"description\": \"Indicates that the user agent shall emphasize legibility over rendering speed and geometric precision.\"\n },\n {\n \"name\": \"optimizeSpeed\",\n \"description\": \"Indicates that the user agent shall emphasize rendering speed over legibility and geometric precision.\"\n }\n ],\n \"syntax\": \"auto | optimizeSpeed | optimizeLegibility | geometricPrecision\",\n \"relevance\": 69,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-rendering\"\n }\n ],\n \"description\": \"The creator of SVG content might want to provide a hint to the implementation about what tradeoffs to make as it renders text. The 'text-rendering' property provides these hints.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"text-shadow\",\n \"browsers\": [\n \"E12\",\n \"FF3.5\",\n \"S1.1\",\n \"C2\",\n \"IE10\",\n \"O9.5\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No shadow.\"\n }\n ],\n \"syntax\": \"none | <shadow-t>#\",\n \"relevance\": 76,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-shadow\"\n }\n ],\n \"description\": \"Enables shadow effects to be applied to the text of the element.\",\n \"restrictions\": [\n \"length\",\n \"color\"\n ]\n },\n {\n \"name\": \"text-transform\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O7\"\n ],\n \"values\": [\n {\n \"name\": \"capitalize\",\n \"description\": \"Puts the first typographic letter unit of each word in titlecase.\"\n },\n {\n \"name\": \"lowercase\",\n \"description\": \"Puts all letters in lowercase.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No effects.\"\n },\n {\n \"name\": \"uppercase\",\n \"description\": \"Puts all letters in uppercase.\"\n }\n ],\n \"syntax\": \"none | capitalize | uppercase | lowercase | full-width | full-size-kana\",\n \"relevance\": 86,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-transform\"\n }\n ],\n \"description\": \"Controls capitalization effects of an element's text.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"text-underline-position\",\n \"browsers\": [\n \"E12\",\n \"FF74\",\n \"S12.1\",\n \"C33\",\n \"IE6\",\n \"O20\"\n ],\n \"values\": [\n {\n \"name\": \"above\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"The user agent may use any algorithm to determine the underline's position. In horizontal line layout, the underline should be aligned as for alphabetic. In vertical line layout, if the language is set to Japanese or Korean, the underline should be aligned as for over.\"\n },\n {\n \"name\": \"below\",\n \"description\": \"The underline is aligned with the under edge of the element's content box.\"\n }\n ],\n \"syntax\": \"auto | from-font | [ under || [ left | right ] ]\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-underline-position\"\n }\n ],\n \"description\": \"Sets the position of an underline specified on the same element: it does not affect underlines specified by ancestor elements. This property is typically used in vertical writing contexts such as in Japanese documents where it often desired to have the underline appear 'over' (to the right of) the affected run of text\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"top\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE5\",\n \"O6\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well\"\n }\n ],\n \"syntax\": \"<length> | <percentage> | auto\",\n \"relevance\": 95,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/top\"\n }\n ],\n \"description\": \"Specifies how far an absolutely positioned box's top margin edge is offset below the top edge of the box's 'containing block'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"touch-action\",\n \"browsers\": [\n \"E12\",\n \"FF52\",\n \"S13\",\n \"C36\",\n \"IE11\",\n \"O23\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The user agent may determine any permitted touch behaviors for touches that begin on the element.\"\n },\n {\n \"name\": \"cross-slide-x\",\n \"browsers\": [\n \"E12\",\n \"FF52\",\n \"S13\",\n \"C36\",\n \"IE11\",\n \"O23\"\n ]\n },\n {\n \"name\": \"cross-slide-y\",\n \"browsers\": [\n \"E12\",\n \"FF52\",\n \"S13\",\n \"C36\",\n \"IE11\",\n \"O23\"\n ]\n },\n {\n \"name\": \"double-tap-zoom\",\n \"browsers\": [\n \"E12\",\n \"FF52\",\n \"S13\",\n \"C36\",\n \"IE11\",\n \"O23\"\n ]\n },\n {\n \"name\": \"manipulation\",\n \"description\": \"The user agent may consider touches that begin on the element only for the purposes of scrolling and continuous zooming.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Touches that begin on the element must not trigger default touch behaviors.\"\n },\n {\n \"name\": \"pan-x\",\n \"description\": \"The user agent may consider touches that begin on the element only for the purposes of horizontally scrolling the element's nearest ancestor with horizontally scrollable content.\"\n },\n {\n \"name\": \"pan-y\",\n \"description\": \"The user agent may consider touches that begin on the element only for the purposes of vertically scrolling the element's nearest ancestor with vertically scrollable content.\"\n },\n {\n \"name\": \"pinch-zoom\",\n \"browsers\": [\n \"E12\",\n \"FF52\",\n \"S13\",\n \"C36\",\n \"IE11\",\n \"O23\"\n ]\n }\n ],\n \"syntax\": \"auto | none | [ [ pan-x | pan-left | pan-right ] || [ pan-y | pan-up | pan-down ] || pinch-zoom ] | manipulation\",\n \"relevance\": 70,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/touch-action\"\n }\n ],\n \"description\": \"Determines whether touch input may trigger default behavior supplied by user agent.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"transform\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C36\",\n \"IE10\",\n \"O23\"\n ],\n \"values\": [\n {\n \"name\": \"matrix()\",\n \"description\": \"Specifies a 2D transformation in the form of a transformation matrix of six values. matrix(a,b,c,d,e,f) is equivalent to applying the transformation matrix [a b c d e f]\"\n },\n {\n \"name\": \"matrix3d()\",\n \"description\": \"Specifies a 3D transformation as a 4x4 homogeneous matrix of 16 values in column-major order.\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"perspective()\",\n \"description\": \"Specifies a perspective projection matrix.\"\n },\n {\n \"name\": \"rotate()\",\n \"description\": \"Specifies a 2D rotation by the angle specified in the parameter about the origin of the element, as defined by the transform-origin property.\"\n },\n {\n \"name\": \"rotate3d()\",\n \"description\": \"Specifies a clockwise 3D rotation by the angle specified in last parameter about the [x,y,z] direction vector described by the first 3 parameters.\"\n },\n {\n \"name\": \"rotateX('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the X axis.\"\n },\n {\n \"name\": \"rotateY('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the Y axis.\"\n },\n {\n \"name\": \"rotateZ('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the Z axis.\"\n },\n {\n \"name\": \"scale()\",\n \"description\": \"Specifies a 2D scale operation by the [sx,sy] scaling vector described by the 2 parameters. If the second parameter is not provided, it is takes a value equal to the first.\"\n },\n {\n \"name\": \"scale3d()\",\n \"description\": \"Specifies a 3D scale operation by the [sx,sy,sz] scaling vector described by the 3 parameters.\"\n },\n {\n \"name\": \"scaleX()\",\n \"description\": \"Specifies a scale operation using the [sx,1] scaling vector, where sx is given as the parameter.\"\n },\n {\n \"name\": \"scaleY()\",\n \"description\": \"Specifies a scale operation using the [sy,1] scaling vector, where sy is given as the parameter.\"\n },\n {\n \"name\": \"scaleZ()\",\n \"description\": \"Specifies a scale operation using the [1,1,sz] scaling vector, where sz is given as the parameter.\"\n },\n {\n \"name\": \"skew()\",\n \"description\": \"Specifies a skew transformation along the X and Y axes. The first angle parameter specifies the skew on the X axis. The second angle parameter specifies the skew on the Y axis. If the second parameter is not given then a value of 0 is used for the Y angle (ie: no skew on the Y axis).\"\n },\n {\n \"name\": \"skewX()\",\n \"description\": \"Specifies a skew transformation along the X axis by the given angle.\"\n },\n {\n \"name\": \"skewY()\",\n \"description\": \"Specifies a skew transformation along the Y axis by the given angle.\"\n },\n {\n \"name\": \"translate()\",\n \"description\": \"Specifies a 2D translation by the vector [tx, ty], where tx is the first translation-value parameter and ty is the optional second translation-value parameter.\"\n },\n {\n \"name\": \"translate3d()\",\n \"description\": \"Specifies a 3D translation by the vector [tx,ty,tz], with tx, ty and tz being the first, second and third translation-value parameters respectively.\"\n },\n {\n \"name\": \"translateX()\",\n \"description\": \"Specifies a translation by the given amount in the X direction.\"\n },\n {\n \"name\": \"translateY()\",\n \"description\": \"Specifies a translation by the given amount in the Y direction.\"\n },\n {\n \"name\": \"translateZ()\",\n \"description\": \"Specifies a translation by the given amount in the Z direction. Note that percentage values are not allowed in the translateZ translation-value, and if present are evaluated as 0.\"\n }\n ],\n \"syntax\": \"none | <transform-list>\",\n \"relevance\": 91,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/transform\"\n }\n ],\n \"description\": \"A two-dimensional transformation is applied to an element through the 'transform' property. This property contains a list of transform functions similar to those allowed by SVG.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"transform-origin\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C36\",\n \"IE10\",\n \"O23\"\n ],\n \"syntax\": \"[ <length-percentage> | left | center | right | top | bottom ] | [ [ <length-percentage> | left | center | right ] && [ <length-percentage> | top | center | bottom ] ] <length>?\",\n \"relevance\": 77,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/transform-origin\"\n }\n ],\n \"description\": \"Establishes the origin of transformation for an element.\",\n \"restrictions\": [\n \"position\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"transform-style\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C36\",\n \"O23\"\n ],\n \"values\": [\n {\n \"name\": \"flat\",\n \"description\": \"All children of this element are rendered flattened into the 2D plane of the element.\"\n },\n {\n \"name\": \"preserve-3d\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C36\",\n \"O23\"\n ],\n \"description\": \"Flattening is not performed, so children maintain their position in 3D space.\"\n }\n ],\n \"syntax\": \"flat | preserve-3d\",\n \"relevance\": 55,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/transform-style\"\n }\n ],\n \"description\": \"Defines how nested elements are rendered in 3D space.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"transition\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C26\",\n \"IE10\",\n \"O12.1\"\n ],\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"Every property that is able to undergo a transition will do so.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No property will transition.\"\n }\n ],\n \"syntax\": \"<single-transition>#\",\n \"relevance\": 89,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/transition\"\n }\n ],\n \"description\": \"Shorthand property combines four of the transition properties into a single property.\",\n \"restrictions\": [\n \"time\",\n \"property\",\n \"timing-function\",\n \"enum\"\n ]\n },\n {\n \"name\": \"transition-delay\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C26\",\n \"IE10\",\n \"O12.1\"\n ],\n \"syntax\": \"<time>#\",\n \"relevance\": 63,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/transition-delay\"\n }\n ],\n \"description\": \"Defines when the transition will start. It allows a transition to begin execution some period of time from when it is applied.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"transition-duration\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C26\",\n \"IE10\",\n \"O12.1\"\n ],\n \"syntax\": \"<time>#\",\n \"relevance\": 63,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/transition-duration\"\n }\n ],\n \"description\": \"Specifies how long the transition from the old value to the new value should take.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"transition-property\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C26\",\n \"IE10\",\n \"O12.1\"\n ],\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"Every property that is able to undergo a transition will do so.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No property will transition.\"\n }\n ],\n \"syntax\": \"none | <single-transition-property>#\",\n \"relevance\": 67,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/transition-property\"\n }\n ],\n \"description\": \"Specifies the name of the CSS property to which the transition is applied.\",\n \"restrictions\": [\n \"property\"\n ]\n },\n {\n \"name\": \"transition-timing-function\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C26\",\n \"IE10\",\n \"O12.1\"\n ],\n \"syntax\": \"<easing-function>#\",\n \"relevance\": 63,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/transition-timing-function\"\n }\n ],\n \"description\": \"Describes how the intermediate values used during a transition will be calculated.\",\n \"restrictions\": [\n \"timing-function\"\n ]\n },\n {\n \"name\": \"unicode-bidi\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.3\",\n \"C2\",\n \"IE5.5\",\n \"O9.2\"\n ],\n \"values\": [\n {\n \"name\": \"bidi-override\",\n \"description\": \"Inside the element, reordering is strictly in sequence according to the 'direction' property; the implicit part of the bidirectional algorithm is ignored.\"\n },\n {\n \"name\": \"embed\",\n \"description\": \"If the element is inline-level, this value opens an additional level of embedding with respect to the bidirectional algorithm. The direction of this embedding level is given by the 'direction' property.\"\n },\n {\n \"name\": \"isolate\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.3\",\n \"C2\",\n \"IE5.5\",\n \"O9.2\"\n ],\n \"description\": \"The contents of the element are considered to be inside a separate, independent paragraph.\"\n },\n {\n \"name\": \"isolate-override\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.3\",\n \"C2\",\n \"IE5.5\",\n \"O9.2\"\n ],\n \"description\": \"This combines the isolation behavior of 'isolate' with the directional override behavior of 'bidi-override'\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"The element does not open an additional level of embedding with respect to the bidirectional algorithm. For inline-level elements, implicit reordering works across element boundaries.\"\n },\n {\n \"name\": \"plaintext\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.3\",\n \"C2\",\n \"IE5.5\",\n \"O9.2\"\n ],\n \"description\": \"For the purposes of the Unicode bidirectional algorithm, the base directionality of each bidi paragraph for which the element forms the containing block is determined not by the element's computed 'direction'.\"\n }\n ],\n \"syntax\": \"normal | embed | isolate | bidi-override | isolate-override | plaintext\",\n \"relevance\": 56,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/unicode-bidi\"\n }\n ],\n \"description\": \"The level of embedding with respect to the bidirectional algorithm.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"unicode-range\",\n \"values\": [\n {\n \"name\": \"U+26\",\n \"description\": \"Ampersand.\"\n },\n {\n \"name\": \"U+20-24F, U+2B0-2FF, U+370-4FF, U+1E00-1EFF, U+2000-20CF, U+2100-23FF, U+2500-26FF, U+E000-F8FF, U+FB00-FB4F\",\n \"description\": \"WGL4 character set (Pan-European).\"\n },\n {\n \"name\": \"U+20-17F, U+2B0-2FF, U+2000-206F, U+20A0-20CF, U+2100-21FF, U+2600-26FF\",\n \"description\": \"The Multilingual European Subset No. 1. Latin. Covers ~44 languages.\"\n },\n {\n \"name\": \"U+20-2FF, U+370-4FF, U+1E00-20CF, U+2100-23FF, U+2500-26FF, U+FB00-FB4F, U+FFF0-FFFD\",\n \"description\": \"The Multilingual European Subset No. 2. Latin, Greek, and Cyrillic. Covers ~128 language.\"\n },\n {\n \"name\": \"U+20-4FF, U+530-58F, U+10D0-10FF, U+1E00-23FF, U+2440-245F, U+2500-26FF, U+FB00-FB4F, U+FE20-FE2F, U+FFF0-FFFD\",\n \"description\": \"The Multilingual European Subset No. 3. Covers all characters belonging to European scripts.\"\n },\n {\n \"name\": \"U+00-7F\",\n \"description\": \"Basic Latin (ASCII).\"\n },\n {\n \"name\": \"U+80-FF\",\n \"description\": \"Latin-1 Supplement. Accented characters for Western European languages, common punctuation characters, multiplication and division signs.\"\n },\n {\n \"name\": \"U+100-17F\",\n \"description\": \"Latin Extended-A. Accented characters for for Czech, Dutch, Polish, and Turkish.\"\n },\n {\n \"name\": \"U+180-24F\",\n \"description\": \"Latin Extended-B. Croatian, Slovenian, Romanian, Non-European and historic latin, Khoisan, Pinyin, Livonian, Sinology.\"\n },\n {\n \"name\": \"U+1E00-1EFF\",\n \"description\": \"Latin Extended Additional. Vietnamese, German captial sharp s, Medievalist, Latin general use.\"\n },\n {\n \"name\": \"U+250-2AF\",\n \"description\": \"International Phonetic Alphabet Extensions.\"\n },\n {\n \"name\": \"U+370-3FF\",\n \"description\": \"Greek and Coptic.\"\n },\n {\n \"name\": \"U+1F00-1FFF\",\n \"description\": \"Greek Extended. Accented characters for polytonic Greek.\"\n },\n {\n \"name\": \"U+400-4FF\",\n \"description\": \"Cyrillic.\"\n },\n {\n \"name\": \"U+500-52F\",\n \"description\": \"Cyrillic Supplement. Extra letters for Komi, Khanty, Chukchi, Mordvin, Kurdish, Aleut, Chuvash, Abkhaz, Azerbaijani, and Orok.\"\n },\n {\n \"name\": \"U+00-52F, U+1E00-1FFF, U+2200-22FF\",\n \"description\": \"Latin, Greek, Cyrillic, some punctuation and symbols.\"\n },\n {\n \"name\": \"U+530-58F\",\n \"description\": \"Armenian.\"\n },\n {\n \"name\": \"U+590-5FF\",\n \"description\": \"Hebrew.\"\n },\n {\n \"name\": \"U+600-6FF\",\n \"description\": \"Arabic.\"\n },\n {\n \"name\": \"U+750-77F\",\n \"description\": \"Arabic Supplement. Additional letters for African languages, Khowar, Torwali, Burushaski, and early Persian.\"\n },\n {\n \"name\": \"U+8A0-8FF\",\n \"description\": \"Arabic Extended-A. Additional letters for African languages, European and Central Asian languages, Rohingya, Tamazight, Arwi, and Koranic annotation signs.\"\n },\n {\n \"name\": \"U+700-74F\",\n \"description\": \"Syriac.\"\n },\n {\n \"name\": \"U+900-97F\",\n \"description\": \"Devanagari.\"\n },\n {\n \"name\": \"U+980-9FF\",\n \"description\": \"Bengali.\"\n },\n {\n \"name\": \"U+A00-A7F\",\n \"description\": \"Gurmukhi.\"\n },\n {\n \"name\": \"U+A80-AFF\",\n \"description\": \"Gujarati.\"\n },\n {\n \"name\": \"U+B00-B7F\",\n \"description\": \"Oriya.\"\n },\n {\n \"name\": \"U+B80-BFF\",\n \"description\": \"Tamil.\"\n },\n {\n \"name\": \"U+C00-C7F\",\n \"description\": \"Telugu.\"\n },\n {\n \"name\": \"U+C80-CFF\",\n \"description\": \"Kannada.\"\n },\n {\n \"name\": \"U+D00-D7F\",\n \"description\": \"Malayalam.\"\n },\n {\n \"name\": \"U+D80-DFF\",\n \"description\": \"Sinhala.\"\n },\n {\n \"name\": \"U+118A0-118FF\",\n \"description\": \"Warang Citi.\"\n },\n {\n \"name\": \"U+E00-E7F\",\n \"description\": \"Thai.\"\n },\n {\n \"name\": \"U+1A20-1AAF\",\n \"description\": \"Tai Tham.\"\n },\n {\n \"name\": \"U+AA80-AADF\",\n \"description\": \"Tai Viet.\"\n },\n {\n \"name\": \"U+E80-EFF\",\n \"description\": \"Lao.\"\n },\n {\n \"name\": \"U+F00-FFF\",\n \"description\": \"Tibetan.\"\n },\n {\n \"name\": \"U+1000-109F\",\n \"description\": \"Myanmar (Burmese).\"\n },\n {\n \"name\": \"U+10A0-10FF\",\n \"description\": \"Georgian.\"\n },\n {\n \"name\": \"U+1200-137F\",\n \"description\": \"Ethiopic.\"\n },\n {\n \"name\": \"U+1380-139F\",\n \"description\": \"Ethiopic Supplement. Extra Syllables for Sebatbeit, and Tonal marks\"\n },\n {\n \"name\": \"U+2D80-2DDF\",\n \"description\": \"Ethiopic Extended. Extra Syllables for Me'en, Blin, and Sebatbeit.\"\n },\n {\n \"name\": \"U+AB00-AB2F\",\n \"description\": \"Ethiopic Extended-A. Extra characters for Gamo-Gofa-Dawro, Basketo, and Gumuz.\"\n },\n {\n \"name\": \"U+1780-17FF\",\n \"description\": \"Khmer.\"\n },\n {\n \"name\": \"U+1800-18AF\",\n \"description\": \"Mongolian.\"\n },\n {\n \"name\": \"U+1B80-1BBF\",\n \"description\": \"Sundanese.\"\n },\n {\n \"name\": \"U+1CC0-1CCF\",\n \"description\": \"Sundanese Supplement. Punctuation.\"\n },\n {\n \"name\": \"U+4E00-9FD5\",\n \"description\": \"CJK (Chinese, Japanese, Korean) Unified Ideographs. Most common ideographs for modern Chinese and Japanese.\"\n },\n {\n \"name\": \"U+3400-4DB5\",\n \"description\": \"CJK Unified Ideographs Extension A. Rare ideographs.\"\n },\n {\n \"name\": \"U+2F00-2FDF\",\n \"description\": \"Kangxi Radicals.\"\n },\n {\n \"name\": \"U+2E80-2EFF\",\n \"description\": \"CJK Radicals Supplement. Alternative forms of Kangxi Radicals.\"\n },\n {\n \"name\": \"U+1100-11FF\",\n \"description\": \"Hangul Jamo.\"\n },\n {\n \"name\": \"U+AC00-D7AF\",\n \"description\": \"Hangul Syllables.\"\n },\n {\n \"name\": \"U+3040-309F\",\n \"description\": \"Hiragana.\"\n },\n {\n \"name\": \"U+30A0-30FF\",\n \"description\": \"Katakana.\"\n },\n {\n \"name\": \"U+A5, U+4E00-9FFF, U+30??, U+FF00-FF9F\",\n \"description\": \"Japanese Kanji, Hiragana and Katakana characters plus Yen/Yuan symbol.\"\n },\n {\n \"name\": \"U+A4D0-A4FF\",\n \"description\": \"Lisu.\"\n },\n {\n \"name\": \"U+A000-A48F\",\n \"description\": \"Yi Syllables.\"\n },\n {\n \"name\": \"U+A490-A4CF\",\n \"description\": \"Yi Radicals.\"\n },\n {\n \"name\": \"U+2000-206F\",\n \"description\": \"General Punctuation.\"\n },\n {\n \"name\": \"U+3000-303F\",\n \"description\": \"CJK Symbols and Punctuation.\"\n },\n {\n \"name\": \"U+2070-209F\",\n \"description\": \"Superscripts and Subscripts.\"\n },\n {\n \"name\": \"U+20A0-20CF\",\n \"description\": \"Currency Symbols.\"\n },\n {\n \"name\": \"U+2100-214F\",\n \"description\": \"Letterlike Symbols.\"\n },\n {\n \"name\": \"U+2150-218F\",\n \"description\": \"Number Forms.\"\n },\n {\n \"name\": \"U+2190-21FF\",\n \"description\": \"Arrows.\"\n },\n {\n \"name\": \"U+2200-22FF\",\n \"description\": \"Mathematical Operators.\"\n },\n {\n \"name\": \"U+2300-23FF\",\n \"description\": \"Miscellaneous Technical.\"\n },\n {\n \"name\": \"U+E000-F8FF\",\n \"description\": \"Private Use Area.\"\n },\n {\n \"name\": \"U+FB00-FB4F\",\n \"description\": \"Alphabetic Presentation Forms. Ligatures for latin, Armenian, and Hebrew.\"\n },\n {\n \"name\": \"U+FB50-FDFF\",\n \"description\": \"Arabic Presentation Forms-A. Contextual forms / ligatures for Persian, Urdu, Sindhi, Central Asian languages, etc, Arabic pedagogical symbols, word ligatures.\"\n },\n {\n \"name\": \"U+1F600-1F64F\",\n \"description\": \"Emoji: Emoticons.\"\n },\n {\n \"name\": \"U+2600-26FF\",\n \"description\": \"Emoji: Miscellaneous Symbols.\"\n },\n {\n \"name\": \"U+1F300-1F5FF\",\n \"description\": \"Emoji: Miscellaneous Symbols and Pictographs.\"\n },\n {\n \"name\": \"U+1F900-1F9FF\",\n \"description\": \"Emoji: Supplemental Symbols and Pictographs.\"\n },\n {\n \"name\": \"U+1F680-1F6FF\",\n \"description\": \"Emoji: Transport and Map Symbols.\"\n }\n ],\n \"syntax\": \"<unicode-range>#\",\n \"relevance\": 72,\n \"description\": \"@font-face descriptor. Defines the set of Unicode codepoints that may be supported by the font face for which it is declared.\",\n \"restrictions\": [\n \"unicode-range\"\n ]\n },\n {\n \"name\": \"user-select\",\n \"browsers\": [\n \"E79\",\n \"FF69\",\n \"S3\",\n \"C54\",\n \"IE10\",\n \"O41\"\n ],\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"The content of the element must be selected atomically\"\n },\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"contain\",\n \"description\": \"UAs must not allow a selection which is started in this element to be extended outside of this element.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The UA must not allow selections to be started in this element.\"\n },\n {\n \"name\": \"text\",\n \"description\": \"The element imposes no constraint on the selection.\"\n }\n ],\n \"syntax\": \"auto | text | none | contain | all\",\n \"relevance\": 81,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/user-select\"\n }\n ],\n \"description\": \"Controls the appearance of selection.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"vertical-align\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O4\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Align the dominant baseline of the parent box with the equivalent, or heuristically reconstructed, baseline of the element inline box.\"\n },\n {\n \"name\": \"baseline\",\n \"description\": \"Align the 'alphabetic' baseline of the element with the 'alphabetic' baseline of the parent element.\"\n },\n {\n \"name\": \"bottom\",\n \"description\": \"Align the after edge of the extended inline box with the after-edge of the line box.\"\n },\n {\n \"name\": \"middle\",\n \"description\": \"Align the 'middle' baseline of the inline element with the middle baseline of the parent.\"\n },\n {\n \"name\": \"sub\",\n \"description\": \"Lower the baseline of the box to the proper position for subscripts of the parent's box. (This value has no effect on the font size of the element's text.)\"\n },\n {\n \"name\": \"super\",\n \"description\": \"Raise the baseline of the box to the proper position for superscripts of the parent's box. (This value has no effect on the font size of the element's text.)\"\n },\n {\n \"name\": \"text-bottom\",\n \"description\": \"Align the bottom of the box with the after-edge of the parent element's font.\"\n },\n {\n \"name\": \"text-top\",\n \"description\": \"Align the top of the box with the before-edge of the parent element's font.\"\n },\n {\n \"name\": \"top\",\n \"description\": \"Align the before edge of the extended inline box with the before-edge of the line box.\"\n },\n {\n \"name\": \"-webkit-baseline-middle\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O4\"\n ]\n }\n ],\n \"syntax\": \"baseline | sub | super | text-top | text-bottom | middle | top | bottom | <percentage> | <length>\",\n \"relevance\": 92,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/vertical-align\"\n }\n ],\n \"description\": \"Affects the vertical positioning of the inline boxes generated by an inline-level element inside a line box.\",\n \"restrictions\": [\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"visibility\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O4\"\n ],\n \"values\": [\n {\n \"name\": \"collapse\",\n \"description\": \"Table-specific. If used on elements other than rows, row groups, columns, or column groups, 'collapse' has the same meaning as 'hidden'.\"\n },\n {\n \"name\": \"hidden\",\n \"description\": \"The generated box is invisible (fully transparent, nothing is drawn), but still affects layout.\"\n },\n {\n \"name\": \"visible\",\n \"description\": \"The generated box is visible.\"\n }\n ],\n \"syntax\": \"visible | hidden | collapse\",\n \"relevance\": 88,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/visibility\"\n }\n ],\n \"description\": \"Specifies whether the boxes generated by an element are rendered. Invisible boxes still affect layout (set the 'display' property to 'none' to suppress box generation altogether).\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-animation\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"alternate\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction.\"\n },\n {\n \"name\": \"alternate-reverse\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction.\"\n },\n {\n \"name\": \"backwards\",\n \"description\": \"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'.\"\n },\n {\n \"name\": \"both\",\n \"description\": \"Both forwards and backwards fill modes are applied.\"\n },\n {\n \"name\": \"forwards\",\n \"description\": \"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes.\"\n },\n {\n \"name\": \"infinite\",\n \"description\": \"Causes the animation to repeat forever.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No animation is performed\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Normal playback.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"All iterations of the animation are played in the reverse direction from the way they were specified.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property combines six of the animation properties into a single property.\",\n \"restrictions\": [\n \"time\",\n \"enum\",\n \"timing-function\",\n \"identifier\",\n \"number\"\n ]\n },\n {\n \"name\": \"-webkit-animation-delay\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"relevance\": 50,\n \"description\": \"Defines when the animation will start.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-webkit-animation-direction\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"alternate\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction.\"\n },\n {\n \"name\": \"alternate-reverse\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Normal playback.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"All iterations of the animation are played in the reverse direction from the way they were specified.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines whether or not the animation should play in reverse on alternate cycles.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-animation-duration\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"relevance\": 50,\n \"description\": \"Defines the length of time that an animation takes to complete one cycle.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-webkit-animation-fill-mode\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"backwards\",\n \"description\": \"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'.\"\n },\n {\n \"name\": \"both\",\n \"description\": \"Both forwards and backwards fill modes are applied.\"\n },\n {\n \"name\": \"forwards\",\n \"description\": \"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"There is no change to the property value between the time the animation is applied and the time the animation begins playing or after the animation completes.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines what values are applied by the animation outside the time it is executing.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-animation-iteration-count\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"infinite\",\n \"description\": \"Causes the animation to repeat forever.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines the number of times an animation cycle is played. The default value is one, meaning the animation will play from beginning to end once.\",\n \"restrictions\": [\n \"number\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-animation-name\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No animation is performed\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines a list of animations that apply. Each name is used to select the keyframe at-rule that provides the property values for the animation.\",\n \"restrictions\": [\n \"identifier\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-animation-play-state\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"paused\",\n \"description\": \"A running animation will be paused.\"\n },\n {\n \"name\": \"running\",\n \"description\": \"Resume playback of a paused animation.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines whether the animation is running or paused.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-animation-timing-function\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"relevance\": 50,\n \"description\": \"Describes how the animation will progress over one cycle of its duration. See the 'transition-timing-function'.\",\n \"restrictions\": [\n \"timing-function\"\n ]\n },\n {\n \"name\": \"-webkit-appearance\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"button\"\n },\n {\n \"name\": \"button-bevel\"\n },\n {\n \"name\": \"caps-lock-indicator\"\n },\n {\n \"name\": \"caret\"\n },\n {\n \"name\": \"checkbox\"\n },\n {\n \"name\": \"default-button\"\n },\n {\n \"name\": \"listbox\"\n },\n {\n \"name\": \"listitem\"\n },\n {\n \"name\": \"media-fullscreen-button\"\n },\n {\n \"name\": \"media-mute-button\"\n },\n {\n \"name\": \"media-play-button\"\n },\n {\n \"name\": \"media-seek-back-button\"\n },\n {\n \"name\": \"media-seek-forward-button\"\n },\n {\n \"name\": \"media-slider\"\n },\n {\n \"name\": \"media-sliderthumb\"\n },\n {\n \"name\": \"menulist\"\n },\n {\n \"name\": \"menulist-button\"\n },\n {\n \"name\": \"menulist-text\"\n },\n {\n \"name\": \"menulist-textfield\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"push-button\"\n },\n {\n \"name\": \"radio\"\n },\n {\n \"name\": \"scrollbarbutton-down\"\n },\n {\n \"name\": \"scrollbarbutton-left\"\n },\n {\n \"name\": \"scrollbarbutton-right\"\n },\n {\n \"name\": \"scrollbarbutton-up\"\n },\n {\n \"name\": \"scrollbargripper-horizontal\"\n },\n {\n \"name\": \"scrollbargripper-vertical\"\n },\n {\n \"name\": \"scrollbarthumb-horizontal\"\n },\n {\n \"name\": \"scrollbarthumb-vertical\"\n },\n {\n \"name\": \"scrollbartrack-horizontal\"\n },\n {\n \"name\": \"scrollbartrack-vertical\"\n },\n {\n \"name\": \"searchfield\"\n },\n {\n \"name\": \"searchfield-cancel-button\"\n },\n {\n \"name\": \"searchfield-decoration\"\n },\n {\n \"name\": \"searchfield-results-button\"\n },\n {\n \"name\": \"searchfield-results-decoration\"\n },\n {\n \"name\": \"slider-horizontal\"\n },\n {\n \"name\": \"sliderthumb-horizontal\"\n },\n {\n \"name\": \"sliderthumb-vertical\"\n },\n {\n \"name\": \"slider-vertical\"\n },\n {\n \"name\": \"square-button\"\n },\n {\n \"name\": \"textarea\"\n },\n {\n \"name\": \"textfield\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | button | button-bevel | caret | checkbox | default-button | inner-spin-button | listbox | listitem | media-controls-background | media-controls-fullscreen-background | media-current-time-display | media-enter-fullscreen-button | media-exit-fullscreen-button | media-fullscreen-button | media-mute-button | media-overlay-play-button | media-play-button | media-seek-back-button | media-seek-forward-button | media-slider | media-sliderthumb | media-time-remaining-display | media-toggle-closed-captions-button | media-volume-slider | media-volume-slider-container | media-volume-sliderthumb | menulist | menulist-button | menulist-text | menulist-textfield | meter | progress-bar | progress-bar-value | push-button | radio | searchfield | searchfield-cancel-button | searchfield-decoration | searchfield-results-button | searchfield-results-decoration | slider-horizontal | slider-vertical | sliderthumb-horizontal | sliderthumb-vertical | square-button | textarea | textfield | -apple-pay-button\",\n \"relevance\": 0,\n \"description\": \"Changes the appearance of buttons and other controls to resemble native controls.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-backdrop-filter\",\n \"browsers\": [\n \"S9\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No filter effects are applied.\"\n },\n {\n \"name\": \"blur()\",\n \"description\": \"Applies a Gaussian blur to the input image.\"\n },\n {\n \"name\": \"brightness()\",\n \"description\": \"Applies a linear multiplier to input image, making it appear more or less bright.\"\n },\n {\n \"name\": \"contrast()\",\n \"description\": \"Adjusts the contrast of the input.\"\n },\n {\n \"name\": \"drop-shadow()\",\n \"description\": \"Applies a drop shadow effect to the input image.\"\n },\n {\n \"name\": \"grayscale()\",\n \"description\": \"Converts the input image to grayscale.\"\n },\n {\n \"name\": \"hue-rotate()\",\n \"description\": \"Applies a hue rotation on the input image. \"\n },\n {\n \"name\": \"invert()\",\n \"description\": \"Inverts the samples in the input image.\"\n },\n {\n \"name\": \"opacity()\",\n \"description\": \"Applies transparency to the samples in the input image.\"\n },\n {\n \"name\": \"saturate()\",\n \"description\": \"Saturates the input image.\"\n },\n {\n \"name\": \"sepia()\",\n \"description\": \"Converts the input image to sepia.\"\n },\n {\n \"name\": \"url()\",\n \"description\": \"A filter reference to a <filter> element.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Applies a filter effect where the first filter in the list takes the element's background image as the input image.\",\n \"restrictions\": [\n \"enum\",\n \"url\"\n ]\n },\n {\n \"name\": \"-webkit-backface-visibility\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"hidden\"\n },\n {\n \"name\": \"visible\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Determines whether or not the 'back' side of a transformed element is visible when facing the viewer. With an identity transform, the front side of an element faces the viewer.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-background-clip\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"relevance\": 50,\n \"description\": \"Determines the background painting area.\",\n \"restrictions\": [\n \"box\"\n ]\n },\n {\n \"name\": \"-webkit-background-composite\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"border\"\n },\n {\n \"name\": \"padding\"\n }\n ],\n \"relevance\": 50,\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-background-origin\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"relevance\": 50,\n \"description\": \"For elements rendered as a single box, specifies the background positioning area. For elements rendered as multiple boxes (e.g., inline boxes on several lines, boxes on several pages) specifies which boxes 'box-decoration-break' operates on to determine the background positioning area(s).\",\n \"restrictions\": [\n \"box\"\n ]\n },\n {\n \"name\": \"-webkit-border-image\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"If 'auto' is specified then the border image width is the intrinsic width or height (whichever is applicable) of the corresponding image slice. If the image does not have the required intrinsic dimension then the corresponding border-width is used instead.\"\n },\n {\n \"name\": \"fill\",\n \"description\": \"Causes the middle part of the border-image to be preserved.\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"repeat\",\n \"description\": \"The image is tiled (repeated) to fill the area.\"\n },\n {\n \"name\": \"round\",\n \"description\": \"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the image is rescaled so that it does.\"\n },\n {\n \"name\": \"space\",\n \"description\": \"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the extra space is distributed around the tiles.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"The image is stretched to fill the area.\"\n },\n {\n \"name\": \"url()\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property for setting 'border-image-source', 'border-image-slice', 'border-image-width', 'border-image-outset' and 'border-image-repeat'. Omitted values are set to their initial values.\",\n \"restrictions\": [\n \"length\",\n \"percentage\",\n \"number\",\n \"url\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-box-align\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"baseline\",\n \"description\": \"If this box orientation is inline-axis or horizontal, all children are placed with their baselines aligned, and extra space placed before or after as necessary. For block flows, the baseline of the first non-empty line box located within the element is used. For tables, the baseline of the first cell is used.\"\n },\n {\n \"name\": \"center\",\n \"description\": \"Any extra space is divided evenly, with half placed above the child and the other half placed after the child.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"For normal direction boxes, the bottom edge of each child is placed along the bottom of the box. Extra space is placed above the element. For reverse direction boxes, the top edge of each child is placed along the top of the box. Extra space is placed below the element.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"For normal direction boxes, the top edge of each child is placed along the top of the box. Extra space is placed below the element. For reverse direction boxes, the bottom edge of each child is placed along the bottom of the box. Extra space is placed above the element.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"The height of each child is adjusted to that of the containing block.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the alignment of nested elements within an outer flexible box element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-box-direction\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"A box with a computed value of horizontal for box-orient displays its children from left to right. A box with a computed value of vertical displays its children from top to bottom.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"A box with a computed value of horizontal for box-orient displays its children from right to left. A box with a computed value of vertical displays its children from bottom to top.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"In webkit applications, -webkit-box-direction specifies whether a box lays out its contents normally (from the top or left edge), or in reverse (from the bottom or right edge).\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-box-flex\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"relevance\": 50,\n \"description\": \"Specifies an element's flexibility.\",\n \"restrictions\": [\n \"number\"\n ]\n },\n {\n \"name\": \"-webkit-box-flex-group\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"relevance\": 50,\n \"description\": \"Flexible elements can be assigned to flex groups using the 'box-flex-group' property.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-webkit-box-ordinal-group\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"relevance\": 50,\n \"description\": \"Indicates the ordinal group the element belongs to. Elements with a lower ordinal group are displayed before those with a higher ordinal group.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-webkit-box-orient\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"block-axis\",\n \"description\": \"Elements are oriented along the box's axis.\"\n },\n {\n \"name\": \"horizontal\",\n \"description\": \"The box displays its children from left to right in a horizontal line.\"\n },\n {\n \"name\": \"inline-axis\",\n \"description\": \"Elements are oriented vertically.\"\n },\n {\n \"name\": \"vertical\",\n \"description\": \"The box displays its children from stacked from top to bottom vertically.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"In webkit applications, -webkit-box-orient specifies whether a box lays out its contents horizontally or vertically.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-box-pack\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"center\",\n \"description\": \"The extra space is divided evenly, with half placed before the first child and the other half placed after the last child.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"For normal direction boxes, the right edge of the last child is placed at the right side, with all extra space placed before the first child. For reverse direction boxes, the left edge of the first child is placed at the left side, with all extra space placed after the last child.\"\n },\n {\n \"name\": \"justify\",\n \"description\": \"The space is divided evenly in-between each child, with none of the extra space placed before the first child or after the last child. If there is only one child, treat the pack value as if it were start.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"For normal direction boxes, the left edge of the first child is placed at the left side, with all extra space placed after the last child. For reverse direction boxes, the right edge of the last child is placed at the right side, with all extra space placed before the first child.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies alignment of child elements within the current element in the direction of orientation.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-box-reflect\",\n \"browsers\": [\n \"E79\",\n \"S4\",\n \"C4\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"above\",\n \"description\": \"The reflection appears above the border box.\"\n },\n {\n \"name\": \"below\",\n \"description\": \"The reflection appears below the border box.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"The reflection appears to the left of the border box.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"The reflection appears to the right of the border box.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"[ above | below | right | left ]? <length>? <image>?\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-box-reflect\"\n }\n ],\n \"description\": \"Defines a reflection of a border box.\"\n },\n {\n \"name\": \"-webkit-box-sizing\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"border-box\",\n \"description\": \"The specified width and height (and respective min/max properties) on this element determine the border box of the element.\"\n },\n {\n \"name\": \"content-box\",\n \"description\": \"Behavior of width and height as specified by CSS2.1. The specified width and height (and respective min/max properties) apply to the width and height respectively of the content box of the element.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Box Model addition in CSS3.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-break-after\",\n \"browsers\": [\n \"S7\"\n ],\n \"values\": [\n {\n \"name\": \"always\",\n \"description\": \"Always force a page break before/after the generated box.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page/column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a page/column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-column\",\n \"description\": \"Avoid a column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-page\",\n \"description\": \"Avoid a page break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-region\"\n },\n {\n \"name\": \"column\",\n \"description\": \"Always force a column break before/after the generated box.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a left page.\"\n },\n {\n \"name\": \"page\",\n \"description\": \"Always force a page break before/after the generated box.\"\n },\n {\n \"name\": \"region\"\n },\n {\n \"name\": \"right\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a right page.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes the page/column break behavior before the generated box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-break-before\",\n \"browsers\": [\n \"S7\"\n ],\n \"values\": [\n {\n \"name\": \"always\",\n \"description\": \"Always force a page break before/after the generated box.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page/column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a page/column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-column\",\n \"description\": \"Avoid a column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-page\",\n \"description\": \"Avoid a page break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-region\"\n },\n {\n \"name\": \"column\",\n \"description\": \"Always force a column break before/after the generated box.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a left page.\"\n },\n {\n \"name\": \"page\",\n \"description\": \"Always force a page break before/after the generated box.\"\n },\n {\n \"name\": \"region\"\n },\n {\n \"name\": \"right\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a right page.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes the page/column break behavior before the generated box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-break-inside\",\n \"browsers\": [\n \"S7\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page/column break inside the generated box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a page/column break inside the generated box.\"\n },\n {\n \"name\": \"avoid-column\",\n \"description\": \"Avoid a column break inside the generated box.\"\n },\n {\n \"name\": \"avoid-page\",\n \"description\": \"Avoid a page break inside the generated box.\"\n },\n {\n \"name\": \"avoid-region\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes the page/column break behavior inside the generated box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-column-break-after\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"always\",\n \"description\": \"Always force a page break before/after the generated box.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page/column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a page/column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-column\",\n \"description\": \"Avoid a column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-page\",\n \"description\": \"Avoid a page break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-region\"\n },\n {\n \"name\": \"column\",\n \"description\": \"Always force a column break before/after the generated box.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a left page.\"\n },\n {\n \"name\": \"page\",\n \"description\": \"Always force a page break before/after the generated box.\"\n },\n {\n \"name\": \"region\"\n },\n {\n \"name\": \"right\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a right page.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes the page/column break behavior before the generated box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-column-break-before\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"always\",\n \"description\": \"Always force a page break before/after the generated box.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page/column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a page/column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-column\",\n \"description\": \"Avoid a column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-page\",\n \"description\": \"Avoid a page break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-region\"\n },\n {\n \"name\": \"column\",\n \"description\": \"Always force a column break before/after the generated box.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a left page.\"\n },\n {\n \"name\": \"page\",\n \"description\": \"Always force a page break before/after the generated box.\"\n },\n {\n \"name\": \"region\"\n },\n {\n \"name\": \"right\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a right page.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes the page/column break behavior before the generated box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-column-break-inside\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page/column break inside the generated box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a page/column break inside the generated box.\"\n },\n {\n \"name\": \"avoid-column\",\n \"description\": \"Avoid a column break inside the generated box.\"\n },\n {\n \"name\": \"avoid-page\",\n \"description\": \"Avoid a page break inside the generated box.\"\n },\n {\n \"name\": \"avoid-region\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes the page/column break behavior inside the generated box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-column-count\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Determines the number of columns by the 'column-width' property and the element width.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes the optimal number of columns into which the content of the element will be flowed.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-webkit-column-gap\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"User agent specific and typically equivalent to 1em.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Sets the gap between columns. If there is a column rule between columns, it will appear in the middle of the gap.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-webkit-column-rule\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"relevance\": 50,\n \"description\": \"This property is a shorthand for setting 'column-rule-width', 'column-rule-style', and 'column-rule-color' at the same place in the style sheet. Omitted values are set to their initial values.\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"-webkit-column-rule-color\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"relevance\": 50,\n \"description\": \"Sets the color of the column rule\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-webkit-column-rule-style\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"relevance\": 50,\n \"description\": \"Sets the style of the rule between columns of an element.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"-webkit-column-rule-width\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"relevance\": 50,\n \"description\": \"Sets the width of the rule between columns. Negative values are not allowed.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"-webkit-columns\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The width depends on the values of other properties.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"A shorthand property which sets both 'column-width' and 'column-count'.\",\n \"restrictions\": [\n \"length\",\n \"integer\"\n ]\n },\n {\n \"name\": \"-webkit-column-span\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"The element spans across all columns. Content in the normal flow that appears before the element is automatically balanced across all columns before the element appear.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The element does not span multiple columns.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes the page/column break behavior after the generated box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-column-width\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The width depends on the values of other properties.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"This property describes the width of columns in multicol elements.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-webkit-filter\",\n \"browsers\": [\n \"C18\",\n \"O15\",\n \"S6\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No filter effects are applied.\"\n },\n {\n \"name\": \"blur()\",\n \"description\": \"Applies a Gaussian blur to the input image.\"\n },\n {\n \"name\": \"brightness()\",\n \"description\": \"Applies a linear multiplier to input image, making it appear more or less bright.\"\n },\n {\n \"name\": \"contrast()\",\n \"description\": \"Adjusts the contrast of the input.\"\n },\n {\n \"name\": \"drop-shadow()\",\n \"description\": \"Applies a drop shadow effect to the input image.\"\n },\n {\n \"name\": \"grayscale()\",\n \"description\": \"Converts the input image to grayscale.\"\n },\n {\n \"name\": \"hue-rotate()\",\n \"description\": \"Applies a hue rotation on the input image. \"\n },\n {\n \"name\": \"invert()\",\n \"description\": \"Inverts the samples in the input image.\"\n },\n {\n \"name\": \"opacity()\",\n \"description\": \"Applies transparency to the samples in the input image.\"\n },\n {\n \"name\": \"saturate()\",\n \"description\": \"Saturates the input image.\"\n },\n {\n \"name\": \"sepia()\",\n \"description\": \"Converts the input image to sepia.\"\n },\n {\n \"name\": \"url()\",\n \"description\": \"A filter reference to a <filter> element.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Processes an element's rendering before it is displayed in the document, by applying one or more filter effects.\",\n \"restrictions\": [\n \"enum\",\n \"url\"\n ]\n },\n {\n \"name\": \"-webkit-flow-from\",\n \"browsers\": [\n \"S6.1\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The block container is not a CSS Region.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Makes a block container a region and associates it with a named flow.\",\n \"restrictions\": [\n \"identifier\"\n ]\n },\n {\n \"name\": \"-webkit-flow-into\",\n \"browsers\": [\n \"S6.1\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The element is not moved to a named flow and normal CSS processing takes place.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Places an element or its contents into a named flow.\",\n \"restrictions\": [\n \"identifier\"\n ]\n },\n {\n \"name\": \"-webkit-font-feature-settings\",\n \"browsers\": [\n \"C16\"\n ],\n \"values\": [\n {\n \"name\": \"\\\"c2cs\\\"\"\n },\n {\n \"name\": \"\\\"dlig\\\"\"\n },\n {\n \"name\": \"\\\"kern\\\"\"\n },\n {\n \"name\": \"\\\"liga\\\"\"\n },\n {\n \"name\": \"\\\"lnum\\\"\"\n },\n {\n \"name\": \"\\\"onum\\\"\"\n },\n {\n \"name\": \"\\\"smcp\\\"\"\n },\n {\n \"name\": \"\\\"swsh\\\"\"\n },\n {\n \"name\": \"\\\"tnum\\\"\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"No change in glyph substitution or positioning occurs.\"\n },\n {\n \"name\": \"off\"\n },\n {\n \"name\": \"on\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"This property provides low-level control over OpenType font features. It is intended as a way of providing access to font features that are not widely used but are needed for a particular use case.\",\n \"restrictions\": [\n \"string\",\n \"integer\"\n ]\n },\n {\n \"name\": \"-webkit-hyphens\",\n \"browsers\": [\n \"S5.1\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Conditional hyphenation characters inside a word, if present, take priority over automatic resources when determining hyphenation points within the word.\"\n },\n {\n \"name\": \"manual\",\n \"description\": \"Words are only broken at line breaks where there are characters inside the word that suggest line break opportunities\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Words are not broken at line breaks, even if characters inside the word suggest line break points.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Controls whether hyphenation is allowed to create more break opportunities within a line of text.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-line-break\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"after-white-space\"\n },\n {\n \"name\": \"normal\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies line-breaking rules for CJK (Chinese, Japanese, and Korean) text.\"\n },\n {\n \"name\": \"-webkit-margin-bottom-collapse\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"collapse\"\n },\n {\n \"name\": \"discard\"\n },\n {\n \"name\": \"separate\"\n }\n ],\n \"relevance\": 50,\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-margin-collapse\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"collapse\"\n },\n {\n \"name\": \"discard\"\n },\n {\n \"name\": \"separate\"\n }\n ],\n \"relevance\": 50,\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-margin-start\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"relevance\": 50,\n \"restrictions\": [\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"-webkit-margin-top-collapse\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"collapse\"\n },\n {\n \"name\": \"discard\"\n },\n {\n \"name\": \"separate\"\n }\n ],\n \"relevance\": 50,\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-mask-clip\",\n \"browsers\": [\n \"C\",\n \"O15\",\n \"S4\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"[ <box> | border | padding | content | text ]#\",\n \"relevance\": 0,\n \"description\": \"Determines the mask painting area, which determines the area that is affected by the mask.\",\n \"restrictions\": [\n \"box\"\n ]\n },\n {\n \"name\": \"-webkit-mask-image\",\n \"browsers\": [\n \"C\",\n \"O15\",\n \"S4\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Counts as a transparent black image layer.\"\n },\n {\n \"name\": \"url()\",\n \"description\": \"Reference to a <mask element or to a CSS image.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<mask-reference>#\",\n \"relevance\": 0,\n \"description\": \"Sets the mask layer image of an element.\",\n \"restrictions\": [\n \"url\",\n \"image\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-mask-origin\",\n \"browsers\": [\n \"C\",\n \"O15\",\n \"S4\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"[ <box> | border | padding | content ]#\",\n \"relevance\": 0,\n \"description\": \"Specifies the mask positioning area.\",\n \"restrictions\": [\n \"box\"\n ]\n },\n {\n \"name\": \"-webkit-mask-repeat\",\n \"browsers\": [\n \"C\",\n \"O15\",\n \"S4\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<repeat-style>#\",\n \"relevance\": 0,\n \"description\": \"Specifies how mask layer images are tiled after they have been sized and positioned.\",\n \"restrictions\": [\n \"repeat\"\n ]\n },\n {\n \"name\": \"-webkit-mask-size\",\n \"browsers\": [\n \"C\",\n \"O15\",\n \"S4\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Resolved by using the image's intrinsic ratio and the size of the other dimension, or failing that, using the image's intrinsic size, or failing that, treating it as 100%.\"\n },\n {\n \"name\": \"contain\",\n \"description\": \"Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest size such that both its width and its height can fit inside the background positioning area.\"\n },\n {\n \"name\": \"cover\",\n \"description\": \"Scale the image, while preserving its intrinsic aspect ratio (if any), to the smallest size such that both its width and its height can completely cover the background positioning area.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<bg-size>#\",\n \"relevance\": 0,\n \"description\": \"Specifies the size of the mask layer images.\",\n \"restrictions\": [\n \"length\",\n \"percentage\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-nbsp-mode\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"normal\"\n },\n {\n \"name\": \"space\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines the behavior of nonbreaking spaces within text.\"\n },\n {\n \"name\": \"-webkit-overflow-scrolling\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"touch\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"auto | touch\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-overflow-scrolling\"\n }\n ],\n \"description\": \"Specifies whether to use native-style scrolling in an overflow:scroll element.\"\n },\n {\n \"name\": \"-webkit-padding-start\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"relevance\": 50,\n \"restrictions\": [\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"-webkit-perspective\",\n \"browsers\": [\n \"C\",\n \"S4\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No perspective transform is applied.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Applies the same transform as the perspective(<number>) transform function, except that it applies only to the positioned or transformed children of the element, not to the transform on the element itself.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-webkit-perspective-origin\",\n \"browsers\": [\n \"C\",\n \"S4\"\n ],\n \"relevance\": 50,\n \"description\": \"Establishes the origin for the perspective property. It effectively sets the X and Y position at which the viewer appears to be looking at the children of the element.\",\n \"restrictions\": [\n \"position\",\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"-webkit-region-fragment\",\n \"browsers\": [\n \"S7\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Content flows as it would in a regular content box.\"\n },\n {\n \"name\": \"break\",\n \"description\": \"If the content fits within the CSS Region, then this property has no effect.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"The 'region-fragment' property controls the behavior of the last region associated with a named flow.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-tap-highlight-color\",\n \"browsers\": [\n \"E12\",\n \"C16\",\n \"O15\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-tap-highlight-color\"\n }\n ],\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-webkit-text-fill-color\",\n \"browsers\": [\n \"E12\",\n \"FF49\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"syntax\": \"<color>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-fill-color\"\n }\n ],\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-webkit-text-size-adjust\",\n \"browsers\": [\n \"E\",\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Renderers must use the default size adjustment when displaying on a small device.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Renderers must not do size adjustment when displaying on a small device.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies a size adjustment for displaying text content in mobile browsers.\",\n \"restrictions\": [\n \"percentage\"\n ]\n },\n {\n \"name\": \"-webkit-text-stroke\",\n \"browsers\": [\n \"E15\",\n \"FF49\",\n \"S3\",\n \"C4\",\n \"O15\"\n ],\n \"syntax\": \"<length> || <color>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke\"\n }\n ],\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"color\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-webkit-text-stroke-color\",\n \"browsers\": [\n \"E15\",\n \"FF49\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"syntax\": \"<color>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke-color\"\n }\n ],\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-webkit-text-stroke-width\",\n \"browsers\": [\n \"E15\",\n \"FF49\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"syntax\": \"<length>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke-width\"\n }\n ],\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-webkit-touch-callout\",\n \"browsers\": [\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"none\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"default | none\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-touch-callout\"\n }\n ],\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-transform\",\n \"browsers\": [\n \"C\",\n \"O12\",\n \"S3.1\"\n ],\n \"values\": [\n {\n \"name\": \"matrix()\",\n \"description\": \"Specifies a 2D transformation in the form of a transformation matrix of six values. matrix(a,b,c,d,e,f) is equivalent to applying the transformation matrix [a b c d e f]\"\n },\n {\n \"name\": \"matrix3d()\",\n \"description\": \"Specifies a 3D transformation as a 4x4 homogeneous matrix of 16 values in column-major order.\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"perspective()\",\n \"description\": \"Specifies a perspective projection matrix.\"\n },\n {\n \"name\": \"rotate()\",\n \"description\": \"Specifies a 2D rotation by the angle specified in the parameter about the origin of the element, as defined by the transform-origin property.\"\n },\n {\n \"name\": \"rotate3d()\",\n \"description\": \"Specifies a clockwise 3D rotation by the angle specified in last parameter about the [x,y,z] direction vector described by the first 3 parameters.\"\n },\n {\n \"name\": \"rotateX('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the X axis.\"\n },\n {\n \"name\": \"rotateY('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the Y axis.\"\n },\n {\n \"name\": \"rotateZ('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the Z axis.\"\n },\n {\n \"name\": \"scale()\",\n \"description\": \"Specifies a 2D scale operation by the [sx,sy] scaling vector described by the 2 parameters. If the second parameter is not provided, it is takes a value equal to the first.\"\n },\n {\n \"name\": \"scale3d()\",\n \"description\": \"Specifies a 3D scale operation by the [sx,sy,sz] scaling vector described by the 3 parameters.\"\n },\n {\n \"name\": \"scaleX()\",\n \"description\": \"Specifies a scale operation using the [sx,1] scaling vector, where sx is given as the parameter.\"\n },\n {\n \"name\": \"scaleY()\",\n \"description\": \"Specifies a scale operation using the [sy,1] scaling vector, where sy is given as the parameter.\"\n },\n {\n \"name\": \"scaleZ()\",\n \"description\": \"Specifies a scale operation using the [1,1,sz] scaling vector, where sz is given as the parameter.\"\n },\n {\n \"name\": \"skew()\",\n \"description\": \"Specifies a skew transformation along the X and Y axes. The first angle parameter specifies the skew on the X axis. The second angle parameter specifies the skew on the Y axis. If the second parameter is not given then a value of 0 is used for the Y angle (ie: no skew on the Y axis).\"\n },\n {\n \"name\": \"skewX()\",\n \"description\": \"Specifies a skew transformation along the X axis by the given angle.\"\n },\n {\n \"name\": \"skewY()\",\n \"description\": \"Specifies a skew transformation along the Y axis by the given angle.\"\n },\n {\n \"name\": \"translate()\",\n \"description\": \"Specifies a 2D translation by the vector [tx, ty], where tx is the first translation-value parameter and ty is the optional second translation-value parameter.\"\n },\n {\n \"name\": \"translate3d()\",\n \"description\": \"Specifies a 3D translation by the vector [tx,ty,tz], with tx, ty and tz being the first, second and third translation-value parameters respectively.\"\n },\n {\n \"name\": \"translateX()\",\n \"description\": \"Specifies a translation by the given amount in the X direction.\"\n },\n {\n \"name\": \"translateY()\",\n \"description\": \"Specifies a translation by the given amount in the Y direction.\"\n },\n {\n \"name\": \"translateZ()\",\n \"description\": \"Specifies a translation by the given amount in the Z direction. Note that percentage values are not allowed in the translateZ translation-value, and if present are evaluated as 0.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"A two-dimensional transformation is applied to an element through the 'transform' property. This property contains a list of transform functions similar to those allowed by SVG.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-transform-origin\",\n \"browsers\": [\n \"C\",\n \"O15\",\n \"S3.1\"\n ],\n \"relevance\": 50,\n \"description\": \"Establishes the origin of transformation for an element.\",\n \"restrictions\": [\n \"position\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-webkit-transform-origin-x\",\n \"browsers\": [\n \"C\",\n \"S3.1\"\n ],\n \"relevance\": 50,\n \"description\": \"The x coordinate of the origin for transforms applied to an element with respect to its border box.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-webkit-transform-origin-y\",\n \"browsers\": [\n \"C\",\n \"S3.1\"\n ],\n \"relevance\": 50,\n \"description\": \"The y coordinate of the origin for transforms applied to an element with respect to its border box.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-webkit-transform-origin-z\",\n \"browsers\": [\n \"C\",\n \"S4\"\n ],\n \"relevance\": 50,\n \"description\": \"The z coordinate of the origin for transforms applied to an element with respect to its border box.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-webkit-transform-style\",\n \"browsers\": [\n \"C\",\n \"S4\"\n ],\n \"values\": [\n {\n \"name\": \"flat\",\n \"description\": \"All children of this element are rendered flattened into the 2D plane of the element.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines how nested elements are rendered in 3D space.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-transition\",\n \"browsers\": [\n \"C\",\n \"O12\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"Every property that is able to undergo a transition will do so.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No property will transition.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property combines four of the transition properties into a single property.\",\n \"restrictions\": [\n \"time\",\n \"property\",\n \"timing-function\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-transition-delay\",\n \"browsers\": [\n \"C\",\n \"O12\",\n \"S5\"\n ],\n \"relevance\": 50,\n \"description\": \"Defines when the transition will start. It allows a transition to begin execution some period of time from when it is applied.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-webkit-transition-duration\",\n \"browsers\": [\n \"C\",\n \"O12\",\n \"S5\"\n ],\n \"relevance\": 50,\n \"description\": \"Specifies how long the transition from the old value to the new value should take.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-webkit-transition-property\",\n \"browsers\": [\n \"C\",\n \"O12\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"Every property that is able to undergo a transition will do so.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No property will transition.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the name of the CSS property to which the transition is applied.\",\n \"restrictions\": [\n \"property\"\n ]\n },\n {\n \"name\": \"-webkit-transition-timing-function\",\n \"browsers\": [\n \"C\",\n \"O12\",\n \"S5\"\n ],\n \"relevance\": 50,\n \"description\": \"Describes how the intermediate values used during a transition will be calculated.\",\n \"restrictions\": [\n \"timing-function\"\n ]\n },\n {\n \"name\": \"-webkit-user-drag\",\n \"browsers\": [\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"element\"\n },\n {\n \"name\": \"none\"\n }\n ],\n \"relevance\": 50,\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-user-modify\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"read-only\"\n },\n {\n \"name\": \"read-write\"\n },\n {\n \"name\": \"read-write-plaintext-only\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"read-only | read-write | read-write-plaintext-only\",\n \"relevance\": 0,\n \"description\": \"Determines whether a user can edit the content of an element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-user-select\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"text\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Controls the appearance of selection.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"widows\",\n \"browsers\": [\n \"E12\",\n \"S1.3\",\n \"C25\",\n \"IE8\",\n \"O9.2\"\n ],\n \"syntax\": \"<integer>\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/widows\"\n }\n ],\n \"description\": \"Specifies the minimum number of line boxes of a block container that must be left in a fragment after a break.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"width\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The width depends on the values of other properties.\"\n },\n {\n \"name\": \"fit-content\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"description\": \"Use the fit-content inline size or fit-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"max-content\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"description\": \"Use the max-content inline size or max-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"min-content\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"description\": \"Use the min-content inline size or min-content block size, as appropriate to the writing mode.\"\n }\n ],\n \"syntax\": \"<viewport-length>{1,2}\",\n \"relevance\": 96,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/width\"\n }\n ],\n \"description\": \"Specifies the width of the content area, padding area or border area (depending on 'box-sizing') of certain boxes.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"will-change\",\n \"browsers\": [\n \"E79\",\n \"FF36\",\n \"S9.1\",\n \"C36\",\n \"O24\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Expresses no particular intent.\"\n },\n {\n \"name\": \"contents\",\n \"description\": \"Indicates that the author expects to animate or change something about the element's contents in the near future.\"\n },\n {\n \"name\": \"scroll-position\",\n \"description\": \"Indicates that the author expects to animate or change the scroll position of the element in the near future.\"\n }\n ],\n \"syntax\": \"auto | <animateable-feature>#\",\n \"relevance\": 64,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/will-change\"\n }\n ],\n \"description\": \"Provides a rendering hint to the user agent, stating what kinds of changes the author expects to perform on the element.\",\n \"restrictions\": [\n \"enum\",\n \"identifier\"\n ]\n },\n {\n \"name\": \"word-break\",\n \"browsers\": [\n \"E12\",\n \"FF15\",\n \"S3\",\n \"C1\",\n \"IE5.5\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"break-all\",\n \"description\": \"Lines may break between any two grapheme clusters for non-CJK scripts.\"\n },\n {\n \"name\": \"keep-all\",\n \"description\": \"Block characters can no longer create implied break points.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Breaks non-CJK scripts according to their own rules.\"\n }\n ],\n \"syntax\": \"normal | break-all | keep-all | break-word\",\n \"relevance\": 76,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/word-break\"\n }\n ],\n \"description\": \"Specifies line break opportunities for non-CJK scripts.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"word-spacing\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE6\",\n \"O3.5\"\n ],\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"No additional spacing is applied. Computes to zero.\"\n }\n ],\n \"syntax\": \"normal | <length>\",\n \"relevance\": 57,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/word-spacing\"\n }\n ],\n \"description\": \"Specifies additional spacing between \\\"words\\\".\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"word-wrap\",\n \"values\": [\n {\n \"name\": \"break-word\",\n \"description\": \"An otherwise unbreakable sequence of characters may be broken at an arbitrary point if there are no otherwise-acceptable break points in the line.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Lines may break only at allowed break points.\"\n }\n ],\n \"syntax\": \"normal | break-word\",\n \"relevance\": 78,\n \"description\": \"Specifies whether the UA may break within a word to prevent overflow when an otherwise-unbreakable string is too long to fit.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"writing-mode\",\n \"browsers\": [\n \"E12\",\n \"FF41\",\n \"S10.1\",\n \"C48\",\n \"IE9\",\n \"O35\"\n ],\n \"values\": [\n {\n \"name\": \"horizontal-tb\",\n \"description\": \"Top-to-bottom block flow direction. The writing mode is horizontal.\"\n },\n {\n \"name\": \"sideways-lr\",\n \"browsers\": [\n \"E12\",\n \"FF41\",\n \"S10.1\",\n \"C48\",\n \"IE9\",\n \"O35\"\n ],\n \"description\": \"Left-to-right block flow direction. The writing mode is vertical, while the typographic mode is horizontal.\"\n },\n {\n \"name\": \"sideways-rl\",\n \"browsers\": [\n \"E12\",\n \"FF41\",\n \"S10.1\",\n \"C48\",\n \"IE9\",\n \"O35\"\n ],\n \"description\": \"Right-to-left block flow direction. The writing mode is vertical, while the typographic mode is horizontal.\"\n },\n {\n \"name\": \"vertical-lr\",\n \"description\": \"Left-to-right block flow direction. The writing mode is vertical.\"\n },\n {\n \"name\": \"vertical-rl\",\n \"description\": \"Right-to-left block flow direction. The writing mode is vertical.\"\n }\n ],\n \"syntax\": \"horizontal-tb | vertical-rl | vertical-lr | sideways-rl | sideways-lr\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/writing-mode\"\n }\n ],\n \"description\": \"This is a shorthand property for both 'direction' and 'block-progression'.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"z-index\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O4\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The stack level of the generated box in the current stacking context is 0. The box does not establish a new stacking context unless it is the root element.\"\n }\n ],\n \"syntax\": \"auto | <integer>\",\n \"relevance\": 92,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/z-index\"\n }\n ],\n \"description\": \"For a positioned box, the 'z-index' property specifies the stack level of the box in the current stacking context and whether the box establishes a local stacking context.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"zoom\",\n \"browsers\": [\n \"E12\",\n \"S3.1\",\n \"C1\",\n \"IE5.5\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"normal\"\n }\n ],\n \"syntax\": \"auto | <number> | <percentage>\",\n \"relevance\": 66,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/zoom\"\n }\n ],\n \"description\": \"Non-standard. Specifies the magnification scale of the object. See 'transform: scale()' for a standards-based alternative.\",\n \"restrictions\": [\n \"enum\",\n \"integer\",\n \"number\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-ime-align\",\n \"status\": \"nonstandard\",\n \"syntax\": \"auto | after\",\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"after\"\n }\n ],\n \"relevance\": 0,\n \"description\": \"Aligns the Input Method Editor (IME) candidate window box relative to the element on which the IME composition is active.\"\n },\n {\n \"name\": \"-moz-binding\",\n \"status\": \"obsolete\",\n \"syntax\": \"<url> | none\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-binding\"\n }\n ],\n \"description\": \"The -moz-binding CSS property is used by Mozilla-based applications to attach an XBL binding to a DOM element.\"\n },\n {\n \"name\": \"-moz-context-properties\",\n \"status\": \"nonstandard\",\n \"syntax\": \"none | [ fill | fill-opacity | stroke | stroke-opacity ]#\",\n \"relevance\": 0,\n \"description\": \"If you reference an SVG image in a webpage (such as with the <img> element or as a background image), the SVG image can coordinate with the embedding element (its context) to have the image adopt property values set on the embedding element. To do this the embedding element needs to list the properties that are to be made available to the image by listing them as values of the -moz-context-properties property, and the image needs to opt in to using those properties by using values such as the context-fill value.\\n\\nThis feature is available since Firefox 55, but is only currently supported with SVG images loaded via chrome:// or resource:// URLs. To experiment with the feature in SVG on the Web it is necessary to set the svg.context-properties.content.enabled pref to true.\"\n },\n {\n \"name\": \"-moz-float-edge\",\n \"status\": \"obsolete\",\n \"syntax\": \"border-box | content-box | margin-box | padding-box\",\n \"values\": [\n {\n \"name\": \"border-box\"\n },\n {\n \"name\": \"content-box\"\n },\n {\n \"name\": \"margin-box\"\n },\n {\n \"name\": \"padding-box\"\n }\n ],\n \"relevance\": 0,\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-float-edge\"\n }\n ],\n \"description\": \"The non-standard -moz-float-edge CSS property specifies whether the height and width properties of the element include the margin, border, or padding thickness.\"\n },\n {\n \"name\": \"-moz-force-broken-image-icon\",\n \"status\": \"obsolete\",\n \"syntax\": \"0 | 1\",\n \"values\": [\n {\n \"name\": \"0\"\n },\n {\n \"name\": \"1\"\n }\n ],\n \"relevance\": 0,\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-force-broken-image-icon\"\n }\n ],\n \"description\": \"The -moz-force-broken-image-icon extended CSS property can be used to force the broken image icon to be shown even when a broken image has an alt attribute.\"\n },\n {\n \"name\": \"-moz-image-region\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<shape> | auto\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-image-region\"\n }\n ],\n \"description\": \"For certain XUL elements and pseudo-elements that use an image from the list-style-image property, this property specifies a region of the image that is used in place of the whole image. This allows elements to use different pieces of the same image to improve performance.\"\n },\n {\n \"name\": \"-moz-orient\",\n \"status\": \"nonstandard\",\n \"syntax\": \"inline | block | horizontal | vertical\",\n \"values\": [\n {\n \"name\": \"inline\"\n },\n {\n \"name\": \"block\"\n },\n {\n \"name\": \"horizontal\"\n },\n {\n \"name\": \"vertical\"\n }\n ],\n \"relevance\": 0,\n \"browsers\": [\n \"FF6\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-orient\"\n }\n ],\n \"description\": \"The -moz-orient CSS property specifies the orientation of the element to which it's applied.\"\n },\n {\n \"name\": \"-moz-outline-radius\",\n \"status\": \"obsolete\",\n \"syntax\": \"<outline-radius>{1,4} [ / <outline-radius>{1,4} ]?\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius\"\n }\n ],\n \"description\": \"In Mozilla applications like Firefox, the -moz-outline-radius CSS property can be used to give an element's outline rounded corners.\"\n },\n {\n \"name\": \"-moz-outline-radius-bottomleft\",\n \"status\": \"obsolete\",\n \"syntax\": \"<outline-radius>\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-bottomleft\"\n }\n ],\n \"description\": \"In Mozilla applications, the -moz-outline-radius-bottomleft CSS property can be used to round the bottom-left corner of an element's outline.\"\n },\n {\n \"name\": \"-moz-outline-radius-bottomright\",\n \"status\": \"obsolete\",\n \"syntax\": \"<outline-radius>\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-bottomright\"\n }\n ],\n \"description\": \"In Mozilla applications, the -moz-outline-radius-bottomright CSS property can be used to round the bottom-right corner of an element's outline.\"\n },\n {\n \"name\": \"-moz-outline-radius-topleft\",\n \"status\": \"obsolete\",\n \"syntax\": \"<outline-radius>\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-topleft\"\n }\n ],\n \"description\": \"In Mozilla applications, the -moz-outline-radius-topleft CSS property can be used to round the top-left corner of an element's outline.\"\n },\n {\n \"name\": \"-moz-outline-radius-topright\",\n \"status\": \"obsolete\",\n \"syntax\": \"<outline-radius>\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-topright\"\n }\n ],\n \"description\": \"In Mozilla applications, the -moz-outline-radius-topright CSS property can be used to round the top-right corner of an element's outline.\"\n },\n {\n \"name\": \"-moz-stack-sizing\",\n \"status\": \"nonstandard\",\n \"syntax\": \"ignore | stretch-to-fit\",\n \"values\": [\n {\n \"name\": \"ignore\"\n },\n {\n \"name\": \"stretch-to-fit\"\n }\n ],\n \"relevance\": 0,\n \"description\": \"-moz-stack-sizing is an extended CSS property. Normally, a stack will change its size so that all of its child elements are completely visible. For example, moving a child of the stack far to the right will widen the stack so the child remains visible.\"\n },\n {\n \"name\": \"-moz-text-blink\",\n \"status\": \"nonstandard\",\n \"syntax\": \"none | blink\",\n \"values\": [\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"blink\"\n }\n ],\n \"relevance\": 0,\n \"description\": \"The -moz-text-blink non-standard Mozilla CSS extension specifies the blink mode.\"\n },\n {\n \"name\": \"-moz-user-input\",\n \"status\": \"obsolete\",\n \"syntax\": \"auto | none | enabled | disabled\",\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"enabled\"\n },\n {\n \"name\": \"disabled\"\n }\n ],\n \"relevance\": 0,\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-user-input\"\n }\n ],\n \"description\": \"In Mozilla applications, -moz-user-input determines if an element will accept user input.\"\n },\n {\n \"name\": \"-moz-user-modify\",\n \"status\": \"nonstandard\",\n \"syntax\": \"read-only | read-write | write-only\",\n \"values\": [\n {\n \"name\": \"read-only\"\n },\n {\n \"name\": \"read-write\"\n },\n {\n \"name\": \"write-only\"\n }\n ],\n \"relevance\": 0,\n \"description\": \"The -moz-user-modify property has no effect. It was originally planned to determine whether or not the content of an element can be edited by a user.\"\n },\n {\n \"name\": \"-moz-window-dragging\",\n \"status\": \"nonstandard\",\n \"syntax\": \"drag | no-drag\",\n \"values\": [\n {\n \"name\": \"drag\"\n },\n {\n \"name\": \"no-drag\"\n }\n ],\n \"relevance\": 0,\n \"description\": \"The -moz-window-dragging CSS property specifies whether a window is draggable or not. It only works in Chrome code, and only on Mac OS X.\"\n },\n {\n \"name\": \"-moz-window-shadow\",\n \"status\": \"nonstandard\",\n \"syntax\": \"default | menu | tooltip | sheet | none\",\n \"values\": [\n {\n \"name\": \"default\"\n },\n {\n \"name\": \"menu\"\n },\n {\n \"name\": \"tooltip\"\n },\n {\n \"name\": \"sheet\"\n },\n {\n \"name\": \"none\"\n }\n ],\n \"relevance\": 0,\n \"description\": \"The -moz-window-shadow CSS property specifies whether a window will have a shadow. It only works on Mac OS X.\"\n },\n {\n \"name\": \"-webkit-border-before\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<'border-width'> || <'border-style'> || <color>\",\n \"relevance\": 0,\n \"browsers\": [\n \"E79\",\n \"S5.1\",\n \"C8\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-border-before\"\n }\n ],\n \"description\": \"The -webkit-border-before CSS property is a shorthand property for setting the individual logical block start border property values in a single place in the style sheet.\"\n },\n {\n \"name\": \"-webkit-border-before-color\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"description\": \"The -webkit-border-before-color CSS property sets the color of the individual logical block start border in a single place in the style sheet.\"\n },\n {\n \"name\": \"-webkit-border-before-style\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<'border-style'>\",\n \"relevance\": 0,\n \"description\": \"The -webkit-border-before-style CSS property sets the style of the individual logical block start border in a single place in the style sheet.\"\n },\n {\n \"name\": \"-webkit-border-before-width\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<'border-width'>\",\n \"relevance\": 0,\n \"description\": \"The -webkit-border-before-width CSS property sets the width of the individual logical block start border in a single place in the style sheet.\"\n },\n {\n \"name\": \"-webkit-line-clamp\",\n \"syntax\": \"none | <integer>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E17\",\n \"FF68\",\n \"S5\",\n \"C6\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-line-clamp\"\n }\n ],\n \"description\": \"The -webkit-line-clamp CSS property allows limiting of the contents of a block container to the specified number of lines.\"\n },\n {\n \"name\": \"-webkit-mask\",\n \"status\": \"nonstandard\",\n \"syntax\": \"[ <mask-reference> || <position> [ / <bg-size> ]? || <repeat-style> || [ <box> | border | padding | content | text ] || [ <box> | border | padding | content ] ]#\",\n \"relevance\": 0,\n \"description\": \"The mask CSS property alters the visibility of an element by either partially or fully hiding it. This is accomplished by either masking or clipping the image at specific points.\"\n },\n {\n \"name\": \"-webkit-mask-attachment\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<attachment>#\",\n \"relevance\": 0,\n \"browsers\": [\n \"S4\",\n \"C1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-attachment\"\n }\n ],\n \"description\": \"If a -webkit-mask-image is specified, -webkit-mask-attachment determines whether the mask image's position is fixed within the viewport, or scrolls along with its containing block.\"\n },\n {\n \"name\": \"-webkit-mask-composite\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<composite-style>#\",\n \"relevance\": 0,\n \"browsers\": [\n \"E18\",\n \"FF53\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-composite\"\n }\n ],\n \"description\": \"The -webkit-mask-composite property specifies the manner in which multiple mask images applied to the same element are composited with one another. Mask images are composited in the opposite order that they are declared with the -webkit-mask-image property.\"\n },\n {\n \"name\": \"-webkit-mask-position\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<position>#\",\n \"relevance\": 0,\n \"description\": \"The mask-position CSS property sets the initial position, relative to the mask position layer defined by mask-origin, for each defined mask image.\"\n },\n {\n \"name\": \"-webkit-mask-position-x\",\n \"status\": \"nonstandard\",\n \"syntax\": \"[ <length-percentage> | left | center | right ]#\",\n \"relevance\": 0,\n \"browsers\": [\n \"E18\",\n \"FF49\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-position-x\"\n }\n ],\n \"description\": \"The -webkit-mask-position-x CSS property sets the initial horizontal position of a mask image.\"\n },\n {\n \"name\": \"-webkit-mask-position-y\",\n \"status\": \"nonstandard\",\n \"syntax\": \"[ <length-percentage> | top | center | bottom ]#\",\n \"relevance\": 0,\n \"browsers\": [\n \"E18\",\n \"FF49\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-position-y\"\n }\n ],\n \"description\": \"The -webkit-mask-position-y CSS property sets the initial vertical position of a mask image.\"\n },\n {\n \"name\": \"-webkit-mask-repeat-x\",\n \"status\": \"nonstandard\",\n \"syntax\": \"repeat | no-repeat | space | round\",\n \"values\": [\n {\n \"name\": \"repeat\"\n },\n {\n \"name\": \"no-repeat\"\n },\n {\n \"name\": \"space\"\n },\n {\n \"name\": \"round\"\n }\n ],\n \"relevance\": 0,\n \"browsers\": [\n \"E79\",\n \"S5\",\n \"C3\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-repeat-x\"\n }\n ],\n \"description\": \"The -webkit-mask-repeat-x property specifies whether and how a mask image is repeated (tiled) horizontally.\"\n },\n {\n \"name\": \"-webkit-mask-repeat-y\",\n \"status\": \"nonstandard\",\n \"syntax\": \"repeat | no-repeat | space | round\",\n \"values\": [\n {\n \"name\": \"repeat\"\n },\n {\n \"name\": \"no-repeat\"\n },\n {\n \"name\": \"space\"\n },\n {\n \"name\": \"round\"\n }\n ],\n \"relevance\": 0,\n \"browsers\": [\n \"E79\",\n \"S5\",\n \"C3\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-repeat-y\"\n }\n ],\n \"description\": \"The -webkit-mask-repeat-y property specifies whether and how a mask image is repeated (tiled) vertically.\"\n },\n {\n \"name\": \"accent-color\",\n \"syntax\": \"auto | <color>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E93\",\n \"FF92\",\n \"S15.4\",\n \"C93\",\n \"O79\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/accent-color\"\n }\n ],\n \"description\": \"Sets the color of the elements accent\"\n },\n {\n \"name\": \"align-tracks\",\n \"status\": \"experimental\",\n \"syntax\": \"[ normal | <baseline-position> | <content-distribution> | <overflow-position>? <content-position> ]#\",\n \"relevance\": 50,\n \"browsers\": [\n \"FF77\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/align-tracks\"\n }\n ],\n \"description\": \"The align-tracks CSS property sets the alignment in the masonry axis for grid containers that have masonry in their block axis.\"\n },\n {\n \"name\": \"animation-composition\",\n \"status\": \"experimental\",\n \"syntax\": \"<single-animation-composition>#\",\n \"relevance\": 50,\n \"browsers\": [\n \"FF104\",\n \"S16\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/animation-composition\"\n }\n ],\n \"description\": \"The composite operation to use when multiple animations affect the same property.\"\n },\n {\n \"name\": \"animation-timeline\",\n \"status\": \"experimental\",\n \"syntax\": \"<single-animation-timeline>#\",\n \"relevance\": 50,\n \"browsers\": [\n \"FF97\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/animation-timeline\"\n }\n ],\n \"description\": \"Specifies the names of one or more @scroll-timeline at-rules to describe the element's scroll animations.\"\n },\n {\n \"name\": \"appearance\",\n \"syntax\": \"none | auto | textfield | menulist-button | <compat-auto>\",\n \"relevance\": 63,\n \"browsers\": [\n \"E84\",\n \"FF80\",\n \"S15.4\",\n \"C84\",\n \"O70\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/appearance\"\n }\n ],\n \"description\": \"Changes the appearance of buttons and other controls to resemble native controls.\"\n },\n {\n \"name\": \"aspect-ratio\",\n \"syntax\": \"auto | <ratio>\",\n \"relevance\": 57,\n \"browsers\": [\n \"E88\",\n \"FF89\",\n \"S15\",\n \"C88\",\n \"O74\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/aspect-ratio\"\n }\n ],\n \"description\": \"The aspect-ratio CSS property sets a preferred aspect ratio for the box, which will be used in the calculation of auto sizes and some other layout functions.\"\n },\n {\n \"name\": \"azimuth\",\n \"status\": \"obsolete\",\n \"syntax\": \"<angle> | [ [ left-side | far-left | left | center-left | center | center-right | right | far-right | right-side ] || behind ] | leftwards | rightwards\",\n \"relevance\": 0,\n \"description\": \"In combination with elevation, the azimuth CSS property enables different audio sources to be positioned spatially for aural presentation. This is important in that it provides a natural way to tell several voices apart, as each can be positioned to originate at a different location on the sound stage. Stereo output produce a lateral sound stage, while binaural headphones and multi-speaker setups allow for a fully three-dimensional stage.\"\n },\n {\n \"name\": \"backdrop-filter\",\n \"syntax\": \"none | <filter-function-list>\",\n \"relevance\": 58,\n \"browsers\": [\n \"E17\",\n \"FF103\",\n \"S9\",\n \"C76\",\n \"O63\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/backdrop-filter\"\n }\n ],\n \"description\": \"The backdrop-filter CSS property lets you apply graphical effects such as blurring or color shifting to the area behind an element. Because it applies to everything behind the element, to see the effect you must make the element or its background at least partially transparent.\"\n },\n {\n \"name\": \"border-block\",\n \"syntax\": \"<'border-top-width'> || <'border-top-style'> || <color>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block\"\n }\n ],\n \"description\": \"The border-block CSS property is a shorthand property for setting the individual logical block border property values in a single place in the style sheet.\"\n },\n {\n \"name\": \"border-block-color\",\n \"syntax\": \"<'border-top-color'>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-color\"\n }\n ],\n \"description\": \"The border-block-color CSS property defines the color of the logical block borders of an element, which maps to a physical border color depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-color and border-bottom-color, or border-right-color and border-left-color property depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"border-block-style\",\n \"syntax\": \"<'border-top-style'>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-style\"\n }\n ],\n \"description\": \"The border-block-style CSS property defines the style of the logical block borders of an element, which maps to a physical border style depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-style and border-bottom-style, or border-left-style and border-right-style properties depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"border-block-width\",\n \"syntax\": \"<'border-top-width'>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-width\"\n }\n ],\n \"description\": \"The border-block-width CSS property defines the width of the logical block borders of an element, which maps to a physical border width depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-width and border-bottom-width, or border-left-width, and border-right-width property depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"border-end-end-radius\",\n \"syntax\": \"<length-percentage>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E89\",\n \"FF66\",\n \"S15\",\n \"C89\",\n \"O75\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-end-end-radius\"\n }\n ],\n \"description\": \"The border-end-end-radius CSS property defines a logical border radius on an element, which maps to a physical border radius that depends on on the element's writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"border-end-start-radius\",\n \"syntax\": \"<length-percentage>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E89\",\n \"FF66\",\n \"S15\",\n \"C89\",\n \"O75\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-end-start-radius\"\n }\n ],\n \"description\": \"The border-end-start-radius CSS property defines a logical border radius on an element, which maps to a physical border radius depending on the element's writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"border-inline\",\n \"syntax\": \"<'border-top-width'> || <'border-top-style'> || <color>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline\"\n }\n ],\n \"description\": \"The border-inline CSS property is a shorthand property for setting the individual logical inline border property values in a single place in the style sheet.\"\n },\n {\n \"name\": \"border-inline-color\",\n \"syntax\": \"<'border-top-color'>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-color\"\n }\n ],\n \"description\": \"The border-inline-color CSS property defines the color of the logical inline borders of an element, which maps to a physical border color depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-color and border-bottom-color, or border-right-color and border-left-color property depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"border-inline-style\",\n \"syntax\": \"<'border-top-style'>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-style\"\n }\n ],\n \"description\": \"The border-inline-style CSS property defines the style of the logical inline borders of an element, which maps to a physical border style depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-style and border-bottom-style, or border-left-style and border-right-style properties depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"border-inline-width\",\n \"syntax\": \"<'border-top-width'>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-width\"\n }\n ],\n \"description\": \"The border-inline-width CSS property defines the width of the logical inline borders of an element, which maps to a physical border width depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-width and border-bottom-width, or border-left-width, and border-right-width property depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"border-start-end-radius\",\n \"syntax\": \"<length-percentage>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E89\",\n \"FF66\",\n \"S15\",\n \"C89\",\n \"O75\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-start-end-radius\"\n }\n ],\n \"description\": \"The border-start-end-radius CSS property defines a logical border radius on an element, which maps to a physical border radius depending on the element's writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"border-start-start-radius\",\n \"syntax\": \"<length-percentage>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E89\",\n \"FF66\",\n \"S15\",\n \"C89\",\n \"O75\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-start-start-radius\"\n }\n ],\n \"description\": \"The border-start-start-radius CSS property defines a logical border radius on an element, which maps to a physical border radius that depends on the element's writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"box-align\",\n \"status\": \"obsolete\",\n \"syntax\": \"start | center | end | baseline | stretch\",\n \"values\": [\n {\n \"name\": \"start\"\n },\n {\n \"name\": \"center\"\n },\n {\n \"name\": \"end\"\n },\n {\n \"name\": \"baseline\"\n },\n {\n \"name\": \"stretch\"\n }\n ],\n \"relevance\": 0,\n \"browsers\": [\n \"E12\",\n \"FF49\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-align\"\n }\n ],\n \"description\": \"The box-align CSS property specifies how an element aligns its contents across its layout in a perpendicular direction. The effect of the property is only visible if there is extra space in the box.\"\n },\n {\n \"name\": \"box-direction\",\n \"status\": \"obsolete\",\n \"syntax\": \"normal | reverse | inherit\",\n \"values\": [\n {\n \"name\": \"normal\"\n },\n {\n \"name\": \"reverse\"\n },\n {\n \"name\": \"inherit\"\n }\n ],\n \"relevance\": 0,\n \"browsers\": [\n \"E12\",\n \"FF49\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-direction\"\n }\n ],\n \"description\": \"The box-direction CSS property specifies whether a box lays out its contents normally (from the top or left edge), or in reverse (from the bottom or right edge).\"\n },\n {\n \"name\": \"box-flex\",\n \"status\": \"obsolete\",\n \"syntax\": \"<number>\",\n \"relevance\": 0,\n \"browsers\": [\n \"E12\",\n \"FF49\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-flex\"\n }\n ],\n \"description\": \"The -moz-box-flex and -webkit-box-flex CSS properties specify how a -moz-box or -webkit-box grows to fill the box that contains it, in the direction of the containing box's layout.\"\n },\n {\n \"name\": \"box-flex-group\",\n \"status\": \"obsolete\",\n \"syntax\": \"<integer>\",\n \"relevance\": 0,\n \"browsers\": [\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-flex-group\"\n }\n ],\n \"description\": \"The box-flex-group CSS property assigns the flexbox's child elements to a flex group.\"\n },\n {\n \"name\": \"box-lines\",\n \"status\": \"obsolete\",\n \"syntax\": \"single | multiple\",\n \"values\": [\n {\n \"name\": \"single\"\n },\n {\n \"name\": \"multiple\"\n }\n ],\n \"relevance\": 0,\n \"browsers\": [\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-lines\"\n }\n ],\n \"description\": \"The box-lines CSS property determines whether the box may have a single or multiple lines (rows for horizontally oriented boxes, columns for vertically oriented boxes).\"\n },\n {\n \"name\": \"box-ordinal-group\",\n \"status\": \"obsolete\",\n \"syntax\": \"<integer>\",\n \"relevance\": 0,\n \"browsers\": [\n \"E12\",\n \"FF49\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-ordinal-group\"\n }\n ],\n \"description\": \"The box-ordinal-group CSS property assigns the flexbox's child elements to an ordinal group.\"\n },\n {\n \"name\": \"box-orient\",\n \"status\": \"obsolete\",\n \"syntax\": \"horizontal | vertical | inline-axis | block-axis | inherit\",\n \"values\": [\n {\n \"name\": \"horizontal\"\n },\n {\n \"name\": \"vertical\"\n },\n {\n \"name\": \"inline-axis\"\n },\n {\n \"name\": \"block-axis\"\n },\n {\n \"name\": \"inherit\"\n }\n ],\n \"relevance\": 0,\n \"browsers\": [\n \"E12\",\n \"FF49\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-orient\"\n }\n ],\n \"description\": \"The box-orient CSS property specifies whether an element lays out its contents horizontally or vertically.\"\n },\n {\n \"name\": \"box-pack\",\n \"status\": \"obsolete\",\n \"syntax\": \"start | center | end | justify\",\n \"values\": [\n {\n \"name\": \"start\"\n },\n {\n \"name\": \"center\"\n },\n {\n \"name\": \"end\"\n },\n {\n \"name\": \"justify\"\n }\n ],\n \"relevance\": 0,\n \"browsers\": [\n \"E12\",\n \"FF49\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-pack\"\n }\n ],\n \"description\": \"The -moz-box-pack and -webkit-box-pack CSS properties specify how a -moz-box or -webkit-box packs its contents in the direction of its layout. The effect of this is only visible if there is extra space in the box.\"\n },\n {\n \"name\": \"caret\",\n \"syntax\": \"<'caret-color'> || <'caret-shape'>\",\n \"relevance\": 50,\n \"description\": \"Shorthand for setting caret-color and caret-shape.\"\n },\n {\n \"name\": \"caret-shape\",\n \"syntax\": \"auto | bar | block | underscore\",\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"bar\"\n },\n {\n \"name\": \"block\"\n },\n {\n \"name\": \"underscore\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the desired shape of the text insertion caret.\"\n },\n {\n \"name\": \"print-color-adjust\",\n \"syntax\": \"economy | exact\",\n \"values\": [\n {\n \"name\": \"economy\"\n },\n {\n \"name\": \"exact\"\n }\n ],\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF97\",\n \"S15.4\",\n \"C17\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/print-color-adjust\"\n }\n ],\n \"description\": \"Defines what optimization the user agent is allowed to do when adjusting the appearance for an output device.\"\n },\n {\n \"name\": \"color-scheme\",\n \"syntax\": \"normal | [ light | dark | <custom-ident> ]+ && only?\",\n \"relevance\": 52,\n \"browsers\": [\n \"E81\",\n \"FF96\",\n \"S13\",\n \"C81\",\n \"O68\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/color-scheme\"\n }\n ],\n \"description\": \"The color-scheme CSS property allows an element to indicate which color schemes it can comfortably be rendered in.\"\n },\n {\n \"name\": \"contain-intrinsic-size\",\n \"status\": \"experimental\",\n \"syntax\": \"[ none | <length> | auto <length> ]{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E83\",\n \"FF104\",\n \"C83\",\n \"O69\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-size\"\n }\n ],\n \"description\": \"Size of an element when the element is subject to size containment.\"\n },\n {\n \"name\": \"contain-intrinsic-block-size\",\n \"status\": \"experimental\",\n \"syntax\": \"none | <length> | auto <length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E95\",\n \"FF104\",\n \"C95\",\n \"O81\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-contain-intrinsic-block-size\"\n }\n ],\n \"description\": \"Block size of an element when the element is subject to size containment.\"\n },\n {\n \"name\": \"contain-intrinsic-height\",\n \"status\": \"experimental\",\n \"syntax\": \"none | <length> | auto <length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E83\",\n \"FF104\",\n \"C83\",\n \"O69\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-height\"\n }\n ],\n \"description\": \"Height of an element when the element is subject to size containment.\"\n },\n {\n \"name\": \"contain-intrinsic-inline-size\",\n \"status\": \"experimental\",\n \"syntax\": \"none | <length> | auto <length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E95\",\n \"FF104\",\n \"C95\",\n \"O81\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-contain-intrinsic-inline-size\"\n }\n ],\n \"description\": \"Inline size of an element when the element is subject to size containment.\"\n },\n {\n \"name\": \"contain-intrinsic-width\",\n \"status\": \"experimental\",\n \"syntax\": \"none | <length> | auto <length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E83\",\n \"FF104\",\n \"C83\",\n \"O69\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/contain-intrinsic-width\"\n }\n ],\n \"description\": \"Width of an element when the element is subject to size containment.\"\n },\n {\n \"name\": \"content-visibility\",\n \"syntax\": \"visible | auto | hidden\",\n \"values\": [\n {\n \"name\": \"visible\"\n },\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"hidden\"\n }\n ],\n \"relevance\": 52,\n \"browsers\": [\n \"E85\",\n \"C85\",\n \"O71\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/content-visibility\"\n }\n ],\n \"description\": \"Controls whether or not an element renders its contents at all, along with forcing a strong set of containments, allowing user agents to potentially omit large swathes of layout and rendering work until it becomes needed.\"\n },\n {\n \"name\": \"counter-set\",\n \"syntax\": \"[ <counter-name> <integer>? ]+ | none\",\n \"relevance\": 50,\n \"browsers\": [\n \"E85\",\n \"FF68\",\n \"C85\",\n \"O71\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/counter-set\"\n }\n ],\n \"description\": \"The counter-set CSS property sets a CSS counter to a given value. It manipulates the value of existing counters, and will only create new counters if there isn't already a counter of the given name on the element.\"\n },\n {\n \"name\": \"font-optical-sizing\",\n \"syntax\": \"auto | none\",\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"none\"\n }\n ],\n \"relevance\": 50,\n \"browsers\": [\n \"E17\",\n \"FF62\",\n \"S11\",\n \"C79\",\n \"O66\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-optical-sizing\"\n }\n ],\n \"description\": \"The font-optical-sizing CSS property allows developers to control whether browsers render text with slightly differing visual representations to optimize viewing at different sizes, or not. This only works for fonts that have an optical size variation axis.\"\n },\n {\n \"name\": \"font-variation-settings\",\n \"syntax\": \"normal | [ <string> <number> ]#\",\n \"relevance\": 50,\n \"browsers\": [\n \"E17\",\n \"FF62\",\n \"S11\",\n \"C62\",\n \"O49\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-variation-settings\"\n }\n ],\n \"description\": \"The font-variation-settings CSS property provides low-level control over OpenType or TrueType font variations, by specifying the four letter axis names of the features you want to vary, along with their variation values.\"\n },\n {\n \"name\": \"font-smooth\",\n \"status\": \"nonstandard\",\n \"syntax\": \"auto | never | always | <absolute-size> | <length>\",\n \"relevance\": 0,\n \"browsers\": [\n \"E79\",\n \"FF25\",\n \"S4\",\n \"C5\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-smooth\"\n }\n ],\n \"description\": \"The font-smooth CSS property controls the application of anti-aliasing when fonts are rendered.\"\n },\n {\n \"name\": \"forced-color-adjust\",\n \"syntax\": \"auto | none\",\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"none\"\n }\n ],\n \"relevance\": 57,\n \"browsers\": [\n \"E79\",\n \"C89\",\n \"IE10\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/forced-color-adjust\"\n }\n ],\n \"description\": \"Allows authors to opt certain elements out of forced colors mode. This then restores the control of those values to CSS\"\n },\n {\n \"name\": \"gap\",\n \"syntax\": \"<'row-gap'> <'column-gap'>?\",\n \"relevance\": 58,\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/gap\"\n }\n ],\n \"description\": \"The gap CSS property is a shorthand property for row-gap and column-gap specifying the gutters between grid rows and columns.\"\n },\n {\n \"name\": \"hanging-punctuation\",\n \"syntax\": \"none | [ first || [ force-end | allow-end ] || last ]\",\n \"relevance\": 50,\n \"browsers\": [\n \"S10\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/hanging-punctuation\"\n }\n ],\n \"description\": \"The hanging-punctuation CSS property specifies whether a punctuation mark should hang at the start or end of a line of text. Hanging punctuation may be placed outside the line box.\"\n },\n {\n \"name\": \"hyphenate-character\",\n \"syntax\": \"auto | <string>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E106\",\n \"FF98\",\n \"S5.1\",\n \"C106\",\n \"O92\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/hyphenate-character\"\n }\n ],\n \"description\": \"A hyphenate character used at the end of a line.\"\n },\n {\n \"name\": \"image-resolution\",\n \"status\": \"experimental\",\n \"syntax\": \"[ from-image || <resolution> ] && snap?\",\n \"relevance\": 50,\n \"description\": \"The image-resolution property specifies the intrinsic resolution of all raster images used in or on the element. It affects both content images (e.g. replaced elements and generated content) and decorative images (such as background-image). The intrinsic resolution of an image is used to determine the image\u2019s intrinsic dimensions.\"\n },\n {\n \"name\": \"initial-letter\",\n \"status\": \"experimental\",\n \"syntax\": \"normal | [ <number> <integer>? ]\",\n \"relevance\": 50,\n \"browsers\": [\n \"S9\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/initial-letter\"\n }\n ],\n \"description\": \"The initial-letter CSS property specifies styling for dropped, raised, and sunken initial letters.\"\n },\n {\n \"name\": \"initial-letter-align\",\n \"status\": \"experimental\",\n \"syntax\": \"[ auto | alphabetic | hanging | ideographic ]\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/initial-letter-align\"\n }\n ],\n \"description\": \"The initial-letter-align CSS property specifies the alignment of initial letters within a paragraph.\"\n },\n {\n \"name\": \"input-security\",\n \"syntax\": \"auto | none\",\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"none\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Enables or disables the obscuring a sensitive test input.\"\n },\n {\n \"name\": \"inset\",\n \"syntax\": \"<'top'>{1,4}\",\n \"relevance\": 51,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/inset\"\n }\n ],\n \"description\": \"The inset CSS property defines the logical block and inline start and end offsets of an element, which map to physical offsets depending on the element's writing mode, directionality, and text orientation. It corresponds to the top and bottom, or right and left properties depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"inset-block\",\n \"syntax\": \"<'top'>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF63\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/inset-block\"\n }\n ],\n \"description\": \"The inset-block CSS property defines the logical block start and end offsets of an element, which maps to physical offsets depending on the element's writing mode, directionality, and text orientation. It corresponds to the top and bottom, or right and left properties depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"inset-block-end\",\n \"syntax\": \"<'top'>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF63\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/inset-block-end\"\n }\n ],\n \"description\": \"The inset-block-end CSS property defines the logical block end offset of an element, which maps to a physical offset depending on the element's writing mode, directionality, and text orientation. It corresponds to the top, right, bottom, or left property depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"inset-block-start\",\n \"syntax\": \"<'top'>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF63\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/inset-block-start\"\n }\n ],\n \"description\": \"The inset-block-start CSS property defines the logical block start offset of an element, which maps to a physical offset depending on the element's writing mode, directionality, and text orientation. It corresponds to the top, right, bottom, or left property depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"inset-inline\",\n \"syntax\": \"<'top'>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF63\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/inset-inline\"\n }\n ],\n \"description\": \"The inset-inline CSS property defines the logical block start and end offsets of an element, which maps to physical offsets depending on the element's writing mode, directionality, and text orientation. It corresponds to the top and bottom, or right and left properties depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"inset-inline-end\",\n \"syntax\": \"<'top'>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF63\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/inset-inline-end\"\n }\n ],\n \"description\": \"The inset-inline-end CSS property defines the logical inline end inset of an element, which maps to a physical inset depending on the element's writing mode, directionality, and text orientation. It corresponds to the top, right, bottom, or left property depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"inset-inline-start\",\n \"syntax\": \"<'top'>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF63\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/inset-inline-start\"\n }\n ],\n \"description\": \"The inset-inline-start CSS property defines the logical inline start inset of an element, which maps to a physical offset depending on the element's writing mode, directionality, and text orientation. It corresponds to the top, right, bottom, or left property depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"justify-tracks\",\n \"status\": \"experimental\",\n \"syntax\": \"[ normal | <content-distribution> | <overflow-position>? [ <content-position> | left | right ] ]#\",\n \"relevance\": 50,\n \"browsers\": [\n \"FF77\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/justify-tracks\"\n }\n ],\n \"description\": \"The justify-tracks CSS property sets the alignment in the masonry axis for grid containers that have masonry in their inline axis\"\n },\n {\n \"name\": \"line-clamp\",\n \"status\": \"experimental\",\n \"syntax\": \"none | <integer>\",\n \"relevance\": 50,\n \"description\": \"The line-clamp property allows limiting the contents of a block container to the specified number of lines; remaining content is fragmented away and neither rendered nor measured. Optionally, it also allows inserting content into the last line box to indicate the continuity of truncated/interrupted content.\"\n },\n {\n \"name\": \"line-height-step\",\n \"status\": \"experimental\",\n \"syntax\": \"<length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"C60\",\n \"O47\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/line-height-step\"\n }\n ],\n \"description\": \"The line-height-step CSS property defines the step units for line box heights. When the step unit is positive, line box heights are rounded up to the closest multiple of the unit. Negative values are invalid.\"\n },\n {\n \"name\": \"margin-block\",\n \"syntax\": \"<'margin-left'>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-block\"\n }\n ],\n \"description\": \"The margin-block CSS property defines the logical block start and end margins of an element, which maps to physical margins depending on the element's writing mode, directionality, and text orientation.\"\n },\n {\n \"name\": \"margin-inline\",\n \"syntax\": \"<'margin-left'>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-inline\"\n }\n ],\n \"description\": \"The margin-inline CSS property defines the logical inline start and end margins of an element, which maps to physical margins depending on the element's writing mode, directionality, and text orientation.\"\n },\n {\n \"name\": \"margin-trim\",\n \"status\": \"experimental\",\n \"syntax\": \"none | in-flow | all\",\n \"values\": [\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"in-flow\"\n },\n {\n \"name\": \"all\"\n }\n ],\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-trim\"\n }\n ],\n \"description\": \"The margin-trim property allows the container to trim the margins of its children where they adjoin the container\u2019s edges.\"\n },\n {\n \"name\": \"mask\",\n \"syntax\": \"<mask-layer>#\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF2\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask\"\n }\n ],\n \"description\": \"The mask CSS property alters the visibility of an element by either partially or fully hiding it. This is accomplished by either masking or clipping the image at specific points.\"\n },\n {\n \"name\": \"mask-border\",\n \"syntax\": \"<'mask-border-source'> || <'mask-border-slice'> [ / <'mask-border-width'>? [ / <'mask-border-outset'> ]? ]? || <'mask-border-repeat'> || <'mask-border-mode'>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-border\"\n }\n ],\n \"description\": \"The mask-border CSS property lets you create a mask along the edge of an element's border.\\n\\nThis property is a shorthand for mask-border-source, mask-border-slice, mask-border-width, mask-border-outset, mask-border-repeat, and mask-border-mode. As with all shorthand properties, any omitted sub-values will be set to their initial value.\"\n },\n {\n \"name\": \"mask-border-mode\",\n \"syntax\": \"luminance | alpha\",\n \"values\": [\n {\n \"name\": \"luminance\"\n },\n {\n \"name\": \"alpha\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"The mask-border-mode CSS property specifies the blending mode used in a mask border.\"\n },\n {\n \"name\": \"mask-border-outset\",\n \"syntax\": \"[ <length> | <number> ]{1,4}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-border-outset\"\n }\n ],\n \"description\": \"The mask-border-outset CSS property specifies the distance by which an element's mask border is set out from its border box.\"\n },\n {\n \"name\": \"mask-border-repeat\",\n \"syntax\": \"[ stretch | repeat | round | space ]{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-border-repeat\"\n }\n ],\n \"description\": \"The mask-border-repeat CSS property defines how the edge regions of a source image are adjusted to fit the dimensions of an element's mask border.\"\n },\n {\n \"name\": \"mask-border-slice\",\n \"syntax\": \"<number-percentage>{1,4} fill?\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-border-slice\"\n }\n ],\n \"description\": \"The mask-border-slice CSS property divides the image specified by mask-border-source into regions. These regions are used to form the components of an element's mask border.\"\n },\n {\n \"name\": \"mask-border-source\",\n \"syntax\": \"none | <image>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-border-source\"\n }\n ],\n \"description\": \"The mask-border-source CSS property specifies the source image used to create an element's mask border.\\n\\nThe mask-border-slice property is used to divide the source image into regions, which are then dynamically applied to the final mask border.\"\n },\n {\n \"name\": \"mask-border-width\",\n \"syntax\": \"[ <length-percentage> | <number> | auto ]{1,4}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-border-width\"\n }\n ],\n \"description\": \"The mask-border-width CSS property specifies the width of an element's mask border.\"\n },\n {\n \"name\": \"mask-clip\",\n \"syntax\": \"[ <geometry-box> | no-clip ]#\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF53\",\n \"S15.4\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-clip\"\n }\n ],\n \"description\": \"The mask-clip CSS property determines the area, which is affected by a mask. The painted content of an element must be restricted to this area.\"\n },\n {\n \"name\": \"mask-composite\",\n \"syntax\": \"<compositing-operator>#\",\n \"relevance\": 50,\n \"browsers\": [\n \"E18\",\n \"FF53\",\n \"S15.4\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-composite\"\n }\n ],\n \"description\": \"The mask-composite CSS property represents a compositing operation used on the current mask layer with the mask layers below it.\"\n },\n {\n \"name\": \"masonry-auto-flow\",\n \"status\": \"experimental\",\n \"syntax\": \"[ pack | next ] || [ definite-first | ordered ]\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/masonry-auto-flow\"\n }\n ],\n \"description\": \"The masonry-auto-flow CSS property modifies how items are placed when using masonry in CSS Grid Layout.\"\n },\n {\n \"name\": \"math-depth\",\n \"syntax\": \"auto-add | add(<integer>) | <integer>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF83\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/math-depth\"\n }\n ],\n \"description\": \"Describe a notion of \\\"depth\\\" for each element of a mathematical formula, with respect to the top-level container of that formula.\"\n },\n {\n \"name\": \"math-shift\",\n \"syntax\": \"normal | compact\",\n \"values\": [\n {\n \"name\": \"normal\"\n },\n {\n \"name\": \"compact\"\n }\n ],\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/math-shift\"\n }\n ],\n \"description\": \"Used for positioning superscript during the layout of MathML scripted elements.\"\n },\n {\n \"name\": \"math-style\",\n \"syntax\": \"normal | compact\",\n \"values\": [\n {\n \"name\": \"normal\"\n },\n {\n \"name\": \"compact\"\n }\n ],\n \"relevance\": 50,\n \"browsers\": [\n \"E83\",\n \"FF83\",\n \"S14.1\",\n \"C83\",\n \"O69\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/math-style\"\n }\n ],\n \"description\": \"The math-style property indicates whether MathML equations should render with normal or compact height.\"\n },\n {\n \"name\": \"max-lines\",\n \"status\": \"experimental\",\n \"syntax\": \"none | <integer>\",\n \"relevance\": 50,\n \"description\": \"The max-lines property forces a break after a set number of lines\"\n },\n {\n \"name\": \"offset\",\n \"syntax\": \"[ <'offset-position'>? [ <'offset-path'> [ <'offset-distance'> || <'offset-rotate'> ]? ]? ]! [ / <'offset-anchor'> ]?\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF72\",\n \"S16\",\n \"C55\",\n \"O42\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/offset\"\n }\n ],\n \"description\": \"The offset CSS property is a shorthand property for animating an element along a defined path.\"\n },\n {\n \"name\": \"offset-anchor\",\n \"syntax\": \"auto | <position>\",\n \"relevance\": 50,\n \"browsers\": [\n \"FF72\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/offset-anchor\"\n }\n ],\n \"description\": \"Defines an anchor point of the box positioned along the path. The anchor point specifies the point of the box which is to be considered as the point that is moved along the path.\"\n },\n {\n \"name\": \"offset-distance\",\n \"syntax\": \"<length-percentage>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF72\",\n \"C55\",\n \"O42\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/offset-distance\"\n }\n ],\n \"description\": \"The offset-distance CSS property specifies a position along an offset-path.\"\n },\n {\n \"name\": \"offset-path\",\n \"syntax\": \"none | ray( [ <angle> && <size> && contain? ] ) | <path()> | <url> | [ <basic-shape> || <geometry-box> ]\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF72\",\n \"S15.4\",\n \"C55\",\n \"O45\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/offset-path\"\n }\n ],\n \"description\": \"The offset-path CSS property specifies the offset path where the element gets positioned. The exact element\u2019s position on the offset path is determined by the offset-distance property. An offset path is either a specified path with one or multiple sub-paths or the geometry of a not-styled basic shape. Each shape or path must define an initial position for the computed value of \\\"0\\\" for offset-distance and an initial direction which specifies the rotation of the object to the initial position.\\n\\nIn this specification, a direction (or rotation) of 0 degrees is equivalent to the direction of the positive x-axis in the object\u2019s local coordinate system. In other words, a rotation of 0 degree points to the right side of the UA if the object and its ancestors have no transformation applied.\"\n },\n {\n \"name\": \"offset-position\",\n \"status\": \"experimental\",\n \"syntax\": \"auto | <position>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/offset-position\"\n }\n ],\n \"description\": \"Specifies the initial position of the offset path. If position is specified with static, offset-position would be ignored.\"\n },\n {\n \"name\": \"offset-rotate\",\n \"syntax\": \"[ auto | reverse ] || <angle>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF72\",\n \"C56\",\n \"O43\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/offset-rotate\"\n }\n ],\n \"description\": \"The offset-rotate CSS property defines the direction of the element while positioning along the offset path.\"\n },\n {\n \"name\": \"overflow-anchor\",\n \"syntax\": \"auto | none\",\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"none\"\n }\n ],\n \"relevance\": 52,\n \"browsers\": [\n \"E79\",\n \"FF66\",\n \"C56\",\n \"O43\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overflow-anchor\"\n }\n ],\n \"description\": \"The overflow-anchor CSS property provides a way to opt out browser scroll anchoring behavior which adjusts scroll position to minimize content shifts.\"\n },\n {\n \"name\": \"overflow-block\",\n \"syntax\": \"visible | hidden | clip | scroll | auto\",\n \"values\": [\n {\n \"name\": \"visible\"\n },\n {\n \"name\": \"hidden\"\n },\n {\n \"name\": \"clip\"\n },\n {\n \"name\": \"scroll\"\n },\n {\n \"name\": \"auto\"\n }\n ],\n \"relevance\": 50,\n \"browsers\": [\n \"FF69\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overflow-block\"\n }\n ],\n \"description\": \"The overflow-block CSS media feature can be used to test how the output device handles content that overflows the initial containing block along the block axis.\"\n },\n {\n \"name\": \"overflow-clip-box\",\n \"status\": \"nonstandard\",\n \"syntax\": \"padding-box | content-box\",\n \"values\": [\n {\n \"name\": \"padding-box\"\n },\n {\n \"name\": \"content-box\"\n }\n ],\n \"relevance\": 0,\n \"browsers\": [\n \"FF29\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Mozilla/Gecko/Chrome/CSS/overflow-clip-box\"\n }\n ],\n \"description\": \"The overflow-clip-box CSS property specifies relative to which box the clipping happens when there is an overflow. It is short hand for the overflow-clip-box-inline and overflow-clip-box-block properties.\"\n },\n {\n \"name\": \"overflow-clip-margin\",\n \"syntax\": \"<visual-box> || <length [0,\u221E]>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E90\",\n \"FF102\",\n \"C90\",\n \"O76\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overflow-clip-margin\"\n }\n ],\n \"description\": \"The overflow-clip-margin CSS property determines how far outside its bounds an element with overflow: clip may be painted before being clipped.\"\n },\n {\n \"name\": \"overflow-inline\",\n \"syntax\": \"visible | hidden | clip | scroll | auto\",\n \"values\": [\n {\n \"name\": \"visible\"\n },\n {\n \"name\": \"hidden\"\n },\n {\n \"name\": \"clip\"\n },\n {\n \"name\": \"scroll\"\n },\n {\n \"name\": \"auto\"\n }\n ],\n \"relevance\": 50,\n \"browsers\": [\n \"FF69\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overflow-inline\"\n }\n ],\n \"description\": \"The overflow-inline CSS media feature can be used to test how the output device handles content that overflows the initial containing block along the inline axis.\"\n },\n {\n \"name\": \"overscroll-behavior\",\n \"syntax\": \"[ contain | none | auto ]{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E18\",\n \"FF59\",\n \"S16\",\n \"C63\",\n \"O50\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior\"\n }\n ],\n \"description\": \"The overscroll-behavior CSS property is shorthand for the overscroll-behavior-x and overscroll-behavior-y properties, which allow you to control the browser's scroll overflow behavior \u2014 what happens when the boundary of a scrolling area is reached.\"\n },\n {\n \"name\": \"overscroll-behavior-block\",\n \"syntax\": \"contain | none | auto\",\n \"values\": [\n {\n \"name\": \"contain\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"auto\"\n }\n ],\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF73\",\n \"S16\",\n \"C77\",\n \"O64\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-block\"\n }\n ],\n \"description\": \"The overscroll-behavior-block CSS property sets the browser's behavior when the block direction boundary of a scrolling area is reached.\"\n },\n {\n \"name\": \"overscroll-behavior-inline\",\n \"syntax\": \"contain | none | auto\",\n \"values\": [\n {\n \"name\": \"contain\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"auto\"\n }\n ],\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF73\",\n \"S16\",\n \"C77\",\n \"O64\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-inline\"\n }\n ],\n \"description\": \"The overscroll-behavior-inline CSS property sets the browser's behavior when the inline direction boundary of a scrolling area is reached.\"\n },\n {\n \"name\": \"overscroll-behavior-x\",\n \"syntax\": \"contain | none | auto\",\n \"values\": [\n {\n \"name\": \"contain\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"auto\"\n }\n ],\n \"relevance\": 50,\n \"browsers\": [\n \"E18\",\n \"FF59\",\n \"S16\",\n \"C63\",\n \"O50\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-x\"\n }\n ],\n \"description\": \"The overscroll-behavior-x CSS property is allows you to control the browser's scroll overflow behavior \u2014 what happens when the boundary of a scrolling area is reached \u2014 in the x axis direction.\"\n },\n {\n \"name\": \"overscroll-behavior-y\",\n \"syntax\": \"contain | none | auto\",\n \"values\": [\n {\n \"name\": \"contain\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"auto\"\n }\n ],\n \"relevance\": 50,\n \"browsers\": [\n \"E18\",\n \"FF59\",\n \"S16\",\n \"C63\",\n \"O50\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-y\"\n }\n ],\n \"description\": \"The overscroll-behavior-y CSS property is allows you to control the browser's scroll overflow behavior \u2014 what happens when the boundary of a scrolling area is reached \u2014 in the y axis direction.\"\n },\n {\n \"name\": \"padding-block\",\n \"syntax\": \"<'padding-left'>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding-block\"\n }\n ],\n \"description\": \"The padding-block CSS property defines the logical block start and end padding of an element, which maps to physical padding properties depending on the element's writing mode, directionality, and text orientation.\"\n },\n {\n \"name\": \"padding-inline\",\n \"syntax\": \"<'padding-left'>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding-inline\"\n }\n ],\n \"description\": \"The padding-inline CSS property defines the logical inline start and end padding of an element, which maps to physical padding properties depending on the element's writing mode, directionality, and text orientation.\"\n },\n {\n \"name\": \"place-content\",\n \"syntax\": \"<'align-content'> <'justify-content'>?\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF45\",\n \"S9\",\n \"C59\",\n \"O46\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/place-content\"\n }\n ],\n \"description\": \"The place-content CSS shorthand property sets both the align-content and justify-content properties.\"\n },\n {\n \"name\": \"place-items\",\n \"syntax\": \"<'align-items'> <'justify-items'>?\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF45\",\n \"S11\",\n \"C59\",\n \"O46\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/place-items\"\n }\n ],\n \"description\": \"The CSS place-items shorthand property sets both the align-items and justify-items properties. The first value is the align-items property value, the second the justify-items one. If the second value is not present, the first value is also used for it.\"\n },\n {\n \"name\": \"place-self\",\n \"syntax\": \"<'align-self'> <'justify-self'>?\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF45\",\n \"S11\",\n \"C59\",\n \"O46\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/place-self\"\n }\n ],\n \"description\": \"The place-self CSS property is a shorthand property sets both the align-self and justify-self properties. The first value is the align-self property value, the second the justify-self one. If the second value is not present, the first value is also used for it.\"\n },\n {\n \"name\": \"rotate\",\n \"syntax\": \"none | <angle> | [ x | y | z | <number>{3} ] && <angle>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E104\",\n \"FF72\",\n \"S14.1\",\n \"C104\",\n \"O90\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/rotate\"\n }\n ],\n \"description\": \"The rotate CSS property allows you to specify rotation transforms individually and independently of the transform property. This maps better to typical user interface usage, and saves having to remember the exact order of transform functions to specify in the transform value.\"\n },\n {\n \"name\": \"row-gap\",\n \"syntax\": \"normal | <length-percentage>\",\n \"relevance\": 52,\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C47\",\n \"O34\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/row-gap\"\n }\n ],\n \"description\": \"The row-gap CSS property specifies the gutter between grid rows.\"\n },\n {\n \"name\": \"ruby-merge\",\n \"status\": \"experimental\",\n \"syntax\": \"separate | collapse | auto\",\n \"values\": [\n {\n \"name\": \"separate\"\n },\n {\n \"name\": \"collapse\"\n },\n {\n \"name\": \"auto\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"This property controls how ruby annotation boxes should be rendered when there are more than one in a ruby container box: whether each pair should be kept separate, the annotations should be collapsed and rendered as a group, or the separation should be determined based on the space available.\"\n },\n {\n \"name\": \"scale\",\n \"syntax\": \"none | <number>{1,3}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E104\",\n \"FF72\",\n \"S14.1\",\n \"C104\",\n \"O90\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scale\"\n }\n ],\n \"description\": \"The scale CSS property allows you to specify scale transforms individually and independently of the transform property. This maps better to typical user interface usage, and saves having to remember the exact order of transform functions to specify in the transform value.\"\n },\n {\n \"name\": \"scrollbar-color\",\n \"syntax\": \"auto | <color>{2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"FF64\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scrollbar-color\"\n }\n ],\n \"description\": \"The scrollbar-color CSS property sets the color of the scrollbar track and thumb.\"\n },\n {\n \"name\": \"scrollbar-gutter\",\n \"syntax\": \"auto | stable && both-edges?\",\n \"relevance\": 50,\n \"browsers\": [\n \"E94\",\n \"FF97\",\n \"C94\",\n \"O80\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scrollbar-gutter\"\n }\n ],\n \"description\": \"The scrollbar-gutter CSS property allows authors to reserve space for the scrollbar, preventing unwanted layout changes as the content grows while also avoiding unnecessary visuals when scrolling isn't needed.\"\n },\n {\n \"name\": \"scrollbar-width\",\n \"syntax\": \"auto | thin | none\",\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"thin\"\n },\n {\n \"name\": \"none\"\n }\n ],\n \"relevance\": 50,\n \"browsers\": [\n \"FF64\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scrollbar-width\"\n }\n ],\n \"description\": \"The scrollbar-width property allows the author to set the maximum thickness of an element\u2019s scrollbars when they are shown. \"\n },\n {\n \"name\": \"scroll-margin\",\n \"syntax\": \"<length>{1,4}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF90\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin\"\n }\n ],\n \"description\": \"The scroll-margin property is a shorthand property which sets all of the scroll-margin longhands, assigning values much like the margin property does for the margin-* longhands.\"\n },\n {\n \"name\": \"scroll-margin-block\",\n \"syntax\": \"<length>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block\"\n }\n ],\n \"description\": \"The scroll-margin-block property is a shorthand property which sets the scroll-margin longhands in the block dimension.\"\n },\n {\n \"name\": \"scroll-margin-block-start\",\n \"syntax\": \"<length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block-start\"\n }\n ],\n \"description\": \"The scroll-margin-block-start property defines the margin of the scroll snap area at the start of the block dimension that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets.\"\n },\n {\n \"name\": \"scroll-margin-block-end\",\n \"syntax\": \"<length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block-end\"\n }\n ],\n \"description\": \"The scroll-margin-block-end property defines the margin of the scroll snap area at the end of the block dimension that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets.\"\n },\n {\n \"name\": \"scroll-margin-bottom\",\n \"syntax\": \"<length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-bottom\"\n }\n ],\n \"description\": \"The scroll-margin-bottom property defines the bottom margin of the scroll snap area that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets.\"\n },\n {\n \"name\": \"scroll-margin-inline\",\n \"syntax\": \"<length>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline\"\n }\n ],\n \"description\": \"The scroll-margin-inline property is a shorthand property which sets the scroll-margin longhands in the inline dimension.\"\n },\n {\n \"name\": \"scroll-margin-inline-start\",\n \"syntax\": \"<length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline-start\"\n }\n ],\n \"description\": \"The scroll-margin-inline-start property defines the margin of the scroll snap area at the start of the inline dimension that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets.\"\n },\n {\n \"name\": \"scroll-margin-inline-end\",\n \"syntax\": \"<length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline-end\"\n }\n ],\n \"description\": \"The scroll-margin-inline-end property defines the margin of the scroll snap area at the end of the inline dimension that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets.\"\n },\n {\n \"name\": \"scroll-margin-left\",\n \"syntax\": \"<length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-left\"\n }\n ],\n \"description\": \"The scroll-margin-left property defines the left margin of the scroll snap area that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets.\"\n },\n {\n \"name\": \"scroll-margin-right\",\n \"syntax\": \"<length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-right\"\n }\n ],\n \"description\": \"The scroll-margin-right property defines the right margin of the scroll snap area that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets.\"\n },\n {\n \"name\": \"scroll-margin-top\",\n \"syntax\": \"<length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-top\"\n }\n ],\n \"description\": \"The scroll-margin-top property defines the top margin of the scroll snap area that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets.\"\n },\n {\n \"name\": \"scroll-padding\",\n \"syntax\": \"[ auto | <length-percentage> ]{1,4}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding\"\n }\n ],\n \"description\": \"The scroll-padding property is a shorthand property which sets all of the scroll-padding longhands, assigning values much like the padding property does for the padding-* longhands.\"\n },\n {\n \"name\": \"scroll-padding-block\",\n \"syntax\": \"[ auto | <length-percentage> ]{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S15\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block\"\n }\n ],\n \"description\": \"The scroll-padding-block property is a shorthand property which sets the scroll-padding longhands for the block dimension.\"\n },\n {\n \"name\": \"scroll-padding-block-start\",\n \"syntax\": \"auto | <length-percentage>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S15\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block-start\"\n }\n ],\n \"description\": \"The scroll-padding-block-start property defines offsets for the start edge in the block dimension of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport.\"\n },\n {\n \"name\": \"scroll-padding-block-end\",\n \"syntax\": \"auto | <length-percentage>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S15\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block-end\"\n }\n ],\n \"description\": \"The scroll-padding-block-end property defines offsets for the end edge in the block dimension of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport.\"\n },\n {\n \"name\": \"scroll-padding-bottom\",\n \"syntax\": \"auto | <length-percentage>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-bottom\"\n }\n ],\n \"description\": \"The scroll-padding-bottom property defines offsets for the bottom of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport.\"\n },\n {\n \"name\": \"scroll-padding-inline\",\n \"syntax\": \"[ auto | <length-percentage> ]{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S15\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline\"\n }\n ],\n \"description\": \"The scroll-padding-inline property is a shorthand property which sets the scroll-padding longhands for the inline dimension.\"\n },\n {\n \"name\": \"scroll-padding-inline-start\",\n \"syntax\": \"auto | <length-percentage>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S15\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline-start\"\n }\n ],\n \"description\": \"The scroll-padding-inline-start property defines offsets for the start edge in the inline dimension of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport.\"\n },\n {\n \"name\": \"scroll-padding-inline-end\",\n \"syntax\": \"auto | <length-percentage>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S15\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline-end\"\n }\n ],\n \"description\": \"The scroll-padding-inline-end property defines offsets for the end edge in the inline dimension of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport.\"\n },\n {\n \"name\": \"scroll-padding-left\",\n \"syntax\": \"auto | <length-percentage>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-left\"\n }\n ],\n \"description\": \"The scroll-padding-left property defines offsets for the left of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport.\"\n },\n {\n \"name\": \"scroll-padding-right\",\n \"syntax\": \"auto | <length-percentage>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-right\"\n }\n ],\n \"description\": \"The scroll-padding-right property defines offsets for the right of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport.\"\n },\n {\n \"name\": \"scroll-padding-top\",\n \"syntax\": \"auto | <length-percentage>\",\n \"relevance\": 51,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-top\"\n }\n ],\n \"description\": \"The scroll-padding-top property defines offsets for the top of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport.\"\n },\n {\n \"name\": \"scroll-snap-align\",\n \"syntax\": \"[ none | start | end | center ]{1,2}\",\n \"relevance\": 53,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S11\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-align\"\n }\n ],\n \"description\": \"The scroll-snap-align property specifies the box\u2019s snap position as an alignment of its snap area (as the alignment subject) within its snap container\u2019s snapport (as the alignment container). The two values specify the snapping alignment in the block axis and inline axis, respectively. If only one value is specified, the second value defaults to the same value.\"\n },\n {\n \"name\": \"scroll-snap-stop\",\n \"syntax\": \"normal | always\",\n \"values\": [\n {\n \"name\": \"normal\"\n },\n {\n \"name\": \"always\"\n }\n ],\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF103\",\n \"S15\",\n \"C75\",\n \"O62\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-stop\"\n }\n ],\n \"description\": \"The scroll-snap-stop CSS property defines whether the scroll container is allowed to \\\"pass over\\\" possible snap positions.\"\n },\n {\n \"name\": \"scroll-snap-type-x\",\n \"status\": \"obsolete\",\n \"syntax\": \"none | mandatory | proximity\",\n \"values\": [\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"mandatory\"\n },\n {\n \"name\": \"proximity\"\n }\n ],\n \"relevance\": 0,\n \"browsers\": [\n \"FF39\",\n \"S9\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type-x\"\n }\n ],\n \"description\": \"The scroll-snap-type-x CSS property defines how strictly snap points are enforced on the horizontal axis of the scroll container in case there is one.\\n\\nSpecifying any precise animations or physics used to enforce those snap points is not covered by this property but instead left up to the user agent.\"\n },\n {\n \"name\": \"scroll-snap-type-y\",\n \"status\": \"obsolete\",\n \"syntax\": \"none | mandatory | proximity\",\n \"values\": [\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"mandatory\"\n },\n {\n \"name\": \"proximity\"\n }\n ],\n \"relevance\": 0,\n \"browsers\": [\n \"FF39\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type-y\"\n }\n ],\n \"description\": \"The scroll-snap-type-y CSS property defines how strictly snap points are enforced on the vertical axis of the scroll container in case there is one.\\n\\nSpecifying any precise animations or physics used to enforce those snap points is not covered by this property but instead left up to the user agent.\"\n },\n {\n \"name\": \"scroll-timeline\",\n \"status\": \"experimental\",\n \"syntax\": \"<scroll-timeline-name> || <scroll-timeline-axis>\",\n \"relevance\": 50,\n \"browsers\": [\n \"FF103\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-timeline\"\n }\n ],\n \"description\": \"Defines a name that can be used to identify the source element of a scroll timeline, along with the scrollbar axis that should provide the timeline.\"\n },\n {\n \"name\": \"scroll-timeline-axis\",\n \"status\": \"experimental\",\n \"syntax\": \"block | inline | vertical | horizontal\",\n \"values\": [\n {\n \"name\": \"block\"\n },\n {\n \"name\": \"inline\"\n },\n {\n \"name\": \"vertical\"\n },\n {\n \"name\": \"horizontal\"\n }\n ],\n \"relevance\": 50,\n \"browsers\": [\n \"FF103\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-timeline-axis\"\n }\n ],\n \"description\": \"Specifies the scrollbar that will be used to provide the timeline for a scroll-timeline animation\"\n },\n {\n \"name\": \"scroll-timeline-name\",\n \"status\": \"experimental\",\n \"syntax\": \"none | <custom-ident>\",\n \"relevance\": 50,\n \"browsers\": [\n \"FF103\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-timeline-name\"\n }\n ],\n \"description\": \"Defines a name that can be used to identify an element as the source of a scroll-timeline.\"\n },\n {\n \"name\": \"text-combine-upright\",\n \"syntax\": \"none | all | [ digits <integer>? ]\",\n \"relevance\": 50,\n \"browsers\": [\n \"E15\",\n \"FF48\",\n \"S5.1\",\n \"C48\",\n \"IE11\",\n \"O35\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-combine-upright\"\n }\n ],\n \"description\": \"The text-combine-upright CSS property specifies the combination of multiple characters into the space of a single character. If the combined text is wider than 1em, the user agent must fit the contents within 1em. The resulting composition is treated as a single upright glyph for layout and decoration. This property only has an effect in vertical writing modes.\\n\\nThis is used to produce an effect that is known as tate-ch\u016B-yoko (\u7E26\u4E2D\u6A2A) in Japanese, or as \u76F4\u66F8\u6A6B\u5411 in Chinese.\"\n },\n {\n \"name\": \"text-decoration-skip\",\n \"status\": \"experimental\",\n \"syntax\": \"none | [ objects || [ spaces | [ leading-spaces || trailing-spaces ] ] || edges || box-decoration ]\",\n \"relevance\": 52,\n \"browsers\": [\n \"S12.1\",\n \"C57\",\n \"O44\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-decoration-skip\"\n }\n ],\n \"description\": \"The text-decoration-skip CSS property specifies what parts of the element\u2019s content any text decoration affecting the element must skip over. It controls all text decoration lines drawn by the element and also any text decoration lines drawn by its ancestors.\"\n },\n {\n \"name\": \"text-decoration-skip-ink\",\n \"syntax\": \"auto | all | none\",\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"all\"\n },\n {\n \"name\": \"none\"\n }\n ],\n \"relevance\": 51,\n \"browsers\": [\n \"E79\",\n \"FF70\",\n \"S15.4\",\n \"C64\",\n \"O50\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-decoration-skip-ink\"\n }\n ],\n \"description\": \"The text-decoration-skip-ink CSS property specifies how overlines and underlines are drawn when they pass over glyph ascenders and descenders.\"\n },\n {\n \"name\": \"text-decoration-thickness\",\n \"syntax\": \"auto | from-font | <length> | <percentage> \",\n \"relevance\": 50,\n \"browsers\": [\n \"E89\",\n \"FF70\",\n \"S12.1\",\n \"C89\",\n \"O75\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-decoration-thickness\"\n }\n ],\n \"description\": \"The text-decoration-thickness CSS property sets the thickness, or width, of the decoration line that is used on text in an element, such as a line-through, underline, or overline.\"\n },\n {\n \"name\": \"text-emphasis\",\n \"syntax\": \"<'text-emphasis-style'> || <'text-emphasis-color'>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E99\",\n \"FF46\",\n \"S7\",\n \"C99\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-emphasis\"\n }\n ],\n \"description\": \"The text-emphasis CSS property is a shorthand property for setting text-emphasis-style and text-emphasis-color in one declaration. This property will apply the specified emphasis mark to each character of the element's text, except separator characters, like spaces, and control characters.\"\n },\n {\n \"name\": \"text-emphasis-color\",\n \"syntax\": \"<color>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E99\",\n \"FF46\",\n \"S7\",\n \"C99\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-emphasis-color\"\n }\n ],\n \"description\": \"The text-emphasis-color CSS property defines the color used to draw emphasis marks on text being rendered in the HTML document. This value can also be set and reset using the text-emphasis shorthand.\"\n },\n {\n \"name\": \"text-emphasis-position\",\n \"syntax\": \"[ over | under ] && [ right | left ]\",\n \"relevance\": 50,\n \"browsers\": [\n \"E99\",\n \"FF46\",\n \"S7\",\n \"C99\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-emphasis-position\"\n }\n ],\n \"description\": \"The text-emphasis-position CSS property describes where emphasis marks are drawn at. The effect of emphasis marks on the line height is the same as for ruby text: if there isn't enough place, the line height is increased.\"\n },\n {\n \"name\": \"text-emphasis-style\",\n \"syntax\": \"none | [ [ filled | open ] || [ dot | circle | double-circle | triangle | sesame ] ] | <string>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E99\",\n \"FF46\",\n \"S7\",\n \"C99\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-emphasis-style\"\n }\n ],\n \"description\": \"The text-emphasis-style CSS property defines the type of emphasis used. It can also be set, and reset, using the text-emphasis shorthand.\"\n },\n {\n \"name\": \"text-size-adjust\",\n \"status\": \"experimental\",\n \"syntax\": \"none | auto | <percentage>\",\n \"relevance\": 60,\n \"browsers\": [\n \"E79\",\n \"C54\",\n \"O41\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-size-adjust\"\n }\n ],\n \"description\": \"The text-size-adjust CSS property controls the text inflation algorithm used on some smartphones and tablets. Other browsers will ignore this property.\"\n },\n {\n \"name\": \"text-underline-offset\",\n \"syntax\": \"auto | <length> | <percentage> \",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF70\",\n \"S12.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-underline-offset\"\n }\n ],\n \"description\": \"The text-underline-offset CSS property sets the offset distance of an underline text decoration line (applied using text-decoration) from its original position.\"\n },\n {\n \"name\": \"transform-box\",\n \"syntax\": \"content-box | border-box | fill-box | stroke-box | view-box\",\n \"values\": [\n {\n \"name\": \"content-box\"\n },\n {\n \"name\": \"border-box\"\n },\n {\n \"name\": \"fill-box\"\n },\n {\n \"name\": \"stroke-box\"\n },\n {\n \"name\": \"view-box\"\n }\n ],\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF55\",\n \"S11\",\n \"C64\",\n \"O51\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/transform-box\"\n }\n ],\n \"description\": \"The transform-box CSS property defines the layout box to which the transform and transform-origin properties relate.\"\n },\n {\n \"name\": \"translate\",\n \"syntax\": \"none | <length-percentage> [ <length-percentage> <length>? ]?\",\n \"relevance\": 50,\n \"browsers\": [\n \"E104\",\n \"FF72\",\n \"S14.1\",\n \"C104\",\n \"O90\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/translate\"\n }\n ],\n \"description\": \"The translate CSS property allows you to specify translation transforms individually and independently of the transform property. This maps better to typical user interface usage, and saves having to remember the exact order of transform functions to specify in the transform value.\"\n },\n {\n \"name\": \"white-space\",\n \"syntax\": \"normal | pre | nowrap | pre-wrap | pre-line | break-spaces\",\n \"values\": [\n {\n \"name\": \"normal\"\n },\n {\n \"name\": \"pre\"\n },\n {\n \"name\": \"nowrap\"\n },\n {\n \"name\": \"pre-wrap\"\n },\n {\n \"name\": \"pre-line\"\n },\n {\n \"name\": \"break-spaces\"\n }\n ],\n \"relevance\": 90,\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE5.5\",\n \"O4\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/white-space\"\n }\n ],\n \"description\": \"Specifies how whitespace is handled in an element.\"\n },\n {\n \"name\": \"speak-as\",\n \"syntax\": \"auto | bullets | numbers | words | spell-out | <counter-style-name>\",\n \"relevance\": 50,\n \"description\": \"The speak-as descriptor specifies how a counter symbol constructed with a given @counter-style will be represented in the spoken form. For example, an author can specify a counter symbol to be either spoken as its numerical value or just represented with an audio cue.\"\n },\n {\n \"name\": \"ascent-override\",\n \"status\": \"experimental\",\n \"syntax\": \"normal | <percentage>\",\n \"relevance\": 50,\n \"description\": \"Describes the ascent metric of a font.\"\n },\n {\n \"name\": \"descent-override\",\n \"status\": \"experimental\",\n \"syntax\": \"normal | <percentage>\",\n \"relevance\": 50,\n \"description\": \"Describes the descent metric of a font.\"\n },\n {\n \"name\": \"font-display\",\n \"status\": \"experimental\",\n \"syntax\": \"[ auto | block | swap | fallback | optional ]\",\n \"relevance\": 72,\n \"description\": \"The font-display descriptor determines how a font face is displayed based on whether and when it is downloaded and ready to use.\"\n },\n {\n \"name\": \"line-gap-override\",\n \"status\": \"experimental\",\n \"syntax\": \"normal | <percentage>\",\n \"relevance\": 50,\n \"description\": \"Describes the line-gap metric of a font.\"\n },\n {\n \"name\": \"size-adjust\",\n \"status\": \"experimental\",\n \"syntax\": \"<percentage>\",\n \"relevance\": 50,\n \"description\": \"A multiplier for glyph outlines and metrics of a font.\"\n },\n {\n \"name\": \"bleed\",\n \"syntax\": \"auto | <length>\",\n \"relevance\": 50,\n \"description\": \"The bleed CSS at-rule descriptor, used with the @page at-rule, specifies the extent of the page bleed area outside the page box. This property only has effect if crop marks are enabled using the marks property.\"\n },\n {\n \"name\": \"marks\",\n \"syntax\": \"none | [ crop || cross ]\",\n \"relevance\": 50,\n \"description\": \"The marks CSS at-rule descriptor, used with the @page at-rule, adds crop and/or cross marks to the presentation of the document. Crop marks indicate where the page should be cut. Cross marks are used to align sheets.\"\n },\n {\n \"name\": \"syntax\",\n \"status\": \"experimental\",\n \"syntax\": \"<string>\",\n \"relevance\": 50,\n \"description\": \"Specifies the syntax of the custom property registration represented by the @property rule, controlling how the property\u2019s value is parsed at computed value time.\"\n },\n {\n \"name\": \"inherits\",\n \"status\": \"experimental\",\n \"syntax\": \"true | false\",\n \"values\": [\n {\n \"name\": \"true\"\n },\n {\n \"name\": \"false\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the inherit flag of the custom property registration represented by the @property rule, controlling whether or not the property inherits by default.\"\n },\n {\n \"name\": \"initial-value\",\n \"status\": \"experimental\",\n \"syntax\": \"<string>\",\n \"relevance\": 50,\n \"description\": \"Specifies the initial value of the custom property registration represented by the @property rule, controlling the property\u2019s initial value.\"\n },\n {\n \"name\": \"max-zoom\",\n \"syntax\": \"auto | <number> | <percentage>\",\n \"relevance\": 50,\n \"description\": \"The max-zoom CSS descriptor sets the maximum zoom factor of a document defined by the @viewport at-rule. The browser will not zoom in any further than this, whether automatically or at the user's request.\\n\\nA zoom factor of 1.0 or 100% corresponds to no zooming. Larger values are zoomed in. Smaller values are zoomed out.\"\n },\n {\n \"name\": \"min-zoom\",\n \"syntax\": \"auto | <number> | <percentage>\",\n \"relevance\": 50,\n \"description\": \"The min-zoom CSS descriptor sets the minimum zoom factor of a document defined by the @viewport at-rule. The browser will not zoom out any further than this, whether automatically or at the user's request.\\n\\nA zoom factor of 1.0 or 100% corresponds to no zooming. Larger values are zoomed in. Smaller values are zoomed out.\"\n },\n {\n \"name\": \"orientation\",\n \"syntax\": \"auto | portrait | landscape\",\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"portrait\"\n },\n {\n \"name\": \"landscape\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"The orientation CSS @media media feature can be used to apply styles based on the orientation of the viewport (or the page box, for paged media).\"\n },\n {\n \"name\": \"user-zoom\",\n \"syntax\": \"zoom | fixed\",\n \"values\": [\n {\n \"name\": \"zoom\"\n },\n {\n \"name\": \"fixed\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"The user-zoom CSS descriptor controls whether or not the user can change the zoom factor of a document defined by @viewport.\"\n },\n {\n \"name\": \"viewport-fit\",\n \"syntax\": \"auto | contain | cover\",\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"contain\"\n },\n {\n \"name\": \"cover\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"The border-block-style CSS property defines the style of the logical block borders of an element, which maps to a physical border style depending on the element's writing mode, directionality, and text orientation.\"\n }\n ],\n \"atDirectives\": [\n {\n \"name\": \"@charset\",\n \"browsers\": [\n \"E12\",\n \"FF1.5\",\n \"S4\",\n \"C2\",\n \"IE5.5\",\n \"O9\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@charset\"\n }\n ],\n \"description\": \"Defines character set of the document.\"\n },\n {\n \"name\": \"@counter-style\",\n \"browsers\": [\n \"E91\",\n \"FF33\",\n \"C91\",\n \"O77\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@counter-style\"\n }\n ],\n \"description\": \"Defines a custom counter style.\"\n },\n {\n \"name\": \"@font-face\",\n \"browsers\": [\n \"E12\",\n \"FF3.5\",\n \"S3.1\",\n \"C1\",\n \"IE4\",\n \"O10\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@font-face\"\n }\n ],\n \"description\": \"Allows for linking to fonts that are automatically activated when needed. This permits authors to work around the limitation of 'web-safe' fonts, allowing for consistent rendering independent of the fonts available in a given user's environment.\"\n },\n {\n \"name\": \"@font-feature-values\",\n \"browsers\": [\n \"FF34\",\n \"S9.1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@font-feature-values\"\n }\n ],\n \"description\": \"Defines named values for the indices used to select alternate glyphs for a given font family.\"\n },\n {\n \"name\": \"@import\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE5.5\",\n \"O3.5\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@import\"\n }\n ],\n \"description\": \"Includes content of another file.\"\n },\n {\n \"name\": \"@keyframes\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C43\",\n \"IE10\",\n \"O30\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@keyframes\"\n }\n ],\n \"description\": \"Defines set of animation key frames.\"\n },\n {\n \"name\": \"@layer\",\n \"browsers\": [\n \"E99\",\n \"FF97\",\n \"S15.4\",\n \"C99\",\n \"O85\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@layer\"\n }\n ],\n \"description\": \"Declare a cascade layer and the order of precedence in case of multiple cascade layers.\"\n },\n {\n \"name\": \"@media\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S3\",\n \"C1\",\n \"IE6\",\n \"O9.2\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@media\"\n }\n ],\n \"description\": \"Defines a stylesheet for a particular media type.\"\n },\n {\n \"name\": \"@-moz-document\",\n \"browsers\": [\n \"FF1.8\"\n ],\n \"description\": \"Gecko-specific at-rule that restricts the style rules contained within it based on the URL of the document.\"\n },\n {\n \"name\": \"@-moz-keyframes\",\n \"browsers\": [\n \"FF5\"\n ],\n \"description\": \"Defines set of animation key frames.\"\n },\n {\n \"name\": \"@-ms-viewport\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Specifies the size, zoom factor, and orientation of the viewport.\"\n },\n {\n \"name\": \"@namespace\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE9\",\n \"O8\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@namespace\"\n }\n ],\n \"description\": \"Declares a prefix and associates it with a namespace name.\"\n },\n {\n \"name\": \"@-o-keyframes\",\n \"browsers\": [\n \"O12\"\n ],\n \"description\": \"Defines set of animation key frames.\"\n },\n {\n \"name\": \"@-o-viewport\",\n \"browsers\": [\n \"O11\"\n ],\n \"description\": \"Specifies the size, zoom factor, and orientation of the viewport.\"\n },\n {\n \"name\": \"@page\",\n \"browsers\": [\n \"E12\",\n \"FF19\",\n \"C2\",\n \"IE8\",\n \"O6\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@page\"\n }\n ],\n \"description\": \"Directive defines various page parameters.\"\n },\n {\n \"name\": \"@property\",\n \"browsers\": [\n \"E85\",\n \"C85\",\n \"O71\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@property\"\n }\n ],\n \"description\": \"Describes the aspect of custom properties and variables.\"\n },\n {\n \"name\": \"@supports\",\n \"browsers\": [\n \"E12\",\n \"FF22\",\n \"S9\",\n \"C28\",\n \"O12.1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@supports\"\n }\n ],\n \"description\": \"A conditional group rule whose condition tests whether the user agent supports CSS property:value pairs.\"\n },\n {\n \"name\": \"@-webkit-keyframes\",\n \"browsers\": [\n \"C\",\n \"S4\"\n ],\n \"description\": \"Defines set of animation key frames.\"\n }\n ],\n \"pseudoClasses\": [\n {\n \"name\": \":active\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O5\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:active\"\n }\n ],\n \"description\": \"Applies while an element is being activated by the user. For example, between the times the user presses the mouse button and releases it.\"\n },\n {\n \"name\": \":any-link\",\n \"browsers\": [\n \"E79\",\n \"FF50\",\n \"S9\",\n \"C65\",\n \"O52\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:any-link\"\n }\n ],\n \"description\": \"Represents an element that acts as the source anchor of a hyperlink. Applies to both visited and unvisited links.\"\n },\n {\n \"name\": \":checked\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S3.1\",\n \"C1\",\n \"IE9\",\n \"O9\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:checked\"\n }\n ],\n \"description\": \"Radio and checkbox elements can be toggled by the user. Some menu items are 'checked' when the user selects them. When such elements are toggled 'on' the :checked pseudo-class applies.\"\n },\n {\n \"name\": \":corner-present\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Non-standard. Indicates whether or not a scrollbar corner is present.\"\n },\n {\n \"name\": \":decrement\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Non-standard. Applies to buttons and track pieces. Indicates whether or not the button or track piece will decrement the view's position when used.\"\n },\n {\n \"name\": \":default\",\n \"browsers\": [\n \"E79\",\n \"FF4\",\n \"S5\",\n \"C10\",\n \"O10\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:default\"\n }\n ],\n \"description\": \"Applies to the one or more UI elements that are the default among a set of similar elements. Typically applies to context menu items, buttons, and select lists/menus.\"\n },\n {\n \"name\": \":disabled\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S3.1\",\n \"C1\",\n \"IE9\",\n \"O9\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:disabled\"\n }\n ],\n \"description\": \"Represents user interface elements that are in a disabled state; such elements have a corresponding enabled state.\"\n },\n {\n \"name\": \":double-button\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Non-standard. Applies to buttons and track pieces. Applies when both buttons are displayed together at the same end of the scrollbar.\"\n },\n {\n \"name\": \":empty\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S3.1\",\n \"C1\",\n \"IE9\",\n \"O9.5\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:empty\"\n }\n ],\n \"description\": \"Represents an element that has no children at all.\"\n },\n {\n \"name\": \":enabled\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S3.1\",\n \"C1\",\n \"IE9\",\n \"O9\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:enabled\"\n }\n ],\n \"description\": \"Represents user interface elements that are in an enabled state; such elements have a corresponding disabled state.\"\n },\n {\n \"name\": \":end\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Non-standard. Applies to buttons and track pieces. Indicates whether the object is placed after the thumb.\"\n },\n {\n \"name\": \":first\",\n \"browsers\": [\n \"E12\",\n \"S6\",\n \"C18\",\n \"IE8\",\n \"O9.2\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:first\"\n }\n ],\n \"description\": \"When printing double-sided documents, the page boxes on left and right pages may be different. This can be expressed through CSS pseudo-classes defined in the page context.\"\n },\n {\n \"name\": \":first-child\",\n \"browsers\": [\n \"E12\",\n \"FF3\",\n \"S3.1\",\n \"C4\",\n \"IE7\",\n \"O9.5\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:first-child\"\n }\n ],\n \"description\": \"Same as :nth-child(1). Represents an element that is the first child of some other element.\"\n },\n {\n \"name\": \":first-of-type\",\n \"browsers\": [\n \"E12\",\n \"FF3.5\",\n \"S3.1\",\n \"C1\",\n \"IE9\",\n \"O9.5\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:first-of-type\"\n }\n ],\n \"description\": \"Same as :nth-of-type(1). Represents an element that is the first sibling of its type in the list of children of its parent element.\"\n },\n {\n \"name\": \":focus\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE8\",\n \"O7\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:focus\"\n }\n ],\n \"description\": \"Applies while an element has the focus (accepts keyboard or mouse events, or other forms of input).\"\n },\n {\n \"name\": \":fullscreen\",\n \"browsers\": [\n \"E12\",\n \"FF64\",\n \"S6\",\n \"C71\",\n \"IE11\",\n \"O58\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:fullscreen\"\n }\n ],\n \"description\": \"Matches any element that has its fullscreen flag set.\"\n },\n {\n \"name\": \":future\",\n \"browsers\": [\n \"S7\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:future\"\n }\n ],\n \"description\": \"Represents any element that is defined to occur entirely after a :current element.\"\n },\n {\n \"name\": \":horizontal\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Non-standard. Applies to any scrollbar pieces that have a horizontal orientation.\"\n },\n {\n \"name\": \":host\",\n \"browsers\": [\n \"E79\",\n \"FF63\",\n \"S10\",\n \"C54\",\n \"O41\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:host\"\n }\n ],\n \"description\": \"When evaluated in the context of a shadow tree, matches the shadow tree's host element.\"\n },\n {\n \"name\": \":host()\",\n \"browsers\": [\n \"C35\",\n \"O22\"\n ],\n \"description\": \"When evaluated in the context of a shadow tree, it matches the shadow tree's host element if the host element, in its normal context, matches the selector argument.\"\n },\n {\n \"name\": \":host-context()\",\n \"browsers\": [\n \"C35\",\n \"O22\"\n ],\n \"description\": \"Tests whether there is an ancestor, outside the shadow tree, which matches a particular selector.\"\n },\n {\n \"name\": \":hover\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S2\",\n \"C1\",\n \"IE4\",\n \"O4\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:hover\"\n }\n ],\n \"description\": \"Applies while the user designates an element with a pointing device, but does not necessarily activate it. For example, a visual user agent could apply this pseudo-class when the cursor (mouse pointer) hovers over a box generated by the element.\"\n },\n {\n \"name\": \":increment\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Non-standard. Applies to buttons and track pieces. Indicates whether or not the button or track piece will increment the view's position when used.\"\n },\n {\n \"name\": \":indeterminate\",\n \"browsers\": [\n \"E12\",\n \"FF2\",\n \"S3\",\n \"C1\",\n \"IE10\",\n \"O9\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:indeterminate\"\n }\n ],\n \"description\": \"Applies to UI elements whose value is in an indeterminate state.\"\n },\n {\n \"name\": \":in-range\",\n \"browsers\": [\n \"E13\",\n \"FF29\",\n \"S5.1\",\n \"C10\",\n \"O11\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:in-range\"\n }\n ],\n \"description\": \"Used in conjunction with the min and max attributes, whether on a range input, a number field, or any other types that accept those attributes.\"\n },\n {\n \"name\": \":invalid\",\n \"browsers\": [\n \"E12\",\n \"FF4\",\n \"S5\",\n \"C10\",\n \"IE10\",\n \"O10\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:invalid\"\n }\n ],\n \"description\": \"An element is :valid or :invalid when it is, respectively, valid or invalid with respect to data validity semantics defined by a different specification.\"\n },\n {\n \"name\": \":lang()\",\n \"browsers\": [\n \"E\",\n \"C\",\n \"FF1\",\n \"IE8\",\n \"O8\",\n \"S3\"\n ],\n \"description\": \"Represents an element that is in language specified.\"\n },\n {\n \"name\": \":last-child\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S3.1\",\n \"C1\",\n \"IE9\",\n \"O9.5\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:last-child\"\n }\n ],\n \"description\": \"Same as :nth-last-child(1). Represents an element that is the last child of some other element.\"\n },\n {\n \"name\": \":last-of-type\",\n \"browsers\": [\n \"E12\",\n \"FF3.5\",\n \"S3.1\",\n \"C1\",\n \"IE9\",\n \"O9.5\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:last-of-type\"\n }\n ],\n \"description\": \"Same as :nth-last-of-type(1). Represents an element that is the last sibling of its type in the list of children of its parent element.\"\n },\n {\n \"name\": \":left\",\n \"browsers\": [\n \"E12\",\n \"S5\",\n \"C6\",\n \"IE8\",\n \"O9.2\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:left\"\n }\n ],\n \"description\": \"When printing double-sided documents, the page boxes on left and right pages may be different. This can be expressed through CSS pseudo-classes defined in the page context.\"\n },\n {\n \"name\": \":link\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE3\",\n \"O3.5\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:link\"\n }\n ],\n \"description\": \"Applies to links that have not yet been visited.\"\n },\n {\n \"name\": \":matches()\",\n \"browsers\": [\n \"S9\"\n ],\n \"description\": \"Takes a selector list as its argument. It represents an element that is represented by its argument.\"\n },\n {\n \"name\": \":-moz-any()\",\n \"browsers\": [\n \"FF4\"\n ],\n \"description\": \"Represents an element that is represented by the selector list passed as its argument. Standardized as :matches().\"\n },\n {\n \"name\": \":-moz-any-link\",\n \"browsers\": [\n \"FF1\"\n ],\n \"description\": \"Represents an element that acts as the source anchor of a hyperlink. Applies to both visited and unvisited links.\"\n },\n {\n \"name\": \":-moz-broken\",\n \"browsers\": [\n \"FF3\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:-moz-broken\"\n }\n ],\n \"description\": \"Non-standard. Matches elements representing broken images.\"\n },\n {\n \"name\": \":-moz-drag-over\",\n \"browsers\": [\n \"FF1\"\n ],\n \"description\": \"Non-standard. Matches elements when a drag-over event applies to it.\"\n },\n {\n \"name\": \":-moz-first-node\",\n \"browsers\": [\n \"FF1\"\n ],\n \"description\": \"Non-standard. Represents an element that is the first child node of some other element.\"\n },\n {\n \"name\": \":-moz-focusring\",\n \"browsers\": [\n \"FF4\"\n ],\n \"description\": \"Non-standard. Matches an element that has focus and focus ring drawing is enabled in the browser.\"\n },\n {\n \"name\": \":-moz-full-screen\",\n \"browsers\": [\n \"FF9\"\n ],\n \"description\": \"Matches any element that has its fullscreen flag set. Standardized as :fullscreen.\"\n },\n {\n \"name\": \":-moz-last-node\",\n \"browsers\": [\n \"FF1\"\n ],\n \"description\": \"Non-standard. Represents an element that is the last child node of some other element.\"\n },\n {\n \"name\": \":-moz-loading\",\n \"browsers\": [\n \"FF3\"\n ],\n \"description\": \"Non-standard. Matches elements, such as images, that haven't started loading yet.\"\n },\n {\n \"name\": \":-moz-only-whitespace\",\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:-moz-only-whitespace\"\n }\n ],\n \"description\": \"The same as :empty, except that it additionally matches elements that only contain code points affected by whitespace processing. Standardized as :blank.\"\n },\n {\n \"name\": \":-moz-placeholder\",\n \"browsers\": [\n \"FF4\"\n ],\n \"description\": \"Deprecated. Represents placeholder text in an input field. Use ::-moz-placeholder for Firefox 19+.\"\n },\n {\n \"name\": \":-moz-submit-invalid\",\n \"browsers\": [\n \"FF88\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:-moz-submit-invalid\"\n }\n ],\n \"description\": \"Non-standard. Represents any submit button when the contents of the associated form are not valid.\"\n },\n {\n \"name\": \":-moz-suppressed\",\n \"browsers\": [\n \"FF3\"\n ],\n \"description\": \"Non-standard. Matches elements representing images that have been blocked from loading.\"\n },\n {\n \"name\": \":-moz-ui-invalid\",\n \"browsers\": [\n \"FF4\"\n ],\n \"description\": \"Non-standard. Represents any validated form element whose value isn't valid \"\n },\n {\n \"name\": \":-moz-ui-valid\",\n \"browsers\": [\n \"FF4\"\n ],\n \"description\": \"Non-standard. Represents any validated form element whose value is valid \"\n },\n {\n \"name\": \":-moz-user-disabled\",\n \"browsers\": [\n \"FF3\"\n ],\n \"description\": \"Non-standard. Matches elements representing images that have been disabled due to the user's preferences.\"\n },\n {\n \"name\": \":-moz-window-inactive\",\n \"browsers\": [\n \"FF4\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:-moz-window-inactive\"\n }\n ],\n \"description\": \"Non-standard. Matches elements in an inactive window.\"\n },\n {\n \"name\": \":-ms-fullscreen\",\n \"browsers\": [\n \"IE11\"\n ],\n \"description\": \"Matches any element that has its fullscreen flag set.\"\n },\n {\n \"name\": \":-ms-input-placeholder\",\n \"browsers\": [\n \"IE10\"\n ],\n \"description\": \"Represents placeholder text in an input field. Note: for Edge use the pseudo-element ::-ms-input-placeholder. Standardized as ::placeholder.\"\n },\n {\n \"name\": \":-ms-keyboard-active\",\n \"browsers\": [\n \"IE10\"\n ],\n \"description\": \"Windows Store apps only. Applies one or more styles to an element when it has focus and the user presses the space bar.\"\n },\n {\n \"name\": \":-ms-lang()\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents an element that is in the language specified. Accepts a comma separated list of language tokens.\"\n },\n {\n \"name\": \":no-button\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Non-standard. Applies to track pieces. Applies when there is no button at that end of the track.\"\n },\n {\n \"name\": \":not()\",\n \"browsers\": [\n \"E\",\n \"C\",\n \"FF1\",\n \"IE9\",\n \"O9.5\",\n \"S2\"\n ],\n \"description\": \"The negation pseudo-class, :not(X), is a functional notation taking a simple selector (excluding the negation pseudo-class itself) as an argument. It represents an element that is not represented by its argument.\"\n },\n {\n \"name\": \":nth-child()\",\n \"browsers\": [\n \"E\",\n \"C\",\n \"FF3.5\",\n \"IE9\",\n \"O9.5\",\n \"S3.1\"\n ],\n \"description\": \"Represents an element that has an+b-1 siblings before it in the document tree, for any positive integer or zero value of n, and has a parent element.\"\n },\n {\n \"name\": \":nth-last-child()\",\n \"browsers\": [\n \"E\",\n \"C\",\n \"FF3.5\",\n \"IE9\",\n \"O9.5\",\n \"S3.1\"\n ],\n \"description\": \"Represents an element that has an+b-1 siblings after it in the document tree, for any positive integer or zero value of n, and has a parent element.\"\n },\n {\n \"name\": \":nth-last-of-type()\",\n \"browsers\": [\n \"E\",\n \"C\",\n \"FF3.5\",\n \"IE9\",\n \"O9.5\",\n \"S3.1\"\n ],\n \"description\": \"Represents an element that has an+b-1 siblings with the same expanded element name after it in the document tree, for any zero or positive integer value of n, and has a parent element.\"\n },\n {\n \"name\": \":nth-of-type()\",\n \"browsers\": [\n \"E\",\n \"C\",\n \"FF3.5\",\n \"IE9\",\n \"O9.5\",\n \"S3.1\"\n ],\n \"description\": \"Represents an element that has an+b-1 siblings with the same expanded element name before it in the document tree, for any zero or positive integer value of n, and has a parent element.\"\n },\n {\n \"name\": \":only-child\",\n \"browsers\": [\n \"E12\",\n \"FF1.5\",\n \"S3.1\",\n \"C2\",\n \"IE9\",\n \"O9.5\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:only-child\"\n }\n ],\n \"description\": \"Represents an element that has a parent element and whose parent element has no other element children. Same as :first-child:last-child or :nth-child(1):nth-last-child(1), but with a lower specificity.\"\n },\n {\n \"name\": \":only-of-type\",\n \"browsers\": [\n \"E12\",\n \"FF3.5\",\n \"S3.1\",\n \"C1\",\n \"IE9\",\n \"O9.5\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:only-of-type\"\n }\n ],\n \"description\": \"Matches every element that is the only child of its type, of its parent. Same as :first-of-type:last-of-type or :nth-of-type(1):nth-last-of-type(1), but with a lower specificity.\"\n },\n {\n \"name\": \":optional\",\n \"browsers\": [\n \"E12\",\n \"FF4\",\n \"S5\",\n \"C10\",\n \"IE10\",\n \"O10\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:optional\"\n }\n ],\n \"description\": \"A form element is :required or :optional if a value for it is, respectively, required or optional before the form it belongs to is submitted. Elements that are not form elements are neither required nor optional.\"\n },\n {\n \"name\": \":out-of-range\",\n \"browsers\": [\n \"E13\",\n \"FF29\",\n \"S5.1\",\n \"C10\",\n \"O11\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:out-of-range\"\n }\n ],\n \"description\": \"Used in conjunction with the min and max attributes, whether on a range input, a number field, or any other types that accept those attributes.\"\n },\n {\n \"name\": \":past\",\n \"browsers\": [\n \"S7\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:past\"\n }\n ],\n \"description\": \"Represents any element that is defined to occur entirely prior to a :current element.\"\n },\n {\n \"name\": \":read-only\",\n \"browsers\": [\n \"E13\",\n \"FF78\",\n \"S4\",\n \"C1\",\n \"O9\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:read-only\"\n }\n ],\n \"description\": \"An element whose contents are not user-alterable is :read-only. However, elements whose contents are user-alterable (such as text input fields) are considered to be in a :read-write state. In typical documents, most elements are :read-only.\"\n },\n {\n \"name\": \":read-write\",\n \"browsers\": [\n \"E13\",\n \"FF78\",\n \"S4\",\n \"C1\",\n \"O9\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:read-write\"\n }\n ],\n \"description\": \"An element whose contents are not user-alterable is :read-only. However, elements whose contents are user-alterable (such as text input fields) are considered to be in a :read-write state. In typical documents, most elements are :read-only.\"\n },\n {\n \"name\": \":required\",\n \"browsers\": [\n \"E12\",\n \"FF4\",\n \"S5\",\n \"C10\",\n \"IE10\",\n \"O10\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:required\"\n }\n ],\n \"description\": \"A form element is :required or :optional if a value for it is, respectively, required or optional before the form it belongs to is submitted. Elements that are not form elements are neither required nor optional.\"\n },\n {\n \"name\": \":right\",\n \"browsers\": [\n \"E12\",\n \"S5\",\n \"C6\",\n \"IE8\",\n \"O9.2\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:right\"\n }\n ],\n \"description\": \"When printing double-sided documents, the page boxes on left and right pages may be different. This can be expressed through CSS pseudo-classes defined in the page context.\"\n },\n {\n \"name\": \":root\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE9\",\n \"O9.5\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:root\"\n }\n ],\n \"description\": \"Represents an element that is the root of the document. In HTML 4, this is always the HTML element.\"\n },\n {\n \"name\": \":scope\",\n \"browsers\": [\n \"E79\",\n \"FF32\",\n \"S7\",\n \"C27\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:scope\"\n }\n ],\n \"description\": \"Represents any element that is in the contextual reference element set.\"\n },\n {\n \"name\": \":single-button\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Non-standard. Applies to buttons and track pieces. Applies when both buttons are displayed separately at either end of the scrollbar.\"\n },\n {\n \"name\": \":start\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Non-standard. Applies to buttons and track pieces. Indicates whether the object is placed before the thumb.\"\n },\n {\n \"name\": \":target\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1.3\",\n \"C1\",\n \"IE9\",\n \"O9.5\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:target\"\n }\n ],\n \"description\": \"Some URIs refer to a location within a resource. This kind of URI ends with a 'number sign' (#) followed by an anchor identifier (called the fragment identifier).\"\n },\n {\n \"name\": \":valid\",\n \"browsers\": [\n \"E12\",\n \"FF4\",\n \"S5\",\n \"C10\",\n \"IE10\",\n \"O10\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:valid\"\n }\n ],\n \"description\": \"An element is :valid or :invalid when it is, respectively, valid or invalid with respect to data validity semantics defined by a different specification.\"\n },\n {\n \"name\": \":vertical\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Non-standard. Applies to any scrollbar pieces that have a vertical orientation.\"\n },\n {\n \"name\": \":visited\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE4\",\n \"O3.5\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:visited\"\n }\n ],\n \"description\": \"Applies once the link has been visited by the user.\"\n },\n {\n \"name\": \":-webkit-any()\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Represents an element that is represented by the selector list passed as its argument. Standardized as :matches().\"\n },\n {\n \"name\": \":-webkit-full-screen\",\n \"browsers\": [\n \"C\",\n \"S6\"\n ],\n \"description\": \"Matches any element that has its fullscreen flag set. Standardized as :fullscreen.\"\n },\n {\n \"name\": \":window-inactive\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"description\": \"Non-standard. Applies to all scrollbar pieces. Indicates whether or not the window containing the scrollbar is currently active.\"\n },\n {\n \"name\": \":current\",\n \"status\": \"experimental\",\n \"description\": \"The :current CSS pseudo-class selector is a time-dimensional pseudo-class that represents the element, or an ancestor of the element, that is currently being displayed\"\n },\n {\n \"name\": \":blank\",\n \"status\": \"experimental\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:blank\"\n }\n ],\n \"description\": \"The :blank CSS pseudo-class selects empty user input elements (eg. <input> or <textarea>).\"\n },\n {\n \"name\": \":defined\",\n \"status\": \"experimental\",\n \"browsers\": [\n \"E79\",\n \"FF63\",\n \"S10\",\n \"C54\",\n \"O41\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:defined\"\n }\n ],\n \"description\": \"The :defined CSS pseudo-class represents any element that has been defined. This includes any standard element built in to the browser, and custom elements that have been successfully defined (i.e. with the CustomElementRegistry.define() method).\"\n },\n {\n \"name\": \":dir\",\n \"browsers\": [\n \"FF49\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:dir\"\n }\n ],\n \"description\": \"The :dir() CSS pseudo-class matches elements based on the directionality of the text contained in them.\"\n },\n {\n \"name\": \":focus-visible\",\n \"browsers\": [\n \"E86\",\n \"FF85\",\n \"S15.4\",\n \"C86\",\n \"O72\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:focus-visible\"\n }\n ],\n \"description\": \"The :focus-visible pseudo-class applies while an element matches the :focus pseudo-class and the UA determines via heuristics that the focus should be made evident on the element.\"\n },\n {\n \"name\": \":focus-within\",\n \"browsers\": [\n \"E79\",\n \"FF52\",\n \"S10.1\",\n \"C60\",\n \"O47\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:focus-within\"\n }\n ],\n \"description\": \"The :focus-within pseudo-class applies to any element for which the :focus pseudo class applies as well as to an element whose descendant in the flat tree (including non-element nodes, such as text nodes) matches the conditions for matching :focus.\"\n },\n {\n \"name\": \":has\",\n \"status\": \"experimental\",\n \"browsers\": [\n \"E105\",\n \"FF103\",\n \"S15.4\",\n \"C105\",\n \"O91\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:has\"\n }\n ],\n \"description\": \":The :has() CSS pseudo-class represents an element if any of the selectors passed as parameters (relative to the :scope of the given element), match at least one element.\"\n },\n {\n \"name\": \":is\",\n \"status\": \"experimental\",\n \"browsers\": [\n \"E88\",\n \"FF78\",\n \"S14\",\n \"C88\",\n \"O74\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:is\"\n }\n ],\n \"description\": \"The :is() CSS pseudo-class function takes a selector list as its argument, and selects any element that can be selected by one of the selectors in that list. This is useful for writing large selectors in a more compact form.\"\n },\n {\n \"name\": \":local-link\",\n \"status\": \"experimental\",\n \"description\": \"The :local-link CSS pseudo-class represents an link to the same document\"\n },\n {\n \"name\": \":nth-col\",\n \"status\": \"experimental\",\n \"description\": \"The :nth-col() CSS pseudo-class is designed for tables and grids. It accepts the An+B notation such as used with the :nth-child selector, using this to target every nth column. \"\n },\n {\n \"name\": \":nth-last-col\",\n \"status\": \"experimental\",\n \"description\": \"The :nth-last-col() CSS pseudo-class is designed for tables and grids. It accepts the An+B notation such as used with the :nth-child selector, using this to target every nth column before it, therefore counting back from the end of the set of columns.\"\n },\n {\n \"name\": \":paused\",\n \"status\": \"experimental\",\n \"browsers\": [\n \"S15.4\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:paused\"\n }\n ],\n \"description\": \"The :paused CSS pseudo-class selector is a resource state pseudo-class that will match an audio, video, or similar resource that is capable of being \u201Cplayed\u201D or \u201Cpaused\u201D, when that element is \u201Cpaused\u201D.\"\n },\n {\n \"name\": \":placeholder-shown\",\n \"status\": \"experimental\",\n \"browsers\": [\n \"E79\",\n \"FF51\",\n \"S9\",\n \"C47\",\n \"IE10\",\n \"O34\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:placeholder-shown\"\n }\n ],\n \"description\": \"The :placeholder-shown CSS pseudo-class represents any <input> or <textarea> element that is currently displaying placeholder text.\"\n },\n {\n \"name\": \":playing\",\n \"status\": \"experimental\",\n \"browsers\": [\n \"S15.4\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:playing\"\n }\n ],\n \"description\": \"The :playing CSS pseudo-class selector is a resource state pseudo-class that will match an audio, video, or similar resource that is capable of being \u201Cplayed\u201D or \u201Cpaused\u201D, when that element is \u201Cplaying\u201D. \"\n },\n {\n \"name\": \":target-within\",\n \"status\": \"experimental\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:target-within\"\n }\n ],\n \"description\": \"The :target-within CSS pseudo-class represents an element that is a target element or contains an element that is a target. A target element is a unique element with an id matching the URL's fragment.\"\n },\n {\n \"name\": \":user-invalid\",\n \"status\": \"experimental\",\n \"browsers\": [\n \"FF88\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:user-invalid\"\n }\n ],\n \"description\": \"The :user-invalid CSS pseudo-class represents any validated form element whose value isn't valid based on their validation constraints, after the user has interacted with it.\"\n },\n {\n \"name\": \":user-valid\",\n \"status\": \"experimental\",\n \"browsers\": [\n \"FF88\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:user-valid\"\n }\n ],\n \"description\": \"The :user-valid CSS pseudo-class represents any validated form element whose value validates correctly based on its validation constraints. However, unlike :valid it only matches once the user has interacted with it.\"\n },\n {\n \"name\": \":where\",\n \"status\": \"experimental\",\n \"browsers\": [\n \"E88\",\n \"FF78\",\n \"S14\",\n \"C88\",\n \"O74\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:where\"\n }\n ],\n \"description\": \"The :where() CSS pseudo-class function takes a selector list as its argument, and selects any element that can be selected by one of the selectors in that list.\"\n },\n {\n \"name\": \":picture-in-picture\",\n \"status\": \"experimental\",\n \"browsers\": [\n \"E79\",\n \"C76\",\n \"O63\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:picture-in-picture\"\n }\n ],\n \"description\": \"The :picture-in-picture CSS pseudo-class matches the element which is currently in picture-in-picture mode.\"\n }\n ],\n \"pseudoElements\": [\n {\n \"name\": \"::after\",\n \"browsers\": [\n \"E12\",\n \"FF1.5\",\n \"S4\",\n \"C1\",\n \"IE9\",\n \"O7\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::after\"\n }\n ],\n \"description\": \"Represents a styleable child pseudo-element immediately after the originating element's actual content.\"\n },\n {\n \"name\": \"::backdrop\",\n \"browsers\": [\n \"E79\",\n \"FF47\",\n \"S15.4\",\n \"C37\",\n \"IE11\",\n \"O24\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::backdrop\"\n }\n ],\n \"description\": \"Used to create a backdrop that hides the underlying document for an element in a top layer (such as an element that is displayed fullscreen).\"\n },\n {\n \"name\": \"::before\",\n \"browsers\": [\n \"E12\",\n \"FF1.5\",\n \"S4\",\n \"C1\",\n \"IE9\",\n \"O7\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::before\"\n }\n ],\n \"description\": \"Represents a styleable child pseudo-element immediately before the originating element's actual content.\"\n },\n {\n \"name\": \"::content\",\n \"browsers\": [\n \"C35\",\n \"O22\"\n ],\n \"description\": \"Deprecated. Matches the distribution list itself, on elements that have one. Use ::slotted for forward compatibility.\"\n },\n {\n \"name\": \"::cue\",\n \"browsers\": [\n \"E79\",\n \"FF55\",\n \"S7\",\n \"C26\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::cue\"\n }\n ]\n },\n {\n \"name\": \"::cue()\",\n \"browsers\": [\n \"C\",\n \"O16\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::cue-region\",\n \"browsers\": [\n \"C\",\n \"O16\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::cue-region()\",\n \"browsers\": [\n \"C\",\n \"O16\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::first-letter\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE9\",\n \"O7\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::first-letter\"\n }\n ],\n \"description\": \"Represents the first letter of an element, if it is not preceded by any other content (such as images or inline tables) on its line.\"\n },\n {\n \"name\": \"::first-line\",\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S1\",\n \"C1\",\n \"IE9\",\n \"O7\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::first-line\"\n }\n ],\n \"description\": \"Describes the contents of the first formatted line of its originating element.\"\n },\n {\n \"name\": \"::-moz-focus-inner\",\n \"browsers\": [\n \"FF4\"\n ]\n },\n {\n \"name\": \"::-moz-focus-outer\",\n \"browsers\": [\n \"FF4\"\n ]\n },\n {\n \"name\": \"::-moz-list-bullet\",\n \"browsers\": [\n \"FF1\"\n ],\n \"description\": \"Used to style the bullet of a list element. Similar to the standardized ::marker.\"\n },\n {\n \"name\": \"::-moz-list-number\",\n \"browsers\": [\n \"FF1\"\n ],\n \"description\": \"Used to style the numbers of a list element. Similar to the standardized ::marker.\"\n },\n {\n \"name\": \"::-moz-placeholder\",\n \"browsers\": [\n \"FF19\"\n ],\n \"description\": \"Represents placeholder text in an input field\"\n },\n {\n \"name\": \"::-moz-progress-bar\",\n \"browsers\": [\n \"FF9\"\n ],\n \"description\": \"Represents the bar portion of a progress bar.\"\n },\n {\n \"name\": \"::-moz-selection\",\n \"browsers\": [\n \"FF1\"\n ],\n \"description\": \"Represents the portion of a document that has been highlighted by the user.\"\n },\n {\n \"name\": \"::-ms-backdrop\",\n \"browsers\": [\n \"IE11\"\n ],\n \"description\": \"Used to create a backdrop that hides the underlying document for an element in a top layer (such as an element that is displayed fullscreen).\"\n },\n {\n \"name\": \"::-ms-browse\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the browse button of an input type=file control.\"\n },\n {\n \"name\": \"::-ms-check\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the check of a checkbox or radio button input control.\"\n },\n {\n \"name\": \"::-ms-clear\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the clear button of a text input control\"\n },\n {\n \"name\": \"::-ms-expand\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the drop-down button of a select control.\"\n },\n {\n \"name\": \"::-ms-fill\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the bar portion of a progress bar.\"\n },\n {\n \"name\": \"::-ms-fill-lower\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the portion of the slider track from its smallest value up to the value currently selected by the thumb. In a left-to-right layout, this is the portion of the slider track to the left of the thumb.\"\n },\n {\n \"name\": \"::-ms-fill-upper\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the portion of the slider track from the value currently selected by the thumb up to the slider's largest value. In a left-to-right layout, this is the portion of the slider track to the right of the thumb.\"\n },\n {\n \"name\": \"::-ms-reveal\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the password reveal button of an input type=password control.\"\n },\n {\n \"name\": \"::-ms-thumb\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the portion of range input control (also known as a slider control) that the user drags.\"\n },\n {\n \"name\": \"::-ms-ticks-after\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the tick marks of a slider that begin just after the thumb and continue up to the slider's largest value. In a left-to-right layout, these are the ticks to the right of the thumb.\"\n },\n {\n \"name\": \"::-ms-ticks-before\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the tick marks of a slider that represent its smallest values up to the value currently selected by the thumb. In a left-to-right layout, these are the ticks to the left of the thumb.\"\n },\n {\n \"name\": \"::-ms-tooltip\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the tooltip of a slider (input type=range).\"\n },\n {\n \"name\": \"::-ms-track\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the track of a slider.\"\n },\n {\n \"name\": \"::-ms-value\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the content of a text or password input control, or a select control.\"\n },\n {\n \"name\": \"::selection\",\n \"browsers\": [\n \"E12\",\n \"FF62\",\n \"S1.1\",\n \"C1\",\n \"IE9\",\n \"O9.5\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::selection\"\n }\n ],\n \"description\": \"Represents the portion of a document that has been highlighted by the user.\"\n },\n {\n \"name\": \"::shadow\",\n \"browsers\": [\n \"C35\",\n \"O22\"\n ],\n \"description\": \"Matches the shadow root if an element has a shadow tree.\"\n },\n {\n \"name\": \"::-webkit-file-upload-button\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::-webkit-inner-spin-button\",\n \"browsers\": [\n \"E79\",\n \"S5\",\n \"C6\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-inner-spin-button\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-input-placeholder\",\n \"browsers\": [\n \"C\",\n \"S4\"\n ]\n },\n {\n \"name\": \"::-webkit-keygen-select\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::-webkit-meter-bar\",\n \"browsers\": [\n \"E79\",\n \"S5.1\",\n \"C12\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-meter-bar\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-meter-even-less-good-value\",\n \"browsers\": [\n \"E79\",\n \"S5.1\",\n \"C12\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-meter-even-less-good-value\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-meter-optimum-value\",\n \"browsers\": [\n \"E79\",\n \"S5.1\",\n \"C12\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-meter-optimum-value\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-meter-suboptimum-value\",\n \"browsers\": [\n \"E79\",\n \"S5.1\",\n \"C12\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-meter-suboptimum-value\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-outer-spin-button\",\n \"browsers\": [\n \"S5\",\n \"C6\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-outer-spin-button\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-progress-bar\",\n \"browsers\": [\n \"E79\",\n \"S7\",\n \"C25\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-progress-bar\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-progress-inner-element\",\n \"browsers\": [\n \"E79\",\n \"S7\",\n \"C23\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-progress-inner-element\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-progress-value\",\n \"browsers\": [\n \"E79\",\n \"S7\",\n \"C25\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-progress-value\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-resizer\",\n \"browsers\": [\n \"E79\",\n \"S4\",\n \"C2\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-scrollbar\",\n \"browsers\": [\n \"E79\",\n \"S4\",\n \"C2\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-scrollbar-button\",\n \"browsers\": [\n \"E79\",\n \"S4\",\n \"C2\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-scrollbar-corner\",\n \"browsers\": [\n \"E79\",\n \"S4\",\n \"C2\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-scrollbar-thumb\",\n \"browsers\": [\n \"E79\",\n \"S4\",\n \"C2\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-scrollbar-track\",\n \"browsers\": [\n \"E79\",\n \"S4\",\n \"C2\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-scrollbar-track-piece\",\n \"browsers\": [\n \"E79\",\n \"S4\",\n \"C2\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-search-cancel-button\",\n \"browsers\": [\n \"E79\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-search-cancel-button\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-search-decoration\",\n \"browsers\": [\n \"C\",\n \"S4\"\n ]\n },\n {\n \"name\": \"::-webkit-search-results-button\",\n \"browsers\": [\n \"E79\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-search-results-button\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-search-results-decoration\",\n \"browsers\": [\n \"C\",\n \"S4\"\n ]\n },\n {\n \"name\": \"::-webkit-slider-runnable-track\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::-webkit-slider-thumb\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::-webkit-textfield-decoration-container\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::-webkit-validation-bubble\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::-webkit-validation-bubble-arrow\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::-webkit-validation-bubble-arrow-clipper\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::-webkit-validation-bubble-heading\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::-webkit-validation-bubble-message\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::-webkit-validation-bubble-text-block\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::target-text\",\n \"status\": \"experimental\",\n \"browsers\": [\n \"E89\",\n \"C89\",\n \"O75\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::target-text\"\n }\n ],\n \"description\": \"The ::target-text CSS pseudo-element represents the text that has been scrolled to if the browser supports scroll-to-text fragments. It allows authors to choose how to highlight that section of text.\"\n },\n {\n \"name\": \"::-moz-range-progress\",\n \"status\": \"nonstandard\",\n \"browsers\": [\n \"FF22\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-moz-range-progress\"\n }\n ],\n \"description\": \"The ::-moz-range-progress CSS pseudo-element is a Mozilla extension that represents the lower portion of the track (i.e., groove) in which the indicator slides in an <input> of type=\\\"range\\\". This portion corresponds to values lower than the value currently selected by the thumb (i.e., virtual knob).\"\n },\n {\n \"name\": \"::-moz-range-thumb\",\n \"status\": \"nonstandard\",\n \"browsers\": [\n \"FF21\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-moz-range-thumb\"\n }\n ],\n \"description\": \"The ::-moz-range-thumb CSS pseudo-element is a Mozilla extension that represents the thumb (i.e., virtual knob) of an <input> of type=\\\"range\\\". The user can move the thumb along the input's track to alter its numerical value.\"\n },\n {\n \"name\": \"::-moz-range-track\",\n \"status\": \"nonstandard\",\n \"browsers\": [\n \"FF21\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-moz-range-track\"\n }\n ],\n \"description\": \"The ::-moz-range-track CSS pseudo-element is a Mozilla extension that represents the track (i.e., groove) in which the indicator slides in an <input> of type=\\\"range\\\".\"\n },\n {\n \"name\": \"::-webkit-progress-inner-value\",\n \"status\": \"nonstandard\",\n \"description\": \"The ::-webkit-progress-value CSS pseudo-element represents the filled-in portion of the bar of a <progress> element. It is a child of the ::-webkit-progress-bar pseudo-element.\\n\\nIn order to let ::-webkit-progress-value take effect, -webkit-appearance needs to be set to none on the <progress> element.\"\n },\n {\n \"name\": \"::grammar-error\",\n \"status\": \"experimental\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::grammar-error\"\n }\n ],\n \"description\": \"The ::grammar-error CSS pseudo-element represents a text segment which the user agent has flagged as grammatically incorrect.\"\n },\n {\n \"name\": \"::marker\",\n \"browsers\": [\n \"E86\",\n \"FF68\",\n \"Spreview\",\n \"C86\",\n \"O72\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::marker\"\n }\n ],\n \"description\": \"The ::marker CSS pseudo-element selects the marker box of a list item, which typically contains a bullet or number. It works on any element or pseudo-element set to display: list-item, such as the <li> and <summary> elements.\"\n },\n {\n \"name\": \"::part\",\n \"status\": \"experimental\",\n \"browsers\": [\n \"E79\",\n \"FF72\",\n \"S13.1\",\n \"C73\",\n \"O60\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::part\"\n }\n ],\n \"description\": \"The ::part CSS pseudo-element represents any element within a shadow tree that has a matching part attribute.\"\n },\n {\n \"name\": \"::placeholder\",\n \"browsers\": [\n \"E79\",\n \"FF51\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::placeholder\"\n }\n ],\n \"description\": \"The ::placeholder CSS pseudo-element represents the placeholder text of a form element.\"\n },\n {\n \"name\": \"::slotted\",\n \"browsers\": [\n \"E79\",\n \"FF63\",\n \"S10\",\n \"C50\",\n \"O37\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::slotted\"\n }\n ],\n \"description\": \"The :slotted() CSS pseudo-element represents any element that has been placed into a slot inside an HTML template.\"\n },\n {\n \"name\": \"::spelling-error\",\n \"status\": \"experimental\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::spelling-error\"\n }\n ],\n \"description\": \"The ::spelling-error CSS pseudo-element represents a text segment which the user agent has flagged as incorrectly spelled.\"\n }\n ]\n};\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nexport class CSSDataProvider {\n /**\n * Currently, unversioned data uses the V1 implementation\n * In the future when the provider handles multiple versions of HTML custom data,\n * use the latest implementation for unversioned data\n */\n constructor(data) {\n this._properties = [];\n this._atDirectives = [];\n this._pseudoClasses = [];\n this._pseudoElements = [];\n this.addData(data);\n }\n provideProperties() {\n return this._properties;\n }\n provideAtDirectives() {\n return this._atDirectives;\n }\n providePseudoClasses() {\n return this._pseudoClasses;\n }\n providePseudoElements() {\n return this._pseudoElements;\n }\n addData(data) {\n if (Array.isArray(data.properties)) {\n for (const prop of data.properties) {\n if (isPropertyData(prop)) {\n this._properties.push(prop);\n }\n }\n }\n if (Array.isArray(data.atDirectives)) {\n for (const prop of data.atDirectives) {\n if (isAtDirective(prop)) {\n this._atDirectives.push(prop);\n }\n }\n }\n if (Array.isArray(data.pseudoClasses)) {\n for (const prop of data.pseudoClasses) {\n if (isPseudoClassData(prop)) {\n this._pseudoClasses.push(prop);\n }\n }\n }\n if (Array.isArray(data.pseudoElements)) {\n for (const prop of data.pseudoElements) {\n if (isPseudoElementData(prop)) {\n this._pseudoElements.push(prop);\n }\n }\n }\n }\n}\nfunction isPropertyData(d) {\n return typeof d.name === 'string';\n}\nfunction isAtDirective(d) {\n return typeof d.name === 'string';\n}\nfunction isPseudoClassData(d) {\n return typeof d.name === 'string';\n}\nfunction isPseudoElementData(d) {\n return typeof d.name === 'string';\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport * as objects from '../utils/objects';\nimport { cssData } from '../data/webCustomData';\nimport { CSSDataProvider } from './dataProvider';\nexport class CSSDataManager {\n constructor(options) {\n this.dataProviders = [];\n this._propertySet = {};\n this._atDirectiveSet = {};\n this._pseudoClassSet = {};\n this._pseudoElementSet = {};\n this._properties = [];\n this._atDirectives = [];\n this._pseudoClasses = [];\n this._pseudoElements = [];\n this.setDataProviders(options?.useDefaultDataProvider !== false, options?.customDataProviders || []);\n }\n setDataProviders(builtIn, providers) {\n this.dataProviders = [];\n if (builtIn) {\n this.dataProviders.push(new CSSDataProvider(cssData));\n }\n this.dataProviders.push(...providers);\n this.collectData();\n }\n /**\n * Collect all data & handle duplicates\n */\n collectData() {\n this._propertySet = {};\n this._atDirectiveSet = {};\n this._pseudoClassSet = {};\n this._pseudoElementSet = {};\n this.dataProviders.forEach(provider => {\n provider.provideProperties().forEach(p => {\n if (!this._propertySet[p.name]) {\n this._propertySet[p.name] = p;\n }\n });\n provider.provideAtDirectives().forEach(p => {\n if (!this._atDirectiveSet[p.name]) {\n this._atDirectiveSet[p.name] = p;\n }\n });\n provider.providePseudoClasses().forEach(p => {\n if (!this._pseudoClassSet[p.name]) {\n this._pseudoClassSet[p.name] = p;\n }\n });\n provider.providePseudoElements().forEach(p => {\n if (!this._pseudoElementSet[p.name]) {\n this._pseudoElementSet[p.name] = p;\n }\n });\n });\n this._properties = objects.values(this._propertySet);\n this._atDirectives = objects.values(this._atDirectiveSet);\n this._pseudoClasses = objects.values(this._pseudoClassSet);\n this._pseudoElements = objects.values(this._pseudoElementSet);\n }\n getProperty(name) { return this._propertySet[name]; }\n getAtDirective(name) { return this._atDirectiveSet[name]; }\n getPseudoClass(name) { return this._pseudoClassSet[name]; }\n getPseudoElement(name) { return this._pseudoElementSet[name]; }\n getProperties() {\n return this._properties;\n }\n getAtDirectives() {\n return this._atDirectives;\n }\n getPseudoClasses() {\n return this._pseudoClasses;\n }\n getPseudoElements() {\n return this._pseudoElements;\n }\n isKnownProperty(name) {\n return name.toLowerCase() in this._propertySet;\n }\n isStandardProperty(name) {\n return this.isKnownProperty(name) &&\n (!this._propertySet[name.toLowerCase()].status || this._propertySet[name.toLowerCase()].status === 'standard');\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport { Range, SelectionRange } from '../cssLanguageTypes';\nimport { NodeType } from '../parser/cssNodes';\nexport function getSelectionRanges(document, positions, stylesheet) {\n function getSelectionRange(position) {\n const applicableRanges = getApplicableRanges(position);\n let current = undefined;\n for (let index = applicableRanges.length - 1; index >= 0; index--) {\n current = SelectionRange.create(Range.create(document.positionAt(applicableRanges[index][0]), document.positionAt(applicableRanges[index][1])), current);\n }\n if (!current) {\n current = SelectionRange.create(Range.create(position, position));\n }\n return current;\n }\n return positions.map(getSelectionRange);\n function getApplicableRanges(position) {\n const offset = document.offsetAt(position);\n let currNode = stylesheet.findChildAtOffset(offset, true);\n if (!currNode) {\n return [];\n }\n const result = [];\n while (currNode) {\n if (currNode.parent &&\n currNode.offset === currNode.parent.offset &&\n currNode.end === currNode.parent.end) {\n currNode = currNode.parent;\n continue;\n }\n // The `{ }` part of `.a { }`\n if (currNode.type === NodeType.Declarations) {\n if (offset > currNode.offset && offset < currNode.end) {\n // Return `{ }` and the range inside `{` and `}`\n result.push([currNode.offset + 1, currNode.end - 1]);\n }\n }\n result.push([currNode.offset, currNode.end]);\n currNode = currNode.parent;\n }\n return result;\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport { CSSNavigation } from './cssNavigation';\nimport * as nodes from '../parser/cssNodes';\nimport { URI, Utils } from 'vscode-uri';\nimport { startsWith } from '../utils/strings';\nexport class SCSSNavigation extends CSSNavigation {\n constructor(fileSystemProvider) {\n super(fileSystemProvider, true);\n }\n isRawStringDocumentLinkNode(node) {\n return (super.isRawStringDocumentLinkNode(node) ||\n node.type === nodes.NodeType.Use ||\n node.type === nodes.NodeType.Forward);\n }\n async mapReference(target, isRawLink) {\n if (this.fileSystemProvider && target && isRawLink) {\n const pathVariations = toPathVariations(target);\n for (const variation of pathVariations) {\n if (await this.fileExists(variation)) {\n return variation;\n }\n }\n }\n return target;\n }\n async resolveReference(target, documentUri, documentContext, isRawLink = false) {\n if (startsWith(target, 'sass:')) {\n return undefined; // sass library\n }\n return super.resolveReference(target, documentUri, documentContext, isRawLink);\n }\n}\nfunction toPathVariations(target) {\n // No variation for links that ends with suffix\n if (target.endsWith('.scss') || target.endsWith('.css')) {\n return [target];\n }\n // If a link is like a/, try resolving a/index.scss and a/_index.scss\n if (target.endsWith('/')) {\n return [target + 'index.scss', target + '_index.scss'];\n }\n const targetUri = URI.parse(target);\n const basename = Utils.basename(targetUri);\n const dirname = Utils.dirname(targetUri);\n if (basename.startsWith('_')) {\n // No variation for links such as _a\n return [Utils.joinPath(dirname, basename + '.scss').toString(true)];\n }\n return [\n Utils.joinPath(dirname, basename + '.scss').toString(true),\n Utils.joinPath(dirname, '_' + basename + '.scss').toString(true),\n target + '/index.scss',\n target + '/_index.scss',\n Utils.joinPath(dirname, basename + '.css').toString(true)\n ];\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport { Parser } from './parser/cssParser';\nimport { CSSCompletion } from './services/cssCompletion';\nimport { CSSHover } from './services/cssHover';\nimport { CSSNavigation } from './services/cssNavigation';\nimport { CSSCodeActions } from './services/cssCodeActions';\nimport { CSSValidation } from './services/cssValidation';\nimport { SCSSParser } from './parser/scssParser';\nimport { SCSSCompletion } from './services/scssCompletion';\nimport { LESSParser } from './parser/lessParser';\nimport { LESSCompletion } from './services/lessCompletion';\nimport { getFoldingRanges } from './services/cssFolding';\nimport { format } from './services/cssFormatter';\nimport { CSSDataManager } from './languageFacts/dataManager';\nimport { CSSDataProvider } from './languageFacts/dataProvider';\nimport { getSelectionRanges } from './services/cssSelectionRange';\nimport { SCSSNavigation } from './services/scssNavigation';\nimport { cssData } from './data/webCustomData';\nexport * from './cssLanguageTypes';\nexport function getDefaultCSSDataProvider() {\n return newCSSDataProvider(cssData);\n}\nexport function newCSSDataProvider(data) {\n return new CSSDataProvider(data);\n}\nfunction createFacade(parser, completion, hover, navigation, codeActions, validation, cssDataManager) {\n return {\n configure: (settings) => {\n validation.configure(settings);\n completion.configure(settings?.completion);\n hover.configure(settings?.hover);\n },\n setDataProviders: cssDataManager.setDataProviders.bind(cssDataManager),\n doValidation: validation.doValidation.bind(validation),\n parseStylesheet: parser.parseStylesheet.bind(parser),\n doComplete: completion.doComplete.bind(completion),\n doComplete2: completion.doComplete2.bind(completion),\n setCompletionParticipants: completion.setCompletionParticipants.bind(completion),\n doHover: hover.doHover.bind(hover),\n format,\n findDefinition: navigation.findDefinition.bind(navigation),\n findReferences: navigation.findReferences.bind(navigation),\n findDocumentHighlights: navigation.findDocumentHighlights.bind(navigation),\n findDocumentLinks: navigation.findDocumentLinks.bind(navigation),\n findDocumentLinks2: navigation.findDocumentLinks2.bind(navigation),\n findDocumentSymbols: navigation.findSymbolInformations.bind(navigation),\n findDocumentSymbols2: navigation.findDocumentSymbols.bind(navigation),\n doCodeActions: codeActions.doCodeActions.bind(codeActions),\n doCodeActions2: codeActions.doCodeActions2.bind(codeActions),\n findDocumentColors: navigation.findDocumentColors.bind(navigation),\n getColorPresentations: navigation.getColorPresentations.bind(navigation),\n prepareRename: navigation.prepareRename.bind(navigation),\n doRename: navigation.doRename.bind(navigation),\n getFoldingRanges,\n getSelectionRanges\n };\n}\nconst defaultLanguageServiceOptions = {};\nexport function getCSSLanguageService(options = defaultLanguageServiceOptions) {\n const cssDataManager = new CSSDataManager(options);\n return createFacade(new Parser(), new CSSCompletion(null, options, cssDataManager), new CSSHover(options && options.clientCapabilities, cssDataManager), new CSSNavigation(options && options.fileSystemProvider, false), new CSSCodeActions(cssDataManager), new CSSValidation(cssDataManager), cssDataManager);\n}\nexport function getSCSSLanguageService(options = defaultLanguageServiceOptions) {\n const cssDataManager = new CSSDataManager(options);\n return createFacade(new SCSSParser(), new SCSSCompletion(options, cssDataManager), new CSSHover(options && options.clientCapabilities, cssDataManager), new SCSSNavigation(options && options.fileSystemProvider), new CSSCodeActions(cssDataManager), new CSSValidation(cssDataManager), cssDataManager);\n}\nexport function getLESSLanguageService(options = defaultLanguageServiceOptions) {\n const cssDataManager = new CSSDataManager(options);\n return createFacade(new LESSParser(), new LESSCompletion(options, cssDataManager), new CSSHover(options && options.clientCapabilities, cssDataManager), new CSSNavigation(options && options.fileSystemProvider, true), new CSSCodeActions(cssDataManager), new CSSValidation(cssDataManager), cssDataManager);\n}\n", "import { LanguageMode } from '../../embeddedSupport/languageModes';\nimport { SnippetManager, ScaffoldSnippetSources } from './snippets';\nimport { Range } from 'vscode-css-languageservice';\nimport { EnvironmentService } from '../../services/EnvironmentService';\n\nexport function getVueMode(env: EnvironmentService, globalSnippetDir?: string): LanguageMode {\n const snippetManager = new SnippetManager(env.getSnippetFolder(), globalSnippetDir);\n const scaffoldSnippetSources: ScaffoldSnippetSources = {\n workspace: '\uD83D\uDCBC',\n user: '\uD83D\uDDD2\uFE0F',\n vetur: '\u270C'\n };\n\n return {\n getId() {\n return 'vue';\n },\n doComplete(document, position) {\n const scaffoldSnippetSources: ScaffoldSnippetSources = env.getConfig().vetur.completion.scaffoldSnippetSources;\n\n if (\n scaffoldSnippetSources['workspace'] === '' &&\n scaffoldSnippetSources['user'] === '' &&\n scaffoldSnippetSources['vetur'] === ''\n ) {\n return { isIncomplete: false, items: [] };\n }\n\n const offset = document.offsetAt(position);\n const lines = document.getText().slice(0, offset).split('\\n');\n const currentLine = lines[position.line];\n\n const items = snippetManager ? snippetManager.completeSnippets(scaffoldSnippetSources) : [];\n\n // If a line starts with `<`, it's probably a starting region tag that can be wholly replaced\n if (currentLine.length > 0 && currentLine.startsWith('<')) {\n const replacementRange = Range.create(\n document.positionAt(offset - currentLine.length),\n document.positionAt(offset)\n );\n items.forEach(i => {\n if (i.insertText) {\n i.textEdit = {\n newText: i.insertText,\n range: replacementRange\n };\n }\n });\n }\n\n return {\n isIncomplete: false,\n items\n };\n },\n onDocumentRemoved() {},\n dispose() {}\n };\n}\n", "import { CompletionItem, Diagnostic, Position, Range } from 'vscode-languageserver-types';\nimport type { TextDocument } from 'vscode-languageserver-textdocument';\nimport {\n getCSSLanguageService,\n getSCSSLanguageService,\n getLESSLanguageService,\n LanguageService\n} from 'vscode-css-languageservice';\nimport _ from 'lodash';\nimport * as emmet from 'vscode-emmet-helper';\n\nimport { StylePriority } from './emmet';\nimport { LanguageModelCache, getLanguageModelCache } from '../../embeddedSupport/languageModelCache';\nimport { LanguageMode } from '../../embeddedSupport/languageModes';\nimport { VueDocumentRegions, LanguageId } from '../../embeddedSupport/embeddedSupport';\nimport { getFileFsPath } from '../../utils/paths';\nimport { prettierify } from '../../utils/prettier';\nimport { NULL_HOVER } from '../nullMode';\nimport { VLSFormatConfig } from '../../config';\nimport { DependencyService } from '../../services/dependencyService';\nimport { BuiltInParserName } from 'prettier';\nimport { EnvironmentService } from '../../services/EnvironmentService';\n\nexport function getCSSMode(\n env: EnvironmentService,\n documentRegions: LanguageModelCache<VueDocumentRegions>,\n dependencyService: DependencyService\n): LanguageMode {\n const languageService = getCSSLanguageService();\n return getStyleMode(env, 'css', languageService, documentRegions, dependencyService);\n}\n\nexport function getPostCSSMode(\n env: EnvironmentService,\n documentRegions: LanguageModelCache<VueDocumentRegions>,\n dependencyService: DependencyService\n): LanguageMode {\n const languageService = getCSSLanguageService();\n return getStyleMode(env, 'postcss', languageService, documentRegions, dependencyService);\n}\n\nexport function getSCSSMode(\n env: EnvironmentService,\n documentRegions: LanguageModelCache<VueDocumentRegions>,\n dependencyService: DependencyService\n): LanguageMode {\n const languageService = getSCSSLanguageService();\n return getStyleMode(env, 'scss', languageService, documentRegions, dependencyService);\n}\n\nexport function getLESSMode(\n env: EnvironmentService,\n documentRegions: LanguageModelCache<VueDocumentRegions>,\n dependencyService: DependencyService\n): LanguageMode {\n const languageService = getLESSLanguageService();\n return getStyleMode(env, 'less', languageService, documentRegions, dependencyService);\n}\n\nfunction getStyleMode(\n env: EnvironmentService,\n languageId: LanguageId,\n languageService: LanguageService,\n documentRegions: LanguageModelCache<VueDocumentRegions>,\n dependencyService: DependencyService\n): LanguageMode {\n const embeddedDocuments = getLanguageModelCache(10, 60, document =>\n documentRegions.refreshAndGet(document).getSingleLanguageDocument(languageId)\n );\n const stylesheets = getLanguageModelCache(10, 60, document => languageService.parseStylesheet(document));\n\n let latestConfig = env.getConfig().css;\n function syncConfig() {\n if (_.isEqual(latestConfig, env.getConfig().css)) {\n return;\n }\n latestConfig = env.getConfig().css;\n languageService.configure(env.getConfig().css);\n }\n\n return {\n getId() {\n return languageId;\n },\n async doValidation(document) {\n syncConfig();\n if (languageId === 'postcss') {\n return [];\n } else {\n const embedded = embeddedDocuments.refreshAndGet(document);\n return languageService.doValidation(embedded, stylesheets.refreshAndGet(embedded)) as Diagnostic[];\n }\n },\n doComplete(document, position) {\n syncConfig();\n const embedded = embeddedDocuments.refreshAndGet(document);\n const emmetSyntax = languageId === 'postcss' ? 'css' : languageId;\n const lsCompletions = languageService.doComplete(embedded, position, stylesheets.refreshAndGet(embedded));\n const lsItems = lsCompletions\n ? _.map(lsCompletions.items, i => {\n return {\n ...i,\n sortText: StylePriority.Platform + i.label\n } as CompletionItem;\n })\n : [];\n\n const emmetCompletions = emmet.doComplete(document, position, emmetSyntax, env.getConfig().emmet);\n if (!emmetCompletions) {\n return { isIncomplete: false, items: lsItems };\n } else {\n const emmetItems = emmetCompletions.items.map(i => {\n return {\n ...i,\n sortText: StylePriority.Emmet + i.label\n } as CompletionItem;\n });\n return {\n isIncomplete: emmetCompletions.isIncomplete,\n items: _.concat(emmetItems, lsItems)\n };\n }\n },\n doHover(document, position) {\n syncConfig();\n const embedded = embeddedDocuments.refreshAndGet(document);\n return languageService.doHover(embedded, position, stylesheets.refreshAndGet(embedded)) || NULL_HOVER;\n },\n findDocumentHighlight(document, position) {\n syncConfig();\n const embedded = embeddedDocuments.refreshAndGet(document);\n return languageService.findDocumentHighlights(embedded, position, stylesheets.refreshAndGet(embedded));\n },\n findDocumentSymbols(document) {\n syncConfig();\n const embedded = embeddedDocuments.refreshAndGet(document);\n return languageService.findDocumentSymbols(embedded, stylesheets.refreshAndGet(embedded));\n },\n findDefinition(document, position) {\n syncConfig();\n const embedded = embeddedDocuments.refreshAndGet(document);\n const definition = languageService.findDefinition(embedded, position, stylesheets.refreshAndGet(embedded));\n if (!definition) {\n return [];\n }\n return definition;\n },\n findReferences(document, position) {\n syncConfig();\n const embedded = embeddedDocuments.refreshAndGet(document);\n return languageService.findReferences(embedded, position, stylesheets.refreshAndGet(embedded));\n },\n findDocumentColors(document) {\n syncConfig();\n const embedded = embeddedDocuments.refreshAndGet(document);\n return languageService.findDocumentColors(embedded, stylesheets.refreshAndGet(embedded));\n },\n getFoldingRanges(document) {\n syncConfig();\n const embedded = embeddedDocuments.refreshAndGet(document);\n return languageService.getFoldingRanges(embedded);\n },\n getColorPresentations(document, color, range) {\n syncConfig();\n const embedded = embeddedDocuments.refreshAndGet(document);\n return languageService.getColorPresentations(embedded, stylesheets.refreshAndGet(embedded), color, range);\n },\n format(document, currRange, formattingOptions) {\n if (env.getConfig().vetur.format.defaultFormatter[languageId] === 'none') {\n return [];\n }\n syncConfig();\n\n const { value, range } = getValueAndRange(document, currRange);\n const needIndent = env.getConfig().vetur.format.styleInitialIndent;\n\n return prettierify(\n dependencyService,\n value,\n getFileFsPath(document.uri),\n languageId,\n range,\n env.getConfig().vetur.format as VLSFormatConfig,\n needIndent\n );\n },\n onDocumentRemoved(document) {\n embeddedDocuments.onDocumentRemoved(document);\n stylesheets.onDocumentRemoved(document);\n },\n dispose() {\n embeddedDocuments.dispose();\n stylesheets.dispose();\n }\n };\n}\n\nfunction getValueAndRange(document: TextDocument, currRange: Range): { value: string; range: Range } {\n let value = document.getText();\n let range = currRange;\n\n if (currRange) {\n const startOffset = document.offsetAt(currRange.start);\n const endOffset = document.offsetAt(currRange.end);\n value = value.substring(startOffset, endOffset);\n } else {\n range = Range.create(Position.create(0, 0), document.positionAt(value.length));\n }\n return { value, range };\n}\n", "/* --------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n * ------------------------------------------------------------------------------------------ */\n'use strict';\nexport var DocumentUri;\n(function (DocumentUri) {\n function is(value) {\n return typeof value === 'string';\n }\n DocumentUri.is = is;\n})(DocumentUri || (DocumentUri = {}));\nexport var URI;\n(function (URI) {\n function is(value) {\n return typeof value === 'string';\n }\n URI.is = is;\n})(URI || (URI = {}));\nexport var integer;\n(function (integer) {\n integer.MIN_VALUE = -2147483648;\n integer.MAX_VALUE = 2147483647;\n function is(value) {\n return typeof value === 'number' && integer.MIN_VALUE <= value && value <= integer.MAX_VALUE;\n }\n integer.is = is;\n})(integer || (integer = {}));\nexport var uinteger;\n(function (uinteger) {\n uinteger.MIN_VALUE = 0;\n uinteger.MAX_VALUE = 2147483647;\n function is(value) {\n return typeof value === 'number' && uinteger.MIN_VALUE <= value && value <= uinteger.MAX_VALUE;\n }\n uinteger.is = is;\n})(uinteger || (uinteger = {}));\n/**\n * The Position namespace provides helper functions to work with\n * [Position](#Position) literals.\n */\nexport var Position;\n(function (Position) {\n /**\n * Creates a new Position literal from the given line and character.\n * @param line The position's line.\n * @param character The position's character.\n */\n function create(line, character) {\n if (line === Number.MAX_VALUE) {\n line = uinteger.MAX_VALUE;\n }\n if (character === Number.MAX_VALUE) {\n character = uinteger.MAX_VALUE;\n }\n return { line: line, character: character };\n }\n Position.create = create;\n /**\n * Checks whether the given literal conforms to the [Position](#Position) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Is.uinteger(candidate.line) && Is.uinteger(candidate.character);\n }\n Position.is = is;\n})(Position || (Position = {}));\n/**\n * The Range namespace provides helper functions to work with\n * [Range](#Range) literals.\n */\nexport var Range;\n(function (Range) {\n function create(one, two, three, four) {\n if (Is.uinteger(one) && Is.uinteger(two) && Is.uinteger(three) && Is.uinteger(four)) {\n return { start: Position.create(one, two), end: Position.create(three, four) };\n }\n else if (Position.is(one) && Position.is(two)) {\n return { start: one, end: two };\n }\n else {\n throw new Error(\"Range#create called with invalid arguments[\".concat(one, \", \").concat(two, \", \").concat(three, \", \").concat(four, \"]\"));\n }\n }\n Range.create = create;\n /**\n * Checks whether the given literal conforms to the [Range](#Range) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Position.is(candidate.start) && Position.is(candidate.end);\n }\n Range.is = is;\n})(Range || (Range = {}));\n/**\n * The Location namespace provides helper functions to work with\n * [Location](#Location) literals.\n */\nexport var Location;\n(function (Location) {\n /**\n * Creates a Location literal.\n * @param uri The location's uri.\n * @param range The location's range.\n */\n function create(uri, range) {\n return { uri: uri, range: range };\n }\n Location.create = create;\n /**\n * Checks whether the given literal conforms to the [Location](#Location) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Range.is(candidate.range) && (Is.string(candidate.uri) || Is.undefined(candidate.uri));\n }\n Location.is = is;\n})(Location || (Location = {}));\n/**\n * The LocationLink namespace provides helper functions to work with\n * [LocationLink](#LocationLink) literals.\n */\nexport var LocationLink;\n(function (LocationLink) {\n /**\n * Creates a LocationLink literal.\n * @param targetUri The definition's uri.\n * @param targetRange The full range of the definition.\n * @param targetSelectionRange The span of the symbol definition at the target.\n * @param originSelectionRange The span of the symbol being defined in the originating source file.\n */\n function create(targetUri, targetRange, targetSelectionRange, originSelectionRange) {\n return { targetUri: targetUri, targetRange: targetRange, targetSelectionRange: targetSelectionRange, originSelectionRange: originSelectionRange };\n }\n LocationLink.create = create;\n /**\n * Checks whether the given literal conforms to the [LocationLink](#LocationLink) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Range.is(candidate.targetRange) && Is.string(candidate.targetUri)\n && Range.is(candidate.targetSelectionRange)\n && (Range.is(candidate.originSelectionRange) || Is.undefined(candidate.originSelectionRange));\n }\n LocationLink.is = is;\n})(LocationLink || (LocationLink = {}));\n/**\n * The Color namespace provides helper functions to work with\n * [Color](#Color) literals.\n */\nexport var Color;\n(function (Color) {\n /**\n * Creates a new Color literal.\n */\n function create(red, green, blue, alpha) {\n return {\n red: red,\n green: green,\n blue: blue,\n alpha: alpha,\n };\n }\n Color.create = create;\n /**\n * Checks whether the given literal conforms to the [Color](#Color) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Is.numberRange(candidate.red, 0, 1)\n && Is.numberRange(candidate.green, 0, 1)\n && Is.numberRange(candidate.blue, 0, 1)\n && Is.numberRange(candidate.alpha, 0, 1);\n }\n Color.is = is;\n})(Color || (Color = {}));\n/**\n * The ColorInformation namespace provides helper functions to work with\n * [ColorInformation](#ColorInformation) literals.\n */\nexport var ColorInformation;\n(function (ColorInformation) {\n /**\n * Creates a new ColorInformation literal.\n */\n function create(range, color) {\n return {\n range: range,\n color: color,\n };\n }\n ColorInformation.create = create;\n /**\n * Checks whether the given literal conforms to the [ColorInformation](#ColorInformation) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Range.is(candidate.range) && Color.is(candidate.color);\n }\n ColorInformation.is = is;\n})(ColorInformation || (ColorInformation = {}));\n/**\n * The Color namespace provides helper functions to work with\n * [ColorPresentation](#ColorPresentation) literals.\n */\nexport var ColorPresentation;\n(function (ColorPresentation) {\n /**\n * Creates a new ColorInformation literal.\n */\n function create(label, textEdit, additionalTextEdits) {\n return {\n label: label,\n textEdit: textEdit,\n additionalTextEdits: additionalTextEdits,\n };\n }\n ColorPresentation.create = create;\n /**\n * Checks whether the given literal conforms to the [ColorInformation](#ColorInformation) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Is.string(candidate.label)\n && (Is.undefined(candidate.textEdit) || TextEdit.is(candidate))\n && (Is.undefined(candidate.additionalTextEdits) || Is.typedArray(candidate.additionalTextEdits, TextEdit.is));\n }\n ColorPresentation.is = is;\n})(ColorPresentation || (ColorPresentation = {}));\n/**\n * A set of predefined range kinds.\n */\nexport var FoldingRangeKind;\n(function (FoldingRangeKind) {\n /**\n * Folding range for a comment\n */\n FoldingRangeKind.Comment = 'comment';\n /**\n * Folding range for an import or include\n */\n FoldingRangeKind.Imports = 'imports';\n /**\n * Folding range for a region (e.g. `#region`)\n */\n FoldingRangeKind.Region = 'region';\n})(FoldingRangeKind || (FoldingRangeKind = {}));\n/**\n * The folding range namespace provides helper functions to work with\n * [FoldingRange](#FoldingRange) literals.\n */\nexport var FoldingRange;\n(function (FoldingRange) {\n /**\n * Creates a new FoldingRange literal.\n */\n function create(startLine, endLine, startCharacter, endCharacter, kind, collapsedText) {\n var result = {\n startLine: startLine,\n endLine: endLine\n };\n if (Is.defined(startCharacter)) {\n result.startCharacter = startCharacter;\n }\n if (Is.defined(endCharacter)) {\n result.endCharacter = endCharacter;\n }\n if (Is.defined(kind)) {\n result.kind = kind;\n }\n if (Is.defined(collapsedText)) {\n result.collapsedText = collapsedText;\n }\n return result;\n }\n FoldingRange.create = create;\n /**\n * Checks whether the given literal conforms to the [FoldingRange](#FoldingRange) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Is.uinteger(candidate.startLine) && Is.uinteger(candidate.startLine)\n && (Is.undefined(candidate.startCharacter) || Is.uinteger(candidate.startCharacter))\n && (Is.undefined(candidate.endCharacter) || Is.uinteger(candidate.endCharacter))\n && (Is.undefined(candidate.kind) || Is.string(candidate.kind));\n }\n FoldingRange.is = is;\n})(FoldingRange || (FoldingRange = {}));\n/**\n * The DiagnosticRelatedInformation namespace provides helper functions to work with\n * [DiagnosticRelatedInformation](#DiagnosticRelatedInformation) literals.\n */\nexport var DiagnosticRelatedInformation;\n(function (DiagnosticRelatedInformation) {\n /**\n * Creates a new DiagnosticRelatedInformation literal.\n */\n function create(location, message) {\n return {\n location: location,\n message: message\n };\n }\n DiagnosticRelatedInformation.create = create;\n /**\n * Checks whether the given literal conforms to the [DiagnosticRelatedInformation](#DiagnosticRelatedInformation) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Location.is(candidate.location) && Is.string(candidate.message);\n }\n DiagnosticRelatedInformation.is = is;\n})(DiagnosticRelatedInformation || (DiagnosticRelatedInformation = {}));\n/**\n * The diagnostic's severity.\n */\nexport var DiagnosticSeverity;\n(function (DiagnosticSeverity) {\n /**\n * Reports an error.\n */\n DiagnosticSeverity.Error = 1;\n /**\n * Reports a warning.\n */\n DiagnosticSeverity.Warning = 2;\n /**\n * Reports an information.\n */\n DiagnosticSeverity.Information = 3;\n /**\n * Reports a hint.\n */\n DiagnosticSeverity.Hint = 4;\n})(DiagnosticSeverity || (DiagnosticSeverity = {}));\n/**\n * The diagnostic tags.\n *\n * @since 3.15.0\n */\nexport var DiagnosticTag;\n(function (DiagnosticTag) {\n /**\n * Unused or unnecessary code.\n *\n * Clients are allowed to render diagnostics with this tag faded out instead of having\n * an error squiggle.\n */\n DiagnosticTag.Unnecessary = 1;\n /**\n * Deprecated or obsolete code.\n *\n * Clients are allowed to rendered diagnostics with this tag strike through.\n */\n DiagnosticTag.Deprecated = 2;\n})(DiagnosticTag || (DiagnosticTag = {}));\n/**\n * The CodeDescription namespace provides functions to deal with descriptions for diagnostic codes.\n *\n * @since 3.16.0\n */\nexport var CodeDescription;\n(function (CodeDescription) {\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Is.string(candidate.href);\n }\n CodeDescription.is = is;\n})(CodeDescription || (CodeDescription = {}));\n/**\n * The Diagnostic namespace provides helper functions to work with\n * [Diagnostic](#Diagnostic) literals.\n */\nexport var Diagnostic;\n(function (Diagnostic) {\n /**\n * Creates a new Diagnostic literal.\n */\n function create(range, message, severity, code, source, relatedInformation) {\n var result = { range: range, message: message };\n if (Is.defined(severity)) {\n result.severity = severity;\n }\n if (Is.defined(code)) {\n result.code = code;\n }\n if (Is.defined(source)) {\n result.source = source;\n }\n if (Is.defined(relatedInformation)) {\n result.relatedInformation = relatedInformation;\n }\n return result;\n }\n Diagnostic.create = create;\n /**\n * Checks whether the given literal conforms to the [Diagnostic](#Diagnostic) interface.\n */\n function is(value) {\n var _a;\n var candidate = value;\n return Is.defined(candidate)\n && Range.is(candidate.range)\n && Is.string(candidate.message)\n && (Is.number(candidate.severity) || Is.undefined(candidate.severity))\n && (Is.integer(candidate.code) || Is.string(candidate.code) || Is.undefined(candidate.code))\n && (Is.undefined(candidate.codeDescription) || (Is.string((_a = candidate.codeDescription) === null || _a === void 0 ? void 0 : _a.href)))\n && (Is.string(candidate.source) || Is.undefined(candidate.source))\n && (Is.undefined(candidate.relatedInformation) || Is.typedArray(candidate.relatedInformation, DiagnosticRelatedInformation.is));\n }\n Diagnostic.is = is;\n})(Diagnostic || (Diagnostic = {}));\n/**\n * The Command namespace provides helper functions to work with\n * [Command](#Command) literals.\n */\nexport var Command;\n(function (Command) {\n /**\n * Creates a new Command literal.\n */\n function create(title, command) {\n var args = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n args[_i - 2] = arguments[_i];\n }\n var result = { title: title, command: command };\n if (Is.defined(args) && args.length > 0) {\n result.arguments = args;\n }\n return result;\n }\n Command.create = create;\n /**\n * Checks whether the given literal conforms to the [Command](#Command) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.string(candidate.title) && Is.string(candidate.command);\n }\n Command.is = is;\n})(Command || (Command = {}));\n/**\n * The TextEdit namespace provides helper function to create replace,\n * insert and delete edits more easily.\n */\nexport var TextEdit;\n(function (TextEdit) {\n /**\n * Creates a replace text edit.\n * @param range The range of text to be replaced.\n * @param newText The new text.\n */\n function replace(range, newText) {\n return { range: range, newText: newText };\n }\n TextEdit.replace = replace;\n /**\n * Creates an insert text edit.\n * @param position The position to insert the text at.\n * @param newText The text to be inserted.\n */\n function insert(position, newText) {\n return { range: { start: position, end: position }, newText: newText };\n }\n TextEdit.insert = insert;\n /**\n * Creates a delete text edit.\n * @param range The range of text to be deleted.\n */\n function del(range) {\n return { range: range, newText: '' };\n }\n TextEdit.del = del;\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate)\n && Is.string(candidate.newText)\n && Range.is(candidate.range);\n }\n TextEdit.is = is;\n})(TextEdit || (TextEdit = {}));\nexport var ChangeAnnotation;\n(function (ChangeAnnotation) {\n function create(label, needsConfirmation, description) {\n var result = { label: label };\n if (needsConfirmation !== undefined) {\n result.needsConfirmation = needsConfirmation;\n }\n if (description !== undefined) {\n result.description = description;\n }\n return result;\n }\n ChangeAnnotation.create = create;\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Is.string(candidate.label) &&\n (Is.boolean(candidate.needsConfirmation) || candidate.needsConfirmation === undefined) &&\n (Is.string(candidate.description) || candidate.description === undefined);\n }\n ChangeAnnotation.is = is;\n})(ChangeAnnotation || (ChangeAnnotation = {}));\nexport var ChangeAnnotationIdentifier;\n(function (ChangeAnnotationIdentifier) {\n function is(value) {\n var candidate = value;\n return Is.string(candidate);\n }\n ChangeAnnotationIdentifier.is = is;\n})(ChangeAnnotationIdentifier || (ChangeAnnotationIdentifier = {}));\nexport var AnnotatedTextEdit;\n(function (AnnotatedTextEdit) {\n /**\n * Creates an annotated replace text edit.\n *\n * @param range The range of text to be replaced.\n * @param newText The new text.\n * @param annotation The annotation.\n */\n function replace(range, newText, annotation) {\n return { range: range, newText: newText, annotationId: annotation };\n }\n AnnotatedTextEdit.replace = replace;\n /**\n * Creates an annotated insert text edit.\n *\n * @param position The position to insert the text at.\n * @param newText The text to be inserted.\n * @param annotation The annotation.\n */\n function insert(position, newText, annotation) {\n return { range: { start: position, end: position }, newText: newText, annotationId: annotation };\n }\n AnnotatedTextEdit.insert = insert;\n /**\n * Creates an annotated delete text edit.\n *\n * @param range The range of text to be deleted.\n * @param annotation The annotation.\n */\n function del(range, annotation) {\n return { range: range, newText: '', annotationId: annotation };\n }\n AnnotatedTextEdit.del = del;\n function is(value) {\n var candidate = value;\n return TextEdit.is(candidate) && (ChangeAnnotation.is(candidate.annotationId) || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n AnnotatedTextEdit.is = is;\n})(AnnotatedTextEdit || (AnnotatedTextEdit = {}));\n/**\n * The TextDocumentEdit namespace provides helper function to create\n * an edit that manipulates a text document.\n */\nexport var TextDocumentEdit;\n(function (TextDocumentEdit) {\n /**\n * Creates a new `TextDocumentEdit`\n */\n function create(textDocument, edits) {\n return { textDocument: textDocument, edits: edits };\n }\n TextDocumentEdit.create = create;\n function is(value) {\n var candidate = value;\n return Is.defined(candidate)\n && OptionalVersionedTextDocumentIdentifier.is(candidate.textDocument)\n && Array.isArray(candidate.edits);\n }\n TextDocumentEdit.is = is;\n})(TextDocumentEdit || (TextDocumentEdit = {}));\nexport var CreateFile;\n(function (CreateFile) {\n function create(uri, options, annotation) {\n var result = {\n kind: 'create',\n uri: uri\n };\n if (options !== undefined && (options.overwrite !== undefined || options.ignoreIfExists !== undefined)) {\n result.options = options;\n }\n if (annotation !== undefined) {\n result.annotationId = annotation;\n }\n return result;\n }\n CreateFile.create = create;\n function is(value) {\n var candidate = value;\n return candidate && candidate.kind === 'create' && Is.string(candidate.uri) && (candidate.options === undefined ||\n ((candidate.options.overwrite === undefined || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === undefined || Is.boolean(candidate.options.ignoreIfExists)))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n CreateFile.is = is;\n})(CreateFile || (CreateFile = {}));\nexport var RenameFile;\n(function (RenameFile) {\n function create(oldUri, newUri, options, annotation) {\n var result = {\n kind: 'rename',\n oldUri: oldUri,\n newUri: newUri\n };\n if (options !== undefined && (options.overwrite !== undefined || options.ignoreIfExists !== undefined)) {\n result.options = options;\n }\n if (annotation !== undefined) {\n result.annotationId = annotation;\n }\n return result;\n }\n RenameFile.create = create;\n function is(value) {\n var candidate = value;\n return candidate && candidate.kind === 'rename' && Is.string(candidate.oldUri) && Is.string(candidate.newUri) && (candidate.options === undefined ||\n ((candidate.options.overwrite === undefined || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === undefined || Is.boolean(candidate.options.ignoreIfExists)))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n RenameFile.is = is;\n})(RenameFile || (RenameFile = {}));\nexport var DeleteFile;\n(function (DeleteFile) {\n function create(uri, options, annotation) {\n var result = {\n kind: 'delete',\n uri: uri\n };\n if (options !== undefined && (options.recursive !== undefined || options.ignoreIfNotExists !== undefined)) {\n result.options = options;\n }\n if (annotation !== undefined) {\n result.annotationId = annotation;\n }\n return result;\n }\n DeleteFile.create = create;\n function is(value) {\n var candidate = value;\n return candidate && candidate.kind === 'delete' && Is.string(candidate.uri) && (candidate.options === undefined ||\n ((candidate.options.recursive === undefined || Is.boolean(candidate.options.recursive)) && (candidate.options.ignoreIfNotExists === undefined || Is.boolean(candidate.options.ignoreIfNotExists)))) && (candidate.annotationId === undefined || ChangeAnnotationIdentifier.is(candidate.annotationId));\n }\n DeleteFile.is = is;\n})(DeleteFile || (DeleteFile = {}));\nexport var WorkspaceEdit;\n(function (WorkspaceEdit) {\n function is(value) {\n var candidate = value;\n return candidate &&\n (candidate.changes !== undefined || candidate.documentChanges !== undefined) &&\n (candidate.documentChanges === undefined || candidate.documentChanges.every(function (change) {\n if (Is.string(change.kind)) {\n return CreateFile.is(change) || RenameFile.is(change) || DeleteFile.is(change);\n }\n else {\n return TextDocumentEdit.is(change);\n }\n }));\n }\n WorkspaceEdit.is = is;\n})(WorkspaceEdit || (WorkspaceEdit = {}));\nvar TextEditChangeImpl = /** @class */ (function () {\n function TextEditChangeImpl(edits, changeAnnotations) {\n this.edits = edits;\n this.changeAnnotations = changeAnnotations;\n }\n TextEditChangeImpl.prototype.insert = function (position, newText, annotation) {\n var edit;\n var id;\n if (annotation === undefined) {\n edit = TextEdit.insert(position, newText);\n }\n else if (ChangeAnnotationIdentifier.is(annotation)) {\n id = annotation;\n edit = AnnotatedTextEdit.insert(position, newText, annotation);\n }\n else {\n this.assertChangeAnnotations(this.changeAnnotations);\n id = this.changeAnnotations.manage(annotation);\n edit = AnnotatedTextEdit.insert(position, newText, id);\n }\n this.edits.push(edit);\n if (id !== undefined) {\n return id;\n }\n };\n TextEditChangeImpl.prototype.replace = function (range, newText, annotation) {\n var edit;\n var id;\n if (annotation === undefined) {\n edit = TextEdit.replace(range, newText);\n }\n else if (ChangeAnnotationIdentifier.is(annotation)) {\n id = annotation;\n edit = AnnotatedTextEdit.replace(range, newText, annotation);\n }\n else {\n this.assertChangeAnnotations(this.changeAnnotations);\n id = this.changeAnnotations.manage(annotation);\n edit = AnnotatedTextEdit.replace(range, newText, id);\n }\n this.edits.push(edit);\n if (id !== undefined) {\n return id;\n }\n };\n TextEditChangeImpl.prototype.delete = function (range, annotation) {\n var edit;\n var id;\n if (annotation === undefined) {\n edit = TextEdit.del(range);\n }\n else if (ChangeAnnotationIdentifier.is(annotation)) {\n id = annotation;\n edit = AnnotatedTextEdit.del(range, annotation);\n }\n else {\n this.assertChangeAnnotations(this.changeAnnotations);\n id = this.changeAnnotations.manage(annotation);\n edit = AnnotatedTextEdit.del(range, id);\n }\n this.edits.push(edit);\n if (id !== undefined) {\n return id;\n }\n };\n TextEditChangeImpl.prototype.add = function (edit) {\n this.edits.push(edit);\n };\n TextEditChangeImpl.prototype.all = function () {\n return this.edits;\n };\n TextEditChangeImpl.prototype.clear = function () {\n this.edits.splice(0, this.edits.length);\n };\n TextEditChangeImpl.prototype.assertChangeAnnotations = function (value) {\n if (value === undefined) {\n throw new Error(\"Text edit change is not configured to manage change annotations.\");\n }\n };\n return TextEditChangeImpl;\n}());\n/**\n * A helper class\n */\nvar ChangeAnnotations = /** @class */ (function () {\n function ChangeAnnotations(annotations) {\n this._annotations = annotations === undefined ? Object.create(null) : annotations;\n this._counter = 0;\n this._size = 0;\n }\n ChangeAnnotations.prototype.all = function () {\n return this._annotations;\n };\n Object.defineProperty(ChangeAnnotations.prototype, \"size\", {\n get: function () {\n return this._size;\n },\n enumerable: false,\n configurable: true\n });\n ChangeAnnotations.prototype.manage = function (idOrAnnotation, annotation) {\n var id;\n if (ChangeAnnotationIdentifier.is(idOrAnnotation)) {\n id = idOrAnnotation;\n }\n else {\n id = this.nextId();\n annotation = idOrAnnotation;\n }\n if (this._annotations[id] !== undefined) {\n throw new Error(\"Id \".concat(id, \" is already in use.\"));\n }\n if (annotation === undefined) {\n throw new Error(\"No annotation provided for id \".concat(id));\n }\n this._annotations[id] = annotation;\n this._size++;\n return id;\n };\n ChangeAnnotations.prototype.nextId = function () {\n this._counter++;\n return this._counter.toString();\n };\n return ChangeAnnotations;\n}());\n/**\n * A workspace change helps constructing changes to a workspace.\n */\nvar WorkspaceChange = /** @class */ (function () {\n function WorkspaceChange(workspaceEdit) {\n var _this = this;\n this._textEditChanges = Object.create(null);\n if (workspaceEdit !== undefined) {\n this._workspaceEdit = workspaceEdit;\n if (workspaceEdit.documentChanges) {\n this._changeAnnotations = new ChangeAnnotations(workspaceEdit.changeAnnotations);\n workspaceEdit.changeAnnotations = this._changeAnnotations.all();\n workspaceEdit.documentChanges.forEach(function (change) {\n if (TextDocumentEdit.is(change)) {\n var textEditChange = new TextEditChangeImpl(change.edits, _this._changeAnnotations);\n _this._textEditChanges[change.textDocument.uri] = textEditChange;\n }\n });\n }\n else if (workspaceEdit.changes) {\n Object.keys(workspaceEdit.changes).forEach(function (key) {\n var textEditChange = new TextEditChangeImpl(workspaceEdit.changes[key]);\n _this._textEditChanges[key] = textEditChange;\n });\n }\n }\n else {\n this._workspaceEdit = {};\n }\n }\n Object.defineProperty(WorkspaceChange.prototype, \"edit\", {\n /**\n * Returns the underlying [WorkspaceEdit](#WorkspaceEdit) literal\n * use to be returned from a workspace edit operation like rename.\n */\n get: function () {\n this.initDocumentChanges();\n if (this._changeAnnotations !== undefined) {\n if (this._changeAnnotations.size === 0) {\n this._workspaceEdit.changeAnnotations = undefined;\n }\n else {\n this._workspaceEdit.changeAnnotations = this._changeAnnotations.all();\n }\n }\n return this._workspaceEdit;\n },\n enumerable: false,\n configurable: true\n });\n WorkspaceChange.prototype.getTextEditChange = function (key) {\n if (OptionalVersionedTextDocumentIdentifier.is(key)) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n var textDocument = { uri: key.uri, version: key.version };\n var result = this._textEditChanges[textDocument.uri];\n if (!result) {\n var edits = [];\n var textDocumentEdit = {\n textDocument: textDocument,\n edits: edits\n };\n this._workspaceEdit.documentChanges.push(textDocumentEdit);\n result = new TextEditChangeImpl(edits, this._changeAnnotations);\n this._textEditChanges[textDocument.uri] = result;\n }\n return result;\n }\n else {\n this.initChanges();\n if (this._workspaceEdit.changes === undefined) {\n throw new Error('Workspace edit is not configured for normal text edit changes.');\n }\n var result = this._textEditChanges[key];\n if (!result) {\n var edits = [];\n this._workspaceEdit.changes[key] = edits;\n result = new TextEditChangeImpl(edits);\n this._textEditChanges[key] = result;\n }\n return result;\n }\n };\n WorkspaceChange.prototype.initDocumentChanges = function () {\n if (this._workspaceEdit.documentChanges === undefined && this._workspaceEdit.changes === undefined) {\n this._changeAnnotations = new ChangeAnnotations();\n this._workspaceEdit.documentChanges = [];\n this._workspaceEdit.changeAnnotations = this._changeAnnotations.all();\n }\n };\n WorkspaceChange.prototype.initChanges = function () {\n if (this._workspaceEdit.documentChanges === undefined && this._workspaceEdit.changes === undefined) {\n this._workspaceEdit.changes = Object.create(null);\n }\n };\n WorkspaceChange.prototype.createFile = function (uri, optionsOrAnnotation, options) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n var annotation;\n if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) {\n annotation = optionsOrAnnotation;\n }\n else {\n options = optionsOrAnnotation;\n }\n var operation;\n var id;\n if (annotation === undefined) {\n operation = CreateFile.create(uri, options);\n }\n else {\n id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation);\n operation = CreateFile.create(uri, options, id);\n }\n this._workspaceEdit.documentChanges.push(operation);\n if (id !== undefined) {\n return id;\n }\n };\n WorkspaceChange.prototype.renameFile = function (oldUri, newUri, optionsOrAnnotation, options) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n var annotation;\n if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) {\n annotation = optionsOrAnnotation;\n }\n else {\n options = optionsOrAnnotation;\n }\n var operation;\n var id;\n if (annotation === undefined) {\n operation = RenameFile.create(oldUri, newUri, options);\n }\n else {\n id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation);\n operation = RenameFile.create(oldUri, newUri, options, id);\n }\n this._workspaceEdit.documentChanges.push(operation);\n if (id !== undefined) {\n return id;\n }\n };\n WorkspaceChange.prototype.deleteFile = function (uri, optionsOrAnnotation, options) {\n this.initDocumentChanges();\n if (this._workspaceEdit.documentChanges === undefined) {\n throw new Error('Workspace edit is not configured for document changes.');\n }\n var annotation;\n if (ChangeAnnotation.is(optionsOrAnnotation) || ChangeAnnotationIdentifier.is(optionsOrAnnotation)) {\n annotation = optionsOrAnnotation;\n }\n else {\n options = optionsOrAnnotation;\n }\n var operation;\n var id;\n if (annotation === undefined) {\n operation = DeleteFile.create(uri, options);\n }\n else {\n id = ChangeAnnotationIdentifier.is(annotation) ? annotation : this._changeAnnotations.manage(annotation);\n operation = DeleteFile.create(uri, options, id);\n }\n this._workspaceEdit.documentChanges.push(operation);\n if (id !== undefined) {\n return id;\n }\n };\n return WorkspaceChange;\n}());\nexport { WorkspaceChange };\n/**\n * The TextDocumentIdentifier namespace provides helper functions to work with\n * [TextDocumentIdentifier](#TextDocumentIdentifier) literals.\n */\nexport var TextDocumentIdentifier;\n(function (TextDocumentIdentifier) {\n /**\n * Creates a new TextDocumentIdentifier literal.\n * @param uri The document's uri.\n */\n function create(uri) {\n return { uri: uri };\n }\n TextDocumentIdentifier.create = create;\n /**\n * Checks whether the given literal conforms to the [TextDocumentIdentifier](#TextDocumentIdentifier) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri);\n }\n TextDocumentIdentifier.is = is;\n})(TextDocumentIdentifier || (TextDocumentIdentifier = {}));\n/**\n * The VersionedTextDocumentIdentifier namespace provides helper functions to work with\n * [VersionedTextDocumentIdentifier](#VersionedTextDocumentIdentifier) literals.\n */\nexport var VersionedTextDocumentIdentifier;\n(function (VersionedTextDocumentIdentifier) {\n /**\n * Creates a new VersionedTextDocumentIdentifier literal.\n * @param uri The document's uri.\n * @param version The document's version.\n */\n function create(uri, version) {\n return { uri: uri, version: version };\n }\n VersionedTextDocumentIdentifier.create = create;\n /**\n * Checks whether the given literal conforms to the [VersionedTextDocumentIdentifier](#VersionedTextDocumentIdentifier) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && Is.integer(candidate.version);\n }\n VersionedTextDocumentIdentifier.is = is;\n})(VersionedTextDocumentIdentifier || (VersionedTextDocumentIdentifier = {}));\n/**\n * The OptionalVersionedTextDocumentIdentifier namespace provides helper functions to work with\n * [OptionalVersionedTextDocumentIdentifier](#OptionalVersionedTextDocumentIdentifier) literals.\n */\nexport var OptionalVersionedTextDocumentIdentifier;\n(function (OptionalVersionedTextDocumentIdentifier) {\n /**\n * Creates a new OptionalVersionedTextDocumentIdentifier literal.\n * @param uri The document's uri.\n * @param version The document's version.\n */\n function create(uri, version) {\n return { uri: uri, version: version };\n }\n OptionalVersionedTextDocumentIdentifier.create = create;\n /**\n * Checks whether the given literal conforms to the [OptionalVersionedTextDocumentIdentifier](#OptionalVersionedTextDocumentIdentifier) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && (candidate.version === null || Is.integer(candidate.version));\n }\n OptionalVersionedTextDocumentIdentifier.is = is;\n})(OptionalVersionedTextDocumentIdentifier || (OptionalVersionedTextDocumentIdentifier = {}));\n/**\n * The TextDocumentItem namespace provides helper functions to work with\n * [TextDocumentItem](#TextDocumentItem) literals.\n */\nexport var TextDocumentItem;\n(function (TextDocumentItem) {\n /**\n * Creates a new TextDocumentItem literal.\n * @param uri The document's uri.\n * @param languageId The document's language identifier.\n * @param version The document's version number.\n * @param text The document's text.\n */\n function create(uri, languageId, version, text) {\n return { uri: uri, languageId: languageId, version: version, text: text };\n }\n TextDocumentItem.create = create;\n /**\n * Checks whether the given literal conforms to the [TextDocumentItem](#TextDocumentItem) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && Is.string(candidate.languageId) && Is.integer(candidate.version) && Is.string(candidate.text);\n }\n TextDocumentItem.is = is;\n})(TextDocumentItem || (TextDocumentItem = {}));\n/**\n * Describes the content type that a client supports in various\n * result literals like `Hover`, `ParameterInfo` or `CompletionItem`.\n *\n * Please note that `MarkupKinds` must not start with a `$`. This kinds\n * are reserved for internal usage.\n */\nexport var MarkupKind;\n(function (MarkupKind) {\n /**\n * Plain text is supported as a content format\n */\n MarkupKind.PlainText = 'plaintext';\n /**\n * Markdown is supported as a content format\n */\n MarkupKind.Markdown = 'markdown';\n /**\n * Checks whether the given value is a value of the [MarkupKind](#MarkupKind) type.\n */\n function is(value) {\n var candidate = value;\n return candidate === MarkupKind.PlainText || candidate === MarkupKind.Markdown;\n }\n MarkupKind.is = is;\n})(MarkupKind || (MarkupKind = {}));\nexport var MarkupContent;\n(function (MarkupContent) {\n /**\n * Checks whether the given value conforms to the [MarkupContent](#MarkupContent) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(value) && MarkupKind.is(candidate.kind) && Is.string(candidate.value);\n }\n MarkupContent.is = is;\n})(MarkupContent || (MarkupContent = {}));\n/**\n * The kind of a completion entry.\n */\nexport var CompletionItemKind;\n(function (CompletionItemKind) {\n CompletionItemKind.Text = 1;\n CompletionItemKind.Method = 2;\n CompletionItemKind.Function = 3;\n CompletionItemKind.Constructor = 4;\n CompletionItemKind.Field = 5;\n CompletionItemKind.Variable = 6;\n CompletionItemKind.Class = 7;\n CompletionItemKind.Interface = 8;\n CompletionItemKind.Module = 9;\n CompletionItemKind.Property = 10;\n CompletionItemKind.Unit = 11;\n CompletionItemKind.Value = 12;\n CompletionItemKind.Enum = 13;\n CompletionItemKind.Keyword = 14;\n CompletionItemKind.Snippet = 15;\n CompletionItemKind.Color = 16;\n CompletionItemKind.File = 17;\n CompletionItemKind.Reference = 18;\n CompletionItemKind.Folder = 19;\n CompletionItemKind.EnumMember = 20;\n CompletionItemKind.Constant = 21;\n CompletionItemKind.Struct = 22;\n CompletionItemKind.Event = 23;\n CompletionItemKind.Operator = 24;\n CompletionItemKind.TypeParameter = 25;\n})(CompletionItemKind || (CompletionItemKind = {}));\n/**\n * Defines whether the insert text in a completion item should be interpreted as\n * plain text or a snippet.\n */\nexport var InsertTextFormat;\n(function (InsertTextFormat) {\n /**\n * The primary text to be inserted is treated as a plain string.\n */\n InsertTextFormat.PlainText = 1;\n /**\n * The primary text to be inserted is treated as a snippet.\n *\n * A snippet can define tab stops and placeholders with `$1`, `$2`\n * and `${3:foo}`. `$0` defines the final tab stop, it defaults to\n * the end of the snippet. Placeholders with equal identifiers are linked,\n * that is typing in one will update others too.\n *\n * See also: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#snippet_syntax\n */\n InsertTextFormat.Snippet = 2;\n})(InsertTextFormat || (InsertTextFormat = {}));\n/**\n * Completion item tags are extra annotations that tweak the rendering of a completion\n * item.\n *\n * @since 3.15.0\n */\nexport var CompletionItemTag;\n(function (CompletionItemTag) {\n /**\n * Render a completion as obsolete, usually using a strike-out.\n */\n CompletionItemTag.Deprecated = 1;\n})(CompletionItemTag || (CompletionItemTag = {}));\n/**\n * The InsertReplaceEdit namespace provides functions to deal with insert / replace edits.\n *\n * @since 3.16.0\n */\nexport var InsertReplaceEdit;\n(function (InsertReplaceEdit) {\n /**\n * Creates a new insert / replace edit\n */\n function create(newText, insert, replace) {\n return { newText: newText, insert: insert, replace: replace };\n }\n InsertReplaceEdit.create = create;\n /**\n * Checks whether the given literal conforms to the [InsertReplaceEdit](#InsertReplaceEdit) interface.\n */\n function is(value) {\n var candidate = value;\n return candidate && Is.string(candidate.newText) && Range.is(candidate.insert) && Range.is(candidate.replace);\n }\n InsertReplaceEdit.is = is;\n})(InsertReplaceEdit || (InsertReplaceEdit = {}));\n/**\n * How whitespace and indentation is handled during completion\n * item insertion.\n *\n * @since 3.16.0\n */\nexport var InsertTextMode;\n(function (InsertTextMode) {\n /**\n * The insertion or replace strings is taken as it is. If the\n * value is multi line the lines below the cursor will be\n * inserted using the indentation defined in the string value.\n * The client will not apply any kind of adjustments to the\n * string.\n */\n InsertTextMode.asIs = 1;\n /**\n * The editor adjusts leading whitespace of new lines so that\n * they match the indentation up to the cursor of the line for\n * which the item is accepted.\n *\n * Consider a line like this: <2tabs><cursor><3tabs>foo. Accepting a\n * multi line completion item is indented using 2 tabs and all\n * following lines inserted will be indented using 2 tabs as well.\n */\n InsertTextMode.adjustIndentation = 2;\n})(InsertTextMode || (InsertTextMode = {}));\nexport var CompletionItemLabelDetails;\n(function (CompletionItemLabelDetails) {\n function is(value) {\n var candidate = value;\n return candidate && (Is.string(candidate.detail) || candidate.detail === undefined) &&\n (Is.string(candidate.description) || candidate.description === undefined);\n }\n CompletionItemLabelDetails.is = is;\n})(CompletionItemLabelDetails || (CompletionItemLabelDetails = {}));\n/**\n * The CompletionItem namespace provides functions to deal with\n * completion items.\n */\nexport var CompletionItem;\n(function (CompletionItem) {\n /**\n * Create a completion item and seed it with a label.\n * @param label The completion item's label\n */\n function create(label) {\n return { label: label };\n }\n CompletionItem.create = create;\n})(CompletionItem || (CompletionItem = {}));\n/**\n * The CompletionList namespace provides functions to deal with\n * completion lists.\n */\nexport var CompletionList;\n(function (CompletionList) {\n /**\n * Creates a new completion list.\n *\n * @param items The completion items.\n * @param isIncomplete The list is not complete.\n */\n function create(items, isIncomplete) {\n return { items: items ? items : [], isIncomplete: !!isIncomplete };\n }\n CompletionList.create = create;\n})(CompletionList || (CompletionList = {}));\nexport var MarkedString;\n(function (MarkedString) {\n /**\n * Creates a marked string from plain text.\n *\n * @param plainText The plain text.\n */\n function fromPlainText(plainText) {\n return plainText.replace(/[\\\\`*_{}[\\]()#+\\-.!]/g, '\\\\$&'); // escape markdown syntax tokens: http://daringfireball.net/projects/markdown/syntax#backslash\n }\n MarkedString.fromPlainText = fromPlainText;\n /**\n * Checks whether the given value conforms to the [MarkedString](#MarkedString) type.\n */\n function is(value) {\n var candidate = value;\n return Is.string(candidate) || (Is.objectLiteral(candidate) && Is.string(candidate.language) && Is.string(candidate.value));\n }\n MarkedString.is = is;\n})(MarkedString || (MarkedString = {}));\nexport var Hover;\n(function (Hover) {\n /**\n * Checks whether the given value conforms to the [Hover](#Hover) interface.\n */\n function is(value) {\n var candidate = value;\n return !!candidate && Is.objectLiteral(candidate) && (MarkupContent.is(candidate.contents) ||\n MarkedString.is(candidate.contents) ||\n Is.typedArray(candidate.contents, MarkedString.is)) && (value.range === undefined || Range.is(value.range));\n }\n Hover.is = is;\n})(Hover || (Hover = {}));\n/**\n * The ParameterInformation namespace provides helper functions to work with\n * [ParameterInformation](#ParameterInformation) literals.\n */\nexport var ParameterInformation;\n(function (ParameterInformation) {\n /**\n * Creates a new parameter information literal.\n *\n * @param label A label string.\n * @param documentation A doc string.\n */\n function create(label, documentation) {\n return documentation ? { label: label, documentation: documentation } : { label: label };\n }\n ParameterInformation.create = create;\n})(ParameterInformation || (ParameterInformation = {}));\n/**\n * The SignatureInformation namespace provides helper functions to work with\n * [SignatureInformation](#SignatureInformation) literals.\n */\nexport var SignatureInformation;\n(function (SignatureInformation) {\n function create(label, documentation) {\n var parameters = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n parameters[_i - 2] = arguments[_i];\n }\n var result = { label: label };\n if (Is.defined(documentation)) {\n result.documentation = documentation;\n }\n if (Is.defined(parameters)) {\n result.parameters = parameters;\n }\n else {\n result.parameters = [];\n }\n return result;\n }\n SignatureInformation.create = create;\n})(SignatureInformation || (SignatureInformation = {}));\n/**\n * A document highlight kind.\n */\nexport var DocumentHighlightKind;\n(function (DocumentHighlightKind) {\n /**\n * A textual occurrence.\n */\n DocumentHighlightKind.Text = 1;\n /**\n * Read-access of a symbol, like reading a variable.\n */\n DocumentHighlightKind.Read = 2;\n /**\n * Write-access of a symbol, like writing to a variable.\n */\n DocumentHighlightKind.Write = 3;\n})(DocumentHighlightKind || (DocumentHighlightKind = {}));\n/**\n * DocumentHighlight namespace to provide helper functions to work with\n * [DocumentHighlight](#DocumentHighlight) literals.\n */\nexport var DocumentHighlight;\n(function (DocumentHighlight) {\n /**\n * Create a DocumentHighlight object.\n * @param range The range the highlight applies to.\n * @param kind The highlight kind\n */\n function create(range, kind) {\n var result = { range: range };\n if (Is.number(kind)) {\n result.kind = kind;\n }\n return result;\n }\n DocumentHighlight.create = create;\n})(DocumentHighlight || (DocumentHighlight = {}));\n/**\n * A symbol kind.\n */\nexport var SymbolKind;\n(function (SymbolKind) {\n SymbolKind.File = 1;\n SymbolKind.Module = 2;\n SymbolKind.Namespace = 3;\n SymbolKind.Package = 4;\n SymbolKind.Class = 5;\n SymbolKind.Method = 6;\n SymbolKind.Property = 7;\n SymbolKind.Field = 8;\n SymbolKind.Constructor = 9;\n SymbolKind.Enum = 10;\n SymbolKind.Interface = 11;\n SymbolKind.Function = 12;\n SymbolKind.Variable = 13;\n SymbolKind.Constant = 14;\n SymbolKind.String = 15;\n SymbolKind.Number = 16;\n SymbolKind.Boolean = 17;\n SymbolKind.Array = 18;\n SymbolKind.Object = 19;\n SymbolKind.Key = 20;\n SymbolKind.Null = 21;\n SymbolKind.EnumMember = 22;\n SymbolKind.Struct = 23;\n SymbolKind.Event = 24;\n SymbolKind.Operator = 25;\n SymbolKind.TypeParameter = 26;\n})(SymbolKind || (SymbolKind = {}));\n/**\n * Symbol tags are extra annotations that tweak the rendering of a symbol.\n *\n * @since 3.16\n */\nexport var SymbolTag;\n(function (SymbolTag) {\n /**\n * Render a symbol as obsolete, usually using a strike-out.\n */\n SymbolTag.Deprecated = 1;\n})(SymbolTag || (SymbolTag = {}));\nexport var SymbolInformation;\n(function (SymbolInformation) {\n /**\n * Creates a new symbol information literal.\n *\n * @param name The name of the symbol.\n * @param kind The kind of the symbol.\n * @param range The range of the location of the symbol.\n * @param uri The resource of the location of symbol.\n * @param containerName The name of the symbol containing the symbol.\n */\n function create(name, kind, range, uri, containerName) {\n var result = {\n name: name,\n kind: kind,\n location: { uri: uri, range: range }\n };\n if (containerName) {\n result.containerName = containerName;\n }\n return result;\n }\n SymbolInformation.create = create;\n})(SymbolInformation || (SymbolInformation = {}));\nexport var WorkspaceSymbol;\n(function (WorkspaceSymbol) {\n /**\n * Create a new workspace symbol.\n *\n * @param name The name of the symbol.\n * @param kind The kind of the symbol.\n * @param uri The resource of the location of the symbol.\n * @param range An options range of the location.\n * @returns A WorkspaceSymbol.\n */\n function create(name, kind, uri, range) {\n return range !== undefined\n ? { name: name, kind: kind, location: { uri: uri, range: range } }\n : { name: name, kind: kind, location: { uri: uri } };\n }\n WorkspaceSymbol.create = create;\n})(WorkspaceSymbol || (WorkspaceSymbol = {}));\nexport var DocumentSymbol;\n(function (DocumentSymbol) {\n /**\n * Creates a new symbol information literal.\n *\n * @param name The name of the symbol.\n * @param detail The detail of the symbol.\n * @param kind The kind of the symbol.\n * @param range The range of the symbol.\n * @param selectionRange The selectionRange of the symbol.\n * @param children Children of the symbol.\n */\n function create(name, detail, kind, range, selectionRange, children) {\n var result = {\n name: name,\n detail: detail,\n kind: kind,\n range: range,\n selectionRange: selectionRange\n };\n if (children !== undefined) {\n result.children = children;\n }\n return result;\n }\n DocumentSymbol.create = create;\n /**\n * Checks whether the given literal conforms to the [DocumentSymbol](#DocumentSymbol) interface.\n */\n function is(value) {\n var candidate = value;\n return candidate &&\n Is.string(candidate.name) && Is.number(candidate.kind) &&\n Range.is(candidate.range) && Range.is(candidate.selectionRange) &&\n (candidate.detail === undefined || Is.string(candidate.detail)) &&\n (candidate.deprecated === undefined || Is.boolean(candidate.deprecated)) &&\n (candidate.children === undefined || Array.isArray(candidate.children)) &&\n (candidate.tags === undefined || Array.isArray(candidate.tags));\n }\n DocumentSymbol.is = is;\n})(DocumentSymbol || (DocumentSymbol = {}));\n/**\n * A set of predefined code action kinds\n */\nexport var CodeActionKind;\n(function (CodeActionKind) {\n /**\n * Empty kind.\n */\n CodeActionKind.Empty = '';\n /**\n * Base kind for quickfix actions: 'quickfix'\n */\n CodeActionKind.QuickFix = 'quickfix';\n /**\n * Base kind for refactoring actions: 'refactor'\n */\n CodeActionKind.Refactor = 'refactor';\n /**\n * Base kind for refactoring extraction actions: 'refactor.extract'\n *\n * Example extract actions:\n *\n * - Extract method\n * - Extract function\n * - Extract variable\n * - Extract interface from class\n * - ...\n */\n CodeActionKind.RefactorExtract = 'refactor.extract';\n /**\n * Base kind for refactoring inline actions: 'refactor.inline'\n *\n * Example inline actions:\n *\n * - Inline function\n * - Inline variable\n * - Inline constant\n * - ...\n */\n CodeActionKind.RefactorInline = 'refactor.inline';\n /**\n * Base kind for refactoring rewrite actions: 'refactor.rewrite'\n *\n * Example rewrite actions:\n *\n * - Convert JavaScript function to class\n * - Add or remove parameter\n * - Encapsulate field\n * - Make method static\n * - Move method to base class\n * - ...\n */\n CodeActionKind.RefactorRewrite = 'refactor.rewrite';\n /**\n * Base kind for source actions: `source`\n *\n * Source code actions apply to the entire file.\n */\n CodeActionKind.Source = 'source';\n /**\n * Base kind for an organize imports source action: `source.organizeImports`\n */\n CodeActionKind.SourceOrganizeImports = 'source.organizeImports';\n /**\n * Base kind for auto-fix source actions: `source.fixAll`.\n *\n * Fix all actions automatically fix errors that have a clear fix that do not require user input.\n * They should not suppress errors or perform unsafe fixes such as generating new types or classes.\n *\n * @since 3.15.0\n */\n CodeActionKind.SourceFixAll = 'source.fixAll';\n})(CodeActionKind || (CodeActionKind = {}));\n/**\n * The reason why code actions were requested.\n *\n * @since 3.17.0\n */\nexport var CodeActionTriggerKind;\n(function (CodeActionTriggerKind) {\n /**\n * Code actions were explicitly requested by the user or by an extension.\n */\n CodeActionTriggerKind.Invoked = 1;\n /**\n * Code actions were requested automatically.\n *\n * This typically happens when current selection in a file changes, but can\n * also be triggered when file content changes.\n */\n CodeActionTriggerKind.Automatic = 2;\n})(CodeActionTriggerKind || (CodeActionTriggerKind = {}));\n/**\n * The CodeActionContext namespace provides helper functions to work with\n * [CodeActionContext](#CodeActionContext) literals.\n */\nexport var CodeActionContext;\n(function (CodeActionContext) {\n /**\n * Creates a new CodeActionContext literal.\n */\n function create(diagnostics, only, triggerKind) {\n var result = { diagnostics: diagnostics };\n if (only !== undefined && only !== null) {\n result.only = only;\n }\n if (triggerKind !== undefined && triggerKind !== null) {\n result.triggerKind = triggerKind;\n }\n return result;\n }\n CodeActionContext.create = create;\n /**\n * Checks whether the given literal conforms to the [CodeActionContext](#CodeActionContext) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.typedArray(candidate.diagnostics, Diagnostic.is)\n && (candidate.only === undefined || Is.typedArray(candidate.only, Is.string))\n && (candidate.triggerKind === undefined || candidate.triggerKind === CodeActionTriggerKind.Invoked || candidate.triggerKind === CodeActionTriggerKind.Automatic);\n }\n CodeActionContext.is = is;\n})(CodeActionContext || (CodeActionContext = {}));\nexport var CodeAction;\n(function (CodeAction) {\n function create(title, kindOrCommandOrEdit, kind) {\n var result = { title: title };\n var checkKind = true;\n if (typeof kindOrCommandOrEdit === 'string') {\n checkKind = false;\n result.kind = kindOrCommandOrEdit;\n }\n else if (Command.is(kindOrCommandOrEdit)) {\n result.command = kindOrCommandOrEdit;\n }\n else {\n result.edit = kindOrCommandOrEdit;\n }\n if (checkKind && kind !== undefined) {\n result.kind = kind;\n }\n return result;\n }\n CodeAction.create = create;\n function is(value) {\n var candidate = value;\n return candidate && Is.string(candidate.title) &&\n (candidate.diagnostics === undefined || Is.typedArray(candidate.diagnostics, Diagnostic.is)) &&\n (candidate.kind === undefined || Is.string(candidate.kind)) &&\n (candidate.edit !== undefined || candidate.command !== undefined) &&\n (candidate.command === undefined || Command.is(candidate.command)) &&\n (candidate.isPreferred === undefined || Is.boolean(candidate.isPreferred)) &&\n (candidate.edit === undefined || WorkspaceEdit.is(candidate.edit));\n }\n CodeAction.is = is;\n})(CodeAction || (CodeAction = {}));\n/**\n * The CodeLens namespace provides helper functions to work with\n * [CodeLens](#CodeLens) literals.\n */\nexport var CodeLens;\n(function (CodeLens) {\n /**\n * Creates a new CodeLens literal.\n */\n function create(range, data) {\n var result = { range: range };\n if (Is.defined(data)) {\n result.data = data;\n }\n return result;\n }\n CodeLens.create = create;\n /**\n * Checks whether the given literal conforms to the [CodeLens](#CodeLens) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.command) || Command.is(candidate.command));\n }\n CodeLens.is = is;\n})(CodeLens || (CodeLens = {}));\n/**\n * The FormattingOptions namespace provides helper functions to work with\n * [FormattingOptions](#FormattingOptions) literals.\n */\nexport var FormattingOptions;\n(function (FormattingOptions) {\n /**\n * Creates a new FormattingOptions literal.\n */\n function create(tabSize, insertSpaces) {\n return { tabSize: tabSize, insertSpaces: insertSpaces };\n }\n FormattingOptions.create = create;\n /**\n * Checks whether the given literal conforms to the [FormattingOptions](#FormattingOptions) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.uinteger(candidate.tabSize) && Is.boolean(candidate.insertSpaces);\n }\n FormattingOptions.is = is;\n})(FormattingOptions || (FormattingOptions = {}));\n/**\n * The DocumentLink namespace provides helper functions to work with\n * [DocumentLink](#DocumentLink) literals.\n */\nexport var DocumentLink;\n(function (DocumentLink) {\n /**\n * Creates a new DocumentLink literal.\n */\n function create(range, target, data) {\n return { range: range, target: target, data: data };\n }\n DocumentLink.create = create;\n /**\n * Checks whether the given literal conforms to the [DocumentLink](#DocumentLink) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.target) || Is.string(candidate.target));\n }\n DocumentLink.is = is;\n})(DocumentLink || (DocumentLink = {}));\n/**\n * The SelectionRange namespace provides helper function to work with\n * SelectionRange literals.\n */\nexport var SelectionRange;\n(function (SelectionRange) {\n /**\n * Creates a new SelectionRange\n * @param range the range.\n * @param parent an optional parent.\n */\n function create(range, parent) {\n return { range: range, parent: parent };\n }\n SelectionRange.create = create;\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Range.is(candidate.range) && (candidate.parent === undefined || SelectionRange.is(candidate.parent));\n }\n SelectionRange.is = is;\n})(SelectionRange || (SelectionRange = {}));\n/**\n * A set of predefined token types. This set is not fixed\n * an clients can specify additional token types via the\n * corresponding client capabilities.\n *\n * @since 3.16.0\n */\nexport var SemanticTokenTypes;\n(function (SemanticTokenTypes) {\n SemanticTokenTypes[\"namespace\"] = \"namespace\";\n /**\n * Represents a generic type. Acts as a fallback for types which can't be mapped to\n * a specific type like class or enum.\n */\n SemanticTokenTypes[\"type\"] = \"type\";\n SemanticTokenTypes[\"class\"] = \"class\";\n SemanticTokenTypes[\"enum\"] = \"enum\";\n SemanticTokenTypes[\"interface\"] = \"interface\";\n SemanticTokenTypes[\"struct\"] = \"struct\";\n SemanticTokenTypes[\"typeParameter\"] = \"typeParameter\";\n SemanticTokenTypes[\"parameter\"] = \"parameter\";\n SemanticTokenTypes[\"variable\"] = \"variable\";\n SemanticTokenTypes[\"property\"] = \"property\";\n SemanticTokenTypes[\"enumMember\"] = \"enumMember\";\n SemanticTokenTypes[\"event\"] = \"event\";\n SemanticTokenTypes[\"function\"] = \"function\";\n SemanticTokenTypes[\"method\"] = \"method\";\n SemanticTokenTypes[\"macro\"] = \"macro\";\n SemanticTokenTypes[\"keyword\"] = \"keyword\";\n SemanticTokenTypes[\"modifier\"] = \"modifier\";\n SemanticTokenTypes[\"comment\"] = \"comment\";\n SemanticTokenTypes[\"string\"] = \"string\";\n SemanticTokenTypes[\"number\"] = \"number\";\n SemanticTokenTypes[\"regexp\"] = \"regexp\";\n SemanticTokenTypes[\"operator\"] = \"operator\";\n /**\n * @since 3.17.0\n */\n SemanticTokenTypes[\"decorator\"] = \"decorator\";\n})(SemanticTokenTypes || (SemanticTokenTypes = {}));\n/**\n * A set of predefined token modifiers. This set is not fixed\n * an clients can specify additional token types via the\n * corresponding client capabilities.\n *\n * @since 3.16.0\n */\nexport var SemanticTokenModifiers;\n(function (SemanticTokenModifiers) {\n SemanticTokenModifiers[\"declaration\"] = \"declaration\";\n SemanticTokenModifiers[\"definition\"] = \"definition\";\n SemanticTokenModifiers[\"readonly\"] = \"readonly\";\n SemanticTokenModifiers[\"static\"] = \"static\";\n SemanticTokenModifiers[\"deprecated\"] = \"deprecated\";\n SemanticTokenModifiers[\"abstract\"] = \"abstract\";\n SemanticTokenModifiers[\"async\"] = \"async\";\n SemanticTokenModifiers[\"modification\"] = \"modification\";\n SemanticTokenModifiers[\"documentation\"] = \"documentation\";\n SemanticTokenModifiers[\"defaultLibrary\"] = \"defaultLibrary\";\n})(SemanticTokenModifiers || (SemanticTokenModifiers = {}));\n/**\n * @since 3.16.0\n */\nexport var SemanticTokens;\n(function (SemanticTokens) {\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && (candidate.resultId === undefined || typeof candidate.resultId === 'string') &&\n Array.isArray(candidate.data) && (candidate.data.length === 0 || typeof candidate.data[0] === 'number');\n }\n SemanticTokens.is = is;\n})(SemanticTokens || (SemanticTokens = {}));\n/**\n * The InlineValueText namespace provides functions to deal with InlineValueTexts.\n *\n * @since 3.17.0\n */\nexport var InlineValueText;\n(function (InlineValueText) {\n /**\n * Creates a new InlineValueText literal.\n */\n function create(range, text) {\n return { range: range, text: text };\n }\n InlineValueText.create = create;\n function is(value) {\n var candidate = value;\n return candidate !== undefined && candidate !== null && Range.is(candidate.range) && Is.string(candidate.text);\n }\n InlineValueText.is = is;\n})(InlineValueText || (InlineValueText = {}));\n/**\n * The InlineValueVariableLookup namespace provides functions to deal with InlineValueVariableLookups.\n *\n * @since 3.17.0\n */\nexport var InlineValueVariableLookup;\n(function (InlineValueVariableLookup) {\n /**\n * Creates a new InlineValueText literal.\n */\n function create(range, variableName, caseSensitiveLookup) {\n return { range: range, variableName: variableName, caseSensitiveLookup: caseSensitiveLookup };\n }\n InlineValueVariableLookup.create = create;\n function is(value) {\n var candidate = value;\n return candidate !== undefined && candidate !== null && Range.is(candidate.range) && Is.boolean(candidate.caseSensitiveLookup)\n && (Is.string(candidate.variableName) || candidate.variableName === undefined);\n }\n InlineValueVariableLookup.is = is;\n})(InlineValueVariableLookup || (InlineValueVariableLookup = {}));\n/**\n * The InlineValueEvaluatableExpression namespace provides functions to deal with InlineValueEvaluatableExpression.\n *\n * @since 3.17.0\n */\nexport var InlineValueEvaluatableExpression;\n(function (InlineValueEvaluatableExpression) {\n /**\n * Creates a new InlineValueEvaluatableExpression literal.\n */\n function create(range, expression) {\n return { range: range, expression: expression };\n }\n InlineValueEvaluatableExpression.create = create;\n function is(value) {\n var candidate = value;\n return candidate !== undefined && candidate !== null && Range.is(candidate.range)\n && (Is.string(candidate.expression) || candidate.expression === undefined);\n }\n InlineValueEvaluatableExpression.is = is;\n})(InlineValueEvaluatableExpression || (InlineValueEvaluatableExpression = {}));\n/**\n * The InlineValueContext namespace provides helper functions to work with\n * [InlineValueContext](#InlineValueContext) literals.\n *\n * @since 3.17.0\n */\nexport var InlineValueContext;\n(function (InlineValueContext) {\n /**\n * Creates a new InlineValueContext literal.\n */\n function create(frameId, stoppedLocation) {\n return { frameId: frameId, stoppedLocation: stoppedLocation };\n }\n InlineValueContext.create = create;\n /**\n * Checks whether the given literal conforms to the [InlineValueContext](#InlineValueContext) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Range.is(value.stoppedLocation);\n }\n InlineValueContext.is = is;\n})(InlineValueContext || (InlineValueContext = {}));\n/**\n * Inlay hint kinds.\n *\n * @since 3.17.0\n */\nexport var InlayHintKind;\n(function (InlayHintKind) {\n /**\n * An inlay hint that for a type annotation.\n */\n InlayHintKind.Type = 1;\n /**\n * An inlay hint that is for a parameter.\n */\n InlayHintKind.Parameter = 2;\n function is(value) {\n return value === 1 || value === 2;\n }\n InlayHintKind.is = is;\n})(InlayHintKind || (InlayHintKind = {}));\nexport var InlayHintLabelPart;\n(function (InlayHintLabelPart) {\n function create(value) {\n return { value: value };\n }\n InlayHintLabelPart.create = create;\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate)\n && (candidate.tooltip === undefined || Is.string(candidate.tooltip) || MarkupContent.is(candidate.tooltip))\n && (candidate.location === undefined || Location.is(candidate.location))\n && (candidate.command === undefined || Command.is(candidate.command));\n }\n InlayHintLabelPart.is = is;\n})(InlayHintLabelPart || (InlayHintLabelPart = {}));\nexport var InlayHint;\n(function (InlayHint) {\n function create(position, label, kind) {\n var result = { position: position, label: label };\n if (kind !== undefined) {\n result.kind = kind;\n }\n return result;\n }\n InlayHint.create = create;\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && Position.is(candidate.position)\n && (Is.string(candidate.label) || Is.typedArray(candidate.label, InlayHintLabelPart.is))\n && (candidate.kind === undefined || InlayHintKind.is(candidate.kind))\n && (candidate.textEdits === undefined) || Is.typedArray(candidate.textEdits, TextEdit.is)\n && (candidate.tooltip === undefined || Is.string(candidate.tooltip) || MarkupContent.is(candidate.tooltip))\n && (candidate.paddingLeft === undefined || Is.boolean(candidate.paddingLeft))\n && (candidate.paddingRight === undefined || Is.boolean(candidate.paddingRight));\n }\n InlayHint.is = is;\n})(InlayHint || (InlayHint = {}));\nexport var WorkspaceFolder;\n(function (WorkspaceFolder) {\n function is(value) {\n var candidate = value;\n return Is.objectLiteral(candidate) && URI.is(candidate.uri) && Is.string(candidate.name);\n }\n WorkspaceFolder.is = is;\n})(WorkspaceFolder || (WorkspaceFolder = {}));\nexport var EOL = ['\\n', '\\r\\n', '\\r'];\n/**\n * @deprecated Use the text document from the new vscode-languageserver-textdocument package.\n */\nexport var TextDocument;\n(function (TextDocument) {\n /**\n * Creates a new ITextDocument literal from the given uri and content.\n * @param uri The document's uri.\n * @param languageId The document's language Id.\n * @param version The document's version.\n * @param content The document's content.\n */\n function create(uri, languageId, version, content) {\n return new FullTextDocument(uri, languageId, version, content);\n }\n TextDocument.create = create;\n /**\n * Checks whether the given literal conforms to the [ITextDocument](#ITextDocument) interface.\n */\n function is(value) {\n var candidate = value;\n return Is.defined(candidate) && Is.string(candidate.uri) && (Is.undefined(candidate.languageId) || Is.string(candidate.languageId)) && Is.uinteger(candidate.lineCount)\n && Is.func(candidate.getText) && Is.func(candidate.positionAt) && Is.func(candidate.offsetAt) ? true : false;\n }\n TextDocument.is = is;\n function applyEdits(document, edits) {\n var text = document.getText();\n var sortedEdits = mergeSort(edits, function (a, b) {\n var diff = a.range.start.line - b.range.start.line;\n if (diff === 0) {\n return a.range.start.character - b.range.start.character;\n }\n return diff;\n });\n var lastModifiedOffset = text.length;\n for (var i = sortedEdits.length - 1; i >= 0; i--) {\n var e = sortedEdits[i];\n var startOffset = document.offsetAt(e.range.start);\n var endOffset = document.offsetAt(e.range.end);\n if (endOffset <= lastModifiedOffset) {\n text = text.substring(0, startOffset) + e.newText + text.substring(endOffset, text.length);\n }\n else {\n throw new Error('Overlapping edit');\n }\n lastModifiedOffset = startOffset;\n }\n return text;\n }\n TextDocument.applyEdits = applyEdits;\n function mergeSort(data, compare) {\n if (data.length <= 1) {\n // sorted\n return data;\n }\n var p = (data.length / 2) | 0;\n var left = data.slice(0, p);\n var right = data.slice(p);\n mergeSort(left, compare);\n mergeSort(right, compare);\n var leftIdx = 0;\n var rightIdx = 0;\n var i = 0;\n while (leftIdx < left.length && rightIdx < right.length) {\n var ret = compare(left[leftIdx], right[rightIdx]);\n if (ret <= 0) {\n // smaller_equal -> take left to preserve order\n data[i++] = left[leftIdx++];\n }\n else {\n // greater -> take right\n data[i++] = right[rightIdx++];\n }\n }\n while (leftIdx < left.length) {\n data[i++] = left[leftIdx++];\n }\n while (rightIdx < right.length) {\n data[i++] = right[rightIdx++];\n }\n return data;\n }\n})(TextDocument || (TextDocument = {}));\n/**\n * @deprecated Use the text document from the new vscode-languageserver-textdocument package.\n */\nvar FullTextDocument = /** @class */ (function () {\n function FullTextDocument(uri, languageId, version, content) {\n this._uri = uri;\n this._languageId = languageId;\n this._version = version;\n this._content = content;\n this._lineOffsets = undefined;\n }\n Object.defineProperty(FullTextDocument.prototype, \"uri\", {\n get: function () {\n return this._uri;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(FullTextDocument.prototype, \"languageId\", {\n get: function () {\n return this._languageId;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(FullTextDocument.prototype, \"version\", {\n get: function () {\n return this._version;\n },\n enumerable: false,\n configurable: true\n });\n FullTextDocument.prototype.getText = function (range) {\n if (range) {\n var start = this.offsetAt(range.start);\n var end = this.offsetAt(range.end);\n return this._content.substring(start, end);\n }\n return this._content;\n };\n FullTextDocument.prototype.update = function (event, version) {\n this._content = event.text;\n this._version = version;\n this._lineOffsets = undefined;\n };\n FullTextDocument.prototype.getLineOffsets = function () {\n if (this._lineOffsets === undefined) {\n var lineOffsets = [];\n var text = this._content;\n var isLineStart = true;\n for (var i = 0; i < text.length; i++) {\n if (isLineStart) {\n lineOffsets.push(i);\n isLineStart = false;\n }\n var ch = text.charAt(i);\n isLineStart = (ch === '\\r' || ch === '\\n');\n if (ch === '\\r' && i + 1 < text.length && text.charAt(i + 1) === '\\n') {\n i++;\n }\n }\n if (isLineStart && text.length > 0) {\n lineOffsets.push(text.length);\n }\n this._lineOffsets = lineOffsets;\n }\n return this._lineOffsets;\n };\n FullTextDocument.prototype.positionAt = function (offset) {\n offset = Math.max(Math.min(offset, this._content.length), 0);\n var lineOffsets = this.getLineOffsets();\n var low = 0, high = lineOffsets.length;\n if (high === 0) {\n return Position.create(0, offset);\n }\n while (low < high) {\n var mid = Math.floor((low + high) / 2);\n if (lineOffsets[mid] > offset) {\n high = mid;\n }\n else {\n low = mid + 1;\n }\n }\n // low is the least x for which the line offset is larger than the current offset\n // or array.length if no line offset is larger than the current offset\n var line = low - 1;\n return Position.create(line, offset - lineOffsets[line]);\n };\n FullTextDocument.prototype.offsetAt = function (position) {\n var lineOffsets = this.getLineOffsets();\n if (position.line >= lineOffsets.length) {\n return this._content.length;\n }\n else if (position.line < 0) {\n return 0;\n }\n var lineOffset = lineOffsets[position.line];\n var nextLineOffset = (position.line + 1 < lineOffsets.length) ? lineOffsets[position.line + 1] : this._content.length;\n return Math.max(Math.min(lineOffset + position.character, nextLineOffset), lineOffset);\n };\n Object.defineProperty(FullTextDocument.prototype, \"lineCount\", {\n get: function () {\n return this.getLineOffsets().length;\n },\n enumerable: false,\n configurable: true\n });\n return FullTextDocument;\n}());\nvar Is;\n(function (Is) {\n var toString = Object.prototype.toString;\n function defined(value) {\n return typeof value !== 'undefined';\n }\n Is.defined = defined;\n function undefined(value) {\n return typeof value === 'undefined';\n }\n Is.undefined = undefined;\n function boolean(value) {\n return value === true || value === false;\n }\n Is.boolean = boolean;\n function string(value) {\n return toString.call(value) === '[object String]';\n }\n Is.string = string;\n function number(value) {\n return toString.call(value) === '[object Number]';\n }\n Is.number = number;\n function numberRange(value, min, max) {\n return toString.call(value) === '[object Number]' && min <= value && value <= max;\n }\n Is.numberRange = numberRange;\n function integer(value) {\n return toString.call(value) === '[object Number]' && -2147483648 <= value && value <= 2147483647;\n }\n Is.integer = integer;\n function uinteger(value) {\n return toString.call(value) === '[object Number]' && 0 <= value && value <= 2147483647;\n }\n Is.uinteger = uinteger;\n function func(value) {\n return toString.call(value) === '[object Function]';\n }\n Is.func = func;\n function objectLiteral(value) {\n // Strictly speaking class instances pass this check as well. Since the LSP\n // doesn't use classes we ignore this for now. If we do we need to add something\n // like this: `Object.getPrototypeOf(Object.getPrototypeOf(x)) === null`\n return value !== null && typeof value === 'object';\n }\n Is.objectLiteral = objectLiteral;\n function typedArray(value, check) {\n return Array.isArray(value) && value.every(check);\n }\n Is.typedArray = typedArray;\n})(Is || (Is = {}));\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport { createScanner } from './scanner';\nvar ParseOptions;\n(function (ParseOptions) {\n ParseOptions.DEFAULT = {\n allowTrailingComma: false\n };\n})(ParseOptions || (ParseOptions = {}));\n/**\n * For a given offset, evaluate the location in the JSON document. Each segment in the location path is either a property name or an array index.\n */\nexport function getLocation(text, position) {\n var segments = []; // strings or numbers\n var earlyReturnException = new Object();\n var previousNode = undefined;\n var previousNodeInst = {\n value: {},\n offset: 0,\n length: 0,\n type: 'object',\n parent: undefined\n };\n var isAtPropertyKey = false;\n function setPreviousNode(value, offset, length, type) {\n previousNodeInst.value = value;\n previousNodeInst.offset = offset;\n previousNodeInst.length = length;\n previousNodeInst.type = type;\n previousNodeInst.colonOffset = undefined;\n previousNode = previousNodeInst;\n }\n try {\n visit(text, {\n onObjectBegin: function (offset, length) {\n if (position <= offset) {\n throw earlyReturnException;\n }\n previousNode = undefined;\n isAtPropertyKey = position > offset;\n segments.push(''); // push a placeholder (will be replaced)\n },\n onObjectProperty: function (name, offset, length) {\n if (position < offset) {\n throw earlyReturnException;\n }\n setPreviousNode(name, offset, length, 'property');\n segments[segments.length - 1] = name;\n if (position <= offset + length) {\n throw earlyReturnException;\n }\n },\n onObjectEnd: function (offset, length) {\n if (position <= offset) {\n throw earlyReturnException;\n }\n previousNode = undefined;\n segments.pop();\n },\n onArrayBegin: function (offset, length) {\n if (position <= offset) {\n throw earlyReturnException;\n }\n previousNode = undefined;\n segments.push(0);\n },\n onArrayEnd: function (offset, length) {\n if (position <= offset) {\n throw earlyReturnException;\n }\n previousNode = undefined;\n segments.pop();\n },\n onLiteralValue: function (value, offset, length) {\n if (position < offset) {\n throw earlyReturnException;\n }\n setPreviousNode(value, offset, length, getNodeType(value));\n if (position <= offset + length) {\n throw earlyReturnException;\n }\n },\n onSeparator: function (sep, offset, length) {\n if (position <= offset) {\n throw earlyReturnException;\n }\n if (sep === ':' && previousNode && previousNode.type === 'property') {\n previousNode.colonOffset = offset;\n isAtPropertyKey = false;\n previousNode = undefined;\n }\n else if (sep === ',') {\n var last = segments[segments.length - 1];\n if (typeof last === 'number') {\n segments[segments.length - 1] = last + 1;\n }\n else {\n isAtPropertyKey = true;\n segments[segments.length - 1] = '';\n }\n previousNode = undefined;\n }\n }\n });\n }\n catch (e) {\n if (e !== earlyReturnException) {\n throw e;\n }\n }\n return {\n path: segments,\n previousNode: previousNode,\n isAtPropertyKey: isAtPropertyKey,\n matches: function (pattern) {\n var k = 0;\n for (var i = 0; k < pattern.length && i < segments.length; i++) {\n if (pattern[k] === segments[i] || pattern[k] === '*') {\n k++;\n }\n else if (pattern[k] !== '**') {\n return false;\n }\n }\n return k === pattern.length;\n }\n };\n}\n/**\n * Parses the given text and returns the object the JSON content represents. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result.\n * Therefore always check the errors list to find out if the input was valid.\n */\nexport function parse(text, errors, options) {\n if (errors === void 0) { errors = []; }\n if (options === void 0) { options = ParseOptions.DEFAULT; }\n var currentProperty = null;\n var currentParent = [];\n var previousParents = [];\n function onValue(value) {\n if (Array.isArray(currentParent)) {\n currentParent.push(value);\n }\n else if (currentProperty !== null) {\n currentParent[currentProperty] = value;\n }\n }\n var visitor = {\n onObjectBegin: function () {\n var object = {};\n onValue(object);\n previousParents.push(currentParent);\n currentParent = object;\n currentProperty = null;\n },\n onObjectProperty: function (name) {\n currentProperty = name;\n },\n onObjectEnd: function () {\n currentParent = previousParents.pop();\n },\n onArrayBegin: function () {\n var array = [];\n onValue(array);\n previousParents.push(currentParent);\n currentParent = array;\n currentProperty = null;\n },\n onArrayEnd: function () {\n currentParent = previousParents.pop();\n },\n onLiteralValue: onValue,\n onError: function (error, offset, length) {\n errors.push({ error: error, offset: offset, length: length });\n }\n };\n visit(text, visitor, options);\n return currentParent[0];\n}\n/**\n * Parses the given text and returns a tree representation the JSON content. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result.\n */\nexport function parseTree(text, errors, options) {\n if (errors === void 0) { errors = []; }\n if (options === void 0) { options = ParseOptions.DEFAULT; }\n var currentParent = { type: 'array', offset: -1, length: -1, children: [], parent: undefined }; // artificial root\n function ensurePropertyComplete(endOffset) {\n if (currentParent.type === 'property') {\n currentParent.length = endOffset - currentParent.offset;\n currentParent = currentParent.parent;\n }\n }\n function onValue(valueNode) {\n currentParent.children.push(valueNode);\n return valueNode;\n }\n var visitor = {\n onObjectBegin: function (offset) {\n currentParent = onValue({ type: 'object', offset: offset, length: -1, parent: currentParent, children: [] });\n },\n onObjectProperty: function (name, offset, length) {\n currentParent = onValue({ type: 'property', offset: offset, length: -1, parent: currentParent, children: [] });\n currentParent.children.push({ type: 'string', value: name, offset: offset, length: length, parent: currentParent });\n },\n onObjectEnd: function (offset, length) {\n ensurePropertyComplete(offset + length); // in case of a missing value for a property: make sure property is complete\n currentParent.length = offset + length - currentParent.offset;\n currentParent = currentParent.parent;\n ensurePropertyComplete(offset + length);\n },\n onArrayBegin: function (offset, length) {\n currentParent = onValue({ type: 'array', offset: offset, length: -1, parent: currentParent, children: [] });\n },\n onArrayEnd: function (offset, length) {\n currentParent.length = offset + length - currentParent.offset;\n currentParent = currentParent.parent;\n ensurePropertyComplete(offset + length);\n },\n onLiteralValue: function (value, offset, length) {\n onValue({ type: getNodeType(value), offset: offset, length: length, parent: currentParent, value: value });\n ensurePropertyComplete(offset + length);\n },\n onSeparator: function (sep, offset, length) {\n if (currentParent.type === 'property') {\n if (sep === ':') {\n currentParent.colonOffset = offset;\n }\n else if (sep === ',') {\n ensurePropertyComplete(offset);\n }\n }\n },\n onError: function (error, offset, length) {\n errors.push({ error: error, offset: offset, length: length });\n }\n };\n visit(text, visitor, options);\n var result = currentParent.children[0];\n if (result) {\n delete result.parent;\n }\n return result;\n}\n/**\n * Finds the node at the given path in a JSON DOM.\n */\nexport function findNodeAtLocation(root, path) {\n if (!root) {\n return undefined;\n }\n var node = root;\n for (var _i = 0, path_1 = path; _i < path_1.length; _i++) {\n var segment = path_1[_i];\n if (typeof segment === 'string') {\n if (node.type !== 'object' || !Array.isArray(node.children)) {\n return undefined;\n }\n var found = false;\n for (var _a = 0, _b = node.children; _a < _b.length; _a++) {\n var propertyNode = _b[_a];\n if (Array.isArray(propertyNode.children) && propertyNode.children[0].value === segment) {\n node = propertyNode.children[1];\n found = true;\n break;\n }\n }\n if (!found) {\n return undefined;\n }\n }\n else {\n var index = segment;\n if (node.type !== 'array' || index < 0 || !Array.isArray(node.children) || index >= node.children.length) {\n return undefined;\n }\n node = node.children[index];\n }\n }\n return node;\n}\n/**\n * Gets the JSON path of the given JSON DOM node\n */\nexport function getNodePath(node) {\n if (!node.parent || !node.parent.children) {\n return [];\n }\n var path = getNodePath(node.parent);\n if (node.parent.type === 'property') {\n var key = node.parent.children[0].value;\n path.push(key);\n }\n else if (node.parent.type === 'array') {\n var index = node.parent.children.indexOf(node);\n if (index !== -1) {\n path.push(index);\n }\n }\n return path;\n}\n/**\n * Evaluates the JavaScript object of the given JSON DOM node\n */\nexport function getNodeValue(node) {\n switch (node.type) {\n case 'array':\n return node.children.map(getNodeValue);\n case 'object':\n var obj = Object.create(null);\n for (var _i = 0, _a = node.children; _i < _a.length; _i++) {\n var prop = _a[_i];\n var valueNode = prop.children[1];\n if (valueNode) {\n obj[prop.children[0].value] = getNodeValue(valueNode);\n }\n }\n return obj;\n case 'null':\n case 'string':\n case 'number':\n case 'boolean':\n return node.value;\n default:\n return undefined;\n }\n}\nexport function contains(node, offset, includeRightBound) {\n if (includeRightBound === void 0) { includeRightBound = false; }\n return (offset >= node.offset && offset < (node.offset + node.length)) || includeRightBound && (offset === (node.offset + node.length));\n}\n/**\n * Finds the most inner node at the given offset. If includeRightBound is set, also finds nodes that end at the given offset.\n */\nexport function findNodeAtOffset(node, offset, includeRightBound) {\n if (includeRightBound === void 0) { includeRightBound = false; }\n if (contains(node, offset, includeRightBound)) {\n var children = node.children;\n if (Array.isArray(children)) {\n for (var i = 0; i < children.length && children[i].offset <= offset; i++) {\n var item = findNodeAtOffset(children[i], offset, includeRightBound);\n if (item) {\n return item;\n }\n }\n }\n return node;\n }\n return undefined;\n}\n/**\n * Parses the given text and invokes the visitor functions for each object, array and literal reached.\n */\nexport function visit(text, visitor, options) {\n if (options === void 0) { options = ParseOptions.DEFAULT; }\n var _scanner = createScanner(text, false);\n function toNoArgVisit(visitFunction) {\n return visitFunction ? function () { return visitFunction(_scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter()); } : function () { return true; };\n }\n function toOneArgVisit(visitFunction) {\n return visitFunction ? function (arg) { return visitFunction(arg, _scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter()); } : function () { return true; };\n }\n var onObjectBegin = toNoArgVisit(visitor.onObjectBegin), onObjectProperty = toOneArgVisit(visitor.onObjectProperty), onObjectEnd = toNoArgVisit(visitor.onObjectEnd), onArrayBegin = toNoArgVisit(visitor.onArrayBegin), onArrayEnd = toNoArgVisit(visitor.onArrayEnd), onLiteralValue = toOneArgVisit(visitor.onLiteralValue), onSeparator = toOneArgVisit(visitor.onSeparator), onComment = toNoArgVisit(visitor.onComment), onError = toOneArgVisit(visitor.onError);\n var disallowComments = options && options.disallowComments;\n var allowTrailingComma = options && options.allowTrailingComma;\n function scanNext() {\n while (true) {\n var token = _scanner.scan();\n switch (_scanner.getTokenError()) {\n case 4 /* InvalidUnicode */:\n handleError(14 /* InvalidUnicode */);\n break;\n case 5 /* InvalidEscapeCharacter */:\n handleError(15 /* InvalidEscapeCharacter */);\n break;\n case 3 /* UnexpectedEndOfNumber */:\n handleError(13 /* UnexpectedEndOfNumber */);\n break;\n case 1 /* UnexpectedEndOfComment */:\n if (!disallowComments) {\n handleError(11 /* UnexpectedEndOfComment */);\n }\n break;\n case 2 /* UnexpectedEndOfString */:\n handleError(12 /* UnexpectedEndOfString */);\n break;\n case 6 /* InvalidCharacter */:\n handleError(16 /* InvalidCharacter */);\n break;\n }\n switch (token) {\n case 12 /* LineCommentTrivia */:\n case 13 /* BlockCommentTrivia */:\n if (disallowComments) {\n handleError(10 /* InvalidCommentToken */);\n }\n else {\n onComment();\n }\n break;\n case 16 /* Unknown */:\n handleError(1 /* InvalidSymbol */);\n break;\n case 15 /* Trivia */:\n case 14 /* LineBreakTrivia */:\n break;\n default:\n return token;\n }\n }\n }\n function handleError(error, skipUntilAfter, skipUntil) {\n if (skipUntilAfter === void 0) { skipUntilAfter = []; }\n if (skipUntil === void 0) { skipUntil = []; }\n onError(error);\n if (skipUntilAfter.length + skipUntil.length > 0) {\n var token = _scanner.getToken();\n while (token !== 17 /* EOF */) {\n if (skipUntilAfter.indexOf(token) !== -1) {\n scanNext();\n break;\n }\n else if (skipUntil.indexOf(token) !== -1) {\n break;\n }\n token = scanNext();\n }\n }\n }\n function parseString(isValue) {\n var value = _scanner.getTokenValue();\n if (isValue) {\n onLiteralValue(value);\n }\n else {\n onObjectProperty(value);\n }\n scanNext();\n return true;\n }\n function parseLiteral() {\n switch (_scanner.getToken()) {\n case 11 /* NumericLiteral */:\n var value = 0;\n try {\n value = JSON.parse(_scanner.getTokenValue());\n if (typeof value !== 'number') {\n handleError(2 /* InvalidNumberFormat */);\n value = 0;\n }\n }\n catch (e) {\n handleError(2 /* InvalidNumberFormat */);\n }\n onLiteralValue(value);\n break;\n case 7 /* NullKeyword */:\n onLiteralValue(null);\n break;\n case 8 /* TrueKeyword */:\n onLiteralValue(true);\n break;\n case 9 /* FalseKeyword */:\n onLiteralValue(false);\n break;\n default:\n return false;\n }\n scanNext();\n return true;\n }\n function parseProperty() {\n if (_scanner.getToken() !== 10 /* StringLiteral */) {\n handleError(3 /* PropertyNameExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]);\n return false;\n }\n parseString(false);\n if (_scanner.getToken() === 6 /* ColonToken */) {\n onSeparator(':');\n scanNext(); // consume colon\n if (!parseValue()) {\n handleError(4 /* ValueExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]);\n }\n }\n else {\n handleError(5 /* ColonExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]);\n }\n return true;\n }\n function parseObject() {\n onObjectBegin();\n scanNext(); // consume open brace\n var needsComma = false;\n while (_scanner.getToken() !== 2 /* CloseBraceToken */ && _scanner.getToken() !== 17 /* EOF */) {\n if (_scanner.getToken() === 5 /* CommaToken */) {\n if (!needsComma) {\n handleError(4 /* ValueExpected */, [], []);\n }\n onSeparator(',');\n scanNext(); // consume comma\n if (_scanner.getToken() === 2 /* CloseBraceToken */ && allowTrailingComma) {\n break;\n }\n }\n else if (needsComma) {\n handleError(6 /* CommaExpected */, [], []);\n }\n if (!parseProperty()) {\n handleError(4 /* ValueExpected */, [], [2 /* CloseBraceToken */, 5 /* CommaToken */]);\n }\n needsComma = true;\n }\n onObjectEnd();\n if (_scanner.getToken() !== 2 /* CloseBraceToken */) {\n handleError(7 /* CloseBraceExpected */, [2 /* CloseBraceToken */], []);\n }\n else {\n scanNext(); // consume close brace\n }\n return true;\n }\n function parseArray() {\n onArrayBegin();\n scanNext(); // consume open bracket\n var needsComma = false;\n while (_scanner.getToken() !== 4 /* CloseBracketToken */ && _scanner.getToken() !== 17 /* EOF */) {\n if (_scanner.getToken() === 5 /* CommaToken */) {\n if (!needsComma) {\n handleError(4 /* ValueExpected */, [], []);\n }\n onSeparator(',');\n scanNext(); // consume comma\n if (_scanner.getToken() === 4 /* CloseBracketToken */ && allowTrailingComma) {\n break;\n }\n }\n else if (needsComma) {\n handleError(6 /* CommaExpected */, [], []);\n }\n if (!parseValue()) {\n handleError(4 /* ValueExpected */, [], [4 /* CloseBracketToken */, 5 /* CommaToken */]);\n }\n needsComma = true;\n }\n onArrayEnd();\n if (_scanner.getToken() !== 4 /* CloseBracketToken */) {\n handleError(8 /* CloseBracketExpected */, [4 /* CloseBracketToken */], []);\n }\n else {\n scanNext(); // consume close bracket\n }\n return true;\n }\n function parseValue() {\n switch (_scanner.getToken()) {\n case 3 /* OpenBracketToken */:\n return parseArray();\n case 1 /* OpenBraceToken */:\n return parseObject();\n case 10 /* StringLiteral */:\n return parseString(true);\n default:\n return parseLiteral();\n }\n }\n scanNext();\n if (_scanner.getToken() === 17 /* EOF */) {\n if (options.allowEmptyContent) {\n return true;\n }\n handleError(4 /* ValueExpected */, [], []);\n return false;\n }\n if (!parseValue()) {\n handleError(4 /* ValueExpected */, [], []);\n return false;\n }\n if (_scanner.getToken() !== 17 /* EOF */) {\n handleError(9 /* EndOfFileExpected */, [], []);\n }\n return true;\n}\n/**\n * Takes JSON with JavaScript-style comments and remove\n * them. Optionally replaces every none-newline character\n * of comments with a replaceCharacter\n */\nexport function stripComments(text, replaceCh) {\n var _scanner = createScanner(text), parts = [], kind, offset = 0, pos;\n do {\n pos = _scanner.getPosition();\n kind = _scanner.scan();\n switch (kind) {\n case 12 /* LineCommentTrivia */:\n case 13 /* BlockCommentTrivia */:\n case 17 /* EOF */:\n if (offset !== pos) {\n parts.push(text.substring(offset, pos));\n }\n if (replaceCh !== undefined) {\n parts.push(_scanner.getTokenValue().replace(/[^\\r\\n]/g, replaceCh));\n }\n offset = _scanner.getPosition();\n break;\n }\n } while (kind !== 17 /* EOF */);\n return parts.join('');\n}\nexport function getNodeType(value) {\n switch (typeof value) {\n case 'boolean': return 'boolean';\n case 'number': return 'number';\n case 'string': return 'string';\n case 'object': {\n if (!value) {\n return 'null';\n }\n else if (Array.isArray(value)) {\n return 'array';\n }\n return 'object';\n }\n default: return 'null';\n }\n}\n", null, "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar _a;\nvar isWindows;\nif (typeof process === 'object') {\n isWindows = process.platform === 'win32';\n}\nelse if (typeof navigator === 'object') {\n var userAgent = navigator.userAgent;\n isWindows = userAgent.indexOf('Windows') >= 0;\n}\nfunction isHighSurrogate(charCode) {\n return (0xD800 <= charCode && charCode <= 0xDBFF);\n}\nfunction isLowSurrogate(charCode) {\n return (0xDC00 <= charCode && charCode <= 0xDFFF);\n}\nfunction isLowerAsciiHex(code) {\n return code >= 97 /* a */ && code <= 102 /* f */;\n}\nfunction isLowerAsciiLetter(code) {\n return code >= 97 /* a */ && code <= 122 /* z */;\n}\nfunction isUpperAsciiLetter(code) {\n return code >= 65 /* A */ && code <= 90 /* Z */;\n}\nfunction isAsciiLetter(code) {\n return isLowerAsciiLetter(code) || isUpperAsciiLetter(code);\n}\n//#endregion\nvar _schemePattern = /^\\w[\\w\\d+.-]*$/;\nvar _singleSlashStart = /^\\//;\nvar _doubleSlashStart = /^\\/\\//;\nfunction _validateUri(ret, _strict) {\n // scheme, must be set\n if (!ret.scheme && _strict) {\n throw new Error(\"[UriError]: Scheme is missing: {scheme: \\\"\\\", authority: \\\"\" + ret.authority + \"\\\", path: \\\"\" + ret.path + \"\\\", query: \\\"\" + ret.query + \"\\\", fragment: \\\"\" + ret.fragment + \"\\\"}\");\n }\n // scheme, https://tools.ietf.org/html/rfc3986#section-3.1\n // ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )\n if (ret.scheme && !_schemePattern.test(ret.scheme)) {\n throw new Error('[UriError]: Scheme contains illegal characters.');\n }\n // path, http://tools.ietf.org/html/rfc3986#section-3.3\n // If a URI contains an authority component, then the path component\n // must either be empty or begin with a slash (\"/\") character. If a URI\n // does not contain an authority component, then the path cannot begin\n // with two slash characters (\"//\").\n if (ret.path) {\n if (ret.authority) {\n if (!_singleSlashStart.test(ret.path)) {\n throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash (\"/\") character');\n }\n }\n else {\n if (_doubleSlashStart.test(ret.path)) {\n throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters (\"//\")');\n }\n }\n }\n}\n// for a while we allowed uris *without* schemes and this is the migration\n// for them, e.g. an uri without scheme and without strict-mode warns and falls\n// back to the file-scheme. that should cause the least carnage and still be a\n// clear warning\nfunction _schemeFix(scheme, _strict) {\n if (!scheme && !_strict) {\n return 'file';\n }\n return scheme;\n}\n// implements a bit of https://tools.ietf.org/html/rfc3986#section-5\nfunction _referenceResolution(scheme, path) {\n // the slash-character is our 'default base' as we don't\n // support constructing URIs relative to other URIs. This\n // also means that we alter and potentially break paths.\n // see https://tools.ietf.org/html/rfc3986#section-5.1.4\n switch (scheme) {\n case 'https':\n case 'http':\n case 'file':\n if (!path) {\n path = _slash;\n }\n else if (path[0] !== _slash) {\n path = _slash + path;\n }\n break;\n }\n return path;\n}\nvar _empty = '';\nvar _slash = '/';\nvar _regexp = /^(([^:/?#]+?):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?/;\n/**\n * Uniform Resource Identifier (URI) http://tools.ietf.org/html/rfc3986.\n * This class is a simple parser which creates the basic component parts\n * (http://tools.ietf.org/html/rfc3986#section-3) with minimal validation\n * and encoding.\n *\n * ```txt\n * foo://example.com:8042/over/there?name=ferret#nose\n * \\_/ \\______________/\\_________/ \\_________/ \\__/\n * | | | | |\n * scheme authority path query fragment\n * | _____________________|__\n * / \\ / \\\n * urn:example:animal:ferret:nose\n * ```\n */\nvar URI = /** @class */ (function () {\n /**\n * @internal\n */\n function URI(schemeOrData, authority, path, query, fragment, _strict) {\n if (_strict === void 0) { _strict = false; }\n if (typeof schemeOrData === 'object') {\n this.scheme = schemeOrData.scheme || _empty;\n this.authority = schemeOrData.authority || _empty;\n this.path = schemeOrData.path || _empty;\n this.query = schemeOrData.query || _empty;\n this.fragment = schemeOrData.fragment || _empty;\n // no validation because it's this URI\n // that creates uri components.\n // _validateUri(this);\n }\n else {\n this.scheme = _schemeFix(schemeOrData, _strict);\n this.authority = authority || _empty;\n this.path = _referenceResolution(this.scheme, path || _empty);\n this.query = query || _empty;\n this.fragment = fragment || _empty;\n _validateUri(this, _strict);\n }\n }\n URI.isUri = function (thing) {\n if (thing instanceof URI) {\n return true;\n }\n if (!thing) {\n return false;\n }\n return typeof thing.authority === 'string'\n && typeof thing.fragment === 'string'\n && typeof thing.path === 'string'\n && typeof thing.query === 'string'\n && typeof thing.scheme === 'string'\n && typeof thing.fsPath === 'function'\n && typeof thing.with === 'function'\n && typeof thing.toString === 'function';\n };\n Object.defineProperty(URI.prototype, \"fsPath\", {\n // ---- filesystem path -----------------------\n /**\n * Returns a string representing the corresponding file system path of this URI.\n * Will handle UNC paths, normalizes windows drive letters to lower-case, and uses the\n * platform specific path separator.\n *\n * * Will *not* validate the path for invalid characters and semantics.\n * * Will *not* look at the scheme of this URI.\n * * The result shall *not* be used for display purposes but for accessing a file on disk.\n *\n *\n * The *difference* to `URI#path` is the use of the platform specific separator and the handling\n * of UNC paths. See the below sample of a file-uri with an authority (UNC path).\n *\n * ```ts\n const u = URI.parse('file://server/c$/folder/file.txt')\n u.authority === 'server'\n u.path === '/shares/c$/file.txt'\n u.fsPath === '\\\\server\\c$\\folder\\file.txt'\n ```\n *\n * Using `URI#path` to read a file (using fs-apis) would not be enough because parts of the path,\n * namely the server name, would be missing. Therefore `URI#fsPath` exists - it's sugar to ease working\n * with URIs that represent files on disk (`file` scheme).\n */\n get: function () {\n // if (this.scheme !== 'file') {\n // \tconsole.warn(`[UriError] calling fsPath with scheme ${this.scheme}`);\n // }\n return uriToFsPath(this, false);\n },\n enumerable: true,\n configurable: true\n });\n // ---- modify to new -------------------------\n URI.prototype.with = function (change) {\n if (!change) {\n return this;\n }\n var scheme = change.scheme, authority = change.authority, path = change.path, query = change.query, fragment = change.fragment;\n if (scheme === undefined) {\n scheme = this.scheme;\n }\n else if (scheme === null) {\n scheme = _empty;\n }\n if (authority === undefined) {\n authority = this.authority;\n }\n else if (authority === null) {\n authority = _empty;\n }\n if (path === undefined) {\n path = this.path;\n }\n else if (path === null) {\n path = _empty;\n }\n if (query === undefined) {\n query = this.query;\n }\n else if (query === null) {\n query = _empty;\n }\n if (fragment === undefined) {\n fragment = this.fragment;\n }\n else if (fragment === null) {\n fragment = _empty;\n }\n if (scheme === this.scheme\n && authority === this.authority\n && path === this.path\n && query === this.query\n && fragment === this.fragment) {\n return this;\n }\n return new _URI(scheme, authority, path, query, fragment);\n };\n // ---- parse & validate ------------------------\n /**\n * Creates a new URI from a string, e.g. `http://www.msft.com/some/path`,\n * `file:///usr/home`, or `scheme:with/path`.\n *\n * @param value A string which represents an URI (see `URI#toString`).\n */\n URI.parse = function (value, _strict) {\n if (_strict === void 0) { _strict = false; }\n var match = _regexp.exec(value);\n if (!match) {\n return new _URI(_empty, _empty, _empty, _empty, _empty);\n }\n return new _URI(match[2] || _empty, percentDecode(match[4] || _empty), percentDecode(match[5] || _empty), percentDecode(match[7] || _empty), percentDecode(match[9] || _empty), _strict);\n };\n /**\n * Creates a new URI from a file system path, e.g. `c:\\my\\files`,\n * `/usr/home`, or `\\\\server\\share\\some\\path`.\n *\n * The *difference* between `URI#parse` and `URI#file` is that the latter treats the argument\n * as path, not as stringified-uri. E.g. `URI.file(path)` is **not the same as**\n * `URI.parse('file://' + path)` because the path might contain characters that are\n * interpreted (# and ?). See the following sample:\n * ```ts\n const good = URI.file('/coding/c#/project1');\n good.scheme === 'file';\n good.path === '/coding/c#/project1';\n good.fragment === '';\n const bad = URI.parse('file://' + '/coding/c#/project1');\n bad.scheme === 'file';\n bad.path === '/coding/c'; // path is now broken\n bad.fragment === '/project1';\n ```\n *\n * @param path A file system path (see `URI#fsPath`)\n */\n URI.file = function (path) {\n var authority = _empty;\n // normalize to fwd-slashes on windows,\n // on other systems bwd-slashes are valid\n // filename character, eg /f\\oo/ba\\r.txt\n if (isWindows) {\n path = path.replace(/\\\\/g, _slash);\n }\n // check for authority as used in UNC shares\n // or use the path as given\n if (path[0] === _slash && path[1] === _slash) {\n var idx = path.indexOf(_slash, 2);\n if (idx === -1) {\n authority = path.substring(2);\n path = _slash;\n }\n else {\n authority = path.substring(2, idx);\n path = path.substring(idx) || _slash;\n }\n }\n return new _URI('file', authority, path, _empty, _empty);\n };\n URI.from = function (components) {\n return new _URI(components.scheme, components.authority, components.path, components.query, components.fragment);\n };\n // /**\n // * Join a URI path with path fragments and normalizes the resulting path.\n // *\n // * @param uri The input URI.\n // * @param pathFragment The path fragment to add to the URI path.\n // * @returns The resulting URI.\n // */\n // static joinPath(uri: URI, ...pathFragment: string[]): URI {\n // \tif (!uri.path) {\n // \t\tthrow new Error(`[UriError]: cannot call joinPaths on URI without path`);\n // \t}\n // \tlet newPath: string;\n // \tif (isWindows && uri.scheme === 'file') {\n // \t\tnewPath = URI.file(paths.win32.join(uriToFsPath(uri, true), ...pathFragment)).path;\n // \t} else {\n // \t\tnewPath = paths.posix.join(uri.path, ...pathFragment);\n // \t}\n // \treturn uri.with({ path: newPath });\n // }\n // ---- printing/externalize ---------------------------\n /**\n * Creates a string representation for this URI. It's guaranteed that calling\n * `URI.parse` with the result of this function creates an URI which is equal\n * to this URI.\n *\n * * The result shall *not* be used for display purposes but for externalization or transport.\n * * The result will be encoded using the percentage encoding and encoding happens mostly\n * ignore the scheme-specific encoding rules.\n *\n * @param skipEncoding Do not encode the result, default is `false`\n */\n URI.prototype.toString = function (skipEncoding) {\n if (skipEncoding === void 0) { skipEncoding = false; }\n return _asFormatted(this, skipEncoding);\n };\n URI.prototype.toJSON = function () {\n return this;\n };\n URI.revive = function (data) {\n if (!data) {\n return data;\n }\n else if (data instanceof URI) {\n return data;\n }\n else {\n var result = new _URI(data);\n result._formatted = data.external;\n result._fsPath = data._sep === _pathSepMarker ? data.fsPath : null;\n return result;\n }\n };\n return URI;\n}());\nexport { URI };\nvar _pathSepMarker = isWindows ? 1 : undefined;\n// eslint-disable-next-line @typescript-eslint/class-name-casing\nvar _URI = /** @class */ (function (_super) {\n __extends(_URI, _super);\n function _URI() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n _this._formatted = null;\n _this._fsPath = null;\n return _this;\n }\n Object.defineProperty(_URI.prototype, \"fsPath\", {\n get: function () {\n if (!this._fsPath) {\n this._fsPath = uriToFsPath(this, false);\n }\n return this._fsPath;\n },\n enumerable: true,\n configurable: true\n });\n _URI.prototype.toString = function (skipEncoding) {\n if (skipEncoding === void 0) { skipEncoding = false; }\n if (!skipEncoding) {\n if (!this._formatted) {\n this._formatted = _asFormatted(this, false);\n }\n return this._formatted;\n }\n else {\n // we don't cache that\n return _asFormatted(this, true);\n }\n };\n _URI.prototype.toJSON = function () {\n var res = {\n $mid: 1\n };\n // cached state\n if (this._fsPath) {\n res.fsPath = this._fsPath;\n res._sep = _pathSepMarker;\n }\n if (this._formatted) {\n res.external = this._formatted;\n }\n // uri components\n if (this.path) {\n res.path = this.path;\n }\n if (this.scheme) {\n res.scheme = this.scheme;\n }\n if (this.authority) {\n res.authority = this.authority;\n }\n if (this.query) {\n res.query = this.query;\n }\n if (this.fragment) {\n res.fragment = this.fragment;\n }\n return res;\n };\n return _URI;\n}(URI));\n// reserved characters: https://tools.ietf.org/html/rfc3986#section-2.2\nvar encodeTable = (_a = {},\n _a[58 /* Colon */] = '%3A',\n _a[47 /* Slash */] = '%2F',\n _a[63 /* QuestionMark */] = '%3F',\n _a[35 /* Hash */] = '%23',\n _a[91 /* OpenSquareBracket */] = '%5B',\n _a[93 /* CloseSquareBracket */] = '%5D',\n _a[64 /* AtSign */] = '%40',\n _a[33 /* ExclamationMark */] = '%21',\n _a[36 /* DollarSign */] = '%24',\n _a[38 /* Ampersand */] = '%26',\n _a[39 /* SingleQuote */] = '%27',\n _a[40 /* OpenParen */] = '%28',\n _a[41 /* CloseParen */] = '%29',\n _a[42 /* Asterisk */] = '%2A',\n _a[43 /* Plus */] = '%2B',\n _a[44 /* Comma */] = '%2C',\n _a[59 /* Semicolon */] = '%3B',\n _a[61 /* Equals */] = '%3D',\n _a[32 /* Space */] = '%20',\n _a);\nfunction encodeURIComponentFast(uriComponent, allowSlash) {\n var res = undefined;\n var nativeEncodePos = -1;\n for (var pos = 0; pos < uriComponent.length; pos++) {\n var code = uriComponent.charCodeAt(pos);\n // unreserved characters: https://tools.ietf.org/html/rfc3986#section-2.3\n if ((code >= 97 /* a */ && code <= 122 /* z */)\n || (code >= 65 /* A */ && code <= 90 /* Z */)\n || (code >= 48 /* Digit0 */ && code <= 57 /* Digit9 */)\n || code === 45 /* Dash */\n || code === 46 /* Period */\n || code === 95 /* Underline */\n || code === 126 /* Tilde */\n || (allowSlash && code === 47 /* Slash */)) {\n // check if we are delaying native encode\n if (nativeEncodePos !== -1) {\n res += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos));\n nativeEncodePos = -1;\n }\n // check if we write into a new string (by default we try to return the param)\n if (res !== undefined) {\n res += uriComponent.charAt(pos);\n }\n }\n else {\n // encoding needed, we need to allocate a new string\n if (res === undefined) {\n res = uriComponent.substr(0, pos);\n }\n // check with default table first\n var escaped = encodeTable[code];\n if (escaped !== undefined) {\n // check if we are delaying native encode\n if (nativeEncodePos !== -1) {\n res += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos));\n nativeEncodePos = -1;\n }\n // append escaped variant to result\n res += escaped;\n }\n else if (nativeEncodePos === -1) {\n // use native encode only when needed\n nativeEncodePos = pos;\n }\n }\n }\n if (nativeEncodePos !== -1) {\n res += encodeURIComponent(uriComponent.substring(nativeEncodePos));\n }\n return res !== undefined ? res : uriComponent;\n}\nfunction encodeURIComponentMinimal(path) {\n var res = undefined;\n for (var pos = 0; pos < path.length; pos++) {\n var code = path.charCodeAt(pos);\n if (code === 35 /* Hash */ || code === 63 /* QuestionMark */) {\n if (res === undefined) {\n res = path.substr(0, pos);\n }\n res += encodeTable[code];\n }\n else {\n if (res !== undefined) {\n res += path[pos];\n }\n }\n }\n return res !== undefined ? res : path;\n}\n/**\n * Compute `fsPath` for the given uri\n */\nexport function uriToFsPath(uri, keepDriveLetterCasing) {\n var value;\n if (uri.authority && uri.path.length > 1 && uri.scheme === 'file') {\n // unc path: file://shares/c$/far/boo\n value = \"//\" + uri.authority + uri.path;\n }\n else if (uri.path.charCodeAt(0) === 47 /* Slash */\n && (uri.path.charCodeAt(1) >= 65 /* A */ && uri.path.charCodeAt(1) <= 90 /* Z */ || uri.path.charCodeAt(1) >= 97 /* a */ && uri.path.charCodeAt(1) <= 122 /* z */)\n && uri.path.charCodeAt(2) === 58 /* Colon */) {\n if (!keepDriveLetterCasing) {\n // windows drive letter: file:///c:/far/boo\n value = uri.path[1].toLowerCase() + uri.path.substr(2);\n }\n else {\n value = uri.path.substr(1);\n }\n }\n else {\n // other path\n value = uri.path;\n }\n if (isWindows) {\n value = value.replace(/\\//g, '\\\\');\n }\n return value;\n}\n/**\n * Create the external version of a uri\n */\nfunction _asFormatted(uri, skipEncoding) {\n var encoder = !skipEncoding\n ? encodeURIComponentFast\n : encodeURIComponentMinimal;\n var res = '';\n var scheme = uri.scheme, authority = uri.authority, path = uri.path, query = uri.query, fragment = uri.fragment;\n if (scheme) {\n res += scheme;\n res += ':';\n }\n if (authority || scheme === 'file') {\n res += _slash;\n res += _slash;\n }\n if (authority) {\n var idx = authority.indexOf('@');\n if (idx !== -1) {\n // <user>@<auth>\n var userinfo = authority.substr(0, idx);\n authority = authority.substr(idx + 1);\n idx = userinfo.indexOf(':');\n if (idx === -1) {\n res += encoder(userinfo, false);\n }\n else {\n // <user>:<pass>@<auth>\n res += encoder(userinfo.substr(0, idx), false);\n res += ':';\n res += encoder(userinfo.substr(idx + 1), false);\n }\n res += '@';\n }\n authority = authority.toLowerCase();\n idx = authority.indexOf(':');\n if (idx === -1) {\n res += encoder(authority, false);\n }\n else {\n // <auth>:<port>\n res += encoder(authority.substr(0, idx), false);\n res += authority.substr(idx);\n }\n }\n if (path) {\n // lower-case windows drive letters in /C:/fff or C:/fff\n if (path.length >= 3 && path.charCodeAt(0) === 47 /* Slash */ && path.charCodeAt(2) === 58 /* Colon */) {\n var code = path.charCodeAt(1);\n if (code >= 65 /* A */ && code <= 90 /* Z */) {\n path = \"/\" + String.fromCharCode(code + 32) + \":\" + path.substr(3); // \"/c:\".length === 3\n }\n }\n else if (path.length >= 2 && path.charCodeAt(1) === 58 /* Colon */) {\n var code = path.charCodeAt(0);\n if (code >= 65 /* A */ && code <= 90 /* Z */) {\n path = String.fromCharCode(code + 32) + \":\" + path.substr(2); // \"/c:\".length === 3\n }\n }\n // encode the rest of the path\n res += encoder(path, true);\n }\n if (query) {\n res += '?';\n res += encoder(query, false);\n }\n if (fragment) {\n res += '#';\n res += !skipEncoding ? encodeURIComponentFast(fragment, false) : fragment;\n }\n return res;\n}\n// --- decode\nfunction decodeURIComponentGraceful(str) {\n try {\n return decodeURIComponent(str);\n }\n catch (_a) {\n if (str.length > 3) {\n return str.substr(0, 3) + decodeURIComponentGraceful(str.substr(3));\n }\n else {\n return str;\n }\n }\n}\nvar _rEncodedAsHex = /(%[0-9A-Za-z][0-9A-Za-z])+/g;\nfunction percentDecode(str) {\n if (!str.match(_rEncodedAsHex)) {\n return str;\n }\n return str.replace(_rEncodedAsHex, function (match) { return decodeURIComponentGraceful(match); });\n}\n", null, "import Scanner from './index';\n\ninterface QuotedOptions {\n /** A character code of quote-escape symbol */\n escape?: number;\n\n /** Throw error if quotes string can’t be properly consumed */\n throws?: boolean;\n}\n\nconst defaultQuotedOptions: QuotedOptions = {\n escape: 92, // \\ character\n throws: false\n};\n\n/**\n * Check if given code is a number\n */\nexport function isNumber(code: number): boolean {\n return code > 47 && code < 58;\n}\n\n/**\n * Check if given character code is alpha code (letter through A to Z)\n */\nexport function isAlpha(code: number, from?: number, to?: number): boolean {\n from = from || 65; // A\n to = to || 90; // Z\n code &= ~32; // quick hack to convert any char code to uppercase char code\n\n return code >= from && code <= to;\n}\n\n/**\n * Check if given character code is alpha-numeric (letter through A to Z or number)\n */\nexport function isAlphaNumeric(code: number): boolean {\n return isNumber(code) || isAlpha(code);\n}\n\nexport function isAlphaNumericWord(code: number): boolean {\n return isNumber(code) || isAlphaWord(code);\n}\n\nexport function isAlphaWord(code: number): boolean {\n return code === 95 /* _ */ || isAlpha(code);\n}\n\n/**\n * Check if given character code is a white-space character: a space character\n * or line breaks\n */\nexport function isWhiteSpace(code: number) {\n return code === 32 /* space */\n || code === 9 /* tab */\n || code === 160; /* non-breaking space */\n}\n\n/**\n * Check if given character code is a space character\n */\nexport function isSpace(code: number): boolean {\n return isWhiteSpace(code)\n || code === 10 /* LF */\n || code === 13; /* CR */\n}\n\n/**\n * Consumes 'single' or \"double\"-quoted string from given string, if possible\n * @return `true` if quoted string was consumed. The contents of quoted string\n * will be available as `stream.current()`\n */\nexport function eatQuoted(stream: Scanner, options?: QuotedOptions): boolean {\n options = { ...defaultQuotedOptions, ...options };\n const start = stream.pos;\n const quote = stream.peek();\n\n if (stream.eat(isQuote)) {\n while (!stream.eof()) {\n switch (stream.next()) {\n case quote:\n stream.start = start;\n return true;\n\n case options.escape:\n stream.next();\n break;\n }\n }\n\n // If we’re here then stream wasn’t properly consumed.\n // Revert stream and decide what to do\n stream.pos = start;\n\n if (options.throws) {\n throw stream.error('Unable to consume quoted string');\n }\n }\n\n return false;\n}\n\n/**\n * Check if given character code is a quote character\n */\nexport function isQuote(code: number): boolean {\n return code === 39 /* ' */ || code === 34 /* \" */;\n}\n\n/**\n * Eats paired characters substring, for example `(foo)` or `[bar]`\n * @param open Character code of pair opening\n * @param close Character code of pair closing\n * @return Returns `true` if character pair was successfully consumed, it’s\n * content will be available as `stream.current()`\n */\nexport function eatPair(stream: Scanner, open: number, close: number, options?: QuotedOptions): boolean {\n options = { ...defaultQuotedOptions, ...options };\n const start = stream.pos;\n\n if (stream.eat(open)) {\n let stack = 1;\n let ch: number;\n\n while (!stream.eof()) {\n if (eatQuoted(stream, options)) {\n continue;\n }\n\n ch = stream.next()!;\n if (ch === open) {\n stack++;\n } else if (ch === close) {\n stack--;\n if (!stack) {\n stream.start = start;\n return true;\n }\n } else if (ch === options.escape) {\n stream.next();\n }\n }\n\n // If we’re here then paired character can’t be consumed\n stream.pos = start;\n\n if (options.throws) {\n throw stream.error(`Unable to find matching pair for ${String.fromCharCode(open)}`);\n }\n }\n\n return false;\n}\n", "type MatchFn = (ch: number) => boolean;\n\n/**\n * A streaming, character code-based string reader\n */\nexport default class Scanner {\n /** Current string */\n string: string;\n\n /** Current scanner position */\n pos: number;\n /** Lower range limit where string reader is available */\n start: number;\n\n /** Upper range limit where string reader is available */\n end: number;\n\n constructor(str: string, start?: number, end?: number) {\n if (end == null && typeof str === 'string') {\n end = str.length;\n }\n\n this.string = str;\n this.pos = this.start = start || 0;\n this.end = end || 0;\n }\n\n /**\n * Returns true only if the stream is at the end of the file.\n */\n eof(): boolean {\n return this.pos >= this.end;\n }\n\n /**\n * Creates a new stream instance which is limited to given `start` and `end`\n * range. E.g. its `eof()` method will look at `end` property, not actual\n * stream end\n */\n limit(start?: number, end?: number): Scanner {\n return new Scanner(this.string, start, end);\n }\n\n /**\n * Returns the next character code in the stream without advancing it.\n * Will return NaN at the end of the file.\n */\n peek(): number {\n return this.string.charCodeAt(this.pos);\n }\n\n /**\n * Returns the next character in the stream and advances it.\n * Also returns <code>undefined</code> when no more characters are available.\n */\n next(): number | undefined {\n if (this.pos < this.string.length) {\n return this.string.charCodeAt(this.pos++);\n }\n }\n\n /**\n * `match` can be a character code or a function that takes a character code\n * and returns a boolean. If the next character in the stream 'matches'\n * the given argument, it is consumed and returned.\n * Otherwise, `false` is returned.\n */\n eat(match: number | MatchFn): boolean {\n const ch = this.peek();\n const ok = typeof match === 'function' ? match(ch) : ch === match;\n\n if (ok) {\n this.next();\n }\n\n return ok;\n }\n\n /**\n * Repeatedly calls <code>eat</code> with the given argument, until it\n * fails. Returns <code>true</code> if any characters were eaten.\n */\n eatWhile(match: number | MatchFn): boolean {\n const start = this.pos;\n while (!this.eof() && this.eat(match)) { /* */ }\n return this.pos !== start;\n }\n\n /**\n * Backs up the stream n characters. Backing it up further than the\n * start of the current token will cause things to break, so be careful.\n */\n backUp(n: number) {\n this.pos -= (n || 1);\n }\n\n /**\n * Get the string between the start of the current token and the\n * current stream position.\n */\n current(): string {\n return this.substring(this.start, this.pos);\n }\n\n /**\n * Returns substring for given range\n */\n substring(start: number, end?: number): string {\n return this.string.slice(start, end);\n }\n\n /**\n * Creates error object with current stream state\n */\n error(message: string, pos = this.pos): ScannerError {\n return new ScannerError(`${message} at ${pos + 1}`, pos, this.string);\n }\n}\n\nexport class ScannerError extends Error {\n pos: number;\n string: string;\n\n constructor(message: string, pos: number, str: string) {\n super(message);\n this.pos = pos;\n this.string = str;\n }\n}\n\nexport * from './utils';\n", "import { AllTokens } from '../tokenizer';\n\nexport interface TokenScanner {\n tokens: AllTokens[];\n start: number;\n pos: number;\n size: number;\n}\n\ntype TestFn = (token?: AllTokens) => boolean;\n\nexport default function tokenScanner(tokens: AllTokens[]): TokenScanner {\n return {\n tokens,\n start: 0,\n pos: 0,\n size: tokens.length\n };\n}\n\nexport function peek(scanner: TokenScanner): AllTokens | undefined {\n return scanner.tokens[scanner.pos];\n}\n\nexport function next(scanner: TokenScanner): AllTokens | undefined {\n return scanner.tokens[scanner.pos++];\n}\n\nexport function slice(scanner: TokenScanner, from = scanner.start, to = scanner.pos): AllTokens[] {\n return scanner.tokens.slice(from, to);\n}\n\nexport function readable(scanner: TokenScanner): boolean {\n return scanner.pos < scanner.size;\n}\n\nexport function consume(scanner: TokenScanner, test: TestFn): boolean {\n const token = peek(scanner);\n if (token && test(token)) {\n scanner.pos++;\n return true;\n }\n\n return false;\n}\n\nexport function error(scanner: TokenScanner, message: string, token = peek(scanner)) {\n if (token && token.start != null) {\n message += ` at ${token.start}`;\n }\n\n const err = new Error(message);\n err['pos'] = token && token.start;\n\n return err;\n}\n\nexport function consumeWhile(scanner: TokenScanner, test: TestFn): boolean {\n const start = scanner.pos;\n while (consume(scanner, test)) { /* */ }\n return scanner.pos !== start;\n}\n", "import { NameToken, ValueToken, Repeater, AllTokens, BracketType, Bracket, Operator, OperatorType, Quote, WhiteSpace, Literal } from '../tokenizer';\nimport tokenScanner, { TokenScanner, peek, consume, readable, next, error, slice } from './TokenScanner';\nimport { ParserOptions } from '../types';\n\nexport type TokenStatement = TokenElement | TokenGroup;\n\nexport interface TokenAttribute {\n name?: ValueToken[];\n value?: ValueToken[];\n expression?: boolean;\n}\n\nexport interface TokenElement {\n type: 'TokenElement';\n name?: NameToken[];\n attributes?: TokenAttribute[];\n value?: ValueToken[];\n repeat?: Repeater;\n selfClose: boolean;\n elements: TokenStatement[];\n}\n\nexport interface TokenGroup {\n type: 'TokenGroup';\n elements: TokenStatement[];\n repeat?: Repeater;\n}\n\nexport default function abbreviation(abbr: AllTokens[], options: ParserOptions = {}): TokenGroup {\n const scanner = tokenScanner(abbr);\n const result = statements(scanner, options);\n if (readable(scanner)) {\n throw error(scanner, 'Unexpected character');\n }\n\n return result;\n}\n\nfunction statements(scanner: TokenScanner, options: ParserOptions): TokenGroup {\n const result: TokenGroup = {\n type: 'TokenGroup',\n elements: []\n };\n\n let ctx: TokenStatement = result;\n let node: TokenStatement | undefined;\n const stack: TokenStatement[] = [];\n\n while (readable(scanner)) {\n if (node = element(scanner, options) || group(scanner, options)) {\n ctx.elements.push(node);\n if (consume(scanner, isChildOperator)) {\n stack.push(ctx);\n ctx = node;\n } else if (consume(scanner, isSiblingOperator)) {\n continue;\n } else if (consume(scanner, isClimbOperator)) {\n do {\n if (stack.length) {\n ctx = stack.pop()!;\n }\n } while (consume(scanner, isClimbOperator));\n }\n } else {\n break;\n }\n }\n\n return result;\n}\n\n/**\n * Consumes group from given scanner\n */\nfunction group(scanner: TokenScanner, options: ParserOptions): TokenGroup | undefined {\n if (consume(scanner, isGroupStart)) {\n const result = statements(scanner, options);\n const token = next(scanner);\n if (isBracket(token, 'group', false)) {\n result.repeat = repeater(scanner);\n }\n return result;\n }\n}\n\n/**\n * Consumes single element from given scanner\n */\nfunction element(scanner: TokenScanner, options: ParserOptions): TokenElement | undefined {\n let attr: TokenAttribute | TokenAttribute[] | undefined;\n const elem: TokenElement = {\n type: 'TokenElement',\n name: void 0,\n attributes: void 0,\n value: void 0,\n repeat: void 0,\n selfClose: false,\n elements: []\n };\n\n if (elementName(scanner, options)) {\n elem.name = slice(scanner) as NameToken[];\n }\n\n while (readable(scanner)) {\n scanner.start = scanner.pos;\n if (!elem.repeat && !isEmpty(elem) && consume(scanner, isRepeater)) {\n elem.repeat = scanner.tokens[scanner.pos - 1] as Repeater;\n } else if (!elem.value && text(scanner)) {\n elem.value = getText(scanner);\n } else if (attr = shortAttribute(scanner, 'id', options) || shortAttribute(scanner, 'class', options) || attributeSet(scanner)) {\n if (!elem.attributes) {\n elem.attributes = Array.isArray(attr) ? attr.slice() : [attr];\n } else {\n elem.attributes = elem.attributes.concat(attr);\n }\n } else {\n if (!isEmpty(elem) && consume(scanner, isCloseOperator)) {\n elem.selfClose = true;\n if (!elem.repeat && consume(scanner, isRepeater)) {\n elem.repeat = scanner.tokens[scanner.pos - 1] as Repeater;\n }\n }\n break;\n }\n }\n\n return !isEmpty(elem) ? elem : void 0;\n}\n\n/**\n * Consumes attribute set from given scanner\n */\nfunction attributeSet(scanner: TokenScanner): TokenAttribute[] | undefined {\n if (consume(scanner, isAttributeSetStart)) {\n const attributes: TokenAttribute[] = [];\n let attr: TokenAttribute | undefined;\n\n while (readable(scanner)) {\n if (attr = attribute(scanner)) {\n attributes.push(attr);\n } else if (consume(scanner, isAttributeSetEnd)) {\n break;\n } else if (!consume(scanner, isWhiteSpace)) {\n throw error(scanner, `Unexpected \"${peek(scanner)!.type}\" token`);\n }\n }\n\n return attributes;\n }\n}\n\n/**\n * Consumes attribute shorthand (class or id) from given scanner\n */\nfunction shortAttribute(scanner: TokenScanner, type: 'class' | 'id', options: ParserOptions): TokenAttribute | undefined {\n if (isOperator(peek(scanner), type)) {\n scanner.pos++;\n const attr: TokenAttribute = {\n name: [createLiteral(type)]\n };\n\n // Consume expression after shorthand start for React-like components\n if (options.jsx && text(scanner)) {\n attr.value = getText(scanner);\n attr.expression = true;\n } else {\n attr.value = literal(scanner) ? slice(scanner) as ValueToken[] : void 0;\n }\n\n return attr;\n }\n}\n\n/**\n * Consumes single attribute from given scanner\n */\nfunction attribute(scanner: TokenScanner): TokenAttribute | undefined {\n if (quoted(scanner)) {\n // Consumed quoted value: it’s a value for default attribute\n return {\n value: slice(scanner) as ValueToken[]\n };\n }\n\n if (literal(scanner, true)) {\n return {\n name: slice(scanner) as NameToken[],\n value: consume(scanner, isEquals) && (quoted(scanner) || literal(scanner, true))\n ? slice(scanner) as ValueToken[]\n : void 0\n };\n }\n}\n\nfunction repeater(scanner: TokenScanner): Repeater | undefined {\n return isRepeater(peek(scanner))\n ? scanner.tokens[scanner.pos++] as Repeater\n : void 0;\n}\n\n/**\n * Consumes quoted value from given scanner, if possible\n */\nfunction quoted(scanner: TokenScanner): boolean {\n const start = scanner.pos;\n const quote = peek(scanner);\n if (isQuote(quote)) {\n scanner.pos++;\n while (readable(scanner)) {\n if (isQuote(next(scanner), quote.single)) {\n scanner.start = start;\n return true;\n }\n }\n\n throw error(scanner, 'Unclosed quote', quote);\n }\n\n return false;\n}\n\n/**\n * Consumes literal (unquoted value) from given scanner\n */\nfunction literal(scanner: TokenScanner, allowBrackets?: boolean): boolean {\n const start = scanner.pos;\n const brackets: { [type in BracketType]: number } = {\n attribute: 0,\n expression: 0,\n group: 0\n };\n\n while (readable(scanner)) {\n const token = peek(scanner);\n if (brackets.expression) {\n // If we’re inside expression, we should consume all content in it\n if (isBracket(token, 'expression')) {\n brackets[token.context] += token.open ? 1 : -1;\n }\n } else if (isQuote(token) || isOperator(token) || isWhiteSpace(token) || isRepeater(token)) {\n break;\n } else if (isBracket(token)) {\n if (!allowBrackets) {\n break;\n }\n\n if (token.open) {\n brackets[token.context]++;\n } else if (!brackets[token.context]) {\n // Stop if found unmatched closing brace: it must be handled\n // by parent consumer\n break;\n } else {\n brackets[token.context]--;\n }\n }\n\n scanner.pos++;\n }\n\n if (start !== scanner.pos) {\n scanner.start = start;\n return true;\n }\n\n return false;\n}\n\n/**\n * Consumes element name from given scanner\n */\nfunction elementName(scanner: TokenScanner, options: ParserOptions): boolean {\n const start = scanner.pos;\n\n if (options.jsx && consume(scanner, isCapitalizedLiteral)) {\n // Check for edge case: consume immediate capitalized class names\n // for React-like components, e.g. `Foo.Bar.Baz`\n while (readable(scanner)) {\n const { pos } = scanner;\n if (!consume(scanner, isClassNameOperator) || !consume(scanner, isCapitalizedLiteral)) {\n scanner.pos = pos;\n break;\n }\n }\n }\n\n while (readable(scanner) && consume(scanner, isElementName)) {\n // empty\n }\n\n if (scanner.pos !== start) {\n scanner.start = start;\n return true;\n }\n\n return false;\n}\n\n/**\n * Consumes text value from given scanner\n */\nfunction text(scanner: TokenScanner): boolean {\n const start = scanner.pos;\n if (consume(scanner, isTextStart)) {\n let brackets = 0;\n while (readable(scanner)) {\n const token = next(scanner);\n if (isBracket(token, 'expression')) {\n if (token.open) {\n brackets++;\n } else if (!brackets) {\n break;\n } else {\n brackets--;\n }\n }\n }\n\n scanner.start = start;\n return true;\n }\n\n return false;\n}\n\nfunction getText(scanner: TokenScanner): ValueToken[] {\n let from = scanner.start;\n let to = scanner.pos;\n if (isBracket(scanner.tokens[from], 'expression', true)) {\n from++;\n }\n\n if (isBracket(scanner.tokens[to - 1], 'expression', false)) {\n to--;\n }\n\n return slice(scanner, from, to) as ValueToken[];\n}\n\nexport function isBracket(token: AllTokens | undefined, context?: BracketType, isOpen?: boolean): token is Bracket {\n return Boolean(token && token.type === 'Bracket'\n && (!context || token.context === context)\n && (isOpen == null || token.open === isOpen));\n}\n\nexport function isOperator(token: AllTokens | undefined, type?: OperatorType): token is Operator {\n return Boolean(token && token.type === 'Operator' && (!type || token.operator === type));\n}\n\nexport function isQuote(token: AllTokens | undefined, isSingle?: boolean): token is Quote {\n return Boolean(token && token.type === 'Quote' && (isSingle == null || token.single === isSingle));\n}\n\nfunction isWhiteSpace(token?: AllTokens): token is WhiteSpace {\n return Boolean(token && token.type === 'WhiteSpace');\n}\n\nfunction isEquals(token: AllTokens) {\n return isOperator(token, 'equal');\n}\n\nfunction isRepeater(token?: AllTokens): token is Repeater {\n return Boolean(token && token.type === 'Repeater');\n}\n\nfunction isLiteral(token: AllTokens): token is Literal {\n return token.type === 'Literal';\n}\n\nfunction isCapitalizedLiteral(token: AllTokens) {\n if (isLiteral(token)) {\n const ch = token.value.charCodeAt(0);\n return ch >= 65 && ch <= 90;\n }\n return false;\n}\n\nfunction isElementName(token: AllTokens): boolean {\n return token.type === 'Literal' || token.type === 'RepeaterNumber' || token.type === 'RepeaterPlaceholder';\n}\n\nfunction isClassNameOperator(token: AllTokens) {\n return isOperator(token, 'class');\n}\n\nfunction isAttributeSetStart(token?: AllTokens) {\n return isBracket(token, 'attribute', true);\n}\n\nfunction isAttributeSetEnd(token?: AllTokens) {\n return isBracket(token, 'attribute', false);\n}\n\nfunction isTextStart(token: AllTokens) {\n return isBracket(token, 'expression', true);\n}\n\nfunction isGroupStart(token: AllTokens) {\n return isBracket(token, 'group', true);\n}\n\nfunction createLiteral(value: string): Literal {\n return { type: 'Literal', value };\n}\n\nfunction isEmpty(elem: TokenElement): boolean {\n return !elem.name && !elem.value && !elem.attributes;\n}\n\nfunction isChildOperator(token: AllTokens) {\n return isOperator(token, 'child');\n}\n\nfunction isSiblingOperator(token: AllTokens) {\n return isOperator(token, 'sibling');\n}\n\nfunction isClimbOperator(token: AllTokens) {\n return isOperator(token, 'climb');\n}\n\nfunction isCloseOperator(token: AllTokens) {\n return isOperator(token, 'close');\n}\n", "import Scanner from '@emmetio/scanner';\n\nexport const enum Chars {\n /** `{` character */\n CurlyBracketOpen = 123,\n\n /** `}` character */\n CurlyBracketClose = 125,\n\n /** `\\\\` character */\n Escape = 92,\n\n /** `=` character */\n Equals = 61,\n\n /** `[` character */\n SquareBracketOpen = 91,\n\n /** `]` character */\n SquareBracketClose = 93,\n\n /** `*` character */\n Asterisk = 42,\n\n /** `#` character */\n Hash = 35,\n\n /** `$` character */\n Dollar = 36,\n\n /** `-` character */\n Dash = 45,\n\n /** `.` character */\n Dot = 46,\n\n /** `/` character */\n Slash = 47,\n\n /** `:` character */\n Colon = 58,\n\n /** `!` character */\n Excl = 33,\n\n /** `@` character */\n At = 64,\n\n /** `_` character */\n Underscore = 95,\n\n /** `(` character */\n RoundBracketOpen = 40,\n\n /** `)` character */\n RoundBracketClose = 41,\n\n /** `+` character */\n Sibling = 43,\n\n /** `>` character */\n Child = 62,\n\n /** `^` character */\n Climb = 94,\n\n /** `'` character */\n SingleQuote = 39,\n\n /** `\"\"` character */\n DoubleQuote = 34,\n}\n\n/**\n * If consumes escape character, sets current stream range to escaped value\n */\nexport function escaped(scanner: Scanner): boolean {\n if (scanner.eat(Chars.Escape)) {\n scanner.start = scanner.pos;\n if (!scanner.eof()) {\n scanner.pos++;\n }\n return true;\n }\n\n return false;\n}\n", "import Scanner, { isSpace, isQuote, isNumber, isAlpha, isAlphaNumericWord } from '@emmetio/scanner';\nimport { Literal, WhiteSpace, Quote, Bracket, BracketType, OperatorType, Operator, RepeaterPlaceholder, Repeater, Field, RepeaterNumber, AllTokens } from './tokens';\nimport { Chars, escaped } from './utils';\n\nexport * from './tokens';\n\ntype Context = { [ctx in BracketType]: number } & { quote: number };\n\nexport default function tokenize(source: string): AllTokens[] {\n const scanner = new Scanner(source);\n const result: AllTokens[] = [];\n const ctx: Context = {\n group: 0,\n attribute: 0,\n expression: 0,\n quote: 0\n };\n\n let ch = 0;\n let token: AllTokens | undefined;\n\n while (!scanner.eof()) {\n ch = scanner.peek();\n token = getToken(scanner, ctx);\n\n if (token) {\n result.push(token);\n if (token.type === 'Quote') {\n ctx.quote = ch === ctx.quote ? 0 : ch;\n } else if (token.type === 'Bracket') {\n ctx[token.context] += token.open ? 1 : -1;\n }\n } else {\n throw scanner.error('Unexpected character');\n }\n }\n\n return result;\n}\n\n/**\n * Returns next token from given scanner, if possible\n */\nexport function getToken(scanner: Scanner, ctx: Context): AllTokens | undefined {\n return field(scanner, ctx)\n || repeaterPlaceholder(scanner)\n || repeaterNumber(scanner)\n || repeater(scanner)\n || whiteSpace(scanner)\n || literal(scanner, ctx)\n || operator(scanner)\n || quote(scanner)\n || bracket(scanner);\n}\n\n/**\n * Consumes literal from given scanner\n */\nfunction literal(scanner: Scanner, ctx: Context): Literal | undefined {\n const start = scanner.pos;\n let value = '';\n\n while (!scanner.eof()) {\n // Consume escaped sequence no matter of context\n if (escaped(scanner)) {\n value += scanner.current();\n continue;\n }\n\n const ch = scanner.peek();\n\n if (ch === ctx.quote || ch === Chars.Dollar || isAllowedOperator(ch, ctx)) {\n // 1. Found matching quote\n // 2. The `$` character has special meaning in every context\n // 3. Depending on context, some characters should be treated as operators\n break;\n }\n\n if (ctx.expression && ch === Chars.CurlyBracketClose) {\n break;\n }\n\n if (!ctx.quote && !ctx.expression) {\n // Consuming element name\n if (!ctx.attribute && !isElementName(ch)) {\n break;\n }\n\n if (isAllowedSpace(ch, ctx) || isAllowedRepeater(ch, ctx) || isQuote(ch) || bracketType(ch)) {\n // Stop for characters not allowed in unquoted literal\n break;\n }\n }\n\n\n value += scanner.string[scanner.pos++];\n }\n\n if (start !== scanner.pos) {\n scanner.start = start;\n return {\n type: 'Literal',\n value,\n start,\n end: scanner.pos\n };\n }\n}\n\n/**\n * Consumes white space characters as string literal from given scanner\n */\nfunction whiteSpace(scanner: Scanner): WhiteSpace | undefined {\n const start = scanner.pos;\n if (scanner.eatWhile(isSpace)) {\n return {\n type: 'WhiteSpace',\n start,\n end: scanner.pos\n };\n }\n}\n\n/**\n * Consumes quote from given scanner\n */\nfunction quote(scanner: Scanner): Quote | undefined {\n const ch = scanner.peek();\n if (isQuote(ch)) {\n return {\n type: 'Quote',\n single: ch === Chars.SingleQuote,\n start: scanner.pos++,\n end: scanner.pos\n };\n }\n}\n\n/**\n * Consumes bracket from given scanner\n */\nfunction bracket(scanner: Scanner): Bracket | undefined {\n const ch = scanner.peek();\n const context = bracketType(ch);\n if (context) {\n return {\n type: 'Bracket',\n open: isOpenBracket(ch),\n context,\n start: scanner.pos++,\n end: scanner.pos\n };\n }\n}\n\n/**\n * Consumes operator from given scanner\n */\nfunction operator(scanner: Scanner): Operator | undefined {\n const op = operatorType(scanner.peek());\n if (op) {\n return {\n type: 'Operator',\n operator: op,\n start: scanner.pos++,\n end: scanner.pos\n };\n }\n}\n\n/**\n * Consumes node repeat token from current stream position and returns its\n * parsed value\n */\nfunction repeater(scanner: Scanner): Repeater | undefined {\n const start = scanner.pos;\n if (scanner.eat(Chars.Asterisk)) {\n scanner.start = scanner.pos;\n let count = 1;\n let implicit = false;\n\n if (scanner.eatWhile(isNumber)) {\n count = Number(scanner.current());\n } else {\n implicit = true;\n }\n\n return {\n type: 'Repeater',\n count,\n value: 0,\n implicit,\n start,\n end: scanner.pos\n };\n }\n}\n\n/**\n * Consumes repeater placeholder `$#` from given scanner\n */\nfunction repeaterPlaceholder(scanner: Scanner): RepeaterPlaceholder | undefined {\n const start = scanner.pos;\n if (scanner.eat(Chars.Dollar) && scanner.eat(Chars.Hash)) {\n return {\n type: 'RepeaterPlaceholder',\n value: void 0,\n start,\n end: scanner.pos\n };\n }\n\n scanner.pos = start;\n}\n\n/**\n * Consumes numbering token like `$` from given scanner state\n */\nfunction repeaterNumber(scanner: Scanner): RepeaterNumber | undefined {\n const start = scanner.pos;\n if (scanner.eatWhile(Chars.Dollar)) {\n const size = scanner.pos - start;\n let reverse = false;\n let base = 1;\n let parent = 0;\n\n if (scanner.eat(Chars.At)) {\n // Consume numbering modifiers\n while (scanner.eat(Chars.Climb)) {\n parent++;\n }\n\n reverse = scanner.eat(Chars.Dash);\n scanner.start = scanner.pos;\n if (scanner.eatWhile(isNumber)) {\n base = Number(scanner.current());\n }\n }\n\n scanner.start = start;\n\n return {\n type: 'RepeaterNumber',\n size,\n reverse,\n base,\n parent,\n start,\n end: scanner.pos\n };\n }\n}\n\nfunction field(scanner: Scanner, ctx: Context): Field | undefined {\n const start = scanner.pos;\n // Fields are allowed inside expressions and attributes\n if ((ctx.expression || ctx.attribute) && scanner.eat(Chars.Dollar) && scanner.eat(Chars.CurlyBracketOpen)) {\n scanner.start = scanner.pos;\n\n let index: number | undefined;\n let name: string = '';\n\n if (scanner.eatWhile(isNumber)) {\n // It’s a field\n index = Number(scanner.current());\n name = scanner.eat(Chars.Colon) ? consumePlaceholder(scanner) : '';\n } else if (isAlpha(scanner.peek())) {\n // It’s a variable\n name = consumePlaceholder(scanner);\n }\n\n if (scanner.eat(Chars.CurlyBracketClose)) {\n return {\n type: 'Field',\n index, name,\n start,\n end: scanner.pos\n };\n }\n\n throw scanner.error('Expecting }');\n }\n\n // If we reached here then there’s no valid field here, revert\n // back to starting position\n scanner.pos = start;\n}\n\n/**\n * Consumes a placeholder: value right after `:` in field. Could be empty\n */\nfunction consumePlaceholder(stream: Scanner): string {\n const stack: number[] = [];\n stream.start = stream.pos;\n\n while (!stream.eof()) {\n if (stream.eat(Chars.CurlyBracketOpen)) {\n stack.push(stream.pos);\n } else if (stream.eat(Chars.CurlyBracketClose)) {\n if (!stack.length) {\n stream.pos--;\n break;\n }\n stack.pop();\n } else {\n stream.pos++;\n }\n }\n\n if (stack.length) {\n stream.pos = stack.pop()!;\n throw stream.error(`Expecting }`);\n }\n\n return stream.current();\n}\n\n/**\n * Check if given character code is an operator and it’s allowed in current context\n */\nfunction isAllowedOperator(ch: number, ctx: Context): boolean {\n const op = operatorType(ch);\n if (!op || ctx.quote || ctx.expression) {\n // No operators inside quoted values or expressions\n return false;\n }\n\n // Inside attributes, only `equals` is allowed\n return !ctx.attribute || op === 'equal';\n}\n\n/**\n * Check if given character is a space character and is allowed to be consumed\n * as a space token in current context\n */\nfunction isAllowedSpace(ch: number, ctx: Context): boolean {\n return isSpace(ch) && !ctx.expression;\n}\n\n/**\n * Check if given character can be consumed as repeater in current context\n */\nfunction isAllowedRepeater(ch: number, ctx: Context): boolean {\n return ch === Chars.Asterisk && !ctx.attribute && !ctx.expression;\n}\n\n/**\n * If given character is a bracket, returns it’s type\n */\nfunction bracketType(ch: number): BracketType | undefined {\n if (ch === Chars.RoundBracketOpen || ch === Chars.RoundBracketClose) {\n return 'group';\n }\n\n if (ch === Chars.SquareBracketOpen || ch === Chars.SquareBracketClose) {\n return 'attribute';\n }\n\n if (ch === Chars.CurlyBracketOpen || ch === Chars.CurlyBracketClose) {\n return 'expression';\n }\n}\n\n/**\n * If given character is an operator, returns it’s type\n */\nfunction operatorType(ch: number): OperatorType | undefined {\n return (ch === Chars.Child && 'child')\n || (ch === Chars.Sibling && 'sibling')\n || (ch === Chars.Climb && 'climb')\n || (ch === Chars.Dot && 'class')\n || (ch === Chars.Hash && 'id')\n || (ch === Chars.Slash && 'close')\n || (ch === Chars.Equals && 'equal')\n || void 0;\n}\n\n/**\n * Check if given character is an open bracket\n */\nfunction isOpenBracket(ch: number): boolean {\n return ch === Chars.CurlyBracketOpen\n || ch === Chars.SquareBracketOpen\n || ch === Chars.RoundBracketOpen;\n}\n\n/**\n * Check if given character is allowed in element name\n */\nfunction isElementName(ch: number) {\n return isAlphaNumericWord(ch)\n || ch === Chars.Dash\n || ch === Chars.Colon\n || ch === Chars.Excl;\n}\n", "import { Token, Literal, Bracket, Field, RepeaterPlaceholder, Repeater, RepeaterNumber, ValueToken, Quote, Operator, OperatorType } from './tokenizer/tokens';\nimport { ConvertState } from './types';\n\ntype TokenVisitor = (token: Token, state: ConvertState) => string;\n\nconst operators: { [key in OperatorType]: string } = {\n child: '>',\n class: '.',\n climb: '^',\n id: '#',\n equal: '=',\n close: '/',\n sibling: '+'\n};\n\nconst tokenVisitor: { [name: string]: TokenVisitor } = {\n Literal(token: Literal): string {\n return token.value;\n },\n Quote(token: Quote) {\n return token.single ? '\\'' : '\"';\n },\n Bracket(token: Bracket): string {\n if (token.context === 'attribute') {\n return token.open ? '[' : ']';\n } else if (token.context === 'expression') {\n return token.open ? '{' : '}';\n } else {\n return token.open ? '(' : '}';\n }\n },\n Operator(token: Operator) {\n return operators[token.operator];\n },\n Field(token: Field, state) {\n if (token.index != null) {\n // It’s a field: by default, return TextMate-compatible field\n return token.name\n ? `\\${${token.index}:${token.name}}`\n : `\\${${token.index}`;\n } else if (token.name) {\n // It’s a variable\n return state.getVariable(token.name);\n }\n\n return '';\n },\n RepeaterPlaceholder(token: RepeaterPlaceholder, state) {\n // Find closest implicit repeater\n let repeater: Repeater | undefined;\n for (let i = state.repeaters.length - 1; i >= 0; i--) {\n if (state.repeaters[i]!.implicit) {\n repeater = state.repeaters[i]!;\n break;\n }\n }\n\n state.inserted = true;\n return state.getText(repeater && repeater.value);\n },\n RepeaterNumber(token: RepeaterNumber, state) {\n let value = 1;\n const lastIx = state.repeaters.length - 1;\n // const repeaterIx = Math.max(0, state.repeaters.length - 1 - token.parent);\n const repeater = state.repeaters[lastIx];\n if (repeater) {\n value = token.reverse\n ? token.base + repeater.count - repeater.value! - 1\n : token.base + repeater.value!;\n\n if (token.parent) {\n const parentIx = Math.max(0, lastIx - token.parent);\n if (parentIx !== lastIx) {\n const parentRepeater = state.repeaters[parentIx];\n value += repeater.count * parentRepeater.value;\n }\n }\n }\n\n let result = String(value);\n while (result.length < token.size) {\n result = '0' + result;\n }\n\n return result;\n },\n WhiteSpace() {\n return ' ';\n }\n};\n\n/**\n * Converts given value token to string\n */\nexport default function stringify(token: ValueToken, state: ConvertState): string {\n if (!tokenVisitor[token.type]) {\n throw new Error(`Unknown token ${token.type}`);\n }\n return tokenVisitor[token.type](token, state);\n}\n", "import { TokenGroup, TokenStatement, TokenElement, TokenAttribute, isQuote, isBracket } from './parser';\nimport { Abbreviation, ParserOptions, AbbreviationNode, ConvertState, Value, AbbreviationAttribute, AttributeType } from './types';\nimport { Repeater, ValueToken, Quote, Field } from './tokenizer';\nimport stringify from './stringify';\n\nconst urlRegex = /^((https?:|ftp:|file:)?\\/\\/|(www|ftp)\\.)[^ ]*$/;\nconst emailRegex = /^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,5}$/;\n\n/**\n * Converts given token-based abbreviation into simplified and unrolled node-based\n * abbreviation\n */\nexport default function convert(abbr: TokenGroup, options: ParserOptions = {}): Abbreviation {\n let textInserted = false;\n\n let cleanText: string | string[] | undefined;\n if (options.text) {\n if (Array.isArray(options.text)) {\n cleanText = options.text.filter(s => s.trim());\n } else {\n cleanText = options.text;\n }\n }\n\n const result: Abbreviation = {\n type: 'Abbreviation',\n children: convertGroup(abbr, {\n inserted: false,\n repeaters: [],\n text: options.text,\n cleanText,\n repeatGuard: options.maxRepeat || Number.POSITIVE_INFINITY,\n getText(pos) {\n textInserted = true;\n\n let value: string;\n if (Array.isArray(options.text)) {\n if (pos !== undefined && pos >= 0 && pos < cleanText!.length) {\n return cleanText![pos];\n }\n value = pos !== undefined ? options.text[pos] : options.text.join('\\n');\n } else {\n value = options.text ?? '';\n }\n return value;\n },\n getVariable(name) {\n const varValue = options.variables && options.variables[name];\n return varValue != null ? varValue : name;\n }\n })\n };\n\n if (options.text != null && !textInserted) {\n // Text given but no implicitly repeated elements: insert it into\n // deepest child\n const deepest = deepestNode(last(result.children));\n if (deepest) {\n const text = Array.isArray(options.text) ? options.text.join('\\n') : options.text;\n insertText(deepest, text);\n\n if (deepest.name === 'a' && options.href) {\n // Automatically update value of `<a>` element if inserting URL or email\n insertHref(deepest, text);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Converts given statement to abbreviation nodes\n */\nfunction convertStatement(node: TokenStatement, state: ConvertState): AbbreviationNode[] {\n let result: AbbreviationNode[] = [];\n\n if (node.repeat) {\n // Node is repeated: we should create copies of given node\n // and supply context token with actual repeater state\n const original = node.repeat;\n const repeat = { ...original } as Repeater;\n repeat.count = repeat.implicit && Array.isArray(state.text)\n ? state.cleanText!.length\n : (repeat.count || 1);\n let items: AbbreviationNode[];\n\n state.repeaters.push(repeat);\n\n for (let i = 0; i < repeat.count; i++) {\n repeat.value = i;\n node.repeat = repeat;\n items = isGroup(node)\n ? convertGroup(node, state)\n : convertElement(node, state);\n\n if (repeat.implicit && !state.inserted) {\n // It’s an implicit repeater but no repeater placeholders found inside,\n // we should insert text into deepest node\n const target = last(items);\n const deepest = target && deepestNode(target);\n if (deepest) {\n insertText(deepest, state.getText(repeat.value));\n }\n }\n\n result = result.concat(items);\n\n // We should output at least one repeated item even if it’s reached\n // repeat limit\n if (--state.repeatGuard <= 0) {\n break;\n }\n }\n\n state.repeaters.pop();\n node.repeat = original;\n\n if (repeat.implicit) {\n state.inserted = true;\n }\n } else {\n result = result.concat(isGroup(node) ? convertGroup(node, state) : convertElement(node, state));\n }\n\n return result;\n}\n\nfunction convertElement(node: TokenElement, state: ConvertState): AbbreviationNode[] {\n let children: AbbreviationNode[] = [];\n\n const elem = {\n type: 'AbbreviationNode',\n name: node.name && stringifyName(node.name, state),\n value: node.value && stringifyValue(node.value, state),\n attributes: void 0,\n children,\n repeat: node.repeat && { ...node.repeat },\n selfClosing: node.selfClose,\n } as AbbreviationNode;\n let result: AbbreviationNode[] = [elem];\n\n for (const child of node.elements) {\n children = children.concat(convertStatement(child, state));\n }\n\n if (node.attributes) {\n elem.attributes = [];\n for (const attr of node.attributes) {\n elem.attributes.push(convertAttribute(attr, state));\n }\n }\n\n // In case if current node is a text-only snippet without fields, we should\n // put all children as siblings\n if (!elem.name && !elem.attributes && elem.value && !elem.value.some(isField)) {\n // XXX it’s unclear that `children` is not bound to `elem`\n // due to concat operation\n result = result.concat(children);\n } else {\n elem.children = children;\n }\n\n return result;\n}\n\nfunction convertGroup(node: TokenGroup, state: ConvertState): AbbreviationNode[] {\n let result: AbbreviationNode[] = [];\n for (const child of node.elements) {\n result = result.concat(convertStatement(child, state));\n }\n\n if (node.repeat) {\n result = attachRepeater(result, node.repeat);\n }\n\n return result;\n}\n\nfunction convertAttribute(node: TokenAttribute, state: ConvertState): AbbreviationAttribute {\n let implied = false;\n let isBoolean = false;\n let valueType: AttributeType = node.expression ? 'expression' : 'raw';\n let value: Value[] | undefined;\n const name = node.name && stringifyName(node.name, state);\n\n if (name && name[0] === '!') {\n implied = true;\n }\n\n if (name && name[name.length - 1] === '.') {\n isBoolean = true;\n }\n\n if (node.value) {\n const tokens = node.value.slice();\n\n if (isQuote(tokens[0])) {\n // It’s a quoted value: remove quotes from output but mark attribute\n // value as quoted\n const quote = tokens.shift() as Quote;\n if (tokens.length && last(tokens).type === quote.type) {\n tokens.pop();\n }\n valueType = quote.single ? 'singleQuote' : 'doubleQuote';\n } else if (isBracket(tokens[0], 'expression', true)) {\n // Value is expression: remove brackets but mark value type\n valueType = 'expression';\n tokens.shift();\n if (isBracket(last(tokens), 'expression', false)) {\n tokens.pop();\n }\n }\n\n value = stringifyValue(tokens, state);\n }\n\n return {\n name: isBoolean || implied\n ? name!.slice(implied ? 1 : 0, isBoolean ? -1 : void 0)\n : name,\n value,\n boolean: isBoolean,\n implied,\n valueType\n };\n}\n\n/**\n * Converts given token list to string\n */\nfunction stringifyName(tokens: ValueToken[], state: ConvertState): string {\n let str = '';\n for (let i = 0; i < tokens.length; i++) {\n str += stringify(tokens[i], state);\n }\n\n return str;\n}\n\n/**\n * Converts given token list to value list\n */\nfunction stringifyValue(tokens: ValueToken[], state: ConvertState): Value[] {\n const result: Value[] = [];\n let str = '';\n for (let i = 0, token: ValueToken; i < tokens.length; i++) {\n token = tokens[i];\n if (isField(token)) {\n // We should keep original fields in output since some editors has their\n // own syntax for field or doesn’t support fields at all so we should\n // capture actual field location in output stream\n if (str) {\n result.push(str);\n str = '';\n }\n result.push(token);\n } else {\n str += stringify(token, state);\n }\n }\n\n if (str) {\n result.push(str);\n }\n\n return result;\n}\n\nexport function isGroup(node: any): node is TokenGroup {\n return node.type === 'TokenGroup';\n}\n\nfunction isField(token: any): token is Field {\n return typeof token === 'object' && token.type === 'Field' && token.index != null;\n}\n\nfunction last<T>(arr: T[]): T {\n return arr[arr.length - 1];\n}\n\nfunction deepestNode(node: AbbreviationNode): AbbreviationNode {\n return node.children.length ? deepestNode(last(node.children)) : node;\n}\n\nfunction insertText(node: AbbreviationNode, text: string) {\n if (node.value) {\n const lastToken = last(node.value);\n if (typeof lastToken === 'string') {\n node.value[node.value.length - 1] += text;\n } else {\n node.value.push(text);\n }\n } else {\n node.value = [text];\n }\n}\n\nfunction insertHref(node: AbbreviationNode, text: string) {\n let href = '';\n if (urlRegex.test(text)) {\n href = text;\n if (!/\\w+:/.test(href) && !href.startsWith('//')) {\n href = `http://${href}`;\n }\n } else if (emailRegex.test(text)) {\n href = `mailto:${text}`;\n }\n\n const hrefAttribute = node.attributes?.find(attr => attr.name === 'href');\n if (!hrefAttribute) {\n node.attributes = [{ name: 'href', value: [href], valueType: 'doubleQuote' }];\n } else if (!hrefAttribute.value) {\n hrefAttribute.value = [href];\n }\n}\n\nfunction attachRepeater(items: AbbreviationNode[], repeater: Repeater): AbbreviationNode[] {\n for (const item of items) {\n if (!item.repeat) {\n item.repeat = { ...repeater };\n }\n }\n\n return items;\n}\n", "import { ScannerError } from '@emmetio/scanner';\nimport parse, { TokenGroup } from './parser';\nimport tokenize, { getToken, AllTokens } from './tokenizer';\nimport convert from './convert';\nimport { ParserOptions } from './types';\n\nexport { parse, tokenize, getToken, convert };\nexport * from './tokenizer/tokens';\nexport * from './types';\nexport type MarkupAbbreviation = TokenGroup;\n\n/**\n * Parses given abbreviation into node tree\n */\nexport default function parseAbbreviation(abbr: string | AllTokens[], options?: ParserOptions) {\n try {\n const tokens = typeof abbr === 'string' ? tokenize(abbr) : abbr;\n return convert(parse(tokens, options), options);\n } catch (err) {\n if (err instanceof ScannerError && typeof abbr === 'string') {\n err.message += `\\n${abbr}\\n${'-'.repeat(err.pos)}^`;\n }\n\n throw err;\n }\n}\n", "import Scanner, { isNumber, isAlpha, isAlphaWord, isQuote, isSpace, isAlphaNumericWord, ScannerError } from '@emmetio/scanner';\n\nfunction tokenize(abbr, isValue) {\n let brackets = 0;\n let token;\n const scanner = new Scanner(abbr);\n const tokens = [];\n while (!scanner.eof()) {\n token = getToken(scanner, brackets === 0 && !isValue);\n if (!token) {\n throw scanner.error('Unexpected character');\n }\n if (token.type === 'Bracket') {\n if (!brackets && token.open) {\n mergeTokens(scanner, tokens);\n }\n brackets += token.open ? 1 : -1;\n if (brackets < 0) {\n throw scanner.error('Unexpected bracket', token.start);\n }\n }\n tokens.push(token);\n // Forcibly consume next operator after unit-less numeric value or color:\n // next dash `-` must be used as value delimiter\n if (shouldConsumeDashAfter(token) && (token = operator(scanner))) {\n tokens.push(token);\n }\n }\n return tokens;\n}\n/**\n * Returns next token from given scanner, if possible\n */\nfunction getToken(scanner, short) {\n return field(scanner)\n || numberValue(scanner)\n || colorValue(scanner)\n || stringValue(scanner)\n || bracket(scanner)\n || operator(scanner)\n || whiteSpace(scanner)\n || literal(scanner, short);\n}\nfunction field(scanner) {\n const start = scanner.pos;\n if (scanner.eat(36 /* Dollar */) && scanner.eat(123 /* CurlyBracketOpen */)) {\n scanner.start = scanner.pos;\n let index;\n let name = '';\n if (scanner.eatWhile(isNumber)) {\n // It\u2019s a field\n index = Number(scanner.current());\n name = scanner.eat(58 /* Colon */) ? consumePlaceholder(scanner) : '';\n }\n else if (isAlpha(scanner.peek())) {\n // It\u2019s a variable\n name = consumePlaceholder(scanner);\n }\n if (scanner.eat(125 /* CurlyBracketClose */)) {\n return {\n type: 'Field',\n index, name,\n start,\n end: scanner.pos\n };\n }\n throw scanner.error('Expecting }');\n }\n // If we reached here then there\u2019s no valid field here, revert\n // back to starting position\n scanner.pos = start;\n}\n/**\n * Consumes a placeholder: value right after `:` in field. Could be empty\n */\nfunction consumePlaceholder(stream) {\n const stack = [];\n stream.start = stream.pos;\n while (!stream.eof()) {\n if (stream.eat(123 /* CurlyBracketOpen */)) {\n stack.push(stream.pos);\n }\n else if (stream.eat(125 /* CurlyBracketClose */)) {\n if (!stack.length) {\n stream.pos--;\n break;\n }\n stack.pop();\n }\n else {\n stream.pos++;\n }\n }\n if (stack.length) {\n stream.pos = stack.pop();\n throw stream.error(`Expecting }`);\n }\n return stream.current();\n}\n/**\n * Consumes literal from given scanner\n * @param short Use short notation for consuming value.\n * The difference between \u201Cshort\u201D and \u201Cfull\u201D notation is that first one uses\n * alpha characters only and used for extracting keywords from abbreviation,\n * while \u201Cfull\u201D notation also supports numbers and dashes\n */\nfunction literal(scanner, short) {\n const start = scanner.pos;\n if (scanner.eat(isIdentPrefix)) {\n // SCSS or LESS variable\n // NB a bit dirty hack: if abbreviation starts with identifier prefix,\n // consume alpha characters only to allow embedded variables\n scanner.eatWhile(start ? isKeyword : isLiteral);\n }\n else if (scanner.eat(isAlphaWord)) {\n scanner.eatWhile(short ? isLiteral : isKeyword);\n }\n else {\n // Allow dots only at the beginning of literal\n scanner.eat(46 /* Dot */);\n scanner.eatWhile(isLiteral);\n }\n if (start !== scanner.pos) {\n scanner.start = start;\n return createLiteral(scanner, scanner.start = start);\n }\n}\nfunction createLiteral(scanner, start = scanner.start, end = scanner.pos) {\n return {\n type: 'Literal',\n value: scanner.substring(start, end),\n start,\n end\n };\n}\n/**\n * Consumes numeric CSS value (number with optional unit) from current stream,\n * if possible\n */\nfunction numberValue(scanner) {\n const start = scanner.pos;\n if (consumeNumber(scanner)) {\n scanner.start = start;\n const rawValue = scanner.current();\n // eat unit, which can be a % or alpha word\n scanner.start = scanner.pos;\n scanner.eat(37 /* Percent */) || scanner.eatWhile(isAlphaWord);\n return {\n type: 'NumberValue',\n value: Number(rawValue),\n rawValue,\n unit: scanner.current(),\n start,\n end: scanner.pos\n };\n }\n}\n/**\n * Consumes quoted string value from given scanner\n */\nfunction stringValue(scanner) {\n const ch = scanner.peek();\n const start = scanner.pos;\n let finished = false;\n if (isQuote(ch)) {\n scanner.pos++;\n while (!scanner.eof()) {\n // Do not throw error on malformed string\n if (scanner.eat(ch)) {\n finished = true;\n break;\n }\n else {\n scanner.pos++;\n }\n }\n scanner.start = start;\n return {\n type: 'StringValue',\n value: scanner.substring(start + 1, scanner.pos - (finished ? 1 : 0)),\n quote: ch === 39 /* SingleQuote */ ? 'single' : 'double',\n start,\n end: scanner.pos\n };\n }\n}\n/**\n * Consumes a color token from given string\n */\nfunction colorValue(scanner) {\n // supported color variations:\n // #abc \u2192 #aabbccc\n // #0 \u2192 #000000\n // #fff.5 \u2192 rgba(255, 255, 255, 0.5)\n // #t \u2192 transparent\n const start = scanner.pos;\n if (scanner.eat(35 /* Hash */)) {\n const valueStart = scanner.pos;\n let color = '';\n let alpha = '';\n if (scanner.eatWhile(isHex)) {\n color = scanner.substring(valueStart, scanner.pos);\n alpha = colorAlpha(scanner);\n }\n else if (scanner.eat(116 /* Transparent */)) {\n color = '0';\n alpha = colorAlpha(scanner) || '0';\n }\n else {\n alpha = colorAlpha(scanner);\n }\n if (color || alpha || scanner.eof()) {\n const { r, g, b, a } = parseColor(color, alpha);\n return {\n type: 'ColorValue',\n r, g, b, a,\n raw: scanner.substring(start + 1, scanner.pos),\n start,\n end: scanner.pos\n };\n }\n else {\n // Consumed # but no actual value: invalid color value, treat it as literal\n return createLiteral(scanner, start);\n }\n }\n scanner.pos = start;\n}\n/**\n * Consumes alpha value of color: `.1`\n */\nfunction colorAlpha(scanner) {\n const start = scanner.pos;\n if (scanner.eat(46 /* Dot */)) {\n scanner.start = start;\n if (scanner.eatWhile(isNumber)) {\n return scanner.current();\n }\n return '1';\n }\n return '';\n}\n/**\n * Consumes white space characters as string literal from given scanner\n */\nfunction whiteSpace(scanner) {\n const start = scanner.pos;\n if (scanner.eatWhile(isSpace)) {\n return {\n type: 'WhiteSpace',\n start,\n end: scanner.pos\n };\n }\n}\n/**\n * Consumes bracket from given scanner\n */\nfunction bracket(scanner) {\n const ch = scanner.peek();\n if (isBracket(ch)) {\n return {\n type: 'Bracket',\n open: ch === 40 /* RoundBracketOpen */,\n start: scanner.pos++,\n end: scanner.pos\n };\n }\n}\n/**\n * Consumes operator from given scanner\n */\nfunction operator(scanner) {\n const op = operatorType(scanner.peek());\n if (op) {\n return {\n type: 'Operator',\n operator: op,\n start: scanner.pos++,\n end: scanner.pos\n };\n }\n}\n/**\n * Eats number value from given stream\n * @return Returns `true` if number was consumed\n */\nfunction consumeNumber(stream) {\n const start = stream.pos;\n stream.eat(45 /* Dash */);\n const afterNegative = stream.pos;\n const hasDecimal = stream.eatWhile(isNumber);\n const prevPos = stream.pos;\n if (stream.eat(46 /* Dot */)) {\n // It\u2019s perfectly valid to have numbers like `1.`, which enforces\n // value to float unit type\n const hasFloat = stream.eatWhile(isNumber);\n if (!hasDecimal && !hasFloat) {\n // Lone dot\n stream.pos = prevPos;\n }\n }\n // Edge case: consumed dash only: not a number, bail-out\n if (stream.pos === afterNegative) {\n stream.pos = start;\n }\n return stream.pos !== start;\n}\nfunction isIdentPrefix(code) {\n return code === 64 /* At */ || code === 36 /* Dollar */;\n}\n/**\n * If given character is an operator, returns it\u2019s type\n */\nfunction operatorType(ch) {\n return (ch === 43 /* Sibling */ && \"+\" /* Sibling */)\n || (ch === 33 /* Excl */ && \"!\" /* Important */)\n || (ch === 44 /* Comma */ && \",\" /* ArgumentDelimiter */)\n || (ch === 58 /* Colon */ && \":\" /* PropertyDelimiter */)\n || (ch === 45 /* Dash */ && \"-\" /* ValueDelimiter */)\n || void 0;\n}\n/**\n * Check if given code is a hex value (/0-9a-f/)\n */\nfunction isHex(code) {\n return isNumber(code) || isAlpha(code, 65, 70); // A-F\n}\nfunction isKeyword(code) {\n return isAlphaNumericWord(code) || code === 45 /* Dash */;\n}\nfunction isBracket(code) {\n return code === 40 /* RoundBracketOpen */ || code === 41 /* RoundBracketClose */;\n}\nfunction isLiteral(code) {\n return isAlphaWord(code) || code === 37 /* Percent */;\n}\n/**\n * Parses given color value from abbreviation into RGBA format\n */\nfunction parseColor(value, alpha) {\n let r = '0';\n let g = '0';\n let b = '0';\n let a = Number(alpha != null && alpha !== '' ? alpha : 1);\n if (value === 't') {\n a = 0;\n }\n else {\n switch (value.length) {\n case 0:\n break;\n case 1:\n r = g = b = value + value;\n break;\n case 2:\n r = g = b = value;\n break;\n case 3:\n r = value[0] + value[0];\n g = value[1] + value[1];\n b = value[2] + value[2];\n break;\n default:\n value += value;\n r = value.slice(0, 2);\n g = value.slice(2, 4);\n b = value.slice(4, 6);\n }\n }\n return {\n r: parseInt(r, 16),\n g: parseInt(g, 16),\n b: parseInt(b, 16),\n a\n };\n}\n/**\n * Check if scanner reader must consume dash after given token.\n * Used in cases where user must explicitly separate numeric values\n */\nfunction shouldConsumeDashAfter(token) {\n return token.type === 'ColorValue' || (token.type === 'NumberValue' && !token.unit);\n}\n/**\n * Merges last adjacent tokens into a single literal.\n * This function is used to overcome edge case when function name was parsed\n * as a list of separate tokens. For example, a `scale3d()` value will be\n * parsed as literal and number tokens (`scale` and `3d`) which is a perfectly\n * valid abbreviation but undesired result. This function will detect last adjacent\n * literal and number values and combine them into single literal\n */\nfunction mergeTokens(scanner, tokens) {\n let start = 0;\n let end = 0;\n while (tokens.length) {\n const token = last(tokens);\n if (token.type === 'Literal' || token.type === 'NumberValue') {\n start = token.start;\n if (!end) {\n end = token.end;\n }\n tokens.pop();\n }\n else {\n break;\n }\n }\n if (start !== end) {\n tokens.push(createLiteral(scanner, start, end));\n }\n}\nfunction last(arr) {\n return arr[arr.length - 1];\n}\n\nfunction tokenScanner(tokens) {\n return {\n tokens,\n start: 0,\n pos: 0,\n size: tokens.length\n };\n}\nfunction peek(scanner) {\n return scanner.tokens[scanner.pos];\n}\nfunction readable(scanner) {\n return scanner.pos < scanner.size;\n}\nfunction consume(scanner, test) {\n if (test(peek(scanner))) {\n scanner.pos++;\n return true;\n }\n return false;\n}\nfunction error(scanner, message, token = peek(scanner)) {\n if (token && token.start != null) {\n message += ` at ${token.start}`;\n }\n const err = new Error(message);\n err['pos'] = token && token.start;\n return err;\n}\n\nfunction parser(tokens, options = {}) {\n const scanner = tokenScanner(tokens);\n const result = [];\n let property;\n while (readable(scanner)) {\n if (property = consumeProperty(scanner, options)) {\n result.push(property);\n }\n else if (!consume(scanner, isSiblingOperator)) {\n throw error(scanner, 'Unexpected token');\n }\n }\n return result;\n}\n/**\n * Consumes single CSS property\n */\nfunction consumeProperty(scanner, options) {\n let name;\n let important = false;\n let valueFragment;\n const value = [];\n const token = peek(scanner);\n const valueMode = !!options.value;\n if (!valueMode && isLiteral$1(token) && !isFunctionStart(scanner)) {\n scanner.pos++;\n name = token.value;\n // Consume any following value delimiter after property name\n consume(scanner, isValueDelimiter);\n }\n // Skip whitespace right after property name, if any\n if (valueMode) {\n consume(scanner, isWhiteSpace);\n }\n while (readable(scanner)) {\n if (consume(scanner, isImportant)) {\n important = true;\n }\n else if (valueFragment = consumeValue(scanner, valueMode)) {\n value.push(valueFragment);\n }\n else if (!consume(scanner, isFragmentDelimiter)) {\n break;\n }\n }\n if (name || value.length || important) {\n return { name, value, important };\n }\n}\n/**\n * Consumes single value fragment, e.g. all value tokens before comma\n */\nfunction consumeValue(scanner, inArgument) {\n const result = [];\n let token;\n let args;\n while (readable(scanner)) {\n token = peek(scanner);\n if (isValue(token)) {\n scanner.pos++;\n if (isLiteral$1(token) && (args = consumeArguments(scanner))) {\n result.push({\n type: 'FunctionCall',\n name: token.value,\n arguments: args\n });\n }\n else {\n result.push(token);\n }\n }\n else if (isValueDelimiter(token) || (inArgument && isWhiteSpace(token))) {\n scanner.pos++;\n }\n else {\n break;\n }\n }\n return result.length\n ? { type: 'CSSValue', value: result }\n : void 0;\n}\nfunction consumeArguments(scanner) {\n const start = scanner.pos;\n if (consume(scanner, isOpenBracket)) {\n const args = [];\n let value;\n while (readable(scanner) && !consume(scanner, isCloseBracket)) {\n if (value = consumeValue(scanner, true)) {\n args.push(value);\n }\n else if (!consume(scanner, isWhiteSpace) && !consume(scanner, isArgumentDelimiter)) {\n throw error(scanner, 'Unexpected token');\n }\n }\n scanner.start = start;\n return args;\n }\n}\nfunction isLiteral$1(token) {\n return token && token.type === 'Literal';\n}\nfunction isBracket$1(token, open) {\n return token && token.type === 'Bracket' && (open == null || token.open === open);\n}\nfunction isOpenBracket(token) {\n return isBracket$1(token, true);\n}\nfunction isCloseBracket(token) {\n return isBracket$1(token, false);\n}\nfunction isWhiteSpace(token) {\n return token && token.type === 'WhiteSpace';\n}\nfunction isOperator(token, operator) {\n return token && token.type === 'Operator' && (!operator || token.operator === operator);\n}\nfunction isSiblingOperator(token) {\n return isOperator(token, \"+\" /* Sibling */);\n}\nfunction isArgumentDelimiter(token) {\n return isOperator(token, \",\" /* ArgumentDelimiter */);\n}\nfunction isFragmentDelimiter(token) {\n return isArgumentDelimiter(token);\n}\nfunction isImportant(token) {\n return isOperator(token, \"!\" /* Important */);\n}\nfunction isValue(token) {\n return token.type === 'StringValue'\n || token.type === 'ColorValue'\n || token.type === 'NumberValue'\n || token.type === 'Literal'\n || token.type === 'Field';\n}\nfunction isValueDelimiter(token) {\n return isOperator(token, \":\" /* PropertyDelimiter */)\n || isOperator(token, \"-\" /* ValueDelimiter */);\n}\nfunction isFunctionStart(scanner) {\n const t1 = scanner.tokens[scanner.pos];\n const t2 = scanner.tokens[scanner.pos + 1];\n return t1 && t2 && isLiteral$1(t1) && t2.type === 'Bracket';\n}\n\n/**\n * Parses given abbreviation into property set\n */\nfunction parse(abbr, options) {\n try {\n const tokens = typeof abbr === 'string' ? tokenize(abbr, options && options.value) : abbr;\n return parser(tokens, options);\n }\n catch (err) {\n if (err instanceof ScannerError && typeof abbr === 'string') {\n err.message += `\\n${abbr}\\n${'-'.repeat(err.pos)}^`;\n }\n throw err;\n }\n}\n\nexport default parse;\nexport { getToken, parser, tokenize };\n", "import { AbbreviationAttribute, AbbreviationNode, Value } from '@emmetio/abbreviation';\nimport { Config } from '../config';\n\n/**\n * Merges attributes in current node: de-duplicates attributes with the same name\n * and merges class names\n */\nexport default function mergeAttributes(node: AbbreviationNode, config: Config) {\n if (!node.attributes) {\n return;\n }\n\n const attributes: AbbreviationAttribute[] = [];\n const lookup: { [name: string]: AbbreviationAttribute } = {};\n\n for (const attr of node.attributes) {\n if (attr.name) {\n const attrName = attr.name;\n if (attrName in lookup) {\n const prev = lookup[attrName];\n if (attrName === 'class') {\n prev.value = mergeValue(prev.value, attr.value, ' ');\n } else {\n mergeDeclarations(prev, attr, config);\n }\n } else {\n // Create new attribute instance so we can safely modify it later\n attributes.push(lookup[attrName] = { ...attr });\n }\n } else {\n attributes.push(attr);\n }\n }\n\n node.attributes = attributes;\n}\n\n/**\n * Merges two token lists into single list. Adjacent strings are merged together\n */\nfunction mergeValue(prev?: Value[], next?: Value[], glue?: string): Value[] | undefined {\n if (prev && next) {\n if (prev.length && glue) {\n append(prev, glue);\n }\n\n for (const t of next) {\n append(prev, t);\n }\n\n return prev;\n }\n\n const result = prev || next;\n return result && result.slice();\n}\n\n/**\n * Merges data from `src` attribute into `dest` and returns it\n */\nfunction mergeDeclarations(dest: AbbreviationAttribute, src: AbbreviationAttribute, config: Config): AbbreviationAttribute {\n dest.name = src.name;\n\n if (!config.options['output.reverseAttributes']) {\n dest.value = src.value;\n }\n\n // Keep high-priority properties\n if (!dest.implied) {\n dest.implied = src.implied;\n }\n\n if (!dest.boolean) {\n dest.boolean = src.boolean;\n }\n\n if (dest.valueType !== 'expression') {\n dest.valueType = src.valueType;\n }\n\n return dest;\n}\n\nfunction append(tokens: Value[], value: Value) {\n const lastIx = tokens.length - 1;\n if (typeof tokens[lastIx] === 'string' && typeof value === 'string') {\n tokens[lastIx] += value;\n } else {\n tokens.push(value);\n }\n}\n", "import { Abbreviation, AbbreviationNode } from '@emmetio/abbreviation';\n\nexport type Container = Abbreviation | AbbreviationNode;\nexport type WalkVisitor<S> = (node: AbbreviationNode, ancestors: Container[], state?: S) => void;\n\n/**\n * Walks over each child node of given markup abbreviation AST node (not including\n * given one) and invokes `fn` on each node.\n * The `fn` callback accepts context node, list of ancestor nodes and optional\n * state object\n */\nexport function walk<S>(node: Container, fn: WalkVisitor<S>, state?: S) {\n const ancestors: Container[] = [node];\n const callback = (ctx: AbbreviationNode) => {\n fn(ctx, ancestors, state);\n ancestors.push(ctx);\n ctx.children.forEach(callback);\n ancestors.pop();\n };\n\n node.children.forEach(callback);\n}\n\n/**\n * Finds node which is the deepest for in current node or node itself.\n */\nexport function findDeepest(node: Container): { node: Container, parent?: Container } {\n let parent: Container | undefined;\n while (node.children.length) {\n parent = node;\n node = node.children[node.children.length - 1];\n }\n\n return { parent, node };\n}\n\nexport function isNode(node: Container): node is AbbreviationNode {\n return node.type === 'AbbreviationNode';\n}\n", "import parse, { AbbreviationNode, AbbreviationAttribute, Abbreviation } from '@emmetio/abbreviation';\nimport { findDeepest, isNode, Container } from './utils';\nimport { Config } from '../config';\n\n/**\n * Finds matching snippet from `registry` and resolves it into a parsed abbreviation.\n * Resolved node is then updated or replaced with matched abbreviation tree.\n *\n * A HTML registry basically contains aliases to another Emmet abbreviations,\n * e.g. a predefined set of name, attributes and so on, possibly a complex\n * abbreviation with multiple elements. So we have to get snippet, parse it\n * and recursively resolve it.\n */\nexport default function resolveSnippets(abbr: Abbreviation, config: Config): Abbreviation {\n const stack: string[] = [];\n const reversed = config.options['output.reverseAttributes'];\n\n const resolve = (child: AbbreviationNode): Abbreviation | null => {\n const snippet = child.name && config.snippets[child.name];\n // A snippet in stack means circular reference.\n // It can be either a user error or a perfectly valid snippet like\n // \"img\": \"img[src alt]/\", e.g. an element with predefined shape.\n // In any case, simply stop parsing and keep element as is\n if (!snippet || stack.includes(snippet)) {\n return null;\n }\n\n const snippetAbbr = parse(snippet, config);\n stack.push(snippet);\n walkResolve(snippetAbbr, resolve, config);\n stack.pop();\n\n // Add attributes from current node into every top-level node of parsed abbreviation\n for (const topNode of snippetAbbr.children) {\n if (child.attributes) {\n const from: AbbreviationAttribute[] = topNode.attributes || [];\n const to: AbbreviationAttribute[] = child.attributes || [];\n topNode.attributes = reversed ? to.concat(from) : from.concat(to);\n }\n mergeNodes(child, topNode);\n }\n\n return snippetAbbr;\n };\n\n walkResolve(abbr, resolve, config);\n return abbr;\n}\n\nfunction walkResolve(node: Container, resolve: (node: AbbreviationNode) => Abbreviation | null, config: Config): AbbreviationNode[] {\n let children: AbbreviationNode[] = [];\n\n for (const child of node.children) {\n const resolved = resolve(child);\n if (resolved) {\n children = children.concat(resolved.children);\n\n const deepest = findDeepest(resolved);\n if (isNode(deepest.node)) {\n deepest.node.children = deepest.node.children.concat(walkResolve(child, resolve, config));\n }\n } else {\n children.push(child);\n child.children = walkResolve(child, resolve, config);\n }\n }\n\n return node.children = children;\n}\n\n/**\n * Adds data from first node into second node\n */\nfunction mergeNodes(from: AbbreviationNode, to: AbbreviationNode) {\n if (from.selfClosing) {\n to.selfClosing = true;\n }\n\n if (from.value != null) {\n to.value = from.value;\n }\n\n if (from.repeat) {\n to.repeat = from.repeat;\n }\n}\n", "import { AbbreviationAttribute, AbbreviationNode } from '@emmetio/abbreviation';\nimport { Config, Options, StringCase } from './config';\n\nexport interface OutputStream {\n options: Options;\n value: string;\n level: number;\n offset: number;\n line: number;\n column: number;\n}\n\nexport default function createOutputStream(options: Options, level = 0): OutputStream {\n return {\n options,\n value: '',\n level,\n offset: 0,\n line: 0,\n column: 0\n };\n}\n\n/**\n * Pushes plain string into output stream without newline processing\n */\nexport function push(stream: OutputStream, text: string) {\n const processText = stream.options['output.text'];\n _push(stream, processText(text, stream.offset, stream.line, stream.column));\n}\n\n/**\n * Pushes given string with possible newline formatting into output\n */\nexport function pushString(stream: OutputStream, value: string) {\n // If given value contains newlines, we should push content line-by-line and\n // use `pushNewline()` to maintain proper line/column state\n const lines = splitByLines(value);\n\n for (let i = 0, il = lines.length - 1; i <= il; i++) {\n push(stream, lines[i]);\n if (i !== il) {\n pushNewline(stream, true);\n }\n }\n}\n\n/**\n * Pushes new line into given output stream\n */\nexport function pushNewline(stream: OutputStream, indent?: boolean | number) {\n const baseIndent = stream.options['output.baseIndent'];\n const newline = stream.options['output.newline'];\n push(stream, newline + baseIndent);\n stream.line++;\n stream.column = baseIndent.length;\n if (indent) {\n pushIndent(stream, indent === true ? stream.level : indent);\n }\n}\n\n/**\n * Adds indentation of `size` to current output stream\n */\nexport function pushIndent(stream: OutputStream, size = stream.level) {\n const indent = stream.options['output.indent'];\n push(stream, indent.repeat(Math.max(size, 0)));\n}\n\n/**\n * Pushes field/tabstop into output stream\n */\nexport function pushField(stream: OutputStream, index: number, placeholder: string) {\n const field = stream.options['output.field'];\n // NB: use `_push` instead of `push` to skip text processing\n _push(stream, field(index, placeholder, stream.offset, stream.line, stream.column));\n}\n\n/**\n * Returns given tag name formatted according to given config\n */\nexport function tagName(name: string, config: Config) {\n return strCase(name, config.options['output.tagCase']);\n}\n\n/**\n * Returns given attribute name formatted according to given config\n */\nexport function attrName(name: string, config: Config) {\n return strCase(name, config.options['output.attributeCase']);\n}\n\n/**\n * Returns character for quoting value of given attribute\n */\nexport function attrQuote(attr: AbbreviationAttribute, config: Config, isOpen?: boolean): string {\n if (attr.valueType === 'expression') {\n return isOpen ? '{' : '}';\n }\n\n return config.options['output.attributeQuotes'] === 'single' ? '\\'' : '\"';\n}\n\n/**\n * Check if given attribute is boolean\n */\nexport function isBooleanAttribute(attr: AbbreviationAttribute, config: Config): boolean {\n return attr.boolean\n || config.options['output.booleanAttributes'].includes((attr.name || '').toLowerCase());\n}\n\n/**\n * Returns a token for self-closing tag, depending on current options\n */\nexport function selfClose(config: Config): string {\n switch (config.options['output.selfClosingStyle']) {\n case 'xhtml': return ' /';\n case 'xml': return '/';\n default: return '';\n }\n}\n\n/**\n * Check if given tag name belongs to inline-level element\n * @param node Parsed node or tag name\n */\nexport function isInline(node: string | AbbreviationNode, config: Config): boolean {\n if (typeof node === 'string') {\n return config.options.inlineElements.includes(node.toLowerCase());\n }\n\n // inline node is a node either with inline-level name or text-only node\n return node.name ? isInline(node.name, config) : Boolean(node.value && !node.attributes);\n}\n\n/**\n * Splits given text by lines\n */\nexport function splitByLines(text: string): string[] {\n return text.split(/\\r\\n|\\r|\\n/g);\n}\n\n/**\n * Pushes raw string into output stream without any processing\n */\nfunction _push(stream: OutputStream, text: string) {\n stream.value += text;\n stream.offset += text.length;\n stream.column += text.length;\n}\n\nfunction strCase(str: string, type: StringCase) {\n if (type) {\n return type === 'upper' ? str.toUpperCase() : str.toLowerCase();\n }\n\n return str;\n}\n", "import { AbbreviationNode } from '@emmetio/abbreviation';\nimport { isNode, Container } from './utils';\nimport { Config } from '../config';\nimport { isInline } from '../output-stream';\n\nconst elementMap: { [name: string]: string } = {\n p: 'span',\n ul: 'li',\n ol: 'li',\n table: 'tr',\n tr: 'td',\n tbody: 'tr',\n thead: 'tr',\n tfoot: 'tr',\n colgroup: 'col',\n select: 'option',\n optgroup: 'option',\n audio: 'source',\n video: 'source',\n object: 'param',\n map: 'area'\n};\n\nexport default function implicitTag(node: AbbreviationNode, ancestors: Container[], config: Config) {\n if (!node.name && node.attributes) {\n resolveImplicitTag(node, ancestors, config);\n }\n}\n\nexport function resolveImplicitTag(node: AbbreviationNode, ancestors: Container[], config: Config) {\n const parent = getParentElement(ancestors);\n const contextName = config.context ? config.context.name : '';\n const parentName = lowercase(parent ? parent.name : contextName);\n node.name = elementMap[parentName]\n || (isInline(parentName, config) ? 'span' : 'div');\n}\n\nfunction lowercase(str?: string): string {\n return (str || '').toLowerCase();\n}\n\n/**\n * Returns closest element node from given ancestors list\n */\nfunction getParentElement(ancestors: Container[]): AbbreviationNode | undefined {\n for (let i = ancestors.length - 1; i >= 0; i--) {\n const elem = ancestors[i];\n if (isNode(elem)) {\n return elem;\n }\n }\n}\n", "{\n\t\"common\": [\"lorem\", \"ipsum\", \"dolor\", \"sit\", \"amet\", \"consectetur\", \"adipisicing\", \"elit\"],\n\t\"words\": [\"exercitationem\", \"perferendis\", \"perspiciatis\", \"laborum\", \"eveniet\",\n\t\t\"sunt\", \"iure\", \"nam\", \"nobis\", \"eum\", \"cum\", \"officiis\", \"excepturi\",\n\t\t\"odio\", \"consectetur\", \"quasi\", \"aut\", \"quisquam\", \"vel\", \"eligendi\",\n\t\t\"itaque\", \"non\", \"odit\", \"tempore\", \"quaerat\", \"dignissimos\",\n\t\t\"facilis\", \"neque\", \"nihil\", \"expedita\", \"vitae\", \"vero\", \"ipsum\",\n\t\t\"nisi\", \"animi\", \"cumque\", \"pariatur\", \"velit\", \"modi\", \"natus\",\n\t\t\"iusto\", \"eaque\", \"sequi\", \"illo\", \"sed\", \"ex\", \"et\", \"voluptatibus\",\n\t\t\"tempora\", \"veritatis\", \"ratione\", \"assumenda\", \"incidunt\", \"nostrum\",\n\t\t\"placeat\", \"aliquid\", \"fuga\", \"provident\", \"praesentium\", \"rem\",\n\t\t\"necessitatibus\", \"suscipit\", \"adipisci\", \"quidem\", \"possimus\",\n\t\t\"voluptas\", \"debitis\", \"sint\", \"accusantium\", \"unde\", \"sapiente\",\n\t\t\"voluptate\", \"qui\", \"aspernatur\", \"laudantium\", \"soluta\", \"amet\",\n\t\t\"quo\", \"aliquam\", \"saepe\", \"culpa\", \"libero\", \"ipsa\", \"dicta\",\n\t\t\"reiciendis\", \"nesciunt\", \"doloribus\", \"autem\", \"impedit\", \"minima\",\n\t\t\"maiores\", \"repudiandae\", \"ipsam\", \"obcaecati\", \"ullam\", \"enim\",\n\t\t\"totam\", \"delectus\", \"ducimus\", \"quis\", \"voluptates\", \"dolores\",\n\t\t\"molestiae\", \"harum\", \"dolorem\", \"quia\", \"voluptatem\", \"molestias\",\n\t\t\"magni\", \"distinctio\", \"omnis\", \"illum\", \"dolorum\", \"voluptatum\", \"ea\",\n\t\t\"quas\", \"quam\", \"corporis\", \"quae\", \"blanditiis\", \"atque\", \"deserunt\",\n\t\t\"laboriosam\", \"earum\", \"consequuntur\", \"hic\", \"cupiditate\",\n\t\t\"quibusdam\", \"accusamus\", \"ut\", \"rerum\", \"error\", \"minus\", \"eius\",\n\t\t\"ab\", \"ad\", \"nemo\", \"fugit\", \"officia\", \"at\", \"in\", \"id\", \"quos\",\n\t\t\"reprehenderit\", \"numquam\", \"iste\", \"fugiat\", \"sit\", \"inventore\",\n\t\t\"beatae\", \"repellendus\", \"magnam\", \"recusandae\", \"quod\", \"explicabo\",\n\t\t\"doloremque\", \"aperiam\", \"consequatur\", \"asperiores\", \"commodi\",\n\t\t\"optio\", \"dolor\", \"labore\", \"temporibus\", \"repellat\", \"veniam\",\n\t\t\"architecto\", \"est\", \"esse\", \"mollitia\", \"nulla\", \"a\", \"similique\",\n\t\t\"eos\", \"alias\", \"dolore\", \"tenetur\", \"deleniti\", \"porro\", \"facere\",\n\t\t\"maxime\", \"corrupti\"]\n}\n", "{\n\t\"common\": [\"далеко-далеко\", \"за\", \"словесными\", \"горами\", \"в стране\", \"гласных\", \"и согласных\", \"живут\", \"рыбные\", \"тексты\"],\n\t\"words\": [\"вдали\", \"от всех\", \"они\", \"буквенных\", \"домах\", \"на берегу\", \"семантика\",\n\t\t\"большого\", \"языкового\", \"океана\", \"маленький\", \"ручеек\", \"даль\",\n\t\t\"журчит\", \"по всей\", \"обеспечивает\", \"ее\",\"всеми\", \"необходимыми\",\n\t\t\"правилами\", \"эта\", \"парадигматическая\", \"страна\", \"которой\", \"жаренные\",\n\t\t\"предложения\", \"залетают\", \"прямо\", \"рот\", \"даже\", \"всемогущая\",\n\t\t\"пунктуация\", \"не\", \"имеет\", \"власти\", \"над\", \"рыбными\", \"текстами\",\n\t\t\"ведущими\", \"безорфографичный\", \"образ\", \"жизни\", \"однажды\", \"одна\",\n\t\t\"маленькая\", \"строчка\",\"рыбного\", \"текста\", \"имени\", \"lorem\", \"ipsum\",\n\t\t\"решила\", \"выйти\", \"большой\", \"мир\", \"грамматики\", \"великий\", \"оксмокс\",\n\t\t\"предупреждал\", \"о\", \"злых\", \"запятых\", \"диких\", \"знаках\", \"вопроса\",\n\t\t\"коварных\", \"точках\", \"запятой\", \"но\", \"текст\", \"дал\", \"сбить\",\n\t\t\"себя\", \"толку\", \"он\", \"собрал\", \"семь\", \"своих\", \"заглавных\", \"букв\",\n\t\t\"подпоясал\", \"инициал\", \"за\", \"пояс\", \"пустился\", \"дорогу\",\n\t\t\"взобравшись\", \"первую\", \"вершину\", \"курсивных\", \"гор\", \"бросил\",\n\t\t\"последний\", \"взгляд\", \"назад\", \"силуэт\", \"своего\", \"родного\", \"города\",\n\t\t\"буквоград\", \"заголовок\", \"деревни\", \"алфавит\", \"подзаголовок\", \"своего\",\n\t\t\"переулка\", \"грустный\", \"реторический\", \"вопрос\", \"скатился\", \"его\",\n\t\t\"щеке\", \"продолжил\", \"свой\", \"путь\", \"дороге\", \"встретил\", \"рукопись\",\n\t\t\"она\", \"предупредила\", \"моей\", \"все\", \"переписывается\", \"несколько\",\n\t\t\"раз\", \"единственное\", \"что\", \"меня\", \"осталось\", \"это\", \"приставка\",\n\t\t\"возвращайся\", \"ты\", \"лучше\", \"свою\", \"безопасную\", \"страну\", \"послушавшись\",\n\t\t\"рукописи\", \"наш\", \"продолжил\", \"свой\", \"путь\", \"вскоре\", \"ему\",\n\t\t\"повстречался\", \"коварный\", \"составитель\", \"рекламных\", \"текстов\",\n\t\t\"напоивший\", \"языком\", \"речью\", \"заманивший\", \"свое\", \"агентство\",\n\t\t\"которое\", \"использовало\", \"снова\", \"снова\", \"своих\", \"проектах\",\n\t\t\"если\", \"переписали\", \"то\", \"живет\", \"там\", \"до\", \"сих\", \"пор\"]\n}\n", "{\n\t\"common\": [\"mujer\", \"uno\", \"dolor\", \"más\", \"de\", \"poder\", \"mismo\", \"si\"],\n\t\"words\": [\"ejercicio\", \"preferencia\", \"perspicacia\", \"laboral\", \"paño\",\n\t\t\"suntuoso\", \"molde\", \"namibia\", \"planeador\", \"mirar\", \"demás\", \"oficinista\", \"excepción\",\n\t\t\"odio\", \"consecuencia\", \"casi\", \"auto\", \"chicharra\", \"velo\", \"elixir\",\n\t\t\"ataque\", \"no\", \"odio\", \"temporal\", \"cuórum\", \"dignísimo\",\n\t\t\"facilismo\", \"letra\", \"nihilista\", \"expedición\", \"alma\", \"alveolar\", \"aparte\",\n\t\t\"león\", \"animal\", \"como\", \"paria\", \"belleza\", \"modo\", \"natividad\",\n\t\t\"justo\", \"ataque\", \"séquito\", \"pillo\", \"sed\", \"ex\", \"y\", \"voluminoso\",\n\t\t\"temporalidad\", \"verdades\", \"racional\", \"asunción\", \"incidente\", \"marejada\",\n\t\t\"placenta\", \"amanecer\", \"fuga\", \"previsor\", \"presentación\", \"lejos\",\n\t\t\"necesariamente\", \"sospechoso\", \"adiposidad\", \"quindío\", \"pócima\",\n\t\t\"voluble\", \"débito\", \"sintió\", \"accesorio\", \"falda\", \"sapiencia\",\n\t\t\"volutas\", \"queso\", \"permacultura\", \"laudo\", \"soluciones\", \"entero\",\n\t\t\"pan\", \"litro\", \"tonelada\", \"culpa\", \"libertario\", \"mosca\", \"dictado\",\n\t\t\"reincidente\", \"nascimiento\", \"dolor\", \"escolar\", \"impedimento\", \"mínima\",\n\t\t\"mayores\", \"repugnante\", \"dulce\", \"obcecado\", \"montaña\", \"enigma\",\n\t\t\"total\", \"deletéreo\", \"décima\", \"cábala\", \"fotografía\", \"dolores\",\n\t\t\"molesto\", \"olvido\", \"paciencia\", \"resiliencia\", \"voluntad\", \"molestias\",\n\t\t\"magnífico\", \"distinción\", \"ovni\", \"marejada\", \"cerro\", \"torre\", \"y\",\n\t\t\"abogada\", \"manantial\", \"corporal\", \"agua\", \"crepúsculo\", \"ataque\", \"desierto\",\n\t\t\"laboriosamente\", \"angustia\", \"afortunado\", \"alma\", \"encefalograma\",\n\t\t\"materialidad\", \"cosas\", \"o\", \"renuncia\", \"error\", \"menos\", \"conejo\",\n\t\t\"abadía\", \"analfabeto\", \"remo\", \"fugacidad\", \"oficio\", \"en\", \"almácigo\", \"vos\", \"pan\",\n\t\t\"represión\", \"números\", \"triste\", \"refugiado\", \"trote\", \"inventor\",\n\t\t\"corchea\", \"repelente\", \"magma\", \"recusado\", \"patrón\", \"explícito\",\n\t\t\"paloma\", \"síndrome\", \"inmune\", \"autoinmune\", \"comodidad\",\n\t\t\"ley\", \"vietnamita\", \"demonio\", \"tasmania\", \"repeler\", \"apéndice\",\n\t\t\"arquitecto\", \"columna\", \"yugo\", \"computador\", \"mula\", \"a\", \"propósito\",\n\t\t\"fantasía\", \"alias\", \"rayo\", \"tenedor\", \"deleznable\", \"ventana\", \"cara\",\n\t\t\"anemia\", \"corrupto\"]\n}\n", "import { AbbreviationNode, Repeater } from '@emmetio/abbreviation';\nimport { Container } from '../utils';\nimport { Config } from '../../config';\nimport { resolveImplicitTag } from '../implicit-tag';\nimport latin from './latin.json';\nimport ru from './russian.json';\nimport sp from './spanish.json';\n\ninterface LoremVocabulary {\n common: string[];\n words: string[];\n}\n\nconst vocabularies: { [lang: string]: LoremVocabulary } = { ru, sp, latin };\nconst reLorem = /^lorem([a-z]*)(\\d*)(-\\d*)?$/i;\n\nexport default function lorem(node: AbbreviationNode, ancestors: Container[], config: Config) {\n let m: RegExpMatchArray | null;\n if (node.name && (m = node.name.match(reLorem))) {\n const db: LoremVocabulary = vocabularies[m[1]] || vocabularies.latin;\n const minWordCount = m[2] ? Math.max(1, Number(m[2])) : 30;\n const maxWordCount = m[3] ? Math.max(minWordCount, Number(m[3].slice(1))) : minWordCount;\n const wordCount = rand(minWordCount, maxWordCount);\n const repeat = node.repeat || findRepeater(ancestors);\n\n node.name = node.attributes = void 0;\n node.value = [paragraph(db, wordCount, !repeat || repeat.value === 0)];\n\n if (node.repeat && ancestors.length > 1) {\n resolveImplicitTag(node, ancestors, config);\n }\n }\n}\n\n/**\n * Returns random integer between <code>from</code> and <code>to</code> values\n */\nfunction rand(from: number, to: number): number {\n return Math.floor(Math.random() * (to - from) + from);\n}\n\nfunction sample(arr: string[], count: number): string[] {\n const len = arr.length;\n const iterations = Math.min(len, count);\n const result: string[] = [];\n\n while (result.length < iterations) {\n const str = arr[rand(0, len)];\n if (!result.includes(str)) {\n result.push(str);\n }\n }\n\n return result;\n}\n\nfunction choice(val: string): string {\n return val[rand(0, val.length - 1)];\n}\n\nfunction sentence(words: string[], end?: string): string {\n if (words.length) {\n words = [capitalize(words[0])].concat(words.slice(1));\n }\n\n return words.join(' ') + (end || choice('?!...')); // more dots than question marks\n}\n\nfunction capitalize(word: string): string {\n return word[0].toUpperCase() + word.slice(1);\n}\n\n/**\n * Insert commas at randomly selected words. This function modifies values\n * inside `words` array\n */\nfunction insertCommas(words: string[]): string[] {\n if (words.length < 2) {\n return words;\n }\n\n words = words.slice();\n const len = words.length;\n const hasComma = /,$/;\n let totalCommas = 0;\n\n if (len > 3 && len <= 6) {\n totalCommas = rand(0, 1);\n } else if (len > 6 && len <= 12) {\n totalCommas = rand(0, 2);\n } else {\n totalCommas = rand(1, 4);\n }\n\n for (let i = 0, pos: number; i < totalCommas; i++) {\n pos = rand(0, len - 2);\n if (!hasComma.test(words[pos])) {\n words[pos] += ',';\n }\n }\n\n return words;\n}\n\n/**\n * Generate a paragraph of \"Lorem ipsum\" text\n * @param dict Words dictionary\n * @param wordCount Words count in paragraph\n * @param startWithCommon Should paragraph start with common \"lorem ipsum\" sentence.\n */\nfunction paragraph(dict: LoremVocabulary, wordCount: number, startWithCommon: boolean): string {\n const result: string[] = [];\n let totalWords = 0;\n let words: string[];\n\n if (startWithCommon && dict.common) {\n words = dict.common.slice(0, wordCount);\n totalWords += words.length;\n result.push(sentence(insertCommas(words), '.'));\n }\n\n while (totalWords < wordCount) {\n words = sample(dict.words, Math.min(rand(2, 30), wordCount - totalWords));\n totalWords += words.length;\n result.push(sentence(insertCommas(words)));\n }\n\n return result.join(' ');\n}\n\nfunction findRepeater(ancestors: Container[]): Repeater | void {\n for (let i = ancestors.length - 1; i >= 0; i--) {\n const element = ancestors[i];\n if (element.type === 'AbbreviationNode' && element.repeat) {\n return element.repeat;\n }\n }\n}\n", "import { AbbreviationNode, AbbreviationAttribute } from '@emmetio/abbreviation';\n\n/**\n * JSX transformer: replaces `class` and `for` attributes with `className` and\n * `htmlFor` attributes respectively\n */\nexport default function jsx(node: AbbreviationNode) {\n if (node.attributes) {\n node.attributes.forEach(rename);\n }\n}\n\nfunction rename(attr: AbbreviationAttribute) {\n if (attr.name === 'class') {\n attr.name = 'className';\n } else if (attr.name === 'for') {\n attr.name = 'htmlFor';\n }\n}\n", "import { AbbreviationNode, AbbreviationAttribute } from '@emmetio/abbreviation';\n\n/**\n * XSL transformer: removes `select` attributes from certain nodes that contain\n * children\n */\nexport default function xsl(node: AbbreviationNode) {\n if (matchesName(node.name) && node.attributes && (node.children.length || node.value)) {\n node.attributes = node.attributes.filter(isAllowed);\n }\n}\n\nfunction isAllowed(attr: AbbreviationAttribute): boolean {\n return attr.name !== 'select';\n}\n\nfunction matchesName(name?: string): boolean {\n return name === 'xsl:variable' || name === 'xsl:with-param';\n}\n", "import { AbbreviationNode, Value } from '@emmetio/abbreviation';\nimport { Container } from '../utils';\nimport { Config, AbbreviationContext } from '../../config';\n\ninterface BEMAbbreviationNode extends AbbreviationNode {\n _bem?: BEMData;\n}\n\ninterface BEMAbbreviationContext extends AbbreviationContext {\n _bem?: BEMData;\n}\n\ninterface BEMData {\n classNames: string[];\n block?: string ;\n}\n\nconst reElement = /^(-+)([a-z0-9]+[a-z0-9-]*)/i;\nconst reModifier = /^(_+)([a-z0-9]+[a-z0-9-_]*)/i;\nconst blockCandidates1 = (className: string) => /^[a-z]\\-/i.test(className);\nconst blockCandidates2 = (className: string) => /^[a-z]/i.test(className);\n\nexport default function bem(node: AbbreviationNode, ancestors: Container[], config: Config) {\n expandClassNames(node);\n expandShortNotation(node, ancestors, config);\n}\n\n/**\n * Expands existing class names in BEM notation in given `node`.\n * For example, if node contains `b__el_mod` class name, this method ensures\n * that element contains `b__el` class as well\n */\nfunction expandClassNames(node: BEMAbbreviationNode) {\n const data = getBEMData(node);\n\n const classNames: string[] = [];\n for (const cl of data.classNames) {\n // remove all modifiers and element prefixes from class name to get a base element name\n const ix = cl.indexOf('_');\n if (ix > 0 && !cl.startsWith('-')) {\n classNames.push(cl.slice(0, ix));\n classNames.push(cl.slice(ix));\n } else {\n classNames.push(cl);\n }\n }\n\n if (classNames.length) {\n data.classNames = classNames.filter(uniqueClass);\n data.block = findBlockName(data.classNames);\n updateClass(node, data.classNames.join(' '));\n }\n}\n\n/**\n * Expands short BEM notation, e.g. `-element` and `_modifier`\n */\nfunction expandShortNotation(node: BEMAbbreviationNode, ancestors: Container[], config: Config) {\n const data = getBEMData(node);\n const classNames: string[] = [];\n const { options } = config;\n const path = ancestors.slice(1).concat(node) as BEMAbbreviationNode[];\n\n for (let cl of data.classNames) {\n let prefix: string = '';\n let m: RegExpMatchArray | null;\n const originalClass = cl;\n\n // parse element definition (could be only one)\n if (m = cl.match(reElement)) {\n prefix = getBlockName(path, m[1].length, config.context) + options['bem.element'] + m[2];\n classNames.push(prefix);\n cl = cl.slice(m[0].length);\n }\n\n // parse modifiers definitions\n if (m = cl.match(reModifier)) {\n if (!prefix) {\n prefix = getBlockName(path, m[1].length);\n classNames.push(prefix);\n }\n\n classNames.push(`${prefix}${options['bem.modifier']}${m[2]}`);\n cl = cl.slice(m[0].length);\n }\n\n if (cl === originalClass) {\n // class name wasn’t modified: it’s not a BEM-specific class,\n // add it as-is into output\n classNames.push(originalClass);\n }\n }\n\n const arrClassNames = classNames.filter(uniqueClass);\n if (arrClassNames.length) {\n updateClass(node, arrClassNames.join(' '));\n }\n}\n\n/**\n * Returns BEM data from given abbreviation node\n */\nfunction getBEMData(node: BEMAbbreviationNode): BEMData {\n if (!node._bem) {\n let classValue = '';\n if (node.attributes) {\n for (const attr of node.attributes) {\n if (attr.name === 'class' && attr.value) {\n classValue = stringifyValue(attr.value);\n break;\n }\n }\n }\n\n node._bem = parseBEM(classValue);\n }\n\n return node._bem;\n}\n\nfunction getBEMDataFromContext(context: BEMAbbreviationContext) {\n if (!context._bem) {\n context._bem = parseBEM(context.attributes && context.attributes.class || '');\n }\n\n return context._bem;\n}\n\n/**\n * Parses BEM data from given class name\n */\nfunction parseBEM(classValue?: string): BEMData {\n const classNames = classValue ? classValue.split(/\\s+/) : [];\n return {\n classNames,\n block: findBlockName(classNames)\n };\n}\n\n/**\n * Returns block name for given `node` by `prefix`, which tells the depth of\n * of parent node lookup\n */\nfunction getBlockName(ancestors: BEMAbbreviationNode[], depth: number = 0, context?: BEMAbbreviationContext): string {\n const maxParentIx = 0;\n let parentIx = Math.max(ancestors.length - depth, maxParentIx);\n do {\n const parent = ancestors[parentIx];\n if (parent) {\n const data = getBEMData(parent as BEMAbbreviationNode);\n if (data.block) {\n return data.block;\n }\n }\n } while (maxParentIx < parentIx--);\n\n if (context) {\n const data = getBEMDataFromContext(context);\n if (data.block) {\n return data.block;\n }\n }\n\n return '';\n}\n\nfunction findBlockName(classNames: string[]): string | undefined {\n return find(classNames, blockCandidates1)\n || find(classNames, blockCandidates2)\n || void 0;\n}\n\n/**\n * Finds class name from given list which may be used as block name\n */\nfunction find(classNames: string[], filter: (className: string) => boolean): string | void {\n for (const cl of classNames) {\n if (reElement.test(cl) || reModifier.test(cl)) {\n break;\n }\n\n if (filter(cl)) {\n return cl;\n }\n }\n}\n\nfunction updateClass(node: AbbreviationNode, value: string) {\n for (const attr of node.attributes!) {\n if (attr.name === 'class') {\n attr.value = [value];\n break;\n }\n }\n}\n\nfunction stringifyValue(value: Value[]): string {\n let result = '';\n\n for (const t of value) {\n result += typeof t === 'string' ? t : t.name;\n }\n\n return result;\n}\n\nfunction uniqueClass<T>(item: T, ix: number, arr: T[]): boolean {\n return !!item && arr.indexOf(item) === ix;\n}\n", "import { AbbreviationNode, Abbreviation } from '@emmetio/abbreviation';\nimport createOutputStream, { OutputStream } from '../../output-stream';\nimport { Config } from '../../config';\n\nexport type WalkNext = (node: AbbreviationNode, index: number, items: AbbreviationNode[]) => void;\nexport type Visitor<S extends WalkState> = (node: AbbreviationNode, index: number, items: AbbreviationNode[], state: S, next: WalkNext) => void;\n\nexport interface WalkState {\n /** Context node */\n current: AbbreviationNode;\n\n /** Immediate parent of currently iterated method */\n parent?: AbbreviationNode;\n\n /** List of all ancestors of context node */\n ancestors: AbbreviationNode[];\n\n /** Current output config */\n config: Config;\n\n /** Output stream */\n out: OutputStream;\n\n /** Current field index, used to output field marks for editor tabstops */\n field: number;\n}\n\nexport default function walk<S extends WalkState>(abbr: Abbreviation, visitor: Visitor<S>, state: S) {\n const callback = (ctx: AbbreviationNode, index: number, items: AbbreviationNode[]) => {\n const { parent, current } = state;\n state.parent = current;\n state.current = ctx;\n visitor(ctx, index, items, state, next);\n state.current = current;\n state.parent = parent;\n };\n\n const next: WalkNext = (node, index, items) => {\n state.ancestors.push(state.current);\n callback(node, index, items);\n state.ancestors.pop();\n };\n\n abbr.children.forEach(callback);\n}\n\nexport function createWalkState(config: Config): WalkState {\n return {\n // @ts-ignore: Will set value in iterator\n current: null,\n parent: void 0,\n ancestors: [],\n config,\n field: 1,\n out: createOutputStream(config.options)\n };\n}\n", "import { AbbreviationNode, Field, Value, AbbreviationAttribute } from '@emmetio/abbreviation';\nimport { WalkState } from './walk';\nimport { pushString, pushField, isInline } from '../../output-stream';\nimport { Config } from '../../config';\n\nexport const caret = [{ type: 'Field', index: 0, name: '' } as Field];\n\n/**\n * Check if given node is a snippet: a node without name and attributes\n */\nexport function isSnippet(node?: AbbreviationNode): boolean {\n return node ? !node.name && !node.attributes : false;\n}\n\n/**\n * Check if given node is inline-level element, e.g. element with explicitly\n * defined node name\n */\nexport function isInlineElement(node: AbbreviationNode | undefined, config: Config): boolean {\n return node ? isInline(node, config) : false;\n}\n\n/**\n * Check if given value token is a field\n */\nexport function isField(token: Value): token is Field {\n return typeof token === 'object' && token.type === 'Field';\n}\n\nexport function pushTokens(tokens: Value[], state: WalkState) {\n const { out } = state;\n let largestIndex = -1;\n\n for (const t of tokens) {\n if (typeof t === 'string') {\n pushString(out, t);\n } else {\n pushField(out, state.field + t.index!, t.name);\n if (t.index! > largestIndex) {\n largestIndex = t.index!;\n }\n }\n }\n\n if (largestIndex !== -1) {\n state.field += largestIndex + 1;\n }\n}\n\n/**\n * Splits given value token by lines: returns array where each entry is a token list\n * for a single line\n */\nexport function splitByLines(tokens: Value[]): Value[][] {\n const result: Value[][] = [];\n let line: Value[] = [];\n\n for (const t of tokens) {\n if (typeof t === 'string') {\n const lines = t.split(/\\r\\n?|\\n/g);\n line.push(lines.shift() || '');\n while (lines.length) {\n result.push(line);\n line = [lines.shift() || ''];\n }\n } else {\n line.push(t);\n }\n }\n\n line.length && result.push(line);\n return result;\n}\n\n/**\n * Check if given attribute should be outputted\n */\nexport function shouldOutputAttribute(attr: AbbreviationAttribute): boolean {\n // In case if attribute is implied, check if it has a defined value:\n // either non-empty value or quoted empty value\n return !attr.implied || attr.valueType !== 'raw' || (!!attr.value && attr.value.length > 0);\n}\n", "export type TemplateToken = string | TemplatePlaceholder;\nexport interface TemplatePlaceholder {\n before: string;\n after: string;\n name: string;\n}\n\ninterface TokenScanner {\n text: string;\n pos: number;\n}\n\nconst enum TemplateChars {\n /** `[` character */\n Start = 91,\n\n /** `]` character */\n End = 93,\n\n /* `_` character */\n Underscore = 95,\n\n /* `-` character */\n Dash = 45,\n}\n\n/**\n * Splits given string into template tokens.\n * Template is a string which contains placeholders which are uppercase names\n * between `[` and `]`, for example: `[PLACEHOLDER]`.\n * Unlike other templates, a placeholder may contain extra characters before and\n * after name: `[%PLACEHOLDER.]`. If data for `PLACEHOLDER` is defined, it will\n * be outputted with with these extra character, otherwise will be completely omitted.\n */\nexport default function template(text: string): TemplateToken[] {\n const tokens: TemplateToken[] = [];\n const scanner: TokenScanner = { pos: 0, text };\n let placeholder: TemplatePlaceholder | undefined;\n let offset = scanner.pos;\n let pos = scanner.pos;\n\n while (scanner.pos < scanner.text.length) {\n pos = scanner.pos;\n if (placeholder = consumePlaceholder(scanner)) {\n if (offset !== scanner.pos) {\n tokens.push(text.slice(offset, pos));\n }\n tokens.push(placeholder);\n offset = scanner.pos;\n } else {\n scanner.pos++;\n }\n }\n\n if (offset !== scanner.pos) {\n tokens.push(text.slice(offset));\n }\n\n return tokens;\n}\n\n/**\n * Consumes placeholder like `[#ID]` from given scanner\n */\nfunction consumePlaceholder(scanner: TokenScanner): TemplatePlaceholder | undefined {\n if (peek(scanner) === TemplateChars.Start) {\n const start = ++scanner.pos;\n let namePos = start;\n let afterPos = start;\n let stack = 1;\n\n while (scanner.pos < scanner.text.length) {\n const code = peek(scanner);\n if (isTokenStart(code)) {\n namePos = scanner.pos;\n while (isToken(peek(scanner))) {\n scanner.pos++;\n }\n afterPos = scanner.pos;\n } else {\n if (code === TemplateChars.Start) {\n stack++;\n } else if (code === TemplateChars.End) {\n if (--stack === 0) {\n return {\n before: scanner.text.slice(start, namePos),\n after: scanner.text.slice(afterPos, scanner.pos++),\n name: scanner.text.slice(namePos, afterPos)\n };\n }\n }\n\n scanner.pos++;\n }\n }\n }\n}\n\nfunction peek(scanner: TokenScanner, pos = scanner.pos): number {\n return scanner.text.charCodeAt(pos);\n}\n\nfunction isTokenStart(code: number): boolean {\n return code >= 65 && code <= 90; // A-Z\n}\n\nfunction isToken(code: number): boolean {\n return isTokenStart(code)\n || (code > 47 && code < 58) /* 0-9 */\n || code === TemplateChars.Underscore\n || code === TemplateChars.Dash;\n}\n", "import { AbbreviationNode, Value } from '@emmetio/abbreviation';\nimport { pushString } from '../../output-stream';\nimport { WalkState } from './walk';\nimport { pushTokens } from './utils';\nimport template, { TemplateToken } from './template';\nimport { Config } from '../../config';\nimport { HTMLWalkState } from './html';\n\nexport interface CommentWalkState {\n enabled: boolean;\n trigger: string[];\n before?: TemplateToken[];\n after?: TemplateToken[];\n}\n\nexport function createCommentState(config: Config): CommentWalkState {\n const { options } = config;\n return {\n enabled: options['comment.enabled'],\n trigger: options['comment.trigger'],\n before: options['comment.before'] ? template(options['comment.before']) : void 0,\n after: options['comment.after'] ? template(options['comment.after']) : void 0\n };\n}\n\n/**\n * Adds comment prefix for given node, if required\n */\nexport function commentNodeBefore(node: AbbreviationNode, state: HTMLWalkState) {\n if (shouldComment(node, state) && state.comment.before) {\n output(node, state.comment.before, state);\n }\n}\n\n/**\n * Adds comment suffix for given node, if required\n */\nexport function commentNodeAfter(node: AbbreviationNode, state: HTMLWalkState) {\n if (shouldComment(node, state) && state.comment.after) {\n output(node, state.comment.after, state);\n }\n}\n\n/**\n * Check if given node should be commented\n */\nfunction shouldComment(node: AbbreviationNode, state: HTMLWalkState): boolean {\n const { comment } = state;\n\n if (!comment.enabled || !comment.trigger || !node.name || !node.attributes) {\n return false;\n }\n\n for (const attr of node.attributes) {\n if (attr.name && comment.trigger.includes(attr.name)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Pushes given template tokens into output stream\n */\nfunction output(node: AbbreviationNode, tokens: TemplateToken[], state: WalkState) {\n const attrs: { [name: string]: Value[] } = {};\n const { out } = state;\n\n // Collect attributes payload\n for (const attr of node.attributes!) {\n if (attr.name && attr.value) {\n attrs[attr.name.toUpperCase()] = attr.value;\n }\n }\n\n // Output parsed tokens\n for (const token of tokens) {\n if (typeof token === 'string') {\n pushString(out, token);\n } else if (attrs[token.name]) {\n pushString(out, token.before);\n pushTokens(attrs[token.name], state);\n pushString(out, token.after);\n }\n }\n}\n", "import { Abbreviation, AbbreviationNode, AbbreviationAttribute, Value } from '@emmetio/abbreviation';\nimport { pushNewline, pushString, tagName, selfClose, attrName, isBooleanAttribute, attrQuote, isInline } from '../../output-stream';\nimport walk, { WalkState, createWalkState } from './walk';\nimport { caret, isInlineElement, isSnippet, isField, pushTokens, shouldOutputAttribute } from './utils';\nimport { commentNodeBefore, commentNodeAfter, CommentWalkState, createCommentState } from './comment';\nimport { Config } from '../../config';\n\nconst htmlTagRegex = /^<([\\w\\-:]+)[\\s>]/;\ntype WalkNext = (node: AbbreviationNode, index: number, items: AbbreviationNode[]) => void;\n\nexport interface HTMLWalkState extends WalkState {\n comment: CommentWalkState;\n}\n\nexport default function html(abbr: Abbreviation, config: Config): string {\n const state = createWalkState(config) as HTMLWalkState;\n state.comment = createCommentState(config);\n walk(abbr, element, state);\n return state.out.value;\n}\n\n/**\n * Outputs `node` content to output stream of `state`\n * @param node Context node\n * @param index Index of `node` in `items`\n * @param items List of `node`’s siblings\n * @param state Current walk state\n */\nfunction element(node: AbbreviationNode, index: number, items: AbbreviationNode[], state: HTMLWalkState, next: WalkNext) {\n const { out, config } = state;\n const format = shouldFormat(node, index, items, state);\n\n // Pick offset level for current node\n const level = getIndent(state);\n out.level += level;\n\n format && pushNewline(out, true);\n\n if (node.name) {\n const name = tagName(node.name, config);\n commentNodeBefore(node, state);\n pushString(out, `<${name}`);\n\n if (node.attributes) {\n for (const attr of node.attributes) {\n if (shouldOutputAttribute(attr)) {\n pushAttribute(attr, state);\n }\n }\n }\n\n if (node.selfClosing && !node.children.length && !node.value) {\n pushString(out, `${selfClose(config)}>`);\n } else {\n pushString(out, '>');\n\n if (!pushSnippet(node, state, next)) {\n if (node.value) {\n const innerFormat = node.value.some(hasNewline) || startsWithBlockTag(node.value, config);\n innerFormat && pushNewline(state.out, ++out.level);\n pushTokens(node.value, state);\n innerFormat && pushNewline(state.out, --out.level);\n }\n\n node.children.forEach(next);\n\n if (!node.value && !node.children.length) {\n const innerFormat = config.options['output.formatLeafNode']\n || config.options['output.formatForce'].includes(node.name);\n innerFormat && pushNewline(state.out, ++out.level);\n pushTokens(caret, state);\n innerFormat && pushNewline(state.out, --out.level);\n }\n }\n\n pushString(out, `</${name}>`);\n commentNodeAfter(node, state);\n }\n } else if (!pushSnippet(node, state, next) && node.value) {\n // A text-only node (snippet)\n pushTokens(node.value, state);\n node.children.forEach(next);\n }\n\n if (format && index === items.length - 1 && state.parent) {\n const offset = isSnippet(state.parent) ? 0 : 1;\n pushNewline(out, out.level - offset);\n }\n\n out.level -= level;\n}\n\n/**\n * Outputs given attribute’s content into output stream\n */\nfunction pushAttribute(attr: AbbreviationAttribute, state: WalkState) {\n const { out, config } = state;\n\n if (attr.name) {\n const name = attrName(attr.name, config);\n const lQuote = attrQuote(attr, config, true);\n const rQuote = attrQuote(attr, config);\n let value = attr.value;\n\n if (isBooleanAttribute(attr, config) && !value) {\n // If attribute value is omitted and it’s a boolean value, check for\n // `compactBoolean` option: if it’s disabled, set value to attribute name\n // (XML style)\n if (!config.options['output.compactBoolean']) {\n value = [name];\n }\n } else if (!value) {\n value = caret;\n }\n\n pushString(out, ' ' + name);\n if (value) {\n pushString(out, '=' + lQuote);\n pushTokens(value, state);\n pushString(out, rQuote);\n } else if (config.options['output.selfClosingStyle'] !== 'html') {\n pushString(out, '=' + lQuote + rQuote);\n }\n }\n}\n\nexport function pushSnippet(node: AbbreviationNode, state: WalkState, next: WalkNext): boolean {\n if (node.value && node.children.length) {\n // We have a value and child nodes. In case if value contains fields,\n // we should output children as a content of first field\n const fieldIx = node.value.findIndex(isField);\n if (fieldIx !== -1) {\n pushTokens(node.value.slice(0, fieldIx), state);\n const line = state.out.line;\n let pos = fieldIx + 1;\n node.children.forEach(next);\n\n // If there was a line change, trim leading whitespace for better result\n if (state.out.line !== line && typeof node.value[pos] === 'string') {\n pushString(state.out, (node.value[pos++] as string).trimLeft());\n }\n\n pushTokens(node.value.slice(pos), state);\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Check if given node should be formatted in its parent context\n */\nfunction shouldFormat(node: AbbreviationNode, index: number, items: AbbreviationNode[], state: WalkState): boolean {\n const { config, parent } = state;\n\n if (!config.options['output.format']) {\n return false;\n }\n\n if (index === 0 && !parent) {\n // Do not format very first node\n return false;\n }\n\n // Do not format single child of snippet\n if (parent && isSnippet(parent) && items.length === 1) {\n return false;\n }\n\n /**\n * Adjacent text-only/snippet nodes\n */\n if (isSnippet(node)) {\n // Adjacent text-only/snippet nodes\n const format = isSnippet(items[index - 1]) || isSnippet(items[index + 1])\n\n // Has newlines: looks like wrapping code fragment\n || node.value!.some(hasNewline)\n\n // Format as wrapper: contains children which will be outputted as field content\n || (node.value!.some(isField) && node.children.length);\n\n if (format) {\n return true;\n }\n }\n\n if (isInline(node, config)) {\n // Check if inline node is the next sibling of block-level node\n if (index === 0) {\n // First node in parent: format if it’s followed by a block-level element\n for (let i = 0; i < items.length; i++) {\n if (!isInline(items[i], config)) {\n return true;\n }\n }\n } else if (!isInline(items[index - 1], config)) {\n // Node is right after block-level element\n return true;\n }\n\n if (config.options['output.inlineBreak']) {\n // check for adjacent inline elements before and after current element\n let adjacentInline = 1;\n let before = index;\n let after = index;\n\n while (isInlineElement(items[--before], config)) {\n adjacentInline++;\n }\n\n while (isInlineElement(items[++after], config)) {\n adjacentInline++;\n }\n\n if (adjacentInline >= config.options['output.inlineBreak']) {\n return true;\n }\n }\n\n // Edge case: inline node contains node that should receive formatting\n for (let i = 0, il = node.children.length; i < il; i++) {\n if (shouldFormat(node.children[i], i, node.children, state)) {\n return true;\n }\n }\n\n return false;\n }\n\n return true;\n}\n\n/**\n * Returns indentation offset for given node\n */\nfunction getIndent(state: WalkState): number {\n const { config, parent } = state;\n\n if (!parent || isSnippet(parent) || (parent.name && config.options['output.formatSkip'].includes(parent.name))) {\n return 0;\n }\n\n return 1;\n}\n\n/**\n * Check if given node value contains newlines\n */\nfunction hasNewline(value: Value): boolean {\n return typeof value === 'string' && /\\r|\\n/.test(value);\n}\n\n/**\n * Check if given node value starts with block-level tag\n */\nfunction startsWithBlockTag(value: Value[], config: Config): boolean {\n if (value.length && typeof value[0] === 'string') {\n const matches = htmlTagRegex.exec(value[0]);\n if (matches?.length && !config.options['inlineElements'].includes(matches[1].toLowerCase())) {\n return true;\n }\n }\n return false;\n}\n", "import { AbbreviationNode, AbbreviationAttribute, Value, Abbreviation } from '@emmetio/abbreviation';\nimport { pushString, pushNewline, push, attrName, isBooleanAttribute, attrQuote } from '../../output-stream';\nimport { pushTokens, caret, splitByLines, isSnippet, shouldOutputAttribute } from './utils';\nimport walk, { WalkState, createWalkState, WalkNext } from './walk';\nimport { Config } from '../../config';\n\n/**\n * @description Utility methods for working with indent-based markup languages\n * like HAML, Slim, Pug etc.\n */\n\ninterface AttributesCollection {\n /** Primary element attributes: `id` and `class` */\n primary: AbbreviationAttribute[];\n\n /** Secondary element attributes: everything except `id` and `class` */\n secondary: AbbreviationAttribute[];\n}\n\nexport interface IndentWalkState extends WalkState {\n options: FormatOptions;\n}\n\nexport interface FormatOptions {\n /** String to output before tag name */\n beforeName?: string;\n\n /** String to output after tag name */\n afterName?: string;\n\n /** String to output before secondary attribute set */\n beforeAttribute?: string;\n\n /** String to output after secondary attribute set */\n afterAttribute?: string;\n\n /** String to put between secondary attributes */\n glueAttribute?: string;\n\n /** Value for boolean attributes */\n booleanValue?: string;\n\n /** String to put before content line (if value is multiline) */\n beforeTextLine?: string;\n\n /** String to put after content line (if value is multiline) */\n afterTextLine?: string;\n\n /** String to put after self-closing elements like `br`. Mostly a `/` character */\n selfClose?: string;\n}\n\nexport default function indentFormat(abbr: Abbreviation, config: Config, options?: Partial<FormatOptions>): string {\n const state = createWalkState(config) as IndentWalkState;\n state.options = options || {};\n walk(abbr, element, state);\n return state.out.value;\n}\n\n/**\n * Outputs `node` content to output stream of `state`\n * @param node Context node\n * @param index Index of `node` in `items`\n * @param items List of `node`’s siblings\n * @param state Current walk state\n */\nexport function element(node: AbbreviationNode, index: number, items: AbbreviationNode[], state: IndentWalkState, next: WalkNext) {\n const { out, options } = state;\n const { primary, secondary } = collectAttributes(node);\n\n // Pick offset level for current node\n const level = state.parent ? 1 : 0;\n out.level += level;\n\n // Do not indent top-level elements\n if (shouldFormat(node, index, items, state)) {\n pushNewline(out, true);\n }\n\n if (node.name && (node.name !== 'div' || !primary.length)) {\n pushString(out, (options.beforeName || '') + node.name + (options.afterName || ''));\n }\n\n pushPrimaryAttributes(primary, state);\n pushSecondaryAttributes(secondary.filter(shouldOutputAttribute), state);\n\n if (node.selfClosing && !node.value && !node.children.length) {\n if (state.options.selfClose) {\n pushString(out, state.options.selfClose);\n }\n } else {\n pushValue(node, state);\n node.children.forEach(next);\n }\n\n out.level -= level;\n}\n\n/**\n * From given node, collects all attributes as `primary` (id, class) and\n * `secondary` (all the rest) lists. In most indent-based syntaxes, primary attribute\n * has special syntax\n */\nexport function collectAttributes(node: AbbreviationNode): AttributesCollection {\n const primary: AbbreviationAttribute[] = [];\n const secondary: AbbreviationAttribute[] = [];\n\n if (node.attributes) {\n for (const attr of node.attributes) {\n if (isPrimaryAttribute(attr)) {\n primary.push(attr);\n } else {\n secondary.push(attr);\n }\n }\n }\n\n return { primary, secondary };\n}\n\n/**\n * Outputs given attributes as primary into output stream\n */\nexport function pushPrimaryAttributes(attrs: AbbreviationAttribute[], state: WalkState) {\n for (const attr of attrs) {\n if (attr.value) {\n if (attr.name === 'class') {\n pushString(state.out, '.');\n // All whitespace characters must be replaced with dots in class names\n const tokens = attr.value.map(t => typeof t === 'string' ? t.replace(/\\s+/g, '.') : t);\n pushTokens(tokens, state);\n } else {\n // ID attribute\n pushString(state.out, '#');\n pushTokens(attr.value, state);\n }\n }\n }\n}\n\n/**\n * Outputs given attributes as secondary into output stream\n */\nexport function pushSecondaryAttributes(attrs: AbbreviationAttribute[], state: IndentWalkState) {\n if (attrs.length) {\n const { out, config, options } = state;\n\n options.beforeAttribute && pushString(out, options.beforeAttribute);\n\n for (let i = 0; i < attrs.length; i++) {\n const attr = attrs[i];\n pushString(out, attrName(attr.name || '', config));\n if (isBooleanAttribute(attr, config) && !attr.value) {\n if (!config.options['output.compactBoolean'] && options.booleanValue) {\n pushString(out, '=' + options.booleanValue);\n }\n } else {\n pushString(out, '=' + attrQuote(attr, config, true));\n pushTokens(attr.value || caret, state);\n pushString(out, attrQuote(attr, config));\n }\n\n if (i !== attrs.length - 1 && options.glueAttribute) {\n pushString(out, options.glueAttribute);\n }\n }\n\n options.afterAttribute && pushString(out, options.afterAttribute);\n }\n}\n\n/**\n * Outputs given node value into state output stream\n */\nexport function pushValue(node: AbbreviationNode, state: IndentWalkState) {\n // We should either output value or add caret but for leaf nodes only (no children)\n if (!node.value && node.children.length) {\n return;\n }\n\n const value = node.value || caret;\n const lines = splitByLines(value);\n const { out, options } = state;\n\n if (lines.length === 1) {\n if (node.name || node.attributes) {\n push(out, ' ');\n }\n pushTokens(value, state);\n } else {\n // We should format multi-line value with terminating `|` character\n // and same line length\n const lineLengths: number[] = [];\n let maxLength = 0;\n\n // Calculate lengths of all lines and max line length\n for (const line of lines) {\n const len = valueLength(line);\n lineLengths.push(len);\n if (len > maxLength) {\n maxLength = len;\n }\n }\n\n // Output each line, padded to max length\n out.level++;\n for (let i = 0; i < lines.length; i++) {\n pushNewline(out, true);\n options.beforeTextLine && push(out, options.beforeTextLine);\n pushTokens(lines[i], state);\n if (options.afterTextLine) {\n push(out, ' '.repeat(maxLength - lineLengths[i]));\n push(out, options.afterTextLine);\n }\n }\n out.level--;\n }\n}\n\nfunction isPrimaryAttribute(attr: AbbreviationAttribute): boolean {\n return attr.name === 'class' || attr.name === 'id';\n}\n\n/**\n * Calculates string length from given tokens\n */\nfunction valueLength(tokens: Value[]): number {\n let len = 0;\n\n for (const token of tokens) {\n len += typeof token === 'string' ? token.length : token.name.length;\n }\n\n return len;\n}\n\nfunction shouldFormat(node: AbbreviationNode, index: number, items: AbbreviationNode[], state: WalkState): boolean {\n // Do not format first top-level element or snippets\n if (!state.parent && index === 0) {\n return false;\n }\n return !isSnippet(node);\n}\n", "import { Abbreviation } from '@emmetio/abbreviation';\nimport indentFormat from './indent-format';\nimport { Config } from '../../config';\n\nexport default function haml(abbr: Abbreviation, config: Config): string {\n return indentFormat(abbr, config, {\n beforeName: '%',\n beforeAttribute: '(',\n afterAttribute: ')',\n glueAttribute: ' ',\n afterTextLine: ' |',\n booleanValue: 'true',\n selfClose: '/'\n });\n}\n", "import { Abbreviation } from '@emmetio/abbreviation';\nimport indentFormat from './indent-format';\nimport { Config } from '../../config';\n\nexport default function slim(abbr: Abbreviation, config: Config): string {\n return indentFormat(abbr, config, {\n beforeAttribute: ' ',\n glueAttribute: ' ',\n beforeTextLine: '| ',\n selfClose: '/'\n });\n}\n", "import { Abbreviation } from '@emmetio/abbreviation';\nimport indentFormat from './indent-format';\nimport { Config } from '../../config';\n\nexport default function pug(abbr: Abbreviation, config: Config): string {\n return indentFormat(abbr, config, {\n beforeAttribute: '(',\n afterAttribute: ')',\n glueAttribute: ', ',\n beforeTextLine: '| ',\n selfClose: config.options['output.selfClosingStyle'] === 'xml' ? '/' : ''\n });\n}\n", "import abbreviation, { Abbreviation, AbbreviationNode, ParserOptions } from '@emmetio/abbreviation';\nimport attributes from './attributes';\nimport snippets from './snippets';\nimport implicitTag from './implicit-tag';\nimport lorem from './lorem';\nimport jsx from './addon/jsx';\nimport xsl from './addon/xsl';\nimport bem from './addon/bem';\nimport html from './format/html';\nimport haml from './format/haml';\nimport slim from './format/slim';\nimport pug from './format/pug';\nimport { Config } from '../config';\nimport { walk, Container } from './utils';\n\ntype Formatter = (abbr: Abbreviation, config: Config) => string;\n\nconst formatters: { [syntax: string]: Formatter } = { html, haml, slim, pug };\n\n/**\n * Parses given Emmet abbreviation into a final abbreviation tree with all\n * required transformations applied\n */\nexport default function parse(abbr: string | Abbreviation, config: Config): Abbreviation {\n let oldTextValue: string | string[] | undefined;\n if (typeof abbr === 'string') {\n let parseOpt: ParserOptions = config;\n if (config.options['jsx.enabled']) {\n parseOpt = {\n ...parseOpt,\n jsx: true\n };\n }\n if (config.options['markup.href']) {\n parseOpt = {\n ...parseOpt,\n href: true\n };\n }\n\n abbr = abbreviation(abbr, parseOpt);\n\n // remove text field before snippets(abbr, config) call\n // as abbreviation(abbr, parseOpt) already handled it\n oldTextValue = config.text;\n config.text = undefined;\n }\n\n // Run abbreviation resolve in two passes:\n // 1. Map each node to snippets, which are abbreviations as well. A single snippet\n // may produce multiple nodes\n // 2. Transform every resolved node\n abbr = snippets(abbr, config);\n walk(abbr, transform, config);\n config.text = oldTextValue ?? config.text;\n return abbr;\n}\n\n/**\n * Converts given abbreviation to string according to provided `config`\n */\nexport function stringify(abbr: Abbreviation, config: Config): string {\n const formatter: Formatter = formatters[config.syntax] || html;\n return formatter(abbr, config);\n}\n\n/**\n * Modifies given node and prepares it for output\n */\nfunction transform(node: AbbreviationNode, ancestors: Container[], config: Config) {\n implicitTag(node, ancestors, config);\n attributes(node, config);\n lorem(node, ancestors, config);\n\n if (config.syntax === 'xsl') {\n xsl(node);\n }\n\n if (config.options['jsx.enabled']) {\n jsx(node);\n }\n\n if (config.options['bem.enabled']) {\n bem(node, ancestors, config);\n }\n}\n", "import parse, { CSSValue, ParseOptions, FunctionCall, Literal } from '@emmetio/css-abbreviation';\n\nexport type CSSSnippet = CSSSnippetRaw | CSSSnippetProperty;\n\ninterface KeywordMap {\n [name: string]: FunctionCall | Literal;\n}\n\nexport const enum CSSSnippetType {\n Raw = 'Raw',\n Property = 'Property'\n}\n\ninterface CSSSnippetBase {\n type: CSSSnippetType;\n key: string;\n}\n\nexport interface CSSSnippetRaw extends CSSSnippetBase {\n type: CSSSnippetType.Raw;\n value: string;\n}\n\nexport interface CSSSnippetProperty extends CSSSnippetBase {\n type: CSSSnippetType.Property;\n property: string;\n value: CSSValue[][];\n keywords: KeywordMap;\n dependencies: CSSSnippetProperty[];\n}\n\nconst reProperty = /^([a-z-]+)(?:\\s*:\\s*([^\\n\\r;]+?);*)?$/;\nconst opt: ParseOptions = { value: true };\n\n/**\n * Creates structure for holding resolved CSS snippet\n */\nexport default function createSnippet(key: string, value: string): CSSSnippet {\n // A snippet could be a raw text snippet (e.g. arbitrary text string) or a\n // CSS property with possible values separated by `|`.\n // In latter case, we have to parse snippet as CSS abbreviation\n const m = value.match(reProperty);\n if (m) {\n const keywords: KeywordMap = {};\n const parsed: CSSValue[][] = m[2] ? m[2].split('|').map(parseValue) : [];\n\n for (const item of parsed) {\n for (const cssVal of item) {\n collectKeywords(cssVal, keywords);\n }\n }\n\n return {\n type: CSSSnippetType.Property,\n key,\n property: m[1],\n value: parsed,\n keywords,\n dependencies: []\n };\n }\n\n return { type: CSSSnippetType.Raw, key, value };\n}\n\n/**\n * Nests more specific CSS properties into shorthand ones, e.g.\n * `background-position-x` -> `background-position` -> `background`\n */\nexport function nest(snippets: CSSSnippet[]): CSSSnippet[] {\n snippets = snippets.slice().sort(snippetsSort);\n const stack: CSSSnippetProperty[] = [];\n let prev: CSSSnippet;\n\n // For sorted list of CSS properties, create dependency graph where each\n // shorthand property contains its more specific one, e.g.\n // background -> background-position -> background-position-x\n for (const cur of snippets.filter(isProperty)) {\n // Check if current property belongs to one from parent stack.\n // Since `snippets` array is sorted, items are perfectly aligned\n // from shorthands to more specific variants\n while (stack.length) {\n prev = stack[stack.length - 1];\n\n if (cur.property.startsWith(prev.property!)\n && cur.property.charCodeAt(prev.property!.length) === 45 /* - */) {\n prev.dependencies.push(cur);\n stack.push(cur);\n break;\n }\n\n stack.pop();\n }\n\n if (!stack.length) {\n stack.push(cur);\n }\n\n }\n\n return snippets;\n}\n\n/**\n * A sorting function for array of snippets\n */\nfunction snippetsSort(a: CSSSnippet, b: CSSSnippet): number {\n if (a.key === b.key) {\n return 0;\n }\n\n return a.key < b.key ? -1 : 1;\n}\n\nfunction parseValue(value: string): CSSValue[] {\n return parse(value.trim(), opt)[0].value;\n}\n\nfunction isProperty(snippet: CSSSnippet): snippet is CSSSnippetProperty {\n return snippet.type === CSSSnippetType.Property;\n}\n\nfunction collectKeywords(cssVal: CSSValue, dest: KeywordMap) {\n for (const v of cssVal.value) {\n if (v.type === 'Literal') {\n dest[v.value] = v;\n } else if (v.type === 'FunctionCall') {\n dest[v.name] = v;\n } else if (v.type === 'Field') {\n // Create literal from field, if available\n const value = v.name.trim();\n if (value) {\n dest[value] = { type: 'Literal', value };\n }\n }\n }\n}\n", "/**\n * Calculates how close `str1` matches `str2` using fuzzy match.\n * How matching works:\n * – first characters of both `str1` and `str2` *must* match\n * – `str1` length larger than `str2` length is allowed only when `unmatched` is true\n * – ideal match is when `str1` equals to `str2` (score: 1)\n * – next best match is `str2` starts with `str1` (score: 1 × percent of matched characters)\n * – other scores depend on how close characters of `str1` to the beginning of `str2`\n * @param partialMatch Allow length `str1` to be greater than `str2` length\n */\nexport default function scoreMatch(str1: string, str2: string, partialMatch = false) {\n str1 = str1.toLowerCase();\n str2 = str2.toLowerCase();\n\n if (str1 === str2) {\n return 1;\n }\n\n // Both strings MUST start with the same character\n if (!str1 || !str2 || str1.charCodeAt(0) !== str2.charCodeAt(0)) {\n return 0;\n }\n\n const str1Len = str1.length;\n const str2Len = str2.length;\n\n if (!partialMatch && str1Len > str2Len) {\n return 0;\n }\n\n // Characters from `str1` which are closer to the beginning of a `str2` should\n // have higher score.\n // For example, if `str2` is `abcde`, it’s max score is:\n // 5 + 4 + 3 + 2 + 1 = 15 (sum of character positions in reverse order)\n // Matching `abd` against `abcde` should produce:\n // 5 + 4 + 2 = 11\n // Acronym bonus for match right after `-`. Matching `abd` against `abc-de`\n // should produce:\n // 6 + 5 + 4 (use `d` position in `abd`, not in abc-de`)\n\n const minLength = Math.min(str1Len, str2Len);\n const maxLength = Math.max(str1Len, str2Len);\n let i = 1;\n let j = 1;\n let score = maxLength;\n let ch1 = 0;\n let ch2 = 0;\n let found = false;\n let acronym = false;\n\n while (i < str1Len) {\n ch1 = str1.charCodeAt(i);\n found = false;\n acronym = false;\n\n while (j < str2Len) {\n ch2 = str2.charCodeAt(j);\n\n if (ch1 === ch2) {\n found = true;\n score += maxLength - (acronym ? i : j);\n break;\n }\n\n // add acronym bonus for exactly next match after unmatched `-`\n acronym = ch2 === 45 /* - */;\n j++;\n }\n\n if (!found) {\n if (!partialMatch) {\n return 0;\n }\n break;\n }\n\n i++;\n }\n\n const matchRatio = i / maxLength;\n const delta = maxLength - minLength;\n const maxScore = sum(maxLength) - sum(delta);\n return (score * matchRatio) / maxScore;\n}\n\n/**\n * Calculates sum of first `n` numbers, e.g. 1+2+3+...n\n */\nfunction sum(n: number): number {\n return n * (n + 1) / 2;\n}\n", "import { ColorValue } from '@emmetio/css-abbreviation';\n\nexport default function color(token: ColorValue, shortHex?: boolean): string {\n if (!token.r && !token.g && !token.b && !token.a) {\n return 'transparent';\n } else if (token.a === 1) {\n return asHex(token, shortHex);\n }\n\n return asRGB(token);\n}\n\n/**\n * Output given color as hex value\n * @param short Produce short value (e.g. #fff instead of #ffffff), if possible\n */\nexport function asHex(token: ColorValue, short?: boolean): string {\n const fn = (short && isShortHex(token.r) && isShortHex(token.g) && isShortHex(token.b))\n ? toShortHex : toHex;\n\n return '#' + fn(token.r) + fn(token.g) + fn(token.b);\n}\n\n/**\n * Output current color as `rgba?(...)` CSS color\n */\nfunction asRGB(token: ColorValue): string {\n const values: Array<string | number> = [token.r, token.g, token.b];\n if (token.a !== 1) {\n values.push(frac(token.a, 8));\n }\n\n return `${values.length === 3 ? 'rgb' : 'rgba'}(${values.join(', ')})`;\n}\n\nexport function frac(num: number, digits = 4): string {\n return num.toFixed(digits).replace(/\\.?0+$/, '');\n}\n\nfunction isShortHex(hex: number): boolean {\n return !(hex % 17);\n}\n\nfunction toShortHex(num: number): string {\n return (num >> 4).toString(16);\n}\n\nfunction toHex(num: number): string {\n return pad(num.toString(16), 2);\n}\n\nfunction pad(value: string, len: number): string {\n while (value.length < len) {\n value = '0' + value;\n }\n return value;\n}\n", "import { CSSAbbreviation, CSSProperty, Value, CSSValue, NumberValue } from '@emmetio/css-abbreviation';\nimport createOutputStream, { OutputStream, push, pushString, pushField, pushNewline } from '../output-stream';\nimport { Config } from '../config';\nimport color, { frac } from './color';\nimport { CSSAbbreviationScope } from './';\n\nexport default function css(abbr: CSSAbbreviation, config: Config): string {\n const out = createOutputStream(config.options);\n const format = config.options['output.format'];\n\n if (config.context?.name === CSSAbbreviationScope.Section) {\n // For section context, filter out unmatched snippets\n abbr = abbr.filter(node => node.snippet);\n }\n\n for (let i = 0; i < abbr.length; i++) {\n if (format && i !== 0) {\n pushNewline(out, true);\n }\n property(abbr[i], out, config);\n }\n\n return out.value;\n}\n\n/**\n * Outputs given abbreviation node into output stream\n */\nfunction property(node: CSSProperty, out: OutputStream, config: Config) {\n const isJSON = config.options['stylesheet.json'];\n if (node.name) {\n // It’s a CSS property\n const name = isJSON ? toCamelCase(node.name) : node.name;\n pushString(out, name + config.options['stylesheet.between']);\n\n if (node.value.length) {\n propertyValue(node, out, config);\n } else {\n pushField(out, 0, '');\n }\n\n if (isJSON) {\n // For CSS-in-JS, always finalize property with comma\n // NB: seems like `important` is not available in CSS-in-JS syntaxes\n push(out, ',');\n } else {\n outputImportant(node, out, true);\n push(out, config.options['stylesheet.after']);\n }\n } else {\n // It’s a regular snippet, output plain tokens without any additional formatting\n for (const cssVal of node.value) {\n for (const v of cssVal.value) {\n outputToken(v, out, config);\n }\n }\n outputImportant(node, out, node.value.length > 0);\n }\n}\n\nfunction propertyValue(node: CSSProperty, out: OutputStream, config: Config) {\n const isJSON = config.options['stylesheet.json'];\n const num = isJSON ? getSingleNumeric(node) : null;\n\n if (num && (!num.unit || num.unit === 'px')) {\n // For CSS-in-JS, if property contains single numeric value, output it\n // as JS number\n push(out, String(num.value));\n } else {\n const quote = getQuote(config);\n isJSON && push(out, quote);\n for (let i = 0; i < node.value.length; i++) {\n if (i !== 0) {\n push(out, ', ');\n }\n outputValue(node.value[i], out, config);\n }\n isJSON && push(out, quote);\n }\n}\n\nfunction outputImportant(node: CSSProperty, out: OutputStream, separator?: boolean) {\n if (node.important) {\n if (separator) {\n push(out, ' ');\n }\n push(out, '!important');\n }\n}\n\nfunction outputValue(value: CSSValue, out: OutputStream, config: Config) {\n for (let i = 0, prevEnd = -1; i < value.value.length; i++) {\n const token = value.value[i];\n // Handle edge case: a field is written close to previous token like this: `foo${bar}`.\n // We should not add delimiter here\n if (i !== 0 && (token.type !== 'Field' || token.start !== prevEnd)) {\n push(out, ' ');\n }\n\n outputToken(token, out, config);\n prevEnd = token['end'];\n }\n}\n\nfunction outputToken(token: Value, out: OutputStream, config: Config) {\n if (token.type === 'ColorValue') {\n push(out, color(token, config.options['stylesheet.shortHex']));\n } else if (token.type === 'Literal') {\n pushString(out, token.value);\n } else if (token.type === 'NumberValue') {\n pushString(out, frac(token.value, 4) + token.unit);\n } else if (token.type === 'StringValue') {\n const quote = token.quote === 'double' ? '\"' : '\\'';\n pushString(out, quote + token.value + quote);\n } else if (token.type === 'Field') {\n pushField(out, token.index!, token.name);\n } else if (token.type === 'FunctionCall') {\n push(out, token.name + '(');\n for (let i = 0; i < token.arguments.length; i++) {\n if (i) {\n push(out, ', ');\n }\n outputValue(token.arguments[i], out, config);\n }\n push(out, ')');\n }\n}\n\n/**\n * If value of given property is a single numeric value, returns this token\n */\nfunction getSingleNumeric(node: CSSProperty): NumberValue | void {\n if (node.value.length === 1) {\n const cssVal = node.value[0]!;\n if (cssVal.value.length === 1 && cssVal.value[0]!.type === 'NumberValue') {\n return cssVal.value[0] as NumberValue;\n }\n }\n}\n\n/**\n * Converts kebab-case string to camelCase\n */\nfunction toCamelCase(str: string): string {\n return str.replace(/\\-(\\w)/g, (_, letter: string) => letter.toUpperCase());\n}\n\nfunction getQuote(config: Config): string {\n return config.options['stylesheet.jsonDoubleQuotes'] ? '\"' : '\\'';\n}\n", "import abbreviation, { CSSAbbreviation, CSSProperty, CSSValue, Literal, Value, Field, FunctionCall } from '@emmetio/css-abbreviation';\nimport { Config, SnippetsMap } from '../config';\nimport createSnippet, { CSSSnippet, nest, CSSSnippetType, CSSSnippetRaw, CSSSnippetProperty } from './snippets';\nimport calculateScore from './score';\nimport color from './color';\n\ntype MatchInput = CSSSnippet | string;\n\nexport const enum CSSAbbreviationScope {\n /** Include all possible snippets in match */\n Global = '@@global',\n /** Include raw snippets only (e.g. no properties) in abbreviation match */\n Section = '@@section',\n /** Include properties only in abbreviation match */\n Property = '@@property',\n /** Resolve abbreviation in context of CSS property value */\n Value = '@@value',\n}\n\n\nconst gradientName = 'lg';\n\n/**\n * Parses given Emmet abbreviation into a final abbreviation tree with all\n * required transformations applied\n */\nexport default function parse(abbr: string | CSSAbbreviation, config: Config): CSSAbbreviation {\n const snippets = config.cache?.stylesheetSnippets || convertSnippets(config.snippets);\n\n if (config.cache) {\n config.cache.stylesheetSnippets = snippets;\n }\n\n if (typeof abbr === 'string') {\n abbr = abbreviation(abbr, { value: isValueScope(config) });\n }\n\n const filteredSnippets = getSnippetsForScope(snippets, config);\n\n for (const node of abbr) {\n resolveNode(node, filteredSnippets, config);\n }\n\n return abbr;\n}\n\nexport { default as stringify } from './format';\n\n/**\n * Converts given raw snippets into internal snippets representation\n */\nexport function convertSnippets(snippets: SnippetsMap): CSSSnippet[] {\n const result: CSSSnippet[] = [];\n for (const key of Object.keys(snippets)) {\n result.push(createSnippet(key, snippets[key]));\n }\n\n return nest(result);\n}\n\n/**\n * Resolves given node: finds matched CSS snippets using fuzzy match and resolves\n * keyword aliases from node value\n */\nfunction resolveNode(node: CSSProperty, snippets: CSSSnippet[], config: Config): CSSProperty {\n if (!resolveGradient(node, config)) {\n const score = config.options['stylesheet.fuzzySearchMinScore'];\n if (isValueScope(config)) {\n // Resolve as value of given CSS property\n const propName = config.context!.name;\n const snippet = snippets.find(s => s.type === CSSSnippetType.Property && s.property === propName) as CSSSnippetProperty | undefined;\n resolveValueKeywords(node, config, snippet, score);\n node.snippet = snippet;\n } else if (node.name) {\n const snippet = findBestMatch(node.name, snippets, score, true);\n node.snippet = snippet;\n\n if (snippet) {\n if (snippet.type === CSSSnippetType.Property) {\n resolveAsProperty(node, snippet, config);\n } else {\n resolveAsSnippet(node, snippet);\n }\n }\n }\n }\n\n if (node.name || config.context) {\n // Resolve numeric values for CSS properties only\n resolveNumericValue(node, config);\n }\n\n return node;\n}\n\n/**\n * Resolves CSS gradient shortcut from given property, if possible\n */\nfunction resolveGradient(node: CSSProperty, config: Config): boolean {\n let gradientFn: FunctionCall | null = null;\n const cssVal = node.value.length === 1 ? node.value[0]! : null;\n\n if (cssVal && cssVal.value.length === 1) {\n const v = cssVal.value[0]!;\n if (v.type === 'FunctionCall' && v.name === gradientName) {\n gradientFn = v;\n }\n }\n\n if (gradientFn || node.name === gradientName) {\n if (!gradientFn) {\n gradientFn = {\n type: 'FunctionCall',\n name: 'linear-gradient',\n arguments: [cssValue(field(0, ''))]\n };\n } else {\n gradientFn = {\n ...gradientFn,\n name: 'linear-gradient'\n };\n }\n\n if (!config.context) {\n node.name = 'background-image';\n }\n node.value = [cssValue(gradientFn)];\n return true;\n }\n\n return false;\n}\n\n/**\n * Resolves given parsed abbreviation node as CSS property\n */\nfunction resolveAsProperty(node: CSSProperty, snippet: CSSSnippetProperty, config: Config): CSSProperty {\n const abbr = node.name!;\n\n // Check for unmatched part of abbreviation\n // For example, in `dib` abbreviation the matched part is `d` and `ib` should\n // be considered as inline value. If unmatched fragment exists, we should check\n // if it matches actual value of snippet. If either explicit value is specified\n // or unmatched fragment did not resolve to to a keyword, we should consider\n // matched snippet as invalid\n const inlineValue = getUnmatchedPart(abbr, snippet.key);\n if (inlineValue) {\n if (node.value.length) {\n // Already have value: unmatched part indicates matched snippet is invalid\n return node;\n }\n const kw = resolveKeyword(inlineValue, config, snippet);\n if (!kw) {\n return node;\n }\n node.value.push(cssValue(kw));\n }\n\n node.name = snippet.property;\n\n if (node.value.length) {\n // Replace keyword alias from current abbreviation node with matched keyword\n resolveValueKeywords(node, config, snippet);\n } else if (snippet.value.length) {\n const defaultValue = snippet.value[0]!;\n\n // https://github.com/emmetio/emmet/issues/558\n // We should auto-select inserted value only if there’s multiple value\n // choice\n node.value = snippet.value.length === 1 || defaultValue.some(hasField)\n ? defaultValue\n : defaultValue.map(n => wrapWithField(n, config));\n }\n\n return node;\n}\n\nfunction resolveValueKeywords(node: CSSProperty, config: Config, snippet?: CSSSnippetProperty, minScore?: number) {\n for (const cssVal of node.value) {\n const value: Value[] = [];\n for (const token of cssVal.value) {\n if (token.type === 'Literal') {\n value.push(resolveKeyword(token.value, config, snippet, minScore) || token);\n } else if (token.type === 'FunctionCall') {\n // For function calls, we should find matching function call\n // and merge arguments\n const match = resolveKeyword(token.name, config, snippet, minScore);\n if (match && match.type === 'FunctionCall') {\n value.push({\n ...match,\n arguments: token.arguments.concat(match.arguments.slice(token.arguments.length))\n });\n } else {\n value.push(token);\n }\n } else {\n value.push(token);\n }\n }\n cssVal.value = value;\n }\n}\n\n/**\n * Resolves given parsed abbreviation node as a snippet: a plain code chunk\n */\nfunction resolveAsSnippet(node: CSSProperty, snippet: CSSSnippetRaw): CSSProperty {\n // When resolving snippets, we have to do the following:\n // 1. Replace field placeholders with actual field tokens.\n // 2. If input values given, put them instead of fields\n let offset = 0;\n let m: RegExpExecArray | null;\n const reField = /\\$\\{(\\d+)(:[^}]+)?\\}/g;\n const inputValue = node.value[0];\n const outputValue: Value[] = [];\n\n while (m = reField.exec(snippet.value)) {\n if (offset !== m.index) {\n outputValue.push(literal(snippet.value.slice(offset, m.index)));\n }\n offset = m.index + m[0].length;\n if (inputValue && inputValue.value.length) {\n outputValue.push(inputValue.value.shift()!);\n } else {\n outputValue.push(field(Number(m[1]), m[2] ? m[2].slice(1) : ''));\n }\n }\n\n const tail = snippet.value.slice(offset);\n if (tail) {\n outputValue.push(literal(tail));\n }\n\n node.name = void 0;\n node.value = [cssValue(...outputValue)];\n return node;\n}\n\n/**\n * Finds best matching item from `items` array\n * @param abbr Abbreviation to match\n * @param items List of items for match\n * @param minScore The minimum score the best matched item should have to be a valid match.\n */\nexport function findBestMatch<T extends MatchInput>(abbr: string, items: T[], minScore = 0, partialMatch = false): T | null {\n let matchedItem: T | null = null;\n let maxScore = 0;\n\n for (const item of items) {\n const score = calculateScore(abbr, getScoringPart(item), partialMatch);\n\n if (score === 1) {\n // direct hit, no need to look further\n return item;\n }\n\n if (score && score >= maxScore) {\n maxScore = score;\n matchedItem = item;\n }\n }\n\n return maxScore >= minScore ? matchedItem : null;\n}\n\nfunction getScoringPart(item: MatchInput): string {\n return typeof item === 'string' ? item : item.key;\n}\n\n/**\n * Returns a part of `abbr` that wasn’t directly matched against `str`.\n * For example, if abbreviation `poas` is matched against `position`,\n * the unmatched part will be `as` since `a` wasn’t found in string stream\n */\nfunction getUnmatchedPart(abbr: string, str: string): string {\n for (let i = 0, lastPos = 0; i < abbr.length; i++) {\n lastPos = str.indexOf(abbr[i], lastPos);\n if (lastPos === -1) {\n return abbr.slice(i);\n }\n lastPos++;\n }\n\n return '';\n}\n\n/**\n * Resolves given keyword shorthand into matched snippet keyword or global keyword,\n * if possible\n */\nfunction resolveKeyword(kw: string, config: Config, snippet?: CSSSnippetProperty, minScore?: number): Literal | FunctionCall | null {\n let ref: string | null;\n\n if (snippet) {\n if (ref = findBestMatch(kw, Object.keys(snippet.keywords), minScore)) {\n return snippet.keywords[ref];\n }\n\n for (const dep of snippet.dependencies) {\n if (ref = findBestMatch(kw, Object.keys(dep.keywords), minScore)) {\n return dep.keywords[ref];\n }\n }\n }\n\n if (ref = findBestMatch(kw, config.options['stylesheet.keywords'], minScore)) {\n return literal(ref);\n }\n\n return null;\n}\n\n/**\n * Resolves numeric values in given abbreviation node\n */\nfunction resolveNumericValue(node: CSSProperty, config: Config) {\n const aliases = config.options['stylesheet.unitAliases'];\n const unitless = config.options['stylesheet.unitless'];\n\n for (const v of node.value) {\n for (const t of v.value) {\n if (t.type === 'NumberValue') {\n if (t.unit) {\n t.unit = aliases[t.unit] || t.unit;\n } else if (t.value !== 0 && !unitless.includes(node.name!)) {\n t.unit = t.rawValue.includes('.')\n ? config.options['stylesheet.floatUnit']\n : config.options['stylesheet.intUnit'];\n }\n }\n }\n }\n}\n\n/**\n * Constructs CSS value token\n */\nfunction cssValue(...args: Value[]): CSSValue {\n return {\n type: 'CSSValue',\n value: args\n };\n}\n\n/**\n * Constructs literal token\n */\nfunction literal(value: string): Literal {\n return { type: 'Literal', value };\n}\n\n/**\n * Constructs field token\n */\nfunction field(index: number, name: string): Field {\n return { type: 'Field', index, name };\n}\n\n/**\n * Check if given value contains fields\n */\nfunction hasField(value: CSSValue): boolean {\n for (const v of value.value) {\n if (v.type === 'Field' || (v.type === 'FunctionCall' && v.arguments.some(hasField))) {\n return true;\n }\n }\n\n return false;\n}\n\ninterface WrapState {\n index: number;\n}\n\n/**\n * Wraps tokens of given abbreviation with fields\n */\nfunction wrapWithField(node: CSSValue, config: Config, state: WrapState = { index: 1 }): CSSValue {\n let value: Value[] = [];\n for (const v of node.value) {\n switch (v.type) {\n case 'ColorValue':\n value.push(field(state.index++, color(v, config.options['stylesheet.shortHex'])));\n break;\n case 'Literal':\n value.push(field(state.index++, v.value));\n break;\n case 'NumberValue':\n value.push(field(state.index++, `${v.value}${v.unit}`));\n break;\n case 'StringValue':\n const q = v.quote === 'single' ? '\\'' : '\"';\n value.push(field(state.index++, q + v.value + q));\n break;\n case 'FunctionCall':\n value.push(field(state.index++, v.name), literal('('));\n for (let i = 0, il = v.arguments.length; i < il; i++) {\n value = value.concat(wrapWithField(v.arguments[i], config, state).value);\n if (i !== il - 1) {\n value.push(literal(', '));\n }\n }\n value.push(literal(')'));\n break;\n default:\n value.push(v);\n }\n }\n\n return {...node, value };\n}\n\n/**\n * Check if abbreviation should be expanded in CSS value context\n */\nfunction isValueScope(config: Config): boolean {\n if (config.context) {\n return config.context.name === CSSAbbreviationScope.Value || !config.context.name.startsWith('@@');\n }\n\n return false;\n}\n\n/**\n * Returns snippets for given scope\n */\nfunction getSnippetsForScope(snippets: CSSSnippet[], config: Config): CSSSnippet[] {\n if (config.context) {\n if (config.context.name === CSSAbbreviationScope.Section) {\n return snippets.filter(s => s.type === CSSSnippetType.Raw);\n }\n\n if (config.context.name === CSSAbbreviationScope.Property) {\n return snippets.filter(s => s.type === CSSSnippetType.Property);\n }\n }\n\n return snippets;\n}\n", "{\n\t\"a\": \"a[href]\",\n\t\"a:blank\": \"a[href='http://${0}' target='_blank' rel='noopener noreferrer']\",\n\t\"a:link\": \"a[href='http://${0}']\",\n\t\"a:mail\": \"a[href='mailto:${0}']\",\n\t\"a:tel\": \"a[href='tel:+${0}']\",\n\t\"abbr\": \"abbr[title]\",\n\t\"acr|acronym\": \"acronym[title]\",\n\t\"base\": \"base[href]/\",\n\t\"basefont\": \"basefont/\",\n\t\"br\": \"br/\",\n\t\"frame\": \"frame/\",\n\t\"hr\": \"hr/\",\n\t\"bdo\": \"bdo[dir]\",\n\t\"bdo:r\": \"bdo[dir=rtl]\",\n\t\"bdo:l\": \"bdo[dir=ltr]\",\n\t\"col\": \"col/\",\n\t\"link\": \"link[rel=stylesheet href]/\",\n\t\"link:css\": \"link[href='${1:style}.css']\",\n\t\"link:print\": \"link[href='${1:print}.css' media=print]\",\n\t\"link:favicon\": \"link[rel='shortcut icon' type=image/x-icon href='${1:favicon.ico}']\",\n\t\"link:mf|link:manifest\": \"link[rel='manifest' href='${1:manifest.json}']\",\n\t\"link:touch\": \"link[rel=apple-touch-icon href='${1:favicon.png}']\",\n\t\"link:rss\": \"link[rel=alternate type=application/rss+xml title=RSS href='${1:rss.xml}']\",\n\t\"link:atom\": \"link[rel=alternate type=application/atom+xml title=Atom href='${1:atom.xml}']\",\n\t\"link:im|link:import\": \"link[rel=import href='${1:component}.html']\",\n\t\"meta\": \"meta/\",\n\t\"meta:utf\": \"meta[http-equiv=Content-Type content='text/html;charset=UTF-8']\",\n\t\"meta:vp\": \"meta[name=viewport content='width=${1:device-width}, initial-scale=${2:1.0}']\",\n\t\"meta:compat\": \"meta[http-equiv=X-UA-Compatible content='${1:IE=7}']\",\n\t\"meta:edge\": \"meta:compat[content='${1:ie=edge}']\",\n\t\"meta:redirect\": \"meta[http-equiv=refresh content='0; url=${1:http://example.com}']\",\n\t\"meta:kw\": \"meta[name=keywords content]\",\n\t\"meta:desc\": \"meta[name=description content]\",\n\t\"style\": \"style\",\n\t\"script\": \"script\",\n\t\"script:src\": \"script[src]\",\n\t\"img\": \"img[src alt]/\",\n\t\"img:s|img:srcset\": \"img[srcset src alt]\",\n\t\"img:z|img:sizes\": \"img[sizes srcset src alt]\",\n\t\"picture\": \"picture\",\n\t\"src|source\": \"source/\",\n\t\"src:sc|source:src\": \"source[src type]\",\n\t\"src:s|source:srcset\": \"source[srcset]\",\n\t\"src:t|source:type\": \"source[srcset type='${1:image/}']\",\n\t\"src:z|source:sizes\": \"source[sizes srcset]\",\n\t\"src:m|source:media\": \"source[media='(${1:min-width: })' srcset]\",\n\t\"src:mt|source:media:type\": \"source:media[type='${2:image/}']\",\n\t\"src:mz|source:media:sizes\": \"source:media[sizes srcset]\",\n\t\"src:zt|source:sizes:type\": \"source[sizes srcset type='${1:image/}']\",\n\t\"iframe\": \"iframe[src frameborder=0]\",\n\t\"embed\": \"embed[src type]/\",\n\t\"object\": \"object[data type]\",\n\t\"param\": \"param[name value]/\",\n\t\"map\": \"map[name]\",\n\t\"area\": \"area[shape coords href alt]/\",\n\t\"area:d\": \"area[shape=default]\",\n\t\"area:c\": \"area[shape=circle]\",\n\t\"area:r\": \"area[shape=rect]\",\n\t\"area:p\": \"area[shape=poly]\",\n\t\"form\": \"form[action]\",\n\t\"form:get\": \"form[method=get]\",\n\t\"form:post\": \"form[method=post]\",\n\t\"label\": \"label[for]\",\n\t\"input\": \"input[type=${1:text}]/\",\n\t\"inp\": \"input[name=${1} id=${1}]\",\n\t\"input:h|input:hidden\": \"input[type=hidden name]\",\n\t\"input:t|input:text\": \"inp[type=text]\",\n\t\"input:search\": \"inp[type=search]\",\n\t\"input:email\": \"inp[type=email]\",\n\t\"input:url\": \"inp[type=url]\",\n\t\"input:p|input:password\": \"inp[type=password]\",\n\t\"input:datetime\": \"inp[type=datetime]\",\n\t\"input:date\": \"inp[type=date]\",\n\t\"input:datetime-local\": \"inp[type=datetime-local]\",\n\t\"input:month\": \"inp[type=month]\",\n\t\"input:week\": \"inp[type=week]\",\n\t\"input:time\": \"inp[type=time]\",\n\t\"input:tel\": \"inp[type=tel]\",\n\t\"input:number\": \"inp[type=number]\",\n\t\"input:color\": \"inp[type=color]\",\n\t\"input:c|input:checkbox\": \"inp[type=checkbox]\",\n\t\"input:r|input:radio\": \"inp[type=radio]\",\n\t\"input:range\": \"inp[type=range]\",\n\t\"input:f|input:file\": \"inp[type=file]\",\n\t\"input:s|input:submit\": \"input[type=submit value]\",\n\t\"input:i|input:image\": \"input[type=image src alt]\",\n\t\"input:b|input:btn|input:button\": \"input[type=button value]\",\n\t\"input:reset\": \"input:button[type=reset]\",\n\t\"isindex\": \"isindex/\",\n\t\"select\": \"select[name=${1} id=${1}]\",\n\t\"select:d|select:disabled\": \"select[disabled.]\",\n\t\"opt|option\": \"option[value]\",\n\t\"textarea\": \"textarea[name=${1} id=${1} cols=${2:30} rows=${3:10}]\",\n\t\"marquee\": \"marquee[behavior direction]\",\n\t\"menu:c|menu:context\": \"menu[type=context]\",\n\t\"menu:t|menu:toolbar\": \"menu[type=toolbar]\",\n\t\"video\": \"video[src]\",\n\t\"audio\": \"audio[src]\",\n\t\"html:xml\": \"html[xmlns=http://www.w3.org/1999/xhtml]\",\n\t\"keygen\": \"keygen/\",\n\t\"command\": \"command/\",\n\t\"btn:s|button:s|button:submit\" : \"button[type=submit]\",\n\t\"btn:r|button:r|button:reset\" : \"button[type=reset]\",\n\t\"btn:d|button:d|button:disabled\" : \"button[disabled.]\",\n\t\"fst:d|fset:d|fieldset:d|fieldset:disabled\" : \"fieldset[disabled.]\",\n\n\t\"bq\": \"blockquote\",\n\t\"fig\": \"figure\",\n\t\"figc\": \"figcaption\",\n\t\"pic\": \"picture\",\n\t\"ifr\": \"iframe\",\n\t\"emb\": \"embed\",\n\t\"obj\": \"object\",\n\t\"cap\": \"caption\",\n\t\"colg\": \"colgroup\",\n\t\"fst\": \"fieldset\",\n\t\"btn\": \"button\",\n\t\"optg\": \"optgroup\",\n\t\"tarea\": \"textarea\",\n\t\"leg\": \"legend\",\n\t\"sect\": \"section\",\n\t\"art\": \"article\",\n\t\"hdr\": \"header\",\n\t\"ftr\": \"footer\",\n\t\"adr\": \"address\",\n\t\"dlg\": \"dialog\",\n\t\"str\": \"strong\",\n\t\"prog\": \"progress\",\n\t\"mn\": \"main\",\n\t\"tem\": \"template\",\n\t\"fset\": \"fieldset\",\n\t\"datag\": \"datagrid\",\n\t\"datal\": \"datalist\",\n\t\"kg\": \"keygen\",\n\t\"out\": \"output\",\n\t\"det\": \"details\",\n\t\"sum\": \"summary\",\n\t\"cmd\": \"command\",\n\n\t\"ri:d|ri:dpr\": \"img:s\",\n\t\"ri:v|ri:viewport\": \"img:z\",\n\t\"ri:a|ri:art\": \"pic>src:m+img\",\n\t\"ri:t|ri:type\": \"pic>src:t+img\",\n\n\t\"!!!\": \"{<!DOCTYPE html>}\",\n\t\"doc\": \"html[lang=${lang}]>(head>meta[charset=${charset}]+meta[http-equiv='X-UA-Compatible'][content='IE=edge']+meta:vp+title{${1:Document}})+body\",\n\t\"!|html:5\": \"!!!+doc\",\n\n\t\"c\": \"{<!-- ${0} -->}\",\n\t\"cc:ie\": \"{<!--[if IE]>${0}<![endif]-->}\",\n\t\"cc:noie\": \"{<!--[if !IE]><!-->${0}<!--<![endif]-->}\"\n}\n", "{\n\t\"@f\": \"@font-face {\\n\\tfont-family: ${1};\\n\\tsrc: url(${2});\\n}\",\n\t\"@ff\": \"@font-face {\\n\\tfont-family: '${1:FontName}';\\n\\tsrc: url('${2:FileName}.eot');\\n\\tsrc: url('${2:FileName}.eot?#iefix') format('embedded-opentype'),\\n\\t\\t url('${2:FileName}.woff') format('woff'),\\n\\t\\t url('${2:FileName}.ttf') format('truetype'),\\n\\t\\t url('${2:FileName}.svg#${1:FontName}') format('svg');\\n\\tfont-style: ${3:normal};\\n\\tfont-weight: ${4:normal};\\n}\",\n\t\"@i|@import\": \"@import url(${0});\",\n\t\"@kf\": \"@keyframes ${1:identifier} {\\n\\t${2}\\n}\",\n\t\"@m|@media\": \"@media ${1:screen} {\\n\\t${0}\\n}\",\n\t\"ac\": \"align-content:start|end|flex-start|flex-end|center|space-between|space-around|stretch|space-evenly\",\n\t\"ai\": \"align-items:start|end|flex-start|flex-end|center|baseline|stretch\",\n\t\"anim\": \"animation:${1:name} ${2:duration} ${3:timing-function} ${4:delay} ${5:iteration-count} ${6:direction} ${7:fill-mode}\",\n\t\"animdel\": \"animation-delay:time\",\n\t\"animdir\": \"animation-direction:normal|reverse|alternate|alternate-reverse\",\n\t\"animdur\": \"animation-duration:${1:0}s\",\n\t\"animfm\": \"animation-fill-mode:both|forwards|backwards\",\n\t\"animic\": \"animation-iteration-count:1|infinite\",\n\t\"animn\": \"animation-name\",\n\t\"animps\": \"animation-play-state:running|paused\",\n\t\"animtf\": \"animation-timing-function:linear|ease|ease-in|ease-out|ease-in-out|cubic-bezier(${1:0.1}, ${2:0.7}, ${3:1.0}, ${3:0.1})\",\n\t\"ap\": \"appearance:none\",\n\t\"as\": \"align-self:start|end|auto|flex-start|flex-end|center|baseline|stretch\",\n\t\"b\": \"bottom\",\n\t\"bd\": \"border:${1:1px} ${2:solid} ${3:#000}\",\n\t\"bdb\": \"border-bottom:${1:1px} ${2:solid} ${3:#000}\",\n\t\"bdbc\": \"border-bottom-color:${1:#000}\",\n\t\"bdbi\": \"border-bottom-image:url(${0})\",\n\t\"bdbk\": \"border-break:close\",\n\t\"bdbli\": \"border-bottom-left-image:url(${0})|continue\",\n\t\"bdblrs\": \"border-bottom-left-radius\",\n\t\"bdbri\": \"border-bottom-right-image:url(${0})|continue\",\n\t\"bdbrrs\": \"border-bottom-right-radius\",\n\t\"bdbs\": \"border-bottom-style\",\n\t\"bdbw\": \"border-bottom-width\",\n\t\"bdc\": \"border-color:${1:#000}\",\n\t\"bdci\": \"border-corner-image:url(${0})|continue\",\n\t\"bdcl\": \"border-collapse:collapse|separate\",\n\t\"bdf\": \"border-fit:repeat|clip|scale|stretch|overwrite|overflow|space\",\n\t\"bdi\": \"border-image:url(${0})\",\n\t\"bdl\": \"border-left:${1:1px} ${2:solid} ${3:#000}\",\n\t\"bdlc\": \"border-left-color:${1:#000}\",\n\t\"bdlen\": \"border-length\",\n\t\"bdli\": \"border-left-image:url(${0})\",\n\t\"bdls\": \"border-left-style\",\n\t\"bdlw\": \"border-left-width\",\n\t\"bdr\": \"border-right:${1:1px} ${2:solid} ${3:#000}\",\n\t\"bdrc\": \"border-right-color:${1:#000}\",\n\t\"bdri\": \"border-right-image:url(${0})\",\n\t\"bdrs\": \"border-radius\",\n\t\"bdrst\": \"border-right-style\",\n\t\"bdrw\": \"border-right-width\",\n\t\"bds\": \"border-style:none|hidden|dotted|dashed|solid|double|dot-dash|dot-dot-dash|wave|groove|ridge|inset|outset\",\n\t\"bdsp\": \"border-spacing\",\n\t\"bdt\": \"border-top:${1:1px} ${2:solid} ${3:#000}\",\n\t\"bdtc\": \"border-top-color:${1:#000}\",\n\t\"bdti\": \"border-top-image:url(${0})\",\n\t\"bdtli\": \"border-top-left-image:url(${0})|continue\",\n\t\"bdtlrs\": \"border-top-left-radius\",\n\t\"bdtri\": \"border-top-right-image:url(${0})|continue\",\n\t\"bdtrrs\": \"border-top-right-radius\",\n\t\"bdts\": \"border-top-style\",\n\t\"bdtw\": \"border-top-width\",\n\t\"bdw\": \"border-width\",\n\t\"bfv\": \"backface-visibility:hidden|visible\",\n\t\"bg\": \"background:${1:#000}\",\n\t\"bga\": \"background-attachment:fixed|scroll\",\n\t\"bgbk\": \"background-break:bounding-box|each-box|continuous\",\n\t\"bgc\": \"background-color:#${1:fff}\",\n\t\"bgcp\": \"background-clip:padding-box|border-box|content-box|no-clip\",\n\t\"bgi\": \"background-image:url(${0})\",\n\t\"bgo\": \"background-origin:padding-box|border-box|content-box\",\n\t\"bgp\": \"background-position:${1:0} ${2:0}\",\n\t\"bgpx\": \"background-position-x\",\n\t\"bgpy\": \"background-position-y\",\n\t\"bgr\": \"background-repeat:no-repeat|repeat-x|repeat-y|space|round\",\n\t\"bgsz\": \"background-size:contain|cover\",\n\t\"bxsh\": \"box-shadow:${1:inset }${2:hoff} ${3:voff} ${4:blur} ${5:#000}|none\",\n\t\"bxsz\": \"box-sizing:border-box|content-box|border-box\",\n\t\"c\": \"color:${1:#000}\",\n\t\"cr\": \"color:rgb(${1:0}, ${2:0}, ${3:0})\",\n\t\"cra\": \"color:rgba(${1:0}, ${2:0}, ${3:0}, ${4:.5})\",\n\t\"cl\": \"clear:both|left|right|none\",\n\t\"cm\": \"/* ${0} */\",\n\t\"cnt\": \"content:'${0}'|normal|open-quote|no-open-quote|close-quote|no-close-quote|attr(${0})|counter(${0})|counters(${0})\",\n\t\"coi\": \"counter-increment\",\n\t\"colm\": \"columns\",\n\t\"colmc\": \"column-count\",\n\t\"colmf\": \"column-fill\",\n\t\"colmg\": \"column-gap\",\n\t\"colmr\": \"column-rule\",\n\t\"colmrc\": \"column-rule-color\",\n\t\"colmrs\": \"column-rule-style\",\n\t\"colmrw\": \"column-rule-width\",\n\t\"colms\": \"column-span\",\n\t\"colmw\": \"column-width\",\n\t\"cor\": \"counter-reset\",\n\t\"cp\": \"clip:auto|rect(${1:top} ${2:right} ${3:bottom} ${4:left})\",\n\t\"cps\": \"caption-side:top|bottom\",\n\t\"cur\": \"cursor:pointer|auto|default|crosshair|hand|help|move|pointer|text\",\n\t\"d\": \"display:block|none|flex|inline-flex|inline|inline-block|grid|inline-grid|subgrid|list-item|run-in|compact|table|inline-table|table-caption|table-column|table-column-group|table-header-group|table-footer-group|table-row|table-row-group|table-cell|ruby|ruby-base|ruby-base-group|ruby-text|ruby-text-group\",\n\t\"ec\": \"empty-cells:show|hide\",\n\t\"f\": \"font:${1:1em} ${2:sans-serif}\",\n\t\"fd\": \"font-display:auto|block|swap|fallback|optional\",\n\t\"fef\": \"font-effect:none|engrave|emboss|outline\",\n\t\"fem\": \"font-emphasize\",\n\t\"femp\": \"font-emphasize-position:before|after\",\n\t\"fems\": \"font-emphasize-style:none|accent|dot|circle|disc\",\n\t\"ff\": \"font-family:serif|sans-serif|cursive|fantasy|monospace\",\n\t\"fft\": \"font-family:\\\"Times New Roman\\\", Times, Baskerville, Georgia, serif\",\n\t\"ffa\": \"font-family:Arial, \\\"Helvetica Neue\\\", Helvetica, sans-serif\",\n\t\"ffv\": \"font-family:Verdana, Geneva, sans-serif\",\n\t\"fl\": \"float:left|right|none\",\n\t\"fs\": \"font-style:italic|normal|oblique\",\n\t\"fsm\": \"font-smoothing:antialiased|subpixel-antialiased|none\",\n\t\"fst\": \"font-stretch:normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded\",\n\t\"fv\": \"font-variant:normal|small-caps\",\n\t\"fvs\": \"font-variation-settings:normal|inherit|initial|unset\",\n\t\"fw\": \"font-weight:normal|bold|bolder|lighter\",\n\t\"fx\": \"flex\",\n\t\"fxb\": \"flex-basis:fill|max-content|min-content|fit-content|content\",\n\t\"fxd\": \"flex-direction:row|row-reverse|column|column-reverse\",\n\t\"fxf\": \"flex-flow\",\n\t\"fxg\": \"flex-grow\",\n\t\"fxsh\": \"flex-shrink\",\n\t\"fxw\": \"flex-wrap:nowrap|wrap|wrap-reverse\",\n\t\"fsz\": \"font-size\",\n\t\"fsza\": \"font-size-adjust\",\n\t\"gtc\": \"grid-template-columns:repeat()|minmax()\",\n\t\"gtr\": \"grid-template-rows:repeat()|minmax()\",\n\t\"gta\": \"grid-template-areas\",\n\t\"gt\": \"grid-template\",\n\t\"gg\": \"grid-gap\",\n\t\"gcg\": \"grid-column-gap\",\n\t\"grg\": \"grid-row-gap\",\n\t\"gac\": \"grid-auto-columns:auto|minmax()\",\n\t\"gar\": \"grid-auto-rows:auto|minmax()\",\n\t\"gaf\": \"grid-auto-flow:row|column|dense|inherit|initial|unset\",\n\t\"gd\": \"grid\",\n\t\"gc\": \"grid-column\",\n\t\"gcs\": \"grid-column-start\",\n\t\"gce\": \"grid-column-end\",\n\t\"gr\": \"grid-row\",\n\t\"grs\": \"grid-row-start\",\n\t\"gre\": \"grid-row-end\",\n\t\"ga\": \"grid-area\",\n\t\"h\": \"height\",\n\t\"jc\": \"justify-content:start|end|stretch|flex-start|flex-end|center|space-between|space-around|space-evenly\",\n\t\"ji\": \"justify-items:start|end|center|stretch\",\n\t\"js\": \"justify-self:start|end|center|stretch\",\n\t\"l\": \"left\",\n\t\"lg\": \"background-image:linear-gradient(${1})\",\n\t\"lh\": \"line-height\",\n\t\"lis\": \"list-style\",\n\t\"lisi\": \"list-style-image\",\n\t\"lisp\": \"list-style-position:inside|outside\",\n\t\"list\": \"list-style-type:disc|circle|square|decimal|decimal-leading-zero|lower-roman|upper-roman\",\n\t\"lts\": \"letter-spacing:normal\",\n\t\"m\": \"margin\",\n\t\"mah\": \"max-height\",\n\t\"mar\": \"max-resolution\",\n\t\"maw\": \"max-width\",\n\t\"mb\": \"margin-bottom\",\n\t\"mih\": \"min-height\",\n\t\"mir\": \"min-resolution\",\n\t\"miw\": \"min-width\",\n\t\"ml\": \"margin-left\",\n\t\"mr\": \"margin-right\",\n\t\"mt\": \"margin-top\",\n\t\"ol\": \"outline\",\n\t\"olc\": \"outline-color:${1:#000}|invert\",\n\t\"olo\": \"outline-offset\",\n\t\"ols\": \"outline-style:none|dotted|dashed|solid|double|groove|ridge|inset|outset\",\n\t\"olw\": \"outline-width|thin|medium|thick\",\n\t\"op|opa\": \"opacity\",\n\t\"ord\": \"order\",\n\t\"ori\": \"orientation:landscape|portrait\",\n\t\"orp\": \"orphans\",\n\t\"ov\": \"overflow:hidden|visible|hidden|scroll|auto\",\n\t\"ovs\": \"overflow-style:scrollbar|auto|scrollbar|panner|move|marquee\",\n\t\"ovx\": \"overflow-x:hidden|visible|hidden|scroll|auto\",\n\t\"ovy\": \"overflow-y:hidden|visible|hidden|scroll|auto\",\n\t\"p\": \"padding\",\n\t\"pb\": \"padding-bottom\",\n\t\"pgba\": \"page-break-after:auto|always|left|right\",\n\t\"pgbb\": \"page-break-before:auto|always|left|right\",\n\t\"pgbi\": \"page-break-inside:auto|avoid\",\n\t\"pl\": \"padding-left\",\n\t\"pos\": \"position:relative|absolute|relative|fixed|static\",\n\t\"pr\": \"padding-right\",\n\t\"pt\": \"padding-top\",\n\t\"q\": \"quotes\",\n\t\"qen\": \"quotes:'\\\\201C' '\\\\201D' '\\\\2018' '\\\\2019'\",\n\t\"qru\": \"quotes:'\\\\00AB' '\\\\00BB' '\\\\201E' '\\\\201C'\",\n\t\"r\": \"right\",\n\t\"rsz\": \"resize:none|both|horizontal|vertical\",\n\t\"t\": \"top\",\n\t\"ta\": \"text-align:left|center|right|justify\",\n\t\"tal\": \"text-align-last:left|center|right\",\n\t\"tbl\": \"table-layout:fixed\",\n\t\"td\": \"text-decoration:none|underline|overline|line-through\",\n\t\"te\": \"text-emphasis:none|accent|dot|circle|disc|before|after\",\n\t\"th\": \"text-height:auto|font-size|text-size|max-size\",\n\t\"ti\": \"text-indent\",\n\t\"tj\": \"text-justify:auto|inter-word|inter-ideograph|inter-cluster|distribute|kashida|tibetan\",\n\t\"to\": \"text-outline:${1:0} ${2:0} ${3:#000}\",\n\t\"tov\": \"text-overflow:ellipsis|clip\",\n\t\"tr\": \"text-replace\",\n\t\"trf\": \"transform:${1}|skewX(${1:angle})|skewY(${1:angle})|scale(${1:x}, ${2:y})|scaleX(${1:x})|scaleY(${1:y})|scaleZ(${1:z})|scale3d(${1:x}, ${2:y}, ${3:z})|rotate(${1:angle})|rotateX(${1:angle})|rotateY(${1:angle})|rotateZ(${1:angle})|translate(${1:x}, ${2:y})|translateX(${1:x})|translateY(${1:y})|translateZ(${1:z})|translate3d(${1:tx}, ${2:ty}, ${3:tz})\",\n\t\"trfo\": \"transform-origin\",\n\t\"trfs\": \"transform-style:preserve-3d\",\n\t\"trs\": \"transition:${1:prop} ${2:time}\",\n\t\"trsde\": \"transition-delay:${1:time}\",\n\t\"trsdu\": \"transition-duration:${1:time}\",\n\t\"trsp\": \"transition-property:${1:prop}\",\n\t\"trstf\": \"transition-timing-function:${1:fn}\",\n\t\"tsh\": \"text-shadow:${1:hoff} ${2:voff} ${3:blur} ${4:#000}\",\n\t\"tt\": \"text-transform:uppercase|lowercase|capitalize|none\",\n\t\"tw\": \"text-wrap:none|normal|unrestricted|suppress\",\n\t\"us\": \"user-select:none\",\n\t\"v\": \"visibility:hidden|visible|collapse\",\n\t\"va\": \"vertical-align:top|super|text-top|middle|baseline|bottom|text-bottom|sub\",\n\t\"w\": \"width\",\n\t\"whs\": \"white-space:nowrap|pre|pre-wrap|pre-line|normal\",\n\t\"whsc\": \"white-space-collapse:normal|keep-all|loose|break-strict|break-all\",\n\t\"wid\": \"widows\",\n\t\"wm\": \"writing-mode:lr-tb|lr-tb|lr-bt|rl-tb|rl-bt|tb-rl|tb-lr|bt-lr|bt-rl\",\n\t\"wob\": \"word-break:normal|keep-all|break-all\",\n\t\"wos\": \"word-spacing\",\n\t\"wow\": \"word-wrap:none|unrestricted|suppress|break-word|normal\",\n\t\"z\": \"z-index\",\n\t\"zom\": \"zoom:1\"\n}\n", "{\n \"tm|tmatch\": \"xsl:template[match mode]\",\n \"tn|tname\": \"xsl:template[name]\",\n \"call\": \"xsl:call-template[name]\",\n \"ap\": \"xsl:apply-templates[select mode]\",\n \"api\": \"xsl:apply-imports\",\n \"imp\": \"xsl:import[href]\",\n \"inc\": \"xsl:include[href]\",\n \"ch\": \"xsl:choose\",\n \"wh|xsl:when\": \"xsl:when[test]\",\n \"ot\": \"xsl:otherwise\",\n \"if\": \"xsl:if[test]\",\n \"par\": \"xsl:param[name]\",\n \"pare\": \"xsl:param[name select]\",\n \"var\": \"xsl:variable[name]\",\n \"vare\": \"xsl:variable[name select]\",\n \"wp\": \"xsl:with-param[name select]\",\n \"key\": \"xsl:key[name match use]\",\n \"elem\": \"xsl:element[name]\",\n \"attr\": \"xsl:attribute[name]\",\n \"attrs\": \"xsl:attribute-set[name]\",\n \"cp\": \"xsl:copy[select]\",\n \"co\": \"xsl:copy-of[select]\",\n \"val\": \"xsl:value-of[select]\",\n \"for|each\": \"xsl:for-each[select]\",\n \"tex\": \"xsl:text\",\n \"com\": \"xsl:comment\",\n \"msg\": \"xsl:message[terminate=no]\",\n \"fall\": \"xsl:fallback\",\n \"num\": \"xsl:number[value]\",\n \"nam\": \"namespace-alias[stylesheet-prefix result-prefix]\",\n \"pres\": \"xsl:preserve-space[elements]\",\n \"strip\": \"xsl:strip-space[elements]\",\n \"proc\": \"xsl:processing-instruction[name]\",\n \"sort\": \"xsl:sort[select order]\",\n \"choose\": \"xsl:choose>xsl:when+xsl:otherwise\",\n \"xsl\": \"!!!+xsl:stylesheet[version=1.0 xmlns:xsl=http://www.w3.org/1999/XSL/Transform]>{\\n|}\",\n \"!!!\": \"{<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>}\"\n}", "{\n\t\"!!!\": \"{doctype html}\"\n}\n", "{\n\t\"lang\": \"en\",\n\t\"locale\": \"en-US\",\n\t\"charset\": \"UTF-8\",\n\t\"indentation\": \"\\t\",\n\t\"newline\": \"\\n\"\n}\n", "import { Abbreviation } from '@emmetio/abbreviation';\nimport markupSnippets from '../snippets/html.json';\nimport stylesheetSnippets from '../snippets/css.json';\nimport xslSnippets from '../snippets/xsl.json';\nimport pugSnippets from '../snippets/pug.json';\nimport variables from '../snippets/variables.json';\nimport { CSSSnippet } from './stylesheet/snippets';\n\nexport type SyntaxType = 'markup' | 'stylesheet';\nexport type FieldOutput = (index: number, placeholder: string, offset: number, line: number, column: number) => string;\nexport type TextOutput = (text: string, offset: number, line: number, column: number) => string;\nexport type StringCase = '' | 'lower' | 'upper';\nexport interface SnippetsMap {\n [name: string]: string;\n}\n\nexport interface AbbreviationContext {\n name: string;\n attributes?: { [name: string]: string | null };\n}\n\n/**\n * Raw config which contains per-syntax options. `markup` and `syntax` keys are\n * reserved for global settings for all markup and stylesheet syntaxes\n */\nexport interface GlobalConfig {\n [syntax: string]: Partial<BaseConfig>;\n}\n\nexport interface BaseConfig {\n /* Type of abbreviation context, default is `markup` */\n type: SyntaxType;\n\n /** Options for abbreviation output */\n options: Partial<Options>;\n\n /** Substitutions for variable names */\n variables: SnippetsMap;\n\n /** Abbreviation name to snippets mapping */\n snippets: SnippetsMap;\n}\n\ninterface ResolvedConfig extends BaseConfig {\n /** Host syntax */\n syntax: string;\n\n /**\n * Context of abbreviation. For markup abbreviation, it contains parent tag\n * name with attributes, for stylesheet abbreviation it contains property name\n * if abbreviation is expanded as value\n */\n context?: AbbreviationContext;\n\n /** Text to wrap with abbreviation */\n text?: string | string[];\n\n /** Max amount of repeated elements (fool proof) */\n maxRepeat?: number;\n\n /**\n * Object for storing internal cache data to be shared across Emmet methods\n * invocation. If provided, Emmet will store compute-intensive data in this\n * object and will re-use it during editor session.\n * Every time user settings are changed, you should empty cache by passing\n * new object.\n */\n cache?: Cache;\n}\n\nexport type Config = ResolvedConfig & { options: Options };\nexport type UserConfig = Partial<ResolvedConfig>;\n\nexport interface Cache {\n stylesheetSnippets?: CSSSnippet[];\n markupSnippets?: { [name: string]: Abbreviation | null };\n}\n\nexport interface Options {\n /////////////////////\n // Generic options //\n /////////////////////\n\n /** A list of inline-level elements */\n inlineElements: string[];\n\n ////////////////////\n // Output options //\n ////////////////////\n\n /** A string for one level indent */\n 'output.indent': string;\n\n /**\n * A string for base indent, e.g. context indentation which will be added\n * for every generated line\n */\n 'output.baseIndent': string;\n\n /** A string to use as a new line */\n 'output.newline': string;\n\n /** Tag case: lower, upper or '' (keep as-is) */\n 'output.tagCase': StringCase;\n\n /** Attribute name case: lower, upper or '' (keep as-is) */\n 'output.attributeCase': StringCase;\n\n /** Attribute value quotes: 'single' or 'double' */\n 'output.attributeQuotes': 'single' | 'double';\n\n /** Enable output formatting (indentation and line breaks) */\n 'output.format': boolean;\n\n /** When enabled, automatically adds inner line breaks for leaf (e.g. without children) nodes */\n 'output.formatLeafNode': boolean;\n\n /** A list of tag names that should not get inner indentation */\n 'output.formatSkip': string[];\n\n /** A list of tag names that should *always* get inner indentation. */\n 'output.formatForce': string[];\n\n /**\n * How many inline sibling elements should force line break for each tag.\n * Set to `0` to output all inline elements without formatting.\n * Set to `1` to output all inline elements with formatting (same as block-level).\n */\n 'output.inlineBreak': number;\n\n /**\n * Produce compact notation of boolean attributes: attributes which doesn’t have value.\n * With this option enabled, outputs `<div contenteditable>` instead of\n * `<div contenteditable=\"contenteditable\">`\n */\n 'output.compactBoolean': boolean;\n\n /** A list of boolean attributes */\n 'output.booleanAttributes': string[];\n\n /** Reverses attribute merging directions when resolving snippets */\n 'output.reverseAttributes': boolean;\n\n /** Style of self-closing tags: html (`<br>`), xml (`<br/>`) or xhtml (`<br />`) */\n 'output.selfClosingStyle': 'html' | 'xml' | 'xhtml';\n\n /**\n * A function that takes field index and optional placeholder and returns\n * a string field (tabstop) for host editor. For example, a TextMate-style\n * field is `$index` or `${index:placeholder}`\n * @param index Field index\n * @param placeholder Field placeholder (default value), if any\n * @param offset Current character offset from the beginning of generated content\n * @param line Current line of generated output\n * @param column Current column in line\n */\n 'output.field': FieldOutput;\n\n /**\n * A function for processing text chunk passed to `OutputStream`.\n * May be used by editor for escaping characters, if necessary\n */\n 'output.text': TextOutput;\n\n ////////////////////\n // Markup options //\n ////////////////////\n\n /**\n * Automatically update value of <a> element's href attribute\n * if inserting URL or email\n */\n 'markup.href': boolean;\n\n ////////////////////////////////\n // Element commenting options //\n ////////////////////////////////\n\n /**\n * Enable/disable element commenting: generate comments before open and/or\n * after close tag\n */\n 'comment.enabled': boolean;\n\n /**\n * Attributes that should trigger node commenting on specific node,\n * if commenting is enabled\n */\n 'comment.trigger': string[];\n\n /**\n * Template string for comment to be placed *before* opening tag\n */\n 'comment.before': string;\n\n /**\n * Template string for comment to be placed *after* closing tag.\n * Example: `\\n<!-- /[#ID][.CLASS] -->`\n */\n 'comment.after': string;\n\n /////////////////\n // BEM options //\n /////////////////\n\n /** Enable/disable BEM addon */\n 'bem.enabled': boolean;\n\n /** A string for separating elements in output class */\n 'bem.element': string;\n\n /** A string for separating modifiers in output class */\n 'bem.modifier': string;\n\n /////////////////\n // JSX options //\n /////////////////\n\n /** Enable/disable JSX addon */\n 'jsx.enabled': boolean;\n\n ////////////////////////\n // Stylesheet options //\n ////////////////////////\n\n /** List of globally available keywords for properties */\n 'stylesheet.keywords': string[];\n\n /**\n * List of unitless properties, e.g. properties where numeric values without\n * explicit unit will be outputted as is, without default value\n */\n 'stylesheet.unitless': string[];\n\n /** Use short hex notation where possible, e.g. `#000` instead of `#000000` */\n 'stylesheet.shortHex': boolean;\n\n /** A string between property name and value */\n 'stylesheet.between': string;\n\n /** A string after property value */\n 'stylesheet.after': string;\n\n /** A unit suffix to output by default after integer values, 'px' by default */\n 'stylesheet.intUnit': string;\n\n /** A unit suffix to output by default after float values, 'em' by default */\n 'stylesheet.floatUnit': string;\n\n /**\n * Aliases for custom units in abbreviation. For example, `r: 'rem'` will\n * output `10rem` for abbreviation `10r`\n */\n 'stylesheet.unitAliases': SnippetsMap;\n\n /** Output abbreviation as JSON object properties (for CSS-in-JS syntaxes) */\n 'stylesheet.json': boolean;\n\n /** Use double quotes for JSON values */\n 'stylesheet.jsonDoubleQuotes': boolean;\n\n /**\n * A float number between 0 and 1 to pick fuzzy-matched abbreviations.\n * Lower value will pick more abbreviations (and less accurate)\n */\n 'stylesheet.fuzzySearchMinScore': number;\n}\n\n/**\n * Default syntaxes for abbreviation types\n */\nexport const defaultSyntaxes: { [name in SyntaxType]: string } = {\n markup: 'html',\n stylesheet: 'css'\n};\n\n/**\n * List of all known syntaxes\n */\nexport const syntaxes = {\n markup: ['html', 'xml', 'xsl', 'jsx', 'js', 'pug', 'slim', 'haml'],\n stylesheet: ['css', 'sass', 'scss', 'less', 'sss', 'stylus']\n};\n\nexport const defaultOptions: Options = {\n 'inlineElements': [\n 'a', 'abbr', 'acronym', 'applet', 'b', 'basefont', 'bdo',\n 'big', 'br', 'button', 'cite', 'code', 'del', 'dfn', 'em', 'font', 'i',\n 'iframe', 'img', 'input', 'ins', 'kbd', 'label', 'map', 'object', 'q',\n 's', 'samp', 'select', 'small', 'span', 'strike', 'strong', 'sub', 'sup',\n 'textarea', 'tt', 'u', 'var'\n ],\n 'output.indent': '\\t',\n 'output.baseIndent': '',\n 'output.newline': '\\n',\n 'output.tagCase': '',\n 'output.attributeCase': '',\n 'output.attributeQuotes': 'double',\n 'output.format': true,\n 'output.formatLeafNode': false,\n 'output.formatSkip': ['html'],\n 'output.formatForce': ['body'],\n 'output.inlineBreak': 3,\n 'output.compactBoolean': false,\n 'output.booleanAttributes': [\n 'contenteditable', 'seamless', 'async', 'autofocus',\n 'autoplay', 'checked', 'controls', 'defer', 'disabled', 'formnovalidate',\n 'hidden', 'ismap', 'loop', 'multiple', 'muted', 'novalidate', 'readonly',\n 'required', 'reversed', 'selected', 'typemustmatch'\n ],\n 'output.reverseAttributes': false,\n 'output.selfClosingStyle': 'html',\n 'output.field': (index, placeholder) => placeholder,\n 'output.text': text => text,\n\n 'markup.href': true,\n\n 'comment.enabled': false,\n 'comment.trigger': ['id', 'class'],\n 'comment.before': '',\n 'comment.after': '\\n<!-- /[#ID][.CLASS] -->',\n\n 'bem.enabled': false,\n 'bem.element': '__',\n 'bem.modifier': '_',\n\n 'jsx.enabled': false,\n\n 'stylesheet.keywords': ['auto', 'inherit', 'unset', 'none'],\n 'stylesheet.unitless': ['z-index', 'line-height', 'opacity', 'font-weight', 'zoom', 'flex', 'flex-grow', 'flex-shrink'],\n 'stylesheet.shortHex': true,\n 'stylesheet.between': ': ',\n 'stylesheet.after': ';',\n 'stylesheet.intUnit': 'px',\n 'stylesheet.floatUnit': 'em',\n 'stylesheet.unitAliases': { e: 'em', p: '%', x: 'ex', r: 'rem' },\n 'stylesheet.json': false,\n 'stylesheet.jsonDoubleQuotes': false,\n 'stylesheet.fuzzySearchMinScore': 0\n};\n\nexport const defaultConfig: Config = {\n type: 'markup',\n syntax: 'html',\n variables,\n snippets: {},\n options: defaultOptions\n};\n\n/**\n * Default per-syntax config\n */\nexport const syntaxConfig: GlobalConfig = {\n markup: {\n snippets: parseSnippets(markupSnippets),\n },\n xhtml: {\n options: {\n 'output.selfClosingStyle': 'xhtml'\n }\n },\n xml: {\n options: {\n 'output.selfClosingStyle': 'xml'\n }\n },\n xsl: {\n snippets: parseSnippets(xslSnippets),\n options: {\n 'output.selfClosingStyle': 'xml'\n }\n },\n jsx: {\n options: {\n 'jsx.enabled': true\n }\n },\n pug: {\n snippets: parseSnippets(pugSnippets)\n },\n\n stylesheet: {\n snippets: parseSnippets(stylesheetSnippets)\n },\n\n sass: {\n options: {\n 'stylesheet.after': ''\n }\n },\n stylus: {\n options: {\n 'stylesheet.between': ' ',\n 'stylesheet.after': '',\n }\n }\n};\n\n/**\n * Parses raw snippets definitions with possibly multiple keys into a plan\n * snippet map\n */\nexport function parseSnippets(snippets: SnippetsMap): SnippetsMap {\n const result: SnippetsMap = {};\n Object.keys(snippets).forEach(k => {\n for (const name of k.split('|')) {\n result[name] = snippets[k];\n }\n });\n\n return result;\n}\n\nexport default function resolveConfig(config: UserConfig = {}, globals: GlobalConfig = {}): Config {\n const type: SyntaxType = config.type || 'markup';\n const syntax: string = config.syntax || defaultSyntaxes[type];\n\n return {\n ...defaultConfig,\n ...config,\n type,\n syntax,\n variables: mergedData(type, syntax, 'variables', config, globals),\n snippets: mergedData(type, syntax, 'snippets', config, globals),\n options: mergedData(type, syntax, 'options', config, globals)\n };\n}\n\nfunction mergedData<K extends keyof BaseConfig>(type: SyntaxType, syntax: string, key: K, config: UserConfig, globals: GlobalConfig = {}): Config[K] {\n const typeDefaults = syntaxConfig[type];\n const typeOverride = globals[type];\n const syntaxDefaults = syntaxConfig[syntax];\n const syntaxOverride = globals[syntax];\n\n return {\n ...(defaultConfig[key] as object),\n ...(typeDefaults && typeDefaults[key] as object),\n ...(syntaxDefaults && syntaxDefaults[key] as object),\n ...(typeOverride && typeOverride[key] as object),\n ...(syntaxOverride && syntaxOverride[key] as object),\n ...(config[key] as object)\n } as Config[K];\n}\n", "type Match = ((code: number) => boolean) | number;\n\nexport interface BackwardScanner {\n /** Text to scan */\n text: string;\n\n /** Left bound till given text must be scanned */\n start: number;\n\n /** Current scanner position */\n pos: number;\n}\n\n/**\n * Creates structure for scanning given string in backward direction\n */\nexport default function backwardScanner(text: string, start = 0): BackwardScanner {\n return { text, start, pos: text.length };\n}\n\n/**\n * Check if given scanner position is at start of scanned text\n */\nexport function sol(scanner: BackwardScanner) {\n return scanner.pos === scanner.start;\n}\n\n/**\n * “Peeks” character code an current scanner location without advancing it\n */\nexport function peek(scanner: BackwardScanner, offset = 0) {\n return scanner.text.charCodeAt(scanner.pos - 1 + offset);\n}\n\n/**\n * Returns current character code and moves character location one symbol back\n */\nexport function previous(scanner: BackwardScanner) {\n if (!sol(scanner)) {\n return scanner.text.charCodeAt(--scanner.pos);\n }\n}\n\n/**\n * Consumes current character code if it matches given `match` code or function\n */\nexport function consume(scanner: BackwardScanner, match: Match): boolean {\n if (sol(scanner)) {\n return false;\n }\n\n const ok = typeof match === 'function'\n ? match(peek(scanner))\n : match === peek(scanner);\n\n if (ok) {\n scanner.pos--;\n }\n\n return !!ok;\n}\n\nexport function consumeWhile(scanner: BackwardScanner, match: Match): boolean {\n const start = scanner.pos;\n while (consume(scanner, match)) {\n // empty\n }\n return scanner.pos < start;\n}\n", "import { BackwardScanner, previous, sol, peek } from './reader';\n\nconst enum Chars {\n SingleQuote = 39,\n DoubleQuote = 34,\n Escape = 92\n}\n\n/**\n * Check if given character code is a quote\n */\nexport function isQuote(c?: number) {\n return c === Chars.SingleQuote || c === Chars.DoubleQuote;\n}\n\n/**\n * Consumes quoted value, if possible\n * @return Returns `true` is value was consumed\n */\nexport function consumeQuoted(scanner: BackwardScanner): boolean {\n const start = scanner.pos;\n const quote = previous(scanner);\n\n if (isQuote(quote)) {\n while (!sol(scanner)) {\n if (previous(scanner) === quote && peek(scanner) !== Chars.Escape) {\n return true;\n }\n }\n }\n\n scanner.pos = start;\n return false;\n}\n", "export const enum Brackets {\n SquareL = 91,\n SquareR = 93,\n RoundL = 40,\n RoundR = 41,\n CurlyL = 123,\n CurlyR = 125,\n}\n\nexport const bracePairs = {\n [Brackets.SquareL]: Brackets.SquareR,\n [Brackets.RoundL]: Brackets.RoundR,\n [Brackets.CurlyL]: Brackets.CurlyR,\n};\n", "import { isQuote, consumeQuoted } from './quotes';\nimport { BackwardScanner, consume, sol, consumeWhile, peek } from './reader';\nimport { Brackets, bracePairs } from './brackets';\n\nconst enum Chars {\n Tab = 9,\n Space = 32,\n /** `-` character */\n Dash = 45,\n /** `/` character */\n Slash = 47,\n /** `:` character */\n Colon = 58,\n /** `=` character */\n Equals = 61,\n /** `<` character */\n AngleLeft = 60,\n /** `>` character */\n AngleRight = 62,\n}\n\n/**\n * Check if given reader’s current position points at the end of HTML tag\n */\nexport default function isHtml(scanner: BackwardScanner): boolean {\n const start = scanner.pos;\n\n if (!consume(scanner, Chars.AngleRight)) {\n return false;\n }\n\n let ok = false;\n consume(scanner, Chars.Slash); // possibly self-closed element\n\n while (!sol(scanner)) {\n consumeWhile(scanner, isWhiteSpace);\n\n if (consumeIdent(scanner)) {\n // ate identifier: could be a tag name, boolean attribute or unquoted\n // attribute value\n if (consume(scanner, Chars.Slash)) {\n // either closing tag or invalid tag\n ok = consume(scanner, Chars.AngleLeft);\n break;\n } else if (consume(scanner, Chars.AngleLeft)) {\n // opening tag\n ok = true;\n break;\n } else if (consume(scanner, isWhiteSpace)) {\n // boolean attribute\n continue;\n } else if (consume(scanner, Chars.Equals)) {\n // simple unquoted value or invalid attribute\n if (consumeIdent(scanner)) {\n continue;\n }\n break;\n } else if (consumeAttributeWithUnquotedValue(scanner)) {\n // identifier was a part of unquoted value\n ok = true;\n break;\n }\n\n // invalid tag\n break;\n }\n\n if (consumeAttribute(scanner)) {\n continue;\n }\n\n break;\n }\n\n scanner.pos = start;\n return ok;\n}\n\n/**\n * Consumes HTML attribute from given string.\n * @return `true` if attribute was consumed.\n */\nfunction consumeAttribute(scanner: BackwardScanner): boolean {\n return consumeAttributeWithQuotedValue(scanner) || consumeAttributeWithUnquotedValue(scanner);\n}\n\nfunction consumeAttributeWithQuotedValue(scanner: BackwardScanner): boolean {\n const start = scanner.pos;\n if (consumeQuoted(scanner) && consume(scanner, Chars.Equals) && consumeIdent(scanner)) {\n return true;\n }\n\n scanner.pos = start;\n return false;\n}\n\nfunction consumeAttributeWithUnquotedValue(scanner: BackwardScanner): boolean {\n const start = scanner.pos;\n const stack: Brackets[] = [];\n while (!sol(scanner)) {\n const ch = peek(scanner);\n if (isCloseBracket(ch)) {\n stack.push(ch);\n } else if (isOpenBracket(ch)) {\n if (stack.pop() !== bracePairs[ch]) {\n // Unexpected open bracket\n break;\n }\n } else if (!isUnquotedValue(ch)) {\n break;\n }\n scanner.pos--;\n }\n\n if (start !== scanner.pos && consume(scanner, Chars.Equals) && consumeIdent(scanner)) {\n return true;\n }\n\n scanner.pos = start;\n return false;\n}\n\n/**\n * Consumes HTML identifier from stream\n */\nfunction consumeIdent(scanner: BackwardScanner): boolean {\n return consumeWhile(scanner, isIdent);\n}\n\n/**\n * Check if given character code belongs to HTML identifier\n */\nfunction isIdent(ch: number): boolean {\n return ch === Chars.Colon || ch === Chars.Dash || isAlpha(ch) || isNumber(ch);\n}\n\n/**\n * Check if given character code is alpha code (letter though A to Z)\n */\nfunction isAlpha(ch: number): boolean {\n ch &= ~32; // quick hack to convert any char code to uppercase char code\n return ch >= 65 && ch <= 90; // A-Z\n}\n\n/**\n * Check if given code is a number\n */\nfunction isNumber(ch: number): boolean {\n return ch > 47 && ch < 58;\n}\n\n/**\n * Check if given code is a whitespace\n */\nfunction isWhiteSpace(ch: number): boolean {\n return ch === Chars.Space || ch === Chars.Tab;\n}\n\n/**\n * Check if given code may belong to unquoted attribute value\n */\nfunction isUnquotedValue(ch: number): boolean {\n return !isNaN(ch) && ch !== Chars.Equals && !isWhiteSpace(ch) && !isQuote(ch);\n}\n\nfunction isOpenBracket(ch: number): boolean {\n return ch === Brackets.CurlyL || ch === Brackets.RoundL || ch === Brackets.SquareL;\n}\n\nfunction isCloseBracket(ch: number): boolean {\n return ch === Brackets.CurlyR || ch === Brackets.RoundR || ch === Brackets.SquareR;\n}\n", "import { SyntaxType } from '../config';\nimport backwardScanner, { sol, peek, BackwardScanner, consume } from './reader';\nimport isAtHTMLTag from './is-html';\nimport { isQuote } from './quotes';\nimport { Brackets, bracePairs } from './brackets';\n\nexport interface ExtractOptions {\n /**\n * Allow parser to look ahead of `pos` index for searching of missing\n * abbreviation parts. Most editors automatically inserts closing braces for\n * `[`, `{` and `(`, which will most likely be right after current caret position.\n * So in order to properly expand abbreviation, user must explicitly move\n * caret right after auto-inserted braces. With this option enabled, parser\n * will search for closing braces right after `pos`. Default is `true`\n */\n lookAhead: boolean;\n\n /**\n * Type of context syntax of expanded abbreviation.\n * In 'stylesheet' syntax, brackets `[]` and `{}` are not supported thus\n * not extracted.\n */\n type: SyntaxType;\n\n /**\n * A string that should precede abbreviation in order to make it successfully\n * extracted. If given, the abbreviation will be extracted from the nearest\n * `prefix` occurrence.\n */\n prefix: string;\n}\n\nexport interface ExtractedAbbreviation {\n /** Extracted abbreviation */\n abbreviation: string;\n\n /** Location of abbreviation in input string */\n location: number;\n\n /** Start location of matched abbreviation, including prefix */\n start: number;\n\n /** End location of extracted abbreviation */\n end: number;\n}\n\nconst code = (ch: string) => ch.charCodeAt(0);\nconst specialChars = '#.*:$-_!@%^+>/'.split('').map(code);\n\nconst defaultOptions: ExtractOptions = {\n type: 'markup',\n lookAhead: true,\n prefix: ''\n};\n\n/**\n * Extracts Emmet abbreviation from given string.\n * The goal of this module is to extract abbreviation from current editor’s line,\n * e.g. like this: `<span>.foo[title=bar|]</span>` -> `.foo[title=bar]`, where\n * `|` is a current caret position.\n * @param line A text line where abbreviation should be expanded\n * @param pos Caret position in line. If not given, uses end of line\n * @param options Extracting options\n */\nexport default function extractAbbreviation(line: string, pos: number = line.length, options: Partial<ExtractOptions> = {}): ExtractedAbbreviation | undefined {\n // make sure `pos` is within line range\n const opt: ExtractOptions = { ...defaultOptions, ...options };\n pos = Math.min(line.length, Math.max(0, pos == null ? line.length : pos));\n\n if (opt.lookAhead) {\n pos = offsetPastAutoClosed(line, pos, opt);\n }\n\n let ch: number;\n const start = getStartOffset(line, pos, opt.prefix || '');\n if (start === -1) {\n return void 0;\n }\n\n const scanner = backwardScanner(line, start);\n scanner.pos = pos;\n const stack: number[] = [];\n\n while (!sol(scanner)) {\n ch = peek(scanner);\n\n if (stack.includes(Brackets.CurlyR)) {\n if (ch === Brackets.CurlyR) {\n stack.push(ch);\n scanner.pos--;\n continue;\n }\n\n if (ch !== Brackets.CurlyL) {\n scanner.pos--;\n continue;\n }\n }\n\n if (isCloseBrace(ch, opt.type)) {\n stack.push(ch);\n } else if (isOpenBrace(ch, opt.type)) {\n if (stack.pop() !== bracePairs[ch]) {\n // unexpected brace\n break;\n }\n } else if (stack.includes(Brackets.SquareR) || stack.includes(Brackets.CurlyR)) {\n // respect all characters inside attribute sets or text nodes\n scanner.pos--;\n continue;\n } else if (isAtHTMLTag(scanner) || !isAbbreviation(ch)) {\n break;\n }\n\n scanner.pos--;\n }\n\n if (!stack.length && scanner.pos !== pos) {\n // Found something, remove some invalid symbols from the\n // beginning and return abbreviation\n const abbreviation = line.slice(scanner.pos, pos).replace(/^[*+>^]+/, '');\n return {\n abbreviation,\n location: pos - abbreviation.length,\n start: options.prefix\n ? start - options.prefix.length\n : pos - abbreviation.length,\n end: pos\n };\n }\n}\n\n/**\n * Returns new `line` index which is right after characters beyound `pos` that\n * editor will likely automatically close, e.g. }, ], and quotes\n */\nfunction offsetPastAutoClosed(line: string, pos: number, options: ExtractOptions): number {\n // closing quote is allowed only as a next character\n if (isQuote(line.charCodeAt(pos))) {\n pos++;\n }\n\n // offset pointer until non-autoclosed character is found\n while (isCloseBrace(line.charCodeAt(pos), options.type)) {\n pos++;\n }\n\n return pos;\n}\n\n/**\n * Returns start offset (left limit) in `line` where we should stop looking for\n * abbreviation: it’s nearest to `pos` location of `prefix` token\n */\nfunction getStartOffset(line: string, pos: number, prefix: string): number {\n if (!prefix) {\n return 0;\n }\n\n const scanner = backwardScanner(line);\n const compiledPrefix = prefix.split('').map(code);\n scanner.pos = pos;\n let result: number;\n\n while (!sol(scanner)) {\n if (consumePair(scanner, Brackets.SquareR, Brackets.SquareL) || consumePair(scanner, Brackets.CurlyR, Brackets.CurlyL)) {\n continue;\n }\n\n result = scanner.pos;\n if (consumeArray(scanner, compiledPrefix)) {\n return result;\n }\n\n scanner.pos--;\n }\n\n return -1;\n}\n\n/**\n * Consumes full character pair, if possible\n */\nfunction consumePair(scanner: BackwardScanner, close: number, open: number): boolean {\n const start = scanner.pos;\n if (consume(scanner, close)) {\n while (!sol(scanner)) {\n if (consume(scanner, open)) {\n return true;\n }\n\n scanner.pos--;\n }\n }\n\n scanner.pos = start;\n return false;\n}\n\n/**\n * Consumes all character codes from given array, right-to-left, if possible\n */\nfunction consumeArray(scanner: BackwardScanner, arr: number[]) {\n const start = scanner.pos;\n let consumed = false;\n\n for (let i = arr.length - 1; i >= 0 && !sol(scanner); i--) {\n if (!consume(scanner, arr[i])) {\n break;\n }\n\n consumed = i === 0;\n }\n\n if (!consumed) {\n scanner.pos = start;\n }\n\n return consumed;\n}\n\nfunction isAbbreviation(ch: number) {\n return (ch > 64 && ch < 91) // uppercase letter\n || (ch > 96 && ch < 123) // lowercase letter\n || (ch > 47 && ch < 58) // number\n || specialChars.includes(ch); // special character\n}\n\nfunction isOpenBrace(ch: number, syntax: SyntaxType) {\n return ch === Brackets.RoundL || (syntax === 'markup' && (ch === Brackets.SquareL || ch === Brackets.CurlyL));\n}\n\nfunction isCloseBrace(ch: number, syntax: SyntaxType) {\n return ch === Brackets.RoundR || (syntax === 'markup' && (ch === Brackets.SquareR || ch === Brackets.CurlyR));\n}\n", "import markupAbbreviation, { Abbreviation } from '@emmetio/abbreviation';\nimport stylesheetAbbreviation, { CSSAbbreviation } from '@emmetio/css-abbreviation';\nimport parseMarkup, { stringify as stringifyMarkup } from './markup';\nimport parseStylesheet, {\n stringify as stringifyStylesheet,\n convertSnippets as parseStylesheetSnippets,\n CSSAbbreviationScope\n} from './stylesheet';\nimport resolveConfig, { UserConfig, Config } from './config';\n\nexport default function expandAbbreviation(abbr: string, config?: UserConfig): string {\n const resolvedConfig = resolveConfig(config);\n return resolvedConfig.type === 'stylesheet'\n ? stylesheet(abbr, resolvedConfig)\n : markup(abbr, resolvedConfig);\n}\n\n/**\n * Expands given *markup* abbreviation (e.g. regular Emmet abbreviation that\n * produces structured output like HTML) and outputs it according to options\n * provided in config\n */\nexport function markup(abbr: string | Abbreviation, config: Config) {\n return stringifyMarkup(parseMarkup(abbr, config), config);\n}\n\n/**\n * Expands given *stylesheet* abbreviation (a special Emmet abbreviation designed for\n * stylesheet languages like CSS, SASS etc.) and outputs it according to options\n * provided in config\n */\nexport function stylesheet(abbr: string | CSSAbbreviation, config: Config) {\n return stringifyStylesheet(parseStylesheet(abbr, config), config);\n}\n\nexport {\n markupAbbreviation, parseMarkup, stringifyMarkup,\n stylesheetAbbreviation, parseStylesheet, stringifyStylesheet, parseStylesheetSnippets,\n Abbreviation as MarkupAbbreviation, CSSAbbreviation as StylesheetAbbreviation,\n CSSAbbreviationScope\n};\nexport { default as extract, ExtractOptions, ExtractedAbbreviation } from './extract-abbreviation';\nexport { GlobalConfig, SyntaxType, Config, UserConfig, Options, AbbreviationContext, default as resolveConfig } from './config';\n", null, null, "export enum StylePriority {\n Emmet,\n Platform\n}\n", "import { TextEdit, Range } from 'vscode-languageserver-types';\n\nimport type { BuiltInParserName, CustomParser, Options as PrettierOptions } from 'prettier';\nimport { indentSection } from '../strings';\n\nimport { VLSFormatConfig } from '../../config';\nimport { logger } from '../../log';\nimport path from 'path';\nimport { DependencyService, RuntimeLibrary } from '../../services/dependencyService';\n\nconst VLS_PATH = path.resolve(__dirname, '../../../');\n\ntype PrettierParserOption = BuiltInParserName | CustomParser;\n\nexport function prettierify(\n dependencyService: DependencyService,\n code: string,\n fileFsPath: string,\n languageId: string,\n range: Range,\n vlsFormatConfig: VLSFormatConfig,\n initialIndent: boolean\n): TextEdit[] {\n try {\n const prettier = dependencyService.get('prettier', fileFsPath).module;\n const prettierOptions = getPrettierOptions(dependencyService, prettier, fileFsPath, languageId, vlsFormatConfig);\n logger.logDebug(`Using prettier. Options\\n${JSON.stringify(prettierOptions)}`);\n\n const prettierifiedCode = prettier.format(code, prettierOptions);\n if (prettierifiedCode === '' && code.trim() !== '') {\n throw Error('Empty result from prettier');\n }\n\n return [toReplaceTextedit(prettierifiedCode, range, vlsFormatConfig, initialIndent)];\n } catch (e) {\n console.log('Prettier format failed');\n console.error((e as Error).stack);\n return [];\n }\n}\n\nexport function prettierEslintify(\n dependencyService: DependencyService,\n code: string,\n fileFsPath: string,\n languageId: string,\n range: Range,\n vlsFormatConfig: VLSFormatConfig,\n initialIndent: boolean\n): TextEdit[] {\n try {\n const prettier = dependencyService.get('prettier', fileFsPath).module;\n const prettierEslint = dependencyService.get('prettier-eslint', fileFsPath).module;\n\n const prettierOptions = getPrettierOptions(dependencyService, prettier, fileFsPath, languageId, vlsFormatConfig);\n logger.logDebug(`Using prettier-eslint. Options\\n${JSON.stringify(prettierOptions)}`);\n\n const ext = languageId === 'javascript' ? '.js' : '.ts';\n\n const prettierifiedCode = prettierEslint({\n filePath: fileFsPath + ext,\n prettierOptions: { parser: prettierOptions.parser },\n text: code,\n fallbackPrettierOptions: prettierOptions\n });\n if (prettierifiedCode === '' && code.trim() !== '') {\n throw Error('Empty result from prettier');\n }\n\n return [toReplaceTextedit(prettierifiedCode, range, vlsFormatConfig, initialIndent)];\n } catch (e) {\n console.log('Prettier-Eslint format failed');\n console.error((e as Error).stack);\n return [];\n }\n}\nexport function prettierTslintify(\n dependencyService: DependencyService,\n code: string,\n fileFsPath: string,\n languageId: string,\n range: Range,\n vlsFormatConfig: VLSFormatConfig,\n initialIndent: boolean\n): TextEdit[] {\n try {\n const prettier = dependencyService.get('prettier', fileFsPath).module;\n const prettierTslint = dependencyService.get('prettier-tslint', fileFsPath).module.format;\n\n const prettierOptions = getPrettierOptions(dependencyService, prettier, fileFsPath, languageId, vlsFormatConfig);\n logger.logDebug(`Using prettier-tslint. Options\\n${JSON.stringify(prettierOptions)}`);\n\n const prettierifiedCode = prettierTslint({\n prettierOptions: { parser: prettierOptions.parser },\n text: code,\n filePath: fileFsPath,\n fallbackPrettierOptions: prettierOptions\n });\n\n return [toReplaceTextedit(prettierifiedCode, range, vlsFormatConfig, initialIndent)];\n } catch (e) {\n console.log('Prettier-Tslint format failed');\n console.error((e as Error).stack);\n return [];\n }\n}\n\nexport function prettierPluginPugify(\n dependencyService: DependencyService,\n code: string,\n fileFsPath: string,\n languageId: string,\n range: Range,\n vlsFormatConfig: VLSFormatConfig,\n initialIndent: boolean\n): TextEdit[] {\n try {\n let prettier = dependencyService.get('prettier', fileFsPath).module;\n if (prettier.version.startsWith('1')) {\n prettier = dependencyService.getBundled('prettier').module;\n }\n const prettierPluginPug = dependencyService.get('@prettier/plugin-pug', fileFsPath).module;\n const prettierOptions = getPrettierOptions(dependencyService, prettier, fileFsPath, languageId, vlsFormatConfig);\n (prettierOptions as { pluginSearchDirs: string[] }).pluginSearchDirs = [];\n prettierOptions.plugins = Array.isArray(prettierOptions.plugins)\n ? [...prettierOptions.plugins, prettierPluginPug]\n : [prettierPluginPug];\n logger.logDebug(`Using prettier. Options\\n${JSON.stringify(prettierOptions)}`);\n\n const prettierifiedCode = prettier.format(code, prettierOptions);\n return [toReplaceTextedit(prettierifiedCode, range, vlsFormatConfig, initialIndent)];\n } catch (e) {\n console.log('Prettier format failed');\n console.error((e as Error).stack);\n return [];\n }\n}\n\nfunction getPrettierOptions(\n dependencyService: DependencyService,\n prettierModule: RuntimeLibrary['prettier'],\n fileFsPath: string,\n languageId: string,\n vlsFormatConfig: VLSFormatConfig\n): PrettierOptions {\n const prettierrcOptions = prettierModule.resolveConfig.sync(fileFsPath, { useCache: false });\n\n const getParser = () => {\n const table = {\n javascript: 'babel',\n typescript: 'typescript',\n pug: 'pug',\n vue: 'vue',\n css: 'css',\n postcss: 'css',\n scss: 'scss',\n less: 'less'\n };\n return table?.[languageId as 'javascript'] ?? 'babel';\n };\n\n if (prettierrcOptions) {\n prettierrcOptions.tabWidth = prettierrcOptions.tabWidth || vlsFormatConfig.options.tabSize;\n prettierrcOptions.useTabs = prettierrcOptions.useTabs || vlsFormatConfig.options.useTabs;\n prettierrcOptions.parser = getParser();\n if (dependencyService.useWorkspaceDependencies) {\n // For loading plugins such as @prettier/plugin-pug\n (\n prettierrcOptions as {\n pluginSearchDirs: string[];\n }\n ).pluginSearchDirs = dependencyService.nodeModulesPaths.map(el => path.dirname(el));\n }\n\n return prettierrcOptions;\n } else {\n const vscodePrettierOptions = vlsFormatConfig.defaultFormatterOptions.prettier || {};\n vscodePrettierOptions.tabWidth = vscodePrettierOptions.tabWidth || vlsFormatConfig.options.tabSize;\n vscodePrettierOptions.useTabs = vscodePrettierOptions.useTabs || vlsFormatConfig.options.useTabs;\n vscodePrettierOptions.parser = getParser();\n if (dependencyService.useWorkspaceDependencies) {\n // For loading plugins such as @prettier/plugin-pug\n vscodePrettierOptions.pluginSearchDirs = dependencyService.nodeModulesPaths.map(el => path.dirname(el));\n }\n\n return vscodePrettierOptions;\n }\n}\n\nfunction toReplaceTextedit(\n prettierifiedCode: string,\n range: Range,\n vlsFormatConfig: VLSFormatConfig,\n initialIndent: boolean\n): TextEdit {\n if (initialIndent) {\n // Prettier adds newline at the end\n const formattedCode = '\\n' + indentSection(prettierifiedCode, vlsFormatConfig);\n return TextEdit.replace(range, formattedCode);\n } else {\n return TextEdit.replace(range, '\\n' + prettierifiedCode);\n }\n}\n", "import { LanguageMode } from '../embeddedSupport/languageModes';\nimport { CompletionList } from 'vscode-languageserver-types';\n\nexport const NULL_HOVER = {\n contents: []\n};\n\nexport const NULL_SIGNATURE = null;\n\nexport const NULL_COMPLETION: CompletionList = {\n isIncomplete: false,\n items: []\n};\n\nexport const nullMode: LanguageMode = {\n getId: () => '',\n onDocumentRemoved() {},\n dispose() {},\n doHover: () => NULL_HOVER,\n doComplete: () => NULL_COMPLETION,\n doSignatureHelp: () => NULL_SIGNATURE,\n findReferences: () => []\n};\n", "import { LanguageModelCache, getLanguageModelCache } from '../../embeddedSupport/languageModelCache';\nimport {\n SymbolInformation,\n CompletionItem,\n Location,\n SignatureHelp,\n SignatureInformation,\n ParameterInformation,\n Definition,\n TextEdit,\n Diagnostic,\n DiagnosticSeverity,\n Range,\n CompletionItemKind,\n Hover,\n MarkedString,\n DocumentHighlight,\n DocumentHighlightKind,\n CompletionList,\n Position,\n FormattingOptions,\n DiagnosticTag,\n MarkupContent,\n CodeAction,\n CodeActionKind,\n FoldingRangeKind,\n CompletionItemTag,\n CodeActionContext,\n TextDocumentEdit,\n VersionedTextDocumentIdentifier\n} from 'vscode-languageserver-types';\nimport { TextDocument } from 'vscode-languageserver-textdocument';\nimport { LanguageMode } from '../../embeddedSupport/languageModes';\nimport { VueDocumentRegions, LanguageRange, LanguageId } from '../../embeddedSupport/embeddedSupport';\nimport { prettierify, prettierEslintify, prettierTslintify } from '../../utils/prettier';\nimport { getFileFsPath, getFilePath } from '../../utils/paths';\n\nimport { URI } from 'vscode-uri';\nimport type ts from 'typescript';\nimport _ from 'lodash';\n\nimport { nullMode, NULL_SIGNATURE } from '../nullMode';\nimport { BasicComponentInfo, VLSFormatConfig } from '../../config';\nimport { VueInfoService } from '../../services/vueInfoService';\nimport { getComponentInfo } from './componentInfo';\nimport { DependencyService, RuntimeLibrary } from '../../services/dependencyService';\nimport {\n CodeActionData,\n CodeActionDataKind,\n OrganizeImportsActionData,\n RefactorActionData,\n SemanticTokenOffsetData\n} from '../../types';\nimport { IServiceHost } from '../../services/typescriptService/serviceHost';\nimport {\n isVirtualVueTemplateFile,\n isVueFile,\n toCompletionItemKind,\n toSymbolKind\n} from '../../services/typescriptService/util';\nimport * as Previewer from './previewer';\nimport { isVCancellationRequested, VCancellationToken } from '../../utils/cancellationToken';\nimport { EnvironmentService } from '../../services/EnvironmentService';\nimport { getCodeActionKind } from './CodeActionKindConverter';\nimport { FileRename } from 'vscode-languageserver';\nimport {\n addCompositionApiRefTokens,\n getTokenModifierFromClassification,\n getTokenTypeFromClassification\n} from './semanticToken';\nimport { RefTokensService } from '../../services/RefTokenService';\nimport { createScriptSetupDiagnosticFilter } from '../../services/typescriptService/diagnosticFilter';\n\n// Todo: After upgrading to LS server 4.0, use CompletionContext for filtering trigger chars\n// https://microsoft.github.io/language-server-protocol/specification#completion-request-leftwards_arrow_with_hook\nconst NON_SCRIPT_TRIGGERS = ['<', '*', ':'];\n\nconst SEMANTIC_TOKEN_CONTENT_LENGTH_LIMIT = 80000;\n\nexport async function getJavascriptMode(\n tsModule: RuntimeLibrary['typescript'],\n serviceHost: IServiceHost,\n env: EnvironmentService,\n documentRegions: LanguageModelCache<VueDocumentRegions>,\n dependencyService: DependencyService,\n globalComponentInfos: BasicComponentInfo[],\n vueInfoService: VueInfoService,\n refTokensService: RefTokensService\n): Promise<LanguageMode> {\n const jsDocuments = getLanguageModelCache(10, 60, document => {\n const vueDocument = documentRegions.refreshAndGet(document);\n return vueDocument.getSingleTypeDocument('script');\n });\n\n const { updateCurrentVueTextDocument } = serviceHost;\n let supportedCodeFixCodes: Set<number>;\n\n function getUserPreferences(scriptDoc: TextDocument): ts.UserPreferences {\n return getUserPreferencesByLanguageId(scriptDoc.languageId);\n }\n function getUserPreferencesByLanguageId(languageId: string): ts.UserPreferences {\n const baseConfig = env.getConfig()[languageId === 'javascript' ? 'javascript' : 'typescript'];\n const preferencesConfig = baseConfig?.preferences;\n\n if (!baseConfig || !preferencesConfig) {\n return {};\n }\n\n function safeGetConfigValue<V extends string | boolean, A extends Array<V>, D = undefined>(\n configValue: any,\n allowValues: A,\n defaultValue?: D\n ) {\n return allowValues.includes(configValue) ? (configValue as A[number]) : (defaultValue as D);\n }\n\n return {\n quotePreference: safeGetConfigValue(preferencesConfig.quoteStyle, ['single', 'double', 'auto']),\n importModuleSpecifierPreference: safeGetConfigValue(preferencesConfig.importModuleSpecifier, [\n 'relative',\n 'non-relative'\n ]),\n importModuleSpecifierEnding: safeGetConfigValue(\n preferencesConfig.importModuleSpecifierEnding,\n ['minimal', 'index', 'js'],\n 'auto'\n ),\n allowTextChangesInNewFiles: true,\n providePrefixAndSuffixTextForRename:\n preferencesConfig.renameShorthandProperties === false ? false : preferencesConfig.useAliasesForRenames,\n allowRenameOfImportPath: true,\n includeAutomaticOptionalChainCompletions: baseConfig.suggest?.includeAutomaticOptionalChainCompletions ?? true,\n provideRefactorNotApplicableReason: true\n };\n }\n\n return {\n getId() {\n return 'javascript';\n },\n updateFileInfo(doc: TextDocument): void {\n if (!vueInfoService) {\n return;\n }\n\n const { service } = updateCurrentVueTextDocument(doc);\n const fileFsPath = getFileFsPath(doc.uri);\n const info = getComponentInfo(\n tsModule,\n service,\n fileFsPath,\n globalComponentInfos,\n env.getVueVersion(),\n env.getConfig()\n );\n if (info) {\n vueInfoService.updateInfo(doc, info);\n }\n },\n\n async doValidation(doc: TextDocument, cancellationToken?: VCancellationToken): Promise<Diagnostic[]> {\n if (await isVCancellationRequested(cancellationToken)) {\n return [];\n }\n const { scriptDoc, service } = updateCurrentVueTextDocument(doc);\n if (!languageServiceIncludesFile(service, doc.uri)) {\n return [];\n }\n\n if (await isVCancellationRequested(cancellationToken)) {\n return [];\n }\n const fileFsPath = getFileFsPath(doc.uri);\n const program = service.getProgram();\n const sourceFile = program?.getSourceFile(fileFsPath);\n if (!program || !sourceFile) {\n return [];\n }\n\n let rawScriptDiagnostics = [\n ...program.getSyntacticDiagnostics(sourceFile, cancellationToken?.tsToken),\n ...program.getSemanticDiagnostics(sourceFile, cancellationToken?.tsToken),\n ...service.getSuggestionDiagnostics(fileFsPath)\n ];\n\n const compilerOptions = program.getCompilerOptions();\n if (compilerOptions.declaration || compilerOptions.composite) {\n rawScriptDiagnostics = [\n ...rawScriptDiagnostics,\n ...program.getDeclarationDiagnostics(sourceFile, cancellationToken?.tsToken)\n ];\n }\n\n const scriptSetupRange = documentRegions\n .refreshAndGet(doc)\n .getLanguageRangesOfType('script')\n .find(range => range.attrs.setup);\n if (scriptSetupRange) {\n const scriptSetupDiagnosticsFilters = createScriptSetupDiagnosticFilter(tsModule);\n const scriptSetupRangeStart = doc.offsetAt(scriptSetupRange.start);\n const scriptSetupRangeEnd = doc.offsetAt(scriptSetupRange.end);\n rawScriptDiagnostics = rawScriptDiagnostics.filter(diag => {\n if (diag.start) {\n const range = convertRange(doc, diag as ts.TextSpan);\n const start = doc.offsetAt(range.start);\n if (start >= scriptSetupRangeStart && start <= scriptSetupRangeEnd) {\n return scriptSetupDiagnosticsFilters(diag);\n }\n }\n return true;\n });\n }\n\n return rawScriptDiagnostics.map(diag => {\n const tags: DiagnosticTag[] = [];\n\n if (diag.reportsUnnecessary) {\n tags.push(DiagnosticTag.Unnecessary);\n }\n if (diag.reportsDeprecated) {\n tags.push(DiagnosticTag.Deprecated);\n }\n\n // syntactic/semantic diagnostic always has start and length\n // so we can safely cast diag to TextSpan\n return <Diagnostic>{\n range: convertRange(scriptDoc, diag as ts.TextSpan),\n severity: convertTSDiagnosticCategoryToDiagnosticSeverity(tsModule, diag.category),\n message: tsModule.flattenDiagnosticMessageText(diag.messageText, '\\n'),\n tags,\n code: diag.code,\n source: 'Vetur'\n };\n });\n },\n doComplete(doc: TextDocument, position: Position): CompletionList {\n const { scriptDoc, service } = updateCurrentVueTextDocument(doc);\n if (!languageServiceIncludesFile(service, doc.uri)) {\n return { isIncomplete: false, items: [] };\n }\n\n const fileFsPath = getFileFsPath(doc.uri);\n const offset = scriptDoc.offsetAt(position);\n const triggerChar = doc.getText()[offset - 1];\n if (NON_SCRIPT_TRIGGERS.includes(triggerChar)) {\n return { isIncomplete: false, items: [] };\n }\n const completions = service.getCompletionsAtPosition(fileFsPath, offset, {\n ...getUserPreferences(scriptDoc),\n triggerCharacter: getTsTriggerCharacter(triggerChar),\n includeCompletionsWithInsertText: true,\n includeCompletionsForModuleExports: env.getConfig().vetur.completion.autoImport\n });\n if (!completions) {\n return { isIncomplete: false, items: [] };\n }\n const entries = completions.entries.filter(entry => entry.name !== '__vueEditorBridge');\n return {\n isIncomplete: false,\n items: entries.map((entry, index) => {\n const range = entry.replacementSpan && convertRange(scriptDoc, entry.replacementSpan);\n const { label, detail } = calculateLabelAndDetailTextForPathImport(entry);\n\n const item: CompletionItem = {\n uri: doc.uri,\n preselect: entry.isRecommended ? true : undefined,\n label,\n detail,\n filterText: getFilterText(entry.insertText),\n sortText: entry.sortText + index,\n kind: toCompletionItemKind(entry.kind),\n textEdit: range && TextEdit.replace(range, entry.insertText || entry.name),\n insertText: entry.insertText,\n data: {\n // data used for resolving item details (see 'doResolve')\n languageId: scriptDoc.languageId,\n uri: doc.uri,\n offset,\n position,\n source: entry.source,\n tsData: entry.data\n }\n } as CompletionItem;\n // fix: https://github.com/vuejs/vetur/issues/2908\n if (item.kind === CompletionItemKind.File && !item.detail?.endsWith('.js') && !item.detail?.endsWith('.ts')) {\n item.insertText = item.detail;\n }\n if (entry.kindModifiers) {\n const kindModifiers = parseKindModifier(entry.kindModifiers ?? '');\n if (kindModifiers.optional) {\n if (!item.insertText) {\n item.insertText = item.label;\n }\n if (!item.filterText) {\n item.filterText = item.label;\n }\n item.label += '?';\n }\n if (kindModifiers.deprecated) {\n item.tags = [CompletionItemTag.Deprecated];\n }\n if (kindModifiers.color) {\n item.kind = CompletionItemKind.Color;\n }\n }\n\n return item;\n })\n };\n\n function calculateLabelAndDetailTextForPathImport(entry: ts.CompletionEntry) {\n // Is import path completion\n if (entry.kind === tsModule.ScriptElementKind.scriptElement) {\n if (entry.kindModifiers) {\n return {\n label: entry.name,\n detail: entry.name + entry.kindModifiers\n };\n } else {\n if (entry.name.endsWith('.vue')) {\n return {\n label: entry.name.slice(0, -'.vue'.length),\n detail: entry.name\n };\n }\n }\n }\n\n return {\n label: entry.name,\n detail: undefined\n };\n }\n },\n doResolve(doc: TextDocument, item: CompletionItem): CompletionItem {\n const { scriptDoc, service } = updateCurrentVueTextDocument(doc);\n if (!languageServiceIncludesFile(service, doc.uri)) {\n return item;\n }\n\n const fileFsPath = getFileFsPath(doc.uri);\n\n const details = service.getCompletionEntryDetails(\n fileFsPath,\n item.data.offset,\n item.label,\n getFormatCodeSettings(env.getConfig()),\n item.data.source,\n getUserPreferences(scriptDoc),\n item.data.tsData\n );\n\n if (details && item.kind !== CompletionItemKind.File && item.kind !== CompletionItemKind.Folder) {\n item.detail = Previewer.plain(tsModule.displayPartsToString(details.displayParts));\n const documentation: MarkupContent = {\n kind: 'markdown',\n value: tsModule.displayPartsToString(details.documentation) + '\\n\\n'\n };\n\n if (details.tags) {\n if (details.tags) {\n details.tags.forEach(x => {\n const tagDoc = Previewer.getTagDocumentation(x);\n if (tagDoc) {\n documentation.value += tagDoc + '\\n\\n';\n }\n });\n }\n }\n\n const vueDocument = documentRegions.refreshAndGet(doc);\n const languageRange = item.data.position\n ? vueDocument.getLanguageRangeAtPosition(item.data.position)\n : vueDocument.getLanguageRangesOfType('script')[0];\n if (details.codeActions && env.getConfig().vetur.completion.autoImport && languageRange) {\n const textEdits = convertCodeAction(doc, details.codeActions, languageRange);\n item.additionalTextEdits = textEdits;\n\n details.codeActions.forEach(action => {\n if (action.description) {\n documentation.value += '\\n' + action.description;\n }\n });\n }\n item.documentation = documentation;\n delete item.data;\n }\n return item;\n },\n doHover(doc: TextDocument, position: Position): Hover {\n const { scriptDoc, service } = updateCurrentVueTextDocument(doc);\n if (!languageServiceIncludesFile(service, doc.uri)) {\n return { contents: [] };\n }\n\n const fileFsPath = getFileFsPath(doc.uri);\n const info = service.getQuickInfoAtPosition(fileFsPath, scriptDoc.offsetAt(position));\n if (info) {\n const display = tsModule.displayPartsToString(info.displayParts);\n const markedContents: MarkedString[] = [{ language: 'ts', value: display }];\n\n let hoverMdDoc = '';\n const doc = Previewer.plain(tsModule.displayPartsToString(info.documentation));\n if (doc) {\n hoverMdDoc += doc + '\\n\\n';\n }\n\n if (info.tags) {\n info.tags.forEach(x => {\n const tagDoc = Previewer.getTagDocumentation(x);\n if (tagDoc) {\n hoverMdDoc += tagDoc + '\\n\\n';\n }\n });\n }\n\n if (hoverMdDoc.trim() !== '') {\n markedContents.push(hoverMdDoc);\n }\n\n return {\n range: convertRange(scriptDoc, info.textSpan),\n contents: markedContents\n };\n }\n return { contents: [] };\n },\n doSignatureHelp(doc: TextDocument, position: Position): SignatureHelp | null {\n const { scriptDoc, service } = updateCurrentVueTextDocument(doc);\n if (!languageServiceIncludesFile(service, doc.uri)) {\n return NULL_SIGNATURE;\n }\n\n const fileFsPath = getFileFsPath(doc.uri);\n const signatureHelpItems = service.getSignatureHelpItems(fileFsPath, scriptDoc.offsetAt(position), undefined);\n if (!signatureHelpItems) {\n return NULL_SIGNATURE;\n }\n\n const signatures: SignatureInformation[] = [];\n signatureHelpItems.items.forEach(item => {\n let sigLabel = '';\n let sigMdDoc = '';\n const sigParameterInfos: ParameterInformation[] = [];\n\n sigLabel += tsModule.displayPartsToString(item.prefixDisplayParts);\n item.parameters.forEach((p, i, a) => {\n const label = tsModule.displayPartsToString(p.displayParts);\n const parameter: ParameterInformation = {\n label,\n documentation: tsModule.displayPartsToString(p.documentation)\n };\n sigLabel += label;\n sigParameterInfos.push(parameter);\n if (i < a.length - 1) {\n sigLabel += tsModule.displayPartsToString(item.separatorDisplayParts);\n }\n });\n sigLabel += tsModule.displayPartsToString(item.suffixDisplayParts);\n\n item.tags\n .filter(x => x.name !== 'param')\n .forEach(x => {\n const tagDoc = Previewer.getTagDocumentation(x);\n if (tagDoc) {\n sigMdDoc += tagDoc + '\\n\\n';\n }\n });\n\n signatures.push({\n label: sigLabel,\n documentation: {\n kind: 'markdown',\n value: sigMdDoc\n },\n parameters: sigParameterInfos\n });\n });\n\n return {\n activeSignature: signatureHelpItems.selectedItemIndex,\n activeParameter: signatureHelpItems.argumentIndex,\n signatures\n };\n },\n findDocumentHighlight(doc: TextDocument, position: Position): DocumentHighlight[] {\n const { scriptDoc, service } = updateCurrentVueTextDocument(doc);\n if (!languageServiceIncludesFile(service, doc.uri)) {\n return [];\n }\n\n const fileFsPath = getFileFsPath(doc.uri);\n const occurrences = service.getOccurrencesAtPosition(fileFsPath, scriptDoc.offsetAt(position));\n if (occurrences) {\n return occurrences.map(entry => {\n return {\n range: convertRange(scriptDoc, entry.textSpan),\n kind: entry.isWriteAccess ? DocumentHighlightKind.Write : DocumentHighlightKind.Text\n };\n });\n }\n return [];\n },\n findDocumentSymbols(doc: TextDocument): SymbolInformation[] {\n const { scriptDoc, service } = updateCurrentVueTextDocument(doc);\n if (!languageServiceIncludesFile(service, doc.uri)) {\n return [];\n }\n\n const fileFsPath = getFileFsPath(doc.uri);\n const items = service.getNavigationBarItems(fileFsPath);\n if (!items) {\n return [];\n }\n const result: SymbolInformation[] = [];\n const existing: { [k: string]: boolean } = {};\n const collectSymbols = (item: ts.NavigationBarItem, containerLabel?: string) => {\n const sig = item.text + item.kind + item.spans[0].start;\n if (item.kind !== 'script' && !existing[sig]) {\n const symbol: SymbolInformation = {\n name: item.text,\n kind: toSymbolKind(item.kind),\n location: {\n uri: doc.uri,\n range: convertRange(scriptDoc, item.spans[0])\n },\n containerName: containerLabel\n };\n existing[sig] = true;\n result.push(symbol);\n containerLabel = item.text;\n }\n\n if (item.childItems && item.childItems.length > 0) {\n for (const child of item.childItems) {\n collectSymbols(child, containerLabel);\n }\n }\n };\n\n items.forEach(item => collectSymbols(item));\n return result;\n },\n findDefinition(doc: TextDocument, position: Position): Definition {\n const { scriptDoc, service } = updateCurrentVueTextDocument(doc);\n if (!languageServiceIncludesFile(service, doc.uri)) {\n return [];\n }\n\n const fileFsPath = getFileFsPath(doc.uri);\n const definitions = service.getDefinitionAtPosition(fileFsPath, scriptDoc.offsetAt(position));\n if (!definitions) {\n return [];\n }\n\n const definitionResults: Definition = [];\n const program = service.getProgram();\n if (!program) {\n return [];\n }\n definitions.forEach(d => {\n const definitionTargetDoc = getSourceDoc(d.fileName, program);\n definitionResults.push({\n uri: URI.file(d.fileName).toString(),\n range: convertRange(definitionTargetDoc, d.textSpan)\n });\n });\n return definitionResults;\n },\n findReferences(doc: TextDocument, position: Position): Location[] {\n const { scriptDoc, service } = updateCurrentVueTextDocument(doc);\n if (!languageServiceIncludesFile(service, doc.uri)) {\n return [];\n }\n\n const fileFsPath = getFileFsPath(doc.uri);\n const references = service.getReferencesAtPosition(fileFsPath, scriptDoc.offsetAt(position));\n if (!references) {\n return [];\n }\n\n const referenceResults: Location[] = [];\n const program = service.getProgram();\n if (!program) {\n return [];\n }\n references.forEach(r => {\n const referenceTargetDoc = getSourceDoc(r.fileName, program);\n if (referenceTargetDoc) {\n referenceResults.push({\n uri: URI.file(r.fileName).toString(),\n range: convertRange(referenceTargetDoc, r.textSpan)\n });\n }\n });\n return referenceResults;\n },\n getFoldingRanges(doc) {\n const { scriptDoc, service } = updateCurrentVueTextDocument(doc);\n if (!languageServiceIncludesFile(service, doc.uri)) {\n return [];\n }\n\n const fileFsPath = getFileFsPath(doc.uri);\n const spans = service.getOutliningSpans(fileFsPath);\n\n return spans.map(s => {\n const range = convertRange(scriptDoc, s.textSpan);\n const kind = getFoldingRangeKind(s);\n\n // https://github.com/vuejs/vetur/issues/2303\n const endLine =\n range.end.character > 0 &&\n ['}', ']'].includes(\n scriptDoc.getText(Range.create(Position.create(range.end.line, range.end.character - 1), range.end))\n )\n ? Math.max(range.end.line - 1, range.start.line)\n : range.end.line;\n\n return {\n startLine: range.start.line,\n startCharacter: range.start.character,\n endLine,\n endCharacter: range.end.character,\n kind\n };\n });\n },\n getCodeActions(doc, range, _formatParams, context) {\n const { scriptDoc, service } = updateCurrentVueTextDocument(doc);\n const fileName = getFileFsPath(scriptDoc.uri);\n const start = scriptDoc.offsetAt(range.start);\n const end = scriptDoc.offsetAt(range.end);\n const textRange = { pos: start, end };\n const preferences = getUserPreferences(scriptDoc);\n if (!supportedCodeFixCodes) {\n supportedCodeFixCodes = new Set(\n tsModule\n .getSupportedCodeFixes()\n .map(Number)\n .filter(x => !isNaN(x))\n );\n }\n const formatSettings: ts.FormatCodeSettings = getFormatCodeSettings(env.getConfig());\n\n const result: CodeAction[] = [];\n provideQuickFixCodeActions(\n doc.uri,\n scriptDoc.languageId as LanguageId,\n fileName,\n textRange,\n context,\n supportedCodeFixCodes,\n formatSettings,\n preferences,\n service,\n result\n );\n provideRefactoringCodeActions(\n doc.uri,\n scriptDoc.languageId as LanguageId,\n fileName,\n textRange,\n context,\n preferences,\n service,\n result\n );\n provideOrganizeImports(doc.uri, scriptDoc.languageId as LanguageId, textRange, context, result);\n\n return result;\n },\n doCodeActionResolve(doc, action) {\n const { scriptDoc, service } = updateCurrentVueTextDocument(doc);\n if (!languageServiceIncludesFile(service, doc.uri)) {\n return action;\n }\n\n const formatSettings: ts.FormatCodeSettings = getFormatCodeSettings(env.getConfig());\n const preferences = getUserPreferences(scriptDoc);\n\n const fileFsPath = getFileFsPath(doc.uri);\n const data = action.data as CodeActionData;\n\n if (data.kind === CodeActionDataKind.CombinedCodeFix) {\n const combinedFix = service.getCombinedCodeFix(\n { type: 'file', fileName: fileFsPath },\n data.fixId,\n formatSettings,\n preferences\n );\n\n action.edit = { changes: createUriMappingForEdits(combinedFix.changes.slice(), service) };\n }\n if (data.kind === CodeActionDataKind.RefactorAction) {\n const refactor = service.getEditsForRefactor(\n fileFsPath,\n formatSettings,\n data.textRange,\n data.refactorName,\n data.actionName,\n preferences\n );\n if (refactor) {\n action.edit = { changes: createUriMappingForEdits(refactor.edits, service) };\n }\n }\n if (data.kind === CodeActionDataKind.OrganizeImports) {\n const response = service.organizeImports({ type: 'file', fileName: fileFsPath }, formatSettings, preferences);\n action.edit = { changes: createUriMappingForEdits(response.slice(), service) };\n }\n\n delete action.data;\n return action;\n },\n format(doc: TextDocument, range: Range, formatParams: FormattingOptions): TextEdit[] {\n const { scriptDoc, service } = updateCurrentVueTextDocument(doc);\n\n const defaultFormatter =\n scriptDoc.languageId === 'javascript'\n ? env.getConfig().vetur.format.defaultFormatter.js\n : env.getConfig().vetur.format.defaultFormatter.ts;\n\n if (defaultFormatter === 'none') {\n return [];\n }\n\n const parser = scriptDoc.languageId === 'javascript' ? 'babel' : 'typescript';\n const needInitialIndent = env.getConfig().vetur.format.scriptInitialIndent;\n const vlsFormatConfig: VLSFormatConfig = env.getConfig().vetur.format;\n\n if (\n defaultFormatter === 'prettier' ||\n defaultFormatter === 'prettier-eslint' ||\n defaultFormatter === 'prettier-tslint'\n ) {\n const code = doc.getText(range);\n const filePath = getFileFsPath(scriptDoc.uri);\n let doFormat;\n if (defaultFormatter === 'prettier-eslint') {\n doFormat = prettierEslintify;\n } else if (defaultFormatter === 'prettier-tslint') {\n doFormat = prettierTslintify;\n } else {\n doFormat = prettierify;\n }\n return doFormat(\n dependencyService,\n code,\n filePath,\n scriptDoc.languageId,\n range,\n vlsFormatConfig,\n needInitialIndent\n );\n } else {\n const initialIndentLevel = needInitialIndent ? 1 : 0;\n const formatSettings: ts.FormatCodeSettings =\n scriptDoc.languageId === 'javascript' ? env.getConfig().javascript.format : env.getConfig().typescript.format;\n const convertedFormatSettings = convertOptions(\n formatSettings,\n {\n tabSize: vlsFormatConfig.options.tabSize,\n insertSpaces: !vlsFormatConfig.options.useTabs\n },\n initialIndentLevel\n );\n\n const fileFsPath = getFileFsPath(doc.uri);\n const start = scriptDoc.offsetAt(range.start);\n const end = scriptDoc.offsetAt(range.end);\n const edits = service.getFormattingEditsForRange(fileFsPath, start, end, convertedFormatSettings);\n\n if (!edits) {\n return [];\n }\n const result = [];\n for (const edit of edits) {\n if (edit.span.start >= start && edit.span.start + edit.span.length <= end) {\n result.push({\n range: convertRange(scriptDoc, edit.span),\n newText: edit.newText\n });\n }\n }\n return result;\n }\n },\n onDocumentRemoved(document: TextDocument) {\n jsDocuments.onDocumentRemoved(document);\n },\n onDocumentChanged(filePath: string) {\n serviceHost.updateExternalDocument(filePath);\n },\n getRenameFileEdit(rename: FileRename): TextDocumentEdit[] {\n const oldPath = getFileFsPath(rename.oldUri);\n const newPath = getFileFsPath(rename.newUri);\n\n const service = serviceHost.getLanguageService();\n const program = service.getProgram();\n if (!program) {\n return [];\n }\n\n const sourceFile = program.getSourceFile(oldPath);\n if (!sourceFile) {\n return [];\n }\n\n const oldFileIsVue = isVueFile(oldPath);\n const formatSettings: ts.FormatCodeSettings = getFormatCodeSettings(env.getConfig());\n const preferences = getUserPreferencesByLanguageId(\n (sourceFile as any).scriptKind === tsModule.ScriptKind.JS ? 'javascript' : 'typescript'\n );\n\n // typescript use the filename of the source file to check for update\n // match it or it may not work on windows\n const normalizedOldPath = sourceFile.fileName;\n const edits = service.getEditsForFileRename(normalizedOldPath, newPath, formatSettings, preferences);\n\n const textDocumentEdit: TextDocumentEdit[] = [];\n for (const edit of edits) {\n const fileName = edit.fileName;\n if (isVirtualVueTemplateFile(fileName)) {\n continue;\n }\n const doc = getSourceDoc(fileName, program);\n const bothNotVueFile = !oldFileIsVue && !isVueFile(fileName);\n if (bothNotVueFile) {\n continue;\n }\n const docIdentifier = VersionedTextDocumentIdentifier.create(URI.file(doc.uri).toString(), 0);\n textDocumentEdit.push(\n ...edit.textChanges.map(({ span, newText }) => {\n const range = convertRange(doc, span);\n return TextDocumentEdit.create(docIdentifier, [TextEdit.replace(range, newText)]);\n })\n );\n }\n\n return textDocumentEdit;\n },\n getSemanticTokens(doc: TextDocument, range?: Range) {\n if (!tsModule.SemanticClassificationFormat?.TwentyTwenty) {\n return [];\n }\n const { scriptDoc, service } = updateCurrentVueTextDocument(doc);\n const scriptText = scriptDoc.getText();\n if (scriptText.trim().length > SEMANTIC_TOKEN_CONTENT_LENGTH_LIMIT) {\n return [];\n }\n\n const fileFsPath = getFileFsPath(doc.uri);\n const textSpan = range\n ? convertTextSpan(range, scriptDoc)\n : {\n start: 0,\n length: scriptText.length\n };\n const { spans } = service.getEncodedSemanticClassifications(\n fileFsPath,\n textSpan,\n tsModule.SemanticClassificationFormat?.TwentyTwenty\n );\n\n const data: SemanticTokenOffsetData[] = [];\n let index = 0;\n\n while (index < spans.length) {\n // [start, length, encodedClassification, start2, length2, encodedClassification2]\n const start = spans[index++];\n const length = spans[index++];\n const encodedClassification = spans[index++];\n const classificationType = getTokenTypeFromClassification(encodedClassification);\n if (classificationType < 0) {\n continue;\n }\n\n const modifierSet = getTokenModifierFromClassification(encodedClassification);\n\n data.push({\n start,\n length,\n classificationType,\n modifierSet\n });\n }\n\n const program = service.getProgram();\n if (program) {\n const refTokens = addCompositionApiRefTokens(tsModule, program, fileFsPath, data, refTokensService);\n refTokensService.send(\n doc.uri,\n refTokens.map(t => Range.create(scriptDoc.positionAt(t[0]), scriptDoc.positionAt(t[1])))\n );\n }\n\n return data.map(({ start, ...rest }) => {\n const startPosition = scriptDoc.positionAt(start);\n\n return {\n ...rest,\n line: startPosition.line,\n character: startPosition.character\n };\n });\n },\n dispose() {\n jsDocuments.dispose();\n }\n };\n}\n\nfunction provideRefactoringCodeActions(\n uri: string,\n languageId: LanguageId,\n fileName: string,\n textRange: { pos: number; end: number },\n context: CodeActionContext,\n preferences: ts.UserPreferences,\n service: ts.LanguageService,\n result: CodeAction[]\n) {\n if (\n context.only &&\n !context.only.some(el =>\n [\n CodeActionKind.Refactor,\n CodeActionKind.RefactorExtract,\n CodeActionKind.RefactorInline,\n CodeActionKind.RefactorRewrite\n ].includes(el)\n )\n ) {\n return;\n }\n\n const refactorings = service.getApplicableRefactors(\n fileName,\n textRange,\n preferences,\n !context.only ? undefined : 'invoked'\n );\n\n const actions: RefactorActionData[] = [];\n for (const refactoring of refactorings) {\n const refactorName = refactoring.name;\n if (refactoring.inlineable) {\n actions.push({\n uri,\n kind: CodeActionDataKind.RefactorAction,\n languageId,\n textRange,\n refactorName,\n actionName: refactorName,\n description: refactoring.description\n });\n } else {\n actions.push(\n ...refactoring.actions.map(action => ({\n uri,\n kind: CodeActionDataKind.RefactorAction as const,\n languageId,\n textRange,\n refactorName,\n actionName: action.name,\n description: action.description,\n notApplicableReason: action.notApplicableReason\n }))\n );\n }\n }\n for (const action of actions) {\n result.push({\n title: action.description,\n kind: getCodeActionKind(action),\n disabled: action.notApplicableReason ? { reason: action.notApplicableReason } : undefined,\n data: action\n });\n }\n}\n\nfunction provideQuickFixCodeActions(\n uri: string,\n languageId: LanguageId,\n fileName: string,\n textRange: { pos: number; end: number },\n context: CodeActionContext,\n supportedCodeFixCodes: Set<number>,\n formatSettings: ts.FormatCodeSettings,\n preferences: ts.UserPreferences,\n service: ts.LanguageService,\n result: CodeAction[]\n) {\n if (context.only && !context.only.includes(CodeActionKind.QuickFix)) {\n return;\n }\n\n const fixableDiagnosticCodes = context.diagnostics.map(d => +d.code!).filter(c => supportedCodeFixCodes.has(c));\n if (!fixableDiagnosticCodes) {\n return;\n }\n\n const fixes = service.getCodeFixesAtPosition(\n fileName,\n textRange.pos,\n textRange.end,\n fixableDiagnosticCodes,\n formatSettings,\n preferences\n );\n\n for (const fix of fixes) {\n const uriTextEditMapping = createUriMappingForEdits(fix.changes, service);\n result.push({\n title: fix.description,\n kind: CodeActionKind.QuickFix,\n diagnostics: context.diagnostics,\n edit: {\n changes: uriTextEditMapping\n }\n });\n\n if (fix.fixAllDescription && fix.fixId) {\n result.push({\n title: fix.fixAllDescription,\n kind: CodeActionKind.QuickFix,\n diagnostics: context.diagnostics,\n data: {\n uri,\n languageId,\n kind: CodeActionDataKind.CombinedCodeFix,\n textRange,\n fixId: fix.fixId\n }\n });\n }\n }\n}\n\nfunction provideOrganizeImports(\n uri: string,\n languageId: LanguageId,\n textRange: { pos: number; end: number },\n context: CodeActionContext,\n result: CodeAction[]\n) {\n if (\n !context.only ||\n (!context.only.includes(CodeActionKind.SourceOrganizeImports) && !context.only.includes(CodeActionKind.Source))\n ) {\n return;\n }\n\n result.push({\n title: 'Organize Imports',\n kind: CodeActionKind.SourceOrganizeImports,\n data: {\n uri,\n languageId,\n textRange,\n kind: CodeActionDataKind.OrganizeImports\n } as OrganizeImportsActionData\n });\n}\n\nfunction createUriMappingForEdits(changes: ts.FileTextChanges[], service: ts.LanguageService) {\n const program = service.getProgram()!;\n const result: Record<string, TextEdit[]> = {};\n for (const { fileName, textChanges } of changes) {\n const targetDoc = getSourceDoc(fileName, program);\n const edits = textChanges.map(({ newText, span }) => ({\n newText,\n range: convertRange(targetDoc, span)\n }));\n const uri = URI.file(fileName).toString();\n if (result[uri]) {\n result[uri].push(...edits);\n } else {\n result[uri] = edits;\n }\n }\n return result;\n}\n\nfunction getSourceDoc(fileName: string, program: ts.Program): TextDocument {\n const sourceFile = program.getSourceFile(fileName)!;\n return TextDocument.create(fileName, 'vue', 0, sourceFile.getFullText());\n}\n\nexport function languageServiceIncludesFile(ls: ts.LanguageService, documentUri: string): boolean {\n const filePaths = ls.getProgram()!.getRootFileNames();\n const filePath = getFilePath(documentUri);\n return filePaths.includes(filePath);\n}\n\nfunction convertRange(document: TextDocument, span: ts.TextSpan): Range {\n const startPosition = document.positionAt(span.start);\n const endPosition = document.positionAt(span.start + span.length);\n return Range.create(startPosition, endPosition);\n}\n\nfunction convertOptions(\n formatSettings: ts.FormatCodeSettings,\n options: FormattingOptions,\n initialIndentLevel: number\n): ts.FormatCodeSettings {\n return _.assign(formatSettings, {\n convertTabsToSpaces: options.insertSpaces,\n tabSize: options.tabSize,\n indentSize: options.tabSize,\n baseIndentSize: options.tabSize * initialIndentLevel\n });\n}\n\nexport function getFormatCodeSettings(config: any): ts.FormatCodeSettings {\n return {\n tabSize: config.vetur.format.options.tabSize,\n indentSize: config.vetur.format.options.tabSize,\n convertTabsToSpaces: !config.vetur.format.options.useTabs,\n insertSpaceAfterCommaDelimiter: true\n };\n}\n\n// Parameter must to be string, Otherwise I don't like it semantically.\nfunction getTsTriggerCharacter(triggerChar: string) {\n const legalChars = ['@', '#', '.', '\"', \"'\", '`', '/', '<'];\n if (legalChars.includes(triggerChar)) {\n return triggerChar as ts.CompletionsTriggerCharacter;\n }\n return undefined;\n}\n\nfunction convertCodeAction(doc: TextDocument, codeActions: ts.CodeAction[], regionStart: LanguageRange): TextEdit[] {\n const scriptStartOffset = doc.offsetAt(regionStart.start);\n const textEdits: TextEdit[] = [];\n for (const action of codeActions) {\n for (const change of action.changes) {\n textEdits.push(\n ...change.textChanges.map(tc => {\n // currently, only import codeAction is available\n // change start of doc to start of script region\n if (tc.span.start <= scriptStartOffset && tc.span.length === 0) {\n if (regionStart) {\n const line = regionStart.start.line;\n return {\n range: Range.create(line + 1, 0, line + 1, 0),\n newText: tc.newText\n };\n }\n }\n return {\n range: convertRange(doc, tc.span),\n newText: tc.newText\n };\n })\n );\n }\n }\n return textEdits;\n}\n\nfunction parseKindModifier(kindModifiers: string) {\n const kinds = new Set(kindModifiers.split(/,|\\s+/g));\n\n return {\n optional: kinds.has('optional'),\n deprecated: kinds.has('deprecated'),\n color: kinds.has('color')\n };\n}\n\nfunction convertTSDiagnosticCategoryToDiagnosticSeverity(\n tsModule: RuntimeLibrary['typescript'],\n c: ts.DiagnosticCategory\n) {\n switch (c) {\n case tsModule.DiagnosticCategory.Error:\n return DiagnosticSeverity.Error;\n case tsModule.DiagnosticCategory.Warning:\n return DiagnosticSeverity.Warning;\n case tsModule.DiagnosticCategory.Message:\n return DiagnosticSeverity.Information;\n case tsModule.DiagnosticCategory.Suggestion:\n return DiagnosticSeverity.Hint;\n default:\n return DiagnosticSeverity.Error;\n }\n}\n\n/* tslint:disable:max-line-length */\n/**\n * Adapted from https://github.com/microsoft/vscode/blob/2b090abd0fdab7b21a3eb74be13993ad61897f84/extensions/typescript-language-features/src/languageFeatures/completions.ts#L147-L181\n */\nfunction getFilterText(insertText: string | undefined): string | undefined {\n // For `this.` completions, generally don't set the filter text since we don't want them to be overly prioritized. #74164\n if (insertText?.startsWith('this.')) {\n return undefined;\n }\n\n // Handle the case:\n // ```\n // const xyz = { 'ab c': 1 };\n // xyz.ab|\n // ```\n // In which case we want to insert a bracket accessor but should use `.abc` as the filter text instead of\n // the bracketed insert text.\n else if (insertText?.startsWith('[')) {\n return insertText.replace(/^\\[['\"](.+)[['\"]\\]$/, '.$1');\n }\n\n // In all other cases, fallback to using the insertText\n return insertText;\n}\n\nfunction getFoldingRangeKind(span: ts.OutliningSpan): FoldingRangeKind | undefined {\n switch (span.kind) {\n case 'comment':\n return FoldingRangeKind.Comment;\n case 'region':\n return FoldingRangeKind.Region;\n case 'imports':\n return FoldingRangeKind.Imports;\n case 'code':\n default:\n return undefined;\n }\n}\n\nfunction convertTextSpan(range: Range, doc: TextDocument): ts.TextSpan {\n const start = doc.offsetAt(range.start);\n const end = doc.offsetAt(range.end);\n\n return {\n start,\n length: end - start\n };\n}\n", "import _ from 'lodash';\nimport type ts from 'typescript';\nimport { BasicComponentInfo } from '../../config';\nimport { RuntimeLibrary } from '../../services/dependencyService';\nimport {\n VueFileInfo,\n EmitInfo,\n PropInfo,\n ComputedInfo,\n DataInfo,\n MethodInfo,\n ChildComponent\n} from '../../services/vueInfoService';\nimport { VueVersion } from '../../utils/vueVersion';\nimport { analyzeComponentsDefine } from './childComponents';\nimport { getGlobalComponents } from './globalComponents';\n\nexport function getComponentInfo(\n tsModule: RuntimeLibrary['typescript'],\n service: ts.LanguageService,\n fileFsPath: string,\n globalComponentInfos: BasicComponentInfo[],\n vueVersion: VueVersion,\n config: any\n): VueFileInfo | undefined {\n const program = service.getProgram();\n if (!program) {\n return undefined;\n }\n\n const sourceFile = program.getSourceFile(fileFsPath);\n if (!sourceFile) {\n return undefined;\n }\n\n const checker = program.getTypeChecker();\n\n const defaultExportNode = getDefaultExportNode(tsModule, sourceFile);\n if (!defaultExportNode) {\n return undefined;\n }\n\n const vueFileInfo = analyzeDefaultExportExpr(tsModule, defaultExportNode, checker, vueVersion);\n\n const defaultExportType = checker.getTypeAtLocation(defaultExportNode);\n const componentsDefineInfo = analyzeComponentsDefine(\n tsModule,\n defaultExportType,\n checker,\n config.vetur.completion.tagCasing\n );\n\n if (componentsDefineInfo) {\n const { list: internalChildComponents, ...defineInfo } = componentsDefineInfo;\n const childComponents: ChildComponent[] = [];\n internalChildComponents.forEach(c => {\n childComponents.push({\n name: c.name,\n documentation: c.documentation,\n definition: c.definition,\n global: false,\n info: c.defaultExportNode\n ? analyzeDefaultExportExpr(tsModule, c.defaultExportNode, checker, vueVersion)\n : undefined\n });\n });\n vueFileInfo.componentInfo.childComponents = childComponents;\n vueFileInfo.componentInfo.componentsDefine = defineInfo;\n }\n\n const globalComponents = getGlobalComponents(\n tsModule,\n service,\n globalComponentInfos,\n config.vetur.completion.tagCasing\n );\n if (globalComponents.length > 0) {\n vueFileInfo.componentInfo.childComponents = [\n ...(vueFileInfo.componentInfo.childComponents ?? []),\n ...globalComponents.map(c => ({\n name: c.name,\n documentation: c.documentation,\n definition: c.definition,\n global: true,\n info: c.defaultExportNode\n ? analyzeDefaultExportExpr(tsModule, c.defaultExportNode, checker, vueVersion)\n : undefined\n }))\n ];\n }\n\n return vueFileInfo;\n}\n\nexport function analyzeDefaultExportExpr(\n tsModule: RuntimeLibrary['typescript'],\n defaultExportNode: ts.Node,\n checker: ts.TypeChecker,\n vueVersion: VueVersion\n): VueFileInfo {\n const defaultExportType = checker.getTypeAtLocation(defaultExportNode);\n\n const insertInOptionAPIPos = getInsertInOptionAPIPos(tsModule, defaultExportType, checker);\n const emits = getEmits(tsModule, defaultExportType, checker);\n const props = getProps(tsModule, defaultExportType, checker, vueVersion);\n const data = getData(tsModule, defaultExportType, checker);\n const computed = getComputed(tsModule, defaultExportType, checker);\n const methods = getMethods(tsModule, defaultExportType, checker);\n\n return {\n componentInfo: {\n insertInOptionAPIPos,\n emits,\n props,\n data,\n computed,\n methods\n }\n };\n}\n\nexport function getDefaultExportNode(\n tsModule: RuntimeLibrary['typescript'],\n sourceFile: ts.SourceFile\n): ts.Node | undefined {\n const exportStmts = sourceFile.statements.filter(\n st => st.kind === tsModule.SyntaxKind.ExportAssignment || st.kind === tsModule.SyntaxKind.ClassDeclaration\n );\n if (exportStmts.length === 0) {\n return undefined;\n }\n const exportNode =\n exportStmts[0].kind === tsModule.SyntaxKind.ExportAssignment\n ? (exportStmts[0] as ts.ExportAssignment).expression\n : (exportStmts[0] as ts.ClassDeclaration);\n\n return getNodeFromExportNode(tsModule, exportNode);\n}\n\nfunction getInsertInOptionAPIPos(\n tsModule: RuntimeLibrary['typescript'],\n defaultExportType: ts.Type,\n checker: ts.TypeChecker\n) {\n if (isClassType(tsModule, defaultExportType)) {\n const decoratorArgumentType = getClassDecoratorArgumentType(tsModule, defaultExportType, checker);\n if (decoratorArgumentType && decoratorArgumentType.symbol.valueDeclaration) {\n return decoratorArgumentType.symbol.valueDeclaration.getStart() + 1;\n }\n } else if (defaultExportType.symbol?.valueDeclaration) {\n return defaultExportType.symbol.valueDeclaration.getStart() + 1;\n }\n return undefined;\n}\n\nfunction getDecorators(\n tsModule: RuntimeLibrary['typescript'],\n node: ts.MethodDeclaration | ts.PropertyDeclaration | undefined\n) {\n if (!node) return undefined;\n return tsModule.getDecorators?.(node) ?? node.decorators;\n}\n\nfunction getEmits(\n tsModule: RuntimeLibrary['typescript'],\n defaultExportType: ts.Type,\n checker: ts.TypeChecker\n): EmitInfo[] | undefined {\n // When there is @Emit and emits option both, use only emits option.\n const result: EmitInfo[] = getClassAndObjectInfo(\n tsModule,\n defaultExportType,\n checker,\n getClassEmits,\n getObjectEmits,\n true\n );\n\n return result.length === 0 ? undefined : result;\n\n function getEmitValidatorInfo(propertyValue: ts.Node): { hasValidator: boolean; typeString?: string } {\n /**\n * case `foo: null`\n */\n if (propertyValue.kind === tsModule.SyntaxKind.NullKeyword) {\n return { hasValidator: false };\n }\n\n /**\n * case `foo: function() {}` or `foo: () => {}`\n */\n if (tsModule.isFunctionExpression(propertyValue) || tsModule.isArrowFunction(propertyValue)) {\n let typeParameterText = '';\n if (propertyValue.typeParameters) {\n typeParameterText = `<${propertyValue.typeParameters.map(tp => tp.getText()).join(', ')}>`;\n }\n const parameterText = `(${propertyValue.parameters\n .map(p => `${p.getText()}${p.type ? '' : ': any'}`)\n .join(', ')})`;\n const typeString = `${typeParameterText}${parameterText} => any`;\n return { hasValidator: true, typeString };\n }\n\n return { hasValidator: false };\n }\n\n function getClassEmits(type: ts.Type) {\n const emitDecoratorNames = ['Emit'];\n const emitsSymbols = type\n .getProperties()\n .filter(\n property =>\n validPropertySyntaxKind(property, tsModule.SyntaxKind.MethodDeclaration) &&\n getPropertyDecoratorNames(tsModule, property).some(decoratorName =>\n emitDecoratorNames.includes(decoratorName)\n )\n );\n if (emitsSymbols.length === 0) {\n return undefined;\n }\n\n // There maybe same emit name because @Emit can be put on multiple methods.\n const emitInfoMap = new Map<string, EmitInfo>();\n emitsSymbols.forEach(emitSymbol => {\n const emit = emitSymbol.valueDeclaration as ts.MethodDeclaration;\n const decoratorExpr = getDecorators(tsModule, emit)?.find(decorator =>\n tsModule.isCallExpression(decorator.expression)\n ? emitDecoratorNames.includes(decorator.expression.expression.getText())\n : false\n )?.expression as ts.CallExpression;\n const decoratorArgs = decoratorExpr.arguments;\n\n let name = _.kebabCase(emitSymbol.name);\n if (decoratorArgs.length > 0) {\n const firstNode = decoratorArgs[0];\n if (tsModule.isStringLiteral(firstNode)) {\n name = firstNode.text;\n }\n }\n\n let typeString: string | undefined = undefined;\n const signature = checker.getSignatureFromDeclaration(emit);\n if (signature) {\n const returnType = checker.getReturnTypeOfSignature(signature);\n typeString = `(${checker.typeToString(returnType)})`;\n if (typeString === '(void)') {\n typeString = '(undefined)';\n }\n }\n\n if (emitInfoMap.has(name)) {\n const oldEmitInfo = emitInfoMap.get(name)!;\n if (typeString) {\n // create union type\n oldEmitInfo.typeString += ` | ${typeString}`;\n } else {\n // remove type (because it failed to obtain the type)\n oldEmitInfo.typeString = undefined;\n }\n oldEmitInfo.documentation += `\\n\\n${buildDocumentation(tsModule, emitSymbol, checker)}`;\n emitInfoMap.set(name, oldEmitInfo);\n } else {\n emitInfoMap.set(name, {\n name,\n hasValidator: false,\n typeString,\n documentation: buildDocumentation(tsModule, emitSymbol, checker)\n });\n }\n });\n\n const emitInfo = [...emitInfoMap.values()];\n emitInfo.forEach(info => {\n if (info.typeString) {\n info.typeString = `(arg: ${info.typeString}) => any`;\n }\n });\n\n return emitInfo;\n }\n\n function getObjectEmits(type: ts.Type) {\n const emitsSymbol = checker.getPropertyOfType(type, 'emits');\n if (!emitsSymbol || !emitsSymbol.valueDeclaration) {\n return undefined;\n }\n\n const emitsDeclaration = getLastChild(emitsSymbol.valueDeclaration);\n if (!emitsDeclaration) {\n return undefined;\n }\n\n /**\n * Plain array emits like `emits: ['foo', 'bar']`\n */\n if (emitsDeclaration.kind === tsModule.SyntaxKind.ArrayLiteralExpression) {\n return (emitsDeclaration as ts.ArrayLiteralExpression).elements\n .filter(expr => expr.kind === tsModule.SyntaxKind.StringLiteral)\n .map(expr => {\n return {\n name: (expr as ts.StringLiteral).text,\n hasValidator: false,\n documentation: `\\`\\`\\`js\\n${formatJSLikeDocumentation(\n emitsDeclaration.parent.getFullText().trim()\n )}\\n\\`\\`\\`\\n`\n };\n });\n }\n\n /**\n * Object literal emits like\n * ```\n * {\n * emits: {\n * foo: () => true,\n * bar: (arg1: string, arg2: number) => arg1.startsWith('s') || arg2 > 0,\n * car: null\n * }\n * }\n * ```\n */\n if (emitsDeclaration.kind === tsModule.SyntaxKind.ObjectLiteralExpression) {\n const emitsType = checker.getTypeOfSymbolAtLocation(emitsSymbol, emitsDeclaration);\n\n return checker.getPropertiesOfType(emitsType).map(s => {\n const node = getNodeFromSymbol(s);\n const status =\n node !== undefined && tsModule.isPropertyAssignment(node)\n ? getEmitValidatorInfo(node.initializer)\n : { hasValidator: false };\n\n return {\n name: s.name,\n ...status,\n documentation: buildDocumentation(tsModule, s, checker)\n };\n });\n }\n\n return undefined;\n }\n}\n\nfunction getProps(\n tsModule: RuntimeLibrary['typescript'],\n defaultExportType: ts.Type,\n checker: ts.TypeChecker,\n vueVersion: VueVersion\n): PropInfo[] | undefined {\n const result: PropInfo[] = markPropBoundToModel(\n defaultExportType,\n getClassAndObjectInfo(tsModule, defaultExportType, checker, getClassProps, getObjectProps)\n );\n\n return result.length === 0 ? undefined : result;\n\n function markPropBoundToModel(type: ts.Type, props: PropInfo[]) {\n const vModelPropName = vueVersion === VueVersion.V30 ? 'modelValue' : 'value';\n\n function markValuePropBoundToModel() {\n return props.map(prop => {\n if (prop.name === vModelPropName) {\n prop.isBoundToModel = true;\n }\n return prop;\n });\n }\n\n const modelSymbol = checker.getPropertyOfType(type, 'model');\n const modelValue = (modelSymbol?.valueDeclaration as ts.PropertyAssignment)?.initializer;\n // Set value prop when no model def\n if (!modelSymbol || !modelValue) {\n return markValuePropBoundToModel();\n }\n\n const modelType = checker.getTypeOfSymbolAtLocation(modelSymbol, modelValue);\n const modelPropSymbol = checker.getPropertyOfType(modelType, 'prop');\n const modelPropValue = (modelPropSymbol?.valueDeclaration as ts.PropertyAssignment)?.initializer;\n if (!modelPropValue || !tsModule.isStringLiteral(modelPropValue)) {\n return markValuePropBoundToModel();\n }\n\n return props.map(prop => {\n if (prop.name === modelPropValue.text) {\n prop.isBoundToModel = true;\n }\n return prop;\n });\n }\n\n function getPropValidatorInfo(propertyValue: ts.Node | undefined): {\n hasObjectValidator: boolean;\n required: boolean;\n typeString?: string;\n } {\n if (!propertyValue) {\n return { hasObjectValidator: false, required: true };\n }\n\n let typeString: string | undefined = undefined;\n let typeDeclaration: ts.Identifier | ts.AsExpression | undefined = undefined;\n\n /**\n * case `foo: { type: String }`\n * extract type value: `String`\n */\n if (tsModule.isObjectLiteralExpression(propertyValue)) {\n const propertyValueSymbol = checker.getTypeAtLocation(propertyValue).symbol;\n const typeValue = propertyValueSymbol?.members?.get('type' as ts.__String)?.valueDeclaration;\n if (typeValue && tsModule.isPropertyAssignment(typeValue)) {\n if (tsModule.isIdentifier(typeValue.initializer) || tsModule.isAsExpression(typeValue.initializer)) {\n typeDeclaration = typeValue.initializer;\n }\n }\n } else {\n /**\n * case `foo: String`\n * extract type value: `String`\n */\n if (tsModule.isIdentifier(propertyValue) || tsModule.isAsExpression(propertyValue)) {\n typeDeclaration = propertyValue;\n }\n }\n\n if (typeDeclaration) {\n /**\n * `String` case\n *\n * Per https://vuejs.org/v2/guide/components-props.html#Type-Checks, handle:\n *\n * String\n * Number\n * Boolean\n * Array\n * Object\n * Date\n * Function\n * Symbol\n */\n if (tsModule.isIdentifier(typeDeclaration)) {\n const vueTypeCheckConstructorToTSType: Record<string, string> = {\n String: 'string',\n Number: 'number',\n Boolean: 'boolean',\n Array: 'any[]',\n Object: 'object',\n Date: 'Date',\n Function: 'Function',\n Symbol: 'Symbol'\n };\n const vueTypeString = typeDeclaration.getText();\n if (vueTypeCheckConstructorToTSType[vueTypeString]) {\n typeString = vueTypeCheckConstructorToTSType[vueTypeString];\n }\n } else if (\n /**\n * `String as PropType<'a' | 'b'>` case\n */\n tsModule.isAsExpression(typeDeclaration) &&\n tsModule.isTypeReferenceNode(typeDeclaration.type) &&\n ['PropType', 'Vue.PropType'].includes(typeDeclaration.type.typeName.getText()) &&\n typeDeclaration.type.typeArguments &&\n typeDeclaration.type.typeArguments[0]\n ) {\n const extractedPropType = typeDeclaration.type.typeArguments[0];\n typeString = extractedPropType.getText();\n }\n }\n\n if (\n !propertyValue ||\n (!tsModule.isObjectLiteralExpression(propertyValue) && !tsModule.isIdentifier(propertyValue))\n ) {\n return { hasObjectValidator: false, required: true, typeString };\n }\n\n const propertyValueSymbol = checker.getTypeAtLocation(propertyValue).symbol;\n const requiredValue = propertyValueSymbol?.members?.get('required' as ts.__String)?.valueDeclaration;\n const defaultValue = propertyValueSymbol?.members?.get('default' as ts.__String)?.valueDeclaration;\n if (!requiredValue && !defaultValue) {\n return { hasObjectValidator: false, required: true, typeString };\n }\n\n const required = Boolean(\n requiredValue &&\n tsModule.isPropertyAssignment(requiredValue) &&\n requiredValue?.initializer.kind === tsModule.SyntaxKind.TrueKeyword\n );\n\n return { hasObjectValidator: true, required, typeString };\n }\n\n function getClassProps(type: ts.Type) {\n const propDecoratorNames = ['Prop', 'Model', 'PropSync'];\n const propsSymbols = type\n .getProperties()\n .filter(\n property =>\n validPropertySyntaxKind(property, tsModule.SyntaxKind.PropertyDeclaration) &&\n getPropertyDecoratorNames(tsModule, property).some(decoratorName =>\n propDecoratorNames.includes(decoratorName)\n )\n );\n if (propsSymbols.length === 0) {\n return undefined;\n }\n\n return propsSymbols.map(propSymbol => {\n const prop = propSymbol.valueDeclaration as ts.PropertyDeclaration;\n const decoratorExpr = getDecorators(tsModule, prop)?.find(decorator =>\n tsModule.isCallExpression(decorator.expression)\n ? propDecoratorNames.includes(decorator.expression.expression.getText())\n : false\n )?.expression as ts.CallExpression;\n const decoratorName = decoratorExpr.expression.getText();\n const [firstNode, secondNode] = decoratorExpr.arguments;\n if (decoratorName === 'PropSync' && tsModule.isStringLiteral(firstNode)) {\n return {\n name: firstNode.text,\n ...getPropValidatorInfo(secondNode),\n isBoundToModel: false,\n documentation: buildDocumentation(tsModule, propSymbol, checker)\n };\n }\n\n return {\n name: propSymbol.name,\n ...getPropValidatorInfo(decoratorName === 'Model' ? secondNode : firstNode),\n isBoundToModel: decoratorName === 'Model',\n documentation: buildDocumentation(tsModule, propSymbol, checker)\n };\n });\n }\n\n function getObjectProps(type: ts.Type) {\n const propsSymbol = checker.getPropertyOfType(type, 'props');\n if (!propsSymbol || !propsSymbol.valueDeclaration) {\n return undefined;\n }\n\n const propsDeclaration = getLastChild(propsSymbol.valueDeclaration);\n if (!propsDeclaration) {\n return undefined;\n }\n\n /**\n * Plain array props like `props: ['foo', 'bar']`\n */\n if (propsDeclaration.kind === tsModule.SyntaxKind.ArrayLiteralExpression) {\n return (propsDeclaration as ts.ArrayLiteralExpression).elements\n .filter(expr => expr.kind === tsModule.SyntaxKind.StringLiteral)\n .map(expr => {\n return {\n name: (expr as ts.StringLiteral).text,\n hasObjectValidator: false,\n required: true,\n isBoundToModel: false,\n documentation: `\\`\\`\\`js\\n${formatJSLikeDocumentation(\n propsDeclaration.parent.getFullText().trim()\n )}\\n\\`\\`\\`\\n`\n };\n });\n }\n\n /**\n * Object literal props like\n * ```\n * {\n * props: {\n * foo: { type: Boolean, default: true },\n * bar: { type: String, default: 'bar' },\n * car: String\n * }\n * }\n * ```\n */\n if (propsDeclaration.kind === tsModule.SyntaxKind.ObjectLiteralExpression) {\n const propsType = checker.getTypeOfSymbolAtLocation(propsSymbol, propsDeclaration);\n\n return checker.getPropertiesOfType(propsType).map(s => {\n const node = getNodeFromSymbol(s);\n const status =\n node !== undefined && tsModule.isPropertyAssignment(node)\n ? getPropValidatorInfo(node.initializer)\n : { hasObjectValidator: false, required: true };\n\n return {\n name: s.name,\n ...status,\n isBoundToModel: false,\n documentation: buildDocumentation(tsModule, s, checker)\n };\n });\n }\n\n return undefined;\n }\n}\n\n/**\n * In SFC, data can only be a function\n * ```\n * {\n * data() {\n * return {\n * foo: true,\n * bar: 'bar'\n * }\n * }\n * }\n * ```\n */\nfunction getData(\n tsModule: RuntimeLibrary['typescript'],\n defaultExportType: ts.Type,\n checker: ts.TypeChecker\n): DataInfo[] | undefined {\n const result: DataInfo[] = getClassAndObjectInfo(tsModule, defaultExportType, checker, getClassData, getObjectData);\n return result.length === 0 ? undefined : result;\n\n function getClassData(type: ts.Type) {\n const noDataDecoratorNames = ['Prop', 'Model', 'Provide', 'ProvideReactive', 'Ref'];\n const dataSymbols = type\n .getProperties()\n .filter(\n property =>\n validPropertySyntaxKind(property, tsModule.SyntaxKind.PropertyDeclaration) &&\n !getPropertyDecoratorNames(tsModule, property).some(decoratorName =>\n noDataDecoratorNames.includes(decoratorName)\n ) &&\n !property.name.startsWith('_') &&\n !property.name.startsWith('$')\n );\n if (dataSymbols.length === 0) {\n return undefined;\n }\n\n return dataSymbols.map(data => {\n return {\n name: data.name,\n documentation: buildDocumentation(tsModule, data, checker)\n };\n });\n }\n\n function getObjectData(type: ts.Type) {\n const dataSymbol = checker.getPropertyOfType(type, 'data');\n if (!dataSymbol || !dataSymbol.valueDeclaration) {\n return undefined;\n }\n\n const dataType = checker.getTypeOfSymbolAtLocation(dataSymbol, dataSymbol.valueDeclaration);\n const dataSignatures = dataType.getCallSignatures();\n if (dataSignatures.length === 0) {\n return undefined;\n }\n const dataReturnTypeProperties = checker.getReturnTypeOfSignature(dataSignatures[0]);\n return dataReturnTypeProperties.getProperties().map(s => {\n return {\n name: s.name,\n documentation: buildDocumentation(tsModule, s, checker)\n };\n });\n }\n}\n\nfunction getComputed(\n tsModule: RuntimeLibrary['typescript'],\n defaultExportType: ts.Type,\n checker: ts.TypeChecker\n): ComputedInfo[] | undefined {\n const result: ComputedInfo[] = getClassAndObjectInfo(\n tsModule,\n defaultExportType,\n checker,\n getClassComputed,\n getObjectComputed\n );\n return result.length === 0 ? undefined : result;\n\n function getClassComputed(type: ts.Type) {\n const getAccessorSymbols = type\n .getProperties()\n .filter(property => property.valueDeclaration?.kind === tsModule.SyntaxKind.GetAccessor);\n const setAccessorSymbols = defaultExportType\n .getProperties()\n .filter(property => property.valueDeclaration?.kind === tsModule.SyntaxKind.SetAccessor);\n if (getAccessorSymbols.length === 0) {\n return undefined;\n }\n\n return getAccessorSymbols.map(computed => {\n const setComputed = setAccessorSymbols.find(setAccessor => setAccessor.name === computed.name);\n return {\n name: computed.name,\n documentation:\n buildDocumentation(tsModule, computed, checker) +\n (setComputed !== undefined ? buildDocumentation(tsModule, setComputed, checker) : '')\n };\n });\n }\n\n function getObjectComputed(type: ts.Type) {\n const computedSymbol = checker.getPropertyOfType(type, 'computed');\n if (!computedSymbol || !computedSymbol.valueDeclaration) {\n return undefined;\n }\n\n const computedDeclaration = getLastChild(computedSymbol.valueDeclaration);\n if (!computedDeclaration) {\n return undefined;\n }\n\n if (computedDeclaration.kind === tsModule.SyntaxKind.ObjectLiteralExpression) {\n const computedType = checker.getTypeOfSymbolAtLocation(computedSymbol, computedDeclaration);\n\n return checker.getPropertiesOfType(computedType).map(s => {\n return {\n name: s.name,\n documentation: buildDocumentation(tsModule, s, checker)\n };\n });\n }\n }\n}\n\nfunction isInternalHook(methodName: string) {\n const $internalHooks = [\n 'data',\n 'beforeCreate',\n 'created',\n 'beforeMount',\n 'mounted',\n 'beforeDestroy',\n 'destroyed',\n 'beforeUpdate',\n 'updated',\n 'activated',\n 'deactivated',\n 'render',\n 'errorCaptured', // 2.5\n 'serverPrefetch' // 2.6\n ];\n return $internalHooks.includes(methodName);\n}\n\nfunction getMethods(\n tsModule: RuntimeLibrary['typescript'],\n defaultExportType: ts.Type,\n checker: ts.TypeChecker\n): MethodInfo[] | undefined {\n const result: MethodInfo[] = getClassAndObjectInfo(\n tsModule,\n defaultExportType,\n checker,\n getClassMethods,\n getObjectMethods\n );\n return result.length === 0 ? undefined : result;\n\n function getClassMethods(type: ts.Type) {\n const methodSymbols = type\n .getProperties()\n .filter(\n property =>\n validPropertySyntaxKind(property, tsModule.SyntaxKind.MethodDeclaration) &&\n !getPropertyDecoratorNames(tsModule, property).some(decoratorName => decoratorName === 'Watch') &&\n !isInternalHook(property.name)\n );\n if (methodSymbols.length === 0) {\n return undefined;\n }\n\n return methodSymbols.map(method => {\n return {\n name: method.name,\n documentation: buildDocumentation(tsModule, method, checker)\n };\n });\n }\n\n function getObjectMethods(type: ts.Type) {\n const methodsSymbol = checker.getPropertyOfType(type, 'methods');\n if (!methodsSymbol || !methodsSymbol.valueDeclaration) {\n return undefined;\n }\n\n const methodsDeclaration = getLastChild(methodsSymbol.valueDeclaration);\n if (!methodsDeclaration) {\n return undefined;\n }\n\n if (methodsDeclaration.kind === tsModule.SyntaxKind.ObjectLiteralExpression) {\n const methodsType = checker.getTypeOfSymbolAtLocation(methodsSymbol, methodsDeclaration);\n\n return checker.getPropertiesOfType(methodsType).map(s => {\n return {\n name: s.name,\n documentation: buildDocumentation(tsModule, s, checker)\n };\n });\n }\n }\n}\n\nfunction getNodeFromExportNode(tsModule: RuntimeLibrary['typescript'], exportExpr: ts.Node): ts.Node | undefined {\n switch (exportExpr.kind) {\n case tsModule.SyntaxKind.CallExpression:\n // Vue.extend or synthetic __vueEditorBridge\n return (exportExpr as ts.CallExpression).arguments[0];\n case tsModule.SyntaxKind.ObjectLiteralExpression:\n return exportExpr as ts.ObjectLiteralExpression;\n case tsModule.SyntaxKind.ClassDeclaration:\n return exportExpr as ts.ClassDeclaration;\n }\n return undefined;\n}\n\nexport function getLastChild(d: ts.Declaration) {\n const children = d.getChildren();\n if (children.length === 0) {\n return undefined;\n }\n\n return children[children.length - 1];\n}\n\nexport function isClassType(tsModule: RuntimeLibrary['typescript'], type: ts.Type) {\n if (type.isClass === undefined) {\n return !!(\n (type.flags & tsModule.TypeFlags.Object ? (type as ts.ObjectType).objectFlags : 0) & tsModule.ObjectFlags.Class\n );\n } else {\n return type.isClass();\n }\n}\n\nexport function getClassDecoratorArgumentType(\n tsModule: RuntimeLibrary['typescript'],\n defaultExportNode: ts.Type,\n checker: ts.TypeChecker\n) {\n const decorators = getDecorators(tsModule, defaultExportNode.symbol.valueDeclaration as ts.PropertyDeclaration);\n if (!decorators || decorators.length === 0) {\n return undefined;\n }\n\n if (!tsModule.isCallExpression(decorators?.[0].expression)) {\n return undefined;\n }\n\n const decoratorArguments = decorators?.[0].expression?.arguments;\n if (!decoratorArguments || decoratorArguments.length === 0) {\n return undefined;\n }\n\n return checker.getTypeAtLocation(decoratorArguments[0]);\n}\n\nfunction getClassAndObjectInfo<C, O>(\n tsModule: RuntimeLibrary['typescript'],\n defaultExportType: ts.Type,\n checker: ts.TypeChecker,\n getClassResult: (type: ts.Type) => C[] | undefined,\n getObjectResult: (type: ts.Type) => O[] | undefined,\n onlyUseObjectResultIfExists = false\n) {\n const result: Array<C | O> = [];\n if (isClassType(tsModule, defaultExportType)) {\n const decoratorArgumentType = getClassDecoratorArgumentType(tsModule, defaultExportType, checker);\n if (decoratorArgumentType) {\n result.push.apply(result, getObjectResult(decoratorArgumentType) || []);\n }\n if (result.length === 0 || !onlyUseObjectResultIfExists) {\n result.push.apply(result, getClassResult(defaultExportType) || []);\n }\n } else {\n result.push.apply(result, getObjectResult(defaultExportType) || []);\n }\n return result;\n}\n\nfunction getNodeFromSymbol(property: ts.Symbol): ts.Declaration | undefined {\n return property.valueDeclaration ?? property.declarations?.[0];\n}\n\nfunction validPropertySyntaxKind(property: ts.Symbol, checkSyntaxKind: ts.SyntaxKind): boolean {\n return getNodeFromSymbol(property)?.kind === checkSyntaxKind;\n}\n\nfunction getPropertyDecoratorNames(tsModule: RuntimeLibrary['typescript'], property: ts.Symbol): string[] {\n const decorators = getDecorators(tsModule, getNodeFromSymbol(property) as ts.PropertyDeclaration);\n if (decorators === undefined) {\n return [];\n }\n\n return decorators\n .map(decorator => decorator.expression as ts.CallExpression)\n .filter(decoratorExpression => decoratorExpression.expression !== undefined)\n .map(decoratorExpression => decoratorExpression.expression.getText());\n}\n\nexport function buildDocumentation(tsModule: RuntimeLibrary['typescript'], s: ts.Symbol, checker: ts.TypeChecker) {\n let documentation = s\n .getDocumentationComment(checker)\n .map(d => d.text)\n .join('\\n');\n\n documentation += '\\n';\n\n const node = getNodeFromSymbol(s);\n if (node) {\n documentation += `\\`\\`\\`js\\n${formatJSLikeDocumentation(node.getText())}\\n\\`\\`\\`\\n`;\n }\n\n return documentation;\n}\n\nfunction formatJSLikeDocumentation(src: string): string {\n const segments = src.split('\\n');\n if (segments.length === 1) {\n return src;\n }\n\n const spacesToDeindent = segments[segments.length - 1].search(/\\S/);\n\n return (\n segments[0] +\n '\\n' +\n segments\n .slice(1)\n .map(s => s.slice(spacesToDeindent))\n .join('\\n')\n );\n}\n", "import { readFileSync } from 'fs';\n\nexport enum VueVersion {\n VPre25,\n V25,\n V30\n}\n\nfunction floatVersionToEnum(v: number) {\n if (v < 2.5) {\n return VueVersion.VPre25;\n } else if (v < 3.0) {\n return VueVersion.V25;\n } else {\n return VueVersion.V30;\n }\n}\n\nexport function getVueVersionKey(version: VueVersion) {\n return Object.keys(VueVersion)?.[Object.values(VueVersion).indexOf(version)];\n}\n\nexport function inferVueVersion(packagePath: string | undefined): VueVersion {\n const packageJSONPath = packagePath;\n try {\n if (!packageJSONPath) {\n throw new Error(`Can't find package.json in project`);\n }\n const packageJSON = packageJSONPath && JSON.parse(readFileSync(packageJSONPath, { encoding: 'utf-8' }));\n const vueDependencyVersion = packageJSON.dependencies?.vue || packageJSON.devDependencies?.vue;\n\n if (vueDependencyVersion) {\n // use a sloppy method to infer version, to reduce dep on semver or so\n const vueDep = vueDependencyVersion.match(/\\d+(\\.\\d+)?/)[0];\n const sloppyVersion = parseFloat(vueDep);\n return floatVersionToEnum(sloppyVersion);\n }\n\n const nodeModulesVuePackagePath = require.resolve('vue/package.json', { paths: [packageJSONPath] });\n const nodeModulesVuePackageJSON = JSON.parse(readFileSync(nodeModulesVuePackagePath, { encoding: 'utf-8' })!);\n const nodeModulesVueVersion = parseFloat(nodeModulesVuePackageJSON.version.match(/\\d+\\.\\d+/)[0]);\n\n return floatVersionToEnum(nodeModulesVueVersion);\n } catch (e) {\n console.error((e as Error).stack);\n return VueVersion.VPre25;\n }\n}\n", "import type ts from 'typescript';\nimport {\n getLastChild,\n buildDocumentation,\n getDefaultExportNode,\n getClassDecoratorArgumentType,\n isClassType\n} from './componentInfo';\nimport { kebabCase } from 'lodash';\nimport { RuntimeLibrary } from '../../services/dependencyService';\n\nexport interface InternalChildComponent {\n name: string;\n documentation?: string;\n definition?: {\n path: string;\n start: number;\n end: number;\n };\n defaultExportNode?: ts.Node;\n}\n\nexport function analyzeComponentsDefine(\n tsModule: RuntimeLibrary['typescript'],\n defaultExportType: ts.Type,\n checker: ts.TypeChecker,\n tagCasing = 'kebab'\n): { start: number; end: number; insertPos: number; list: InternalChildComponent[] } | undefined {\n let componentsSymbol: ts.Symbol | undefined;\n\n if (!isClassType(tsModule, defaultExportType)) {\n componentsSymbol = checker.getPropertyOfType(defaultExportType, 'components');\n } else {\n // get decorator argument type when class\n const classDecoratorArgumentType = getClassDecoratorArgumentType(tsModule, defaultExportType, checker);\n if (!classDecoratorArgumentType) {\n return undefined;\n }\n componentsSymbol = checker.getPropertyOfType(classDecoratorArgumentType, 'components');\n }\n\n if (!componentsSymbol || !componentsSymbol.valueDeclaration) {\n return undefined;\n }\n\n const componentsDeclaration = getLastChild(componentsSymbol.valueDeclaration);\n if (!componentsDeclaration) {\n return undefined;\n }\n\n if (componentsDeclaration.kind === tsModule.SyntaxKind.ObjectLiteralExpression) {\n const componentsType = checker.getTypeOfSymbolAtLocation(componentsSymbol, componentsDeclaration);\n\n let insertPos = componentsDeclaration.getStart(componentsDeclaration.getSourceFile(), true) + 1;\n const result: InternalChildComponent[] = [];\n checker.getPropertiesOfType(componentsType).forEach((s, i, arr) => {\n if (!s.valueDeclaration) {\n return;\n }\n\n let componentName = s.name;\n if (tagCasing === 'kebab') {\n componentName = kebabCase(s.name);\n }\n\n if (i === arr.length - 1) {\n insertPos = s.valueDeclaration.getEnd();\n }\n\n let objectLiteralSymbol: ts.Symbol | undefined;\n if (s.valueDeclaration.kind === tsModule.SyntaxKind.PropertyAssignment) {\n objectLiteralSymbol =\n checker.getSymbolAtLocation((s.valueDeclaration as ts.PropertyAssignment).initializer) || s;\n } else if (s.valueDeclaration.kind === tsModule.SyntaxKind.ShorthandPropertyAssignment) {\n objectLiteralSymbol = checker.getShorthandAssignmentValueSymbol(s.valueDeclaration) || s;\n }\n\n if (!objectLiteralSymbol) {\n return;\n }\n\n if (objectLiteralSymbol.flags & tsModule.SymbolFlags.Alias) {\n const definitionSymbol = checker.getAliasedSymbol(objectLiteralSymbol);\n if (!definitionSymbol.valueDeclaration) {\n return;\n }\n\n const sourceFile = definitionSymbol.valueDeclaration.getSourceFile();\n const defaultExportNode = getDefaultExportNode(tsModule, sourceFile);\n if (!defaultExportNode) {\n return;\n }\n\n result.push({\n name: componentName,\n documentation: buildDocumentation(tsModule, definitionSymbol, checker),\n definition: {\n path: sourceFile.fileName,\n start: defaultExportNode.getStart(sourceFile, true),\n end: defaultExportNode.getEnd()\n },\n defaultExportNode\n });\n }\n });\n\n return {\n start: componentsDeclaration.getStart(componentsDeclaration.getSourceFile(), true),\n end: componentsDeclaration.getEnd(),\n insertPos,\n list: result\n };\n }\n}\n", "import { kebabCase } from 'lodash';\nimport type ts from 'typescript';\nimport { BasicComponentInfo } from '../../config';\nimport { RuntimeLibrary } from '../../services/dependencyService';\nimport { InternalChildComponent } from './childComponents';\nimport { buildDocumentation, getDefaultExportNode } from './componentInfo';\n\nexport function getGlobalComponents(\n tsModule: RuntimeLibrary['typescript'],\n service: ts.LanguageService,\n componentInfos: BasicComponentInfo[],\n tagCasing = 'kebab'\n): InternalChildComponent[] {\n const program = service.getProgram();\n if (!program) {\n return [];\n }\n\n const checker = program.getTypeChecker();\n\n const result: InternalChildComponent[] = [];\n componentInfos.forEach(info => {\n const sourceFile = program.getSourceFile(info.path);\n if (!sourceFile) {\n return;\n }\n\n const defaultExportNode = getDefaultExportNode(tsModule, sourceFile);\n if (!defaultExportNode) {\n return;\n }\n\n const defaultExportSymbol = checker.getTypeAtLocation(defaultExportNode);\n if (!defaultExportSymbol) {\n return;\n }\n\n const name = tagCasing === 'kebab' ? kebabCase(info.name) : info.name;\n\n result.push({\n name,\n documentation: buildDocumentation(tsModule, defaultExportSymbol.symbol, checker),\n definition: {\n path: sourceFile.fileName,\n start: defaultExportNode.getStart(sourceFile, true),\n end: defaultExportNode.getEnd()\n },\n defaultExportNode\n });\n });\n\n return result;\n}\n", "import type ts from 'typescript';\nimport { CompletionItemKind, SymbolKind } from 'vscode-languageserver';\n\nexport function isVueFile(path: string) {\n return path.endsWith('.vue');\n}\n\n/**\n * If the path ends with `.vue.ts`, it's a `.vue` file pre-processed by Vetur\n * to be used in TS Language Service\n *\n * Note: all files outside any node_modules folder are considered,\n * EXCEPT if they are added to tsconfig via 'files' or 'include' properties\n */\nexport function isVirtualVueFile(path: string, projectFiles: Set<string>) {\n return path.endsWith('.vue.ts') && (!path.includes('node_modules') || projectFiles.has(path.slice(0, -'.ts'.length)));\n}\n\n/**\n * If the path ends with `.vue.template`, it's a `.vue` file's template part\n * pre-processed by Vetur to calculate template diagnostics in TS Language Service\n */\nexport function isVirtualVueTemplateFile(path: string) {\n return path.endsWith('.vue.template');\n}\n\nexport function findNodeByOffset(root: ts.Node, offset: number): ts.Node | undefined {\n if (offset < root.getStart() || root.getEnd() < offset) {\n return undefined;\n }\n\n const childMatch = root.getChildren().reduce<ts.Node | undefined>((matched, child) => {\n return matched || findNodeByOffset(child, offset);\n }, undefined);\n\n return childMatch ? childMatch : root;\n}\n\nexport function toCompletionItemKind(kind: ts.ScriptElementKind): CompletionItemKind {\n switch (kind) {\n case 'primitive type':\n case 'keyword':\n return CompletionItemKind.Keyword;\n case 'var':\n case 'local var':\n return CompletionItemKind.Variable;\n case 'property':\n case 'getter':\n case 'setter':\n return CompletionItemKind.Field;\n case 'function':\n case 'method':\n case 'construct':\n case 'call':\n case 'index':\n return CompletionItemKind.Function;\n case 'enum':\n return CompletionItemKind.Enum;\n case 'module':\n return CompletionItemKind.Module;\n case 'class':\n return CompletionItemKind.Class;\n case 'interface':\n return CompletionItemKind.Interface;\n case 'warning':\n return CompletionItemKind.File;\n case 'script':\n return CompletionItemKind.File;\n case 'directory':\n return CompletionItemKind.Folder;\n }\n\n return CompletionItemKind.Property;\n}\n\nexport function toSymbolKind(kind: ts.ScriptElementKind): SymbolKind {\n switch (kind) {\n case 'var':\n case 'local var':\n case 'const':\n return SymbolKind.Variable;\n case 'function':\n case 'local function':\n return SymbolKind.Function;\n case 'enum':\n return SymbolKind.Enum;\n case 'module':\n return SymbolKind.Module;\n case 'class':\n return SymbolKind.Class;\n case 'interface':\n return SymbolKind.Interface;\n case 'method':\n return SymbolKind.Method;\n case 'property':\n case 'getter':\n case 'setter':\n return SymbolKind.Property;\n }\n return SymbolKind.Variable;\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/* tslint:disable:max-line-length */\n/**\n * Adapted from https://github.com/microsoft/vscode/blob/8ba70d8bdc3a10e3143cc4a131f333263bc48eef/extensions/typescript-language-features/src/utils/previewer.ts\n */\n\nimport type ts from 'typescript';\n\nfunction replaceLinks(text: string): string {\n return (\n text\n // Http(s) links\n .replace(\n /\\{@(link|linkplain|linkcode) (https?:\\/\\/[^ |}]+?)(?:[| ]([^{}\\n]+?))?\\}/gi,\n (_, tag: string, link: string, text?: string) => {\n switch (tag) {\n case 'linkcode':\n return `[\\`${text ? text.trim() : link}\\`](${link})`;\n\n default:\n return `[${text ? text.trim() : link}](${link})`;\n }\n }\n )\n );\n}\n\nfunction processInlineTags(text: string): string {\n return replaceLinks(text);\n}\n\nfunction getTagBodyText(tag: ts.JSDocTagInfo): string | undefined {\n if (!tag.text) {\n return undefined;\n }\n\n // Convert to markdown code block if it is not already one\n function makeCodeblock(text: string): string {\n if (text.match(/^\\s*[~`]{3}/g)) {\n return text;\n }\n return '```\\n' + text + '\\n```';\n }\n\n switch (tag.name) {\n case 'example':\n // check for caption tags, fix for #79704\n const captionTagMatches = plain(tag.text).match(/<caption>(.*?)<\\/caption>\\s*(\\r\\n|\\n)/);\n if (captionTagMatches && captionTagMatches.index === 0) {\n return captionTagMatches[1] + '\\n\\n' + makeCodeblock(plain(tag.text).slice(captionTagMatches[0].length));\n } else {\n return makeCodeblock(plain(tag.text));\n }\n case 'author':\n // fix obsucated email address, #80898\n const emailMatch = plain(tag.text).match(/(.+)\\s<([-.\\w]+@[-.\\w]+)>/);\n\n if (emailMatch === null) {\n return plain(tag.text);\n } else {\n return `${emailMatch[1]} ${emailMatch[2]}`;\n }\n case 'default':\n return makeCodeblock(plain(tag.text));\n }\n\n return processInlineTags(plain(tag.text));\n}\n\nexport function getTagDocumentation(tag: ts.JSDocTagInfo): string | undefined {\n switch (tag.name) {\n case 'augments':\n case 'extends':\n case 'param':\n case 'template':\n const body = plain(tag.text || '').split(/^(\\S+)\\s*-?\\s*/);\n if (body?.length === 3) {\n const param = body[1];\n const doc = body[2];\n const label = `*@${tag.name}* \\`${param}\\``;\n if (!doc) {\n return label;\n }\n return label + (doc.match(/\\r\\n|\\n/g) ? ' \\n' + processInlineTags(doc) : ` \u2014 ${processInlineTags(doc)}`);\n }\n }\n\n // Generic tag\n const label = `*@${tag.name}*`;\n const text = getTagBodyText(tag);\n if (!text) {\n return label;\n }\n return label + (text.match(/\\r\\n|\\n/g) ? ' \\n' + text : ` \u2014 ${text}`);\n}\n\nexport function plain(parts: ts.SymbolDisplayPart[] | string): string {\n return processInlineTags(typeof parts === 'string' ? parts : parts.map(part => part.text).join(''));\n}\n", "import { RuntimeLibrary } from '../services/dependencyService';\nimport { CancellationToken as TSCancellationToken } from 'typescript';\nimport { CancellationTokenSource, CancellationToken as LSPCancellationToken } from 'vscode-languageserver';\n\nexport interface VCancellationToken extends LSPCancellationToken {\n tsToken: TSCancellationToken;\n}\n\nexport class VCancellationTokenSource extends CancellationTokenSource {\n get token(): VCancellationToken {\n const token = super.token as VCancellationToken;\n token.tsToken = {\n isCancellationRequested() {\n return token.isCancellationRequested;\n },\n throwIfCancellationRequested() {\n if (token.isCancellationRequested) {\n throw new Error('OperationCanceledException');\n }\n }\n };\n return token;\n }\n}\n\nexport function isVCancellationRequested(token?: VCancellationToken) {\n return new Promise(resolve => {\n if (!token) {\n resolve(false);\n } else {\n setImmediate(() => resolve(token.isCancellationRequested));\n }\n });\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\nimport { CodeActionKind } from 'vscode-languageserver';\n\nexport interface TSCodeActionKind {\n kind: CodeActionKind;\n matches(refactor: { actionName: string }): boolean;\n}\n\n/* tslint:disable:variable-name */\nconst Extract_Function = Object.freeze<TSCodeActionKind>({\n kind: CodeActionKind.RefactorExtract + '.function',\n matches: refactor => refactor.actionName.startsWith('function_')\n});\n\nconst Extract_Constant = Object.freeze<TSCodeActionKind>({\n kind: CodeActionKind.RefactorExtract + '.constant',\n matches: refactor => refactor.actionName.startsWith('constant_')\n});\n\nconst Extract_Type = Object.freeze<TSCodeActionKind>({\n kind: CodeActionKind.RefactorExtract + '.type',\n matches: refactor => refactor.actionName.startsWith('Extract to type alias')\n});\n\nconst Extract_Interface = Object.freeze<TSCodeActionKind>({\n kind: CodeActionKind.RefactorExtract + '.interface',\n matches: refactor => refactor.actionName.startsWith('Extract to interface')\n});\n\nconst Move_NewFile = Object.freeze<TSCodeActionKind>({\n kind: CodeActionKind.Refactor + '.move' + '.newFile',\n matches: refactor => refactor.actionName.startsWith('Move to a new file')\n});\n\nconst Rewrite_Import = Object.freeze<TSCodeActionKind>({\n kind: CodeActionKind.RefactorRewrite + '.import',\n matches: refactor =>\n refactor.actionName.startsWith('Convert namespace import') ||\n refactor.actionName.startsWith('Convert named imports')\n});\n\nconst Rewrite_Export = Object.freeze<TSCodeActionKind>({\n kind: CodeActionKind.RefactorRewrite + '.export',\n matches: refactor =>\n refactor.actionName.startsWith('Convert default export') || refactor.actionName.startsWith('Convert named export')\n});\n\nconst Rewrite_Arrow_Braces = Object.freeze<TSCodeActionKind>({\n kind: CodeActionKind.RefactorRewrite + '.arrow' + '.braces',\n matches: refactor =>\n refactor.actionName.startsWith('Convert default export') || refactor.actionName.startsWith('Convert named export')\n});\n\nconst Rewrite_Parameters_ToDestructured = Object.freeze<TSCodeActionKind>({\n kind: CodeActionKind.RefactorRewrite + '.parameters' + '.toDestructured',\n matches: refactor => refactor.actionName.startsWith('Convert parameters to destructured object')\n});\n\nconst Rewrite_Property_GenerateAccessors = Object.freeze<TSCodeActionKind>({\n kind: CodeActionKind.RefactorRewrite + '.property' + '.generateAccessors',\n matches: refactor => refactor.actionName.startsWith(\"Generate 'get' and 'set' accessors\")\n});\n/* tslint:enable:variable-name */\n\nconst allKnownCodeActionKinds = [\n Extract_Function,\n Extract_Constant,\n Extract_Type,\n Extract_Interface,\n Move_NewFile,\n Rewrite_Import,\n Rewrite_Export,\n Rewrite_Arrow_Braces,\n Rewrite_Parameters_ToDestructured,\n Rewrite_Property_GenerateAccessors\n];\n\nexport function getCodeActionKind(refactor: { actionName: string }): CodeActionKind {\n return allKnownCodeActionKinds.find(kind => kind.matches(refactor))?.kind ?? CodeActionKind.Refactor;\n}\n", "import ts from 'typescript';\nimport { SemanticTokensLegend, SemanticTokenModifiers, SemanticTokenTypes } from 'vscode-languageserver';\nimport { RuntimeLibrary } from '../../services/dependencyService';\nimport { RefTokensService } from '../../services/RefTokenService';\nimport { SemanticTokenOffsetData } from '../../types';\n\n/* tslint:disable:max-line-length */\n/**\n * extended from https://github.com/microsoft/TypeScript/blob/35c8df04ad959224fad9037e340c1e50f0540a49/src/services/classifier2020.ts#L9\n * so that we don't have to map it into our own legend\n */\nexport const enum TsTokenType {\n class,\n enum,\n interface,\n namespace,\n typeParameter,\n type,\n parameter,\n variable,\n enumMember,\n property,\n function,\n member\n}\n\n/* tslint:disable:max-line-length */\n/**\n * adopted from https://github.com/microsoft/TypeScript/blob/35c8df04ad959224fad9037e340c1e50f0540a49/src/services/classifier2020.ts#L13\n * so that we don't have to map it into our own legend\n */\nexport const enum TokenModifier {\n declaration,\n static,\n async,\n readonly,\n defaultLibrary,\n local,\n\n // vue composition api\n refValue\n}\n\nexport function getSemanticTokenLegends(): SemanticTokensLegend {\n const tokenModifiers: string[] = [];\n\n (\n [\n [TokenModifier.declaration, SemanticTokenModifiers.declaration],\n [TokenModifier.static, SemanticTokenModifiers.static],\n [TokenModifier.async, SemanticTokenModifiers.async],\n [TokenModifier.readonly, SemanticTokenModifiers.readonly],\n [TokenModifier.defaultLibrary, SemanticTokenModifiers.defaultLibrary],\n [TokenModifier.local, 'local'],\n\n // vue\n [TokenModifier.refValue, 'refValue']\n ] as const\n ).forEach(([tsModifier, legend]) => (tokenModifiers[tsModifier] = legend));\n\n const tokenTypes: string[] = [];\n\n (\n [\n [TsTokenType.class, SemanticTokenTypes.class],\n [TsTokenType.enum, SemanticTokenTypes.enum],\n [TsTokenType.interface, SemanticTokenTypes.interface],\n [TsTokenType.namespace, SemanticTokenTypes.namespace],\n [TsTokenType.typeParameter, SemanticTokenTypes.typeParameter],\n [TsTokenType.type, SemanticTokenTypes.type],\n [TsTokenType.parameter, SemanticTokenTypes.parameter],\n [TsTokenType.variable, SemanticTokenTypes.variable],\n [TsTokenType.enumMember, SemanticTokenTypes.enumMember],\n [TsTokenType.property, SemanticTokenTypes.property],\n [TsTokenType.function, SemanticTokenTypes.function],\n\n // member is renamed to method in vscode codebase to match LSP default\n [TsTokenType.member, SemanticTokenTypes.method]\n ] as const\n ).forEach(([tokenType, legend]) => (tokenTypes[tokenType] = legend));\n\n return {\n tokenModifiers,\n tokenTypes\n };\n}\n\nexport function getTokenTypeFromClassification(tsClassification: number): number {\n return (tsClassification >> TokenEncodingConsts.typeOffset) - 1;\n}\n\nexport function getTokenModifierFromClassification(tsClassification: number) {\n return tsClassification & TokenEncodingConsts.modifierMask;\n}\n\nconst enum TokenEncodingConsts {\n typeOffset = 8,\n modifierMask = (1 << typeOffset) - 1\n}\n\nexport function addCompositionApiRefTokens(\n tsModule: RuntimeLibrary['typescript'],\n program: ts.Program,\n fileFsPath: string,\n exists: SemanticTokenOffsetData[],\n refTokensService: RefTokensService\n): [number, number][] {\n const sourceFile = program.getSourceFile(fileFsPath);\n\n if (!sourceFile) {\n return [];\n }\n\n const typeChecker = program.getTypeChecker();\n\n const tokens: [number, number][] = [];\n walk(sourceFile, node => {\n if (!ts.isIdentifier(node) || node.text !== 'value' || !ts.isPropertyAccessExpression(node.parent)) {\n return;\n }\n const propertyAccess = node.parent;\n\n let parentSymbol = typeChecker.getTypeAtLocation(propertyAccess.expression).symbol;\n\n if (parentSymbol.flags & tsModule.SymbolFlags.Alias) {\n parentSymbol = typeChecker.getAliasedSymbol(parentSymbol);\n }\n\n if (parentSymbol.name !== 'Ref') {\n return;\n }\n\n const start = node.getStart();\n const length = node.getWidth();\n tokens.push([start, start + length]);\n const exist = exists.find(token => token.start === start && token.length === length);\n const encodedModifier = 1 << TokenModifier.refValue;\n\n if (exist) {\n exist.modifierSet |= encodedModifier;\n } else {\n exists.push({\n classificationType: TsTokenType.property,\n length: node.getEnd() - node.getStart(),\n modifierSet: encodedModifier,\n start: node.getStart()\n });\n }\n });\n\n return tokens;\n}\n\nfunction walk(node: ts.Node, callback: (node: ts.Node) => void) {\n node.forEachChild(child => {\n callback(child);\n walk(child, callback);\n });\n}\n", "import type ts from 'typescript';\nimport { RuntimeLibrary } from '../dependencyService';\n\ntype DiagnosticFilter = (diagnostic: ts.Diagnostic) => boolean;\n\nexport function createTemplateDiagnosticFilter(tsModule: RuntimeLibrary['typescript']) {\n /**\n * Ignores errors when accessing `private` or `protected` members on component.\n *\n * ```vue\n * <template>\n * <!-- `a` is private but should not provide an error -->\n * <p>{{ a }}</p>\n * </template>\n *\n * <script lang=\"ts\">\n * import Vue from 'vue'\n * import Component from 'vue-class-component'\n *\n * @Component\n * export default class MyComp extends Vue {\n * private a = 'Hi'\n * }\n * </script>\n * ```\n */\n const ignorePrivateProtectedViolation: DiagnosticFilter = diag => {\n const protectedViolationCode = 2445;\n const privateViolationCode = 2341;\n\n if (diag.code !== protectedViolationCode && diag.code !== privateViolationCode) {\n return true;\n }\n\n const source = diag.file;\n if (!source) {\n return true;\n }\n\n // Only ignore accesses to a member of a component instance\n const target = findNodeFromDiagnostic(diag, source);\n if (target && tsModule.isPropertyAccessExpression(target.parent)) {\n if (target.parent.expression.kind === tsModule.SyntaxKind.ThisKeyword) {\n return false;\n }\n }\n\n return true;\n };\n\n const ignoreNoImplicitAnyViolationInNativeEvent: DiagnosticFilter = diag => {\n const noImplicitAnyViolation = [7006, 7031];\n\n if (!noImplicitAnyViolation.includes(diag.code)) {\n return true;\n }\n\n const source = diag.file;\n if (!source) {\n return true;\n }\n\n const target = findNodeFromDiagnostic(diag, source);\n if (target && (tsModule.isParameter(target.parent) || tsModule.isBindingElement(target.parent))) {\n return false;\n }\n\n return true;\n };\n\n return mergeFilter([ignorePrivateProtectedViolation, ignoreNoImplicitAnyViolationInNativeEvent]);\n}\n\nexport function createScriptSetupDiagnosticFilter(tsModule: RuntimeLibrary['typescript']): DiagnosticFilter {\n const ignoreUnusedVariableViolation: DiagnosticFilter = diag => {\n const unusedVariableViolation = [6133];\n const ignoreNodeFns = [tsModule.isVariableStatement, tsModule.isFunctionDeclaration, tsModule.isImportDeclaration];\n\n if (!unusedVariableViolation.includes(diag.code)) {\n return true;\n }\n\n const source = diag.file;\n if (!source) {\n return true;\n }\n\n const target = findNodeFromDiagnostic(diag, source);\n\n const node = findXXXFromNodeParent(target, ignoreNodeFns);\n if (node && tsModule.isSourceFile(node.parent)) {\n return false;\n }\n\n return true;\n };\n\n return ignoreUnusedVariableViolation;\n}\n\n/**\n * Merge an array of filter to create a filter function.\n */\nfunction mergeFilter(filters: DiagnosticFilter[]): DiagnosticFilter {\n return diag => {\n return filters.every(f => f(diag));\n };\n}\n\n/**\n * Walk AST tree and get a node which the diagnostic probably refers.\n */\nfunction findNodeFromDiagnostic(diag: ts.Diagnostic, node: ts.Node): ts.Node | undefined {\n if (diag.start === undefined || diag.length === undefined) {\n return undefined;\n }\n\n if (diag.start < node.getStart() || node.getEnd() < diag.start + diag.length) {\n return undefined;\n }\n\n const childMatch = node.getChildren().reduce<ts.Node | undefined>((matched, child) => {\n return matched || findNodeFromDiagnostic(diag, child);\n }, undefined);\n\n return childMatch ? childMatch : node;\n}\n\nfunction findXXXFromNodeParent<T extends ts.Node>(\n node: ts.Node | undefined,\n fns: Array<(node: ts.Node) => boolean>\n): ts.Node | undefined {\n if (!node) {\n return undefined;\n }\n if (fns.some(fn => fn(node))) {\n return node as T;\n }\n return findXXXFromNodeParent(node.parent, fns);\n}\n", "import {\n Position,\n CompletionList,\n CompletionItemKind,\n Range,\n TextEdit,\n InsertTextFormat,\n CompletionItem\n} from 'vscode-languageserver-types';\nimport type { TextDocument } from 'vscode-languageserver-textdocument';\nimport { HTMLDocument } from '../parser/htmlParser';\nimport { HtmlTokenType, createScanner, ScannerState } from '../parser/htmlScanner';\nimport { IHTMLTagProvider } from '../tagProviders/common';\nimport * as emmet from 'vscode-emmet-helper';\nimport { NULL_COMPLETION } from '../../nullMode';\nimport { getModifierProvider, Modifier } from '../modifierProvider';\nimport { toMarkupContent } from '../../../utils/strings';\nimport { TagProviderPriority } from '../tagProviders/common';\nimport { kebabCase } from 'lodash';\n\nexport function doComplete(\n document: TextDocument,\n position: Position,\n htmlDocument: HTMLDocument,\n tagProviders: IHTMLTagProvider[],\n emmetConfig: emmet.VSCodeEmmetConfig,\n autoImportCompletions?: CompletionItem[]\n): CompletionList {\n const modifierProvider = getModifierProvider();\n\n const result: CompletionList = {\n isIncomplete: false,\n items: []\n };\n\n const offset = document.offsetAt(position);\n const node = htmlDocument.findNodeBefore(offset);\n if (!node || (node.isInterpolation && offset <= node.end)) {\n return result;\n }\n\n const text = document.getText();\n const scanner = createScanner(text, node.start);\n let currentTag: string;\n let currentAttributeName = '';\n\n function getReplaceRange(replaceStart: number, replaceEnd: number = offset): Range {\n if (replaceStart > offset) {\n replaceStart = offset;\n }\n return { start: document.positionAt(replaceStart), end: document.positionAt(replaceEnd) };\n }\n\n function collectOpenTagSuggestions(afterOpenBracket: number, tagNameEnd?: number): CompletionList {\n const range = getReplaceRange(afterOpenBracket, tagNameEnd);\n tagProviders.forEach(provider => {\n const priority = provider.priority;\n provider.collectTags((tag, label) => {\n result.items.push({\n label: tag,\n kind: CompletionItemKind.Property,\n documentation: toMarkupContent(label),\n textEdit: TextEdit.replace(range, tag),\n sortText: priority + tag,\n insertTextFormat: InsertTextFormat.PlainText\n });\n });\n });\n autoImportCompletions?.forEach(item => {\n result.items.push({\n ...item,\n kind: CompletionItemKind.Property,\n textEdit: TextEdit.replace(range, item.label),\n sortText: TagProviderPriority.UserCode + item.label,\n insertTextFormat: InsertTextFormat.PlainText\n });\n });\n return result;\n }\n\n function getLineIndent(offset: number) {\n let start = offset;\n while (start > 0) {\n const ch = text.charAt(start - 1);\n if ('\\n\\r'.indexOf(ch) >= 0) {\n return text.substring(start, offset);\n }\n if (!isWhiteSpace(ch)) {\n return null;\n }\n start--;\n }\n return text.substring(0, offset);\n }\n\n function collectCloseTagSuggestions(\n afterOpenBracket: number,\n matchingOnly: boolean,\n tagNameEnd: number = offset\n ): CompletionList {\n const range = getReplaceRange(afterOpenBracket, tagNameEnd);\n const closeTag = isFollowedBy(text, tagNameEnd, ScannerState.WithinEndTag, HtmlTokenType.EndTagClose) ? '' : '>';\n let curr = node;\n while (curr) {\n const tag = curr.tag;\n if (tag && (!curr.closed || (curr.endTagStart && curr.endTagStart > offset))) {\n const item: CompletionItem = {\n label: '/' + tag,\n kind: CompletionItemKind.Property,\n filterText: '/' + tag + closeTag,\n textEdit: TextEdit.replace(range, '/' + tag + closeTag),\n insertTextFormat: InsertTextFormat.PlainText\n };\n const startIndent = getLineIndent(curr.start);\n const endIndent = getLineIndent(afterOpenBracket - 1);\n if (startIndent !== null && endIndent !== null && startIndent !== endIndent) {\n const insertText = startIndent + '</' + tag + closeTag;\n (item.textEdit = TextEdit.replace(getReplaceRange(afterOpenBracket - 1 - endIndent.length), insertText)),\n (item.filterText = endIndent + '</' + tag + closeTag);\n }\n result.items.push(item);\n return result;\n }\n curr = curr.parent;\n }\n if (matchingOnly) {\n return result;\n }\n\n tagProviders.forEach(provider => {\n provider.collectTags((tag, label) => {\n result.items.push({\n label: '/' + tag,\n kind: CompletionItemKind.Property,\n documentation: toMarkupContent(label),\n filterText: '/' + tag + closeTag,\n textEdit: TextEdit.replace(range, '/' + tag + closeTag),\n insertTextFormat: InsertTextFormat.PlainText\n });\n });\n });\n return result;\n }\n\n function collectTagSuggestions(tagStart: number, tagEnd: number): CompletionList {\n collectOpenTagSuggestions(tagStart, tagEnd);\n collectCloseTagSuggestions(tagStart, true, tagEnd);\n return result;\n }\n\n function getUsedAttributes(offset: number) {\n const node = htmlDocument.findNodeBefore(offset);\n return new Set(node.attributeNames.map(normalizeAttributeNameToKebabCase));\n }\n\n function collectAttributeNameSuggestions(nameStart: number, nameEnd: number = offset): CompletionList {\n const usedAttributes = getUsedAttributes(nameStart);\n const currentAttribute = scanner.getTokenText();\n const execArray = /^[:@]/.exec(currentAttribute);\n const filterPrefix = execArray ? execArray[0] : '';\n const start = filterPrefix ? nameStart + 1 : nameStart;\n const range = getReplaceRange(start, nameEnd);\n const value = isFollowedBy(text, nameEnd, ScannerState.AfterAttributeName, HtmlTokenType.DelimiterAssign)\n ? ''\n : '=\"$1\"';\n tagProviders.forEach(provider => {\n const priority = provider.priority;\n provider.collectAttributes(currentTag, (attribute, type, documentation) => {\n if (\n // include current typing attribute for completing `=\"$1\"`\n !(attribute === currentAttribute && text[nameEnd] !== '=') &&\n // can listen to same event by adding modifiers\n type !== 'event' &&\n // `class` and `:class`, `style` and `:style` can coexist\n attribute !== 'class' &&\n attribute !== 'style' &&\n usedAttributes.has(normalizeAttributeNameToKebabCase(attribute))\n ) {\n return;\n }\n if ((type === 'event' && filterPrefix !== '@') || (type !== 'event' && filterPrefix === '@')) {\n return;\n }\n let codeSnippet = attribute;\n if (type !== 'v' && value.length) {\n codeSnippet = codeSnippet + value;\n }\n if ((filterPrefix === ':' && codeSnippet[0] === ':') || (filterPrefix === '@' && codeSnippet[0] === '@')) {\n codeSnippet = codeSnippet.slice(1);\n }\n const trimedName = attribute.replace(/^(?::|@)/, '');\n result.items.push({\n label: attribute,\n kind: type === 'event' ? CompletionItemKind.Function : CompletionItemKind.Value,\n textEdit: TextEdit.replace(range, codeSnippet),\n insertTextFormat: InsertTextFormat.Snippet,\n sortText: priority + trimedName,\n filterText: trimedName,\n documentation: toMarkupContent(documentation)\n });\n });\n });\n const attributeName = scanner.getTokenText();\n if (/\\.$/.test(attributeName)) {\n function addModifier(modifiers: { items: Modifier[]; priority: number }) {\n modifiers.items.forEach(modifier => {\n result.items.push({\n label: modifier.label,\n kind: CompletionItemKind.Method,\n textEdit: TextEdit.insert(document.positionAt(nameEnd), modifier.label),\n insertTextFormat: InsertTextFormat.Snippet,\n sortText: modifiers.priority + modifier.label,\n documentation: toMarkupContent(modifier.documentation)\n });\n });\n }\n\n if (attributeName.startsWith('@') || attributeName.startsWith('v-on')) {\n addModifier(modifierProvider.eventModifiers);\n }\n\n const execArray = /^(?:@|v-on:)([A-Za-z]*)\\.?/.exec(attributeName);\n const eventName = execArray && execArray[1] ? execArray[1] : '';\n\n const keyEvent = ['keydown', 'keypress', 'keyup'];\n if (keyEvent.includes(eventName)) {\n addModifier(modifierProvider.keyModifiers);\n addModifier(modifierProvider.systemModifiers);\n }\n\n const mouseEvent = ['click', 'dblclick', 'mouseup', 'mousedown'];\n if (mouseEvent.includes(eventName)) {\n addModifier(modifierProvider.mouseModifiers);\n addModifier(modifierProvider.systemModifiers);\n }\n\n if (attributeName.startsWith('v-bind') || attributeName.startsWith(':')) {\n addModifier(modifierProvider.propsModifiers);\n }\n\n if (attributeName.startsWith('v-model')) {\n addModifier(modifierProvider.vModelModifiers);\n }\n }\n return result;\n }\n\n function collectAttributeValueSuggestions(attr: string, valueStart: number, valueEnd?: number): CompletionList {\n if (attr.startsWith('v-') || attr.startsWith('@') || attr.startsWith(':')) {\n return NULL_COMPLETION;\n }\n\n let range: Range;\n let addQuotes: boolean;\n if (valueEnd && offset > valueStart && offset <= valueEnd && text[valueStart] === '\"') {\n // inside attribute\n if (valueEnd > offset && text[valueEnd - 1] === '\"') {\n valueEnd--;\n }\n const wsBefore = getWordStart(text, offset, valueStart + 1);\n const wsAfter = getWordEnd(text, offset, valueEnd);\n range = getReplaceRange(wsBefore, wsAfter);\n addQuotes = false;\n } else {\n range = getReplaceRange(valueStart, valueEnd);\n addQuotes = true;\n }\n const attribute = currentAttributeName.toLowerCase();\n tagProviders.forEach(provider => {\n provider.collectValues(currentTag, attribute, value => {\n const insertText = addQuotes ? '\"' + value + '\"' : value;\n result.items.push({\n label: value,\n filterText: insertText,\n kind: CompletionItemKind.Unit,\n textEdit: TextEdit.replace(range, insertText),\n insertTextFormat: InsertTextFormat.PlainText\n });\n });\n });\n return result;\n }\n\n function scanNextForEndPos(nextToken: HtmlTokenType): number {\n if (offset === scanner.getTokenEnd()) {\n token = scanner.scan();\n if (token === nextToken && scanner.getTokenOffset() === offset) {\n return scanner.getTokenEnd();\n }\n }\n return offset;\n }\n\n let token = scanner.scan();\n\n while (token !== HtmlTokenType.EOS && scanner.getTokenOffset() <= offset) {\n switch (token) {\n case HtmlTokenType.StartTagOpen:\n if (scanner.getTokenEnd() === offset) {\n const endPos = scanNextForEndPos(HtmlTokenType.StartTag);\n return collectTagSuggestions(offset, endPos);\n }\n break;\n case HtmlTokenType.StartTag:\n if (scanner.getTokenOffset() <= offset && offset <= scanner.getTokenEnd()) {\n return collectOpenTagSuggestions(scanner.getTokenOffset(), scanner.getTokenEnd());\n }\n currentTag = scanner.getTokenText();\n break;\n case HtmlTokenType.AttributeName:\n if (scanner.getTokenOffset() <= offset && offset <= scanner.getTokenEnd()) {\n return collectAttributeNameSuggestions(scanner.getTokenOffset(), scanner.getTokenEnd());\n }\n currentAttributeName = scanner.getTokenText();\n break;\n case HtmlTokenType.DelimiterAssign:\n if (scanner.getTokenEnd() === offset) {\n return collectAttributeValueSuggestions(currentAttributeName, scanner.getTokenEnd());\n }\n break;\n case HtmlTokenType.AttributeValue:\n if (scanner.getTokenOffset() <= offset && offset <= scanner.getTokenEnd()) {\n if (currentAttributeName === 'style') {\n const emmetCompletions = emmet.doComplete(document, position, 'css', emmetConfig);\n return emmetCompletions || NULL_COMPLETION;\n } else {\n return collectAttributeValueSuggestions(\n currentAttributeName,\n scanner.getTokenOffset(),\n scanner.getTokenEnd()\n );\n }\n }\n break;\n case HtmlTokenType.Whitespace:\n if (offset <= scanner.getTokenEnd()) {\n switch (scanner.getScannerState()) {\n case ScannerState.AfterOpeningStartTag:\n const startPos = scanner.getTokenOffset();\n const endTagPos = scanNextForEndPos(HtmlTokenType.StartTag);\n return collectTagSuggestions(startPos, endTagPos);\n case ScannerState.WithinTag:\n case ScannerState.AfterAttributeName:\n return collectAttributeNameSuggestions(scanner.getTokenEnd());\n case ScannerState.BeforeAttributeValue:\n return collectAttributeValueSuggestions(currentAttributeName, scanner.getTokenEnd());\n case ScannerState.AfterOpeningEndTag:\n return collectCloseTagSuggestions(scanner.getTokenOffset() - 1, false);\n }\n }\n break;\n case HtmlTokenType.EndTagOpen:\n if (offset <= scanner.getTokenEnd()) {\n const afterOpenBracket = scanner.getTokenOffset() + 1;\n const endOffset = scanNextForEndPos(HtmlTokenType.EndTag);\n return collectCloseTagSuggestions(afterOpenBracket, false, endOffset);\n }\n break;\n case HtmlTokenType.EndTag:\n if (offset <= scanner.getTokenEnd()) {\n let start = scanner.getTokenOffset() - 1;\n while (start >= 0) {\n const ch = text.charAt(start);\n if (ch === '/') {\n return collectCloseTagSuggestions(start, false, scanner.getTokenEnd());\n } else if (!isWhiteSpace(ch)) {\n break;\n }\n start--;\n }\n }\n break;\n case HtmlTokenType.Content:\n if (offset <= scanner.getTokenEnd()) {\n return emmet.doComplete(document, position, 'html', emmetConfig) ?? NULL_COMPLETION;\n }\n break;\n default:\n if (offset <= scanner.getTokenEnd()) {\n return result;\n }\n break;\n }\n token = scanner.scan();\n }\n return result;\n}\n\nfunction isWhiteSpace(s: string): boolean {\n return /^\\s*$/.test(s);\n}\n\nfunction isFollowedBy(s: string, offset: number, intialState: ScannerState, expectedToken: HtmlTokenType) {\n const scanner = createScanner(s, offset, intialState);\n let token = scanner.scan();\n while (token === HtmlTokenType.Whitespace) {\n token = scanner.scan();\n }\n return token === expectedToken;\n}\n\nfunction getWordStart(s: string, offset: number, limit: number): number {\n while (offset > limit && !isWhiteSpace(s[offset - 1])) {\n offset--;\n }\n return offset;\n}\n\nfunction getWordEnd(s: string, offset: number, limit: number): number {\n while (offset < limit && !isWhiteSpace(s[offset])) {\n offset++;\n }\n return offset;\n}\n\nexport function normalizeAttributeNameToKebabCase(attr: string): string {\n let result = attr;\n\n if (result.startsWith('v-model:')) {\n result = attr.slice('v-model:'.length);\n }\n\n if (result.startsWith('v-bind:')) {\n result = attr.slice('v-bind:'.length);\n } else if (result.startsWith(':')) {\n result = attr.slice(':'.length);\n }\n\n // Remove modifiers\n if (result.includes('.')) {\n result = result.slice(0, result.indexOf('.'));\n }\n\n result = kebabCase(result);\n\n return result;\n}\n", "// tslint:disable: max-line-length\nimport { MarkupContent } from 'vscode-languageserver-types';\n\nexport interface Modifier {\n label: string;\n documentation?: string | MarkupContent;\n}\n\nfunction genModifier(label: string, documentation?: string | MarkupContent) {\n return { label, documentation };\n}\n\nconst eventModifiers = [\n genModifier('stop', 'The event propagation will be stopped.'),\n genModifier('prevent', 'The event will no longer perform default action.'),\n genModifier('capture', 'Use capture mode when adding the event listener.'),\n genModifier('self', 'Only trigger handler if `event.target` is the element itself.'),\n genModifier('once', 'The event will be triggered at most once.'),\n genModifier(\n 'passive',\n \"Indicates that the event listener will never call `preventDefault`. Same as `addEventListener`'s `passive` option.\"\n ),\n genModifier(\n 'native',\n 'There may be times when you want to listen directly to a native event on the root element of a component. In these cases, you can use the `.native` modifier.'\n )\n];\n\nconst keyModifiers = [\n genModifier('enter', 'Captures the <Enter> key with keycode 13.'),\n genModifier('tab', 'Captures the <Tab> key with keycode 9.'),\n genModifier('delete', 'captures both <Delete> and <Backspace> keys.'),\n genModifier('esc', 'Captures the <Escape> key with keycode 27.'),\n genModifier('space', 'Captures the <Space> key with keycode 32.'),\n genModifier('up', 'Captures the <ArrowUp> key with keycode 38.'),\n genModifier('down', 'Captures the <ArrowDown> key with keycode 40.'),\n genModifier('left', 'Captures the <ArrowLeft> key with keycode 37.'),\n genModifier('right', 'Captures the <ArrowRight> key with keycode 39.')\n];\n\nconst mouseModifiers = [\n genModifier('left', 'Triggers mouse event when \"left\" mouse button is clicked.'),\n genModifier('right', 'Triggers mouse event when \"right\" mouse button is clicked.'),\n genModifier('middle', 'Triggers mouse event when \"middle\" mouse button is clicked.')\n];\n\nconst systemModifiers = [\n genModifier('ctrl', 'Triggers mouse or keyboard event when <Control> is pressed.'),\n genModifier('alt', 'Triggers mouse or keyboard event when <Alt> is pressed.'),\n genModifier('shift', 'Triggers mouse or keyboard event when <Shift> is pressed.'),\n genModifier('meta', 'Triggers mouse or keyboard event when <Meta> is pressed.'),\n genModifier(\n 'exact',\n 'The `.exact` modifier allows control of the exact combination of system modifiers needed to trigger an event.'\n )\n];\n\nconst propsModifiers = [genModifier('sync')];\n\nconst vModelModifiers = [\n genModifier(\n 'lazy',\n 'By default, `v-model` syncs the input with the data after each input event. You can add the `lazy` modifier to instead sync after change events'\n ),\n genModifier(\n 'number',\n 'If you want user input to be automatically typecast as a number, you can add the `number` modifier to your `v-model` managed inputs.'\n ),\n genModifier(\n 'trim',\n 'If you want whitespace from user input to be trimmed automatically, you can add the `trim` modifier to your `v-model`-managed inputs.'\n )\n];\n\nexport function getModifierProvider() {\n return {\n eventModifiers: {\n items: eventModifiers,\n priority: 1\n },\n keyModifiers: {\n items: keyModifiers,\n priority: 2\n },\n mouseModifiers: {\n items: mouseModifiers,\n priority: 2\n },\n systemModifiers: {\n items: systemModifiers,\n priority: 3\n },\n propsModifiers: {\n items: propsModifiers,\n priority: 1\n },\n vModelModifiers: {\n items: vModelModifiers,\n priority: 1\n }\n };\n}\n", "import { MarkupContent } from 'vscode-languageserver-types';\nimport { kebabCase } from 'lodash';\n\ninterface TagCollector {\n (tag: string, documentation: string | MarkupContent): void;\n}\n\nexport interface Attribute {\n label: string;\n type?: string;\n documentation?: string | MarkupContent;\n}\n\nexport interface AttributeCollector {\n (attribute: string, type?: string, documentation?: string | MarkupContent): void;\n}\ninterface StandaloneAttribute {\n label: string;\n type?: string;\n documentation?: string | MarkupContent;\n}\n\n// Note: cannot items more than 10 for lexical order\n// smaller enum value means higher priority\nexport enum TagProviderPriority {\n UserCode,\n Library,\n Framework,\n Platform\n}\n\nexport interface IHTMLTagProvider {\n getId(): string;\n collectTags(collector: TagCollector): void;\n collectAttributes(tag: string, collector: AttributeCollector): void;\n collectValues(tag: string, attribute: string, collector: (value: string) => void): void;\n\n /* a prefix for completion's lexical order */\n readonly priority: TagProviderPriority;\n}\n\nexport interface ITagSet {\n [tag: string]: HTMLTagSpecification;\n}\n\nexport class HTMLTagSpecification {\n constructor(public documentation: string | MarkupContent, public attributes: Attribute[] = []) {}\n}\n\nexport interface IValueSets {\n [tag: string]: string[];\n}\n\nexport function getSameTagInSet<T>(tagSet: Record<string, T>, tag: string): T | undefined {\n return tagSet[tag] ?? tagSet[tag.toLowerCase()] ?? tagSet[kebabCase(tag)];\n}\n\nexport function collectTagsDefault(collector: TagCollector, tagSet: ITagSet): void {\n for (const tag in tagSet) {\n collector(tag, tagSet[tag].documentation);\n }\n}\n\nexport function collectAttributesDefault(\n tag: string,\n collector: AttributeCollector,\n tagSet: ITagSet,\n globalAttributes: StandaloneAttribute[]\n): void {\n if (tag) {\n const tags = getSameTagInSet(tagSet, tag);\n\n if (tags) {\n const attributes = tags.attributes;\n for (const attr of attributes) {\n collector(attr.label, attr.type, attr.documentation);\n }\n }\n }\n globalAttributes.forEach(attr => {\n collector(attr.label, attr.type, attr.documentation);\n });\n}\n\nexport function collectValuesDefault(\n tag: string,\n attribute: string,\n collector: (value: string) => void,\n tagSet: ITagSet,\n globalAttributes: StandaloneAttribute[],\n valueSets: IValueSets\n): void {\n function processAttributes(attributes: Attribute[]) {\n for (const attr of attributes) {\n const label = attr.label;\n if (label !== attribute || !attr.type) {\n continue;\n }\n const typeInfo = attr.type;\n if (typeInfo === 'v') {\n collector(attribute);\n } else {\n const values = valueSets[typeInfo];\n if (values) {\n values.forEach(collector);\n }\n }\n }\n }\n if (tag) {\n const tags = getSameTagInSet(tagSet, tag);\n if (tags) {\n const attributes = tags.attributes;\n if (attributes) {\n processAttributes(attributes);\n }\n }\n }\n processAttributes(globalAttributes);\n}\n\nexport function genAttribute(label: string, type?: string, documentation?: string | MarkupContent): Attribute {\n return { label, type, documentation };\n}\n", "import { HTMLDocument } from '../parser/htmlParser';\nimport { HtmlTokenType, createScanner } from '../parser/htmlScanner';\nimport { Range, Position, Hover } from 'vscode-languageserver-types';\nimport type { TextDocument } from 'vscode-languageserver-textdocument';\nimport { IHTMLTagProvider } from '../tagProviders/common';\nimport { NULL_HOVER } from '../../nullMode';\nimport { toMarkupContent } from '../../../utils/strings';\n\nconst TRIVIAL_TOKEN = [HtmlTokenType.StartTagOpen, HtmlTokenType.EndTagOpen, HtmlTokenType.Whitespace];\n\nexport function doHover(\n document: TextDocument,\n position: Position,\n htmlDocument: HTMLDocument,\n tagProviders: IHTMLTagProvider[]\n): Hover {\n const offset = document.offsetAt(position);\n const node = htmlDocument.findNodeAt(offset);\n if (!node || !node.tag) {\n return NULL_HOVER;\n }\n\n function getTagHover(tag: string, range: Range, open: boolean): Hover {\n tag = tag.toLowerCase();\n for (const provider of tagProviders) {\n let hover: Hover | null = null;\n provider.collectTags((t, documentation) => {\n if (t !== tag) {\n return;\n }\n hover = { contents: toMarkupContent(documentation), range };\n });\n if (hover) {\n return hover;\n }\n }\n return NULL_HOVER;\n }\n\n function getAttributeHover(tag: string, attribute: string, range: Range): Hover {\n for (const provider of tagProviders) {\n let hover: Hover | null = null;\n provider.collectAttributes(tag, (attr, type, documentation) => {\n if (attribute !== attr) {\n return;\n }\n hover = { contents: toMarkupContent(documentation), range };\n });\n if (hover) {\n return hover;\n }\n }\n return NULL_HOVER;\n }\n\n const inEndTag = node.endTagStart && offset >= node.endTagStart; // <html></ht|ml>\n const startOffset = inEndTag ? node.endTagStart : node.start;\n const scanner = createScanner(document.getText(), startOffset);\n let token = scanner.scan();\n\n function shouldAdvance() {\n if (token === HtmlTokenType.EOS) {\n return false;\n }\n const tokenEnd = scanner.getTokenEnd();\n if (tokenEnd < offset) {\n return true;\n }\n\n if (tokenEnd === offset) {\n return TRIVIAL_TOKEN.includes(token);\n }\n return false;\n }\n\n while (shouldAdvance()) {\n token = scanner.scan();\n }\n\n if (offset > scanner.getTokenEnd()) {\n return NULL_HOVER;\n }\n const tagRange = {\n start: document.positionAt(scanner.getTokenOffset()),\n end: document.positionAt(scanner.getTokenEnd())\n };\n switch (token) {\n case HtmlTokenType.StartTag:\n return getTagHover(node.tag, tagRange, true);\n case HtmlTokenType.EndTag:\n return getTagHover(node.tag, tagRange, false);\n case HtmlTokenType.AttributeName:\n // TODO: treat : as special bind\n const attribute = scanner.getTokenText().replace(/^:/, '');\n return getAttributeHover(node.tag, attribute, tagRange);\n }\n\n return NULL_HOVER;\n}\n", "import { HTMLDocument } from '../parser/htmlParser';\nimport { HtmlTokenType, createScanner } from '../parser/htmlScanner';\nimport { Range, Position, DocumentHighlightKind, DocumentHighlight } from 'vscode-languageserver-types';\nimport type { TextDocument } from 'vscode-languageserver-textdocument';\n\nexport function findDocumentHighlights(\n document: TextDocument,\n position: Position,\n htmlDocument: HTMLDocument\n): DocumentHighlight[] {\n const offset = document.offsetAt(position);\n const node = htmlDocument.findNodeAt(offset);\n if (!node.tag) {\n return [];\n }\n const result = [];\n const startTagRange = getTagNameRange(HtmlTokenType.StartTag, document, node.start);\n const endTagRange =\n typeof node.endTagStart === 'number' && getTagNameRange(HtmlTokenType.EndTag, document, node.endTagStart);\n if ((startTagRange && covers(startTagRange, position)) || (endTagRange && covers(endTagRange, position))) {\n if (startTagRange) {\n result.push({ kind: DocumentHighlightKind.Read, range: startTagRange });\n }\n if (endTagRange) {\n result.push({ kind: DocumentHighlightKind.Read, range: endTagRange });\n }\n }\n return result;\n}\n\nfunction isBeforeOrEqual(pos1: Position, pos2: Position) {\n return pos1.line < pos2.line || (pos1.line === pos2.line && pos1.character <= pos2.character);\n}\n\nfunction covers(range: Range, position: Position) {\n return isBeforeOrEqual(range.start, position) && isBeforeOrEqual(position, range.end);\n}\n\nfunction getTagNameRange(tokenType: HtmlTokenType, document: TextDocument, startOffset: number): Range | null {\n const scanner = createScanner(document.getText(), startOffset);\n let token = scanner.scan();\n while (token !== HtmlTokenType.EOS && token !== tokenType) {\n token = scanner.scan();\n }\n if (token !== HtmlTokenType.EOS) {\n return { start: document.positionAt(scanner.getTokenOffset()), end: document.positionAt(scanner.getTokenEnd()) };\n }\n return null;\n}\n", "import { HtmlTokenType, createScanner } from '../parser/htmlScanner';\nimport { Range, DocumentLink } from 'vscode-languageserver-types';\nimport type { TextDocument } from 'vscode-languageserver-textdocument';\nimport { URI } from 'vscode-uri';\nimport { DocumentContext } from '../../../types';\n\nfunction stripQuotes(url: string): string {\n return url.replace(/^'([^']*)'$/, (substr, match1) => match1).replace(/^\"([^\"]*)\"$/, (substr, match1) => match1);\n}\n\nfunction getWorkspaceUrl(\n modelAbsoluteUri: URI,\n tokenContent: string,\n documentContext: DocumentContext,\n base: string\n): string | null {\n if (/^\\s*javascript\\:/i.test(tokenContent) || /^\\s*\\#/i.test(tokenContent) || /[\\n\\r]/.test(tokenContent)) {\n return null;\n }\n tokenContent = tokenContent.replace(/^\\s*/g, '');\n\n if (/^https?:\\/\\//i.test(tokenContent) || /^file:\\/\\//i.test(tokenContent)) {\n // Absolute link that needs no treatment\n return tokenContent;\n }\n\n if (/^\\/\\//i.test(tokenContent)) {\n // Absolute link (that does not name the protocol)\n let pickedScheme = 'http';\n if (modelAbsoluteUri.scheme === 'https') {\n pickedScheme = 'https';\n }\n return pickedScheme + ':' + tokenContent.replace(/^\\s*/g, '');\n }\n if (documentContext) {\n return documentContext.resolveReference(tokenContent, base);\n }\n return tokenContent;\n}\n\nfunction createLink(\n document: TextDocument,\n documentContext: DocumentContext,\n attributeValue: string,\n startOffset: number,\n endOffset: number,\n base: string\n): DocumentLink | null {\n const documentUri = URI.parse(document.uri);\n const tokenContent = stripQuotes(attributeValue);\n if (tokenContent.length === 0) {\n return null;\n }\n if (tokenContent.length < attributeValue.length) {\n startOffset++;\n endOffset--;\n }\n const workspaceUrl = getWorkspaceUrl(documentUri, tokenContent, documentContext, base);\n if (!workspaceUrl || !isValidURI(workspaceUrl)) {\n return null;\n }\n return {\n range: Range.create(document.positionAt(startOffset), document.positionAt(endOffset)),\n target: workspaceUrl\n };\n}\n\nfunction isValidURI(uri: string) {\n try {\n URI.parse(uri);\n return true;\n } catch (e) {\n console.error((e as Error).stack);\n return false;\n }\n}\n\nexport function findDocumentLinks(document: TextDocument, documentContext: DocumentContext): DocumentLink[] {\n const newLinks: DocumentLink[] = [];\n\n const scanner = createScanner(document.getText(), 0);\n let token = scanner.scan();\n let afterHrefOrSrc = false;\n let afterBase = false;\n let base: string | undefined = undefined;\n while (token !== HtmlTokenType.EOS) {\n switch (token) {\n case HtmlTokenType.StartTag:\n if (!base) {\n const tagName = scanner.getTokenText().toLowerCase();\n afterBase = tagName === 'base';\n }\n break;\n case HtmlTokenType.AttributeName:\n const attributeName = scanner.getTokenText().toLowerCase();\n afterHrefOrSrc = attributeName === 'src' || attributeName === 'href';\n break;\n case HtmlTokenType.AttributeValue:\n if (afterHrefOrSrc) {\n const attributeValue = scanner.getTokenText();\n const link = createLink(\n document,\n documentContext,\n attributeValue,\n scanner.getTokenOffset(),\n scanner.getTokenEnd(),\n base!\n );\n if (link) {\n newLinks.push(link);\n }\n if (afterBase && typeof base === 'undefined') {\n base = stripQuotes(attributeValue);\n }\n afterBase = false;\n afterHrefOrSrc = false;\n }\n break;\n }\n token = scanner.scan();\n }\n return newLinks;\n}\n", "import { Location, Range, SymbolInformation, SymbolKind } from 'vscode-languageserver-types';\nimport type { TextDocument } from 'vscode-languageserver-textdocument';\nimport { HTMLDocument, Node } from '../parser/htmlParser';\n\nexport function findDocumentSymbols(document: TextDocument, htmlDocument: HTMLDocument): SymbolInformation[] {\n const symbols = <SymbolInformation[]>[];\n\n htmlDocument.roots.forEach(node => {\n provideFileSymbolsInternal(document, node, '', symbols);\n });\n\n return symbols;\n}\n\nfunction provideFileSymbolsInternal(\n document: TextDocument,\n node: Node,\n container: string,\n symbols: SymbolInformation[]\n): void {\n if (node.isInterpolation) {\n return;\n }\n const name = nodeToName(node);\n if (name !== '') {\n const location = Location.create(\n document.uri,\n Range.create(document.positionAt(node.start), document.positionAt(node.end))\n );\n const symbol: SymbolInformation = {\n name,\n location,\n containerName: container,\n kind: <SymbolKind>SymbolKind.Field\n };\n\n symbols.push(symbol);\n }\n\n node.children.forEach(child => {\n provideFileSymbolsInternal(document, child, name, symbols);\n });\n}\n\nfunction nodeToName(node: Node): string {\n let name = node.tag;\n\n if (!name) {\n return '';\n }\n\n if (node.attributes) {\n const id = node.attributes['id'];\n const classes = node.attributes['class'];\n const slotRelatedAttrs = getVueSlotAttributes(node);\n\n if (id) {\n name += `#${id.replace(/[\\\"\\']/g, '')}`;\n }\n\n if (classes) {\n name += classes\n .replace(/[\\\"\\']/g, '')\n .split(/\\s+/)\n .map(className => `.${className}`)\n .join('');\n }\n\n if (slotRelatedAttrs.length > 0) {\n name += `[${slotRelatedAttrs.join(' ')}]`;\n }\n }\n\n return name;\n}\n\nfunction getVueSlotAttributes(node: Node) {\n const vueSlotAttributes = node.attributeNames.filter(attr => attr.startsWith('#') || attr.startsWith('v-slot:'));\n\n const slotName = node.attributes?.name;\n if (node.tag === 'slot' && slotName) {\n vueSlotAttributes.push(`name=${slotName}`);\n }\n return vueSlotAttributes;\n}\n", "import _ from 'lodash';\nimport { Range, TextEdit, Position } from 'vscode-languageserver-types';\nimport type { TextDocument } from 'vscode-languageserver-textdocument';\nimport { html as htmlBeautify, HTMLBeautifyOptions } from 'js-beautify';\nimport { getFileFsPath } from '../../../utils/paths';\nimport { VLSFormatConfig } from '../../../config';\nimport { prettierify } from '../../../utils/prettier';\nimport { DependencyService, RuntimeLibrary } from '../../../services/dependencyService';\nimport { ParserOptions as PrettierParserOptions } from 'prettier';\n\nconst TEMPLATE_HEAD = '<template>';\nconst TEMPLATE_TAIL = '</template>';\n\ntype PrettyHtmlConfig = RuntimeLibrary['@starptech/prettyhtml'] extends (input: string, options: infer R) => any\n ? NonNullable<R>\n : never;\n\nexport function htmlFormat(\n dependencyService: DependencyService,\n document: TextDocument,\n currRange: Range,\n vlsFormatConfig: VLSFormatConfig\n): TextEdit[] {\n if (vlsFormatConfig.defaultFormatter.html === 'none') {\n return [];\n }\n\n const { value, range } = getValueAndRange(document, currRange);\n\n const originalSource = TEMPLATE_HEAD + value + TEMPLATE_TAIL;\n let beautifiedHtml: string;\n\n if (vlsFormatConfig.defaultFormatter.html === 'prettyhtml') {\n beautifiedHtml = formatWithPrettyHtml(\n dependencyService,\n getFileFsPath(document.uri),\n originalSource,\n vlsFormatConfig\n );\n } else if (vlsFormatConfig.defaultFormatter.html === 'prettier') {\n const prettierResult = formatWithPrettier(\n dependencyService,\n originalSource,\n getFileFsPath(document.uri),\n currRange,\n vlsFormatConfig,\n false\n );\n if (prettierResult[0] && prettierResult[0].newText) {\n beautifiedHtml = prettierResult[0].newText.trim();\n } else {\n beautifiedHtml = originalSource;\n }\n } else {\n beautifiedHtml = formatWithJsBeautify(originalSource, vlsFormatConfig);\n }\n\n const wrappedHtml = beautifiedHtml.substring(TEMPLATE_HEAD.length, beautifiedHtml.length - TEMPLATE_TAIL.length);\n return [\n {\n range,\n newText: wrappedHtml\n }\n ];\n}\n\nfunction formatWithPrettyHtml(\n dependencyService: DependencyService,\n fileFsPath: string,\n input: string,\n vlsFormatConfig: VLSFormatConfig\n): string {\n const prettier = dependencyService.get('prettier', fileFsPath).module;\n const prettierrcOptions = prettier.resolveConfig.sync(fileFsPath, { useCache: false }) || null;\n\n const prettyhtml = dependencyService.get('@starptech/prettyhtml', fileFsPath).module;\n\n const result = prettyhtml(input, getPrettyHtmlOptions(prettierrcOptions, vlsFormatConfig));\n return result.contents.trim();\n}\n\nfunction formatWithJsBeautify(input: string, vlsFormatConfig: VLSFormatConfig): string {\n const htmlFormattingOptions = _.assign(\n defaultHtmlOptions,\n {\n indent_with_tabs: vlsFormatConfig.options.useTabs,\n indent_size: vlsFormatConfig.options.tabSize\n },\n vlsFormatConfig.defaultFormatterOptions['js-beautify-html'],\n { end_with_newline: false }\n );\n\n return htmlBeautify(input, htmlFormattingOptions);\n}\n\nfunction formatWithPrettier(\n dependencyService: DependencyService,\n code: string,\n fileFsPath: string,\n range: Range,\n vlsFormatConfig: VLSFormatConfig,\n initialIndent: boolean\n) {\n return prettierify(dependencyService, code, fileFsPath, 'vue', range, vlsFormatConfig, initialIndent);\n}\n\nfunction getPrettyHtmlOptions(\n prettierrcOptions: Partial<PrettierParserOptions> | null,\n vlsFormatConfig: VLSFormatConfig\n) {\n const fromVls = {\n useTabs: vlsFormatConfig.options.useTabs,\n tabWidth: vlsFormatConfig.options.tabSize\n };\n\n const fromPrettier: Partial<PrettyHtmlConfig> = {};\n if (prettierrcOptions) {\n fromPrettier.useTabs = prettierrcOptions.useTabs;\n fromPrettier.tabWidth = prettierrcOptions.tabWidth;\n fromPrettier.printWidth = prettierrcOptions.printWidth;\n }\n\n return {\n ...fromVls,\n ...fromPrettier,\n usePrettier: true,\n prettier: {\n ...prettierrcOptions\n },\n ...vlsFormatConfig.defaultFormatterOptions['prettyhtml']\n };\n}\n\nfunction getValueAndRange(document: TextDocument, currRange: Range): { value: string; range: Range } {\n let value = document.getText();\n let range = currRange;\n\n if (currRange) {\n const startOffset = document.offsetAt(currRange.start);\n const endOffset = document.offsetAt(currRange.end);\n value = value.substring(startOffset, endOffset);\n } else {\n range = Range.create(Position.create(0, 0), document.positionAt(value.length));\n }\n return { value, range };\n}\n\nconst defaultHtmlOptions: HTMLBeautifyOptions = {\n end_with_newline: false, // End output with newline\n indent_char: ' ', // Indentation character\n indent_handlebars: false, // e.g. {{#foo}}, {{/foo}}\n indent_inner_html: false, // Indent <head> and <body> sections\n indent_scripts: 'keep', // [keep|separate|normal]\n indent_size: 2, // Indentation size\n indent_with_tabs: false,\n max_preserve_newlines: 1, // Maximum number of line breaks to be preserved in one chunk (0 disables)\n preserve_newlines: true, // Whether existing line breaks before elements should be preserved\n unformatted: [], // Tags that shouldn't be formatted. Causes mis-alignment\n wrap_line_length: 0, // Lines should wrap at next opportunity after this number of characters (0 disables)\n wrap_attributes: 'force-expand-multiline' as any\n // Wrap attributes to new lines [auto|force|force-aligned|force-expand-multiline] [\"auto\"]\n};\n", "import { ESLint, Linter } from 'eslint';\nimport { configs } from 'eslint-plugin-vue';\nimport { Diagnostic, Range, DiagnosticSeverity } from 'vscode-languageserver-types';\nimport type { TextDocument } from 'vscode-languageserver-textdocument';\nimport { resolve } from 'path';\nimport { VueVersion } from '../../../utils/vueVersion';\n\nfunction toDiagnostic(error: Linter.LintMessage): Diagnostic {\n const line = error.line - 1;\n const column = error.column - 1;\n const endLine = error.endLine ? error.endLine - 1 : line;\n const endColumn = error.endColumn ? error.endColumn - 1 : column;\n return {\n range: Range.create(line, column, endLine, endColumn),\n message: `[${error.ruleId}]\\n${error.message}`,\n source: 'eslint-plugin-vue',\n severity: error.severity === 1 ? DiagnosticSeverity.Warning : DiagnosticSeverity.Error\n };\n}\n\nexport async function doESLintValidation(document: TextDocument, engine: ESLint): Promise<Diagnostic[]> {\n const rawText = document.getText();\n // skip checking on empty template\n if (rawText.replace(/\\s/g, '') === '') {\n return [];\n }\n const text = rawText.replace(/ {10}/, '<template>') + '</template>';\n const report = await engine.lintText(text, { filePath: document.uri });\n\n return report?.[0]?.messages?.map(toDiagnostic) ?? [];\n}\n\nexport function createLintEngine(vueVersion: VueVersion) {\n const SERVER_ROOT = __dirname;\n\n const versionSpecificConfig: Linter.Config =\n vueVersion === VueVersion.V30 ? configs['vue3-essential'] : configs.essential;\n if (vueVersion === VueVersion.V30) {\n versionSpecificConfig.parserOptions = {\n ...versionSpecificConfig.parserOptions,\n vueFeatures: {\n ...versionSpecificConfig.parserOptions?.vueFeatures,\n interpolationAsNonHTML: true\n }\n };\n }\n versionSpecificConfig.rules = {\n ...versionSpecificConfig.rules,\n 'vue/multi-word-component-names': 0\n };\n\n const baseConfig: Linter.Config = configs.base;\n baseConfig.ignorePatterns = ['!.*'];\n\n return new ESLint({\n useEslintrc: false,\n cwd: SERVER_ROOT,\n baseConfig,\n overrideConfig: versionSpecificConfig\n });\n}\n", "import { Range, Location } from 'vscode-languageserver-types';\nimport { VueFileInfo } from '../../services/vueInfoService';\nimport { URI } from 'vscode-uri';\nimport { kebabCase } from 'lodash';\n\nexport function getTagDefinition(vueFileInfo: VueFileInfo, tag: string): Location[] {\n if (!vueFileInfo.componentInfo.childComponents) {\n return [];\n }\n\n const childComponent = vueFileInfo.componentInfo.childComponents.find(\n cc => !!cc.definition && [tag, tag.toLowerCase(), kebabCase(tag)].includes(cc.name)\n );\n\n if (!childComponent) {\n return [];\n }\n\n const loc: Location = {\n uri: URI.file(childComponent.definition!.path).toString(),\n // TODO: Resolve actual default export range\n range: Range.create(0, 0, 0, 0)\n };\n return [loc];\n}\n", "import { HTMLDocument } from '../parser/htmlParser';\nimport { HtmlTokenType, createScanner } from '../parser/htmlScanner';\nimport { Position, Location } from 'vscode-languageserver-types';\nimport type { TextDocument } from 'vscode-languageserver-textdocument';\nimport { VueFileInfo } from '../../../services/vueInfoService';\nimport { getTagDefinition } from '../../template-common/tagDefinition';\n\nconst TRIVIAL_TOKEN = [HtmlTokenType.StartTagOpen, HtmlTokenType.EndTagOpen, HtmlTokenType.Whitespace];\n\nexport function findDefinition(\n document: TextDocument,\n position: Position,\n htmlDocument: HTMLDocument,\n vueFileInfo?: VueFileInfo\n): Location[] {\n if (!vueFileInfo) {\n return [];\n }\n\n const offset = document.offsetAt(position);\n const node = htmlDocument.findNodeAt(offset);\n if (!node || !node.tag) {\n return [];\n }\n\n const inEndTag = node.endTagStart && offset >= node.endTagStart; // <html></ht|ml>\n const startOffset = inEndTag ? node.endTagStart : node.start;\n const scanner = createScanner(document.getText(), startOffset);\n let token = scanner.scan();\n\n function shouldAdvance() {\n if (token === HtmlTokenType.EOS) {\n return false;\n }\n const tokenEnd = scanner.getTokenEnd();\n if (tokenEnd < offset) {\n return true;\n }\n\n if (tokenEnd === offset) {\n return TRIVIAL_TOKEN.includes(token);\n }\n return false;\n }\n\n while (shouldAdvance()) {\n token = scanner.scan();\n }\n\n if (offset > scanner.getTokenEnd()) {\n return [];\n }\n\n switch (token) {\n case HtmlTokenType.StartTag:\n case HtmlTokenType.EndTag:\n return getTagDefinition(vueFileInfo, node.tag);\n }\n\n return [];\n}\n", "/* tslint:disable:max-line-length */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n/*!\nBEGIN THIRD PARTY\n*/\n/*--------------------------------------------------------------------------------------------\n * This file is based on or incorporates material from the projects listed below (Third Party IP).\n * The original copyright notice and the license under which Microsoft received such Third Party IP,\n * are set forth below. Such licenses and notices are provided for informational purposes only.\n * Microsoft licenses the Third Party IP to you under the licensing terms for the Microsoft product.\n * Microsoft reserves all other rights not expressly granted under this agreement, whether by implication,\n * estoppel or otherwise.\n *--------------------------------------------------------------------------------------------*/\n/*---------------------------------------------------------------------------------------------\n * Copyright \u00A9 2015 W3C\u00AE (MIT, ERCIM, Keio, Beihang). This software or document includes includes material copied\n * from or derived from HTML 5.1 W3C Working Draft (http://www.w3.org/TR/2015/WD-html51-20151008/.)\"\n *--------------------------------------------------------------------------------------------*/\n\nimport {\n ITagSet,\n HTMLTagSpecification,\n IHTMLTagProvider,\n IValueSets,\n Attribute,\n AttributeCollector,\n collectTagsDefault,\n collectAttributesDefault,\n collectValuesDefault,\n TagProviderPriority\n} from './common';\nimport { MarkupContent } from 'vscode-languageserver-types';\n\n// As defined in https://www.w3.org/TR/html5/syntax.html#void-elements\nexport const VOID_ELEMENTS: string[] = [\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'menuitem',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n];\n\nexport function isVoidElement(e: string | undefined): boolean {\n return !!e && binarySearch(VOID_ELEMENTS, e.toLowerCase(), (s1: string, s2: string) => s1.localeCompare(s2)) >= 0;\n}\n\nfunction genAttr(attrString: string) {\n const [label, type] = attrString.split(':');\n return { label, type };\n}\n\nfunction genTag(documentation: string, attrs?: string[]): HTMLTagSpecification {\n const attributes: Attribute[] | undefined = attrs && attrs.map(genAttr);\n return new HTMLTagSpecification(documentation, attributes);\n}\n\n// HTML tag information sourced from http://www.w3.org/TR/2015/WD-html51-20151008/\nexport const HTML_TAGS: ITagSet = {\n // The root element\n html: genTag('The html element represents the root of an HTML document.', ['manifest']),\n // Document metadata\n head: genTag('The head element represents a collection of metadata for the Document.'),\n title: genTag(\n \"The title element represents the document's title or name. Authors should use titles that identify their documents even when they are used out of context, for example in a user's history or bookmarks, or in search results. The document's title is often different from its first heading, since the first heading does not have to stand alone when taken out of context.\"\n ),\n base: genTag(\n 'The base element allows authors to specify the document base URL for the purposes of resolving relative URLs, and the name of the default browsing context for the purposes of following hyperlinks. The element does not represent any content beyond this information.',\n ['href', 'target']\n ),\n link: genTag('The link element allows authors to link their document to other resources.', [\n 'href',\n 'crossorigin:xo',\n 'rel',\n 'media',\n 'hreflang',\n 'type',\n 'sizes'\n ]),\n meta: genTag(\n 'The meta element represents various kinds of metadata that cannot be expressed using the title, base, link, style, and script elements.',\n ['name', 'http-equiv', 'content', 'charset']\n ),\n style: genTag(\n 'The style element allows authors to embed style information in their documents. The style element is one of several inputs to the styling processing model. The element does not represent content for the user.',\n ['media', 'nonce', 'type', 'scoped:v']\n ),\n // Sections\n body: genTag('The body element represents the content of the document.', [\n 'onafterprint',\n 'onbeforeprint',\n 'onbeforeunload',\n 'onhashchange',\n 'onlanguagechange',\n 'onmessage',\n 'onoffline',\n 'ononline',\n 'onpagehide',\n 'onpageshow',\n 'onpopstate',\n 'onstorage',\n 'onunload'\n ]),\n article: genTag(\n 'The article element represents a complete, or self-contained, composition in a document, page, application, or site and that is, in principle, independently distributable or reusable, e.g. in syndication. This could be a forum post, a magazine or newspaper article, a blog entry, a user-submitted comment, an interactive widget or gadget, or any other independent item of content. Each article should be identified, typically by including a heading (h1\u2013h6 element) as a child of the article element.'\n ),\n section: genTag(\n 'The section element represents a generic section of a document or application. A section, in this context, is a thematic grouping of content. Each section should be identified, typically by including a heading ( h1- h6 element) as a child of the section element.'\n ),\n nav: genTag(\n 'The nav element represents a section of a page that links to other pages or to parts within the page: a section with navigation links.'\n ),\n aside: genTag(\n 'The aside element represents a section of a page that consists of content that is tangentially related to the content around the aside element, and which could be considered separate from that content. Such sections are often represented as sidebars in printed typography.'\n ),\n h1: genTag('The h1 element represents a section heading.'),\n h2: genTag('The h2 element represents a section heading.'),\n h3: genTag('The h3 element represents a section heading.'),\n h4: genTag('The h4 element represents a section heading.'),\n h5: genTag('The h5 element represents a section heading.'),\n h6: genTag('The h6 element represents a section heading.'),\n header: genTag(\n 'The header element represents introductory content for its nearest ancestor sectioning content or sectioning root element. A header typically contains a group of introductory or navigational aids. When the nearest ancestor sectioning content or sectioning root element is the body element, then it applies to the whole page.'\n ),\n footer: genTag(\n 'The footer element represents a footer for its nearest ancestor sectioning content or sectioning root element. A footer typically contains information about its section such as who wrote it, links to related documents, copyright data, and the like.'\n ),\n address: genTag(\n 'The address element represents the contact information for its nearest article or body element ancestor. If that is the body element, then the contact information applies to the document as a whole.'\n ),\n // Grouping content\n p: genTag('The p element represents a paragraph.'),\n hr: genTag(\n 'The hr element represents a paragraph-level thematic break, e.g. a scene change in a story, or a transition to another topic within a section of a reference book.'\n ),\n pre: genTag(\n 'The pre element represents a block of preformatted text, in which structure is represented by typographic conventions rather than by elements.'\n ),\n blockquote: genTag(\n 'The blockquote element represents content that is quoted from another source, optionally with a citation which must be within a footer or cite element, and optionally with in-line changes such as annotations and abbreviations.',\n ['cite']\n ),\n ol: genTag(\n 'The ol element represents a list of items, where the items have been intentionally ordered, such that changing the order would change the meaning of the document.',\n ['reversed:v', 'start', 'type:lt']\n ),\n ul: genTag(\n 'The ul element represents a list of items, where the order of the items is not important \u2014 that is, where changing the order would not materially change the meaning of the document.'\n ),\n li: genTag(\n \"The li element represents a list item. If its parent element is an ol, ul, or menu element, then the element is an item of the parent element's list, as defined for those elements. Otherwise, the list item has no defined list-related relationship to any other li element.\",\n ['value']\n ),\n dl: genTag(\n 'The dl element represents an association list consisting of zero or more name-value groups (a description list). A name-value group consists of one or more names (dt elements) followed by one or more values (dd elements), ignoring any nodes other than dt and dd elements. Within a single dl element, there should not be more than one dt element for each name.'\n ),\n dt: genTag(\n 'The dt element represents the term, or name, part of a term-description group in a description list (dl element).'\n ),\n dd: genTag(\n 'The dd element represents the description, definition, or value, part of a term-description group in a description list (dl element).'\n ),\n figure: genTag(\n 'The figure element represents some flow content, optionally with a caption, that is self-contained (like a complete sentence) and is typically referenced as a single unit from the main flow of the document.'\n ),\n figcaption: genTag(\n \"The figcaption element represents a caption or legend for the rest of the contents of the figcaption element's parent figure element, if any.\"\n ),\n main: genTag(\n 'The main element represents the main content of the body of a document or application. The main content area consists of content that is directly related to or expands upon the central topic of a document or central functionality of an application.'\n ),\n div: genTag(\n 'The div element has no special meaning at all. It represents its children. It can be used with the class, lang, and title attributes to mark up semantics common to a group of consecutive elements.'\n ),\n // Text-level semantics\n a: genTag(\n 'If the a element has an href attribute, then it represents a hyperlink (a hypertext anchor) labeled by its contents.',\n ['href', 'target', 'download', 'ping', 'rel', 'hreflang', 'type']\n ),\n em: genTag('The em element represents stress emphasis of its contents.'),\n strong: genTag('The strong element represents strong importance, seriousness, or urgency for its contents.'),\n small: genTag('The small element represents side comments such as small print.'),\n s: genTag('The s element represents contents that are no longer accurate or no longer relevant.'),\n cite: genTag(\n 'The cite element represents a reference to a creative work. It must include the title of the work or the name of the author(person, people or organization) or an URL reference, or a reference in abbreviated form as per the conventions used for the addition of citation metadata.'\n ),\n q: genTag('The q element represents some phrasing content quoted from another source.', ['cite']),\n dfn: genTag(\n 'The dfn element represents the defining instance of a term. The paragraph, description list group, or section that is the nearest ancestor of the dfn element must also contain the definition(s) for the term given by the dfn element.'\n ),\n abbr: genTag(\n 'The abbr element represents an abbreviation or acronym, optionally with its expansion. The title attribute may be used to provide an expansion of the abbreviation. The attribute, if specified, must contain an expansion of the abbreviation, and nothing else.'\n ),\n ruby: genTag(\n 'The ruby element allows one or more spans of phrasing content to be marked with ruby annotations. Ruby annotations are short runs of text presented alongside base text, primarily used in East Asian typography as a guide for pronunciation or to include other annotations. In Japanese, this form of typography is also known as furigana. Ruby text can appear on either side, and sometimes both sides, of the base text, and it is possible to control its position using CSS. A more complete introduction to ruby can be found in the Use Cases & Exploratory Approaches for Ruby Markup document as well as in CSS Ruby Module Level 1. [RUBY-UC] [CSSRUBY]'\n ),\n rb: genTag(\n \"The rb element marks the base text component of a ruby annotation. When it is the child of a ruby element, it doesn't represent anything itself, but its parent ruby element uses it as part of determining what it represents.\"\n ),\n rt: genTag(\n \"The rt element marks the ruby text component of a ruby annotation. When it is the child of a ruby element or of an rtc element that is itself the child of a ruby element, it doesn't represent anything itself, but its ancestor ruby element uses it as part of determining what it represents.\"\n ),\n // <rtc> is not yet supported by 2+ browsers\n //rtc: genTag(\n // 'The rtc element marks a ruby text container for ruby text components in a ruby annotation. When it is the child of a ruby element it doesn\\'t represent anything itself, but its parent ruby element uses it as part of determining what it represents.'),\n rp: genTag(\n \"The rp element is used to provide fallback text to be shown by user agents that don't support ruby annotations. One widespread convention is to provide parentheses around the ruby text component of a ruby annotation.\"\n ),\n // <data> is not yet supported by 2+ browsers\n //data: genTag(\n // 'The data element represents its contents, along with a machine-readable form of those contents in the value attribute.'),\n time: genTag(\n 'The time element represents its contents, along with a machine-readable form of those contents in the datetime attribute. The kind of content is limited to various kinds of dates, times, time-zone offsets, and durations, as described below.',\n ['datetime']\n ),\n code: genTag(\n 'The code element represents a fragment of computer code. This could be an XML element name, a file name, a computer program, or any other string that a computer would recognize.'\n ),\n var: genTag(\n 'The var element represents a variable. This could be an actual variable in a mathematical expression or programming context, an identifier representing a constant, a symbol identifying a physical quantity, a function parameter, or just be a term used as a placeholder in prose.'\n ),\n samp: genTag('The samp element represents sample or quoted output from another program or computing system.'),\n kbd: genTag(\n 'The kbd element represents user input (typically keyboard input, although it may also be used to represent other input, such as voice commands.'\n ),\n sub: genTag('The sub element represents a subscript.'),\n sup: genTag('The sup element represents a superscript.'),\n i: genTag(\n 'The i element represents a span of text in an alternate voice or mood, or otherwise offset from the normal prose in a manner indicating a different quality of text, such as a taxonomic designation, a technical term, an idiomatic phrase from another language, transliteration, a thought, or a ship name in Western texts.'\n ),\n b: genTag(\n 'The b element represents a span of text to which attention is being drawn for utilitarian purposes without conveying any extra importance and with no implication of an alternate voice or mood, such as key words in a document abstract, product names in a review, actionable words in interactive text-driven software, or an article lede.'\n ),\n u: genTag(\n 'The u element represents a span of text with an unarticulated, though explicitly rendered, non-textual annotation, such as labeling the text as being a proper name in Chinese text (a Chinese proper name mark), or labeling the text as being misspelt.'\n ),\n mark: genTag(\n \"The mark element represents a run of text in one document marked or highlighted for reference purposes, due to its relevance in another context. When used in a quotation or other block of text referred to from the prose, it indicates a highlight that was not originally present but which has been added to bring the reader's attention to a part of the text that might not have been considered important by the original author when the block was originally written, but which is now under previously unexpected scrutiny. When used in the main prose of a document, it indicates a part of the document that has been highlighted due to its likely relevance to the user's current activity.\"\n ),\n bdi: genTag(\n 'The bdi element represents a span of text that is to be isolated from its surroundings for the purposes of bidirectional text formatting. [BIDI]'\n ),\n bdo: genTag(\n 'The bdo element represents explicit text directionality formatting control for its children. It allows authors to override the Unicode bidirectional algorithm by explicitly specifying a direction override. [BIDI]'\n ),\n span: genTag(\n \"The span element doesn't mean anything on its own, but can be useful when used together with the global attributes, e.g. class, lang, or dir. It represents its children.\"\n ),\n br: genTag('The br element represents a line break.'),\n wbr: genTag('The wbr element represents a line break opportunity.'),\n // Edits\n ins: genTag('The ins element represents an addition to the document.'),\n del: genTag('The del element represents a removal from the document.', ['cite', 'datetime']),\n // Embedded content\n picture: genTag(\n 'The picture element is a container which provides multiple sources to its contained img element to allow authors to declaratively control or give hints to the user agent about which image resource to use, based on the screen pixel density, viewport size, image format, and other factors. It represents its children.'\n ),\n img: genTag('An img element represents an image.', [\n 'alt',\n 'src',\n 'srcset',\n 'crossorigin:xo',\n 'usemap',\n 'ismap:v',\n 'width',\n 'height'\n ]),\n iframe: genTag('The iframe element represents a nested browsing context.', [\n 'src',\n 'srcdoc',\n 'name',\n 'sandbox:sb',\n 'seamless:v',\n 'allowfullscreen:v',\n 'width',\n 'height'\n ]),\n embed: genTag(\n 'The embed element provides an integration point for an external (typically non-HTML) application or interactive content.',\n ['src', 'type', 'width', 'height']\n ),\n object: genTag(\n 'The object element can represent an external resource, which, depending on the type of the resource, will either be treated as an image, as a nested browsing context, or as an external resource to be processed by a plugin.',\n ['data', 'type', 'typemustmatch:v', 'name', 'usemap', 'form', 'width', 'height']\n ),\n param: genTag(\n 'The param element defines parameters for plugins invoked by object elements. It does not represent anything on its own.',\n ['name', 'value']\n ),\n video: genTag('A video element is used for playing videos or movies, and audio files with captions.', [\n 'src',\n 'crossorigin:xo',\n 'poster',\n 'preload:pl',\n 'autoplay:v',\n 'mediagroup',\n 'loop:v',\n 'muted:v',\n 'controls:v',\n 'width',\n 'height'\n ]),\n audio: genTag('An audio element represents a sound or audio stream.', [\n 'src',\n 'crossorigin:xo',\n 'preload:pl',\n 'autoplay:v',\n 'mediagroup',\n 'loop:v',\n 'muted:v',\n 'controls:v'\n ]),\n source: genTag(\n 'The source element allows authors to specify multiple alternative media resources for media elements. It does not represent anything on its own.',\n // 'When the source element has a parent that is a picture element, the source element allows authors to specify multiple alternative source sets for img elements.'\n ['src', 'type']\n ),\n track: genTag(\n 'The track element allows authors to specify explicit external timed text tracks for media elements. It does not represent anything on its own.',\n ['default:v', 'kind:tk', 'label', 'src', 'srclang']\n ),\n map: genTag(\n 'The map element, in conjunction with an img element and any area element descendants, defines an image map. The element represents its children.',\n ['name']\n ),\n area: genTag(\n 'The area element represents either a hyperlink with some text and a corresponding area on an image map, or a dead area on an image map.',\n ['alt', 'coords', 'shape:sh', 'href', 'target', 'download', 'ping', 'rel', 'hreflang', 'type']\n ),\n // Tabular data\n table: genTag('The table element represents data with more than one dimension, in the form of a table.', [\n 'sortable:v',\n 'border'\n ]),\n caption: genTag(\n 'The caption element represents the title of the table that is its parent, if it has a parent and that is a table element.'\n ),\n colgroup: genTag(\n 'The colgroup element represents a group of one or more columns in the table that is its parent, if it has a parent and that is a table element.',\n ['span']\n ),\n col: genTag(\n 'If a col element has a parent and that is a colgroup element that itself has a parent that is a table element, then the col element represents one or more columns in the column group represented by that colgroup.',\n ['span']\n ),\n tbody: genTag(\n 'The tbody element represents a block of rows that consist of a body of data for the parent table element, if the tbody element has a parent and it is a table.'\n ),\n thead: genTag(\n 'The thead element represents the block of rows that consist of the column labels (headers) for the parent table element, if the thead element has a parent and it is a table.'\n ),\n tfoot: genTag(\n 'The tfoot element represents the block of rows that consist of the column summaries (footers) for the parent table element, if the tfoot element has a parent and it is a table.'\n ),\n tr: genTag('The tr element represents a row of cells in a table.'),\n td: genTag('The td element represents a data cell in a table.', ['colspan', 'rowspan', 'headers']),\n th: genTag('The th element represents a header cell in a table.', [\n 'colspan',\n 'rowspan',\n 'headers',\n 'scope:s',\n 'sorted',\n 'abbr'\n ]),\n // Forms\n form: genTag(\n 'The form element represents a collection of form-associated elements, some of which can represent editable values that can be submitted to a server for processing.',\n ['accept-charset', 'action', 'autocomplete:o', 'enctype:et', 'method:m', 'name', 'novalidate:v', 'target']\n ),\n label: genTag(\n \"The label element represents a caption in a user interface. The caption can be associated with a specific form control, known as the label element's labeled control, either using the for attribute, or by putting the form control inside the label element itself.\",\n ['form', 'for']\n ),\n input: genTag(\n 'The input element represents a typed data field, usually with a form control to allow the user to edit the data.',\n [\n 'accept',\n 'alt',\n 'autocomplete:inputautocomplete',\n 'autofocus:v',\n 'checked:v',\n 'dirname',\n 'disabled:v',\n 'form',\n 'formaction',\n 'formenctype:et',\n 'formmethod:fm',\n 'formnovalidate:v',\n 'formtarget',\n 'height',\n 'inputmode:im',\n 'list',\n 'max',\n 'maxlength',\n 'min',\n 'minlength',\n 'multiple:v',\n 'name',\n 'pattern',\n 'placeholder',\n 'readonly:v',\n 'required:v',\n 'size',\n 'src',\n 'step',\n 'type:t',\n 'value',\n 'width'\n ]\n ),\n button: genTag('The button element represents a button labeled by its contents.', [\n 'autofocus:v',\n 'disabled:v',\n 'form',\n 'formaction',\n 'formenctype:et',\n 'formmethod:fm',\n 'formnovalidate:v',\n 'formtarget',\n 'name',\n 'type:bt',\n 'value'\n ]),\n select: genTag('The select element represents a control for selecting amongst a set of options.', [\n 'autocomplete:inputautocomplete',\n 'autofocus:v',\n 'disabled:v',\n 'form',\n 'multiple:v',\n 'name',\n 'required:v',\n 'size'\n ]),\n datalist: genTag(\n 'The datalist element represents a set of option elements that represent predefined options for other controls. In the rendering, the datalist element represents nothing and it, along with its children, should be hidden.'\n ),\n optgroup: genTag('The optgroup element represents a group of option elements with a common label.', [\n 'disabled:v',\n 'label'\n ]),\n option: genTag(\n 'The option element represents an option in a select element or as part of a list of suggestions in a datalist element.',\n ['disabled:v', 'label', 'selected:v', 'value']\n ),\n textarea: genTag(\n \"The textarea element represents a multiline plain text edit control for the element's raw value. The contents of the control represent the control's default value.\",\n [\n 'autocomplete:inputautocomplete',\n 'autofocus:v',\n 'cols',\n 'dirname',\n 'disabled:v',\n 'form',\n 'inputmode:im',\n 'maxlength',\n 'minlength',\n 'name',\n 'placeholder',\n 'readonly:v',\n 'required:v',\n 'rows',\n 'wrap:w'\n ]\n ),\n output: genTag(\n 'The output element represents the result of a calculation performed by the application, or the result of a user action.',\n ['for', 'form', 'name']\n ),\n progress: genTag(\n 'The progress element represents the completion progress of a task. The progress is either indeterminate, indicating that progress is being made but that it is not clear how much more work remains to be done before the task is complete (e.g. because the task is waiting for a remote host to respond), or the progress is a number in the range zero to a maximum, giving the fraction of work that has so far been completed.',\n ['value', 'max']\n ),\n meter: genTag(\n 'The meter element represents a scalar measurement within a known range, or a fractional value; for example disk usage, the relevance of a query result, or the fraction of a voting population to have selected a particular candidate.',\n ['value', 'min', 'max', 'low', 'high', 'optimum']\n ),\n fieldset: genTag('The fieldset element represents a set of form controls optionally grouped under a common name.', [\n 'disabled:v',\n 'form',\n 'name'\n ]),\n legend: genTag(\n \"The legend element represents a caption for the rest of the contents of the legend element's parent fieldset element, if any.\"\n ),\n // Interactive elements\n details: genTag(\n 'The details element represents a disclosure widget from which the user can obtain additional information or controls.',\n ['open:v']\n ),\n summary: genTag(\n \"The summary element represents a summary, caption, or legend for the rest of the contents of the summary element's parent details element, if any.\"\n ),\n // <menu> and <menuitem> are not yet supported by 2+ browsers\n //menu: genTag(\n // 'The menu element represents a list of commands.',\n // ['type:mt', 'label']),\n //menuitem: genTag(\n // 'The menuitem element represents a command that the user can invoke from a popup menu (either a context menu or the menu of a menu button).'),\n dialog: genTag(\n 'The dialog element represents a part of an application that a user interacts with to perform a task, for example a dialog box, inspector, or window.'\n ),\n // Scripting\n script: genTag(\n 'The script element allows authors to include dynamic script and data blocks in their documents. The element does not represent content for the user.',\n ['src', 'type', 'charset', 'async:v', 'defer:v', 'crossorigin:xo', 'nonce']\n ),\n noscript: genTag(\n \"The noscript element represents nothing if scripting is enabled, and represents its children if scripting is disabled. It is used to present different markup to user agents that support scripting and those that don't support scripting, by affecting how the document is parsed.\"\n ),\n canvas: genTag(\n 'The canvas element provides scripts with a resolution-dependent bitmap canvas, which can be used for rendering graphs, game graphics, art, or other visual images on the fly.',\n ['width', 'height']\n )\n};\n\nexport function getHTML5TagProvider(): IHTMLTagProvider {\n const globalAttributes = [\n 'aria-activedescendant',\n 'aria-atomic:b',\n 'aria-autocomplete:autocomplete',\n 'aria-busy:b',\n 'aria-checked:tristate',\n 'aria-colcount',\n 'aria-colindex',\n 'aria-colspan',\n 'aria-controls',\n 'aria-current:current',\n 'aria-describedat',\n 'aria-describedby',\n 'aria-disabled:b',\n 'aria-dropeffect:dropeffect',\n 'aria-errormessage',\n 'aria-expanded:u',\n 'aria-flowto',\n 'aria-grabbed:u',\n 'aria-haspopup:b',\n 'aria-hidden:b',\n 'aria-invalid:invalid',\n 'aria-kbdshortcuts',\n 'aria-label',\n 'aria-labelledby',\n 'aria-level',\n 'aria-live:live',\n 'aria-modal:b',\n 'aria-multiline:b',\n 'aria-multiselectable:b',\n 'aria-orientation:orientation',\n 'aria-owns',\n 'aria-placeholder',\n 'aria-posinset',\n 'aria-pressed:tristate',\n 'aria-readonly:b',\n 'aria-relevant:relevant',\n 'aria-required:b',\n 'aria-roledescription',\n 'aria-rowcount',\n 'aria-rowindex',\n 'aria-rowspan',\n 'aria-selected:u',\n 'aria-setsize',\n 'aria-sort:sort',\n 'aria-valuemax',\n 'aria-valuemin',\n 'aria-valuenow',\n 'aria-valuetext',\n 'accesskey',\n 'class',\n 'contenteditable:b',\n 'contextmenu',\n 'dir:d',\n 'draggable:b',\n 'dropzone',\n 'hidden:v',\n 'id',\n 'itemid',\n 'itemprop',\n 'itemref',\n 'itemscope:v',\n 'itemtype',\n 'lang',\n 'role:roles',\n 'spellcheck:b',\n 'style',\n 'tabindex',\n 'title',\n 'translate:y'\n ].map(genAttr);\n\n const eventHandlers = [\n 'abort',\n 'blur',\n 'canplay',\n 'canplaythrough',\n 'change',\n 'click',\n 'contextmenu',\n 'dblclick',\n 'drag',\n 'dragend',\n 'dragenter',\n 'dragleave',\n 'dragover',\n 'dragstart',\n 'drop',\n 'durationchange',\n 'emptied',\n 'ended',\n 'error',\n 'focus',\n 'formchange',\n 'forminput',\n 'input',\n 'invalid',\n 'keydown',\n 'keypress',\n 'keyup',\n 'load',\n 'loadeddata',\n 'loadedmetadata',\n 'loadstart',\n 'mousedown',\n 'mousemove',\n 'mouseout',\n 'mouseover',\n 'mouseenter',\n 'mouseleave',\n 'mouseup',\n 'mousewheel',\n 'pause',\n 'play',\n 'playing',\n 'progress',\n 'ratechange',\n 'reset',\n 'resize',\n 'readystatechange',\n 'scroll',\n 'seeked',\n 'seeking',\n 'select',\n 'show',\n 'stalled',\n 'submit',\n 'suspend',\n 'timeupdate',\n 'volumechange',\n 'waiting'\n ];\n\n const valueSets: IValueSets = {\n b: ['true', 'false'],\n u: ['true', 'false', 'undefined'],\n o: ['on', 'off'],\n y: ['yes', 'no'],\n w: ['soft', 'hard'],\n d: ['ltr', 'rtl', 'auto'],\n m: ['GET', 'POST', 'dialog'],\n fm: ['GET', 'POST'],\n s: ['row', 'col', 'rowgroup', 'colgroup'],\n t: [\n 'hidden',\n 'text',\n 'search',\n 'tel',\n 'url',\n 'email',\n 'password',\n 'datetime',\n 'date',\n 'month',\n 'week',\n 'time',\n 'datetime-local',\n 'number',\n 'range',\n 'color',\n 'checkbox',\n 'radio',\n 'file',\n 'submit',\n 'image',\n 'reset',\n 'button'\n ],\n im: [\n 'verbatim',\n 'latin',\n 'latin-name',\n 'latin-prose',\n 'full-width-latin',\n 'kana',\n 'kana-name',\n 'katakana',\n 'numeric',\n 'tel',\n 'email',\n 'url'\n ],\n bt: ['button', 'submit', 'reset', 'menu'],\n lt: ['1', 'a', 'A', 'i', 'I'],\n mt: ['context', 'toolbar'],\n mit: ['command', 'checkbox', 'radio'],\n et: ['application/x-www-form-urlencoded', 'multipart/form-data', 'text/plain'],\n tk: ['subtitles', 'captions', 'descriptions', 'chapters', 'metadata'],\n pl: ['none', 'metadata', 'auto'],\n sh: ['circle', 'default', 'poly', 'rect'],\n xo: ['anonymous', 'use-credentials'],\n sb: [\n 'allow-forms',\n 'allow-modals',\n 'allow-pointer-lock',\n 'allow-popups',\n 'allow-popups-to-escape-sandbox',\n 'allow-same-origin',\n 'allow-scripts',\n 'allow-top-navigation'\n ],\n tristate: ['true', 'false', 'mixed', 'undefined'],\n inputautocomplete: [\n 'additional-name',\n 'address-level1',\n 'address-level2',\n 'address-level3',\n 'address-level4',\n 'address-line1',\n 'address-line2',\n 'address-line3',\n 'bday',\n 'bday-year',\n 'bday-day',\n 'bday-month',\n 'billing',\n 'cc-additional-name',\n 'cc-csc',\n 'cc-exp',\n 'cc-exp-month',\n 'cc-exp-year',\n 'cc-family-name',\n 'cc-given-name',\n 'cc-name',\n 'cc-number',\n 'cc-type',\n 'country',\n 'country-name',\n 'current-password',\n 'email',\n 'family-name',\n 'fax',\n 'given-name',\n 'home',\n 'honorific-prefix',\n 'honorific-suffix',\n 'impp',\n 'language',\n 'mobile',\n 'name',\n 'new-password',\n 'nickname',\n 'organization',\n 'organization-title',\n 'pager',\n 'photo',\n 'postal-code',\n 'sex',\n 'shipping',\n 'street-address',\n 'tel-area-code',\n 'tel',\n 'tel-country-code',\n 'tel-extension',\n 'tel-local',\n 'tel-local-prefix',\n 'tel-local-suffix',\n 'tel-national',\n 'transaction-amount',\n 'transaction-currency',\n 'url',\n 'username',\n 'work'\n ],\n autocomplete: ['inline', 'list', 'both', 'none'],\n current: ['page', 'step', 'location', 'date', 'time', 'true', 'false'],\n dropeffect: ['copy', 'move', 'link', 'execute', 'popup', 'none'],\n invalid: ['grammar', 'false', 'spelling', 'true'],\n live: ['off', 'polite', 'assertive'],\n orientation: ['vertical', 'horizontal', 'undefined'],\n relevant: ['additions', 'removals', 'text', 'all', 'additions text'],\n sort: ['ascending', 'descending', 'none', 'other'],\n roles: [\n 'alert',\n 'alertdialog',\n 'button',\n 'checkbox',\n 'dialog',\n 'gridcell',\n 'link',\n 'log',\n 'marquee',\n 'menuitem',\n 'menuitemcheckbox',\n 'menuitemradio',\n 'option',\n 'progressbar',\n 'radio',\n 'scrollbar',\n 'searchbox',\n 'slider',\n 'spinbutton',\n 'status',\n 'switch',\n 'tab',\n 'tabpanel',\n 'textbox',\n 'timer',\n 'tooltip',\n 'treeitem',\n 'combobox',\n 'grid',\n 'listbox',\n 'menu',\n 'menubar',\n 'radiogroup',\n 'tablist',\n 'tree',\n 'treegrid',\n 'application',\n 'article',\n 'cell',\n 'columnheader',\n 'definition',\n 'directory',\n 'document',\n 'feed',\n 'figure',\n 'group',\n 'heading',\n 'img',\n 'list',\n 'listitem',\n 'math',\n 'none',\n 'note',\n 'presentation',\n 'region',\n 'row',\n 'rowgroup',\n 'rowheader',\n 'separator',\n 'table',\n 'term',\n 'text',\n 'toolbar',\n 'banner',\n 'complementary',\n 'contentinfo',\n 'form',\n 'main',\n 'navigation',\n 'region',\n 'search'\n ]\n };\n\n return {\n getId: () => 'html5',\n collectTags: (collector: (tag: string, label: string | MarkupContent) => void) =>\n collectTagsDefault(collector, HTML_TAGS),\n collectAttributes: (tag: string, collector: AttributeCollector) => {\n collectAttributesDefault(tag, collector, HTML_TAGS, globalAttributes);\n eventHandlers.forEach(handler => {\n collector('@' + handler, 'event');\n });\n },\n priority: TagProviderPriority.Platform,\n collectValues: (tag: string, attribute: string, collector: (value: string) => void) =>\n collectValuesDefault(tag, attribute, collector, HTML_TAGS, globalAttributes, valueSets)\n };\n}\n\n/*!\nEND THIRD PARTY\n*/\n\nfunction binarySearch<T>(array: T[], key: T, comparator: (op1: T, op2: T) => number): number {\n let low = 0,\n high = array.length - 1;\n\n while (low <= high) {\n const mid = ((low + high) / 2) | 0;\n const comp = comparator(array[mid], key);\n if (comp < 0) {\n low = mid + 1;\n } else if (comp > 0) {\n high = mid - 1;\n } else {\n return mid;\n }\n }\n return -(low + 1);\n}\n", "/* tslint:disable:max-line-length */\nimport {\n HTMLTagSpecification,\n IHTMLTagProvider,\n collectTagsDefault,\n collectAttributesDefault,\n collectValuesDefault,\n genAttribute,\n AttributeCollector,\n TagProviderPriority,\n Attribute\n} from './common';\n\nfunction getAttribute(label: string, type: string | undefined, documentation: string) {\n const linkedDocumentation = documentation + '\\n\\n' + `[API Reference](https://vuejs.org/v2/api/#${label})`;\n return genAttribute(label, type, linkedDocumentation);\n}\n\nconst vueDirectives = [\n getAttribute('v-text', undefined, 'Updates the element\u2019s `textContent`.'),\n getAttribute('v-html', undefined, 'Updates the element\u2019s `innerHTML`. XSS prone.'),\n getAttribute(\n 'v-show',\n undefined,\n 'Toggle\u2019s the element\u2019s `display` CSS property based on the truthy-ness of the expression value.'\n ),\n getAttribute(\n 'v-if',\n undefined,\n 'Conditionally renders the element based on the truthy-ness of the expression value.'\n ),\n getAttribute('v-else', 'v', 'Denotes the \u201Celse block\u201D for `v-if` or a `v-if`/`v-else-if` chain.'),\n getAttribute('v-else-if', undefined, 'Denotes the \u201Celse if block\u201D for `v-if`. Can be chained.'),\n getAttribute('v-for', undefined, 'Renders the element or template block multiple times based on the source data.'),\n getAttribute('v-on', undefined, 'Attaches an event listener to the element.'),\n getAttribute('v-bind', undefined, 'Dynamically binds one or more attributes, or a component prop to an expression.'),\n getAttribute('v-model', undefined, 'Creates a two-way binding on a form input element or a component.'),\n getAttribute('v-pre', 'v', 'Skips compilation for this element and all its children.'),\n getAttribute('v-cloak', 'v', 'Indicates Vue instance for this element has NOT finished compilation.'),\n getAttribute('v-once', 'v', 'Render the element and component once only.'),\n getAttribute('key', undefined, 'Hint at VNodes identity for VDom diffing, e.g. list rendering'),\n getAttribute('ref', undefined, 'Register a reference to an element or a child component.'),\n getAttribute(\n 'slot',\n undefined,\n 'Used on content inserted into child components to indicate which named slot the content belongs to.'\n ),\n getAttribute(\n 'slot-scope',\n undefined,\n 'the name of a temporary variable that holds the props object passed from the child'\n )\n];\n\nconst transitionProps = [\n getAttribute('name', undefined, 'Used to automatically generate transition CSS class names. Default: \"v\"'),\n getAttribute('appear', 'b', 'Whether to apply transition on initial render. Default: false'),\n getAttribute(\n 'css',\n 'b',\n 'Whether to apply CSS transition classes. Defaults: true. If set to false, will only trigger JavaScript hooks registered via component events.'\n ),\n getAttribute(\n 'type',\n 'transType',\n 'The event, \"transition\" or \"animation\", to determine end timing. Default: the type that has a longer duration.'\n ),\n getAttribute(\n 'mode',\n 'transMode',\n 'Controls the timing sequence of leaving/entering transitions. Available modes are \"out-in\" and \"in-out\"; Defaults to simultaneous.'\n )\n].concat(\n [\n 'enter-class',\n 'leave-class',\n 'appear-class',\n 'enter-to-class',\n 'leave-to-class',\n 'appear-to-class',\n 'enter-active-class',\n 'leave-active-class',\n 'appear-active-class'\n ].map(t => genAttribute(t))\n);\n\nfunction genTag(tag: string, doc: string, attributes: Attribute[]) {\n return new HTMLTagSpecification(doc + '\\n\\n' + `[API Reference](https://vuejs.org/v2/api/#${tag})`, attributes);\n}\n\nconst vueTags = {\n component: genTag(\n 'component',\n 'A meta component for rendering dynamic components. The actual component to render is determined by the `is` prop.',\n [\n genAttribute('is', undefined, 'the actual component to render'),\n genAttribute('inline-template', 'v', 'treat inner content as its template rather than distributed content')\n ]\n ),\n transition: genTag(\n 'transition',\n '<transition> serves as transition effects for single element/component. It applies the transition behavior to the wrapped content inside.',\n transitionProps\n ),\n 'transition-group': genTag(\n 'transition-group',\n 'transition group serves as transition effects for multiple elements/components. It renders a <span> by default and can render user specified element via `tag` attribute.',\n transitionProps.concat(genAttribute('tag'), genAttribute('move-class'))\n ),\n 'keep-alive': genTag(\n 'keep-alive',\n 'When wrapped around a dynamic component, <keep-alive> caches the inactive component instances without destroying them.',\n ['include', 'exclude'].map(t => genAttribute(t))\n ),\n slot: genTag(\n 'slot',\n '<slot> serve as content distribution outlets in component templates. <slot> itself will be replaced.',\n [genAttribute('name', undefined, 'Used for named slot')]\n ),\n template: new HTMLTagSpecification(\n 'The template element is used to declare fragments of HTML that can be cloned and inserted in the document by script.',\n [\n genAttribute(\n 'scope',\n undefined,\n '(deprecated) a temporary variable that holds the props object passed from the child'\n ),\n genAttribute('slot', undefined, 'the name of scoped slot')\n ]\n )\n};\n\nconst valueSets = {\n transMode: ['out-in', 'in-out'],\n transType: ['transition', 'animation'],\n b: ['true', 'false']\n};\n\nexport function getVueTagProvider(): IHTMLTagProvider {\n return {\n getId: () => 'vue',\n priority: TagProviderPriority.Framework,\n collectTags: collector => collectTagsDefault(collector, vueTags),\n collectAttributes: (tag: string, collector: AttributeCollector) => {\n collectAttributesDefault(tag, collector, vueTags, vueDirectives);\n },\n collectValues: (tag: string, attribute: string, collector: (value: string) => void) => {\n collectValuesDefault(tag, attribute, collector, vueTags, vueDirectives, valueSets);\n }\n };\n}\n", "/* tslint:disable:max-line-length */\nimport {\n HTMLTagSpecification,\n IHTMLTagProvider,\n collectTagsDefault,\n collectAttributesDefault,\n collectValuesDefault,\n genAttribute,\n AttributeCollector,\n TagProviderPriority\n} from './common';\n\nconst routerTags = {\n 'router-link': new HTMLTagSpecification(\n 'Link to navigate user. The target location is specified with the to prop.\\n\\n[API Reference](https://router.vuejs.org/api/#router-link)',\n [\n genAttribute(\n 'to',\n undefined,\n 'The target route of the link. It can be either a string or a location descriptor object.\\n\\n[API Reference](https://router.vuejs.org/api/#to)'\n ),\n genAttribute(\n 'replace',\n undefined,\n 'Setting replace prop will call `router.replace()` instead of `router.push()` when clicked, so the navigation will not leave a history record.\\n\\n[API Reference](https://router.vuejs.org/api/#replace)'\n ),\n genAttribute(\n 'append',\n 'v',\n 'Setting append prop always appends the relative path to the current path. For example, assuming we are navigating from /a to a relative link b, without append we will end up at /b, but with append we will end up at /a/b.\\n\\n[API Reference](https://router.vuejs.org/api/#append)'\n ),\n genAttribute(\n 'tag',\n undefined,\n 'Specify which tag to render to, and it will still listen to click events for navigation.\\n\\n[API Reference](https://router.vuejs.org/api/#tag)'\n ),\n genAttribute(\n 'active-class',\n undefined,\n 'Configure the active CSS class applied when the link is active.\\n\\n[API Reference](https://router.vuejs.org/api/#active-class)'\n ),\n genAttribute(\n 'exact',\n 'v',\n 'Force the link into \"exact match mode\".\\n\\n[API Reference](https://router.vuejs.org/api/#exact)'\n ),\n genAttribute(\n 'event',\n undefined,\n 'Specify the event(s) that can trigger the link navigation.\\n\\n[API Reference](https://router.vuejs.org/api/#event)'\n ),\n genAttribute(\n 'exact-active-class',\n undefined,\n 'Configure the active CSS class applied when the link is active with exact match.\\n\\n[API Reference](https://router.vuejs.org/api/#exact-active-class)'\n ),\n genAttribute(\n 'aria-current-value',\n 'ariaCurrentType',\n 'Configure the value of `aria-current` when the link is active with exact match. It must be one of the [allowed values for `aria-current`](https://www.w3.org/TR/wai-aria-1.2/#aria-current) in the ARIA spec. In most cases, the default of `page` should be the best fit.\\n\\n[API Reference](https://router.vuejs.org/api/#aria-current-value)'\n )\n ]\n ),\n 'router-view': new HTMLTagSpecification(\n 'A functional component that renders the matched component for the given path. Components rendered in <router-view> can also contain its own <router-view>, which will render components for nested paths.\\n\\n\\n\\n[API Reference](https://router.vuejs.org/api/#router-link)',\n [\n genAttribute(\n 'name',\n undefined,\n \"When a `<router-view>` has a name, it will render the component with the corresponding name in the matched route record's components option.\\n\\n[API Reference](https://router.vuejs.org/api/#to)\"\n )\n ]\n )\n};\n\nconst valueSets = {\n ariaCurrentType: ['page', 'step', 'location', 'date', 'time']\n};\n\nexport function getRouterTagProvider(): IHTMLTagProvider {\n return {\n getId: () => 'vue-router',\n priority: TagProviderPriority.Framework,\n collectTags: collector => collectTagsDefault(collector, routerTags),\n collectAttributes: (tag: string, collector: AttributeCollector) => {\n collectAttributesDefault(tag, collector, routerTags, []);\n },\n collectValues: (tag: string, attribute: string, collector: (value: string) => void) => {\n collectValuesDefault(tag, attribute, collector, routerTags, [], valueSets);\n }\n };\n}\n", "import fs from 'fs';\nimport path from 'path';\nimport { kebabCase } from 'lodash';\n\nimport { IHTMLTagProvider, TagProviderPriority, getSameTagInSet } from './common';\n\n// @ts-ignore\nimport elementTags from 'element-helper-json/element-tags.json';\n// @ts-ignore\nimport elementAttributes from 'element-helper-json/element-attributes.json';\n\n// @ts-ignore\nimport onsenTags from 'vue-onsenui-helper-json/vue-onsenui-tags.json';\n// @ts-ignore\nimport onsenAttributes from 'vue-onsenui-helper-json/vue-onsenui-attributes.json';\n\n// @ts-ignore\nimport bootstrapTags from 'bootstrap-vue-helper-json/tags.json';\n// @ts-ignore\nimport bootstrapAttributes from 'bootstrap-vue-helper-json/attributes.json';\n\n// @ts-ignore\nimport gridsomeTags from 'gridsome-helper-json/gridsome-tags.json';\n// @ts-ignore\nimport gridsomeAttributes from 'gridsome-helper-json/gridsome-attributes.json';\nimport { findConfigFile } from '../../../utils/workspace';\n\nexport const elementTagProvider = getExternalTagProvider('element', elementTags, elementAttributes);\nexport const onsenTagProvider = getExternalTagProvider('onsen', onsenTags, onsenAttributes);\nexport const bootstrapTagProvider = getExternalTagProvider('bootstrap', bootstrapTags, bootstrapAttributes);\nexport const gridsomeTagProvider = getExternalTagProvider('gridsome', gridsomeTags, gridsomeAttributes);\n\n/**\n * Get tag providers specified in workspace root's packaage.json\n */\nexport function getWorkspaceTagProvider(packageRoot: string, rootPkgJson: any): IHTMLTagProvider | null {\n if (!rootPkgJson.vetur) {\n return null;\n }\n const tagsPath = findConfigFile(packageRoot, rootPkgJson.vetur.tags);\n const attrsPath = findConfigFile(packageRoot, rootPkgJson.vetur.attributes);\n\n try {\n if (tagsPath && attrsPath) {\n const tagsJson = JSON.parse(fs.readFileSync(tagsPath, 'utf-8'));\n const attrsJson = JSON.parse(fs.readFileSync(attrsPath, 'utf-8'));\n return getExternalTagProvider('__vetur-workspace', tagsJson, attrsJson);\n }\n return null;\n } catch (err) {\n console.error((err as Error).stack);\n return null;\n }\n}\n\n/**\n * Get tag providers specified in packaage.json's `vetur` key\n */\nexport function getDependencyTagProvider(\n packageRoot: string,\n depName: string,\n depPkgJson: any\n): IHTMLTagProvider | null {\n if (!depPkgJson.vetur) {\n return null;\n }\n\n try {\n const tagsPath = require.resolve(path.join(depName, depPkgJson.vetur.tags), { paths: [packageRoot] });\n const attrsPath = require.resolve(path.join(depName, depPkgJson.vetur.attributes), {\n paths: [packageRoot]\n });\n\n const tagsJson = JSON.parse(fs.readFileSync(tagsPath, 'utf-8'));\n const attrsJson = JSON.parse(fs.readFileSync(attrsPath, 'utf-8'));\n return getExternalTagProvider(depName, tagsJson, attrsJson);\n } catch (err) {\n console.error((err as Error).stack);\n return null;\n }\n}\n\nexport function getExternalTagProvider(id: string, tags: any, attributes: any): IHTMLTagProvider {\n function findAttributeDetail(tag: string, attr: string) {\n return (\n attributes[attr] ||\n attributes[`${tag}/${attr}`] ||\n attributes[`${tag.toLowerCase}/${attr}`] ||\n attributes[`${kebabCase(tag)}/${attr}`]\n );\n }\n\n return {\n getId: () => id,\n priority: TagProviderPriority.Library,\n collectTags(collector) {\n for (const tagName in tags) {\n collector(tagName, tags[tagName].description || '');\n }\n },\n collectAttributes(tag, collector) {\n const attrs = getSameTagInSet<any>(tags, tag)?.attributes;\n if (!attrs) {\n return;\n }\n for (const attr of attrs) {\n const detail = findAttributeDetail(tag, attr);\n if (detail?.type === 'boolean') {\n collector(attr, 'v', (detail && detail.description) || '');\n } else if (detail?.type === 'event') {\n collector(attr, 'event', (detail && detail.description) || '');\n } else {\n collector(attr, undefined, (detail && detail.description) || '');\n }\n }\n },\n collectValues(tag, attr, collector) {\n const attrs = getSameTagInSet<any>(tags, tag)?.attributes;\n if (!attrs || attrs.indexOf(attr) < 0) {\n return;\n }\n const detail = findAttributeDetail(tag, attr);\n if (!detail || !detail.options) {\n return;\n }\n for (const option of detail.options) {\n collector(option);\n }\n }\n };\n}\n", "{\n \"el-row\": {\n \"attributes\": [\"gutter\", \"type\", \"justify\", \"align\", \"tag\"],\n \"subtags\": [\"el-col\"],\n \"description\": \"A row in grid system\"\n },\n \"el-col\": {\n \"attributes\": [\"span\", \"offset\", \"push\", \"pull\", \"xs\", \"sm\", \"md\", \"lg\", \"xl\", \"tag\"],\n \"defaults\": [\":span\"],\n \"description\": \"A column in grid system\"\n },\n \"el-button\": {\n \"attributes\": [\"type\", \"size\", \"plain\", \"loading\", \"disabled\", \"icon\", \"autofocus\", \"native-type\", \"round\", \"circle\"],\n \"defaults\": [\"type\"],\n \"description\": \"Commonly used button.\"\n },\n \"el-radio\": {\n \"attributes\": [\"label\", \"disabled\", \"border\", \"size\", \"name\"],\n \"defaults\": [\"label\"],\n \"description\": \"Single selection among multiple options.\"\n },\n \"el-radio-group\": {\n \"attributes\": [\"size\", \"fill\", \"text-color\", \"change\"],\n \"defaults\": [\"v-model\"],\n \"subtags\": [\"el-radio\"]\n },\n \"el-radio-button\": {\n \"attributes\": [\"label\", \"disabled\"],\n \"defaults\": [\"label\"]\n },\n \"el-checkbox\": {\n \"attributes\": [\"label\", \"true-label\", \"false-label\", \"border\", \"size\", \"name\", \"checked\", \"indeterminate\", \"disabled\"],\n \"defaults\": [\"label\"],\n \"description\": \"A group of options for multiple choices.\"\n },\n \"el-checkbox-group\": {\n \"attributes\": [\"size\", \"fill\", \"text-color\", \"min\", \"max\", \"change\"],\n \"defaults\": [\"v-model\"],\n \"subtags\": [\"el-checkbox\"]\n },\n \"el-checkbox-button\": {\n \"attributes\": [\"label\"],\n \"defaults\": [\"label\"]\n },\n \"el-input\": {\n \"attributes\": [\"type\", \"value\", \"maxlength\", \"minlength\", \"placeholder\", \"disabled\", \"size\", \"icon\", \"prefix-icon\", \"suffix-icon\", \"rows\", \"autosize\", \"auto-complete\", \"name\", \"readonly\", \"max\", \"min\", \"step\", \"resize\", \"autofocus\", \"form\", \"label\", \"tabindex\", \"clearable\", \"on-icon-click\", \"click\", \"blur\", \"focus\", \"change\", \"clear\"],\n \"defaults\": [\"v-model\", \"placeholder\"],\n \"description\": \"Input data using mouse or keyboard.\"\n },\n \"el-autocomplete\": {\n \"attributes\": [\"value\", \"debounce\", \"placeholder\", \"disabled\", \"props\", \"custom-item\", \"icon\", \"fetch-suggestions\", \"popper-class\", \"trigger-on-focus\", \"on-icon-click\", \"select-when-unmatched\", \"label\", \"prefix-icon\", \"suffix-icon\", \"select\"],\n \"defaults\": [\"v-model\", \"placeholder\"]\n },\n \"el-input-number\": {\n \"attributes\": [\"value\", \"min\", \"max\", \"step\", \"size\", \"disabled\", \"controls-position\", \"controls\", \"debounce\", \"change\"],\n \"defaults\": [\"v-model\", \"placeholder\"]\n },\n \"el-select\": {\n \"attributes\": [\"multiple\", \"disabled\", \"value-key\", \"size\", \"clearable\", \"collapse-tags\", \"multiple-limit\", \"name\", \"auto-complete\", \"placeholder\", \"filterable\", \"allow-create\", \"filter-method\", \"remote\", \"remote-method\", \"loading\", \"loading-text\", \"no-match-text\", \"no-data-text\", \"popper-class\", \"reserve-keyword\", \"default-first-option\", \"popper-append-to-body\", \"change\", \"visible-change\", \"remote-tag\", \"clear\", \"blur\", \"focus\"],\n \"defaults\": [\"v-model\", \"placeholder\"],\n \"subtags\": [\"el-option\"],\n \"description\": \"When there are plenty of options, use a drop-down menu to display and select desired ones.\"\n },\n \"el-option-group\": {\n \"attributes\": [\"label\", \"disabled\"],\n \"defaults\": [\"v-for\", \":key\"],\n \"subtags\": [\"el-option\"]\n },\n \"el-option\": {\n \"attributes\": [\"value\", \"label\", \"disabled\"],\n \"defaults\": [\"v-for\", \":key\"]\n },\n \"el-cascader\": {\n \"attributes\": [\"options\", \"props\", \"value\", \"separator\", \"popper-class\", \"placeholder\", \"disabled\", \"clearable\", \"expand-trigger\", \"show-all-levels\", \"filterable\", \"debounce\", \"change-on-select\", \"size\", \"change\", \"active-item-change\", \"blur\", \"focus\"],\n \"defaults\": [\":options\", \"v-model\"],\n \"description\": \"If the options have a clear hierarchical structure, Cascader can be used to view and select them.\"\n },\n \"el-switch\": {\n \"attributes\": [\"disabled\", \"width\", \"active-icon-class\", \"inactive-icon-class\", \"active-text\", \"inactive-text\", \"active-value\", \"inactive-value\", \"active-color\", \"inactive-color\", \"on-icon-class\", \"off-icon-class\", \"on-text\", \"off-text\", \"on-value\", \"off-value\", \"on-color\", \"off-color\", \"name\", \"change\"],\n \"defaults\": [\"v-model\"],\n \"description\": \"Switch is used for switching between two opposing states.\"\n },\n \"el-slider\": {\n \"attributes\": [\"min\", \"max\", \"disabled\", \"step\", \"show-input\", \"show-input-controls\", \"input-size\", \"show-stops\", \"show-tooltip\", \"format-tooltip\", \"range\", \"vertical\", \"height\", \"debounce\", \"tooltip-class\", \"change\"],\n \"defaults\": [\"v-model\"],\n \"description\": \"Drag the slider within a fixed range.\"\n },\n \"el-time-select\": {\n \"attributes\": [\"readonly\", \"editable\", \"disabled\", \"clearable\", \"size\", \"placeholder\", \"value\", \"align\", \"popper-class\", \"picker-options\", \"vertical\", \"height\", \"change\"],\n \"defaults\": [\"v-model\", \"placeholder\"]\n },\n \"el-time-picker\": {\n \"attributes\": [\"readonly\", \"editable\", \"disabled\", \"clearable\", \"size\", \"placeholder\", \"start-placeholde\", \"end-placeholde\", \"value\", \"align\", \"picker-options\", \"range-separator\", \"popper-class\", \"is-range\", \"arrow-control\", \"value-format\", \"default-value\", \"change\", \"blur\", \"focus\"],\n \"defaults\": [\"v-model\", \"placeholder\"]\n },\n \"el-date-picker\": {\n \"attributes\": [\"readonly\", \"editable\", \"disabled\", \"clearable\", \"size\", \"placeholder\", \"start-placeholde\", \"end-placeholde\", \"time-arrow-control\", \"type\", \"format\", \"align\", \"popper-class\", \"picker-options\", \"range-separator\", \"default-value\", \"default-time\", \"value-format\", \"name\", \"unlink-panels\", \"prefix-icon\", \"clear-icon\", \"change\"],\n \"defaults\": [\"v-model\", \"placeholder\"]\n },\n \"el-upload\": {\n \"attributes\": [\"action\", \"headers\", \"multiple\", \"data\", \"name\", \"width\", \"name\", \"with-credentials\", \"show-file-list\", \"drag\", \"accept\", \"on-preview\", \"on-remove\", \"on-success\", \"on-error\", \"on-progress\", \"on-change\", \"before-upload\", \"before-remove\", \"list-type\", \"auto-upload\", \"file-list\", \"http-request\", \"disabled\", \"limit\", \"on-exceed\"],\n \"defaults\": [\"action\"],\n \"subtags\": [\"el-button\"],\n \"description\": \"Upload files by clicking or drag-and-drop\"\n },\n \"el-rate\": {\n \"attributes\": [\"max\", \"disabled\", \"allow-half\", \"low-threshold\", \"high-threshold\", \"colors\", \"void-color\", \"disabled-void-color\", \"icon-classes\", \"void-icon-class\", \"disabled-void-icon-class\", \"show-text\", \"show-score\", \"text-color\", \"texts\", \"score-template\", \"change\"],\n \"defaults\": [\"v-model\"],\n \"description\": \"Used for rating\"\n },\n \"el-color-picker\": {\n \"attributes\": [\"disabled\", \"size\", \"show-alpha\", \"color-format\", \"popper-class\", \"predefine\", \"change\", \"active-change\"],\n \"defaults\": [\"v-model\"]\n },\n \"el-transfer\": {\n \"attributes\": [\"data\", \"filterable\", \"filter-placeholder\", \"filter-method\", \"target-order\", \"titles\", \"button-texts\", \"render-content\", \"format\", \"props\", \"left-default-checked\", \"right-default-checked\", \"change\", \"left-check-change\", \"right-check-change\"],\n \"defaults\": [\"v-model\", \":data\"]\n },\n \"el-form\": {\n \"attributes\": [\"model\", \"rules\", \"inline\", \"label-position\", \"label-width\", \"label-suffix\", \"show-message\", \"inline-message\", \"status-icon\", \"validate-on-rule-change\", \"size\", \"disabled\", \"validate\"],\n \"defaults\": [\":model\"],\n \"subtags\": [\"el-form-item\"],\n \"description\": \"Form consists of `input`, `radio`, `select`, `checkbox` and so on. With form, you can collect, verify and submit data.\"\n },\n \"el-form-item\": {\n \"attributes\": [\"label\", \"prop\", \"label-width\", \"required\", \"rules\", \"error\", \"show-message\", \"inline-message\", \"size\"],\n \"defaults\": [\"label\"]\n },\n \"el-table\": {\n \"attributes\": [\"data\", \"height\", \"max-height\", \"stripe\", \"border\", \"fit\", \"show-header\", \"highlight-current-row\", \"current-row-key\", \"row-class-name\", \"cell-class-name\", \"cell-style\", \"header-row-class-name\", \"header-row-style\", \"header-cell-name\", \"header-cell-style\", \"row-style\", \"row-key\", \"empty-text\", \"default-expand-all\", \"expand-row-keys\", \"default-sort\", \"tooltip-effect\", \"show-summary\", \"sum-text\", \"summary-method\", \"span-method\", \"select-on-indeterminate\", \"select\", \"select-all\", \"selection-change\", \"cell-mouse-enter\", \"cell-mouse-leave\", \"cell-click\", \"cell-dbclick\", \"row-click\", \"row-contextmenu\", \"row-dbclick\", \"header-click\", \"sort-change\", \"filter-change\", \"current-change\", \"header-draggend\", \"expand\", \"expand-change\"],\n \"defaults\": [\":data\"],\n \"subtags\": [\"el-table-column\"],\n \"description\": \"Display multiple data with similar format. You can sort, filter, compare your data in a table.\"\n },\n \"el-table-column\": {\n \"attributes\": [\"type\", \"column-key\", \"index\", \"label\", \"prop\", \"width\", \"min-width\", \"fixed\", \"render-header\", \"sortable\", \"sort-method\", \"sort-by\", \"resizable\", \"formatter\", \"show-overflow-tooltip\", \"align\", \"header-align\", \"class-name\", \"label-class-name\", \"selectable\", \"reserve-selection\", \"filters\", \"filter-placement\", \"filter-multiple\", \"filter-method\", \"filtered-value\"],\n \"defaults\": [\"label\"]\n },\n \"el-tag\": {\n \"attributes\": [\"type\", \"closable\", \"close-transition\", \"hit\", \"color\", \"size\", \"close\"],\n \"defaults\": [\"type\"],\n \"description\": \"Used for marking and selection.\"\n },\n \"el-progress\": {\n \"attributes\": [\"percentage\", \"type\", \"stroke-width\", \"text-inside\", \"status\", \"color\", \"width\", \"show-text\"],\n \"defaults\": [\"percentage\"],\n \"description\": \"Progress is used to show the progress of current operation, and inform the user the current status.\"\n },\n \"el-tree\": {\n \"attributes\": [\"data\", \"empty-text\", \"node-key\", \"props\", \"load\", \"render-content\", \"highlight-current\", \"current-node-key\", \"default-expand-all\", \"expand-on-click-node\", \"auto-expand-parent\", \"default-expanded-keys\", \"show-checkbox\", \"check-strictly\", \"default-checked-keys\", \"filter-node-method\", \"accordion\", \"indent\", \"check-descendants\", \"draggable\", \"allow-drag\", \"allow-drop\", \"node-click\", \"node-contextmenu\", \"check-change\", \"check\", \"current-change\", \"node-expand\", \"node-collapse\", \"node-drag-start\", \"node-drag-enter\", \"node-drag-leave\", \"node-drag-over\", \"node-drag-end\", \"node-drop\"],\n \"defaults\": [\":data\"],\n \"description\": \"Display a set of data with hierarchies.\"\n },\n \"el-pagination\": {\n \"attributes\": [\"small\", \"background\", \"page-size\", \"total\", \"page-count\", \"current-page\", \"layout\", \"page-sizes\", \"popper-class\", \"prev-text\", \"next-text\", \"disabled\", \"size-change\", \"current-page\"],\n \"defaults\": [\":total\", \":current-page\", \":page-size\", \"@current-change\", \"layout\"],\n \"description\": \"If you have too much data to display in one page, use pagination.\"\n },\n \"el-badge\": {\n \"attributes\": [\"value\", \"max\", \"is-dot\", \"hidden\"],\n \"defaults\": [\"value\"],\n \"description\": \"A number or status mark on buttons and icons.\"\n },\n \"el-alert\": {\n \"attributes\": [\"title\", \"type\", \"description\", \"closable\", \"center\", \"close-text\", \"show-icon\", \"close\"],\n \"defaults\": [\"type\", \"title\"],\n \"description\": \"Displays important alert messages.\"\n },\n \"el-menu\": {\n \"attributes\": [\"mode\", \"collapse\", \"background-color\", \"text-color\", \"active-text-color\", \"theme\", \"default-active\", \"default-openeds\", \"unique-opened\", \"menu-trigger\", \"router\", \"collapse-transition\", \"select\", \"open\", \"close\"],\n \"defaults\": [\"default-active\"],\n \"subtags\": [\"el-submenu\", \"el-menu-item\"]\n },\n \"el-submenu\": {\n \"attribute\": [\"index\", \"popper-class\", \"show-timeout\", \"hide-timeout\", \"disabled\"],\n \"defaults\": [\"index\"],\n \"subtags\": [\"el-menu-item\"]\n },\n \"el-menu-item-group\": {\n \"attributes\": [\"title\"],\n \"subtags\": [\"el-menu-item\"]\n },\n \"el-menu-item\": {\n \"attributes\": [\"index\", \"route\", \"disabled\"],\n \"defaults\": [\"index\"]\n },\n \"el-tabs\": {\n \"attributes\": [\"type\", \"closable\", \"addable\", \"editable\", \"value\", \"activate-name\", \"tab-position\", \"tab-click\", \"tab-remove\", \"tab-add\", \"edit\"],\n \"subtags\": [\"el-tab-pane\"],\n \"description\": \"Divide data collections which are related yet belong to different types.\"\n },\n \"el-tab-pane\": {\n \"attributes\": [\"label\", \"disabled\", \"name\", \"closable\"]\n },\n \"el-breadcrumb\": {\n \"attributes\": [\"separator\", \"separator-class\"],\n \"defaults\": [\"separator\"],\n \"subtags\": [\"el-breadcrumb-item\"],\n \"description\": \"Displays the location of the current page, making it easier to browser back.\"\n },\n \"el-breadcrumb-item\": {\n \"attributes\": [\"to\", \"replace\"]\n },\n \"el-dropdown\": {\n \"attributes\": [\"type\", \"szie\", \"split-button\", \"placement\", \"trigger\", \"hide-on-click\", \"show-timeout\", \"hide-timeout\", \"click\", \"command\", \"visible-change\"],\n \"subtags\": [\"el-dropdown-menu\"],\n \"description\": \"Toggleable menu for displaying lists of links and actions.\"\n },\n \"el-dropdown-menu\": {\n \"attributes\": [\"command\", \"disabled\", \"divided\"]\n },\n \"el-steps\": {\n \"attributes\": [\"space\", \"direction\", \"active\", \"process-status\", \"finish-status\", \"align-center\", \"center\", \"simple\"],\n \"defaults\": [\":space\", \":active\"],\n \"subtags\": [\"el-step\"],\n \"description\": \"Guide the user to complete tasks in accordance with the process. Its steps can be set according to the actual application scenario and the number of the steps can't be less than 2.\"\n },\n \"el-step\": {\n \"attributes\": [\"title\", \"description\", \"icon\", \"status\"],\n \"defaults\": [\"title\"]\n },\n \"el-dialog\": {\n \"attributes\": [\"title\", \"top\", \"visible\", \"width\", \"fullscreen\", \"modal\", \"modal-append-to-body\", \"append-to-body\", \"lock-scroll\", \"custom-class\", \"close-on-click-modal\", \"show-close\", \"before-close\", \"center\", \"close\", \"open\"],\n \"defaults\": [\"title\"],\n \"description\": \"Informs users while preserving the current page state.\"\n },\n \"el-tooltip\": {\n \"attributes\": [\"effect\", \"content\", \"placement\", \"value\", \"disabled\", \"offset\", \"transition\", \"visible-arrow\", \"popper-options\", \"open-delay\", \"manual\", \"popper-class\", \"enterable\", \"hide-after\"],\n \"defaults\": [\"content\", \"placement\"],\n \"description\": \"Display prompt information for mouse hover.\"\n },\n \"el-popover\": {\n \"attributes\": [\"trigger\", \"title\", \"content\", \"width\", \"placement\", \"disabled\", \"value\", \"offset\", \"transition\", \"visible-arrow\", \"popper-options\", \"popper-class\", \"open-delay\", \"show\", \"hide\", \"after-enter\", \"after-leave\"],\n \"defaults\": [\"placement\"]\n },\n \"el-card\": {\n \"attributes\": [\"header\", \"body-style\"],\n \"description\": \"Integrate information in a card container.\"\n },\n \"el-carousel\": {\n \"attributes\": [\"height\", \"initial-index\", \"trigger\", \"autoplay\", \"interval\", \"indicator-position\", \"arrow\", \"type\", \"change\"],\n \"subtags\": [\"el-carousel-item\"],\n \"description\": \"Loop a series of images or texts in a limited space\"\n },\n \"el-carousel-item\": {\n \"attributes\": [\"name\", \"label\"]\n },\n \"el-collapse\": {\n \"attributes\": [\"accordion\", \"value\", \"change\"],\n \"subtags\": [\"el-collapse-item\"],\n \"description\": \"Use Collapse to store contents.\"\n },\n \"el-collapse-item\": {\n \"attributes\": [\"name\", \"title\"],\n \"defaults\": [\"name\", \"title\"]\n }\n}\n", "{\n \"gutter\": {\"description\": \"grid spacing\"},\n \"justify\": {\"options\": [\"start\", \"end\", \"center\", \"space-around\", \"space-between\"], \"description\": \"horizontal alignment of flex layout\"},\n \"tag\": {\"description\": \"custom element tag\"},\n \"span\": {\"description\": \"number of column the grid spans\"},\n \"push\": {\"description\": \"number of columns that grid moves to the right\"},\n \"pull\": {\"description\": \"number of columns that grid moves to the left\"},\n \"xs\": {\"description\": \"<768px Responsive columns or column props object\"},\n \"sm\": {\"description\": \"\u2265768px Responsive columns or column props object\"},\n \"md\": {\"description\": \"\u2265992 Responsive columns or column props object\"},\n \"lg\": {\"description\": \"\u22651200 Responsive columns or column props object\"},\n \"xl\": {\"version\": \">=2.0.0\", \"description\": \"\u22651200px Responsive columns or column props object, version >= 2\"},\n \"native-type\": {\"options\": [\"button\", \"submit\", \"reset\"], \"description\": \"same as native button's type\"},\n \"name\": {\"description\": \"native 'name' attribute\"},\n \"fill\": {\"description\": \"border and background color when button is active\"},\n \"true-label\": {\"description\": \"value of the checkbox if it's checked\"},\n \"false-label\": {\"description\": \"value of the checkbox if it's not checked\"},\n \"size\": {\"options\": [\"medium\", \"small\", \"mini\"]},\n \"maxlength\": {\"description\": \"maximum Input text length\"},\n \"minlength\": {\"description\": \"minimum Input text length\"},\n \"rows\": {\"description\": \"number of rows of textarea, only works when type is 'textarea'\"},\n \"autosize\": {\"description\": \"whether textarea has an adaptive height, only works when type is 'textarea'. Can accept an object, e.g. { minRows: 2, maxRows: 6 }\"},\n \"auto-complete\": {\"options\": [\"one\", \"off\"]},\n \"form\": {\"description\": \"same as 'form' in native input\"},\n \"custom-item\": {\"version\": \"<2.0.0\", \"description\": \"component name of your customized suggestion list item\"},\n \"fetch-suggestions\": {\"description\": \"a method to fetch input suggestions. When suggestions are ready, invoke callback(data:[]) to return them to Autocomplete\"},\n \"trigger-on-focus\": {\"description\": \"whether show suggestions when input focus\"},\n \"on-icon-click\": {\"description\": \"hook function when clicking on the input icon\"},\n \"debounce\": {\"description\": \"debounce delay when typing, in millisecond\"},\n \"multiple-limit\": {\"description\": \"maximum number of options user can select when multiple is true. No limit when set to 0\"},\n \"loading-text\": {\"description\": \"displayed text while loading data from server\"},\n \"no-match-text\": {\"description\": \"displayed text when no data matches the filtering query\"},\n \"no-data-text\": {\"description\": \"displayed text when there is no options\"},\n \"expand-trigger\": {\"options\": [\"click\", \"hover\"], \"description\": \"trigger mode of expanding current item\"},\n \"show-all-levels\": {\"description\": \"whether to display all levels of the selected value in the input\"},\n \"theme\": {\"version\": \"<2.0.0\", \"options\": [\"light\", \"dark\"], \"description\": \"theme color, default: light\"},\n \"on-text\": {\"version\": \"<2.0.0\", \"description\": \"text displayed when in on state, version < 2\"},\n \"off-text\": {\"version\": \"<2.0.0\", \"description\": \"text displayed when in off state, version < 2\"},\n \"on-value\": {\"version\": \"<2.0.0\", \"description\": \"switch value when in on state, default: true, version < 2\"},\n \"off-value\": {\"version\": \"<2.0.0\", \"description\": \"switch value when in off state, default: false, version < 2\"},\n \"on-color\": {\"version\": \"<2.0.0\", \"description\": \"background color when in on state, default: #20A0FF, version < 2\"},\n \"off-color\": {\"version\": \"<2.0.0\", \"description\": \"background color when in off state, default: #C0CCDA, version < 2\"},\n \"active-text\": {\"version\": \">=2.0.0\", \"description\": \"text displayed when in on state, version >= 2\"},\n \"inactive-text\": {\"version\": \">=2.0.0\", \"description\": \"text displayed when in off state, version >= 2\"},\n \"active-value\": {\"version\": \">=2.0.0\", \"description\": \"switch value when in on state, default: true, version >= 2\"},\n \"inactive-value\": {\"version\": \">=2.0.0\", \"description\": \"switch value when in off state, default: false, version >= 2\"},\n \"active-color\": {\"version\": \">=2.0.0\", \"description\": \"background color when in on state, default: #409EFF, version >= 2\"},\n \"inactive-color\": {\"version\": \">=2.0.0\", \"description\": \"background color when in off state, default: #C0CCDA, version >= 2\"},\n \"controls-position\": {\"version\": \">=2.0.0\", \"options\": [\"right\"], \"description\": \"position of the control buttons\"},\n \"tabindex\": {\"version\": \">2.0.10\", \"description\": \"input tabindex\"},\n \"tooltip-class\": {\"version\": \">=2.2.1\", \"description\": \"custom class name for the tooltip\"},\n \"predefine\": {\"version\": \">=2.3.0\", \"description\": \"predefined color options, type: array\"},\n \"allow-drag\": {\"version\": \">=2.3.0\", \"description\": \"this function will be executed before dragging a node. If false is returned, the node can not be dragged, type: Function\"},\n \"allow-drop\": {\"version\": \">=2.3.0\", \"description\": \"this function will be executed before the dragging node is dropped. If false is returned, the dragging node can not be dropped at the target node, type: Function\"},\n \"format\": {\"description\": \"year yyyy month MM day dd, hour HH, minute mm, second ss, default: yyyy-MM-dd\"},\n \"range-separator\": {\"description\": \"default: '-'\"},\n \"default-value\": {\"description\": \"optional default time of the picker, type: Date\"},\n \"action\": {\"description\": \"required, upload URL\"},\n \"headers\": {\"description\": \"request headers\"},\n \"accept\": {\"description\": \"accepted file types, will not work when thumbnail-mode is true\"},\n \"on-preview\": {\"description\": \"hook function when clicking the uploaded files, type: function(file)\"},\n \"on-remove\": {\"description\": \"hook function when files are removed, type: function(file, fileList)\"},\n \"on-success\": {\"description\": \"hook function when uploaded successfully, type: function(response, file, fileList)\"},\n \"on-error\": {\"description\": \"hook function when some errors occurs, type: function(err, file, fileList)\"},\n \"on-progress\": {\"description\": \"hook function when some progress occurs, type: function(event, file, fileList)\"},\n \"on-change\": {\"description\": \"hook function when select file or upload file success or upload file fail, type: function(file, fileList)\"},\n \"before-upload\": {\"description\": \"hook function before uploading with the file to be uploaded as its parameter. If false is returned or a Promise is returned and then is rejected, uploading will be aborted, type: function(file)\"},\n \"before-remove\": {\"version\": \">=2.0.9\", \"description\": \"hook function before removing a file with the file and file list as its parameters. If false is returned or a Promise is returned and then is rejected, removing will be aborted. type: function(file, fileList)\"},\n \"file-list\": {\"description\": \"default uploaded files, e.g. [{name: '*.jpeg', url: '*'}]\"},\n \"list-type\": {\"options\": [\"text\", \"picture\", \"picture-card\"],\"description\": \"type of fileList, default: 'text'\"},\n \"http-request\": {\"description\": \"override default xhr behavior, allowing you to implement your own upload-file's request\"},\n \"low-threshold\": {\"description\": \"hreshold value between low and medium level. The value itself will be included in low level, default: 2\"},\n \"high-threshold\": {\"description\": \"threshold value between medium and high level. The value itself will be included in high level, default: 4\"},\n \"colors\": {\"description\": \"color array for icons. It should have 3 elements, each of which corresponds with a score level, default: ['#F7BA2A', '#F7BA2A', '#F7BA2A']\"},\n \"void-color\": {\"description\": \"color of unselected icons, default: #C6D1DE\"},\n \"disabled-void-color\": {\"description\": \"color of unselected read-only icons, default: #EFF2F7\"},\n \"texts\": {\"description\": \"text array\"},\n \"text-template\": {\"version\": \"<2.0.0\", \"description\": \"text template when the component is read-only, default: {value}\"},\n \"score-template\": {\"version\": \">=2.0.0\", \"description\": \"score template, default: {value}\"},\n \"color-format\": {\"options\": [\"hsl\", \"hsv\", \"hex\", \"rgb\"], \"description\": \"color format of v-model, default: hex(when show-alpha is false)/rgb(when show-alpha is true)\"},\n \"titles\": {\"description\": \"custom list titles, default: ['List 1', 'List 2']\"},\n \"button-texts\": {\"description\": \"custom button texts, default: []\"},\n \"render-content\": {\"description\": \"custom render function for data items\"},\n \"left-default-checked\": {\"description\": \"key array of initially checked data items of the left list, default: []\"},\n \"right-default-checked\": {\"description\": \"key array of initially checked data items of the right list, default: []\"},\n \"model\": {\"description\": \"data of form component, type: object\"},\n \"rules\": {\"description\": \"validation rules of form\"},\n \"label-position\": {\"options\": [\"left\", \"right\", \"top\"], \"description\": \"position of label, default: 'right'\"},\n \"error\": {\"description\": \"field error message, set its value and the field will validate error and show this message immediately\"},\n \"current-row-key\": {\"description\": \"key of current row, a set only prop\"},\n \"row-class-name\": {\"description\": \"function that returns custom class names for a row, or a string assigning class names for every row\"},\n \"prev-text\": {\"version\": \">=2.0.0\", \"description\": \"text for the prev button\"},\n \"next-text\": {\"version\": \">=2.0.0\", \"description\": \"text for the next button\"},\n \"header-row-class-name\": {\"version\": \">=2.0.0\", \"description\": \"function that returns custom class names for a row in table header, or a string assigning class names for every row in table header\"},\n \"header-row-style\": {\"version\": \">=2.0.0\", \"description\": \"function that returns custom style for a row in table header, or an object assigning custom style for every row in table header\"},\n \"header-cell-class-name\": {\"version\": \">=2.0.0\", \"description\": \"function that returns custom class names for a cell in table header, or a string assigning class names for every cell in table header\"},\n \"header-cell-style\": {\"version\": \">=2.0.0\", \"description\": \"function that returns custom style for a cell in table header, or an object assigning custom style for every cell in table header\"},\n \"cell-class-name\": {\"version\": \">=2.0.0\", \"description\": \"function that returns custom class names for a cell, or a string assigning class names for every cell\"},\n \"cell-style\": {\"version\": \">=2.0.0\", \"description\": \"function that returns custom style for a cell, or an object assigning custom style for every cell\"},\n \"row-style\": {\"description\": \"function that returns custom style for a row, or a string assigning custom style for every row\"},\n \"row-key\": {\"description\": \"key of row data, used for optimizing rendering. Required if 'reserve-selection' is on\"},\n \"expand-row-keys\": {\"description\": \"set expanded rows by this prop, prop's value is the keys of expand rows, you should set row-key before using this prop, type: Array\"},\n \"default-sort\": {\"description\": \"set the default sort column and order. property prop is used to set default sort column, property order is used to set default sort order\"},\n \"tooltip-effect\": {\"options\": [\"dark\", \"light\"], \"description\": \"tooltip 'effect' property\"},\n \"sum-text\": {\"description\": \"displayed text for the first column of summary row, default: Sum\"},\n \"summary-method\": {\"description\": \"custom summary method\"},\n \"span-method\": {\"version\": \">=2.0.0\", \"description\": \"method that returns rowspan and colspan\"},\n \"column-key\": {\"description\": \"column's key. If you need to use the filter-change event, you need this attribute to identify which column is being filtered\"},\n \"fixed\": {\"options\": [\"ture\", \"left\", \"right\"], \"description\": \"whether column is fixed at left/right. Will be fixed at left if 'true'\"},\n \"render-header\": {\"description\": \"render function for table header of this column\"},\n \"sort-method\": {\"description\": \"sorting method, works when 'sortable' is true. Should return a number, just like Array.sort, type: Function(a, b)\"},\n \"sort-by\": {\"version\": \">=2.0.2\", \"description\": \"specify which property to sort by, works when 'sortable' is true and 'sort-method' is undefined. If set to an Array, the column will sequentially sort by the next property if the previous one is equal, type: Function(row, index)/String/Array\"},\n \"formatter\": {\"description\": \"function that formats content\"},\n \"align\": {\"options\": [\"left\", \"center\", \"right\"]},\n \"header-align\": {\"options\": [\"left\", \"center\", \"right\"], \"description\": \"alignment of the table header. If omitted, the value of the 'align' attribute will be applied\"},\n \"label-class-name\": {\"description\": \"class name of the label of this column\"},\n \"selectable\": {\"description\": \"function that determines if a certain row can be selected, works when type is 'selection' Function(row, index)\"},\n \"filters\": {\"description\": \"an array of data filtering options. For each element in this array, 'text' and 'value' are required\"},\n \"filter-placement\": {\"description\": \"placement for the filter dropdown\"},\n \"filtered-value\": {\"description\": \"filter value for selected data, might be useful when table header is rendered with 'render-header'\"},\n \"percentage\": {\"description\": \"percentage, required, default: 0\"},\n \"stroke-width\": {\"description\": \"the width of progress bar, default: 6\"},\n \"node-key\": {\"description\": \"unique identity key name for nodes, its value should be unique across the whole tree\"},\n \"load\": {\"description\": \"method for loading subtree data\"},\n \"current-node-key\": {\"description\": \"key of current node, a set only prop\"},\n \"default-expanded-keys\": {\"description\": \"array of keys of initially expanded nodes\"},\n \"default-checked-keys\": {\"description\": \"array of keys of initially checked nodes\"},\n \"filter-node-method\": {\"description\": \"this function will be executed on each node when use filter method. if return 'false', tree node will be hidden.\"},\n \"indent\": {\"description\": \"horizontal indentation of nodes in adjacent levels in pixels, default: 16\"},\n \"page-size\": {\"description\": \"item count of each page, default: 10\"},\n \"total\": {\"description\": \"total item count\"},\n \"page-count\": {\"description\": \"total page count. Set either 'total' or 'page-count' and pages will be displayed; if you need 'page-sizes', total is required\"},\n \"current-page\": {\"description\": \"current page number, supports the .sync modifier, default: 1\"},\n \"layout\": {\"options\": [\"sizes\", \"prev\", \"pager\", \"next\", \"jumper\", \"->\", \"total\", \"slot\"], \"description\": \"layout of Pagination, elements separated with a comma\"},\n \"page-sizes\": {\"description\": \"options of item count per page, example: [10, 20]\"},\n \"close-text\": {\"description\": \"customized close button text\"},\n \"default-openeds\": {\"description\": \"array that contains keys of currently active sub-menus\"},\n \"default-active\": {\"description\": \"index of currently active menu\"},\n \"menu-trigger\": {\"description\": \"how sub-menus are triggered, only works when mode is 'horizontal', default: hover\"},\n \"route\": {\"description\": \"Vue Router object\"},\n \"activate-name\": {\"description\": \"name of the selected tab(deprecated)\"},\n \"separator\": {\"description\": \"separator character, default: '/'\"},\n \"to\": {\"description\": \"target route of the link, same as to of vue-router\"},\n \"command\": {\"description\": \"a command to be dispatched to Dropdown's 'command' callback\"},\n \"space\": {\"description\": \"the spacing of each step, will be responsive if omitted. Support percentage.\"},\n \"direction\": {\"options\": [\"vertical\", \"horizontal\"], \"description\": \"display direction, default: horizontal\"},\n \"active\": {\"description\": \"current activation step\"},\n \"process-status\": {\"options\": [\"wait\", \"process\", \"finish\", \"error\", \"success\"], \"description\": \"status of current step, default: process\"},\n \"finish-status\": {\"options\": [\"wait\", \"process\", \"finish\", \"error\", \"success\"], \"description\": \"status of end step, default: finish\"},\n \"top\": {\"description\": \"value for top of Dialog CSS, works when size is not full, default: 15%\"},\n \"custom-class\": {\"description\": \"custom class names for Dialog\"},\n \"before-close\": {\"description\": \"callback before Dialog closes, and it will prevent Dialog from closing\"},\n \"effect\": {\"options\": [\"dark\", \"light\"], \"description\": \"Tooltip theme\"},\n \"transition\": {\"description\": \"animation name, default: 'el-fade-in-linear'\"},\n \"header\": {\"description\": \"Title of the card. Also accepts a DOM passed by slot#header\"},\n \"body-style\": {\"description\": \"CSS style of body,type: object, default: {padding: '20px'}\"},\n \"initial-index\": {\"description\": \"index of the initially active slide (starting from 0), default: 0\"},\n \"interval\": {\"description\": \"interval of the auto loop, in milliseconds, default: 30000\"},\n \"indicator-position\": {\"options\": [\"outside\", \"none\"], \"description\": \"position of the indicators\"},\n \"arrow\": {\"options\": [\"always\", \"hover\", \"nerver\"], \"description\": \"when arrows are shown, default: hover\"},\n \"menu-algin\": {\"version\": \"<2.0.0\", \"options\": [\"start\", \"end\"], \"description\": \"horizontal alignment, default: end\"},\n \"placement\": {\"version\": \">=2.0.0\", \"options\": [\"top\", \"top-start\", \"top-end\", \"bottom\", \"bottom-start\", \"bottom-end\", \"left\", \"left-start\", \"left-end\", \"right\", \"right-start\", \"right-end\"], \"description\": \"default: bottom\"},\n \"value-key\": {\"description\": \"unique identity key name for value, required when value is an object\"}, \n \"hide-after\": {\"description\": \"timeout in milliseconds to hide tooltip, default: 0\"},\n \"separator-class\": {\"version\": \">=2.0.0\", \"description\": \"iconfont-separator's class\"},\n \"start-placeholder\": {\"version\": \">=2.0.0\", \"description\": \"placeholder for the start time in range mode\"},\n \"end-placeholder\": {\"version\": \">=2.0.0\", \"description\": \"placeholder for the end time in range mode\"},\n \"value-format\": {\"version\": \">=2.0.0\", \"description\": \"optional, format of binding value. If not specified, the binding value will be a Date object\"},\n \"tab-position\": {\"version\": \">=2.0.0\", \"options\": [\"top\", \"right\", \"bottom\", \"left\"], \"description\": \"position of tabs, default: top\"},\n \"on-exceed\": {\"version\": \">=2.0.0\", \"description\": \"hook function when limit is exceeded\"},\n \"show-timeout\": {\"description\": \"Delay time before show a dropdown, default: 250\"},\n \"hide-timeout\": {\"description\": \"Delay time before hide a dropdown, default: 150\"},\n \"default-time\": {\"description\": \"The time value to use when selecting date range, type: string[]\"},\n \"target-order\": {\"version\": \">=2.2.1\", \"options\": [\"original\", \"push\", \"unshift\"], \"description\": \"order strategy for elements in the target list. If set to 'original', the elements will keep the same order as the data source. If set to 'push', the newly added elements will be pushed to the bottom. If set to 'unshift', the newly added elements will be inserted on the top, default: original\"},\n \"input-size\": {\"version\": \">=2.2.1\", \"options\": [\"large\", \"medium\", \"small\", \"mini\"], \"description\": \"size of the input box, default: small\"},\n \"el-submenu/show-timeout\": {\"version\": \">=2.0.11\", \"description\": \"timeout before showing a sub-menu, default: 300\"},\n \"el-submenu/hide-timeout\": {\"version\": \">=2.0.11\", \"description\": \"timeout before hiding a sub-menu, default: 300\"},\n \"el-input/on-icon-click\": {\"version\": \"<2.0.0\", \"description\": \"hook function when clicking on the input icon\"},\n \"el-upload/limit\": {\"version\": \">=2.0.0\", \"description\": \"maximum number of uploads allowed\"},\n \"el-transfer/footer-format\": {\"version\": \"<2.0.0\", \"description\": \"texts for checking status in list footer\"},\n \"el-transfer/format\": {\"version\": \">=2.0.0\", \"description\": \"texts for checking status in list footer, default: { noChecked: '${total} items', hasChecked: '${checked}/${total} checked' }\"}, \n \"el-dropdown/palcement\": {\"options\": [\"top\", \"top-start\", \"top-end\", \"bottom\", \"bottom-start\", \"bottom-end\"], \"description\": \"placement of pop menu, default: 'bottom-end\"},\n \"el-menu/background-color\": {\"version\": \">=2.0.0\", \"description\": \"background color of Menu (hex format), default: #ffffff\"},\n \"el-menu/text-color\": {\"version\": \">=2.0.0\", \"description\": \"text color of Menu (hex format), default: #2d2f33\"},\n \"el-menu/active-text-color\": {\"version\": \">=2.0.0\", \"description\": \"text color of currently active menu item (hex format), default: #409EFF\"},\n \"el-tooltip/content\": {\"description\": \"display content, can be overridden by slot#content\"},\n \"el-popover/content\": {\"description\": \"popover content, can be replaced with a default slot\"},\n \"el-dropdown/trigger\": {\"options\": [\"hover\", \"click\"], \"description\": \"default: hover\"},\n \"el-carousel/trigger\": {\"options\": [\"hover\", \"click\"], \"description\": \"default: hover\"},\n \"el-popover/trigger\": {\"options\": [\"click\", \"focus\", \"hover\", \"manual\"], \"description\": \"how the popover is triggered, default: click\"},\n \"el-tabs/name\": {\"description\": \"identifier corresponding to the activeName of Tabs, representing the alias of the tab-pane\"},\n \"el-tabs/index\": {\"description\": \"name of the selected tab\"},\n \"el-menu/model\": {\"options\": [\"horizontal\", \"vertical\"], \"description\": \"menu display mode\"},\n \"el-tree/render-content\": {\"description\": \"render function for tree node\"},\n \"el-step/status\": {\"options\": [\"wait\", \"process\", \"finish\", \"error\", \"success\"], \"description\": \"current status. It will be automatically set by Steps if not configured.\"},\n \"el-progress/status\": {\"options\": [\"success\", \"exception\"], \"description\": \"the current status of progress bar\"},\n \"el-table-column/min-width\": {\"description\": \"column minimum width. Columns with width has a fixed width, while columns with min-width has a width that is distributed in proportion\"},\n \"el-table/empty-text\": {\"description\": \"Displayed text when data is empty. You can customize this area with slot='empty'\"},\n \"el-tree/empty-text\": {\"description\": \"text displayed when data is void\"},\n \"el-form-item/prop\": {\"description\": \"a key of model. In the use of validate and resetFields method, the attribute is required\"},\n \"el-table-column/prop\": {\"description\": \"field name. You can also use its alias: property\"},\n \"el-row/align\": {\"options\": [\"top\", \"middle\", \"bottom\"], \"description\": \"vertical alignment of flex layout\"},\n \"el-row/offset\": {\"description\": \"number of spacing on the left side of the grid\"},\n \"el-tooltip/offset\": {\"description\": \"offset of the Tooltip, default: 0\"},\n \"el-carousel-item/name\": {\"description\": \"name of the item, can be used in 'setActiveItem'\"},\n \"el-collapse/name\": {\"description\": \"unique identification of the panel\"},\n \"el-switch/name\": {\"description\": \"input name of Switch\"},\n \"el-upload/name\": {\"description\": \"key name for uploaded file, default: 'file'\"},\n \"el-input/resize\": {\"options\": [\"none\", \"both\", \"horizontal\", \"vertical\"], \"description\": \"control the resizability\"},\n \"el-input/step\": {\"description\": \"same as step in native input\"},\n \"el-input-number/step\": {\"description\": \"incremental step\"},\n \"el-switch/step\": {\"description\": \"step size, default: 1\"},\n \"el-carousel/type\": {\"options\": [\"card\"], \"description\": \"type of the Carousel\"},\n \"el-dropdown/type\": {\"description\": \"menu button type, refer to Button Component, only works when 'split-button' is true\"},\n \"el-tabs/type\": {\"options\": [\"card\", \"border-card\"], \"description\": \"type of Tab\"},\n \"el-progress/type\": {\"options\": [\"line\", \"circle\"], \"description\": \"the type of progress bar, default: line\"},\n \"el-row/type\": {\"options\": [\"flex\"], \"description\": \"layout mode, you can use 'flex', works in modern browsers\"},\n \"el-input/type\": {\"description\": \"Same as the 'type' attribute of native input, except that it can be 'textarea'\"},\n \"el-button/type\": {\"options\": [\"primary\", \"success\", \"warning\", \"danger\", \"info\", \"text\"], \"description\": \"button type\"},\n \"el-date-picker/type\": {\"options\": [\"year\", \"month\", \"date\", \"week\", \"datetime\", \"datetimerange\", \"daterange\"], \"description\": \"type of the picker, default: date\"},\n \"el-table-column/type\": {\"options\": [\"selection\", \"index\", \"expand\"], \"description\": \"type of the column. If set to 'selection', the column will display checkbox. If set to 'index', the column will display index of the row (staring from 1). If set to 'expand', the column will display expand icon.\"},\n \"el-tag/type\": {\"options\": [\"info\", \"success\", \"warning\", \"danger\"], \"description\": \"theme\"},\n \"el-alert/type\": {\"options\": [\"success\", \"warning\", \"info\", \"danger\"], \"description\": \"component type\"},\n \"el-checkbox-group/min\": {\"description\": \"minimum number of checkbox checked\"},\n \"el-input-number/min\": {\"description\": \"the minimum allowed value\"},\n \"el-slider/min\": {\"description\": \"minimum value, defalult: 0\"},\n \"el-slider/max\": {\"description\": \"maximum value, defalult: 100\"},\n \"el-slider/debounce\": {\"description\": \"debounce delay when typing, in millisecond, works when 'show-input' is true, default: 300\"},\n \"el-autocomplete/debounce\": {\"version\": \">=2.0.0\", \"desciption\": \"debounce delay when typing, in milliseconds, default: 300\"},\n \"el-rate/max\": {\"description\": \"max rating score, default: 5\"},\n \"el-badge/max\": {\"description\": \"maximum value, shows '{max}+' when exceeded. Only works if 'value' is a Number\"},\n \"el-checkbox-group/max\": {\"description\": \"maximum number of checkbox checked\"},\n \"el-input-number/max\": {\"description\": \"the maximum allowed value\"},\n \"el-slider/height\": {\"description\": \"Slider height, required in vertical mode\"},\n \"el-table/height\": {\"description\": \"Table's height. By default it has an auto height. If its value is a number, the height is measured in pixels; if its value is a string, the height is affected by external styles\"},\n \"el-table/max-height\": {\"description\": \"Table's max-height. The height of the table starts from 'auto' until it reaches the maxHeight limit. The 'maxHeight' is measured in pixels, same as 'heigh't\"},\n \"el-time-select/value\": {\"description\": \"value of the picker, default: HH:mm:ss\"},\n \"el-tooltip/open-delay\": {\"description\": \"delay of appearance, in millisecond, default: 0\"},\n \"el-popover/open-delay\": {\"description\": \"delay of appearance when trigger is hover, in milliseconds\"},\n \"el-time-select/picker-options\": {\n \"options\": [\"start\", \"end\", \"step\", \"minTime\", \"maxTime\"],\n \"description\": \"additional options, type is object\"\n },\n \"el-time-picker/picker-options\": {\n \"options\": [\"format\", \"selectableRange\"],\n \"description\": \"additional options, type is object\"\n },\n \"el-date-picker/picker-options\": {\n \"options\": [\"shortcuts\", \"disabledDate\", \"firstDayOfWeek\", \"onPick\"],\n \"description\": \"additional options, type is object\"\n },\n \"loading\": {\"type\": \"boolean\"},\n \"disabled\": {\"type\": \"boolean\"},\n \"autofocus\": {\"type\": \"boolean\"},\n \"checked\": {\"type\": \"boolean\"},\n \"controls\": {\"type\": \"boolean\"},\n \"remote\": {\"type\": \"boolean\"},\n \"auto-upload\": {\"type\": \"boolean\"},\n \"show-message\": {\"type\": \"boolean\"},\n \"hidden\": {\"type\": \"boolean\"},\n \"visible-arrow\": {\"type\": \"boolean\"},\n \"collapse-transition\": {\"version\": \">2.3.0\", \"type\": \"boolean\", \"description\": \"whether to enable the collapse transition, default: true\"},\n \"select-on-indeterminate\": {\"version\": \">2.3.0\", \"type\": \"boolean\", \"description\": \"controls the behavior of master checkbox in multi-select tables when only some rows are selected (but not all). If true, all rows will be selected, else deselected. default: true\"},\n \"popper-append-to-body\": {\"version\": \">=2.2.0\", \"type\": \"boolean\", \"description\": \"whether to append the popper menu to body. If the positioning of the popper is wrong, you can try to set this prop to false, default: true\"},\n \"validate-on-rule-change\": {\"type\": \"boolean\", \"description\": \"whether to trigger validation when the 'rules' prop is changed, default: true\"},\n \"fullscreen\": {\"version\": \">=2.0.0\", \"type\": \"boolean\", \"description\": \"whether the Dialog takes up full screen, default: false\"},\n \"autoplay\": {\"type\": \"boolean\", \"description\": \"whether automatically loop the slides, default: true\"},\n \"enterable\": {\"type\": \"boolean\", \"description\": \"enterable whether the mouse can enter the tooltip, default: true\"},\n \"show-close\": {\"type\": \"boolean\", \"description\": \"whether to show a close button, default: true\"},\n \"close-on-press-escape\": {\"type\": \"boolean\", \"description\": \"whether the Dialog can be closed by pressing ESC, default: true\"},\n \"close-on-click-modal\": {\"type\": \"boolean\", \"description\": \"whether the Dialog can be closed by clicking the mask, default: true\"},\n \"lock-scroll\": {\"type\": \"boolean\", \"description\": \"whether scroll of body is disabled while Dialog is displayed, default: true\"},\n \"modal-append-to-body\": {\"type\": \"boolean\", \"description\": \"whether to append modal to body element. If false, the modal will be appended to Dialog's parent element, default: true\"},\n \"append-to-body\": {\"version\": \">=2.0.0\", \"type\": \"boolean\", \"description\": \"whether to append Dialog itself to body. A nested Dialog should have this attribute set to 'true', default: false\"},\n \"modal\": {\"type\": \"boolean\", \"description\": \"whether a mask is displayed, default: true\"},\n \"visible\": {\"type\": \"boolean\", \"description\": \"visibility of Dialog, supports the '.sync' modifier, default: false\"},\n \"hide-on-click\": {\"type\": \"boolean\", \"description\": \"whether to hide menu after clicking menu-item\"},\n \"split-button\": {\"type\": \"boolean\", \"description\": \"whether a button group is displayed\"},\n \"replace\": {\"type\": \"boolean\", \"description\": \"if 'true', the navigation will not leave a history record, default: false\"},\n \"auto-expand-parent\": {\"type\": \"boolean\", \"description\": \"whether to expand father node when a child node is expanded, default: true\"},\n \"expand-on-click-node\": {\"type\": \"boolean\", \"description\": \"whether to expand or collapse node when clicking on the node, if false, then expand or collapse node only when clicking on the arrow icon, default: true\"},\n \"filter-multiple\": {\"type\": \"boolean\", \"description\": \"whether data filtering supports multiple options\"},\n \"shwo-header\": {\"type\": \"boolean\", \"description\": \"whether table header is visible\"},\n \"fit\": {\"type\": \"boolean\", \"description\": \"whether width of column automatically fits its container\"},\n \"inline\": {\"type\": \"boolean\", \"description\": \"whether the form is inline\"},\n \"indeterminate\": {\"type\": \"boolean\", \"description\": \"same as indeterminate in native checkbox\"},\n \"plain\": {\"type\": \"boolean\", \"description\": \"determine whether it's a plain button\"},\n \"allow-half\": {\"type\": \"flag\", \"description\": \"whether picking half start is allowed\"},\n \"thumbnail-mode\": {\"type\": \"boolean\", \"description\": \"whether thumbnail is displayed, default: false\"},\n \"show-upload-list\": {\"type\": \"boolean\", \"description\": \"whether to show the uploaded file list, default: true\"},\n \"vertical\": {\"type\": \"boolean\", \"description\": \"defaults: false\"},\n \"collapse\": {\"type\": \"boolean\", \"description\": \"whether the menu is collapsed (available only in vertical mode)\"},\n \"el-tooltip/vavlue\": {\"type\": \"boolean\", \"description\": \"visibility of Tooltip, default: false\"},\n \"el-collapse/accordion\": {\"type\": \"boolean\", \"description\": \"whether to activate accordion mode, default: false\"},\n \"el-tree/accordion\": {\"type\": \"boolean\", \"description\": \"whether only one node among the same level can be expanded at one time, default: false\"},\n \"el-button/round\": {\"version\": \">=2.0.0\", \"type\": \"boolean\", \"description\": \"determine whether it's a round button, default: false\"},\n \"change\": {\"type\": \"method\"},\n \"select\": {\"type\": \"method\"},\n \"click\": {\"type\": \"method\"},\n \"blur\": {\"type\": \"method\"},\n \"focus\": {\"type\": \"method\"},\n \"method\": {\"type\": \"method\"},\n \"visible-change\": {\"type\": \"method\"},\n \"remove-tag\": {\"type\": \"method\"},\n \"szie-change\": {\"type\": \"method\"},\n \"close\": {\"type\": \"method\"},\n \"open\": {\"type\": \"method\"},\n \"active-change\": {\"type\": \"method\"},\n \"el-input/click\": {\"version\": \"<2.0.0\", \"type\": \"method\"},\n \"el-menu/open\": {\"version\": \">=2.0.0\", \"type\": \"method\"},\n \"el-menu/close\": {\"version\": \">=2.0.0\", \"type\": \"method\"},\n \"check\": {\"version\": \">=2.2.0\", \"type\": \"method\", \"description\": \"triggers after clicking the checkbox of a node\"},\n \"show\": {\"type\": \"method\", \"description\": \"triggers when popover shows\"},\n \"hide\": {\"type\": \"method\", \"description\": \"triggers when popover hides\"},\n \"tab-click\": {\"type\": \"method\", \"description\": \"triggers when a tab is clicked\"},\n \"tab-remove\": {\"type\": \"method\", \"description\": \"triggers when tab-remove button is clicked\"},\n \"tab-add\": {\"type\": \"method\", \"description\": \"triggers when tab-add button is clicked\"},\n \"edit\": {\"type\": \"method\", \"description\": \"triggers when tab-add button or tab-remove is clicked\"},\n \"node-expand\": {\"type\": \"method\", \"description\": \"triggers when current node open\"},\n \"node-collapse\": {\"type\": \"method\", \"description\": \"triggers when current node close\"},\n \"node-click\": {\"type\": \"method\", \"description\": \"triggers when a node is clicked\"},\n \"node-contextmenu\": {\"type\": \"method\", \"version\": \">=2.2.0\", \"description\": \"triggers when a node is clicked by right button\"},\n \"check-change\": {\"type\": \"method\", \"description\": \"triggers when the selected state of the node changes\"},\n \"active-item-change\": {\"type\": \"method\", \"description\": \"triggers when active option changes, only works when 'change-on-select' is 'false'\"},\n \"select-all\": {\"type\": \"method\", \"description\": \"triggers when user clicks the checkbox in table header, arg: selection\"},\n \"selection-change\": {\"type\": \"method\", \"description\": \"triggers when selection changes, arg: selection\"},\n \"cell-mouse-enter\": {\"type\": \"method\", \"description\": \"triggers when hovering into a cell, arg: row, column, cell, event\"},\n \"cell-mouse-leave\": {\"type\": \"method\", \"description\": \"triggers when hovering out of a cell, arg: row column, cell, event\"},\n \"cell-click\": {\"type\": \"method\", \"description\": \"triggers when clicking a cell, arg: row, column, cell, event\"},\n \"cell-dbclick\": {\"type\": \"method\", \"description\": \"triggers when double clicking a cell, arg: row, column, cell, event\"},\n \"row-click\": {\"type\": \"method\", \"description\": \"triggers when clicking a row, arg: row, event, column\"},\n \"row-contextmenu\": {\"type\": \"method\", \"description\": \"triggers when user right clicks on a row, arg: row, event\"},\n \"row-dbclick\": {\"type\": \"method\", \"description\": \"triggers when double clicking a row, arg: row, event\"},\n \"header-click\": {\"type\": \"method\", \"description\": \"triggers when clicking a column header, arg: column, event\"},\n \"sort-change\": {\"type\": \"method\", \"description\": \"triggers when Table's sorting changes, arg: { column, prop, order }\"},\n \"filter-change\": {\"type\": \"method\", \"description\": \"column's key. If you need to use the filter-change event, this attribute is mandatory to identify which column is being filtered, arg: filters\"},\n \"current-change\": {\"type\": \"method\", \"description\": \"triggers when current row changes, arg: currentRow, oldCurrentRow\"},\n \"header-draggend\": {\"type\": \"method\", \"description\": \"triggers when finish dragging header, arg: newWidth, oldWidth, column, event\"},\n \"expand\": {\"version\": \"<2.0.0\", \"type\": \"method\", \"description\": \"triggers when user expands or collapses a row, arg: row, expanded\"},\n \"expand-change\": {\"version\": \">=2.0.0\", \"type\": \"method\", \"description\": \"triggers when user expands or collapses a row, arg: row, expanded\"},\n \"left-check-change\": {\"version\": \">=2.2.2\", \"type\": \"method\", \"description\": \"triggers when end user changes the checked state of any data item in the left list\"},\n \"right-check-change\": {\"version\": \">=2.2.2\", \"type\": \"method\", \"description\": \"triggers when end user changes the checked state of any data item in the right list\"},\n \"node-drag-start\": {\"version\": \">=2.3.0\", \"type\": \"method\", \"description\": \"triggers when dragging starts\"},\n \"node-drag-enter\": {\"version\": \">=2.3.0\", \"type\": \"method\", \"description\": \"triggers when the dragging node enters another node\"},\n \"node-drag-leave\": {\"version\": \">=2.3.0\", \"type\": \"method\", \"description\": \"triggers when the dragging node leaves a node\"},\n \"node-drag-over\": {\"version\": \">=2.3.0\", \"type\": \"method\", \"description\": \"triggers when dragging over a node (like mouseover event)\"},\n \"node-drag-end\": {\"version\": \">=2.3.0\", \"type\": \"method\", \"description\": \"triggers when dragging ends\"},\n \"node-drop\": {\"version\": \">=2.3.0\", \"type\": \"method\", \"description\": \"triggers after the dragging node is dropped\"},\n \"validate\": {\"version\": \">=2.3.0\", \"type\": \"method\", \"description\": \"triggers after a form item is validated\"},\n \"el-table/select\": {\"type\": \"method\", \"description\": \"triggers when user clicks the checkbox in a row, arg: selection, row\"},\n \"el-tag/close\": {\"type\": \"method\", \"description\": \"triggers when Tab is removed\"},\n \"el-tree/current-change\": {\"type\": \"method\", \"description\": \"triggers when current node changes\"},\n \"el-pagination/current-change\": {\"type\": \"method\", \"description\": \"triggers when 'current-page' changes\"},\n \"el-dropdown/command\": {\"type\": \"method\", \"description\": \"triggers when a dropdown item is clicked\"},\n \"el-input/clear\": {\"version\": \">=2.2.2\", \"type\": \"method\", \"descriptino\": \"triggers when the Input is cleared by the button which generated by the 'clearable' attribute\"},\n \"el-select/clear\": {\"type\": \"method\", \"descriptino\": \"triggers when the clear icon is clicked in a clearable Select\"},\n \"el-popover/after-enter\": {\"version\": \">=2.2.2\", \"type\": \"method\", \"description\": \"triggers when the entering transition ends\"},\n \"el-popover/after-leave\": {\"version\": \">=2.2.2\", \"type\": \"method\", \"description\": \"triggers when the leaving transition ends\"},\n \"readonly\": {\"type\": \"flag\"},\n \"multiple\": {\"type\": \"flag\"},\n \"clearable\": {\"type\": \"flag\"},\n \"filterable\": {\"type\": \"flag\"},\n \"editable\": {\"type\": \"flag\"},\n \"allow-create\": {\"type\": \"flag\"},\n \"required\": {\"type\": \"flag\"},\n \"show-text\": {\"type\": \"flag\"},\n \"stripe\": {\"type\": \"flag\"},\n \"border\": {\"type\": \"flag\"},\n \"show-summary\": {\"type\": \"flag\"},\n \"default-expand-all\": {\"type\": \"flag\"},\n \"highlight-current-row\": {\"type\": \"flag\"},\n \"highlight-current\": {\"type\": \"flag\"},\n \"sortable\": {\"type\": \"flag\"},\n \"closable\": {\"type\": \"flag\"},\n \"small\": {\"type\": \"flag\"},\n \"divided\": {\"type\": \"flag\"},\n \"circle\": {\"version\": \">=2.3.0\", \"type\": \"flag\"},\n \"simple\": {\"version\": \">=2.0.0\", \"type\": \"flag\"},\n \"el-radio/border\": {\"version\": \">=2.0.0\", \"type\": \"flag\"},\n \"el-checkbox/border\": {\"version\": \">=2.0.0\", \"type\": \"flag\"},\n \"draggable\": {\"version\": \">=2.3.0\", \"type\": \"flag\", \"description\": \"whether enable tree nodes drag and drop\"},\n \"unlink-panels\": {\"version\": \">=2.0.0\", \"type\": \"flag\", \"description\": \"unlink two date-panels in range-picker\"},\n \"reserve-keyword\": {\"version\": \">=2.0.0\", \"type\": \"flag\", \"description\": \"when 'multiple' and 'filter' is true, whether to reserve current keyword after selecting an option\"},\n \"default-first-option\": {\"type\": \"flag\", \"description\": \"select first matching option on enter key. Use with 'filterable' or 'remote'\"},\n \"arrow-control\": {\"version\": \">=2.0.0\", \"type\": \"flag\", \"description\": \"whether to pick time using arrow buttons, only works with <el-time-picker>\"},\n \"time-arrow-control\": {\"version\": \">=2.0.0\", \"type\": \"flag\", \"description\": \"whether to pick time using arrow buttons\"},\n \"status-icon\": {\"version\": \">=2.0.0\", \"type\": \"flag\", \"descript\": \"whether to display an icon indicating the validation result\"},\n \"select-when-unmatched\": {\"type\": \"flag\", \"description\": \"whether to emit a 'select' event on enter when there is no autocomplete match\"},\n \"manual\": {\"type\": \"flag\", \"description\": \"whether to control Tooltip manually. mouseenter and mouseleave won't have effects if set to 'true', default: false\"},\n \"align-center\": {\"type\": \"flag\", \"description\": \"whether step description is centered\"},\n \"center\": {\"type\": \"flag\", \"description\": \"center whole Steps component\"},\n \"router\": {\"type\": \"flag\", \"description\": \"whether vue-router mode is activated. If true, index will be used as 'path' to activate the route action\"},\n \"unique-opened\": {\"type\": \"flag\", \"description\": \"whether only one sub-menu can be active\"},\n \"show-icon\": {\"type\": \"flag\", \"description\": \"if a type icon is displayed\"},\n \"is-dot\": {\"type\": \"flag\", \"description\": \"a little dot is displayed\"},\n \"check-strictly\": {\"type\": \"flag\", \"description\": \"whether checked state of a node not affects its father and child nodes when 'show-checkbox' is 'true'\"},\n \"show-checkbox\": {\"type\": \"flag\", \"description\": \"whether node is selectable\"},\n \"text-inside\": {\"type\": \"flag\", \"description\": \"whether to place the percentage inside progress bar, only works when type is 'line'\"},\n \"hit\": {\"type\": \"flag\", \"description\": \"whether Tag has a highlighted border\"},\n \"close-transition\": {\"type\": \"flag\", \"description\": \"whether the removal animation is disabled\"},\n \"reserve-selection\": {\"type\": \"flag\", \"description\": \"whether to reserve selection after data refreshing, works when type is 'selection'\"},\n \"show-overflow-tooltip\": {\"type\": \"flag\", \"description\": \"whether to hide extra content and show them in a tooltip when hovering on the cell\"},\n \"resizable\": {\"type\": \"flag\", \"description\": \"whether column width can be resized, works when border of 'el-table' is 'true'\"},\n \"show-alpha\": {\"type\": \"flag\", \"description\": \"whether to display the alpha slider\"},\n \"drag\": {\"type\": \"flag\", \"description\": \"whether to activate drag and drop mode\"},\n \"with-credentials\": {\"type\": \"flag\", \"description\": \"whether cookies are sent\"},\n \"change-on-select\": {\"type\": \"flag\", \"description\": \"whether selecting an option of any level is permitted\"},\n \"show-input\": {\"type\": \"flag\", \"description\": \"whether to display an input box, works when 'range' is false, default: false\"},\n \"show-input-controls\": {\"type\": \"flag\", \"description\": \"whether to display control buttons when 'show-input' is true, default: true\"},\n \"show-stops\": {\"type\": \"flag\", \"description\": \"whether to display breakpoints, default: false\"},\n \"show-tooltip\": {\"type\": \"flag\", \"description\": \"whether to display tooltip value, default: true\"},\n \"range\": {\"type\": \"flag\", \"description\": \"whether to select a range\"},\n \"show-score\": {\"version\": \">=2.0.0\", \"type\": \"flag\", \"description\": \"whether to display current score. show-score and show-text cannot be true at the same time\"},\n \"background\": {\"version\": \">=2.0.6\", \"type\": \"flag\", \"description\": \"whether the buttons have a background color\"},\n \"collapse-tags\": {\"version\": \">=2.0.5\", \"type\": \"flag\", \"description\": \"whether to collapse tags to a text when multiple selecting\"},\n \"el-dialog/center\": {\"version\": \">=2.0.0\", \"type\": \"flag\", \"description\": \"whether to align the header and footer in center\"},\n \"el-alert/center\": {\"type\": \"flag\", \"description\": \"whether to center the text\"},\n \"e;-steps/center\": {\"version\": \"<2.0.0\", \"type\": \"flag\", \"description\": \"center whole 'Steps' component\"},\n \"el-form/inline-message\": {\"version\": \">=2.0.0\", \"type\": \"flag\", \"description\": \"whether to display the error message inline with the form item\"},\n \"el-form-item/inline-message\": {\"version\": \">=2.0.0\", \"type\": \"flag\", \"description\": \"inline style validate message\"},\n \"format-tooltip\": {},\n \"filter-method\": {},\n \"remote-method\": {},\n \"label\": {},\n \"placeholder\": {},\n \"max\": {},\n \"min\": {},\n \"popper-class\": {},\n \"el-color-picker/popper-class\": {\"version\": \">=2.0.0\"},\n \"options\": {},\n \"props\": {},\n \"el-autocomplete/props\": {\"version\": \"<2.0.0\"},\n \"value\": {},\n \"width\": {},\n \"height\": {},\n \"data\": {},\n \"index\": {},\n \"text-color\": {},\n \"filter-placeholder\": {},\n \"label-width\": {},\n \"label-suffix\": {},\n \"class-name\": {},\n \"color\": {},\n \"title\": {},\n \"description\": {},\n \"popper-options\": {},\n \"check-descendants\": {\"version\": \">=2.0.0\"},\n \"v-loading\": {\"global\": true},\n \"element-loading-text\": {\"global\": true},\n \"class\": {\"global\": true, \"type\": \"icon\"},\n \"el-date-picker/prefix-icon\": {\"type\": \"icon\", \"version\": \">=2.1.0\", \"description\": \"Custom prefix icon class, default: 'el-icon-date\"},\n \"clear-icon\": {\"type\": \"icon\", \"version\": \">=2.1.0\", \"description\": \"Custom clear icon class, default: 'el-icon-circle-close\"},\n \"void-icon-class\": {\"type\": \"icon\", \"description\": \"class name of unselected icons, default: el-icon-star-off\"},\n \"disabled-void-icon-class\": {\"type\": \"icon\", \"description\": \"class name of unselected read-only icons, default: el-icon-star-on\"},\n \"icon-classes\": {\"type\": \"icon\", \"description\": \"array of class names of icons. It should have 3 elements, each of which corresponds with a score level, default: ['el-icon-star-on', 'el-icon-star-on','el-icon-star-on']\"},\n \"on-icon-class\": {\"version\": \"<2.0.0\", \"type\": \"icon\", \"description\": \"class name of the icon displayed when in on state, overrides 'on-text', version < 2\"},\n \"off-icon-class\": {\"version\": \"<2.0.0\", \"type\": \"icon\", \"description\": \"class name of the icon displayed when in off state, overrides 'off-text', version < 2\"},\n \"active-icon-class\": {\"version\": \">=2.0.0\", \"type\": \"icon\", \"description\": \"class name of the icon displayed when in on state, overrides 'active-text', version >= 2\"},\n \"inactive-icon-class\": {\"version\": \">=2.0.0\", \"type\": \"icon\", \"description\": \"class name of the icon displayed when in off state, overrides 'inactive-text', version >= 2\"},\n \"prefix-icon\": {\"version\": \">=2.0.0\", \"type\":\"flag\", \"description\": \"prefix icon class\"},\n \"suffix-icon\": {\"version\": \">=2.0.0\", \"type\":\"flag\", \"description\": \"suffix icon class\"},\n \"icon\": {\"type\": \"shortcut-icon\"},\n \"el-input/icon\": {\"version\": \"<2.0.0\", \"type\": \"shortcut-icon\", \"description\": \"icon name\"},\n \"icons\": [\"el-icon-arrow-down\", \"el-icon-arrow-left\",\"el-icon-arrow-right\", \"el-icon-arrow-up\", \"el-icon-caret-bottom\", \"el-icon-caret-left\", \"el-icon-caret-right\", \"el-icon-caret-top\", \"el-icon-check\", \"el-icon-circle-check\", \"el-icon-circle-cross\", \"el-icon-close\", \"el-icon-upload\", \"el-icon-d-arrow-left\", \"el-icon-d-arrow-right\", \"el-icon-d-caret\", \"el-icon-date\", \"el-icon-delete\", \"el-icon-document\", \"el-icon-edit\", \"el-icon-information\", \"el-icon-loading\", \"el-icon-menu\", \"el-icon-message\", \"el-icon-minus\", \"el-icon-more\", \"el-icon-picture\", \"el-icon-plus\", \"el-icon-search\", \"el-icon-setting\", \"el-icon-share\", \"el-icon-star-off\", \"el-icon-star-on\", \"el-icon-time\", \"el-icon-warning\", \"el-icon-delete2\", \"el-icon-upload2\", \"el-icon-view\"]\n}\n", "{\n \"v-ons-action-sheet-button\": {\n \"attributes\": [\n \"icon\",\n \"modifier\"\n ],\n \"description\": \"Component that represent each button of the action sheet.\"\n },\n \"v-ons-action-sheet\": {\n \"attributes\": [\n \"title\",\n \"modifier\",\n \"cancelable\",\n \"disabled\",\n \"mask-color\",\n \"options\"\n ],\n \"description\": \"Action/bottom sheet that is displayed on top of current screen.\\n This element can either be attached directly to the `<body>` or dynamically created from a template using the `ons.createElement(template, { append: true })` utility function and the `<ons-template>` tag.\\n The action sheet is useful for displaying a list of options and asking the user to make a decision. A `ons-action-sheet-button` is provided for this purpose, although it can contain any type of content.\\n It will automatically be displayed as Material Design (bottom sheet) when running on an Android device.\\n\"\n },\n \"v-ons-alert-dialog-button\": {\n \"attributes\": [\n \"modifier\",\n \"disabled\"\n ],\n \"description\": \"\"\n },\n \"v-ons-alert-dialog\": {\n \"attributes\": [\n \"modifier\",\n \"cancelable\",\n \"disabled\",\n \"mask-color\",\n \"title\",\n \"footer\",\n \"visible\",\n \"options\"\n ],\n \"description\": \"Alert dialog that is displayed on top of the current screen. Useful for displaying questions, warnings or error messages to the user. The title, content and buttons can be easily customized and it will automatically switch style based on the platform.\\n To use the element it can either be attached directly to the `<body>` element or dynamically created from a template using the `ons.createAlertDialog(template)` utility function and the `<ons-template>` tag.\\n\"\n },\n \"v-ons-back-button\": {\n \"attributes\": [\n \"modifier\"\n ],\n \"description\": \"Back button component for `<ons-toolbar>`. Put it in the left part of the `<ons-toolbar>`.\\n It will find the parent `<ons-navigator>` element and pop a page when clicked. This behavior can be overriden by specifying the `onClick` property.\\n\"\n },\n \"v-ons-bottom-toolbar\": {\n \"attributes\": [\n \"modifier\"\n ],\n \"description\": \"Toolbar component that is positioned at the bottom of the page.\"\n },\n \"v-ons-button\": {\n \"attributes\": [\n \"modifier\",\n \"ripple\",\n \"disabled\"\n ],\n \"description\": \"Button component. If you want to place a button in a toolbar, use `<ons-toolbar-button>` or `<ons-back-button>` instead.\\n Will automatically display as a Material Design button with a ripple effect on Android.\\n\"\n },\n \"v-ons-card\": {\n \"attributes\": [\n \"modifier\"\n ],\n \"description\": \"Component to create a card that displays some information.\\n The card may be composed by divs with specially prepared classes `title` and/or `content`. You can also add your own content as you please.\"\n },\n \"v-ons-carousel-item\": {\n \"attributes\": [],\n \"description\": \"Carousel item component. Used as a child of the `<ons-carousel>` element.\\n\"\n },\n \"v-ons-carousel\": {\n \"attributes\": [\n \"direction\",\n \"fullscreen\",\n \"overscrollable\",\n \"centered\",\n \"item-width\",\n \"item-height\",\n \"auto-scroll\",\n \"auto-scroll-ratio\",\n \"swipeable\",\n \"disabled\",\n \"auto-refresh\",\n \"index\",\n \"on-swipe\",\n \"options\"\n ],\n \"description\": \"Carousel component. A carousel can be used to display several items in the same space.\\n The component supports displaying content both horizontally and vertically. The user can scroll through the items by dragging and it can also be controller programmatically.\\n\"\n },\n \"v-ons-checkbox\": {\n \"attributes\": [\n \"input-id\"\n ],\n \"description\": \"A checkbox element. The component will automatically render as a Material Design checkbox on Android devices.\\n Most attributes that can be used for a normal `<input type=\\\"checkbox\\\">` element can also be used on the `<ons-checkbox>` element.\\n\"\n },\n \"v-ons-col\": {\n \"attributes\": [\n \"vertical-align\",\n \"width\"\n ],\n \"description\": \"Represents a column in the grid system. Use with `<ons-row>` to layout components.\"\n },\n \"v-ons-dialog\": {\n \"attributes\": [\n \"modifier\",\n \"cancelable\",\n \"disabled\",\n \"mask-color\",\n \"visible\",\n \"options\"\n ],\n \"description\": \"Dialog that is displayed on top of current screen. As opposed to the `<ons-alert-dialog>` element, this component can contain any kind of content.\\n To use the element it can either be attached directly to the `<body>` element or dynamically created from a template using the `ons.createDialog(template)` utility function and the `<ons-template>` tag.\\n The dialog is useful for displaying menus, additional information or to ask the user to make a decision.\\n It will automatically be displayed as Material Design when running on an Android device.\\n\"\n },\n \"v-ons-fab\": {\n \"attributes\": [\n \"modifier\",\n \"ripple\",\n \"position\",\n \"disabled\"\n ],\n \"description\": \"The Floating action button is a circular button defined in the [Material Design specification](https://www.google.com/design/spec/components/buttons-floating-action-button.html). They are often used to promote the primary action of the app.\\n It can be displayed either as an inline element or in one of the corners. Normally it will be positioned in the lower right corner of the screen.\\n\"\n },\n \"v-ons-icon\": {\n \"attributes\": [\n \"icon\",\n \"size\",\n \"rotate\",\n \"fixed-width\",\n \"spin\"\n ],\n \"description\": \"Displays an icon. The following icon suites are available:\\n * [Font Awesome](https://fortawesome.github.io/Font-Awesome/)\\n * [Ionicons](http://ionicons.com/)\\n * [Material Design Iconic Font](http://zavoloklom.github.io/material-design-iconic-font/)\\n\"\n },\n \"v-ons-input\": {\n \"attributes\": [\n \"placeholder\",\n \"float\",\n \"type\",\n \"input-id\"\n ],\n \"description\": \"An input element. The `type` attribute can be used to change the input type. All text input types are supported.\\n The component will automatically render as a Material Design input on Android devices.\\n Most attributes that can be used for a normal `<input>` element can also be used on the `<ons-input>` element.\\n\"\n },\n \"v-ons-lazy-repeat\": {\n \"attributes\": [\n \"render-item\",\n \"length\",\n \"calculate-item-height\"\n ],\n \"description\": \"Using this component a list with millions of items can be rendered without a drop in performance.\\n It does that by \\\"lazily\\\" loading elements into the DOM when they come into view and\\n removing items from the DOM when they are not visible.\\n\"\n },\n \"v-ons-list-header\": {\n \"attributes\": [\n \"modifier\"\n ],\n \"description\": \"Header element for list items. Must be put inside the `<ons-list>` component.\"\n },\n \"v-ons-list-item\": {\n \"attributes\": [\n \"modifier\",\n \"lock-on-drag\",\n \"tappable\",\n \"tap-background-color\"\n ],\n \"description\": \"Component that represents each item in a list. The list item is composed of three parts that are represented with the `left`, `center` and `right` classes. These classes can be used to ensure that the content of the list items is properly aligned.\\n ```\\n <ons-list-item>\\n <div class=\\\"left\\\">Left</div>\\n <div class=\\\"center\\\">Center</div>\\n <div class=\\\"right\\\">Right</div>\\n </ons-list-item>\\n ```\\n There is also a number of classes (prefixed with `list-item__*`) that help when putting things like icons and thumbnails into the list items.\\n\"\n },\n \"v-ons-list-title\": {\n \"attributes\": [],\n \"description\": \"Represents a list title.\"\n },\n \"v-ons-list\": {\n \"attributes\": [\n \"modifier\"\n ],\n \"description\": \"Component to define a list, and the container for ons-list-item(s).\"\n },\n \"v-ons-modal\": {\n \"attributes\": [\n \"visible\",\n \"options\"\n ],\n \"description\": \"Modal component that masks current screen. Underlying components are not subject to any events while the modal component is shown.\\n This component can be used to block user input while some operation is running or to show some information to the user.\\n\"\n },\n \"v-ons-navigator\": {\n \"attributes\": [\n \"swipeable\",\n \"swipe-target-width\",\n \"swipe-threshold\",\n \"page-stack\",\n \"options\"\n ],\n \"description\": \"A component that provides page stack management and navigation. Stack navigation is the most common navigation pattern for mobile apps.\\n When a page is pushed on top of the stack it is displayed with a transition animation. When the user returns to the previous page the top page will be popped from the top of the stack and hidden with an opposite transition animation.\\n\"\n },\n \"v-ons-page\": {\n \"attributes\": [\n \"modifier\",\n \"infinite-scroll\"\n ],\n \"description\": \"This component defines the root of each page. If the content is large it will become scrollable.\\n A navigation bar can be added to the top of the page using the `<ons-toolbar>` element.\\n\"\n },\n \"v-ons-popover\": {\n \"attributes\": [\n \"modifier\",\n \"direction\",\n \"cancelable\",\n \"cover-target\",\n \"mask-color\",\n \"target\",\n \"visible\",\n \"options\"\n ],\n \"description\": \"A component that displays a popover next to an element. The popover can be used to display extra information about a component or a tooltip.\\n To use the element it can either be attached directly to the `<body>` element or dynamically created from a template using the `ons.createPopover(template)` utility function and the `<ons-template>` tag.\\n Another common way to use the popover is to display a menu when a button on the screen is tapped. For Material Design, popover looks exactly as a dropdown menu.\\n\"\n },\n \"v-ons-progress-bar\": {\n \"attributes\": [\n \"modifier\",\n \"value\",\n \"secondary-value\",\n \"indeterminate\"\n ],\n \"description\": \"The component is used to display a linear progress bar. It can either display a progress bar that shows the user how much of a task has been completed. In the case where the percentage is not known it can be used to display an animated progress bar so the user can see that an operation is in progress.\\n\"\n },\n \"v-ons-progress-circular\": {\n \"attributes\": [\n \"modifier\",\n \"value\",\n \"secondary-value\",\n \"indeterminate\"\n ],\n \"description\": \"This component displays a circular progress indicator. It can either be used to show how much of a task has been completed or to show a looping animation to indicate that an operation is currently running.\\n\"\n },\n \"v-ons-pull-hook\": {\n \"attributes\": [\n \"disabled\",\n \"height\",\n \"threshold-height\",\n \"fixed-content\",\n \"action\",\n \"on-pull\"\n ],\n \"description\": \"Component that adds **Pull to refresh** functionality to an `<ons-page>` element.\\n It can be used to perform a task when the user pulls down at the top of the page. A common usage is to refresh the data displayed in a page.\\n\"\n },\n \"v-ons-radio\": {\n \"attributes\": [\n \"input-id\"\n ],\n \"description\": \"A radio button element. The component will automatically render as a Material Design radio button on Android devices.\\n Most attributes that can be used for a normal `<input type=\\\"radio\\\">` element can also be used on the `<ons-radio>` element.\\n\"\n },\n \"v-ons-range\": {\n \"attributes\": [\n \"disabled\"\n ],\n \"description\": \"Range input component. Used to display a draggable slider.\\n Works very similar to the `<input type=\\\"range\\\">` element.\\n\"\n },\n \"v-ons-ripple\": {\n \"attributes\": [\n \"color\",\n \"modifier\",\n \"background\",\n \"size\",\n \"center\",\n \"disabled\"\n ],\n \"description\": \"Adds a Material Design \\\"ripple\\\" effect to an element. The ripple effect will spread from the position where the user taps.\\n Some elements such as `<ons-button>` and `<ons-fab>` support a `ripple` attribute.\\n\"\n },\n \"v-ons-row\": {\n \"attributes\": [\n \"vertical-align\"\n ],\n \"description\": \"Represents a row in the grid system. Use with `<ons-col>` to layout components.\"\n },\n \"v-ons-search-input\": {\n \"attributes\": [\n \"input-id\"\n ],\n \"description\": \"A search input element. The component will automatically render as a Material Design search input on Android devices.\\n Most attributes that can be used for a normal `<input>` element can also be used on the `<ons-search-input>` element.\\n\"\n },\n \"v-ons-segment\": {\n \"attributes\": [\n \"modifier\",\n \"tabbar-id\",\n \"disabled\",\n \"index\"\n ],\n \"description\": \"Segment component. Use this component to have a button bar with automatic styles that switch on click of another button.\\n Will automatically display as a Material Design segment on Android.\\n\"\n },\n \"v-ons-select\": {\n \"attributes\": [\n \"autofocus\",\n \"disabled\",\n \"form\",\n \"multiple\",\n \"name\",\n \"required\",\n \"select-id\",\n \"size\"\n ],\n \"description\": \"Select component. If you want to place a select with an ID of `my-id` on a page, use `<ons-select select-id=\\\"my-id\\\">`.\\n The component will automatically display as a Material Design select on Android.\\n Most attributes that can be used for a normal `<select>` element can also be used on the `<ons-select>` element.\\n\"\n },\n \"v-ons-speed-dial-item\": {\n \"attributes\": [\n \"modifier\",\n \"ripple\"\n ],\n \"description\": \"This component displays the child elements of the Material Design Speed dial component.\\n\"\n },\n \"v-ons-speed-dial\": {\n \"attributes\": [\n \"modifier\",\n \"ripple\",\n \"position\",\n \"direction\",\n \"disabled\",\n \"visible\",\n \"open\"\n ],\n \"description\": \"Element that displays a Material Design Speed Dialog component. It is useful when there are more than one primary action that can be performed in a page.\\n The Speed dial looks like a `<ons-fab>` element but will expand a menu when tapped.\\n\"\n },\n \"v-ons-splitter-content\": {\n \"attributes\": [],\n \"description\": \"The `<ons-splitter-content>` element is used as a child element of `<ons-splitter>`.\\n It contains the main content of the page while `<ons-splitter-side>` contains the list.\\n\"\n },\n \"v-ons-splitter-side\": {\n \"attributes\": [\n \"open-threshold\",\n \"collapse\",\n \"swipe-target-width\",\n \"width\",\n \"side\",\n \"mode\",\n \"swipeable\",\n \"open\",\n \"options\"\n ],\n \"description\": \"The `<ons-splitter-side>` element is used as a child element of `<ons-splitter>`.\\n It will be displayed on either the left or right side of the `<ons-splitter-content>` element.\\n It supports two modes: collapsed and split. When it's in collapsed mode it will be hidden from view and can be displayed when the user swipes the screen or taps a button. In split mode the element is always shown. It can be configured to automatically switch between the two modes depending on the screen size.\\n\"\n },\n \"v-ons-splitter\": {\n \"attributes\": [],\n \"description\": \"A component that enables responsive layout by implementing both a two-column layout and a sliding menu layout.\\n It can be configured to automatically expand into a column layout on large screens and collapse the menu on smaller screens. When the menu is collapsed the user can open it by swiping.\\n\"\n },\n \"v-ons-switch\": {\n \"attributes\": [\n \"modifier\",\n \"disabled\",\n \"checked\",\n \"input-id\"\n ],\n \"description\": \"Switch component. The switch can be toggled both by dragging and tapping.\\n Will automatically displays a Material Design switch on Android devices.\\n\"\n },\n \"v-ons-tab\": {\n \"attributes\": [\n \"icon\",\n \"active-icon\",\n \"label\",\n \"badge\",\n \"active\"\n ],\n \"description\": \"Represents a tab inside tab bar. Each `<ons-tab>` represents a page.\"\n },\n \"v-ons-tabbar\": {\n \"attributes\": [\n \"position\",\n \"swipeable\",\n \"ignore-edge-width\",\n \"hide-tabs\",\n \"tab-border\",\n \"modifier\",\n \"tabs\",\n \"index\",\n \"on-swipe\",\n \"tabbar-style\",\n \"options\"\n ],\n \"description\": \"A component to display a tab bar on the bottom of a page. Used with `<ons-tab>` to manage pages using tabs.\"\n },\n \"v-ons-toast\": {\n \"attributes\": [\n \"options\"\n ],\n \"description\": \"The Toast or Snackbar component is useful for displaying dismissable information or simple actions at (normally) the bottom of the page.\\n This component does not block user input, allowing the app to continue its flow. For simple toasts, consider `ons.notification.toast` instead.\\n\"\n },\n \"v-ons-toolbar-button\": {\n \"attributes\": [\n \"modifier\",\n \"disabled\"\n ],\n \"description\": \"Button component for ons-toolbar and ons-bottom-toolbar.\"\n },\n \"v-ons-toolbar\": {\n \"attributes\": [\n \"inline\",\n \"modifier\"\n ],\n \"description\": \"Toolbar component that can be used with navigation.\\n Left, center and right container can be specified by class names.\\n This component will automatically displays as a Material Design toolbar when running on Android devices.\\n\"\n }\n}", "{\n \"v-ons-action-sheet-button/icon\": {\n \"type\": \"any\",\n \"description\": \"Creates an `ons-icon` component with this string. Only visible on Android.\"\n },\n \"v-ons-action-sheet-button/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the action sheet button.\"\n },\n \"v-ons-action-sheet/title\": {\n \"type\": \"any\",\n \"description\": \"Optional title of the action sheet. A new element will be created containing this string.\"\n },\n \"v-ons-action-sheet/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the action sheet.\"\n },\n \"v-ons-action-sheet/cancelable\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is set the action sheet can be closed by tapping the background or by pressing the back button on Android devices.\"\n },\n \"v-ons-action-sheet/disabled\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is set the action sheet is disabled.\"\n },\n \"v-ons-action-sheet/mask-color\": {\n \"type\": \"any\",\n \"description\": \"Color of the background mask. Default is `\\\"rgba(0, 0, 0, 0.2)\\\"`.\"\n },\n \"v-ons-action-sheet/options\": {\n \"type\": \"any\",\n \"description\": \"Additional options for this element. Must be specified with an object.\"\n },\n \"v-ons-alert-dialog-button/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the button.\"\n },\n \"v-ons-alert-dialog-button/disabled\": {\n \"type\": \"any\",\n \"description\": \"Specify if button should be disabled.\"\n },\n \"v-ons-alert-dialog/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the dialog.\"\n },\n \"v-ons-alert-dialog/cancelable\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is set the dialog can be closed by tapping the background or by pressing the back button on Android devices.\"\n },\n \"v-ons-alert-dialog/disabled\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is set the dialog is disabled.\"\n },\n \"v-ons-alert-dialog/mask-color\": {\n \"type\": \"any\",\n \"description\": \"Color of the background mask. Default is \\\"rgba(0, 0, 0, 0.2)\\\".\"\n },\n \"v-ons-alert-dialog/title\": {\n \"type\": \"any\",\n \"description\": \"Represents the dialog title. It can be provided inside a `slot=\\\"title\\\"` element instead.\"\n },\n \"v-ons-alert-dialog/footer\": {\n \"type\": \"any\",\n \"description\": \"Object keys will be treated as button names and their corresponding values must be functions that are called on click. It can be provided inside a `slot=\\\"footer\\\"` element instead.\"\n },\n \"v-ons-alert-dialog/visible\": {\n \"type\": \"any\",\n \"description\": \"Specify the visibility of the component.\"\n },\n \"v-ons-alert-dialog/options\": {\n \"type\": \"any\",\n \"description\": \"Additional options for this element. Must be specified with an object.\"\n },\n \"v-ons-back-button/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the back button.\"\n },\n \"v-ons-bottom-toolbar/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the toolbar.\"\n },\n \"v-ons-button/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the button.\"\n },\n \"v-ons-button/ripple\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is defined, the button will have a ripple effect.\"\n },\n \"v-ons-button/disabled\": {\n \"type\": \"any\",\n \"description\": \"Specify if button should be disabled.\"\n },\n \"v-ons-card/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the card.\"\n },\n \"v-ons-carousel/direction\": {\n \"type\": \"any\",\n \"description\": \"The direction of the carousel. Can be either \\\"horizontal\\\" or \\\"vertical\\\". Default is \\\"horizontal\\\".\"\n },\n \"v-ons-carousel/fullscreen\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is set the carousel will cover the whole screen.\"\n },\n \"v-ons-carousel/overscrollable\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is set the carousel will be scrollable over the edge. It will bounce back when released.\"\n },\n \"v-ons-carousel/centered\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is set the carousel then the selected item will be in the center of the carousel instead of the beginning. Useful only when the items are smaller than the carousel. \"\n },\n \"v-ons-carousel/item-width\": {\n \"type\": \"any\",\n \"description\": \"ons-carousel-item's width. Only works when the direction is set to \\\"horizontal\\\".\"\n },\n \"v-ons-carousel/item-height\": {\n \"type\": \"any\",\n \"description\": \"ons-carousel-item's height. Only works when the direction is set to \\\"vertical\\\".\"\n },\n \"v-ons-carousel/auto-scroll\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is set the carousel will be automatically scrolled to the closest item border when released.\"\n },\n \"v-ons-carousel/auto-scroll-ratio\": {\n \"type\": \"any\",\n \"description\": \"A number between 0.0 and 1.0 that specifies how much the user must drag the carousel in order for it to auto scroll to the next item.\"\n },\n \"v-ons-carousel/swipeable\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is set the carousel can be scrolled by drag or swipe.\"\n },\n \"v-ons-carousel/disabled\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is set the carousel is disabled.\"\n },\n \"v-ons-carousel/auto-refresh\": {\n \"type\": \"any\",\n \"description\": \"When this attribute is set the carousel will automatically refresh when the number of child nodes change.\"\n },\n \"v-ons-carousel/index\": {\n \"type\": \"any\",\n \"description\": \"If exists, specifies the current active index. It is also used as the initial index. Must be modified on `update:index` event.\"\n },\n \"v-ons-carousel/on-swipe\": {\n \"type\": \"any\",\n \"description\": \"Hook called whenever the user slides the carousel. It gets a decimal index and an animationOptions object as arguments.\"\n },\n \"v-ons-carousel/options\": {\n \"type\": \"any\",\n \"description\": \"Additional options for this element. Must be specified with an object.\"\n },\n \"v-ons-checkbox/input-id\": {\n \"type\": \"any\",\n \"description\": \"Specify the \\\"id\\\" attribute of the inner `<input>` element. This is useful when using `<label for=\\\"...\\\">` elements.\"\n },\n \"v-ons-col/vertical-align\": {\n \"type\": \"any\",\n \"description\": \"Vertical alignment of the column. Valid values are \\\"top\\\", \\\"center\\\", and \\\"bottom\\\".\"\n },\n \"v-ons-col/width\": {\n \"type\": \"any\",\n \"description\": \"The width of the column. Valid values are css width values (\\\"10%\\\", \\\"50px\\\").\"\n },\n \"v-ons-dialog/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the dialog.\"\n },\n \"v-ons-dialog/cancelable\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is set the dialog can be closed by tapping the background or by pressing the back button on Android devices.\"\n },\n \"v-ons-dialog/disabled\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is set the dialog is disabled.\"\n },\n \"v-ons-dialog/mask-color\": {\n \"type\": \"any\",\n \"description\": \"Color of the background mask. Default is `\\\"rgba(0, 0, 0, 0.2)\\\"`.\"\n },\n \"v-ons-dialog/visible\": {\n \"type\": \"any\",\n \"description\": \"Specify the visibility of the component.\"\n },\n \"v-ons-dialog/options\": {\n \"type\": \"any\",\n \"description\": \"Additional options for this element. Must be specified with an object.\"\n },\n \"v-ons-fab/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the button.\"\n },\n \"v-ons-fab/ripple\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is defined, the button will have a ripple effect when tapped.\"\n },\n \"v-ons-fab/position\": {\n \"type\": \"any\",\n \"description\": \"The position of the button. Should be a string like `\\\"bottom right\\\"` or `\\\"top left\\\"`. If this attribute is not defined it will be displayed as an inline element.\"\n },\n \"v-ons-fab/disabled\": {\n \"type\": \"any\",\n \"description\": \"Specify if button should be disabled.\"\n },\n \"v-ons-icon/icon\": {\n \"type\": \"any\",\n \"description\": \"The icon name. `\\\"md-\\\"` prefix for Material Icons, `\\\"fa-\\\"` for Font Awesome and `\\\"ion-\\\"` prefix for Ionicons.\\n See all available icons on their respective sites:\\n * [Font Awesome](https://fortawesome.github.io/Font-Awesome/)\\n * [Ionicons](http://ionicons.com)\\n * [Material Design Iconic Font](http://zavoloklom.github.io/material-design-iconic-font/)\\n Icons can also be styled based on modifier presence. Add comma-separated icons with `\\\"modifierName:\\\"` prefix.\\n The code:\\n ```\\n <ons-icon\\n icon=\\\"ion-edit, material:md-edit\\\">\\n </ons-icon>\\n ```\\n will display `\\\"md-edit\\\"` for Material Design and `\\\"ion-edit\\\"` as the default icon.\\n\"\n },\n \"v-ons-icon/size\": {\n \"type\": \"any\",\n \"description\": \"The sizes of the icon. Valid values are lg, 2x, 3x, 4x, 5x, or in the size in pixels.\\n Icons can also be styled based on modifier presence. Add comma-separated icons with `\\\"modifierName:\\\"` prefix.\\n The code:\\n ```\\n <ons-icon\\n icon=\\\"ion-edit\\\"\\n size=\\\"32px, material:24px\\\">\\n </ons-icon>\\n ```\\n will render as a `24px` icon if the `\\\"material\\\"` modifier is present and `32px` otherwise.\\n\"\n },\n \"v-ons-icon/rotate\": {\n \"type\": \"any\",\n \"description\": \"Number of degrees to rotate the icon. Valid values are 90, 180 and 270.\"\n },\n \"v-ons-icon/fixed-width\": {\n \"type\": \"any\",\n \"description\": \"When used in a list, you want the icons to have the same width so that they align vertically by defining this attribute.\"\n },\n \"v-ons-icon/spin\": {\n \"type\": \"any\",\n \"description\": \"Specify whether the icon should be spinning.\"\n },\n \"v-ons-input/placeholder\": {\n \"type\": \"any\",\n \"description\": \"Placeholder text. In Material Design, this placeholder will be a floating label.\"\n },\n \"v-ons-input/float\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is present, the placeholder will be animated in Material Design.\"\n },\n \"v-ons-input/type\": {\n \"type\": \"any\",\n \"description\": \"Specify the input type. This is the same as the \\\"type\\\" attribute for normal inputs. It expects strict text types such as `text`, `password`, etc. For checkbox, radio button, select or range, please have a look at the corresponding elements.\\n Please take a look at [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-type) for an exhaustive list of possible values. Depending on the platform and browser version some of these might not work.\\n\"\n },\n \"v-ons-input/input-id\": {\n \"type\": \"any\",\n \"description\": \"Specify the \\\"id\\\" attribute of the inner `<input>` element. This is useful when using `<label for=\\\"...\\\">` elements.\"\n },\n \"v-ons-lazy-repeat/render-item\": {\n \"type\": \"any\",\n \"description\": \"Item generator. This function gets an index as its first argument and must return an unmounted Vue component corresponding to a row in the list. The index should be used to get the necessary data for the new item.\"\n },\n \"v-ons-lazy-repeat/length\": {\n \"type\": \"any\",\n \"description\": \"Total number of items.\"\n },\n \"v-ons-lazy-repeat/calculate-item-height\": {\n \"type\": \"any\",\n \"description\": \"This function gets an index as its first argument and should return the expected height of the item. This is useful to ease calculations and possibly achieve a better scrolling.\"\n },\n \"v-ons-list-header/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the list header.\"\n },\n \"v-ons-list-item/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the list item.\"\n },\n \"v-ons-list-item/lock-on-drag\": {\n \"type\": \"any\",\n \"description\": \"Prevent vertical scrolling when the user drags horizontally.\"\n },\n \"v-ons-list-item/tappable\": {\n \"type\": \"any\",\n \"description\": \"Makes the element react to taps.\"\n },\n \"v-ons-list-item/tap-background-color\": {\n \"type\": \"any\",\n \"description\": \"Changes the background color when tapped. For this to work, the attribute \\\"tappable\\\" needs to be set. The default color is \\\"#d9d9d9\\\". It will display as a ripple effect on Android.\"\n },\n \"v-ons-list/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the list.\"\n },\n \"v-ons-modal/visible\": {\n \"type\": \"any\",\n \"description\": \"Specify the visibility of the component.\"\n },\n \"v-ons-modal/options\": {\n \"type\": \"any\",\n \"description\": \"Additional options for this element. Must be specified with an object.\"\n },\n \"v-ons-navigator/swipeable\": {\n \"type\": \"any\",\n \"description\": \"Enable iOS \\\"swipe to pop\\\" feature.\"\n },\n \"v-ons-navigator/swipe-target-width\": {\n \"type\": \"any\",\n \"description\": \"The width of swipeable area calculated from the edge (in pixels). Use this to enable swipe only when the finger touch on the screen edge.\"\n },\n \"v-ons-navigator/swipe-threshold\": {\n \"type\": \"any\",\n \"description\": \"Specify how much the page needs to be swiped before popping. A value between `0` and `1`.\"\n },\n \"v-ons-navigator/page-stack\": {\n \"type\": \"any\",\n \"description\": \"Array of `VOnsPage` components that represents `VOnsNavigator` page stack.\"\n },\n \"v-ons-navigator/options\": {\n \"type\": \"any\",\n \"description\": \"Additional options for this element. Must be specified with an object.\"\n },\n \"v-ons-page/modifier\": {\n \"type\": \"any\",\n \"description\": \"Specify modifier name to specify custom styles.\"\n },\n \"v-ons-page/infinite-scroll\": {\n \"type\": \"any\",\n \"description\": \"Called when the scroll is near the bottom. This function gets a `done` callback as its first argument. Useful for loading extra items in a list.\"\n },\n \"v-ons-popover/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the popover.\"\n },\n \"v-ons-popover/direction\": {\n \"type\": \"any\",\n \"description\": \"A space separated list of directions. If more than one direction is specified,\\n it will be chosen automatically. Valid directions are `\\\"up\\\"`, `\\\"down\\\"`, `\\\"left\\\"` and `\\\"right\\\"`.\\n\"\n },\n \"v-ons-popover/cancelable\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is set the popover can be closed by tapping the background or by pressing the back button.\"\n },\n \"v-ons-popover/cover-target\": {\n \"type\": \"any\",\n \"description\": \"If set the popover will cover the target on the screen.\"\n },\n \"v-ons-popover/mask-color\": {\n \"type\": \"any\",\n \"description\": \"Color of the background mask. Default is `\\\"rgba(0, 0, 0, 0.2)\\\"`.\"\n },\n \"v-ons-popover/target\": {\n \"type\": \"any\",\n \"description\": \"Target element. Can be either a Vue component reference, a CSS selector, an event object or a DOM element. It can also be provided as `options.target`.\"\n },\n \"v-ons-popover/visible\": {\n \"type\": \"any\",\n \"description\": \"Specify the visibility of the component.\"\n },\n \"v-ons-popover/options\": {\n \"type\": \"any\",\n \"description\": \"Additional options for this element. Must be specified with an object.\"\n },\n \"v-ons-progress-bar/modifier\": {\n \"type\": \"any\",\n \"description\": \"Change the appearance of the progress indicator.\"\n },\n \"v-ons-progress-bar/value\": {\n \"type\": \"any\",\n \"description\": \"Current progress. Should be a value between 0 and 100.\"\n },\n \"v-ons-progress-bar/secondary-value\": {\n \"type\": \"any\",\n \"description\": \"Current secondary progress. Should be a value between 0 and 100.\"\n },\n \"v-ons-progress-bar/indeterminate\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is set, an infinite looping animation will be shown.\"\n },\n \"v-ons-progress-circular/modifier\": {\n \"type\": \"any\",\n \"description\": \"Change the appearance of the progress indicator.\"\n },\n \"v-ons-progress-circular/value\": {\n \"type\": \"any\",\n \"description\": \"Current progress. Should be a value between 0 and 100.\"\n },\n \"v-ons-progress-circular/secondary-value\": {\n \"type\": \"any\",\n \"description\": \"Current secondary progress. Should be a value between 0 and 100.\"\n },\n \"v-ons-progress-circular/indeterminate\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is set, an infinite looping animation will be shown.\"\n },\n \"v-ons-pull-hook/disabled\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is set the \\\"pull-to-refresh\\\" functionality is disabled.\"\n },\n \"v-ons-pull-hook/height\": {\n \"type\": \"any\",\n \"description\": \"Specify the height of the component. When pulled down further than this value it will switch to the \\\"preaction\\\" state. The default value is \\\"64px\\\".\"\n },\n \"v-ons-pull-hook/threshold-height\": {\n \"type\": \"any\",\n \"description\": \"Specify the threshold height. The component automatically switches to the \\\"action\\\" state when pulled further than this value. The default value is \\\"96px\\\". A negative value or a value less than the height will disable this property.\"\n },\n \"v-ons-pull-hook/fixed-content\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is set the content of the page will not move when pulling.\"\n },\n \"v-ons-pull-hook/action\": {\n \"type\": \"any\",\n \"description\": \"This will be called in the `action` state if exists. The function will be given a `done` callback as it's first argument.\"\n },\n \"v-ons-pull-hook/on-pull\": {\n \"type\": \"any\",\n \"description\": \"Hook called whenever the element is pulled. It gets the pulled distance ratio (scroll / height) and an animationOptions object as arguments.\"\n },\n \"v-ons-radio/input-id\": {\n \"type\": \"any\",\n \"description\": \"Specify the \\\"id\\\" attribute of the inner `<input>` element. This is useful when using `<label for=\\\"...\\\">` elements.\"\n },\n \"v-ons-range/disabled\": {\n \"type\": \"any\",\n \"description\": \"Whether the element is disabled or not.\"\n },\n \"v-ons-ripple/color\": {\n \"type\": \"any\",\n \"description\": \"Color of the ripple effect.\"\n },\n \"v-ons-ripple/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the ripple effect.\"\n },\n \"v-ons-ripple/background\": {\n \"type\": \"any\",\n \"description\": \"Color of the background.\"\n },\n \"v-ons-ripple/size\": {\n \"type\": \"any\",\n \"description\": \"Sizing of the wave on ripple effect. Set \\\"cover\\\" or \\\"contain\\\". Default is \\\"cover\\\".\"\n },\n \"v-ons-ripple/center\": {\n \"type\": \"any\",\n \"description\": \"If this attribute presents, change the position of wave effect to center of the target element.\"\n },\n \"v-ons-ripple/disabled\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is set, the ripple effect will be disabled.\"\n },\n \"v-ons-row/vertical-align\": {\n \"type\": \"any\",\n \"description\": \"Short hand attribute for aligning vertically. Valid values are top, bottom, and center.\"\n },\n \"v-ons-search-input/input-id\": {\n \"type\": \"any\",\n \"description\": \"Specify the \\\"id\\\" attribute of the inner `<input>` element. This is useful when using `<label for=\\\"...\\\">` elements.\"\n },\n \"v-ons-segment/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the segment.\"\n },\n \"v-ons-segment/tabbar-id\": {\n \"type\": \"any\",\n \"description\": \"ID of the tabbar element to \\\"connect\\\" to the segment. Must be inside the same page.\"\n },\n \"v-ons-segment/disabled\": {\n \"type\": \"any\",\n \"description\": \"Specify if segment should be disabled.\"\n },\n \"v-ons-segment/index\": {\n \"type\": \"any\",\n \"description\": \"If exists, specifies the current active button's index. It is also used as the initially active button index. Must be modified on `update:index` event.\"\n },\n \"v-ons-select/autofocus\": {\n \"type\": \"any\",\n \"description\": \"Element automatically gains focus on page load.\"\n },\n \"v-ons-select/disabled\": {\n \"type\": \"any\",\n \"description\": \"Specify if select input should be disabled.\"\n },\n \"v-ons-select/form\": {\n \"type\": \"any\",\n \"description\": \"Associate a select element to an existing form on the page, even if not nested.\"\n },\n \"v-ons-select/multiple\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is defined, multiple options can be selected at once.\"\n },\n \"v-ons-select/name\": {\n \"type\": \"any\",\n \"description\": \"Name the select element, useful for instance if it is part of a form.\"\n },\n \"v-ons-select/required\": {\n \"type\": \"any\",\n \"description\": \"Make the select input required for submitting the form it is part of.\"\n },\n \"v-ons-select/select-id\": {\n \"type\": \"any\",\n \"description\": \"ID given to the inner select, useful for dynamic manipulation.\"\n },\n \"v-ons-select/size\": {\n \"type\": \"any\",\n \"description\": \"How many options are displayed; if there are more than the size then a scroll appears to navigate them.\"\n },\n \"v-ons-speed-dial-item/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the component.\"\n },\n \"v-ons-speed-dial-item/ripple\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is defined, the button will have a ripple effect when tapped.\"\n },\n \"v-ons-speed-dial/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the component.\"\n },\n \"v-ons-speed-dial/ripple\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is defined, the button will have a ripple effect when tapped.\"\n },\n \"v-ons-speed-dial/position\": {\n \"type\": \"any\",\n \"description\": \"Specify the vertical and horizontal position of the component.\\n I.e. to display it in the top right corner specify \\\"right top\\\".\\n Choose from \\\"right\\\", \\\"left\\\", \\\"top\\\" and \\\"bottom\\\".\\n\"\n },\n \"v-ons-speed-dial/direction\": {\n \"type\": \"any\",\n \"description\": \"Specify the direction the items are displayed. Possible values are \\\"up\\\", \\\"down\\\", \\\"left\\\" and \\\"right\\\".\"\n },\n \"v-ons-speed-dial/disabled\": {\n \"type\": \"any\",\n \"description\": \"Specify if button should be disabled.\"\n },\n \"v-ons-speed-dial/visible\": {\n \"type\": \"any\",\n \"description\": \"Specify the visibility of the component.\"\n },\n \"v-ons-speed-dial/open\": {\n \"type\": \"any\",\n \"description\": \"If exists, the inner items will be shown accordingly. Must be modified on `update:open` event.\"\n },\n \"v-ons-splitter-side/open-threshold\": {\n \"type\": \"any\",\n \"description\": \"Specify how much the menu needs to be swiped before opening. A value between `0` and `1`.\"\n },\n \"v-ons-splitter-side/collapse\": {\n \"type\": \"any\",\n \"description\": \"Specify the collapse behavior. Valid values are `\\\"portrait\\\"`, `\\\"landscape\\\"` or a media query.\\n The strings `\\\"portrait\\\"` and `\\\"landscape\\\"` means the view will collapse when device is in landscape or portrait orientation.\\n If the value is a media query, the view will collapse when the media query resolves to `true`.\\n If the value is not defined, the view always be in `\\\"collapse\\\"` mode.\\n\"\n },\n \"v-ons-splitter-side/swipe-target-width\": {\n \"type\": \"any\",\n \"description\": \"The width of swipeable area calculated from the edge (in pixels). Use this to enable swipe only when the finger touch on the screen edge.\"\n },\n \"v-ons-splitter-side/width\": {\n \"type\": \"any\",\n \"description\": \"Can be specified in either pixels or as a percentage, e.g. `90%` or `200px`.\"\n },\n \"v-ons-splitter-side/side\": {\n \"type\": \"any\",\n \"description\": \"Specify which side of the screen the `<ons-splitter-side>` element is located. Possible values are `\\\"left\\\"` and `\\\"right\\\"`.\"\n },\n \"v-ons-splitter-side/mode\": {\n \"type\": \"any\",\n \"description\": \"Current mode. Possible values are `\\\"collapse\\\"` or `\\\"split\\\"`. This attribute is read only.\"\n },\n \"v-ons-splitter-side/swipeable\": {\n \"type\": \"any\",\n \"description\": \"Whether to enable swipe interaction on collapse mode.\"\n },\n \"v-ons-splitter-side/open\": {\n \"type\": \"any\",\n \"description\": \"If exists, the menu will be opened accordingly. Must be modified on `update:open` event.\"\n },\n \"v-ons-splitter-side/options\": {\n \"type\": \"any\",\n \"description\": \"Additional options for this element. Must be specified with an object.\"\n },\n \"v-ons-switch/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the switch.\"\n },\n \"v-ons-switch/disabled\": {\n \"type\": \"any\",\n \"description\": \"Whether the switch is be disabled.\"\n },\n \"v-ons-switch/checked\": {\n \"type\": \"any\",\n \"description\": \"Whether the switch is checked.\"\n },\n \"v-ons-switch/input-id\": {\n \"type\": \"any\",\n \"description\": \"Specify the `id` attribute of the inner `<input>` element. This is useful when using `<label for=\\\"...\\\">` elements.\"\n },\n \"v-ons-tab/icon\": {\n \"type\": \"any\",\n \"description\": \"The icon name for the tab. Can specify the same icon name as `<ons-icon>`.\\n\"\n },\n \"v-ons-tab/active-icon\": {\n \"type\": \"any\",\n \"description\": \"The name of the icon when the tab is active.\"\n },\n \"v-ons-tab/label\": {\n \"type\": \"any\",\n \"description\": \"The label of the tab item.\"\n },\n \"v-ons-tab/badge\": {\n \"type\": \"any\",\n \"description\": \"Display a notification badge on top of the tab.\"\n },\n \"v-ons-tab/active\": {\n \"type\": \"any\",\n \"description\": \"This attribute should be set to the tab that is active by default.\"\n },\n \"v-ons-tabbar/position\": {\n \"type\": \"any\",\n \"description\": \"Tabbar's position. Available values are `\\\"bottom\\\"` and `\\\"top\\\"`. Use `\\\"auto\\\"` to choose position depending on platform (iOS bottom, Android top).\"\n },\n \"v-ons-tabbar/swipeable\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is set the tab bar can be scrolled by drag or swipe.\"\n },\n \"v-ons-tabbar/ignore-edge-width\": {\n \"type\": \"any\",\n \"description\": \"Distance in pixels from both edges. Swiping on these areas will prioritize parent components such as `ons-splitter` or `ons-navigator`.\"\n },\n \"v-ons-tabbar/hide-tabs\": {\n \"type\": \"any\",\n \"description\": \"Whether to hide the tabs.\"\n },\n \"v-ons-tabbar/tab-border\": {\n \"type\": \"any\",\n \"description\": \"If this attribute is set the tabs show a dynamic bottom border. Only works for iOS since the border is always visible in Material Design.\"\n },\n \"v-ons-tabbar/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the tabbar.\"\n },\n \"v-ons-tabbar/tabs\": {\n \"type\": \"any\",\n \"description\": \"Contains as many objects as desired tabs in the tabbar. Every object describes a `VOnsTab` component. Every object must include at least one of the next properties: `page`, `icon` or `label` (see `VOnsTab` reference for more options). It is also possible to pass props to the pages through a `props` object for each tab. Example: `tabs: [ { label: 'p1', page: p1 }, { label: 'p2', page: p2, props: { myPage2Prop: 'something' } } ]`. This can be omitted if using `slot=\\\"pages\\\"` and `slot=\\\"tabs\\\"` elements.\"\n },\n \"v-ons-tabbar/index\": {\n \"type\": \"any\",\n \"description\": \"If exists, specifies the current active index. It is also used as the initial index. Must be modified on `update:index` event.\"\n },\n \"v-ons-tabbar/on-swipe\": {\n \"type\": \"any\",\n \"description\": \"Hook called whenever the user slides the tabbar. It gets a decimal index and an animationOptions object as arguments.\"\n },\n \"v-ons-tabbar/tabbar-style\": {\n \"type\": \"any\",\n \"description\": \"Optional style for the actual tabbar element. Accepts any Vue valid style.\"\n },\n \"v-ons-tabbar/options\": {\n \"type\": \"any\",\n \"description\": \"Additional options for this element. Must be specified with an object.\"\n },\n \"v-ons-toast/options\": {\n \"type\": \"any\",\n \"description\": \"Additional options for this element. Must be specified with an object.\"\n },\n \"v-ons-toolbar-button/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the button.\"\n },\n \"v-ons-toolbar-button/disabled\": {\n \"type\": \"any\",\n \"description\": \"Specify if button should be disabled.\"\n },\n \"v-ons-toolbar/inline\": {\n \"type\": \"any\",\n \"description\": \"Display the toolbar as an inline element.\"\n },\n \"v-ons-toolbar/modifier\": {\n \"type\": \"any\",\n \"description\": \"The appearance of the toolbar.\"\n }\n}", "{\n \"b-alert\": {\n \"attributes\": [\n \"variant\",\n \"dismissible\",\n \"dismiss-label\",\n \"show\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-alert>\"\n },\n \"b-badge\": {\n \"attributes\": [\n \"href\",\n \"rel\",\n \"target\",\n \"active\",\n \"active-class\",\n \"append\",\n \"disabled\",\n \"event\",\n \"exact\",\n \"exact-active-class\",\n \"replace\",\n \"router-tag\",\n \"to\",\n \"tag\",\n \"variant\",\n \"pill\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-badge>\"\n },\n \"b-breadcrumb\": {\n \"attributes\": [\n \"items\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-breadcrumb>\"\n },\n \"b-breadcrumb-item\": {\n \"attributes\": [\n \"href\",\n \"rel\",\n \"target\",\n \"active\",\n \"active-class\",\n \"append\",\n \"disabled\",\n \"event\",\n \"exact\",\n \"exact-active-class\",\n \"replace\",\n \"router-tag\",\n \"to\",\n \"text\",\n \"aria-current\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-breadcrumb-item>\"\n },\n \"b-breadcrumb-link\": {\n \"attributes\": [\n \"href\",\n \"rel\",\n \"target\",\n \"active\",\n \"active-class\",\n \"append\",\n \"disabled\",\n \"event\",\n \"exact\",\n \"exact-active-class\",\n \"replace\",\n \"router-tag\",\n \"to\",\n \"text\",\n \"aria-current\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-breadcrumb-link>\"\n },\n \"b-button\": {\n \"attributes\": [\n \"href\",\n \"rel\",\n \"target\",\n \"active\",\n \"active-class\",\n \"append\",\n \"disabled\",\n \"event\",\n \"exact\",\n \"exact-active-class\",\n \"replace\",\n \"router-tag\",\n \"to\",\n \"block\",\n \"size\",\n \"variant\",\n \"type\",\n \"pressed\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-button>\"\n },\n \"b-btn\": {\n \"attributes\": [\n \"href\",\n \"rel\",\n \"target\",\n \"active\",\n \"active-class\",\n \"append\",\n \"disabled\",\n \"event\",\n \"exact\",\n \"exact-active-class\",\n \"replace\",\n \"router-tag\",\n \"to\",\n \"block\",\n \"size\",\n \"variant\",\n \"type\",\n \"pressed\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-btn>\"\n },\n \"b-button-close\": {\n \"attributes\": [\n \"disabled\",\n \"aria-label\",\n \"text-variant\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-button-close>\"\n },\n \"b-btn-close\": {\n \"attributes\": [\n \"disabled\",\n \"aria-label\",\n \"text-variant\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-btn-close>\"\n },\n \"b-button-toolbar\": {\n \"attributes\": [\n \"justify\",\n \"key-nav\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-button-toolbar>\"\n },\n \"b-btn-toolbar\": {\n \"attributes\": [\n \"justify\",\n \"key-nav\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-btn-toolbar>\"\n },\n \"b-button-group\": {\n \"attributes\": [\n \"vertical\",\n \"size\",\n \"tag\",\n \"aria-role\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-button-group>\"\n },\n \"b-btn-group\": {\n \"attributes\": [\n \"vertical\",\n \"size\",\n \"tag\",\n \"aria-role\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-btn-group>\"\n },\n \"b-card\": {\n \"attributes\": [\n \"body-tag\",\n \"body-bg-variant\",\n \"body-border-variant\",\n \"body-text-variant\",\n \"body-class\",\n \"title\",\n \"title-tag\",\n \"sub-title\",\n \"sub-title-tag\",\n \"overlay\",\n \"header-tag\",\n \"header-bg-variant\",\n \"header-border-variant\",\n \"header-text-variant\",\n \"header\",\n \"header-class\",\n \"footer-tag\",\n \"footer-bg-variant\",\n \"footer-border-variant\",\n \"footer-text-variant\",\n \"footer\",\n \"footer-class\",\n \"img-src\",\n \"img-alt\",\n \"img-top\",\n \"img-bottom\",\n \"img-fluid\",\n \"tag\",\n \"bg-variant\",\n \"border-variant\",\n \"text-variant\",\n \"align\",\n \"no-body\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-card>\"\n },\n \"b-card-header\": {\n \"attributes\": [\n \"header-tag\",\n \"header-bg-variant\",\n \"header-border-variant\",\n \"header-text-variant\",\n \"header\",\n \"header-class\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-card-header>\"\n },\n \"b-card-body\": {\n \"attributes\": [\n \"body-tag\",\n \"body-bg-variant\",\n \"body-border-variant\",\n \"body-text-variant\",\n \"body-class\",\n \"title\",\n \"title-tag\",\n \"sub-title\",\n \"sub-title-tag\",\n \"overlay\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-card-body>\"\n },\n \"b-card-footer\": {\n \"attributes\": [\n \"footer-tag\",\n \"footer-bg-variant\",\n \"footer-border-variant\",\n \"footer-text-variant\",\n \"footer\",\n \"footer-class\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-card-footer>\"\n },\n \"b-card-img\": {\n \"attributes\": [\n \"src\",\n \"alt\",\n \"top\",\n \"bottom\",\n \"fluid\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-card-img>\"\n },\n \"b-card-group\": {\n \"attributes\": [\n \"tag\",\n \"deck\",\n \"columns\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-card-group>\"\n },\n \"b-carousel\": {\n \"attributes\": [\n \"label-prev\",\n \"label-next\",\n \"label-goto-slide\",\n \"label-indicators\",\n \"interval\",\n \"indicators\",\n \"controls\",\n \"img-width\",\n \"img-height\",\n \"background\",\n \"value\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-carousel>\"\n },\n \"b-carousel-slide\": {\n \"attributes\": [\n \"img-src\",\n \"src\",\n \"img-alt\",\n \"img-width\",\n \"img-height\",\n \"img-blank\",\n \"img-blank-color\",\n \"content-visible-up\",\n \"content-tag\",\n \"caption\",\n \"caption-tag\",\n \"text\",\n \"text-tag\",\n \"background\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-carousel-slide>\"\n },\n \"b-collapse\": {\n \"attributes\": [\n \"id\",\n \"is-nav\",\n \"accordion\",\n \"visible\",\n \"tag\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-collapse>\"\n },\n \"b-dropdown\": {\n \"attributes\": [\n \"split\",\n \"toggle-text\",\n \"size\",\n \"variant\",\n \"no-caret\",\n \"role\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-dropdown>\"\n },\n \"b-dd\": {\n \"attributes\": [\n \"split\",\n \"toggle-text\",\n \"size\",\n \"variant\",\n \"no-caret\",\n \"role\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-dd>\"\n },\n \"b-dropdown-item\": {\n \"attributes\": [\n \"href\",\n \"rel\",\n \"target\",\n \"active\",\n \"active-class\",\n \"append\",\n \"disabled\",\n \"event\",\n \"exact\",\n \"exact-active-class\",\n \"replace\",\n \"router-tag\",\n \"to\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-dropdown-item>\"\n },\n \"b-dd-item\": {\n \"attributes\": [\n \"href\",\n \"rel\",\n \"target\",\n \"active\",\n \"active-class\",\n \"append\",\n \"disabled\",\n \"event\",\n \"exact\",\n \"exact-active-class\",\n \"replace\",\n \"router-tag\",\n \"to\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-dd-item>\"\n },\n \"b-dropdown-item-button\": {\n \"attributes\": [\n \"disabled\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-dropdown-item-button>\"\n },\n \"b-dropdown-item-btn\": {\n \"attributes\": [\n \"disabled\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-dropdown-item-btn>\"\n },\n \"b-dd-item-button\": {\n \"attributes\": [\n \"disabled\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-dd-item-button>\"\n },\n \"b-dd-item-btn\": {\n \"attributes\": [\n \"disabled\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-dd-item-btn>\"\n },\n \"b-dropdown-header\": {\n \"attributes\": [\n \"id\",\n \"tag\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-dropdown-header>\"\n },\n \"b-dd-header\": {\n \"attributes\": [\n \"id\",\n \"tag\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-dd-header>\"\n },\n \"b-dropdown-divider\": {\n \"attributes\": [\n \"tag\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-dropdown-divider>\"\n },\n \"b-dd-divider\": {\n \"attributes\": [\n \"tag\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-dd-divider>\"\n },\n \"b-embed\": {\n \"attributes\": [\n \"type\",\n \"tag\",\n \"aspect\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-embed>\"\n },\n \"b-form\": {\n \"attributes\": [\n \"id\",\n \"inline\",\n \"novalidate\",\n \"validated\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-form>\"\n },\n \"b-form-row\": {\n \"attributes\": [\n \"tag\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-form-row>\"\n },\n \"b-form-text\": {\n \"attributes\": [\n \"id\",\n \"tag\",\n \"text-variant\",\n \"inline\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-form-text>\"\n },\n \"b-form-feedback\": {\n \"attributes\": [\n \"id\",\n \"tag\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-form-feedback>\"\n },\n \"b-form-group\": {\n \"attributes\": [\n \"horizontal\",\n \"label-cols\",\n \"breakpoint\",\n \"label-text-align\",\n \"label\",\n \"label-sr-only\",\n \"description\",\n \"feedback\",\n \"validated\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-form-group>\"\n },\n \"b-form-fieldset\": {\n \"attributes\": [\n \"horizontal\",\n \"label-cols\",\n \"breakpoint\",\n \"label-text-align\",\n \"label\",\n \"label-sr-only\",\n \"description\",\n \"feedback\",\n \"validated\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-form-fieldset>\"\n },\n \"b-form-input\": {\n \"attributes\": [\n \"value\",\n \"type\",\n \"aria-invalid\",\n \"readonly\",\n \"plaintext\",\n \"autocomplete\",\n \"placeholder\",\n \"formatter\",\n \"lazy-formatter\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-form-input>\"\n },\n \"b-input\": {\n \"attributes\": [\n \"value\",\n \"type\",\n \"aria-invalid\",\n \"readonly\",\n \"plaintext\",\n \"autocomplete\",\n \"placeholder\",\n \"formatter\",\n \"lazy-formatter\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-input>\"\n },\n \"b-form-textarea\": {\n \"attributes\": [\n \"value\",\n \"aria-invalid\",\n \"readonly\",\n \"plaintext\",\n \"autocomplete\",\n \"placeholder\",\n \"rows\",\n \"max-rows\",\n \"wrap\",\n \"no-resize\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-form-textarea>\"\n },\n \"b-textarea\": {\n \"attributes\": [\n \"value\",\n \"aria-invalid\",\n \"readonly\",\n \"plaintext\",\n \"autocomplete\",\n \"placeholder\",\n \"rows\",\n \"max-rows\",\n \"wrap\",\n \"no-resize\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-textarea>\"\n },\n \"b-form-file\": {\n \"attributes\": [\n \"accept\",\n \"capture\",\n \"placeholder\",\n \"choose-label\",\n \"multiple\",\n \"directory\",\n \"no-traverse\",\n \"selected-format\",\n \"no-drop\",\n \"drop-label\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-form-file>\"\n },\n \"b-file\": {\n \"attributes\": [\n \"accept\",\n \"capture\",\n \"placeholder\",\n \"choose-label\",\n \"multiple\",\n \"directory\",\n \"no-traverse\",\n \"selected-format\",\n \"no-drop\",\n \"drop-label\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-file>\"\n },\n \"b-form-checkbox\": {\n \"attributes\": [\n \"value\",\n \"unchecked-value\",\n \"indeterminate\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-form-checkbox>\"\n },\n \"b-checkbox\": {\n \"attributes\": [\n \"value\",\n \"unchecked-value\",\n \"indeterminate\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-checkbox>\"\n },\n \"b-check\": {\n \"attributes\": [\n \"value\",\n \"unchecked-value\",\n \"indeterminate\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-check>\"\n },\n \"b-form-checkbox-group\": {\n \"attributes\": [\n \"checked\",\n \"validated\",\n \"aria-invalid\",\n \"stacked\",\n \"buttons\",\n \"button-variant\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-form-checkbox-group>\"\n },\n \"b-checkbox-group\": {\n \"attributes\": [\n \"checked\",\n \"validated\",\n \"aria-invalid\",\n \"stacked\",\n \"buttons\",\n \"button-variant\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-checkbox-group>\"\n },\n \"b-check-group\": {\n \"attributes\": [\n \"checked\",\n \"validated\",\n \"aria-invalid\",\n \"stacked\",\n \"buttons\",\n \"button-variant\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-check-group>\"\n },\n \"b-form-radio\": {\n \"attributes\": [],\n \"subtags\": [],\n \"description\": \"\"\n },\n \"b-radio\": {\n \"attributes\": [],\n \"subtags\": [],\n \"description\": \"\"\n },\n \"b-form-radio-group\": {\n \"attributes\": [\n \"checked\",\n \"validated\",\n \"aria-invalid\",\n \"stacked\",\n \"buttons\",\n \"button-variant\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-form-radio-group>\"\n },\n \"b-radio-group\": {\n \"attributes\": [\n \"checked\",\n \"validated\",\n \"aria-invalid\",\n \"stacked\",\n \"buttons\",\n \"button-variant\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-radio-group>\"\n },\n \"b-form-select\": {\n \"attributes\": [\n \"value\",\n \"multiple\",\n \"select-size\",\n \"aria-invalid\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-form-select>\"\n },\n \"b-select\": {\n \"attributes\": [\n \"value\",\n \"multiple\",\n \"select-size\",\n \"aria-invalid\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-select>\"\n },\n \"b-img\": {\n \"attributes\": [\n \"src\",\n \"alt\",\n \"width\",\n \"height\",\n \"block\",\n \"fluid\",\n \"fluid-grow\",\n \"rounded\",\n \"thumbnail\",\n \"left\",\n \"right\",\n \"center\",\n \"blank\",\n \"blank-color\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-img>\"\n },\n \"b-img-lazy\": {\n \"attributes\": [\n \"src\",\n \"alt\",\n \"width\",\n \"height\",\n \"blank-src\",\n \"blank-color\",\n \"blank-width\",\n \"blank-height\",\n \"fluid\",\n \"fluid-grow\",\n \"block\",\n \"thumbnail\",\n \"rounded\",\n \"left\",\n \"right\",\n \"center\",\n \"offset\",\n \"throttle\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-img-lazy>\"\n },\n \"b-input-group\": {\n \"attributes\": [\n \"id\",\n \"size\",\n \"left\",\n \"right\",\n \"tag\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-input-group>\"\n },\n \"b-input-group-addon\": {\n \"attributes\": [\n \"id\",\n \"tag\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-input-group-addon>\"\n },\n \"b-input-group-button\": {\n \"attributes\": [\n \"id\",\n \"tag\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-input-group-button>\"\n },\n \"b-input-group-btn\": {\n \"attributes\": [\n \"id\",\n \"tag\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-input-group-btn>\"\n },\n \"b-jumbotron\": {\n \"attributes\": [\n \"fluid\",\n \"container-fluid\",\n \"header\",\n \"header-tag\",\n \"header-level\",\n \"lead\",\n \"lead-tag\",\n \"tag\",\n \"bg-variant\",\n \"border-variant\",\n \"text-variant\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-jumbotron>\"\n },\n \"b-container\": {\n \"attributes\": [\n \"tag\",\n \"fluid\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-container>\"\n },\n \"b-row\": {\n \"attributes\": [\n \"tag\",\n \"no-gutters\",\n \"align-v\",\n \"align-h\",\n \"align-content\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-row>\"\n },\n \"b-col\": {\n \"attributes\": [\n \"sm\",\n \"md\",\n \"lg\",\n \"xl\",\n \"offset-sm\",\n \"offset-md\",\n \"offset-lg\",\n \"offset-xl\",\n \"order-sm\",\n \"order-md\",\n \"order-lg\",\n \"order-xl\",\n \"tag\",\n \"col\",\n \"cols\",\n \"offset\",\n \"order\",\n \"align-self\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-col>\"\n },\n \"b-link\": {\n \"attributes\": [\n \"href\",\n \"rel\",\n \"target\",\n \"active\",\n \"active-class\",\n \"append\",\n \"disabled\",\n \"event\",\n \"exact\",\n \"exact-active-class\",\n \"replace\",\n \"router-tag\",\n \"to\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-link>\"\n },\n \"b-list-group\": {\n \"attributes\": [\n \"tag\",\n \"flush\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-list-group>\"\n },\n \"b-list-group-item\": {\n \"attributes\": [\n \"href\",\n \"rel\",\n \"target\",\n \"active\",\n \"active-class\",\n \"append\",\n \"disabled\",\n \"event\",\n \"exact\",\n \"exact-active-class\",\n \"replace\",\n \"router-tag\",\n \"to\",\n \"tag\",\n \"action\",\n \"variant\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-list-group-item>\"\n },\n \"b-media\": {\n \"attributes\": [\n \"tag\",\n \"right-align\",\n \"vertical-align\",\n \"no-body\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-media>\"\n },\n \"b-media-aside\": {\n \"attributes\": [\n \"tag\",\n \"vertical-align\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-media-aside>\"\n },\n \"b-media-body\": {\n \"attributes\": [\n \"tag\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-media-body>\"\n },\n \"b-modal\": {\n \"attributes\": [\n \"title\",\n \"title-tag\",\n \"size\",\n \"centered\",\n \"button-size\",\n \"no-fade\",\n \"no-close-on-backdrop\",\n \"no-close-on-esc\",\n \"no-enforce-focus\",\n \"header-bg-variant\",\n \"header-border-variant\",\n \"header-text-variant\",\n \"body-bg-variant\",\n \"body-text-variant\",\n \"footer-bg-variant\",\n \"footer-border-variant\",\n \"footer-text-variant\",\n \"hide-header\",\n \"hide-footer\",\n \"hide-header-close\",\n \"hide-backdrop\",\n \"ok-only\",\n \"ok-disabled\",\n \"cancel-disabled\",\n \"visible\",\n \"return-focus\",\n \"header-close-label\",\n \"cancel-title\",\n \"ok-title\",\n \"cancel-variant\",\n \"ok-variant\",\n \"lazy\",\n \"busy\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-modal>\"\n },\n \"b-nav\": {\n \"attributes\": [\n \"tag\",\n \"fill\",\n \"justified\",\n \"tabs\",\n \"pills\",\n \"vertical\",\n \"is-nav-bar\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-nav>\"\n },\n \"b-nav-item\": {\n \"attributes\": [\n \"href\",\n \"rel\",\n \"target\",\n \"active\",\n \"active-class\",\n \"append\",\n \"disabled\",\n \"event\",\n \"exact\",\n \"exact-active-class\",\n \"replace\",\n \"router-tag\",\n \"to\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-nav-item>\"\n },\n \"b-nav-text\": {\n \"attributes\": [\n \"tag\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-nav-text>\"\n },\n \"b-nav-form\": {\n \"attributes\": [\n \"id\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-nav-form>\"\n },\n \"b-nav-item-dropdown\": {\n \"attributes\": [\n \"no-caret\",\n \"role\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-nav-item-dropdown>\"\n },\n \"b-nav-item-dd\": {\n \"attributes\": [\n \"no-caret\",\n \"role\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-nav-item-dd>\"\n },\n \"b-nav-dropdown\": {\n \"attributes\": [\n \"no-caret\",\n \"role\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-nav-dropdown>\"\n },\n \"b-nav-dd\": {\n \"attributes\": [\n \"no-caret\",\n \"role\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-nav-dd>\"\n },\n \"b-navbar\": {\n \"attributes\": [\n \"tag\",\n \"type\",\n \"variant\",\n \"toggleable\",\n \"toggle-breakpoint\",\n \"fixed\",\n \"sticky\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-navbar>\"\n },\n \"b-navbar-nav\": {\n \"attributes\": [\n \"tag\",\n \"fill\",\n \"justified\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-navbar-nav>\"\n },\n \"b-navbar-brand\": {\n \"attributes\": [\n \"href\",\n \"rel\",\n \"target\",\n \"active\",\n \"active-class\",\n \"append\",\n \"disabled\",\n \"event\",\n \"exact\",\n \"exact-active-class\",\n \"replace\",\n \"router-tag\",\n \"to\",\n \"tag\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-navbar-brand>\"\n },\n \"b-navbar-toggle\": {\n \"attributes\": [\n \"label\",\n \"position\",\n \"target\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-navbar-toggle>\"\n },\n \"b-nav-toggle\": {\n \"attributes\": [\n \"label\",\n \"position\",\n \"target\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-nav-toggle>\"\n },\n \"b-pagination\": {\n \"attributes\": [\n \"per-page\",\n \"total-rows\",\n \"aria-controls\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-pagination>\"\n },\n \"b-pagination-nav\": {\n \"attributes\": [\n \"number-of-pages\",\n \"base-url\",\n \"use-router\",\n \"link-gen\",\n \"page-gen\",\n \"active-class\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-pagination-nav>\"\n },\n \"b-popover\": {\n \"attributes\": [\n \"title\",\n \"content\",\n \"triggers\",\n \"placement\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-popover>\"\n },\n \"b-progress\": {\n \"attributes\": [\n \"variant\",\n \"striped\",\n \"animated\",\n \"height\",\n \"precision\",\n \"show-progress\",\n \"show-value\",\n \"max\",\n \"value\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-progress>\"\n },\n \"b-progress-bar\": {\n \"attributes\": [\n \"value\",\n \"label\",\n \"max\",\n \"precision\",\n \"variant\",\n \"striped\",\n \"animated\",\n \"show-progress\",\n \"show-value\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-progress-bar>\"\n },\n \"b-table\": {\n \"attributes\": [\n \"id\",\n \"caption\",\n \"items\",\n \"sort-by\",\n \"sort-desc\",\n \"api-url\",\n \"fields\",\n \"striped\",\n \"bordered\",\n \"dark\",\n \"inverse\",\n \"hover\",\n \"small\",\n \"responsive\",\n \"fixed\",\n \"head-variant\",\n \"foot-variant\",\n \"per-page\",\n \"current-page\",\n \"filter\",\n \"sort-compare\",\n \"no-local-sorting\",\n \"no-provider-paging\",\n \"no-provider-sorting\",\n \"no-provider-filtering\",\n \"busy\",\n \"value\",\n \"foot-clone\",\n \"label-sort-asc\",\n \"label-sort-desc\",\n \"show-empty\",\n \"empty-text\",\n \"empty-filtered-text\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-table>\"\n },\n \"b-tabs\": {\n \"attributes\": [\n \"tag\",\n \"card\",\n \"small\",\n \"value\",\n \"pills\",\n \"bottom\",\n \"no-fade\",\n \"lazy\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-tabs>\"\n },\n \"b-tab\": {\n \"attributes\": [\n \"active\",\n \"tag\",\n \"button-id\",\n \"title\",\n \"title-item-class\",\n \"title-link-class\",\n \"head-html\",\n \"disabled\",\n \"href\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-tab>\"\n },\n \"b-tooltip\": {\n \"attributes\": [\n \"title\",\n \"triggers\",\n \"placement\"\n ],\n \"subtags\": [],\n \"description\": \"Bootstrap-Vue component: <b-tooltip>\"\n }\n}\n", "{\n \"b-alert/variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-alert/dismissible\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-alert/dismiss-label\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-alert/show\": {\n \"description\": \"One of boolean or number.\",\n \"type\": \"boolean|number\"\n },\n \"b-badge/href\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-badge/rel\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-badge/target\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-badge/active\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-badge/active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-badge/append\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-badge/disabled\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-badge/event\": {\n \"description\": \"One of string or array.\",\n \"type\": \"string|array\"\n },\n \"b-badge/exact\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-badge/exact-active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-badge/replace\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-badge/router-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-badge/to\": {\n \"description\": \"One of string or object.\",\n \"type\": \"string|object\"\n },\n \"b-badge/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-badge/variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-badge/pill\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-breadcrumb/items\": {\n \"description\": \"Array value.\",\n \"type\": \"array\"\n },\n \"b-breadcrumb-item/href\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-breadcrumb-item/rel\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-breadcrumb-item/target\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-breadcrumb-item/active\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-breadcrumb-item/active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-breadcrumb-item/append\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-breadcrumb-item/disabled\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-breadcrumb-item/event\": {\n \"description\": \"One of string or array.\",\n \"type\": \"string|array\"\n },\n \"b-breadcrumb-item/exact\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-breadcrumb-item/exact-active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-breadcrumb-item/replace\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-breadcrumb-item/router-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-breadcrumb-item/to\": {\n \"description\": \"One of string or object.\",\n \"type\": \"string|object\"\n },\n \"b-breadcrumb-item/text\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-breadcrumb-item/aria-current\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-breadcrumb-link/href\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-breadcrumb-link/rel\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-breadcrumb-link/target\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-breadcrumb-link/active\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-breadcrumb-link/active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-breadcrumb-link/append\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-breadcrumb-link/disabled\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-breadcrumb-link/event\": {\n \"description\": \"One of string or array.\",\n \"type\": \"string|array\"\n },\n \"b-breadcrumb-link/exact\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-breadcrumb-link/exact-active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-breadcrumb-link/replace\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-breadcrumb-link/router-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-breadcrumb-link/to\": {\n \"description\": \"One of string or object.\",\n \"type\": \"string|object\"\n },\n \"b-breadcrumb-link/text\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-breadcrumb-link/aria-current\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-button/href\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-button/rel\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-button/target\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-button/active\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-button/active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-button/append\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-button/disabled\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-button/event\": {\n \"description\": \"One of string or array.\",\n \"type\": \"string|array\"\n },\n \"b-button/exact\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-button/exact-active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-button/replace\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-button/router-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-button/to\": {\n \"description\": \"One of string or object.\",\n \"type\": \"string|object\"\n },\n \"b-button/block\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-button/size\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-button/variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-button/type\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-button/pressed\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-btn/href\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-btn/rel\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-btn/target\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-btn/active\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-btn/active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-btn/append\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-btn/disabled\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-btn/event\": {\n \"description\": \"One of string or array.\",\n \"type\": \"string|array\"\n },\n \"b-btn/exact\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-btn/exact-active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-btn/replace\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-btn/router-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-btn/to\": {\n \"description\": \"One of string or object.\",\n \"type\": \"string|object\"\n },\n \"b-btn/block\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-btn/size\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-btn/variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-btn/type\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-btn/pressed\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-button-close/disabled\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-button-close/aria-label\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-button-close/text-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-btn-close/disabled\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-btn-close/aria-label\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-btn-close/text-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-button-toolbar/justify\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-button-toolbar/key-nav\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-btn-toolbar/justify\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-btn-toolbar/key-nav\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-button-group/vertical\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-button-group/size\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-button-group/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-button-group/aria-role\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-btn-group/vertical\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-btn-group/size\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-btn-group/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-btn-group/aria-role\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/body-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/body-bg-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/body-border-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/body-text-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/body-class\": {\n \"description\": \"One of string, object, or array.\",\n \"type\": \"string|object|array\"\n },\n \"b-card/title\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/title-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/sub-title\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/sub-title-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/overlay\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-card/header-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/header-bg-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/header-border-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/header-text-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/header\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/header-class\": {\n \"description\": \"One of string, object, or array.\",\n \"type\": \"string|object|array\"\n },\n \"b-card/footer-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/footer-bg-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/footer-border-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/footer-text-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/footer\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/footer-class\": {\n \"description\": \"One of string, object, or array.\",\n \"type\": \"string|object|array\"\n },\n \"b-card/img-src\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/img-alt\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/img-top\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-card/img-bottom\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-card/img-fluid\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-card/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/bg-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/border-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/text-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/align\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card/no-body\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-card-header/header-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card-header/header-bg-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card-header/header-border-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card-header/header-text-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card-header/header\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card-header/header-class\": {\n \"description\": \"One of string, object, or array.\",\n \"type\": \"string|object|array\"\n },\n \"b-card-body/body-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card-body/body-bg-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card-body/body-border-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card-body/body-text-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card-body/body-class\": {\n \"description\": \"One of string, object, or array.\",\n \"type\": \"string|object|array\"\n },\n \"b-card-body/title\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card-body/title-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card-body/sub-title\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card-body/sub-title-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card-body/overlay\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-card-footer/footer-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card-footer/footer-bg-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card-footer/footer-border-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card-footer/footer-text-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card-footer/footer\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card-footer/footer-class\": {\n \"description\": \"One of string, object, or array.\",\n \"type\": \"string|object|array\"\n },\n \"b-card-img/src\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card-img/alt\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card-img/top\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-card-img/bottom\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-card-img/fluid\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-card-group/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-card-group/deck\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-card-group/columns\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-carousel/label-prev\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-carousel/label-next\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-carousel/label-goto-slide\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-carousel/label-indicators\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-carousel/interval\": {\n \"description\": \"Number value.\",\n \"type\": \"number\"\n },\n \"b-carousel/indicators\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-carousel/controls\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-carousel/img-width\": {\n \"description\": \"One of number or string.\",\n \"type\": \"number|string\"\n },\n \"b-carousel/img-height\": {\n \"description\": \"One of number or string.\",\n \"type\": \"number|string\"\n },\n \"b-carousel/background\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-carousel/value\": {\n \"description\": \"Number value.\",\n \"type\": \"number\"\n },\n \"b-carousel-slide/img-src\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-carousel-slide/src\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-carousel-slide/img-alt\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-carousel-slide/img-width\": {\n \"description\": \"One of number or string.\",\n \"type\": \"number|string\"\n },\n \"b-carousel-slide/img-height\": {\n \"description\": \"One of number or string.\",\n \"type\": \"number|string\"\n },\n \"b-carousel-slide/img-blank\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-carousel-slide/img-blank-color\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-carousel-slide/content-visible-up\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-carousel-slide/content-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-carousel-slide/caption\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-carousel-slide/caption-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-carousel-slide/text\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-carousel-slide/text-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-carousel-slide/background\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-collapse/id\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-collapse/is-nav\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-collapse/accordion\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-collapse/visible\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-collapse/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dropdown/split\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-dropdown/toggle-text\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dropdown/size\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dropdown/variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dropdown/no-caret\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-dropdown/role\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dd/split\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-dd/toggle-text\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dd/size\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dd/variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dd/no-caret\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-dd/role\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dropdown-item/href\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dropdown-item/rel\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dropdown-item/target\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dropdown-item/active\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-dropdown-item/active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dropdown-item/append\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-dropdown-item/disabled\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-dropdown-item/event\": {\n \"description\": \"One of string or array.\",\n \"type\": \"string|array\"\n },\n \"b-dropdown-item/exact\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-dropdown-item/exact-active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dropdown-item/replace\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-dropdown-item/router-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dropdown-item/to\": {\n \"description\": \"One of string or object.\",\n \"type\": \"string|object\"\n },\n \"b-dd-item/href\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dd-item/rel\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dd-item/target\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dd-item/active\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-dd-item/active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dd-item/append\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-dd-item/disabled\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-dd-item/event\": {\n \"description\": \"One of string or array.\",\n \"type\": \"string|array\"\n },\n \"b-dd-item/exact\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-dd-item/exact-active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dd-item/replace\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-dd-item/router-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dd-item/to\": {\n \"description\": \"One of string or object.\",\n \"type\": \"string|object\"\n },\n \"b-dropdown-item-button/disabled\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-dropdown-item-btn/disabled\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-dd-item-button/disabled\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-dd-item-btn/disabled\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-dropdown-header/id\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dropdown-header/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dd-header/id\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dd-header/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dropdown-divider/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-dd-divider/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-embed/type\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-embed/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-embed/aspect\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form/id\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form/inline\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form/novalidate\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form/validated\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-row/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-text/id\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-text/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-text/text-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-text/inline\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-feedback/id\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-feedback/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-group/horizontal\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-group/label-cols\": {\n \"description\": \"Number value.\",\n \"type\": \"number\"\n },\n \"b-form-group/breakpoint\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-group/label-text-align\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-group/label\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-group/label-sr-only\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-group/description\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-group/feedback\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-group/validated\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-fieldset/horizontal\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-fieldset/label-cols\": {\n \"description\": \"Number value.\",\n \"type\": \"number\"\n },\n \"b-form-fieldset/breakpoint\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-fieldset/label-text-align\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-fieldset/label\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-fieldset/label-sr-only\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-fieldset/description\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-fieldset/feedback\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-fieldset/validated\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-input/type\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-input/aria-invalid\": {\n \"description\": \"One of boolean or string.\",\n \"type\": \"boolean|string\"\n },\n \"b-form-input/readonly\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-input/plaintext\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-input/autocomplete\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-input/placeholder\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-input/formatter\": {\n \"description\": \"Function value.\",\n \"type\": \"function\"\n },\n \"b-form-input/lazy-formatter\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-input/type\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-input/aria-invalid\": {\n \"description\": \"One of boolean or string.\",\n \"type\": \"boolean|string\"\n },\n \"b-input/readonly\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-input/plaintext\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-input/autocomplete\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-input/placeholder\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-input/formatter\": {\n \"description\": \"Function value.\",\n \"type\": \"function\"\n },\n \"b-input/lazy-formatter\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-textarea/value\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-textarea/aria-invalid\": {\n \"description\": \"One of boolean or string.\",\n \"type\": \"boolean|string\"\n },\n \"b-form-textarea/readonly\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-textarea/plaintext\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-textarea/autocomplete\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-textarea/placeholder\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-textarea/rows\": {\n \"description\": \"One of number or string.\",\n \"type\": \"number|string\"\n },\n \"b-form-textarea/max-rows\": {\n \"description\": \"One of number or string.\",\n \"type\": \"number|string\"\n },\n \"b-form-textarea/wrap\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-textarea/no-resize\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-textarea/value\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-textarea/aria-invalid\": {\n \"description\": \"One of boolean or string.\",\n \"type\": \"boolean|string\"\n },\n \"b-textarea/readonly\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-textarea/plaintext\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-textarea/autocomplete\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-textarea/placeholder\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-textarea/rows\": {\n \"description\": \"One of number or string.\",\n \"type\": \"number|string\"\n },\n \"b-textarea/max-rows\": {\n \"description\": \"One of number or string.\",\n \"type\": \"number|string\"\n },\n \"b-textarea/wrap\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-textarea/no-resize\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-file/accept\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-file/capture\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-file/placeholder\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-file/choose-label\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-file/multiple\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-file/directory\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-file/no-traverse\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-file/selected-format\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-file/no-drop\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-file/drop-label\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-file/accept\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-file/capture\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-file/placeholder\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-file/choose-label\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-file/multiple\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-file/directory\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-file/no-traverse\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-file/selected-format\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-file/no-drop\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-file/drop-label\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-checkbox/indeterminate\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-checkbox/indeterminate\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-check/indeterminate\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-checkbox-group/checked\": {\n \"description\": \"One of string, number, object, or array.\",\n \"type\": \"string|number|object|array\"\n },\n \"b-form-checkbox-group/validated\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-checkbox-group/aria-invalid\": {\n \"description\": \"One of boolean or string.\",\n \"type\": \"boolean|string\"\n },\n \"b-form-checkbox-group/stacked\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-checkbox-group/buttons\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-checkbox-group/button-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-checkbox-group/checked\": {\n \"description\": \"One of string, number, object, or array.\",\n \"type\": \"string|number|object|array\"\n },\n \"b-checkbox-group/validated\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-checkbox-group/aria-invalid\": {\n \"description\": \"One of boolean or string.\",\n \"type\": \"boolean|string\"\n },\n \"b-checkbox-group/stacked\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-checkbox-group/buttons\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-checkbox-group/button-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-check-group/checked\": {\n \"description\": \"One of string, number, object, or array.\",\n \"type\": \"string|number|object|array\"\n },\n \"b-check-group/validated\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-check-group/aria-invalid\": {\n \"description\": \"One of boolean or string.\",\n \"type\": \"boolean|string\"\n },\n \"b-check-group/stacked\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-check-group/buttons\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-check-group/button-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-radio-group/checked\": {\n \"description\": \"One of string, object, number, or boolean.\",\n \"type\": \"string|object|number|boolean\"\n },\n \"b-form-radio-group/validated\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-radio-group/aria-invalid\": {\n \"description\": \"One of boolean or string.\",\n \"type\": \"boolean|string\"\n },\n \"b-form-radio-group/stacked\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-radio-group/buttons\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-radio-group/button-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-radio-group/checked\": {\n \"description\": \"One of string, object, number, or boolean.\",\n \"type\": \"string|object|number|boolean\"\n },\n \"b-radio-group/validated\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-radio-group/aria-invalid\": {\n \"description\": \"One of boolean or string.\",\n \"type\": \"boolean|string\"\n },\n \"b-radio-group/stacked\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-radio-group/buttons\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-radio-group/button-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-form-select/multiple\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-form-select/select-size\": {\n \"description\": \"Number value.\",\n \"type\": \"number\"\n },\n \"b-form-select/aria-invalid\": {\n \"description\": \"One of boolean or string.\",\n \"type\": \"boolean|string\"\n },\n \"b-select/multiple\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-select/select-size\": {\n \"description\": \"Number value.\",\n \"type\": \"number\"\n },\n \"b-select/aria-invalid\": {\n \"description\": \"One of boolean or string.\",\n \"type\": \"boolean|string\"\n },\n \"b-img/src\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-img/alt\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-img/width\": {\n \"description\": \"One of number or string.\",\n \"type\": \"number|string\"\n },\n \"b-img/height\": {\n \"description\": \"One of number or string.\",\n \"type\": \"number|string\"\n },\n \"b-img/block\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-img/fluid\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-img/fluid-grow\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-img/rounded\": {\n \"description\": \"One of boolean or string.\",\n \"type\": \"boolean|string\"\n },\n \"b-img/thumbnail\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-img/left\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-img/right\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-img/center\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-img/blank\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-img/blank-color\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-img-lazy/src\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-img-lazy/alt\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-img-lazy/width\": {\n \"description\": \"One of number or string.\",\n \"type\": \"number|string\"\n },\n \"b-img-lazy/height\": {\n \"description\": \"One of number or string.\",\n \"type\": \"number|string\"\n },\n \"b-img-lazy/blank-src\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-img-lazy/blank-color\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-img-lazy/blank-width\": {\n \"description\": \"One of number or string.\",\n \"type\": \"number|string\"\n },\n \"b-img-lazy/blank-height\": {\n \"description\": \"One of number or string.\",\n \"type\": \"number|string\"\n },\n \"b-img-lazy/fluid\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-img-lazy/fluid-grow\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-img-lazy/block\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-img-lazy/thumbnail\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-img-lazy/rounded\": {\n \"description\": \"One of boolean or string.\",\n \"type\": \"boolean|string\"\n },\n \"b-img-lazy/left\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-img-lazy/right\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-img-lazy/center\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-img-lazy/offset\": {\n \"description\": \"One of number or string.\",\n \"type\": \"number|string\"\n },\n \"b-img-lazy/throttle\": {\n \"description\": \"One of number or string.\",\n \"type\": \"number|string\"\n },\n \"b-input-group/id\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-input-group/size\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-input-group/left\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-input-group/right\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-input-group/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-input-group-addon/id\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-input-group-addon/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-input-group-button/id\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-input-group-button/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-input-group-btn/id\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-input-group-btn/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-jumbotron/fluid\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-jumbotron/container-fluid\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-jumbotron/header\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-jumbotron/header-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-jumbotron/header-level\": {\n \"description\": \"One of number or string.\",\n \"type\": \"number|string\"\n },\n \"b-jumbotron/lead\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-jumbotron/lead-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-jumbotron/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-jumbotron/bg-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-jumbotron/border-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-jumbotron/text-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-container/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-container/fluid\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-row/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-row/no-gutters\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-row/align-v\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-row/align-h\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-row/align-content\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-col/sm\": {\n \"description\": \"One of boolean, string, or number.\",\n \"type\": \"boolean|string|number\"\n },\n \"b-col/md\": {\n \"description\": \"One of boolean, string, or number.\",\n \"type\": \"boolean|string|number\"\n },\n \"b-col/lg\": {\n \"description\": \"One of boolean, string, or number.\",\n \"type\": \"boolean|string|number\"\n },\n \"b-col/xl\": {\n \"description\": \"One of boolean, string, or number.\",\n \"type\": \"boolean|string|number\"\n },\n \"b-col/offset-sm\": {\n \"description\": \"One of string or number.\",\n \"type\": \"string|number\"\n },\n \"b-col/offset-md\": {\n \"description\": \"One of string or number.\",\n \"type\": \"string|number\"\n },\n \"b-col/offset-lg\": {\n \"description\": \"One of string or number.\",\n \"type\": \"string|number\"\n },\n \"b-col/offset-xl\": {\n \"description\": \"One of string or number.\",\n \"type\": \"string|number\"\n },\n \"b-col/order-sm\": {\n \"description\": \"One of string or number.\",\n \"type\": \"string|number\"\n },\n \"b-col/order-md\": {\n \"description\": \"One of string or number.\",\n \"type\": \"string|number\"\n },\n \"b-col/order-lg\": {\n \"description\": \"One of string or number.\",\n \"type\": \"string|number\"\n },\n \"b-col/order-xl\": {\n \"description\": \"One of string or number.\",\n \"type\": \"string|number\"\n },\n \"b-col/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-col/col\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-col/cols\": {\n \"description\": \"One of string or number.\",\n \"type\": \"string|number\"\n },\n \"b-col/offset\": {\n \"description\": \"One of string or number.\",\n \"type\": \"string|number\"\n },\n \"b-col/order\": {\n \"description\": \"One of string or number.\",\n \"type\": \"string|number\"\n },\n \"b-col/align-self\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-link/href\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-link/rel\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-link/target\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-link/active\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-link/active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-link/append\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-link/disabled\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-link/event\": {\n \"description\": \"One of string or array.\",\n \"type\": \"string|array\"\n },\n \"b-link/exact\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-link/exact-active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-link/replace\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-link/router-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-link/to\": {\n \"description\": \"One of string or object.\",\n \"type\": \"string|object\"\n },\n \"b-list-group/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-list-group/flush\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-list-group-item/href\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-list-group-item/rel\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-list-group-item/target\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-list-group-item/active\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-list-group-item/active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-list-group-item/append\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-list-group-item/disabled\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-list-group-item/event\": {\n \"description\": \"One of string or array.\",\n \"type\": \"string|array\"\n },\n \"b-list-group-item/exact\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-list-group-item/exact-active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-list-group-item/replace\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-list-group-item/router-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-list-group-item/to\": {\n \"description\": \"One of string or object.\",\n \"type\": \"string|object\"\n },\n \"b-list-group-item/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-list-group-item/action\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-list-group-item/variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-media/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-media/right-align\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-media/vertical-align\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-media/no-body\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-media-aside/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-media-aside/vertical-align\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-media-body/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-modal/title\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-modal/title-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-modal/size\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-modal/centered\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-modal/button-size\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-modal/no-fade\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-modal/no-close-on-backdrop\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-modal/no-close-on-esc\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-modal/no-enforce-focus\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-modal/header-bg-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-modal/header-border-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-modal/header-text-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-modal/body-bg-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-modal/body-text-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-modal/footer-bg-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-modal/footer-border-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-modal/footer-text-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-modal/hide-header\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-modal/hide-footer\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-modal/hide-header-close\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-modal/hide-backdrop\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-modal/ok-only\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-modal/ok-disabled\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-modal/cancel-disabled\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-modal/visible\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-modal/header-close-label\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-modal/cancel-title\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-modal/ok-title\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-modal/cancel-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-modal/ok-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-modal/lazy\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-modal/busy\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-nav/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-nav/fill\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-nav/justified\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-nav/tabs\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-nav/pills\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-nav/vertical\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-nav/is-nav-bar\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-nav-item/href\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-nav-item/rel\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-nav-item/target\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-nav-item/active\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-nav-item/active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-nav-item/append\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-nav-item/disabled\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-nav-item/event\": {\n \"description\": \"One of string or array.\",\n \"type\": \"string|array\"\n },\n \"b-nav-item/exact\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-nav-item/exact-active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-nav-item/replace\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-nav-item/router-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-nav-item/to\": {\n \"description\": \"One of string or object.\",\n \"type\": \"string|object\"\n },\n \"b-nav-text/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-nav-form/id\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-nav-item-dropdown/no-caret\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-nav-item-dropdown/role\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-nav-item-dd/no-caret\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-nav-item-dd/role\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-nav-dropdown/no-caret\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-nav-dropdown/role\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-nav-dd/no-caret\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-nav-dd/role\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-navbar/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-navbar/type\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-navbar/variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-navbar/toggleable\": {\n \"description\": \"One of boolean or string.\",\n \"type\": \"boolean|string\"\n },\n \"b-navbar/toggle-breakpoint\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-navbar/fixed\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-navbar/sticky\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-navbar-nav/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-navbar-nav/fill\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-navbar-nav/justified\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-navbar-brand/href\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-navbar-brand/rel\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-navbar-brand/target\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-navbar-brand/active\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-navbar-brand/active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-navbar-brand/append\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-navbar-brand/disabled\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-navbar-brand/event\": {\n \"description\": \"One of string or array.\",\n \"type\": \"string|array\"\n },\n \"b-navbar-brand/exact\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-navbar-brand/exact-active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-navbar-brand/replace\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-navbar-brand/router-tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-navbar-brand/to\": {\n \"description\": \"One of string or object.\",\n \"type\": \"string|object\"\n },\n \"b-navbar-brand/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-navbar-toggle/label\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-navbar-toggle/position\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-navbar-toggle/target\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-nav-toggle/label\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-nav-toggle/position\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-nav-toggle/target\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-pagination/per-page\": {\n \"description\": \"Number value.\",\n \"type\": \"number\"\n },\n \"b-pagination/total-rows\": {\n \"description\": \"Number value.\",\n \"type\": \"number\"\n },\n \"b-pagination/aria-controls\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-pagination-nav/number-of-pages\": {\n \"description\": \"Number value.\",\n \"type\": \"number\"\n },\n \"b-pagination-nav/base-url\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-pagination-nav/use-router\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-pagination-nav/link-gen\": {\n \"description\": \"Function value.\",\n \"type\": \"function\"\n },\n \"b-pagination-nav/page-gen\": {\n \"description\": \"Function value.\",\n \"type\": \"function\"\n },\n \"b-pagination-nav/active-class\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-popover/title\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-popover/content\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-popover/triggers\": {\n \"description\": \"One of string or array.\",\n \"type\": \"string|array\"\n },\n \"b-popover/placement\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-progress/variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-progress/striped\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-progress/animated\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-progress/height\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-progress/precision\": {\n \"description\": \"Number value.\",\n \"type\": \"number\"\n },\n \"b-progress/show-progress\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-progress/show-value\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-progress/max\": {\n \"description\": \"Number value.\",\n \"type\": \"number\"\n },\n \"b-progress/value\": {\n \"description\": \"Number value.\",\n \"type\": \"number\"\n },\n \"b-progress-bar/value\": {\n \"description\": \"Number value.\",\n \"type\": \"number\"\n },\n \"b-progress-bar/label\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-progress-bar/max\": {\n \"description\": \"Number value.\",\n \"type\": \"number\"\n },\n \"b-progress-bar/precision\": {\n \"description\": \"Number value.\",\n \"type\": \"number\"\n },\n \"b-progress-bar/variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-progress-bar/striped\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-progress-bar/animated\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-progress-bar/show-progress\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-progress-bar/show-value\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-table/id\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-table/caption\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-table/items\": {\n \"description\": \"One of array or function.\",\n \"type\": \"array|function\"\n },\n \"b-table/sort-by\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-table/sort-desc\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-table/api-url\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-table/fields\": {\n \"description\": \"One of object or array.\",\n \"type\": \"object|array\"\n },\n \"b-table/striped\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-table/bordered\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-table/dark\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-table/inverse\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-table/hover\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-table/small\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-table/responsive\": {\n \"description\": \"One of boolean or string.\",\n \"type\": \"boolean|string\"\n },\n \"b-table/fixed\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-table/head-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-table/foot-variant\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-table/per-page\": {\n \"description\": \"Number value.\",\n \"type\": \"number\"\n },\n \"b-table/current-page\": {\n \"description\": \"Number value.\",\n \"type\": \"number\"\n },\n \"b-table/filter\": {\n \"description\": \"One of string, RegExp, or function.\",\n \"type\": \"string|RegExp|function\"\n },\n \"b-table/sort-compare\": {\n \"description\": \"Function value.\",\n \"type\": \"function\"\n },\n \"b-table/no-local-sorting\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-table/no-provider-paging\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-table/no-provider-sorting\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-table/no-provider-filtering\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-table/busy\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-table/value\": {\n \"description\": \"Array value.\",\n \"type\": \"array\"\n },\n \"b-table/foot-clone\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-table/label-sort-asc\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-table/label-sort-desc\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-table/show-empty\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-table/empty-text\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-table/empty-filtered-text\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-tabs/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-tabs/card\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-tabs/small\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-tabs/value\": {\n \"description\": \"Number value.\",\n \"type\": \"number\"\n },\n \"b-tabs/pills\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-tabs/bottom\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-tabs/no-fade\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-tabs/lazy\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-tab/active\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-tab/tag\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-tab/button-id\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-tab/title\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-tab/title-item-class\": {\n \"description\": \"One of string, array, or object.\",\n \"type\": \"string|array|object\"\n },\n \"b-tab/title-link-class\": {\n \"description\": \"One of string, array, or object.\",\n \"type\": \"string|array|object\"\n },\n \"b-tab/head-html\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-tab/disabled\": {\n \"description\": \"Boolean value.\",\n \"type\": \"boolean\"\n },\n \"b-tab/href\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-tooltip/title\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n },\n \"b-tooltip/triggers\": {\n \"description\": \"One of string or array.\",\n \"type\": \"string|array\"\n },\n \"b-tooltip/placement\": {\n \"description\": \"String value.\",\n \"type\": \"string\"\n }\n}\n", "{\n \"g-link\": {\n \"attributes\": [\n \"to\",\n \"replace\",\n \"append\",\n \"tag\",\n \"active-class\",\n \"exact\",\n \"event\",\n \"exact-active-class\"\n ],\n \"defaults\": [\":to\"],\n \"description\": \"Component for routing. Same as <router-link> now.\"\n },\n \"g-image\": {\n \"attributes\": [\n \"src\",\n \"width\",\n \"height\",\n \"alt\",\n \"fit\",\n \"background\",\n \"immediate\",\n \"blur\",\n \"quality\",\n \"cover\",\n \"contain\",\n \"fill\",\n \"inside\",\n \"outside\"\n ],\n \"defaults\": [\":src\"],\n \"description\": \"Component that outputs an optimized progressive image. Will default to a standard img tag if javascript is not enabled.\"\n },\n \"Pager\": {\n \"attributes\": [\n \"info\",\n \"showLinks\",\n \"showNavigation\",\n \"linkClass\",\n \"firstLabel\",\n \"prevLabel\",\n \"nextLabel\",\n \"lastLabel\",\n \"ariaLabel\",\n \"ariaLinkLabel\",\n \"ariaFirstLabel\",\n \"ariaCurrentLabel\",\n \"ariaPrevLabel\",\n \"ariaNextLabel\",\n \"ariaLastLabel\"\n ],\n \"defaults\": [\":info\"],\n \"description\": \"Component which allows for easy pagination. The passed info object must include the fields \\\"totalPages\\\" & \\\"currentPage\\\".\"\n }\n}\n", "{\n \"to\": {\n \"type\": \"string | object\",\n \"description\": \"Denotes the target route of the link. When clicked, the value of the to prop will be passed to router.push() internally, so the value can be either a string or a location descriptor object.\"\n },\n \"active-class\": {\n \"type\": \"string\",\n \"description\": \"Configure the active CSS class applied when the link is active.\"\n },\n \"exact\": {\n \"type\": \"string | array<string>\",\n \"description\": \"The default active class matching behavior is inclusive match. For example, <router-link to=\\\"/a\\\"> will get this class applied as long as the current path starts with /a/ or is /a.\\nOne consequence of this is that <router-link to=\\\"/\\\"> will be active for every route! To force the link into \\\"exact match mode\\\", use the exact prop: <router-link to=\\\"/\\\" exact>\"\n },\n \"exact-active-class\": {\n \"type\": \"string\",\n \"description\": \"Configure the active CSS class applied when the link is active with exact match. Note the default value can also be configured globally via the linkExactActiveClass router constructor option.\"\n },\n \"src\": {\n \"type\": \"string\",\n \"description\": \"Relative path to image file.\"\n },\n \"width\": {\n \"type\": \"number\",\n \"description\": \"Resize image to specified width in pixels.\"\n },\n \"height\": {\n \"type\": \"number\",\n \"description\": \"Crop & resize image to specified height in pixels.\"\n },\n \"alt\": {\n \"type\": \"string\",\n \"description\": \"Alternate text for the image.\"\n },\n \"fit\": {\n \"type\": \"string\",\n \"description\": \"How to crop images. See properties below. https://gridsome.org/docs/images#fit-options\"\n },\n \"background\": {\n \"type\": \"string\",\n \"description\": \"Background color for 'contain' .\"\n },\n \"immediate\": {\n \"type\": \"boolean\",\n \"description\": \"Set to `true` to disable lazy-loading.\"\n },\n \"blur\": {\n \"type\": \"number\",\n \"description\": \"How much in px to blur the image placeholder.\"\n },\n \"quality\": {\n \"type\": \"number\",\n \"description\": \"The quality of the image. (0 - 100).\"\n },\n \"info\": {\n \"type\": \"number\",\n \"description\": \"Page info from GraphQL result with totalPages.\"\n },\n \"showLinks\": {\n \"type\": \"boolean\",\n \"description\": \"Show navigation links.\"\n },\n \"showNavigation\": {\n \"type\": \"boolean\",\n \"description\": \"Show previous and next links.\"\n },\n \"linkClass\": {\n \"type\": \"string\",\n \"description\": \"Add custom classes to the links.\"\n },\n \"firstLabel\": {\n \"type\": \"string\",\n \"description\": \"Content for the first page navigation link. Default: \\\"<<\\\"\"\n },\n \"prevLabel\": {\n \"type\": \"string\",\n \"description\": \"Content for the previous page navigation link. Default: \\\"<\\\"\"\n },\n \"nextLabel\": {\n \"type\": \"string\",\n \"description\": \"Content for the next page navigation link. Default: \\\">\\\"\"\n },\n \"lastLabel\": {\n \"type\": \"string\",\n \"description\": \"Content for the last page navigation link. Default: \\\">>\\\"\"\n },\n \"ariaLabel\": {\n \"type\": \"string\",\n \"description\": \"Accessibility definition for the whole component. Default: \\\"Pagination Navigation\\\"\"\n },\n \"ariaLinkLabel\": {\n \"type\": \"string\",\n \"description\": \"Accessibility definition for the page navigation links. Default: \\\"Go to page %n\\\"\"\n },\n \"ariaFirstLabel\": {\n \"type\": \"string\",\n \"description\": \"Accessibility definition for the first page navigation link. Default: \\\"Go to first page\\\"\"\n },\n \"ariaCurrentLabel\": {\n \"type\": \"string\",\n \"description\": \"Accessibility definition for the current page navigation link. Default: \\\"Current page. Page %n\\\"\"\n },\n \"ariaPrevLabel\": {\n \"type\": \"string\",\n \"description\": \"Accessibility definition for the previous page navigation link. Default: \\\"Go to previous page. Page %n\\\"\"\n },\n \"ariaNextLabel\": {\n \"type\": \"string\",\n \"description\": \"Accessibility definition for the next page navigation link. Default: \\\"Go to next page. Page %n\\\"\"\n },\n \"ariaLastLabel\": {\n \"type\": \"string\",\n \"description\": \"Accessibility definition for the last page navigation link. Default: \\\"Go to last page. Page %n\\\"\"\n }\n}\n", "import { IHTMLTagProvider } from './common';\nimport { getHTML5TagProvider } from './htmlTags';\nimport { getVueTagProvider } from './vueTags';\nimport { getRouterTagProvider } from './routerTags';\nimport {\n elementTagProvider,\n onsenTagProvider,\n bootstrapTagProvider,\n gridsomeTagProvider,\n getDependencyTagProvider,\n getWorkspaceTagProvider\n} from './externalTagProviders';\n\nimport fs from 'fs';\nimport { join } from 'path';\nimport { getNuxtTagProvider } from './nuxtTags';\nimport { normalizeFileNameResolve } from '../../../utils/paths';\n\nexport let allTagProviders: IHTMLTagProvider[] = [\n getHTML5TagProvider(),\n getVueTagProvider(),\n getRouterTagProvider(),\n elementTagProvider,\n onsenTagProvider,\n bootstrapTagProvider,\n gridsomeTagProvider\n];\n\nexport interface CompletionConfiguration {\n [provider: string]: boolean;\n}\n\nexport function getTagProviderSettings(packagePath: string | undefined) {\n const settings: CompletionConfiguration = {\n '__vetur-workspace': true,\n html5: true,\n vue: true,\n router: false,\n element: false,\n onsen: false,\n bootstrap: false,\n buefy: false,\n vuetify: false,\n quasar: false, // Quasar v1+\n 'quasar-framework': false, // Quasar pre v1\n nuxt: false,\n gridsome: false\n };\n try {\n if (!packagePath) {\n return settings;\n }\n\n const packageRoot = normalizeFileNameResolve(packagePath, '../');\n\n const rootPkgJson = JSON.parse(fs.readFileSync(packagePath, 'utf-8'));\n const dependencies = rootPkgJson.dependencies || {};\n const devDependencies = rootPkgJson.devDependencies || {};\n\n if (dependencies['vue-router'] || devDependencies['vue-router']) {\n settings['vue-router'] = true;\n }\n if (dependencies['element-ui'] || devDependencies['element-ui']) {\n settings['element'] = true;\n }\n if (dependencies['vue-onsenui'] || devDependencies['vue-onsenui']) {\n settings['onsen'] = true;\n }\n if (dependencies['bootstrap-vue'] || devDependencies['bootstrap-vue']) {\n settings['bootstrap'] = true;\n }\n if (dependencies['buefy'] || devDependencies['buefy']) {\n settings['buefy'] = true;\n }\n if (dependencies['nuxt-buefy'] || devDependencies['nuxt-buefy']) {\n dependencies['buefy'] = true;\n }\n if (dependencies['vuetify'] || devDependencies['vuetify']) {\n settings['vuetify'] = true;\n }\n if (dependencies['@nuxtjs/vuetify'] || devDependencies['@nuxtjs/vuetify']) {\n dependencies['vuetify'] = true;\n }\n // Quasar v1+:\n if (dependencies['quasar'] || devDependencies['quasar']) {\n settings['quasar'] = true;\n }\n // Quasar pre v1 on non quasar-cli:\n if (dependencies['quasar-framework']) {\n settings['quasar-framework'] = true;\n }\n // Quasar pre v1 on quasar-cli:\n if (devDependencies['quasar-cli']) {\n // pushing dependency so we can check it\n // and enable Quasar later below in the for()\n dependencies['quasar-framework'] = '^0.0.17';\n }\n if (dependencies['nuxt'] || dependencies['nuxt-edge'] || devDependencies['nuxt'] || devDependencies['nuxt-edge']) {\n const nuxtTagProvider = getNuxtTagProvider(packageRoot);\n if (nuxtTagProvider) {\n settings['nuxt'] = true;\n allTagProviders.push(nuxtTagProvider);\n }\n }\n if (dependencies['gridsome']) {\n settings['gridsome'] = true;\n }\n\n const workspaceTagProvider = getWorkspaceTagProvider(packageRoot, rootPkgJson);\n if (workspaceTagProvider) {\n allTagProviders.push(workspaceTagProvider);\n }\n\n for (const dep of [...Object.keys(dependencies), ...Object.keys(devDependencies)]) {\n let runtimePkgJsonPath;\n try {\n runtimePkgJsonPath = require.resolve(join(dep, 'package.json'), { paths: [packageRoot] });\n } catch {\n continue;\n }\n\n const runtimePkgJson = JSON.parse(fs.readFileSync(runtimePkgJsonPath, 'utf-8'));\n if (!runtimePkgJson) {\n continue;\n }\n\n const depTagProvider = getDependencyTagProvider(packageRoot, dep, runtimePkgJson);\n if (!depTagProvider) {\n continue;\n }\n\n allTagProviders.push(depTagProvider);\n settings[dep] = true;\n }\n } catch (e) {\n console.error((e as Error).stack);\n }\n return settings;\n}\n\nexport function getEnabledTagProviders(tagProviderSetting: CompletionConfiguration) {\n return allTagProviders.filter(p => tagProviderSetting[p.getId()] !== false);\n}\n", "import { join } from 'path';\nimport { getExternalTagProvider } from './externalTagProviders';\n\nconst NUXT_JSON_SOURCES = ['@nuxt/vue-app-edge', '@nuxt/vue-app', 'nuxt-helper-json'];\n\nexport function getNuxtTagProvider(packageRoot: string) {\n let nuxtTags, nuxtAttributes;\n for (const source of NUXT_JSON_SOURCES) {\n if (tryResolve(join(source, 'package.json'), packageRoot)) {\n nuxtTags = tryRequire(join(source, 'vetur/nuxt-tags.json'), packageRoot);\n nuxtAttributes = tryRequire(join(source, 'vetur/nuxt-attributes.json'), packageRoot);\n if (nuxtTags) {\n break;\n }\n }\n }\n\n const componentsTags = tryRequire(join(packageRoot, '.nuxt/vetur/tags.json'), packageRoot);\n const componentsAttributes = tryRequire(join(packageRoot, '.nuxt/vetur/attributes.json'), packageRoot);\n\n return getExternalTagProvider(\n 'nuxt',\n { ...nuxtTags, ...componentsTags },\n { ...nuxtAttributes, ...componentsAttributes }\n );\n}\n\nfunction tryRequire(modulePath: string, findPath: string) {\n try {\n const resolved = tryResolve(modulePath, findPath);\n return resolved ? require(resolved) : undefined;\n } catch (_err) {}\n}\n\nfunction tryResolve(modulePath: string, findPath: string) {\n try {\n return require.resolve(modulePath, {\n paths: [findPath, __dirname]\n });\n } catch (_err) {}\n}\n", "import {\n HTMLTagSpecification,\n IHTMLTagProvider,\n ITagSet,\n collectTagsDefault,\n collectAttributesDefault,\n collectValuesDefault,\n genAttribute,\n TagProviderPriority,\n Attribute\n} from './common';\nimport { ChildComponent } from '../../../services/vueInfoService';\nimport { MarkupContent } from 'vscode-languageserver-types';\n\nexport function getComponentInfoTagProvider(childComponents: ChildComponent[]): IHTMLTagProvider {\n const tagSet: ITagSet = {};\n\n for (const cc of childComponents) {\n const attributes: Attribute[] = [];\n if (cc.info) {\n cc.info.componentInfo.props?.forEach(p => {\n attributes.push(genAttribute(`:${p.name}`, undefined, { kind: 'markdown', value: p.documentation || '' }));\n });\n cc.info.componentInfo.emits?.forEach(e => {\n attributes.push(genAttribute(e.name, 'event', { kind: 'markdown', value: e.documentation || '' }));\n });\n }\n tagSet[cc.name] = new HTMLTagSpecification(\n {\n kind: 'markdown',\n value: cc.documentation || ''\n },\n attributes\n );\n }\n\n return {\n getId: () => 'component',\n priority: TagProviderPriority.UserCode,\n collectTags: collector => collectTagsDefault(collector, tagSet),\n collectAttributes: (\n tag: string,\n collector: (attribute: string, type?: string, documentation?: string | MarkupContent) => void\n ) => {\n collectAttributesDefault(tag, collector, tagSet, []);\n },\n collectValues: (tag: string, attribute: string, collector: (value: string) => void) => {\n collectValuesDefault(tag, attribute, collector, tagSet, [], {});\n }\n };\n}\n", "import { VueFileInfo, PropInfo } from '../../../services/vueInfoService';\nimport { Diagnostic, DiagnosticSeverity } from 'vscode-languageserver-types';\nimport type { TextDocument } from 'vscode-languageserver-textdocument';\nimport { HTMLDocument, Node } from '../parser/htmlParser';\nimport { kebabCase } from 'lodash';\nimport { getSameTagInSet } from '../tagProviders/common';\nimport { normalizeAttributeNameToKebabCase } from './htmlCompletion';\nimport { VueVersion } from '../../../utils/vueVersion';\n\nexport function doPropValidation(\n document: TextDocument,\n htmlDocument: HTMLDocument,\n info: VueFileInfo,\n vueVersion: VueVersion\n): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n\n const childComponentToProps: { [n: string]: PropInfo[] } = {};\n info.componentInfo.childComponents?.forEach(c => {\n if (c.info && c.info.componentInfo.props) {\n childComponentToProps[c.name] = c.info?.componentInfo.props.filter(el => el.required);\n }\n });\n\n traverseNodes(htmlDocument.roots, n => {\n if (n.tag) {\n const foundTag = getSameTagInSet(childComponentToProps, n.tag);\n if (foundTag) {\n const d = generateDiagnostic(n, foundTag, document, vueVersion);\n if (d) {\n diagnostics.push(d);\n }\n }\n }\n });\n\n return diagnostics;\n}\n\nfunction traverseNodes(nodes: Node[], f: (n: Node) => any) {\n if (nodes.length === 0) {\n return;\n }\n\n for (const node of nodes) {\n f(node);\n traverseNodes(node.children, f);\n }\n}\n\nfunction generateDiagnostic(\n n: Node,\n definedProps: PropInfo[],\n document: TextDocument,\n vueVersion: VueVersion\n): Diagnostic | undefined {\n // Ignore diagnostic when have `v-bind`, `v-bind:[key]`, `:[key]`, `v-bind.sync`\n if (\n n.attributeNames.some(\n prop => prop === 'v-bind' || prop.startsWith('v-bind:[') || prop.startsWith(':[') || prop.startsWith('v-bind.')\n )\n ) {\n return undefined;\n }\n\n const vModelPropName = vueVersion === VueVersion.V30 ? 'modelValue' : 'value';\n\n const seenProps = n.attributeNames.map(attr => {\n return {\n name: attr,\n normalized: normalizeHtmlAttributeNameToKebabCaseAndReplaceVModel(\n attr,\n definedProps.find(prop => prop.isBoundToModel)?.name ?? vModelPropName\n )\n };\n });\n\n const requiredProps = definedProps.map(prop => {\n return {\n ...prop,\n normalized: kebabCase(prop.name)\n };\n });\n\n const missingProps: Array<PropInfo & { normalized: string }> = [];\n\n requiredProps.forEach(requiredProp => {\n if (!seenProps.map(s => s.normalized).includes(requiredProp.normalized)) {\n missingProps.push(requiredProp);\n }\n });\n\n if (missingProps.length === 0) {\n return undefined;\n }\n\n return {\n severity: missingProps.some(p => p.hasObjectValidator) ? DiagnosticSeverity.Error : DiagnosticSeverity.Warning,\n message: `<${n.tag}> misses props: ${missingProps.map(p => p.normalized).join(', ')}\\n`,\n range: {\n start: document.positionAt(n.start),\n end: document.positionAt(n.end)\n }\n };\n}\n\nfunction normalizeHtmlAttributeNameToKebabCaseAndReplaceVModel(attr: string, modelProp: string) {\n // v-model.trim\n if (!attr.startsWith('v-model:') && attr.startsWith('v-model')) {\n return kebabCase(modelProp);\n }\n return normalizeAttributeNameToKebabCase(attr);\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { FoldingRange, FoldingRangeKind } from 'vscode-languageserver-types';\nimport type { TextDocument } from 'vscode-languageserver-textdocument';\n\nimport { HtmlTokenType, createScanner } from '../parser/htmlScanner';\nimport { isVoidElement } from '../tagProviders/htmlTags';\n\nexport function getFoldingRanges(document: TextDocument): FoldingRange[] {\n const scanner = createScanner(document.getText());\n let token = scanner.scan();\n const ranges: FoldingRange[] = [];\n const stack: { startLine: number; tagName: string }[] = [];\n let lastTagName = null;\n let prevStart = -1;\n\n function addRange(range: FoldingRange) {\n ranges.push(range);\n prevStart = range.startLine;\n }\n\n while (token !== HtmlTokenType.EOS) {\n switch (token) {\n case HtmlTokenType.StartTag: {\n const tagName = scanner.getTokenText();\n const startLine = document.positionAt(scanner.getTokenOffset()).line;\n stack.push({ startLine, tagName });\n lastTagName = tagName;\n break;\n }\n case HtmlTokenType.EndTag: {\n lastTagName = scanner.getTokenText();\n break;\n }\n case HtmlTokenType.StartTagClose:\n if (!lastTagName || !isVoidElement(lastTagName)) {\n break;\n }\n // fallthrough\n case HtmlTokenType.EndTagClose:\n case HtmlTokenType.StartTagSelfClose: {\n let i = stack.length - 1;\n while (i >= 0 && stack[i].tagName !== lastTagName) {\n i--;\n }\n if (i >= 0) {\n const stackElement = stack[i];\n stack.length = i;\n const line = document.positionAt(scanner.getTokenOffset()).line;\n const startLine = stackElement.startLine;\n const endLine = line - 1;\n if (endLine > startLine && prevStart !== startLine) {\n addRange({ startLine, endLine });\n }\n }\n break;\n }\n case HtmlTokenType.Comment: {\n let startLine = document.positionAt(scanner.getTokenOffset()).line;\n const text = scanner.getTokenText();\n const m = text.match(/^\\s*#(region\\b)|(endregion\\b)/);\n if (m) {\n if (m[1]) {\n // start pattern match\n stack.push({ startLine, tagName: '' }); // empty tagName marks region\n } else {\n let i = stack.length - 1;\n while (i >= 0 && stack[i].tagName.length) {\n i--;\n }\n if (i >= 0) {\n const stackElement = stack[i];\n stack.length = i;\n const endLine = startLine;\n startLine = stackElement.startLine;\n if (endLine > startLine && prevStart !== startLine) {\n addRange({ startLine, endLine, kind: FoldingRangeKind.Region });\n }\n }\n }\n } else {\n const endLine = document.positionAt(scanner.getTokenOffset() + scanner.getTokenLength()).line;\n if (startLine < endLine) {\n addRange({ startLine, endLine, kind: FoldingRangeKind.Comment });\n }\n }\n break;\n }\n }\n token = scanner.scan();\n }\n\n return ranges;\n}\n", "import _ from 'lodash';\n\nimport { LanguageModelCache, getLanguageModelCache } from '../../embeddedSupport/languageModelCache';\nimport { Position, Range, FormattingOptions, CompletionItem } from 'vscode-languageserver-types';\nimport type { TextDocument } from 'vscode-languageserver-textdocument';\nimport { LanguageMode } from '../../embeddedSupport/languageModes';\nimport { VueDocumentRegions } from '../../embeddedSupport/embeddedSupport';\nimport { HTMLDocument } from './parser/htmlParser';\nimport { doComplete } from './services/htmlCompletion';\nimport { doHover } from './services/htmlHover';\nimport { findDocumentHighlights } from './services/htmlHighlighting';\nimport { findDocumentLinks } from './services/htmlLinks';\nimport { findDocumentSymbols } from './services/htmlSymbolsProvider';\nimport { htmlFormat } from './services/htmlFormat';\nimport { doESLintValidation, createLintEngine } from './services/htmlEslintValidation';\nimport { findDefinition } from './services/htmlDefinition';\nimport { getTagProviderSettings, CompletionConfiguration, getEnabledTagProviders } from './tagProviders';\nimport { DocumentContext } from '../../types';\nimport { VLSFormatConfig, VLSFullConfig } from '../../config';\nimport { VueInfoService } from '../../services/vueInfoService';\nimport { getComponentInfoTagProvider } from './tagProviders/componentInfoTagProvider';\nimport { doPropValidation } from './services/vuePropValidation';\nimport { getFoldingRanges } from './services/htmlFolding';\nimport { DependencyService } from '../../services/dependencyService';\nimport { isVCancellationRequested, VCancellationToken } from '../../utils/cancellationToken';\nimport { AutoImportSfcPlugin } from '../plugins/autoImportSfcPlugin';\nimport { EnvironmentService } from '../../services/EnvironmentService';\nimport { IHTMLTagProvider } from './tagProviders/common';\n\nexport class HTMLMode implements LanguageMode {\n private tagProviderSettings: CompletionConfiguration;\n private enabledTagProviders: IHTMLTagProvider[];\n private embeddedDocuments: LanguageModelCache<TextDocument>;\n private lintEngine: any;\n\n constructor(\n documentRegions: LanguageModelCache<VueDocumentRegions>,\n private env: EnvironmentService,\n private dependencyService: DependencyService,\n private vueDocuments: LanguageModelCache<HTMLDocument>,\n private autoImportSfcPlugin: AutoImportSfcPlugin,\n private vueInfoService?: VueInfoService\n ) {\n this.tagProviderSettings = getTagProviderSettings(env.getPackagePath());\n this.enabledTagProviders = getEnabledTagProviders(this.tagProviderSettings);\n this.embeddedDocuments = getLanguageModelCache<TextDocument>(10, 60, document =>\n documentRegions.refreshAndGet(document).getSingleLanguageDocument('vue-html')\n );\n this.lintEngine = createLintEngine(env.getVueVersion());\n }\n\n getId() {\n return 'html';\n }\n\n async doValidation(document: TextDocument, cancellationToken?: VCancellationToken) {\n const diagnostics = [];\n\n if (await isVCancellationRequested(cancellationToken)) {\n return [];\n }\n if (this.env.getConfig().vetur.validation.templateProps) {\n const info = this.vueInfoService ? this.vueInfoService.getInfo(document) : undefined;\n const version = this.env.getVueVersion();\n if (info && info.componentInfo.childComponents) {\n diagnostics.push(...doPropValidation(document, this.vueDocuments.refreshAndGet(document), info, version));\n }\n }\n\n if (await isVCancellationRequested(cancellationToken)) {\n return diagnostics;\n }\n if (this.env.getConfig().vetur.validation.template) {\n const embedded = this.embeddedDocuments.refreshAndGet(document);\n diagnostics.push(...(await doESLintValidation(embedded, this.lintEngine)));\n }\n\n return diagnostics;\n }\n doComplete(document: TextDocument, position: Position) {\n const embedded = this.embeddedDocuments.refreshAndGet(document);\n const tagProviders: IHTMLTagProvider[] = [...this.enabledTagProviders];\n\n const info = this.vueInfoService ? this.vueInfoService.getInfo(document) : undefined;\n if (info && info.componentInfo.childComponents) {\n tagProviders.push(getComponentInfoTagProvider(info.componentInfo.childComponents));\n }\n\n return doComplete(\n embedded,\n position,\n this.vueDocuments.refreshAndGet(embedded),\n tagProviders,\n this.env.getConfig().emmet,\n this.autoImportSfcPlugin.doComplete(document)\n );\n }\n doHover(document: TextDocument, position: Position) {\n const embedded = this.embeddedDocuments.refreshAndGet(document);\n const tagProviders: IHTMLTagProvider[] = [...this.enabledTagProviders];\n\n return doHover(embedded, position, this.vueDocuments.refreshAndGet(embedded), tagProviders);\n }\n findDocumentHighlight(document: TextDocument, position: Position) {\n return findDocumentHighlights(document, position, this.vueDocuments.refreshAndGet(document));\n }\n findDocumentLinks(document: TextDocument, documentContext: DocumentContext) {\n return findDocumentLinks(document, documentContext);\n }\n findDocumentSymbols(document: TextDocument) {\n return findDocumentSymbols(document, this.vueDocuments.refreshAndGet(document));\n }\n format(document: TextDocument, range: Range, formattingOptions: FormattingOptions) {\n return htmlFormat(this.dependencyService, document, range, this.env.getConfig().vetur.format as VLSFormatConfig);\n }\n findDefinition(document: TextDocument, position: Position) {\n const embedded = this.embeddedDocuments.refreshAndGet(document);\n const info = this.vueInfoService ? this.vueInfoService.getInfo(document) : undefined;\n return findDefinition(embedded, position, this.vueDocuments.refreshAndGet(embedded), info);\n }\n getFoldingRanges(document: TextDocument) {\n const embedded = this.embeddedDocuments.refreshAndGet(document);\n return getFoldingRanges(embedded);\n }\n onDocumentChanged(filePath: string) {\n if (filePath !== this.env.getPackagePath()) {\n return;\n }\n\n // reload package\n this.tagProviderSettings = getTagProviderSettings(this.env.getPackagePath());\n this.enabledTagProviders = getEnabledTagProviders(this.tagProviderSettings);\n this.lintEngine = createLintEngine(this.env.getVueVersion());\n }\n onDocumentRemoved(document: TextDocument) {\n this.vueDocuments.onDocumentRemoved(document);\n }\n dispose() {\n this.vueDocuments.dispose();\n }\n}\n", "import {\n CompletionItem,\n CompletionList,\n Definition,\n Diagnostic,\n DiagnosticSeverity,\n Location,\n MarkedString,\n MarkupContent,\n Position,\n Range,\n TextEdit\n} from 'vscode-languageserver-types';\nimport { URI } from 'vscode-uri';\nimport { TextDocument } from 'vscode-languageserver-textdocument';\nimport { LanguageModelCache } from '../../embeddedSupport/languageModelCache';\nimport { LanguageMode } from '../../embeddedSupport/languageModes';\nimport { IServiceHost } from '../../services/typescriptService/serviceHost';\nimport { mapBackRange, mapFromPositionToOffset } from '../../services/typescriptService/sourceMap';\nimport type ts from 'typescript';\nimport _ from 'lodash';\nimport { createTemplateDiagnosticFilter } from '../../services/typescriptService/diagnosticFilter';\nimport { toCompletionItemKind } from '../../services/typescriptService/util';\nimport { VueInfoService } from '../../services/vueInfoService';\nimport { isVCancellationRequested, VCancellationToken } from '../../utils/cancellationToken';\nimport { getFileFsPath } from '../../utils/paths';\nimport { NULL_COMPLETION } from '../nullMode';\nimport { languageServiceIncludesFile } from '../script/javascript';\nimport * as Previewer from '../script/previewer';\nimport { HTMLDocument } from './parser/htmlParser';\nimport { isInsideInterpolation } from './services/isInsideInterpolation';\nimport { RuntimeLibrary } from '../../services/dependencyService';\nimport { EnvironmentService } from '../../services/EnvironmentService';\nimport { VueDocumentRegions } from '../../embeddedSupport/embeddedSupport';\n\nexport class VueInterpolationMode implements LanguageMode {\n constructor(\n private documentRegions: LanguageModelCache<VueDocumentRegions>,\n private tsModule: RuntimeLibrary['typescript'],\n private serviceHost: IServiceHost,\n private env: EnvironmentService,\n private vueDocuments: LanguageModelCache<HTMLDocument>,\n private vueInfoService?: VueInfoService\n ) {}\n\n getId() {\n return 'vue-html-interpolation';\n }\n\n queryVirtualFileInfo(fileName: string, currFileText: string) {\n return this.serviceHost.queryVirtualFileInfo(fileName, currFileText);\n }\n\n private getChildComponents(document: TextDocument) {\n return this.env.getConfig().vetur.validation.templateProps\n ? this.vueInfoService && this.vueInfoService.getInfo(document)?.componentInfo.childComponents\n : [];\n }\n\n private isInterpolationMode(document: TextDocument) {\n return (\n this.env.getConfig().vetur.experimental.templateInterpolationService &&\n !this.documentRegions\n .refreshAndGet(document)\n .getLanguageRangesOfType('script')\n .some(region => region.attrs.setup)\n );\n }\n\n async doValidation(document: TextDocument, cancellationToken?: VCancellationToken): Promise<Diagnostic[]> {\n if (await isVCancellationRequested(cancellationToken)) {\n return [];\n }\n\n if (!this.isInterpolationMode(document) || !this.env.getConfig().vetur.validation.interpolation) {\n return [];\n }\n\n // Add suffix to process this doc as vue template.\n const templateDoc = TextDocument.create(\n document.uri + '.template',\n document.languageId,\n document.version,\n document.getText()\n );\n\n const { templateService, templateSourceMap } = this.serviceHost.updateCurrentVirtualVueTextDocument(\n templateDoc,\n this.getChildComponents(document)\n );\n\n if (!languageServiceIncludesFile(templateService, templateDoc.uri)) {\n return [];\n }\n\n if (await isVCancellationRequested(cancellationToken)) {\n return [];\n }\n\n const templateFileFsPath = getFileFsPath(templateDoc.uri);\n // We don't need syntactic diagnostics because\n // compiled template is always valid JavaScript syntax.\n const rawTemplateDiagnostics = templateService.getSemanticDiagnostics(templateFileFsPath);\n const templateDiagnosticFilter = createTemplateDiagnosticFilter(this.tsModule);\n\n return rawTemplateDiagnostics.filter(templateDiagnosticFilter).map(diag => {\n // syntactic/semantic diagnostic always has start and length\n // so we can safely cast diag to TextSpan\n return {\n range: mapBackRange(templateDoc, diag as ts.TextSpan, templateSourceMap),\n severity: DiagnosticSeverity.Error,\n message: this.tsModule.flattenDiagnosticMessageText(diag.messageText, '\\n'),\n code: diag.code,\n source: 'Vetur'\n };\n });\n }\n\n doComplete(document: TextDocument, position: Position): CompletionList {\n if (!this.isInterpolationMode(document)) {\n return NULL_COMPLETION;\n }\n\n const offset = document.offsetAt(position);\n const node = this.vueDocuments.refreshAndGet(document).findNodeBefore(offset);\n const nodeRange = Range.create(document.positionAt(node.start), document.positionAt(node.end));\n const nodeText = document.getText(nodeRange);\n if (!isInsideInterpolation(node, nodeText, offset - node.start)) {\n return NULL_COMPLETION;\n }\n\n // Add suffix to process this doc as vue template.\n const templateDoc = TextDocument.create(\n document.uri + '.template',\n document.languageId,\n document.version,\n document.getText()\n );\n\n const { templateService, templateSourceMap } = this.serviceHost.updateCurrentVirtualVueTextDocument(\n templateDoc,\n this.getChildComponents(document)\n );\n if (!languageServiceIncludesFile(templateService, templateDoc.uri)) {\n return NULL_COMPLETION;\n }\n\n /**\n * In the cases of empty content inside node\n * For example, completion in {{ | }}\n * Source map would only map this position {{| }}\n * And position mapped back wouldn't fall into any source map ranges\n */\n let completionPos = position;\n // Case {{ }}\n if (node.isInterpolation) {\n if (nodeText.match(/{{\\s*}}/)) {\n completionPos = document.positionAt(node.start + '{{'.length);\n }\n }\n // Todo: Case v-, : or @ directives\n\n const mappedOffset = mapFromPositionToOffset(templateDoc, completionPos, templateSourceMap);\n const templateFileFsPath = getFileFsPath(templateDoc.uri);\n\n /**\n * A lot of times interpolation expressions aren't valid\n * TODO: Make sure interpolation expression, even incomplete, can generate incomplete\n * TS files that can be fed into language service\n */\n let completions: ts.WithMetadata<ts.CompletionInfo> | undefined;\n try {\n completions = templateService.getCompletionsAtPosition(templateFileFsPath, mappedOffset, {\n includeCompletionsWithInsertText: true,\n includeCompletionsForModuleExports: false\n });\n } catch (err) {\n console.log('Interpolation completion failed');\n console.error((err as Error).stack);\n }\n\n if (!completions) {\n return NULL_COMPLETION;\n }\n\n const tsItems = completions!.entries.map((entry, index) => {\n return {\n uri: templateDoc.uri,\n position,\n label: entry.name,\n sortText: entry.name.startsWith('$') ? '1' + entry.sortText : '0' + entry.sortText,\n kind: toCompletionItemKind(entry.kind),\n textEdit:\n entry.replacementSpan &&\n TextEdit.replace(mapBackRange(templateDoc, entry.replacementSpan, templateSourceMap), entry.name),\n data: {\n // data used for resolving item details (see 'doResolve')\n languageId: 'vue-html',\n uri: templateDoc.uri,\n offset: position,\n source: entry.source,\n tsData: entry.data\n }\n };\n });\n\n return {\n isIncomplete: false,\n items: tsItems\n };\n }\n\n doResolve(document: TextDocument, item: CompletionItem): CompletionItem {\n if (!this.isInterpolationMode(document)) {\n return item;\n }\n\n /**\n * resolve is called for both HTMl and interpolation completions\n * HTML completions send back no data\n */\n if (!item.data) {\n return item;\n }\n\n // Add suffix to process this doc as vue template.\n const templateDoc = TextDocument.create(\n document.uri + '.template',\n document.languageId,\n document.version,\n document.getText()\n );\n\n const { templateService, templateSourceMap } = this.serviceHost.updateCurrentVirtualVueTextDocument(\n templateDoc,\n this.getChildComponents(document)\n );\n if (!languageServiceIncludesFile(templateService, templateDoc.uri)) {\n return item;\n }\n\n const templateFileFsPath = getFileFsPath(templateDoc.uri);\n const mappedOffset = mapFromPositionToOffset(templateDoc, item.data.offset, templateSourceMap);\n\n const details = templateService.getCompletionEntryDetails(\n templateFileFsPath,\n mappedOffset,\n item.label,\n undefined,\n undefined,\n undefined,\n undefined\n );\n\n if (details) {\n item.detail = Previewer.plain(this.tsModule.displayPartsToString(details.displayParts));\n\n const documentation: MarkupContent = {\n kind: 'markdown',\n value: this.tsModule.displayPartsToString(details.documentation) + '\\n\\n'\n };\n\n if (details.tags) {\n if (details.tags) {\n details.tags.forEach(x => {\n const tagDoc = Previewer.getTagDocumentation(x);\n if (tagDoc) {\n documentation.value += tagDoc + '\\n\\n';\n }\n });\n }\n }\n\n item.documentation = documentation;\n delete item.data;\n }\n return item;\n }\n\n doHover(\n document: TextDocument,\n position: Position\n ): {\n contents: MarkedString[];\n range?: Range;\n } {\n if (!this.isInterpolationMode(document)) {\n return { contents: [] };\n }\n\n // Add suffix to process this doc as vue template.\n const templateDoc = TextDocument.create(\n document.uri + '.template',\n document.languageId,\n document.version,\n document.getText()\n );\n\n const { templateService, templateSourceMap } = this.serviceHost.updateCurrentVirtualVueTextDocument(\n templateDoc,\n this.getChildComponents(document)\n );\n if (!languageServiceIncludesFile(templateService, templateDoc.uri)) {\n return {\n contents: []\n };\n }\n\n const templateFileFsPath = getFileFsPath(templateDoc.uri);\n const mappedPosition = mapFromPositionToOffset(templateDoc, position, templateSourceMap);\n\n const info = templateService.getQuickInfoAtPosition(templateFileFsPath, mappedPosition);\n if (info) {\n const display = this.tsModule.displayPartsToString(info.displayParts);\n const markedContents: MarkedString[] = [{ language: 'ts', value: display }];\n\n let hoverMdDoc = '';\n const doc = Previewer.plain(this.tsModule.displayPartsToString(info.documentation));\n if (doc) {\n hoverMdDoc += doc + '\\n\\n';\n }\n\n if (info.tags) {\n info.tags.forEach(x => {\n const tagDoc = Previewer.getTagDocumentation(x);\n if (tagDoc) {\n hoverMdDoc += tagDoc + '\\n\\n';\n }\n });\n }\n\n if (hoverMdDoc.trim() !== '') {\n markedContents.push(hoverMdDoc);\n }\n\n return {\n range: mapBackRange(templateDoc, info.textSpan, templateSourceMap),\n contents: markedContents\n };\n }\n return { contents: [] };\n }\n\n findDefinition(document: TextDocument, position: Position): Location[] {\n if (!this.isInterpolationMode(document)) {\n return [];\n }\n\n // Add suffix to process this doc as vue template.\n const templateDoc = TextDocument.create(\n document.uri + '.template',\n document.languageId,\n document.version,\n document.getText()\n );\n\n const { templateService, templateSourceMap } = this.serviceHost.updateCurrentVirtualVueTextDocument(\n templateDoc,\n this.getChildComponents(document)\n );\n if (!languageServiceIncludesFile(templateService, templateDoc.uri)) {\n return [];\n }\n\n const templateFileFsPath = getFileFsPath(templateDoc.uri);\n const mappedPosition = mapFromPositionToOffset(templateDoc, position, templateSourceMap);\n const definitions = templateService.getDefinitionAtPosition(templateFileFsPath, mappedPosition);\n if (!definitions) {\n return [];\n }\n\n const definitionResults: Definition = [];\n const program = templateService.getProgram();\n if (!program) {\n return [];\n }\n\n definitions.forEach(r => {\n const definitionTargetDoc = r.fileName === templateFileFsPath ? document : getSourceDoc(r.fileName, program);\n if (definitionTargetDoc) {\n const range =\n r.fileName === templateFileFsPath\n ? mapBackRange(templateDoc, r.textSpan, templateSourceMap)\n : convertRange(definitionTargetDoc, r.textSpan);\n\n definitionResults.push({\n uri: URI.file(definitionTargetDoc.uri).toString(),\n range\n });\n }\n });\n return definitionResults;\n }\n\n findReferences(document: TextDocument, position: Position): Location[] {\n if (!this.isInterpolationMode(document)) {\n return [];\n }\n\n // Add suffix to process this doc as vue template.\n const templateDoc = TextDocument.create(\n document.uri + '.template',\n document.languageId,\n document.version,\n document.getText()\n );\n\n const { templateService, templateSourceMap } = this.serviceHost.updateCurrentVirtualVueTextDocument(\n templateDoc,\n this.getChildComponents(document)\n );\n if (!languageServiceIncludesFile(templateService, templateDoc.uri)) {\n return [];\n }\n\n const templateFileFsPath = getFileFsPath(templateDoc.uri);\n const mappedPosition = mapFromPositionToOffset(templateDoc, position, templateSourceMap);\n const references = templateService.getReferencesAtPosition(templateFileFsPath, mappedPosition);\n if (!references) {\n return [];\n }\n\n const referenceResults: Location[] = [];\n const program = templateService.getProgram();\n if (!program) {\n return [];\n }\n\n references.forEach(r => {\n const referenceTargetDoc = r.fileName === templateFileFsPath ? document : getSourceDoc(r.fileName, program);\n if (referenceTargetDoc) {\n const range =\n r.fileName === templateFileFsPath\n ? mapBackRange(templateDoc, r.textSpan, templateSourceMap)\n : convertRange(referenceTargetDoc, r.textSpan);\n\n referenceResults.push({\n uri: URI.file(referenceTargetDoc.uri).toString(),\n range\n });\n }\n });\n return referenceResults;\n }\n\n onDocumentRemoved() {}\n\n dispose() {}\n}\n\nfunction getSourceDoc(fileName: string, program: ts.Program): TextDocument {\n const sourceFile = program.getSourceFile(fileName)!;\n return TextDocument.create(fileName, 'vue', 0, sourceFile.getFullText());\n}\n\nfunction convertRange(document: TextDocument, span: ts.TextSpan): Range {\n const startPosition = document.positionAt(span.start);\n const endPosition = document.positionAt(span.start + span.length);\n return Range.create(startPosition, endPosition);\n}\n", "import { Range, Position } from 'vscode-languageserver-types';\nimport type { TextDocument } from 'vscode-languageserver-textdocument';\nimport { getFileFsPath } from '../../utils/paths';\nimport type ts from 'typescript';\nimport { RuntimeLibrary } from '../dependencyService';\n\ninterface TemplateSourceMapRange {\n start: number;\n end: number;\n}\n\ninterface TemplateSourceMapNodeFrom extends TemplateSourceMapRange {\n fileName: string;\n}\ninterface TemplateSourceMapNodeTo extends TemplateSourceMapRange {\n fileName: string;\n}\n\ninterface Mapping {\n [k: number]: number;\n}\n\nconst INVALID_OFFSET = 0;\nconst INVALID_RANGE = Range.create(0, 0, 0, 0);\n\n/**\n * Invariants:\n *\n * - `from.end - from.start` should equal to `to.end - to.start - 5 * (to.thisDotRanges.length)`\n * - Each item in `to.thisDotRanges` should have length 5 for `this.`\n */\nexport interface TemplateSourceMapNode {\n from: TemplateSourceMapNodeFrom;\n to: TemplateSourceMapNodeTo;\n offsetMapping: Mapping;\n offsetBackMapping: Mapping;\n mergedNodes: TemplateSourceMapNode[];\n}\n\nexport interface TemplateSourceMap {\n [fileName: string]: TemplateSourceMapNode[];\n}\n\n/**\n * Walk through the validSourceFile, for each Node, find its corresponding Node in syntheticSourceFile.\n *\n * Generate a SourceMap with Nodes looking like this:\n *\n * SourceMapNode {\n * from: {\n * start: 0,\n * end: 8\n * filename: 'foo.vue'\n * },\n * to: {\n * start: 0,\n * end: 18\n * filename: 'foo.vue.template'\n * },\n * offsetMapping: {\n * 0: 5,\n * 1: 6,\n * 2, 7\n * },\n * }\n */\nexport function generateSourceMap(\n tsModule: RuntimeLibrary['typescript'],\n syntheticSourceFile: ts.SourceFile,\n validSourceFile: ts.SourceFile\n): TemplateSourceMapNode[] {\n const sourceMapNodes: TemplateSourceMapNode[] = [];\n walkBothNode(syntheticSourceFile, validSourceFile);\n return foldSourceMapNodes(sourceMapNodes);\n\n function walkBothNode(syntheticNode: ts.Node, validNode: ts.Node) {\n const validNodeChildren: ts.Node[] = [];\n tsModule.forEachChild(validNode, c => {\n validNodeChildren.push(c);\n return false;\n });\n const syntheticNodeChildren: ts.Node[] = [];\n tsModule.forEachChild(syntheticNode, c => {\n syntheticNodeChildren.push(c);\n return false;\n });\n\n validNodeChildren.forEach((vc, i) => {\n const sc = syntheticNodeChildren[i];\n if (!sc) {\n return;\n }\n\n const scSourceRange = tsModule.getSourceMapRange(sc);\n\n /**\n * `getSourceMapRange` falls back to return actual Node if sourceMap doesn't exist\n * This check ensure we are checking the actual `sourceMapRange` being set\n */\n if (!(scSourceRange as ts.Node).kind && scSourceRange.pos !== -1 && scSourceRange.end !== -1) {\n const sourceMapNode: TemplateSourceMapNode = {\n from: {\n start: scSourceRange.pos,\n end: scSourceRange.end,\n fileName: syntheticSourceFile.fileName\n },\n to: {\n start: vc.getStart(),\n end: vc.getEnd(),\n fileName: validSourceFile.fileName\n },\n offsetMapping: {},\n offsetBackMapping: {},\n mergedNodes: []\n };\n\n const isThisInjected =\n tsModule.isPropertyAccessExpression(vc) && vc.expression.kind === tsModule.SyntaxKind.ThisKeyword;\n updateOffsetMapping(sourceMapNode, isThisInjected, !canIncludeTrivia(tsModule, vc));\n\n sourceMapNodes.push(sourceMapNode);\n }\n\n walkBothNode(sc, vc);\n });\n }\n}\n\n/**\n * Merge source map nodes when a node overwraps another node.\n * For example, the following expression will generates three source map nodes,\n * for `foo` identifier, `bar` identifier and entire binary expression `foo + bar`.\n *\n * `foo + bar`\n *\n * In this case `foo + bar` contains `foo` and `bar`. Then we will merge source map nodes\n * for the identifiers into the map for `foo + bar`.\n */\nfunction foldSourceMapNodes(nodes: TemplateSourceMapNode[]): TemplateSourceMapNode[] {\n return nodes.reduce<TemplateSourceMapNode[]>((folded, node) => {\n const last = folded[folded.length - 1];\n if (!last) {\n return folded.concat(node);\n }\n\n // Children source map nodes always appear after a parent node\n // because of how we traverse source mapping in `walkBothNode` function.\n if (node.from.start < last.from.start || last.from.end < node.from.end) {\n return folded.concat(node);\n }\n\n last.offsetMapping = {\n ...last.offsetMapping,\n ...node.offsetMapping\n };\n\n last.offsetBackMapping = {\n ...last.offsetBackMapping,\n ...node.offsetBackMapping\n };\n\n last.mergedNodes.push(node);\n\n return folded;\n }, []);\n}\n\nfunction canIncludeTrivia(tsModule: RuntimeLibrary['typescript'], node: ts.Node): boolean {\n return !(\n tsModule.isIdentifier(node) ||\n tsModule.isStringLiteral(node) ||\n tsModule.isNumericLiteral(node) ||\n tsModule.isBigIntLiteral(node)\n );\n}\n\n/**\n * Map a range from actual `.vue` file to `.vue.template` file\n */\nexport function mapFromPositionToOffset(\n document: TextDocument,\n position: Position,\n sourceMap: TemplateSourceMap\n): number {\n const offset = document.offsetAt(position);\n\n return mapFromOffsetToOffset(document, offset, sourceMap);\n}\n\n/**\n * Map an offset from actual `.vue` file to `.vue.template` file\n */\nfunction mapFromOffsetToOffset(document: TextDocument, offset: number, sourceMap: TemplateSourceMap): number {\n const filePath = getFileFsPath(document.uri);\n if (!sourceMap[filePath]) {\n return INVALID_OFFSET;\n }\n\n for (const sourceMapNode of sourceMap[filePath]) {\n if (offset >= sourceMapNode.from.start && offset <= sourceMapNode.from.end) {\n return sourceMapNode.offsetMapping[offset];\n }\n }\n\n // Handle the case when no original range can be mapped\n return INVALID_OFFSET;\n}\n\n/**\n * Map a range from actual `.vue` file to `.vue.template` file\n */\nexport function mapToRange(toDocument: TextDocument, from: ts.TextSpan, sourceMap: TemplateSourceMap): Range {\n const filePath = getFileFsPath(toDocument.uri);\n if (!sourceMap[filePath]) {\n return INVALID_RANGE;\n }\n\n for (const sourceMapNode of sourceMap[filePath]) {\n if (from.start >= sourceMapNode.from.start && from.start + from.length <= sourceMapNode.from.end) {\n const mappedStart = sourceMapNode.offsetMapping[from.start];\n const mappedEnd = sourceMapNode.offsetMapping[from.start + from.length];\n return {\n start: toDocument.positionAt(mappedStart),\n end: toDocument.positionAt(mappedEnd)\n };\n }\n }\n\n // Handle the case when no original range can be mapped\n return INVALID_RANGE;\n}\n\n/**\n * Map a range from virtual `.vue.template` file back to original `.vue` file\n */\nexport function mapBackRange(fromDocumnet: TextDocument, to: ts.TextSpan, sourceMap: TemplateSourceMap): Range {\n const filePath = getFileFsPath(fromDocumnet.uri);\n if (!sourceMap[filePath]) {\n return INVALID_RANGE;\n }\n\n for (const sourceMapNode of sourceMap[filePath]) {\n if (to.start >= sourceMapNode.to.start && to.start + to.length <= sourceMapNode.to.end) {\n const mappedStart = sourceMapNode.offsetBackMapping[to.start];\n const mappedEnd = sourceMapNode.offsetBackMapping[to.start + to.length];\n\n return {\n start: fromDocumnet.positionAt(mappedStart),\n end: fromDocumnet.positionAt(mappedEnd)\n };\n }\n }\n\n // Handle the case when no original range can be mapped\n return INVALID_RANGE;\n}\n\nfunction updateOffsetMapping(node: TemplateSourceMapNode, isThisInjected: boolean, fillIntermediate: boolean) {\n const nodeFromStart = node.from.start;\n const nodeToStart = node.to.start;\n const from = [...Array(node.from.end - nodeFromStart + 1).keys()];\n const to: (number | undefined)[] = [...Array(node.to.end - nodeToStart + 1).keys()];\n\n if (isThisInjected) {\n for (let i = 0; i < 'this.'.length; i++) {\n to[nodeToStart + i] = undefined;\n }\n /**\n * The case such as `foo` mapped to `this.foo`\n * Both `|this.foo` and `this.|foo` should map to `|foo`\n * Without this back mapping, mapping error from `this.bar` in `f(this.bar)` would fail\n */\n node.offsetBackMapping[nodeToStart] = nodeFromStart + 'this.'.length;\n } else if (to.length > from.length) {\n /**\n * The case when `to` is wider than `from`\n * For example, in `:foo=\"num\"` to `{ \"foo\": this.num }`,\n * need to map `\"foo\"` back to `foo`\n */\n const delta = to.length - from.length;\n for (let i = 0; i < delta; i++) {\n node.offsetBackMapping[node.to.start + from.length + i] = node.from.end;\n }\n }\n\n const toFiltered = to as number[];\n if (isThisInjected) {\n toFiltered.splice(nodeToStart, 'this.'.length);\n }\n const mapping = fillIntermediate\n ? from.map((from, i) => [from, toFiltered[i]])\n : [\n [from[0], toFiltered[0]],\n [from[from.length - 1], toFiltered[toFiltered.length - 1]]\n ];\n\n mapping.forEach(([fromOffset, toOffset]) => {\n const from = fromOffset + nodeFromStart;\n const to = toOffset + nodeToStart;\n\n if (!!from && !!to) {\n node.offsetMapping[from] = to;\n node.offsetBackMapping[to] = from;\n }\n });\n\n if (to.length < from.length) {\n /**\n * The case when `from` is wider than `to`\n * For example, in `<foooooo bar=\"\" />` to `{ \"props\": { bar: ... }}`,\n * need to map `props` back to `foooooo`\n */\n node.offsetBackMapping[node.to.end] = node.from.end;\n }\n}\n\nexport function printSourceMap(sourceMap: TemplateSourceMap, vueFileSrc: string, tsFileSrc: string) {\n for (const fileName in sourceMap) {\n console.log(`Sourcemap for ${fileName}`);\n\n sourceMap[fileName].forEach(node => {\n const sf = vueFileSrc.slice(node.from.start, node.from.end);\n const st = vueFileSrc.slice(node.to.start, node.to.end);\n console.log(`[${node.from.start}, ${node.from.end}, ${sf}] => [${node.to.start}, ${node.to.end}, ${st}]`);\n });\n // console.log(JSON.stringify(sourceMap[fileName].offsetMapping));\n }\n}\n\nexport function stringifySourceMapNodes(\n sourceMapNodes: TemplateSourceMapNode[],\n vueFileSrc: string,\n tsFileSrc: string\n): string {\n let result = '';\n\n sourceMapNodes.forEach(node => {\n const sf = vueFileSrc.slice(node.from.start, node.from.end);\n const st = tsFileSrc.slice(node.to.start, node.to.end);\n result += `[${node.from.start}, ${node.from.end}, ${sf}] => [${node.to.start}, ${node.to.end}, ${st}]\\n`;\n });\n\n return result;\n}\n", "import { Node } from '../parser/htmlParser';\nimport { parse } from 'vue-eslint-parser';\n\nconst PARSER_PRE = '<template>';\nconst PARSER_POS = '</template>';\n\nexport function isInsideInterpolation(node: Node, nodeText: string, relativePos: number) {\n // Case {{ }}\n if (node.isInterpolation && relativePos >= '{{'.length && relativePos <= nodeText.length - '}}'.length) {\n return true;\n }\n\n // Case v-, : or @ directives\n const templateBody = parse(PARSER_PRE + nodeText + PARSER_POS, {}).templateBody;\n if (!templateBody) {\n return false;\n }\n\n const onlyChild = templateBody.children[0];\n\n if (!onlyChild || onlyChild.type !== 'VElement') {\n return false;\n }\n\n if (!onlyChild.startTag || !onlyChild.range) {\n return false;\n }\n\n if (!isInsideRange(onlyChild.startTag)) {\n return false;\n }\n\n for (const a of onlyChild.startTag.attributes) {\n if (isInsideRange(a) && a.directive) {\n if (a.value) {\n return isInsideRange(a.value);\n }\n }\n }\n\n return false;\n\n function isInsideRange(node: { range: number[] }) {\n const [start, end] = node.range;\n\n return start - PARSER_PRE.length < relativePos && end - PARSER_PRE.length > relativePos;\n }\n}\n", "import { HtmlTokenType, createScanner } from './htmlScanner';\nimport { isVoidElement } from '../tagProviders/htmlTags';\nimport type { TextDocument } from 'vscode-languageserver-textdocument';\n\nexport class Node {\n public tag?: string;\n public closed?: boolean;\n public endTagStart?: number;\n public isInterpolation: boolean;\n public attributes?: { [name: string]: string };\n public get attributeNames(): string[] {\n if (this.attributes) {\n return Object.keys(this.attributes);\n }\n\n return [];\n }\n constructor(public start: number, public end: number, public children: Node[], public parent: Node) {\n this.isInterpolation = false;\n }\n public isSameTag(tagInLowerCase: string) {\n return (\n this.tag &&\n tagInLowerCase &&\n this.tag.length === tagInLowerCase.length &&\n this.tag.toLowerCase() === tagInLowerCase\n );\n }\n public get firstChild(): Node {\n return this.children[0];\n }\n public get lastChild(): Node | undefined {\n return this.children.length ? this.children[this.children.length - 1] : void 0;\n }\n\n public findNodeBefore(offset: number): Node {\n const idx = findFirst(this.children, c => offset <= c.start) - 1;\n if (idx >= 0) {\n const child = this.children[idx];\n if (offset > child.start) {\n if (offset < child.end) {\n return child.findNodeBefore(offset);\n }\n const lastChild = child.lastChild;\n if (lastChild && lastChild.end === child.end) {\n return child.findNodeBefore(offset);\n }\n return child;\n }\n }\n return this;\n }\n\n public findNodeAt(offset: number): Node {\n const idx = findFirst(this.children, c => offset <= c.start) - 1;\n if (idx >= 0) {\n const child = this.children[idx];\n if (offset > child.start && offset <= child.end) {\n return child.findNodeAt(offset);\n }\n }\n return this;\n }\n}\n\nexport interface HTMLDocument {\n roots: Node[];\n findNodeBefore(offset: number): Node;\n findNodeAt(offset: number): Node;\n}\n\nexport function parse(text: string): HTMLDocument {\n const scanner = createScanner(text);\n\n const htmlDocument = new Node(0, text.length, [], null as any);\n let curr = htmlDocument;\n let endTagStart = -1;\n let pendingAttribute = '';\n let token = scanner.scan();\n let attributes: { [k: string]: string } | undefined = {};\n while (token !== HtmlTokenType.EOS) {\n switch (token) {\n case HtmlTokenType.StartTagOpen:\n const child = new Node(scanner.getTokenOffset(), text.length, [], curr);\n curr.children.push(child);\n curr = child;\n break;\n case HtmlTokenType.StartTag:\n curr.tag = scanner.getTokenText();\n break;\n case HtmlTokenType.StartTagClose:\n curr.end = scanner.getTokenEnd(); // might be later set to end tag position\n if (isVoidElement(curr.tag) && curr !== htmlDocument) {\n curr.closed = true;\n curr = curr.parent;\n }\n break;\n case HtmlTokenType.EndTagOpen:\n endTagStart = scanner.getTokenOffset();\n break;\n case HtmlTokenType.EndTag:\n const closeTag = scanner.getTokenText().toLowerCase();\n while (!curr.isSameTag(closeTag) && curr !== htmlDocument) {\n curr.end = endTagStart;\n curr.closed = false;\n curr = curr.parent;\n }\n if (curr !== htmlDocument) {\n curr.closed = true;\n curr.endTagStart = endTagStart;\n }\n break;\n case HtmlTokenType.StartTagSelfClose:\n if (curr !== htmlDocument) {\n curr.closed = true;\n curr.end = scanner.getTokenEnd();\n curr = curr.parent;\n }\n break;\n case HtmlTokenType.EndTagClose:\n if (curr !== htmlDocument) {\n curr.end = scanner.getTokenEnd();\n curr = curr.parent;\n }\n break;\n case HtmlTokenType.StartInterpolation: {\n const child = new Node(scanner.getTokenOffset(), text.length, [], curr);\n child.isInterpolation = true;\n curr.children.push(child);\n curr = child;\n break;\n }\n case HtmlTokenType.EndInterpolation:\n curr.end = scanner.getTokenEnd();\n curr.closed = true;\n curr = curr.parent;\n break;\n case HtmlTokenType.AttributeName:\n pendingAttribute = scanner.getTokenText();\n attributes = curr.attributes;\n if (!attributes) {\n curr.attributes = attributes = {};\n }\n attributes[pendingAttribute] = ''; // Support valueless attributes such as 'checked'\n break;\n case HtmlTokenType.AttributeValue:\n const value = scanner.getTokenText();\n if (attributes && pendingAttribute) {\n attributes[pendingAttribute] = value;\n pendingAttribute = '';\n }\n break;\n }\n token = scanner.scan();\n }\n while (curr !== htmlDocument) {\n curr.end = text.length;\n curr.closed = false;\n curr = curr.parent;\n }\n return {\n roots: htmlDocument.children,\n findNodeBefore: htmlDocument.findNodeBefore.bind(htmlDocument),\n findNodeAt: htmlDocument.findNodeAt.bind(htmlDocument)\n };\n}\n\nexport function parseHTMLDocument(document: TextDocument): HTMLDocument {\n return parse(document.getText());\n}\n\n/**\n * Takes a sorted array and a function p. The array is sorted in such a way that all elements where p(x) is false\n * are located before all elements where p(x) is true.\n * @returns the least x for which p(x) is true or array.length if no element fullfills the given function.\n */\nfunction findFirst<T>(array: T[], p: (x: T) => boolean): number {\n let low = 0,\n high = array.length;\n if (high === 0) {\n return 0; // no children\n }\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n if (p(array[mid])) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n return low;\n}\n", "import { FormattingOptions, Position, Range, Hover, Location, CompletionItem } from 'vscode-languageserver-types';\nimport type { TextDocument } from 'vscode-languageserver-textdocument';\nimport { VueDocumentRegions } from '../../embeddedSupport/embeddedSupport';\nimport { LanguageModelCache, getLanguageModelCache } from '../../embeddedSupport/languageModelCache';\nimport { LanguageMode } from '../../embeddedSupport/languageModes';\nimport { VueInfoService } from '../../services/vueInfoService';\nimport { DocumentContext } from '../../types';\nimport { HTMLMode } from './htmlMode';\nimport { VueInterpolationMode } from './interpolationMode';\nimport { IServiceHost } from '../../services/typescriptService/serviceHost';\nimport { HTMLDocument, parseHTMLDocument } from './parser/htmlParser';\nimport { DependencyService, RuntimeLibrary } from '../../services/dependencyService';\nimport { VCancellationToken } from '../../utils/cancellationToken';\nimport { AutoImportSfcPlugin } from '../plugins/autoImportSfcPlugin';\nimport { EnvironmentService } from '../../services/EnvironmentService';\n\ntype DocumentRegionCache = LanguageModelCache<VueDocumentRegions>;\n\nexport class VueHTMLMode implements LanguageMode {\n private htmlMode: HTMLMode;\n private vueInterpolationMode: VueInterpolationMode;\n private autoImportSfcPlugin: AutoImportSfcPlugin;\n\n constructor(\n tsModule: RuntimeLibrary['typescript'],\n serviceHost: IServiceHost,\n env: EnvironmentService,\n documentRegions: DocumentRegionCache,\n autoImportSfcPlugin: AutoImportSfcPlugin,\n dependencyService: DependencyService,\n vueInfoService?: VueInfoService\n ) {\n const vueDocuments = getLanguageModelCache<HTMLDocument>(10, 60, document => parseHTMLDocument(document));\n this.htmlMode = new HTMLMode(\n documentRegions,\n env,\n dependencyService,\n vueDocuments,\n autoImportSfcPlugin,\n vueInfoService\n );\n this.vueInterpolationMode = new VueInterpolationMode(\n documentRegions,\n tsModule,\n serviceHost,\n env,\n vueDocuments,\n vueInfoService\n );\n this.autoImportSfcPlugin = autoImportSfcPlugin;\n }\n getId() {\n return 'vue-html';\n }\n queryVirtualFileInfo(fileName: string, currFileText: string) {\n return this.vueInterpolationMode.queryVirtualFileInfo(fileName, currFileText);\n }\n async doValidation(document: TextDocument, cancellationToken?: VCancellationToken) {\n return Promise.all([\n this.vueInterpolationMode.doValidation(document, cancellationToken),\n this.htmlMode.doValidation(document, cancellationToken)\n ]).then(result => [...result[0], ...result[1]]);\n }\n doComplete(document: TextDocument, position: Position) {\n const htmlList = this.htmlMode.doComplete(document, position);\n const intList = this.vueInterpolationMode.doComplete(document, position);\n return {\n isIncomplete: htmlList.isIncomplete || intList.isIncomplete,\n items: htmlList.items.concat(intList.items)\n };\n }\n doResolve(document: TextDocument, item: CompletionItem): CompletionItem {\n if (this.autoImportSfcPlugin.isMyResolve(item)) {\n return this.autoImportSfcPlugin.doResolve(document, item);\n }\n return this.vueInterpolationMode.doResolve(document, item);\n }\n doHover(document: TextDocument, position: Position): Hover {\n // Return concatenated results from both vueInterpolationMode and htmlMode.\n const interpolationHover = this.vueInterpolationMode.doHover(document, position);\n let markdownContent = '';\n if (interpolationHover.contents.length > 0) {\n for (const content of interpolationHover.contents) {\n if (typeof content === 'string') {\n markdownContent += `${content}\\n`;\n } else {\n markdownContent += `\\`\\`\\`${content.language}\\n${content.value}\\n\\`\\`\\`\\n`;\n }\n }\n }\n const htmlResult = this.htmlMode.doHover(document, position);\n if (htmlResult.contents && Array.isArray(htmlResult.contents)) {\n for (const content of htmlResult.contents) {\n if (typeof content === 'string') {\n markdownContent += `${content}\\n`;\n } else {\n markdownContent += `\\`\\`\\`${content.language}\\n${content.value}\\n\\`\\`\\`\\n`;\n }\n }\n } else if (typeof htmlResult.contents === 'string') {\n markdownContent += `${htmlResult.contents}\\n`;\n } else if ('kind' in htmlResult.contents) {\n markdownContent += `${htmlResult.contents.value}\\n`;\n } else {\n markdownContent += `\\`\\`\\`${htmlResult.contents.language}\\n${htmlResult.contents.value}\\n\\`\\`\\`\\n`;\n }\n return {\n contents: { kind: 'markdown', value: markdownContent },\n range: interpolationHover.range || htmlResult.range\n };\n }\n findDocumentHighlight(document: TextDocument, position: Position) {\n return this.htmlMode.findDocumentHighlight(document, position);\n }\n findDocumentLinks(document: TextDocument, documentContext: DocumentContext) {\n return this.htmlMode.findDocumentLinks(document, documentContext);\n }\n findDocumentSymbols(document: TextDocument) {\n return this.htmlMode.findDocumentSymbols(document);\n }\n format(document: TextDocument, range: Range, formattingOptions: FormattingOptions) {\n return this.htmlMode.format(document, range, formattingOptions);\n }\n findReferences(document: TextDocument, position: Position): Location[] {\n return this.vueInterpolationMode.findReferences(document, position);\n }\n findDefinition(document: TextDocument, position: Position) {\n const htmlDefinition = this.htmlMode.findDefinition(document, position);\n\n return htmlDefinition.length > 0 ? htmlDefinition : this.vueInterpolationMode.findDefinition(document, position);\n }\n getFoldingRanges(document: TextDocument) {\n return this.htmlMode.getFoldingRanges(document);\n }\n onDocumentRemoved(document: TextDocument) {\n this.htmlMode.onDocumentRemoved(document);\n }\n dispose() {\n this.htmlMode.dispose();\n }\n}\n", "import _ from 'lodash';\nimport * as emmet from 'vscode-emmet-helper';\nimport { CompletionList, TextEdit } from 'vscode-languageserver-types';\nimport { IStylusSupremacy } from './stylus-supremacy';\n\nimport { StylePriority } from '../emmet';\nimport { LanguageModelCache, getLanguageModelCache } from '../../../embeddedSupport/languageModelCache';\nimport { LanguageMode } from '../../../embeddedSupport/languageModes';\nimport { VueDocumentRegions } from '../../../embeddedSupport/embeddedSupport';\n\nimport { provideCompletionItems } from './completion-item';\nimport { provideDocumentSymbols } from './symbols-finder';\nimport { stylusHover } from './stylus-hover';\nimport { getFileFsPath } from '../../../utils/paths';\nimport { VLSFormatConfig } from '../../../config';\nimport { DependencyService } from '../../../services/dependencyService';\nimport { EnvironmentService } from '../../../services/EnvironmentService';\nimport { sync } from 'glob';\nimport { NULL_COMPLETION } from '../../nullMode';\n\nimport fs from 'fs';\nimport path from 'path';\n\nexport function getStylusMode(\n env: EnvironmentService,\n documentRegions: LanguageModelCache<VueDocumentRegions>,\n dependencyService: DependencyService\n): LanguageMode {\n const embeddedDocuments = getLanguageModelCache(10, 60, document =>\n documentRegions.refreshAndGet(document).getSingleLanguageDocument('stylus')\n );\n\n return {\n getId: () => 'stylus',\n onDocumentRemoved() {},\n dispose() {},\n doComplete(document, position) {\n const embedded = embeddedDocuments.refreshAndGet(document);\n\n const useSeparator =\n typeof env.getConfig().languageStylus.useSeparator === 'undefined'\n ? true\n : env.getConfig().languageStylus.useSeparator;\n\n const lsCompletions = provideCompletionItems(embedded, position, useSeparator);\n const lsItems = _.map(lsCompletions.items, i => {\n return {\n ...i,\n sortText: StylePriority.Platform + i.label\n };\n });\n\n const emmetCompletions = emmet.doComplete(document, position, 'stylus', env.getConfig().emmet);\n if (!emmetCompletions) {\n return { isIncomplete: false, items: lsItems };\n } else {\n const emmetItems = emmetCompletions.items.map(i => {\n return {\n ...i,\n sortText: StylePriority.Emmet + i.label\n };\n });\n return {\n isIncomplete: emmetCompletions.isIncomplete,\n items: _.concat(emmetItems, lsItems)\n };\n }\n },\n findDocumentSymbols(document) {\n const embedded = embeddedDocuments.refreshAndGet(document);\n return provideDocumentSymbols(embedded);\n },\n doHover(document, position) {\n const embedded = embeddedDocuments.refreshAndGet(document);\n return stylusHover(embedded, position);\n },\n format(document, range, formatParams) {\n if (env.getConfig().vetur.format.defaultFormatter.stylus === 'none') {\n return [];\n }\n\n const stylusSupremacy: IStylusSupremacy = dependencyService.get(\n 'stylus-supremacy',\n getFileFsPath(document.uri)\n ).module;\n\n const inputText = document.getText(range);\n\n const vlsFormatConfig = env.getConfig().vetur.format as VLSFormatConfig;\n const tabStopChar = vlsFormatConfig.options.useTabs ? '\\t' : ' '.repeat(vlsFormatConfig.options.tabSize);\n\n // Note that this would have been `document.eol` ideally\n const newLineChar = inputText.includes('\\r\\n') ? '\\r\\n' : '\\n';\n\n // Determine the base indentation for the multi-line Stylus content\n let baseIndent = '';\n if (range.start.line !== range.end.line) {\n const styleTagLine = document.getText().split(/\\r?\\n/)[range.start.line];\n if (styleTagLine) {\n baseIndent = _.get(styleTagLine.match(/^(\\t|\\s)+/), '0', '');\n }\n }\n\n // Add one more indentation when `vetur.format.styleInitialIndent` is set to `true`\n if (env.getConfig().vetur.format.scriptInitialIndent) {\n baseIndent += tabStopChar;\n }\n\n // Build the formatting options for Stylus Supremacy\n // See https://thisismanta.github.io/stylus-supremacy/#options\n const stylusSupremacyFormattingOptions = stylusSupremacy.createFormattingOptions(\n env.getConfig().stylusSupremacy || {}\n );\n\n // read .stylintrc file if it exists and give it priority over VS Code settings\n const stylintrcPath = path.join(env.getProjectRoot(), '.stylintrc');\n let stylusStylintOptions = {};\n if (fs.existsSync(stylintrcPath)) {\n try {\n const stylintOptions = JSON.parse(fs.readFileSync(stylintrcPath, 'utf-8'));\n stylusStylintOptions = stylusSupremacy.createFormattingOptionsFromStylint(stylintOptions);\n } catch (err) {\n console.error(err);\n }\n }\n\n const formattingOptions = {\n ...stylusSupremacyFormattingOptions,\n ...stylusStylintOptions,\n tabStopChar,\n newLineChar: '\\n'\n };\n\n const formattedText = stylusSupremacy.format(inputText, formattingOptions);\n\n // Add the base indentation and correct the new line characters\n const outputText = formattedText\n .split(/\\n/)\n .map(line => (line.length > 0 ? baseIndent + line : ''))\n .join(newLineChar);\n\n return [TextEdit.replace(range, outputText)];\n }\n };\n}\n\nexport const wordPattern = /(#?-?\\d*\\.\\d\\w*%?)|([$@#!.:]?[\\w-?]+%?)|[$@#!.]/g;\n", "import { CompletionItem, CompletionItemKind, Position, CompletionList } from 'vscode-languageserver-types';\nimport type { TextDocument } from 'vscode-languageserver-textdocument';\n\nimport {\n StylusNode,\n buildAst,\n flattenAndFilterAst,\n findNodeAtPosition,\n isFunctionNode,\n isSelectorCallNode,\n isSelectorNode,\n isVariableNode\n} from './parser';\n\nimport { cssData, LoadedCSSData } from './css-browser-data';\nimport builtIn from './built-in';\nimport _ from 'lodash';\n\nfunction prepareName(name: string): string {\n return name.replace(/\\{|\\}/g, '').trim();\n}\n\n/**\n * Naive check whether currentWord is class or id\n * @param {String} currentWord\n * @return {Boolean}\n */\nexport function isClassOrId(currentWord: string): boolean {\n return /^[.#&]/.test(currentWord);\n}\n\n/**\n * Naive check whether currentWord is at rule\n * @param {String} currentWord\n * @return {Boolean}\n */\nexport function isAtRule(currentWord: string): boolean {\n return _.startsWith(currentWord, '@');\n}\n\n/**\n * Naive check whether currentWord is value for given property\n * @param {Object} data\n * @param {String} currentWord\n * @return {Boolean}\n */\nexport function isValue(data: LoadedCSSData, currentWord: string): boolean {\n const property = getPropertyName(currentWord);\n\n return !!property && Boolean(findPropertySchema(data, property));\n}\n\n/**\n * Formats property name\n * @param {String} currentWord\n * @return {String}\n */\nexport function getPropertyName(currentWord: string): string {\n return currentWord.trim().replace(':', ' ').split(' ')[0];\n}\n\n/**\n * Search for property in cssSchema\n * @param {Object} data\n * @param {String} property\n * @return {Object}\n */\nexport function findPropertySchema(data: LoadedCSSData, property: string) {\n return _.find(data.properties, item => item.name === property);\n}\n\n/**\n * Handler for variables\n * @param {Object} node\n * @param {String[]} text - text editor content splitted by lines\n * @return {SymbolInformation}\n */\nfunction _variableSymbol(node: StylusNode, text: string[], currentWord: string): CompletionItem {\n const name = node.name;\n const lineno = Number(node.val!.lineno!) - 1;\n\n const completionItem = CompletionItem.create(name);\n completionItem.detail = text[lineno].trim();\n completionItem.kind = CompletionItemKind.Variable;\n\n return completionItem;\n}\n\n/**\n * Handler for function\n * @param {Object} node\n * @param {String[]} text - text editor content splitted by lines\n * @return {CompletionItem}\n */\nfunction _functionSymbol(node: StylusNode, text: string[]): CompletionItem {\n const name = node.name;\n\n const completionItem = CompletionItem.create(name);\n completionItem.kind = CompletionItemKind.Function;\n\n return completionItem;\n}\n\n/**\n * Handler for selectors\n * @param {Object} node\n * @param {String[]} text - text editor content splitted by lines\n * @param {String} currentWord\n * @return {CompletionItem}\n */\nfunction _selectorSymbol(node: StylusNode, text: string[], currentWord: string): CompletionItem {\n const firstSegment = node.segments[0];\n const name = firstSegment.string\n ? node.segments!.map(s => s.string).join('')\n : firstSegment.nodes!.map(s => s.name).join('');\n\n const completionItem = CompletionItem.create(name);\n completionItem.kind = CompletionItemKind.Class;\n\n return completionItem;\n}\n\n/**\n * Handler for selector call symbols\n * @param {Object} node\n * @param {String[]} text - text editor content splitted by lines\n * @return {CompletionItem}\n */\nfunction _selectorCallSymbol(node: StylusNode, text: string[]): CompletionItem {\n const lineno = Number(node.lineno) - 1;\n const name = prepareName(text[lineno]);\n\n const completionItem = CompletionItem.create(name);\n completionItem.kind = CompletionItemKind.Class;\n\n return completionItem;\n}\n\nfunction isVisible(useSite: number[] | undefined, defSite: number[] | undefined) {\n if (!useSite || !defSite) {\n return true;\n }\n if (useSite.length < defSite.length) {\n return false;\n }\n for (const [use, def] of _.zip(useSite!, defSite)) {\n if (use && def && use > def) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Returns completion items lists from document symbols\n * @param {String} text\n * @param {String} currentWord\n * @return {CompletionItem}\n */\nexport function getAllSymbols(text: string, currentWord: string, position: Position): CompletionItem[] {\n const ast = buildAst(text);\n if (!ast) {\n return [];\n }\n const node = findNodeAtPosition(ast, position);\n const scope = node ? node.__scope : undefined;\n const splittedText = text.split('\\n');\n const rawSymbols = flattenAndFilterAst(ast).filter(\n item => ['Media', 'Keyframes', 'Atrule', 'Import', 'Require', 'Supports', 'Literal'].indexOf(item.__type) === -1\n );\n\n return _.compact(\n rawSymbols.map(item => {\n if (!isVisible(scope, item.__scope)) {\n return undefined;\n }\n if (isVariableNode(item)) {\n return _variableSymbol(item, splittedText, currentWord);\n }\n\n if (isFunctionNode(item)) {\n return _functionSymbol(item, splittedText);\n }\n\n if (isSelectorNode(item)) {\n return _selectorSymbol(item, splittedText, currentWord);\n }\n\n if (isSelectorCallNode(item)) {\n return _selectorCallSymbol(item, splittedText);\n }\n })\n );\n}\n\n/**\n * Returns at rules list for completion\n * @param {Object} data\n * @param {String} currentWord\n * @return {CompletionItem}\n */\nexport function getAtRules(data: LoadedCSSData, currentWord: string): CompletionItem[] {\n if (!isAtRule(currentWord)) {\n return [];\n }\n\n return data.atDirectives.map(property => {\n const completionItem = CompletionItem.create(property.name);\n\n completionItem.documentation = property.description;\n completionItem.kind = CompletionItemKind.Keyword;\n\n return completionItem;\n });\n}\n\n/**\n * Returns property list for completion\n * @param {Object} data\n * @param {String} currentWord\n * @return {CompletionItem}\n */\nexport function getProperties(data: LoadedCSSData, currentWord: string, useSeparator: boolean): CompletionItem[] {\n if (isClassOrId(currentWord) || isAtRule(currentWord)) {\n return [];\n }\n\n return data.properties.map(property => {\n const completionItem = CompletionItem.create(property.name);\n\n completionItem.insertText = property.name + (useSeparator ? ': ' : ' ');\n completionItem.documentation = property.description;\n completionItem.kind = CompletionItemKind.Property;\n\n return completionItem;\n });\n}\n\n/**\n * Returns values for current property for completion list\n * @param {Object} data\n * @param {String} currentWord\n * @return {CompletionItem}\n */\nexport function getValues(data: LoadedCSSData, currentWord: string): CompletionItem[] {\n const property = getPropertyName(currentWord);\n const result = findPropertySchema(data, property);\n const values = result && result.values;\n\n if (!values) {\n return [];\n }\n\n return values.map(property => {\n const completionItem = CompletionItem.create(property.name);\n\n completionItem.documentation = property.description;\n completionItem.kind = CompletionItemKind.Value;\n\n return completionItem;\n });\n}\n\nexport function provideCompletionItems(\n document: TextDocument,\n position: Position,\n useSeparator = false\n): CompletionList {\n const start = document.offsetAt(Position.create(position.line, 0));\n const end = document.offsetAt(position);\n const text = document.getText();\n const currentWord = text.slice(start, end).trim();\n const value = isValue(cssData, currentWord);\n\n let completions: CompletionItem[] = [];\n\n if (value) {\n const values = getValues(cssData, currentWord);\n const symbols = getAllSymbols(text, currentWord, position).filter(\n item => item.kind === CompletionItemKind.Variable || item.kind === CompletionItemKind.Function\n );\n completions = completions.concat(values, symbols, builtIn);\n } else {\n const atRules = getAtRules(cssData, currentWord);\n const properties = getProperties(cssData, currentWord, useSeparator);\n const symbols = getAllSymbols(text, currentWord, position).filter(\n item => item.kind !== CompletionItemKind.Variable\n );\n completions = completions.concat(properties, atRules, symbols);\n }\n return {\n isIncomplete: false,\n items: completions\n };\n}\n", "const cssColors = [\n 'aliceblue',\n 'antiquewhite',\n 'aqua',\n 'aquamarine',\n 'azure',\n 'beige',\n 'bisque',\n 'black',\n 'blanchedalmond',\n 'blue',\n 'blueviolet',\n 'brown',\n 'burlywood',\n 'cadetblue',\n 'chartreuse',\n 'chocolate',\n 'coral',\n 'cornflowerblue',\n 'cornsilk',\n 'crimson',\n 'cyan',\n 'darkblue',\n 'darkcyan',\n 'darkgoldenrod',\n 'darkgray',\n 'darkgrey',\n 'darkgreen',\n 'darkkhaki',\n 'darkmagenta',\n 'darkolivegreen',\n 'darkorange',\n 'darkorchid',\n 'darkred',\n 'darksalmon',\n 'darkseagreen',\n 'darkslateblue',\n 'darkslategray',\n 'darkslategrey',\n 'darkturquoise',\n 'darkviolet',\n 'deeppink',\n 'deepskyblue',\n 'dimgray',\n 'dimgrey',\n 'dodgerblue',\n 'firebrick',\n 'floralwhite',\n 'forestgreen',\n 'fuchsia',\n 'gainsboro',\n 'ghostwhite',\n 'gold',\n 'goldenrod',\n 'gray',\n 'grey',\n 'green',\n 'greenyellow',\n 'honeydew',\n 'hotpink',\n 'indianred',\n 'indigo',\n 'ivory',\n 'khaki',\n 'lavender',\n 'lavenderblush',\n 'lawngreen',\n 'lemonchiffon',\n 'lightblue',\n 'lightcoral',\n 'lightcyan',\n 'lightgoldenrodyellow',\n 'lightgray',\n 'lightgrey',\n 'lightgreen',\n 'lightpink',\n 'lightsalmon',\n 'lightseagreen',\n 'lightskyblue',\n 'lightslategray',\n 'lightslategrey',\n 'lightsteelblue',\n 'lightyellow',\n 'lime',\n 'limegreen',\n 'linen',\n 'magenta',\n 'maroon',\n 'mediumaquamarine',\n 'mediumblue',\n 'mediumorchid',\n 'mediumpurple',\n 'mediumseagreen',\n 'mediumslateblue',\n 'mediumspringgreen',\n 'mediumturquoise',\n 'mediumvioletred',\n 'midnightblue',\n 'mintcream',\n 'mistyrose',\n 'moccasin',\n 'navajowhite',\n 'navy',\n 'oldlace',\n 'olive',\n 'olivedrab',\n 'orange',\n 'orangered',\n 'orchid',\n 'palegoldenrod',\n 'palegreen',\n 'paleturquoise',\n 'palevioletred',\n 'papayawhip',\n 'peachpuff',\n 'peru',\n 'pink',\n 'plum',\n 'powderblue',\n 'purple',\n 'red',\n 'rebeccapurple',\n 'rosybrown',\n 'royalblue',\n 'saddlebrown',\n 'salmon',\n 'sandybrown',\n 'seagreen',\n 'seashell',\n 'sienna',\n 'silver',\n 'skyblue',\n 'slateblue',\n 'slategray',\n 'slategrey',\n 'snow',\n 'springgreen',\n 'steelblue',\n 'tan',\n 'teal',\n 'thistle',\n 'tomato',\n 'turquoise',\n 'violet',\n 'wheat',\n 'white',\n 'whitesmoke',\n 'yellow',\n 'yellowgreen'\n];\n\nexport default cssColors;\n", "import cssColors from './css-colors-list';\nimport { Position } from 'vscode-languageserver-types';\nimport stylus from 'stylus';\n\ntype NodeName =\n | 'Ident'\n | 'Selector'\n | 'Call'\n | 'Function'\n | 'Media'\n | 'Keyframes'\n | 'Atrule'\n | 'Import'\n | 'Require'\n | 'Supports'\n | 'Literal'\n | 'Group'\n | 'Root'\n | 'Block'\n | 'Expression'\n | 'Rgba'\n | 'Property'\n | 'Object';\n\nexport interface StylusNode {\n __type: NodeName;\n name: NodeName;\n lineno: number;\n column: number;\n segments: StylusNode[];\n expr?: StylusNode;\n val?: StylusNode;\n nodes?: StylusNode[];\n vals?: StylusNode[];\n block?: StylusNode;\n __scope?: number[];\n string?: string;\n}\n\n/**\n * Checks wether node is variable declaration\n * @param {StylusNode} node\n * @return {Boolean}\n */\nexport function isVariableNode(node: StylusNode): boolean {\n return node.__type === 'Ident' && !!node.val && node.val.__type === 'Expression';\n}\n\n/**\n * Checks wether node is function declaration\n * @param {StylusNode} node\n * @return {Boolean}\n */\nexport function isFunctionNode(node: StylusNode): boolean {\n return node.__type === 'Ident' && !!node.val && node.val.__type === 'Function';\n}\n\n/**\n * Checks wether node is selector node\n * @param {StylusNode} node\n * @return {Boolean}\n */\nexport function isSelectorNode(node: StylusNode): boolean {\n return node.__type === 'Selector';\n}\n\n/**\n * Checks wether node is selector call node e.g.:\n * {mySelectors}\n * @param {StylusNode} node\n * @return {Boolean}\n */\nexport function isSelectorCallNode(node: StylusNode): boolean {\n return node.__type === 'Call' && node.name === 'Selector';\n}\n\n/**\n * Checks wether node is at rule\n * @param {StylusNode} node\n * @return {Boolean}\n */\nexport function isAtRuleNode(node: StylusNode): boolean {\n return ['Media', 'Keyframes', 'Atrule', 'Import', 'Require', 'Supports', 'Literal'].indexOf(node.__type) !== -1;\n}\n\n/**\n * Checks wether node contains color\n * @param {StylusNode} node\n * @return {Boolean}\n */\nexport function isColor(node: StylusNode): boolean {\n if (node.__type === 'Ident' && cssColors.indexOf(node.name) >= 0) {\n return true;\n }\n if (node.__type === 'Rgba') {\n return true;\n }\n if (node.__type === 'Call' && ['rgb', 'rgba', 'hsl', 'hsla'].indexOf(node.name) >= 0) {\n return true;\n }\n return false;\n}\n\n/**\n * Parses text editor content and returns ast\n * @param {string} text - text editor content\n * @return {Object}\n */\nexport function buildAst(text: string): StylusNode | null {\n try {\n const root = new stylus.Parser(text).parse();\n // root is read only\n const ret = JSON.parse(JSON.stringify(root.toJSON()));\n addScope(ret, 0, []);\n return ret;\n } catch (error) {\n console.error((error as Error).stack);\n return null;\n }\n}\n\n/**\n * Add scope info to ast\n * @param {StylusNode} root the stylus node\n * @param {number} seq the order in parent node's children list, used as scope path segment\n * @param {number[]} scope represented as path from root ast, each path segment is seq number\n */\nfunction addScope(root: StylusNode, seq: number, scope: number[]) {\n if (!root || typeof root !== 'object') {\n return;\n }\n root.__scope = scope;\n if (root.block) {\n const vals = root.block.nodes || [];\n for (let i = 0, l = vals.length; i < l; i++) {\n addScope(vals[i], i, scope.concat(seq));\n }\n }\n if (root.vals) {\n const vals = root.vals;\n for (let i = 0, l = vals.length; i < l; i++) {\n addScope(vals[i], i, scope.concat());\n }\n }\n if (root.segments) {\n for (const seg of root.segments) {\n addScope(seg, seq, scope.concat());\n }\n }\n if (root.expr) {\n addScope(root.expr, seq, scope.concat());\n }\n if (root.nodes) {\n const vals = root.nodes;\n for (let i = 0, l = vals.length; i < l; i++) {\n addScope(vals[i], i, scope.concat());\n }\n }\n if (root.val) {\n addScope(root.val, seq, scope.concat());\n }\n}\n\n/**\n * Flattens ast and removes useless nodes\n * @param {StylusNode} node\n * @return {Array}\n */\nexport function flattenAndFilterAst(node: StylusNode, scope: number[] = []): StylusNode[] {\n if (!node.__type) {\n return [];\n }\n (node as any)['scope'] = scope;\n\n let nested = [node];\n\n if (node.nodes) {\n let i = 0;\n for (const child of node.nodes) {\n const newScope = scope.concat(i++);\n nested = nested.concat(flattenAndFilterAst(child, newScope));\n }\n }\n\n if (node.block) {\n nested = nested.concat(flattenAndFilterAst(node.block, scope));\n }\n\n return nested;\n}\n\nexport function findNodeAtPosition(root: StylusNode, pos: Position, needBlock = false): StylusNode | null {\n // DFS: first find leaf node\n const block = root.block;\n let children: StylusNode[] = [];\n if (block) {\n children = [block]; //needBlock ? [block] : (block.nodes || [])\n }\n if (root.vals) {\n children = children.concat(root.vals);\n }\n if (root.expr) {\n children = children.concat(root.expr.nodes || []);\n }\n if (root.nodes) {\n children = children.concat(root.nodes);\n }\n if (root.val) {\n children.push(root.val);\n }\n for (const child of children) {\n const ret = findNodeAtPosition(child, pos);\n if (ret) {\n return ret;\n }\n }\n if (root.__type === 'Function' && root.lineno === pos.line + 1) {\n return root; // function node column is inconsisten, ignore\n }\n if (root.lineno !== pos.line + 1 || root.column > pos.character + 1) {\n // not in oneline, or root has passed pos\n return null;\n }\n return root;\n}\n", "{\n \"version\": 1.1,\n \"properties\": [\n {\n \"name\": \"additive-symbols\",\n \"browsers\": [\n \"FF33\"\n ],\n \"syntax\": \"[ <integer> && <symbol> ]#\",\n \"relevance\": 50,\n \"description\": \"@counter-style descriptor. Specifies the symbols used by the marker-construction algorithm specified by the system descriptor. Needs to be specified if the counter system is 'additive'.\",\n \"restrictions\": [\n \"integer\",\n \"string\",\n \"image\",\n \"identifier\"\n ]\n },\n {\n \"name\": \"align-content\",\n \"values\": [\n {\n \"name\": \"center\",\n \"description\": \"Lines are packed toward the center of the flex container.\"\n },\n {\n \"name\": \"flex-end\",\n \"description\": \"Lines are packed toward the end of the flex container.\"\n },\n {\n \"name\": \"flex-start\",\n \"description\": \"Lines are packed toward the start of the flex container.\"\n },\n {\n \"name\": \"space-around\",\n \"description\": \"Lines are evenly distributed in the flex container, with half-size spaces on either end.\"\n },\n {\n \"name\": \"space-between\",\n \"description\": \"Lines are evenly distributed in the flex container.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"Lines stretch to take up the remaining space.\"\n }\n ],\n \"syntax\": \"normal | <baseline-position> | <content-distribution> | <overflow-position>? <content-position>\",\n \"relevance\": 61,\n \"description\": \"Aligns a flex container\u2019s lines within the flex container when there is extra space in the cross-axis, similar to how 'justify-content' aligns individual items within the main-axis.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"align-items\",\n \"values\": [\n {\n \"name\": \"baseline\",\n \"description\": \"If the flex item\u2019s inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment.\"\n },\n {\n \"name\": \"center\",\n \"description\": \"The flex item\u2019s margin box is centered in the cross axis within the line.\"\n },\n {\n \"name\": \"flex-end\",\n \"description\": \"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line.\"\n },\n {\n \"name\": \"flex-start\",\n \"description\": \"The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched.\"\n }\n ],\n \"syntax\": \"normal | stretch | <baseline-position> | [ <overflow-position>? <self-position> ]\",\n \"relevance\": 84,\n \"description\": \"Aligns flex items along the cross axis of the current line of the flex container.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"justify-items\",\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"normal\"\n },\n {\n \"name\": \"end\"\n },\n {\n \"name\": \"start\"\n },\n {\n \"name\": \"flex-end\",\n \"description\": \"\\\"Flex items are packed toward the end of the line.\\\"\"\n },\n {\n \"name\": \"flex-start\",\n \"description\": \"\\\"Flex items are packed toward the start of the line.\\\"\"\n },\n {\n \"name\": \"self-end\",\n \"description\": \"The item is packed flush to the edge of the alignment container of the end side of the item, in the appropriate axis.\"\n },\n {\n \"name\": \"self-start\",\n \"description\": \"The item is packed flush to the edge of the alignment container of the start side of the item, in the appropriate axis..\"\n },\n {\n \"name\": \"center\",\n \"description\": \"The items are packed flush to each other toward the center of the of the alignment container.\"\n },\n {\n \"name\": \"left\"\n },\n {\n \"name\": \"right\"\n },\n {\n \"name\": \"baseline\"\n },\n {\n \"name\": \"first baseline\"\n },\n {\n \"name\": \"last baseline\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched.\"\n },\n {\n \"name\": \"save\"\n },\n {\n \"name\": \"unsave\"\n },\n {\n \"name\": \"legacy\"\n }\n ],\n \"syntax\": \"normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ] | legacy | legacy && [ left | right | center ]\",\n \"relevance\": 51,\n \"description\": \"Defines the default justify-self for all items of the box, giving them the default way of justifying each box along the appropriate axis\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"justify-self\",\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"normal\"\n },\n {\n \"name\": \"end\"\n },\n {\n \"name\": \"start\"\n },\n {\n \"name\": \"flex-end\",\n \"description\": \"\\\"Flex items are packed toward the end of the line.\\\"\"\n },\n {\n \"name\": \"flex-start\",\n \"description\": \"\\\"Flex items are packed toward the start of the line.\\\"\"\n },\n {\n \"name\": \"self-end\",\n \"description\": \"The item is packed flush to the edge of the alignment container of the end side of the item, in the appropriate axis.\"\n },\n {\n \"name\": \"self-start\",\n \"description\": \"The item is packed flush to the edge of the alignment container of the start side of the item, in the appropriate axis..\"\n },\n {\n \"name\": \"center\",\n \"description\": \"The items are packed flush to each other toward the center of the of the alignment container.\"\n },\n {\n \"name\": \"left\"\n },\n {\n \"name\": \"right\"\n },\n {\n \"name\": \"baseline\"\n },\n {\n \"name\": \"first baseline\"\n },\n {\n \"name\": \"last baseline\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched.\"\n },\n {\n \"name\": \"save\"\n },\n {\n \"name\": \"unsave\"\n }\n ],\n \"syntax\": \"auto | normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ]\",\n \"relevance\": 52,\n \"description\": \"Defines the way of justifying a box inside its container along the appropriate axis.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"align-self\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Computes to the value of 'align-items' on the element\u2019s parent, or 'stretch' if the element has no parent. On absolutely positioned elements, it computes to itself.\"\n },\n {\n \"name\": \"baseline\",\n \"description\": \"If the flex item\u2019s inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment.\"\n },\n {\n \"name\": \"center\",\n \"description\": \"The flex item\u2019s margin box is centered in the cross axis within the line.\"\n },\n {\n \"name\": \"flex-end\",\n \"description\": \"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line.\"\n },\n {\n \"name\": \"flex-start\",\n \"description\": \"The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched.\"\n }\n ],\n \"syntax\": \"auto | normal | stretch | <baseline-position> | <overflow-position>? <self-position>\",\n \"relevance\": 71,\n \"description\": \"Allows the default alignment along the cross axis to be overridden for individual flex items.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"all\",\n \"browsers\": [\n \"E79\",\n \"FF27\",\n \"S9.1\",\n \"C37\",\n \"O24\"\n ],\n \"values\": [],\n \"syntax\": \"initial | inherit | unset | revert\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/all\"\n }\n ],\n \"description\": \"Shorthand that resets all properties except 'direction' and 'unicode-bidi'.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"alt\",\n \"browsers\": [\n \"S9\"\n ],\n \"values\": [],\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/alt\"\n }\n ],\n \"description\": \"Provides alternative text for assistive technology to replace the generated content of a ::before or ::after element.\",\n \"restrictions\": [\n \"string\",\n \"enum\"\n ]\n },\n {\n \"name\": \"animation\",\n \"values\": [\n {\n \"name\": \"alternate\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction.\"\n },\n {\n \"name\": \"alternate-reverse\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction.\"\n },\n {\n \"name\": \"backwards\",\n \"description\": \"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'.\"\n },\n {\n \"name\": \"both\",\n \"description\": \"Both forwards and backwards fill modes are applied.\"\n },\n {\n \"name\": \"forwards\",\n \"description\": \"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes.\"\n },\n {\n \"name\": \"infinite\",\n \"description\": \"Causes the animation to repeat forever.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No animation is performed\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Normal playback.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"All iterations of the animation are played in the reverse direction from the way they were specified.\"\n }\n ],\n \"syntax\": \"<single-animation>#\",\n \"relevance\": 81,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/animation\"\n }\n ],\n \"description\": \"Shorthand property combines six of the animation properties into a single property.\",\n \"restrictions\": [\n \"time\",\n \"timing-function\",\n \"enum\",\n \"identifier\",\n \"number\"\n ]\n },\n {\n \"name\": \"animation-delay\",\n \"syntax\": \"<time>#\",\n \"relevance\": 63,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/animation-delay\"\n }\n ],\n \"description\": \"Defines when the animation will start.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"animation-direction\",\n \"values\": [\n {\n \"name\": \"alternate\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction.\"\n },\n {\n \"name\": \"alternate-reverse\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Normal playback.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"All iterations of the animation are played in the reverse direction from the way they were specified.\"\n }\n ],\n \"syntax\": \"<single-animation-direction>#\",\n \"relevance\": 56,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/animation-direction\"\n }\n ],\n \"description\": \"Defines whether or not the animation should play in reverse on alternate cycles.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"animation-duration\",\n \"syntax\": \"<time>#\",\n \"relevance\": 67,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/animation-duration\"\n }\n ],\n \"description\": \"Defines the length of time that an animation takes to complete one cycle.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"animation-fill-mode\",\n \"values\": [\n {\n \"name\": \"backwards\",\n \"description\": \"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'.\"\n },\n {\n \"name\": \"both\",\n \"description\": \"Both forwards and backwards fill modes are applied.\"\n },\n {\n \"name\": \"forwards\",\n \"description\": \"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"There is no change to the property value between the time the animation is applied and the time the animation begins playing or after the animation completes.\"\n }\n ],\n \"syntax\": \"<single-animation-fill-mode>#\",\n \"relevance\": 63,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/animation-fill-mode\"\n }\n ],\n \"description\": \"Defines what values are applied by the animation outside the time it is executing.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"animation-iteration-count\",\n \"values\": [\n {\n \"name\": \"infinite\",\n \"description\": \"Causes the animation to repeat forever.\"\n }\n ],\n \"syntax\": \"<single-animation-iteration-count>#\",\n \"relevance\": 60,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/animation-iteration-count\"\n }\n ],\n \"description\": \"Defines the number of times an animation cycle is played. The default value is one, meaning the animation will play from beginning to end once.\",\n \"restrictions\": [\n \"number\",\n \"enum\"\n ]\n },\n {\n \"name\": \"animation-name\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No animation is performed\"\n }\n ],\n \"syntax\": \"[ none | <keyframes-name> ]#\",\n \"relevance\": 67,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/animation-name\"\n }\n ],\n \"description\": \"Defines a list of animations that apply. Each name is used to select the keyframe at-rule that provides the property values for the animation.\",\n \"restrictions\": [\n \"identifier\",\n \"enum\"\n ]\n },\n {\n \"name\": \"animation-play-state\",\n \"values\": [\n {\n \"name\": \"paused\",\n \"description\": \"A running animation will be paused.\"\n },\n {\n \"name\": \"running\",\n \"description\": \"Resume playback of a paused animation.\"\n }\n ],\n \"syntax\": \"<single-animation-play-state>#\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/animation-play-state\"\n }\n ],\n \"description\": \"Defines whether the animation is running or paused.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"animation-timing-function\",\n \"syntax\": \"<easing-function>#\",\n \"relevance\": 68,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/animation-timing-function\"\n }\n ],\n \"description\": \"Describes how the animation will progress over one cycle of its duration.\",\n \"restrictions\": [\n \"timing-function\"\n ]\n },\n {\n \"name\": \"backface-visibility\",\n \"values\": [\n {\n \"name\": \"hidden\",\n \"description\": \"Back side is hidden.\"\n },\n {\n \"name\": \"visible\",\n \"description\": \"Back side is visible.\"\n }\n ],\n \"syntax\": \"visible | hidden\",\n \"relevance\": 59,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/backface-visibility\"\n }\n ],\n \"description\": \"Determines whether or not the 'back' side of a transformed element is visible when facing the viewer. With an identity transform, the front side of an element faces the viewer.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"background\",\n \"values\": [\n {\n \"name\": \"fixed\",\n \"description\": \"The background is fixed with regard to the viewport. In paged media where there is no viewport, a 'fixed' background is fixed with respect to the page box and therefore replicated on every page.\"\n },\n {\n \"name\": \"local\",\n \"description\": \"The background is fixed with regard to the element's contents: if the element has a scrolling mechanism, the background scrolls with the element's contents.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"A value of 'none' counts as an image layer but draws nothing.\"\n },\n {\n \"name\": \"scroll\",\n \"description\": \"The background is fixed with regard to the element itself and does not scroll with its contents. (It is effectively attached to the element's border.)\"\n }\n ],\n \"syntax\": \"[ <bg-layer> , ]* <final-bg-layer>\",\n \"relevance\": 93,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background\"\n }\n ],\n \"description\": \"Shorthand property for setting most background properties at the same place in the style sheet.\",\n \"restrictions\": [\n \"enum\",\n \"image\",\n \"color\",\n \"position\",\n \"length\",\n \"repeat\",\n \"percentage\",\n \"box\"\n ]\n },\n {\n \"name\": \"background-attachment\",\n \"values\": [\n {\n \"name\": \"fixed\",\n \"description\": \"The background is fixed with regard to the viewport. In paged media where there is no viewport, a 'fixed' background is fixed with respect to the page box and therefore replicated on every page.\"\n },\n {\n \"name\": \"local\",\n \"description\": \"The background is fixed with regard to the element\u2019s contents: if the element has a scrolling mechanism, the background scrolls with the element\u2019s contents.\"\n },\n {\n \"name\": \"scroll\",\n \"description\": \"The background is fixed with regard to the element itself and does not scroll with its contents. (It is effectively attached to the element\u2019s border.)\"\n }\n ],\n \"syntax\": \"<attachment>#\",\n \"relevance\": 54,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-attachment\"\n }\n ],\n \"description\": \"Specifies whether the background images are fixed with regard to the viewport ('fixed') or scroll along with the element ('scroll') or its contents ('local').\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"background-blend-mode\",\n \"browsers\": [\n \"E79\",\n \"FF30\",\n \"S8\",\n \"C35\",\n \"O22\"\n ],\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"Default attribute which specifies no blending\"\n },\n {\n \"name\": \"multiply\",\n \"description\": \"The source color is multiplied by the destination color and replaces the destination.\"\n },\n {\n \"name\": \"screen\",\n \"description\": \"Multiplies the complements of the backdrop and source color values, then complements the result.\"\n },\n {\n \"name\": \"overlay\",\n \"description\": \"Multiplies or screens the colors, depending on the backdrop color value.\"\n },\n {\n \"name\": \"darken\",\n \"description\": \"Selects the darker of the backdrop and source colors.\"\n },\n {\n \"name\": \"lighten\",\n \"description\": \"Selects the lighter of the backdrop and source colors.\"\n },\n {\n \"name\": \"color-dodge\",\n \"description\": \"Brightens the backdrop color to reflect the source color.\"\n },\n {\n \"name\": \"color-burn\",\n \"description\": \"Darkens the backdrop color to reflect the source color.\"\n },\n {\n \"name\": \"hard-light\",\n \"description\": \"Multiplies or screens the colors, depending on the source color value.\"\n },\n {\n \"name\": \"soft-light\",\n \"description\": \"Darkens or lightens the colors, depending on the source color value.\"\n },\n {\n \"name\": \"difference\",\n \"description\": \"Subtracts the darker of the two constituent colors from the lighter color..\"\n },\n {\n \"name\": \"exclusion\",\n \"description\": \"Produces an effect similar to that of the Difference mode but lower in contrast.\"\n },\n {\n \"name\": \"hue\",\n \"browsers\": [\n \"E79\",\n \"FF30\",\n \"S8\",\n \"C35\",\n \"O22\"\n ],\n \"description\": \"Creates a color with the hue of the source color and the saturation and luminosity of the backdrop color.\"\n },\n {\n \"name\": \"saturation\",\n \"browsers\": [\n \"E79\",\n \"FF30\",\n \"S8\",\n \"C35\",\n \"O22\"\n ],\n \"description\": \"Creates a color with the saturation of the source color and the hue and luminosity of the backdrop color.\"\n },\n {\n \"name\": \"color\",\n \"browsers\": [\n \"E79\",\n \"FF30\",\n \"S8\",\n \"C35\",\n \"O22\"\n ],\n \"description\": \"Creates a color with the hue and saturation of the source color and the luminosity of the backdrop color.\"\n },\n {\n \"name\": \"luminosity\",\n \"browsers\": [\n \"E79\",\n \"FF30\",\n \"S8\",\n \"C35\",\n \"O22\"\n ],\n \"description\": \"Creates a color with the luminosity of the source color and the hue and saturation of the backdrop color.\"\n }\n ],\n \"syntax\": \"<blend-mode>#\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-blend-mode\"\n }\n ],\n \"description\": \"Defines the blending mode of each background layer.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"background-clip\",\n \"syntax\": \"<box>#\",\n \"relevance\": 68,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-clip\"\n }\n ],\n \"description\": \"Determines the background painting area.\",\n \"restrictions\": [\n \"box\"\n ]\n },\n {\n \"name\": \"background-color\",\n \"syntax\": \"<color>\",\n \"relevance\": 94,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-color\"\n }\n ],\n \"description\": \"Sets the background color of an element.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"background-image\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Counts as an image layer but draws nothing.\"\n }\n ],\n \"syntax\": \"<bg-image>#\",\n \"relevance\": 88,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-image\"\n }\n ],\n \"description\": \"Sets the background image(s) of an element.\",\n \"restrictions\": [\n \"image\",\n \"enum\"\n ]\n },\n {\n \"name\": \"background-origin\",\n \"syntax\": \"<box>#\",\n \"relevance\": 54,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-origin\"\n }\n ],\n \"description\": \"For elements rendered as a single box, specifies the background positioning area. For elements rendered as multiple boxes (e.g., inline boxes on several lines, boxes on several pages) specifies which boxes 'box-decoration-break' operates on to determine the background positioning area(s).\",\n \"restrictions\": [\n \"box\"\n ]\n },\n {\n \"name\": \"background-position\",\n \"syntax\": \"<bg-position>#\",\n \"relevance\": 88,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-position\"\n }\n ],\n \"description\": \"Specifies the initial position of the background image(s) (after any resizing) within their corresponding background positioning area.\",\n \"restrictions\": [\n \"position\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"background-position-x\",\n \"values\": [\n {\n \"name\": \"center\",\n \"description\": \"Equivalent to '50%' ('left 50%') for the horizontal position if the horizontal position is not otherwise specified, or '50%' ('top 50%') for the vertical position if it is.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"Equivalent to '0%' for the horizontal position if one or two values are given, otherwise specifies the left edge as the origin for the next offset.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"Equivalent to '100%' for the horizontal position if one or two values are given, otherwise specifies the right edge as the origin for the next offset.\"\n }\n ],\n \"status\": \"experimental\",\n \"syntax\": \"[ center | [ [ left | right | x-start | x-end ]? <length-percentage>? ]! ]#\",\n \"relevance\": 54,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-position-x\"\n }\n ],\n \"description\": \"If background images have been specified, this property specifies their initial position (after any resizing) within their corresponding background positioning area.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"background-position-y\",\n \"values\": [\n {\n \"name\": \"bottom\",\n \"description\": \"Equivalent to '100%' for the vertical position if one or two values are given, otherwise specifies the bottom edge as the origin for the next offset.\"\n },\n {\n \"name\": \"center\",\n \"description\": \"Equivalent to '50%' ('left 50%') for the horizontal position if the horizontal position is not otherwise specified, or '50%' ('top 50%') for the vertical position if it is.\"\n },\n {\n \"name\": \"top\",\n \"description\": \"Equivalent to '0%' for the vertical position if one or two values are given, otherwise specifies the top edge as the origin for the next offset.\"\n }\n ],\n \"status\": \"experimental\",\n \"syntax\": \"[ center | [ [ top | bottom | y-start | y-end ]? <length-percentage>? ]! ]#\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-position-y\"\n }\n ],\n \"description\": \"If background images have been specified, this property specifies their initial position (after any resizing) within their corresponding background positioning area.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"background-repeat\",\n \"values\": [],\n \"syntax\": \"<repeat-style>#\",\n \"relevance\": 85,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-repeat\"\n }\n ],\n \"description\": \"Specifies how background images are tiled after they have been sized and positioned.\",\n \"restrictions\": [\n \"repeat\"\n ]\n },\n {\n \"name\": \"background-size\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Resolved by using the image\u2019s intrinsic ratio and the size of the other dimension, or failing that, using the image\u2019s intrinsic size, or failing that, treating it as 100%.\"\n },\n {\n \"name\": \"contain\",\n \"description\": \"Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest size such that both its width and its height can fit inside the background positioning area.\"\n },\n {\n \"name\": \"cover\",\n \"description\": \"Scale the image, while preserving its intrinsic aspect ratio (if any), to the smallest size such that both its width and its height can completely cover the background positioning area.\"\n }\n ],\n \"syntax\": \"<bg-size>#\",\n \"relevance\": 86,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/background-size\"\n }\n ],\n \"description\": \"Specifies the size of the background images.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"behavior\",\n \"browsers\": [\n \"IE6\"\n ],\n \"relevance\": 50,\n \"description\": \"IE only. Used to extend behaviors of the browser.\",\n \"restrictions\": [\n \"url\"\n ]\n },\n {\n \"name\": \"block-size\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Depends on the values of other properties.\"\n }\n ],\n \"syntax\": \"<'width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/block-size\"\n }\n ],\n \"description\": \"Size of an element in the direction opposite that of the direction specified by 'writing-mode'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"border\",\n \"syntax\": \"<line-width> || <line-style> || <color>\",\n \"relevance\": 96,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border\"\n }\n ],\n \"description\": \"Shorthand property for setting border width, style, and color.\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"border-block-end\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-width'> || <'border-top-style'> || <color>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-end\"\n }\n ],\n \"description\": \"Logical 'border-bottom'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"border-block-start\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-width'> || <'border-top-style'> || <color>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-start\"\n }\n ],\n \"description\": \"Logical 'border-top'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"border-block-end-color\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-color'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-end-color\"\n }\n ],\n \"description\": \"Logical 'border-bottom-color'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"border-block-start-color\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-color'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-start-color\"\n }\n ],\n \"description\": \"Logical 'border-top-color'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"border-block-end-style\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-style'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-end-style\"\n }\n ],\n \"description\": \"Logical 'border-bottom-style'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"border-block-start-style\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-style'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-start-style\"\n }\n ],\n \"description\": \"Logical 'border-top-style'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"border-block-end-width\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-end-width\"\n }\n ],\n \"description\": \"Logical 'border-bottom-width'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"border-block-start-width\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-start-width\"\n }\n ],\n \"description\": \"Logical 'border-top-width'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"border-bottom\",\n \"syntax\": \"<line-width> || <line-style> || <color>\",\n \"relevance\": 89,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-bottom\"\n }\n ],\n \"description\": \"Shorthand property for setting border width, style and color.\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"border-bottom-color\",\n \"syntax\": \"<'border-top-color'>\",\n \"relevance\": 70,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-bottom-color\"\n }\n ],\n \"description\": \"Sets the color of the bottom border.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"border-bottom-left-radius\",\n \"syntax\": \"<length-percentage>{1,2}\",\n \"relevance\": 74,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-bottom-left-radius\"\n }\n ],\n \"description\": \"Defines the radii of the bottom left outer border edge.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"border-bottom-right-radius\",\n \"syntax\": \"<length-percentage>{1,2}\",\n \"relevance\": 74,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-bottom-right-radius\"\n }\n ],\n \"description\": \"Defines the radii of the bottom right outer border edge.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"border-bottom-style\",\n \"syntax\": \"<line-style>\",\n \"relevance\": 58,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-bottom-style\"\n }\n ],\n \"description\": \"Sets the style of the bottom border.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"border-bottom-width\",\n \"syntax\": \"<line-width>\",\n \"relevance\": 62,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-bottom-width\"\n }\n ],\n \"description\": \"Sets the thickness of the bottom border.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"border-collapse\",\n \"values\": [\n {\n \"name\": \"collapse\",\n \"description\": \"Selects the collapsing borders model.\"\n },\n {\n \"name\": \"separate\",\n \"description\": \"Selects the separated borders border model.\"\n }\n ],\n \"syntax\": \"collapse | separate\",\n \"relevance\": 75,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-collapse\"\n }\n ],\n \"description\": \"Selects a table's border model.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"border-color\",\n \"values\": [],\n \"syntax\": \"<color>{1,4}\",\n \"relevance\": 86,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-color\"\n }\n ],\n \"description\": \"The color of the border around all four edges of an element.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"border-image\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"If 'auto' is specified then the border image width is the intrinsic width or height (whichever is applicable) of the corresponding image slice. If the image does not have the required intrinsic dimension then the corresponding border-width is used instead.\"\n },\n {\n \"name\": \"fill\",\n \"description\": \"Causes the middle part of the border-image to be preserved.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Use the border styles.\"\n },\n {\n \"name\": \"repeat\",\n \"description\": \"The image is tiled (repeated) to fill the area.\"\n },\n {\n \"name\": \"round\",\n \"description\": \"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the image is rescaled so that it does.\"\n },\n {\n \"name\": \"space\",\n \"description\": \"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the extra space is distributed around the tiles.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"The image is stretched to fill the area.\"\n },\n {\n \"name\": \"url()\"\n }\n ],\n \"syntax\": \"<'border-image-source'> || <'border-image-slice'> [ / <'border-image-width'> | / <'border-image-width'>? / <'border-image-outset'> ]? || <'border-image-repeat'>\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-image\"\n }\n ],\n \"description\": \"Shorthand property for setting 'border-image-source', 'border-image-slice', 'border-image-width', 'border-image-outset' and 'border-image-repeat'. Omitted values are set to their initial values.\",\n \"restrictions\": [\n \"length\",\n \"percentage\",\n \"number\",\n \"url\",\n \"enum\"\n ]\n },\n {\n \"name\": \"border-image-outset\",\n \"syntax\": \"[ <length> | <number> ]{1,4}\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-image-outset\"\n }\n ],\n \"description\": \"The values specify the amount by which the border image area extends beyond the border box on the top, right, bottom, and left sides respectively. If the fourth value is absent, it is the same as the second. If the third one is also absent, it is the same as the first. If the second one is also absent, it is the same as the first. Numbers represent multiples of the corresponding border-width.\",\n \"restrictions\": [\n \"length\",\n \"number\"\n ]\n },\n {\n \"name\": \"border-image-repeat\",\n \"values\": [\n {\n \"name\": \"repeat\",\n \"description\": \"The image is tiled (repeated) to fill the area.\"\n },\n {\n \"name\": \"round\",\n \"description\": \"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the image is rescaled so that it does.\"\n },\n {\n \"name\": \"space\",\n \"description\": \"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the extra space is distributed around the tiles.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"The image is stretched to fill the area.\"\n }\n ],\n \"syntax\": \"[ stretch | repeat | round | space ]{1,2}\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-image-repeat\"\n }\n ],\n \"description\": \"Specifies how the images for the sides and the middle part of the border image are scaled and tiled. If the second keyword is absent, it is assumed to be the same as the first.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"border-image-slice\",\n \"values\": [\n {\n \"name\": \"fill\",\n \"description\": \"Causes the middle part of the border-image to be preserved.\"\n }\n ],\n \"syntax\": \"<number-percentage>{1,4} && fill?\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-image-slice\"\n }\n ],\n \"description\": \"Specifies inward offsets from the top, right, bottom, and left edges of the image, dividing it into nine regions: four corners, four edges and a middle.\",\n \"restrictions\": [\n \"number\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"border-image-source\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Use the border styles.\"\n }\n ],\n \"syntax\": \"none | <image>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-image-source\"\n }\n ],\n \"description\": \"Specifies an image to use instead of the border styles given by the 'border-style' properties and as an additional background layer for the element. If the value is 'none' or if the image cannot be displayed, the border styles will be used.\",\n \"restrictions\": [\n \"image\"\n ]\n },\n {\n \"name\": \"border-image-width\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The border image width is the intrinsic width or height (whichever is applicable) of the corresponding image slice. If the image does not have the required intrinsic dimension then the corresponding border-width is used instead.\"\n }\n ],\n \"syntax\": \"[ <length-percentage> | <number> | auto ]{1,4}\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-image-width\"\n }\n ],\n \"description\": \"The four values of 'border-image-width' specify offsets that are used to divide the border image area into nine parts. They represent inward distances from the top, right, bottom, and left sides of the area, respectively.\",\n \"restrictions\": [\n \"length\",\n \"percentage\",\n \"number\"\n ]\n },\n {\n \"name\": \"border-inline-end\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-width'> || <'border-top-style'> || <color>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-end\"\n }\n ],\n \"description\": \"Logical 'border-right'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"border-inline-start\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-width'> || <'border-top-style'> || <color>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-start\"\n }\n ],\n \"description\": \"Logical 'border-left'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"border-inline-end-color\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-color'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-end-color\"\n }\n ],\n \"description\": \"Logical 'border-right-color'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"border-inline-start-color\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-color'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-start-color\"\n }\n ],\n \"description\": \"Logical 'border-left-color'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"border-inline-end-style\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-style'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-end-style\"\n }\n ],\n \"description\": \"Logical 'border-right-style'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"border-inline-start-style\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-style'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-start-style\"\n }\n ],\n \"description\": \"Logical 'border-left-style'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"border-inline-end-width\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-end-width\"\n }\n ],\n \"description\": \"Logical 'border-right-width'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"border-inline-start-width\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'border-top-width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-start-width\"\n }\n ],\n \"description\": \"Logical 'border-left-width'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"border-left\",\n \"syntax\": \"<line-width> || <line-style> || <color>\",\n \"relevance\": 82,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-left\"\n }\n ],\n \"description\": \"Shorthand property for setting border width, style and color\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"border-left-color\",\n \"syntax\": \"<color>\",\n \"relevance\": 65,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-left-color\"\n }\n ],\n \"description\": \"Sets the color of the left border.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"border-left-style\",\n \"syntax\": \"<line-style>\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-left-style\"\n }\n ],\n \"description\": \"Sets the style of the left border.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"border-left-width\",\n \"syntax\": \"<line-width>\",\n \"relevance\": 58,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-left-width\"\n }\n ],\n \"description\": \"Sets the thickness of the left border.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"border-radius\",\n \"syntax\": \"<length-percentage>{1,4} [ / <length-percentage>{1,4} ]?\",\n \"relevance\": 92,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-radius\"\n }\n ],\n \"description\": \"Defines the radii of the outer border edge.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"border-right\",\n \"syntax\": \"<line-width> || <line-style> || <color>\",\n \"relevance\": 81,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-right\"\n }\n ],\n \"description\": \"Shorthand property for setting border width, style and color\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"border-right-color\",\n \"syntax\": \"<color>\",\n \"relevance\": 64,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-right-color\"\n }\n ],\n \"description\": \"Sets the color of the right border.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"border-right-style\",\n \"syntax\": \"<line-style>\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-right-style\"\n }\n ],\n \"description\": \"Sets the style of the right border.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"border-right-width\",\n \"syntax\": \"<line-width>\",\n \"relevance\": 59,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-right-width\"\n }\n ],\n \"description\": \"Sets the thickness of the right border.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"border-spacing\",\n \"syntax\": \"<length> <length>?\",\n \"relevance\": 68,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-spacing\"\n }\n ],\n \"description\": \"The lengths specify the distance that separates adjoining cell borders. If one length is specified, it gives both the horizontal and vertical spacing. If two are specified, the first gives the horizontal spacing and the second the vertical spacing. Lengths may not be negative.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"border-style\",\n \"values\": [],\n \"syntax\": \"<line-style>{1,4}\",\n \"relevance\": 80,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-style\"\n }\n ],\n \"description\": \"The style of the border around edges of an element.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"border-top\",\n \"syntax\": \"<line-width> || <line-style> || <color>\",\n \"relevance\": 88,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-top\"\n }\n ],\n \"description\": \"Shorthand property for setting border width, style and color\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"border-top-color\",\n \"syntax\": \"<color>\",\n \"relevance\": 71,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-top-color\"\n }\n ],\n \"description\": \"Sets the color of the top border.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"border-top-left-radius\",\n \"syntax\": \"<length-percentage>{1,2}\",\n \"relevance\": 74,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-top-left-radius\"\n }\n ],\n \"description\": \"Defines the radii of the top left outer border edge.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"border-top-right-radius\",\n \"syntax\": \"<length-percentage>{1,2}\",\n \"relevance\": 74,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-top-right-radius\"\n }\n ],\n \"description\": \"Defines the radii of the top right outer border edge.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"border-top-style\",\n \"syntax\": \"<line-style>\",\n \"relevance\": 58,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-top-style\"\n }\n ],\n \"description\": \"Sets the style of the top border.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"border-top-width\",\n \"syntax\": \"<line-width>\",\n \"relevance\": 60,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-top-width\"\n }\n ],\n \"description\": \"Sets the thickness of the top border.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"border-width\",\n \"values\": [],\n \"syntax\": \"<line-width>{1,4}\",\n \"relevance\": 81,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-width\"\n }\n ],\n \"description\": \"Shorthand that sets the four 'border-*-width' properties. If it has four values, they set top, right, bottom and left in that order. If left is missing, it is the same as right; if bottom is missing, it is the same as top; if right is missing, it is the same as top.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"bottom\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well\"\n }\n ],\n \"syntax\": \"<length> | <percentage> | auto\",\n \"relevance\": 90,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/bottom\"\n }\n ],\n \"description\": \"Specifies how far an absolutely positioned box's bottom margin edge is offset above the bottom edge of the box's 'containing block'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"box-decoration-break\",\n \"browsers\": [\n \"E79\",\n \"FF32\",\n \"S7\",\n \"C22\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"clone\",\n \"description\": \"Each box is independently wrapped with the border and padding.\"\n },\n {\n \"name\": \"slice\",\n \"description\": \"The effect is as though the element were rendered with no breaks present, and then sliced by the breaks afterward.\"\n }\n ],\n \"syntax\": \"slice | clone\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-decoration-break\"\n }\n ],\n \"description\": \"Specifies whether individual boxes are treated as broken pieces of one continuous box, or whether each box is individually wrapped with the border and padding.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"box-shadow\",\n \"values\": [\n {\n \"name\": \"inset\",\n \"description\": \"Changes the drop shadow from an outer shadow (one that shadows the box onto the canvas, as if it were lifted above the canvas) to an inner shadow (one that shadows the canvas onto the box, as if the box were cut out of the canvas and shifted behind it).\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No shadow.\"\n }\n ],\n \"syntax\": \"none | <shadow>#\",\n \"relevance\": 90,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-shadow\"\n }\n ],\n \"description\": \"Attaches one or more drop-shadows to the box. The property is a comma-separated list of shadows, each specified by 2-4 length values, an optional color, and an optional 'inset' keyword. Omitted lengths are 0; omitted colors are a user agent chosen color.\",\n \"restrictions\": [\n \"length\",\n \"color\",\n \"enum\"\n ]\n },\n {\n \"name\": \"box-sizing\",\n \"values\": [\n {\n \"name\": \"border-box\",\n \"description\": \"The specified width and height (and respective min/max properties) on this element determine the border box of the element.\"\n },\n {\n \"name\": \"content-box\",\n \"description\": \"Behavior of width and height as specified by CSS2.1. The specified width and height (and respective min/max properties) apply to the width and height respectively of the content box of the element.\"\n }\n ],\n \"syntax\": \"content-box | border-box\",\n \"relevance\": 92,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-sizing\"\n }\n ],\n \"description\": \"Specifies the behavior of the 'width' and 'height' properties.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"break-after\",\n \"values\": [\n {\n \"name\": \"always\",\n \"description\": \"Always force a page break before/after the generated box.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page/column break before/after the principal box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a break before/after the principal box.\"\n },\n {\n \"name\": \"avoid-column\",\n \"description\": \"Avoid a column break before/after the principal box.\"\n },\n {\n \"name\": \"avoid-page\",\n \"description\": \"Avoid a page break before/after the principal box.\"\n },\n {\n \"name\": \"column\",\n \"description\": \"Always force a column break before/after the principal box.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a left page.\"\n },\n {\n \"name\": \"page\",\n \"description\": \"Always force a page break before/after the principal box.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a right page.\"\n }\n ],\n \"syntax\": \"auto | avoid | always | all | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region\",\n \"relevance\": 50,\n \"description\": \"Describes the page/column/region break behavior after the generated box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"break-before\",\n \"values\": [\n {\n \"name\": \"always\",\n \"description\": \"Always force a page break before/after the generated box.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page/column break before/after the principal box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a break before/after the principal box.\"\n },\n {\n \"name\": \"avoid-column\",\n \"description\": \"Avoid a column break before/after the principal box.\"\n },\n {\n \"name\": \"avoid-page\",\n \"description\": \"Avoid a page break before/after the principal box.\"\n },\n {\n \"name\": \"column\",\n \"description\": \"Always force a column break before/after the principal box.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a left page.\"\n },\n {\n \"name\": \"page\",\n \"description\": \"Always force a page break before/after the principal box.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a right page.\"\n }\n ],\n \"syntax\": \"auto | avoid | always | all | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region\",\n \"relevance\": 50,\n \"description\": \"Describes the page/column/region break behavior before the generated box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"break-inside\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Impose no additional breaking constraints within the box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid breaks within the box.\"\n },\n {\n \"name\": \"avoid-column\",\n \"description\": \"Avoid a column break within the box.\"\n },\n {\n \"name\": \"avoid-page\",\n \"description\": \"Avoid a page break within the box.\"\n }\n ],\n \"syntax\": \"auto | avoid | avoid-page | avoid-column | avoid-region\",\n \"relevance\": 51,\n \"description\": \"Describes the page/column/region break behavior inside the principal box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"caption-side\",\n \"values\": [\n {\n \"name\": \"bottom\",\n \"description\": \"Positions the caption box below the table box.\"\n },\n {\n \"name\": \"top\",\n \"description\": \"Positions the caption box above the table box.\"\n }\n ],\n \"syntax\": \"top | bottom | block-start | block-end | inline-start | inline-end\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/caption-side\"\n }\n ],\n \"description\": \"Specifies the position of the caption box with respect to the table box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"caret-color\",\n \"browsers\": [\n \"E79\",\n \"FF53\",\n \"S11.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The user agent selects an appropriate color for the caret. This is generally currentcolor, but the user agent may choose a different color to ensure good visibility and contrast with the surrounding content, taking into account the value of currentcolor, the background, shadows, and other factors.\"\n }\n ],\n \"syntax\": \"auto | <color>\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/caret-color\"\n }\n ],\n \"description\": \"Controls the color of the text insertion indicator.\",\n \"restrictions\": [\n \"color\",\n \"enum\"\n ]\n },\n {\n \"name\": \"clear\",\n \"values\": [\n {\n \"name\": \"both\",\n \"description\": \"The clearance of the generated box is set to the amount necessary to place the top border edge below the bottom outer edge of any right-floating and left-floating boxes that resulted from elements earlier in the source document.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"The clearance of the generated box is set to the amount necessary to place the top border edge below the bottom outer edge of any left-floating boxes that resulted from elements earlier in the source document.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No constraint on the box's position with respect to floats.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"The clearance of the generated box is set to the amount necessary to place the top border edge below the bottom outer edge of any right-floating boxes that resulted from elements earlier in the source document.\"\n }\n ],\n \"syntax\": \"none | left | right | both | inline-start | inline-end\",\n \"relevance\": 84,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/clear\"\n }\n ],\n \"description\": \"Indicates which sides of an element's box(es) may not be adjacent to an earlier floating box. The 'clear' property does not consider floats inside the element itself or in other block formatting contexts.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"clip\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The element does not clip.\"\n },\n {\n \"name\": \"rect()\",\n \"description\": \"Specifies offsets from the edges of the border box.\"\n }\n ],\n \"syntax\": \"<shape> | auto\",\n \"relevance\": 74,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/clip\"\n }\n ],\n \"description\": \"Deprecated. Use the 'clip-path' property when support allows. Defines the visible portion of an element\u2019s box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"clip-path\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No clipping path gets created.\"\n },\n {\n \"name\": \"url()\",\n \"description\": \"References a <clipPath> element to create a clipping path.\"\n }\n ],\n \"syntax\": \"<clip-source> | [ <basic-shape> || <geometry-box> ] | none\",\n \"relevance\": 56,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/clip-path\"\n }\n ],\n \"description\": \"Specifies a clipping path where everything inside the path is visible and everything outside is clipped out.\",\n \"restrictions\": [\n \"url\",\n \"shape\",\n \"geometry-box\",\n \"enum\"\n ]\n },\n {\n \"name\": \"clip-rule\",\n \"browsers\": [\n \"E\",\n \"C5\",\n \"FF3\",\n \"IE10\",\n \"O9\",\n \"S6\"\n ],\n \"values\": [\n {\n \"name\": \"evenodd\",\n \"description\": \"Determines the \u2018insideness\u2019 of a point on the canvas by drawing a ray from that point to infinity in any direction and counting the number of path segments from the given shape that the ray crosses.\"\n },\n {\n \"name\": \"nonzero\",\n \"description\": \"Determines the \u2018insideness\u2019 of a point on the canvas by drawing a ray from that point to infinity in any direction and then examining the places where a segment of the shape crosses the ray.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Indicates the algorithm which is to be used to determine what parts of the canvas are included inside the shape.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"color\",\n \"syntax\": \"<color>\",\n \"relevance\": 95,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/color\"\n }\n ],\n \"description\": \"Sets the color of an element's text\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"color-interpolation-filters\",\n \"browsers\": [\n \"E\",\n \"C5\",\n \"FF3\",\n \"IE10\",\n \"O9\",\n \"S6\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Color operations are not required to occur in a particular color space.\"\n },\n {\n \"name\": \"linearRGB\",\n \"description\": \"Color operations should occur in the linearized RGB color space.\"\n },\n {\n \"name\": \"sRGB\",\n \"description\": \"Color operations should occur in the sRGB color space.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the color space for imaging operations performed via filter effects.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"column-count\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Determines the number of columns by the 'column-width' property and the element width.\"\n }\n ],\n \"syntax\": \"<integer> | auto\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/column-count\"\n }\n ],\n \"description\": \"Describes the optimal number of columns into which the content of the element will be flowed.\",\n \"restrictions\": [\n \"integer\",\n \"enum\"\n ]\n },\n {\n \"name\": \"column-fill\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Fills columns sequentially.\"\n },\n {\n \"name\": \"balance\",\n \"description\": \"Balance content equally between columns, if possible.\"\n }\n ],\n \"syntax\": \"auto | balance | balance-all\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/column-fill\"\n }\n ],\n \"description\": \"In continuous media, this property will only be consulted if the length of columns has been constrained. Otherwise, columns will automatically be balanced.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"column-gap\",\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"User agent specific and typically equivalent to 1em.\"\n }\n ],\n \"syntax\": \"normal | <length-percentage>\",\n \"relevance\": 54,\n \"description\": \"Sets the gap between columns. If there is a column rule between columns, it will appear in the middle of the gap.\",\n \"restrictions\": [\n \"length\",\n \"enum\"\n ]\n },\n {\n \"name\": \"column-rule\",\n \"syntax\": \"<'column-rule-width'> || <'column-rule-style'> || <'column-rule-color'>\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/column-rule\"\n }\n ],\n \"description\": \"Shorthand for setting 'column-rule-width', 'column-rule-style', and 'column-rule-color' at the same place in the style sheet. Omitted values are set to their initial values.\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"column-rule-color\",\n \"syntax\": \"<color>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/column-rule-color\"\n }\n ],\n \"description\": \"Sets the color of the column rule\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"column-rule-style\",\n \"syntax\": \"<'border-style'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/column-rule-style\"\n }\n ],\n \"description\": \"Sets the style of the rule between columns of an element.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"column-rule-width\",\n \"syntax\": \"<'border-width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/column-rule-width\"\n }\n ],\n \"description\": \"Sets the width of the rule between columns. Negative values are not allowed.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"columns\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The width depends on the values of other properties.\"\n }\n ],\n \"syntax\": \"<'column-width'> || <'column-count'>\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/columns\"\n }\n ],\n \"description\": \"A shorthand property which sets both 'column-width' and 'column-count'.\",\n \"restrictions\": [\n \"length\",\n \"integer\",\n \"enum\"\n ]\n },\n {\n \"name\": \"column-span\",\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"The element spans across all columns. Content in the normal flow that appears before the element is automatically balanced across all columns before the element appear.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The element does not span multiple columns.\"\n }\n ],\n \"syntax\": \"none | all\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/column-span\"\n }\n ],\n \"description\": \"Describes the page/column break behavior after the generated box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"column-width\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The width depends on the values of other properties.\"\n }\n ],\n \"syntax\": \"<length> | auto\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/column-width\"\n }\n ],\n \"description\": \"Describes the width of columns in multicol elements.\",\n \"restrictions\": [\n \"length\",\n \"enum\"\n ]\n },\n {\n \"name\": \"contain\",\n \"browsers\": [\n \"E79\",\n \"FF69\",\n \"C52\",\n \"O40\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Indicates that the property has no effect.\"\n },\n {\n \"name\": \"strict\",\n \"description\": \"Turns on all forms of containment for the element.\"\n },\n {\n \"name\": \"content\",\n \"description\": \"All containment rules except size are applied to the element.\"\n },\n {\n \"name\": \"size\",\n \"description\": \"For properties that can have effects on more than just an element and its descendants, those effects don't escape the containing element.\"\n },\n {\n \"name\": \"layout\",\n \"description\": \"Turns on layout containment for the element.\"\n },\n {\n \"name\": \"style\",\n \"description\": \"Turns on style containment for the element.\"\n },\n {\n \"name\": \"paint\",\n \"description\": \"Turns on paint containment for the element.\"\n }\n ],\n \"syntax\": \"none | strict | content | [ size || layout || style || paint ]\",\n \"relevance\": 55,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/contain\"\n }\n ],\n \"description\": \"Indicates that an element and its contents are, as much as possible, independent of the rest of the document tree.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"content\",\n \"values\": [\n {\n \"name\": \"attr()\",\n \"description\": \"The attr(n) function returns as a string the value of attribute n for the subject of the selector.\"\n },\n {\n \"name\": \"counter(name)\",\n \"description\": \"Counters are denoted by identifiers (see the 'counter-increment' and 'counter-reset' properties).\"\n },\n {\n \"name\": \"icon\",\n \"description\": \"The (pseudo-)element is replaced in its entirety by the resource referenced by its 'icon' property, and treated as a replaced element.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"On elements, this inhibits the children of the element from being rendered as children of this element, as if the element was empty. On pseudo-elements it causes the pseudo-element to have no content.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"See http://www.w3.org/TR/css3-content/#content for computation rules.\"\n },\n {\n \"name\": \"url()\"\n }\n ],\n \"syntax\": \"normal | none | [ <content-replacement> | <content-list> ] [/ <string> ]?\",\n \"relevance\": 90,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/content\"\n }\n ],\n \"description\": \"Determines which page-based occurrence of a given element is applied to a counter or string value.\",\n \"restrictions\": [\n \"string\",\n \"url\"\n ]\n },\n {\n \"name\": \"counter-increment\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"This element does not alter the value of any counters.\"\n }\n ],\n \"syntax\": \"[ <custom-ident> <integer>? ]+ | none\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/counter-increment\"\n }\n ],\n \"description\": \"Manipulate the value of existing counters.\",\n \"restrictions\": [\n \"identifier\",\n \"integer\"\n ]\n },\n {\n \"name\": \"counter-reset\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The counter is not modified.\"\n }\n ],\n \"syntax\": \"[ <custom-ident> <integer>? ]+ | none\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/counter-reset\"\n }\n ],\n \"description\": \"Property accepts one or more names of counters (identifiers), each one optionally followed by an integer. The integer gives the value that the counter is set to on each occurrence of the element.\",\n \"restrictions\": [\n \"identifier\",\n \"integer\"\n ]\n },\n {\n \"name\": \"cursor\",\n \"values\": [\n {\n \"name\": \"alias\",\n \"description\": \"Indicates an alias of/shortcut to something is to be created. Often rendered as an arrow with a small curved arrow next to it.\"\n },\n {\n \"name\": \"all-scroll\",\n \"description\": \"Indicates that the something can be scrolled in any direction. Often rendered as arrows pointing up, down, left, and right with a dot in the middle.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"The UA determines the cursor to display based on the current context.\"\n },\n {\n \"name\": \"cell\",\n \"description\": \"Indicates that a cell or set of cells may be selected. Often rendered as a thick plus-sign with a dot in the middle.\"\n },\n {\n \"name\": \"col-resize\",\n \"description\": \"Indicates that the item/column can be resized horizontally. Often rendered as arrows pointing left and right with a vertical bar separating them.\"\n },\n {\n \"name\": \"context-menu\",\n \"description\": \"A context menu is available for the object under the cursor. Often rendered as an arrow with a small menu-like graphic next to it.\"\n },\n {\n \"name\": \"copy\",\n \"description\": \"Indicates something is to be copied. Often rendered as an arrow with a small plus sign next to it.\"\n },\n {\n \"name\": \"crosshair\",\n \"description\": \"A simple crosshair (e.g., short line segments resembling a '+' sign). Often used to indicate a two dimensional bitmap selection mode.\"\n },\n {\n \"name\": \"default\",\n \"description\": \"The platform-dependent default cursor. Often rendered as an arrow.\"\n },\n {\n \"name\": \"e-resize\",\n \"description\": \"Indicates that east edge is to be moved.\"\n },\n {\n \"name\": \"ew-resize\",\n \"description\": \"Indicates a bidirectional east-west resize cursor.\"\n },\n {\n \"name\": \"grab\",\n \"description\": \"Indicates that something can be grabbed.\"\n },\n {\n \"name\": \"grabbing\",\n \"description\": \"Indicates that something is being grabbed.\"\n },\n {\n \"name\": \"help\",\n \"description\": \"Help is available for the object under the cursor. Often rendered as a question mark or a balloon.\"\n },\n {\n \"name\": \"move\",\n \"description\": \"Indicates something is to be moved.\"\n },\n {\n \"name\": \"-moz-grab\",\n \"description\": \"Indicates that something can be grabbed.\"\n },\n {\n \"name\": \"-moz-grabbing\",\n \"description\": \"Indicates that something is being grabbed.\"\n },\n {\n \"name\": \"-moz-zoom-in\",\n \"description\": \"Indicates that something can be zoomed (magnified) in.\"\n },\n {\n \"name\": \"-moz-zoom-out\",\n \"description\": \"Indicates that something can be zoomed (magnified) out.\"\n },\n {\n \"name\": \"ne-resize\",\n \"description\": \"Indicates that movement starts from north-east corner.\"\n },\n {\n \"name\": \"nesw-resize\",\n \"description\": \"Indicates a bidirectional north-east/south-west cursor.\"\n },\n {\n \"name\": \"no-drop\",\n \"description\": \"Indicates that the dragged item cannot be dropped at the current cursor location. Often rendered as a hand or pointer with a small circle with a line through it.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No cursor is rendered for the element.\"\n },\n {\n \"name\": \"not-allowed\",\n \"description\": \"Indicates that the requested action will not be carried out. Often rendered as a circle with a line through it.\"\n },\n {\n \"name\": \"n-resize\",\n \"description\": \"Indicates that north edge is to be moved.\"\n },\n {\n \"name\": \"ns-resize\",\n \"description\": \"Indicates a bidirectional north-south cursor.\"\n },\n {\n \"name\": \"nw-resize\",\n \"description\": \"Indicates that movement starts from north-west corner.\"\n },\n {\n \"name\": \"nwse-resize\",\n \"description\": \"Indicates a bidirectional north-west/south-east cursor.\"\n },\n {\n \"name\": \"pointer\",\n \"description\": \"The cursor is a pointer that indicates a link.\"\n },\n {\n \"name\": \"progress\",\n \"description\": \"A progress indicator. The program is performing some processing, but is different from 'wait' in that the user may still interact with the program. Often rendered as a spinning beach ball, or an arrow with a watch or hourglass.\"\n },\n {\n \"name\": \"row-resize\",\n \"description\": \"Indicates that the item/row can be resized vertically. Often rendered as arrows pointing up and down with a horizontal bar separating them.\"\n },\n {\n \"name\": \"se-resize\",\n \"description\": \"Indicates that movement starts from south-east corner.\"\n },\n {\n \"name\": \"s-resize\",\n \"description\": \"Indicates that south edge is to be moved.\"\n },\n {\n \"name\": \"sw-resize\",\n \"description\": \"Indicates that movement starts from south-west corner.\"\n },\n {\n \"name\": \"text\",\n \"description\": \"Indicates text that may be selected. Often rendered as a vertical I-beam.\"\n },\n {\n \"name\": \"vertical-text\",\n \"description\": \"Indicates vertical-text that may be selected. Often rendered as a horizontal I-beam.\"\n },\n {\n \"name\": \"wait\",\n \"description\": \"Indicates that the program is busy and the user should wait. Often rendered as a watch or hourglass.\"\n },\n {\n \"name\": \"-webkit-grab\",\n \"description\": \"Indicates that something can be grabbed.\"\n },\n {\n \"name\": \"-webkit-grabbing\",\n \"description\": \"Indicates that something is being grabbed.\"\n },\n {\n \"name\": \"-webkit-zoom-in\",\n \"description\": \"Indicates that something can be zoomed (magnified) in.\"\n },\n {\n \"name\": \"-webkit-zoom-out\",\n \"description\": \"Indicates that something can be zoomed (magnified) out.\"\n },\n {\n \"name\": \"w-resize\",\n \"description\": \"Indicates that west edge is to be moved.\"\n },\n {\n \"name\": \"zoom-in\",\n \"description\": \"Indicates that something can be zoomed (magnified) in.\"\n },\n {\n \"name\": \"zoom-out\",\n \"description\": \"Indicates that something can be zoomed (magnified) out.\"\n }\n ],\n \"syntax\": \"[ [ <url> [ <x> <y> ]? , ]* [ auto | default | none | context-menu | help | pointer | progress | wait | cell | crosshair | text | vertical-text | alias | copy | move | no-drop | not-allowed | e-resize | n-resize | ne-resize | nw-resize | s-resize | se-resize | sw-resize | w-resize | ew-resize | ns-resize | nesw-resize | nwse-resize | col-resize | row-resize | all-scroll | zoom-in | zoom-out | grab | grabbing ] ]\",\n \"relevance\": 92,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/cursor\"\n }\n ],\n \"description\": \"Allows control over cursor appearance in an element\",\n \"restrictions\": [\n \"url\",\n \"number\",\n \"enum\"\n ]\n },\n {\n \"name\": \"direction\",\n \"values\": [\n {\n \"name\": \"ltr\",\n \"description\": \"Left-to-right direction.\"\n },\n {\n \"name\": \"rtl\",\n \"description\": \"Right-to-left direction.\"\n }\n ],\n \"syntax\": \"ltr | rtl\",\n \"relevance\": 69,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/direction\"\n }\n ],\n \"description\": \"Specifies the inline base direction or directionality of any bidi paragraph, embedding, isolate, or override established by the box. Note: for HTML content use the 'dir' attribute and 'bdo' element rather than this property.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"display\",\n \"values\": [\n {\n \"name\": \"block\",\n \"description\": \"The element generates a block-level box\"\n },\n {\n \"name\": \"contents\",\n \"description\": \"The element itself does not generate any boxes, but its children and pseudo-elements still generate boxes as normal.\"\n },\n {\n \"name\": \"flex\",\n \"description\": \"The element generates a principal flex container box and establishes a flex formatting context.\"\n },\n {\n \"name\": \"flexbox\",\n \"description\": \"The element lays out its contents using flow layout (block-and-inline layout). Standardized as 'flex'.\"\n },\n {\n \"name\": \"flow-root\",\n \"description\": \"The element generates a block container box, and lays out its contents using flow layout.\"\n },\n {\n \"name\": \"grid\",\n \"description\": \"The element generates a principal grid container box, and establishes a grid formatting context.\"\n },\n {\n \"name\": \"inline\",\n \"description\": \"The element generates an inline-level box.\"\n },\n {\n \"name\": \"inline-block\",\n \"description\": \"A block box, which itself is flowed as a single inline box, similar to a replaced element. The inside of an inline-block is formatted as a block box, and the box itself is formatted as an inline box.\"\n },\n {\n \"name\": \"inline-flex\",\n \"description\": \"Inline-level flex container.\"\n },\n {\n \"name\": \"inline-flexbox\",\n \"description\": \"Inline-level flex container. Standardized as 'inline-flex'\"\n },\n {\n \"name\": \"inline-table\",\n \"description\": \"Inline-level table wrapper box containing table box.\"\n },\n {\n \"name\": \"list-item\",\n \"description\": \"One or more block boxes and one marker box.\"\n },\n {\n \"name\": \"-moz-box\",\n \"description\": \"The element lays out its contents using flow layout (block-and-inline layout). Standardized as 'flex'.\"\n },\n {\n \"name\": \"-moz-deck\"\n },\n {\n \"name\": \"-moz-grid\"\n },\n {\n \"name\": \"-moz-grid-group\"\n },\n {\n \"name\": \"-moz-grid-line\"\n },\n {\n \"name\": \"-moz-groupbox\"\n },\n {\n \"name\": \"-moz-inline-box\",\n \"description\": \"Inline-level flex container. Standardized as 'inline-flex'\"\n },\n {\n \"name\": \"-moz-inline-grid\"\n },\n {\n \"name\": \"-moz-inline-stack\"\n },\n {\n \"name\": \"-moz-marker\"\n },\n {\n \"name\": \"-moz-popup\"\n },\n {\n \"name\": \"-moz-stack\"\n },\n {\n \"name\": \"-ms-flexbox\",\n \"description\": \"The element lays out its contents using flow layout (block-and-inline layout). Standardized as 'flex'.\"\n },\n {\n \"name\": \"-ms-grid\",\n \"description\": \"The element generates a principal grid container box, and establishes a grid formatting context.\"\n },\n {\n \"name\": \"-ms-inline-flexbox\",\n \"description\": \"Inline-level flex container. Standardized as 'inline-flex'\"\n },\n {\n \"name\": \"-ms-inline-grid\",\n \"description\": \"Inline-level grid container.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The element and its descendants generates no boxes.\"\n },\n {\n \"name\": \"ruby\",\n \"description\": \"The element generates a principal ruby container box, and establishes a ruby formatting context.\"\n },\n {\n \"name\": \"ruby-base\"\n },\n {\n \"name\": \"ruby-base-container\"\n },\n {\n \"name\": \"ruby-text\"\n },\n {\n \"name\": \"ruby-text-container\"\n },\n {\n \"name\": \"run-in\",\n \"description\": \"The element generates a run-in box. Run-in elements act like inlines or blocks, depending on the surrounding elements.\"\n },\n {\n \"name\": \"table\",\n \"description\": \"The element generates a principal table wrapper box containing an additionally-generated table box, and establishes a table formatting context.\"\n },\n {\n \"name\": \"table-caption\"\n },\n {\n \"name\": \"table-cell\"\n },\n {\n \"name\": \"table-column\"\n },\n {\n \"name\": \"table-column-group\"\n },\n {\n \"name\": \"table-footer-group\"\n },\n {\n \"name\": \"table-header-group\"\n },\n {\n \"name\": \"table-row\"\n },\n {\n \"name\": \"table-row-group\"\n },\n {\n \"name\": \"-webkit-box\",\n \"description\": \"The element lays out its contents using flow layout (block-and-inline layout). Standardized as 'flex'.\"\n },\n {\n \"name\": \"-webkit-flex\",\n \"description\": \"The element lays out its contents using flow layout (block-and-inline layout).\"\n },\n {\n \"name\": \"-webkit-inline-box\",\n \"description\": \"Inline-level flex container. Standardized as 'inline-flex'\"\n },\n {\n \"name\": \"-webkit-inline-flex\",\n \"description\": \"Inline-level flex container.\"\n }\n ],\n \"syntax\": \"[ <display-outside> || <display-inside> ] | <display-listitem> | <display-internal> | <display-box> | <display-legacy>\",\n \"relevance\": 96,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/display\"\n }\n ],\n \"description\": \"In combination with 'float' and 'position', determines the type of box or boxes that are generated for an element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"empty-cells\",\n \"values\": [\n {\n \"name\": \"hide\",\n \"description\": \"No borders or backgrounds are drawn around/behind empty cells.\"\n },\n {\n \"name\": \"-moz-show-background\"\n },\n {\n \"name\": \"show\",\n \"description\": \"Borders and backgrounds are drawn around/behind empty cells (like normal cells).\"\n }\n ],\n \"syntax\": \"show | hide\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/empty-cells\"\n }\n ],\n \"description\": \"In the separated borders model, this property controls the rendering of borders and backgrounds around cells that have no visible content.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"enable-background\",\n \"values\": [\n {\n \"name\": \"accumulate\",\n \"description\": \"If the ancestor container element has a property of new, then all graphics elements within the current container are rendered both on the parent's background image and onto the target.\"\n },\n {\n \"name\": \"new\",\n \"description\": \"Create a new background image canvas. All children of the current container element can access the background, and they will be rendered onto both the parent's background image canvas in addition to the target device.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Deprecated. Use 'isolation' property instead when support allows. Specifies how the accumulation of the background image is managed.\",\n \"restrictions\": [\n \"integer\",\n \"length\",\n \"percentage\",\n \"enum\"\n ]\n },\n {\n \"name\": \"fallback\",\n \"browsers\": [\n \"FF33\"\n ],\n \"syntax\": \"<counter-style-name>\",\n \"relevance\": 50,\n \"description\": \"@counter-style descriptor. Specifies a fallback counter style to be used when the current counter style can\u2019t create a representation for a given counter value.\",\n \"restrictions\": [\n \"identifier\"\n ]\n },\n {\n \"name\": \"fill\",\n \"values\": [\n {\n \"name\": \"url()\",\n \"description\": \"A URL reference to a paint server element, which is an element that defines a paint server: \u2018hatch\u2019, \u2018linearGradient\u2019, \u2018mesh\u2019, \u2018pattern\u2019, \u2018radialGradient\u2019 and \u2018solidcolor\u2019.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No paint is applied in this layer.\"\n }\n ],\n \"relevance\": 75,\n \"description\": \"Paints the interior of the given graphical element.\",\n \"restrictions\": [\n \"color\",\n \"enum\",\n \"url\"\n ]\n },\n {\n \"name\": \"fill-opacity\",\n \"relevance\": 52,\n \"description\": \"Specifies the opacity of the painting operation used to paint the interior the current object.\",\n \"restrictions\": [\n \"number(0-1)\"\n ]\n },\n {\n \"name\": \"fill-rule\",\n \"values\": [\n {\n \"name\": \"evenodd\",\n \"description\": \"Determines the \u2018insideness\u2019 of a point on the canvas by drawing a ray from that point to infinity in any direction and counting the number of path segments from the given shape that the ray crosses.\"\n },\n {\n \"name\": \"nonzero\",\n \"description\": \"Determines the \u2018insideness\u2019 of a point on the canvas by drawing a ray from that point to infinity in any direction and then examining the places where a segment of the shape crosses the ray.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Indicates the algorithm (or winding rule) which is to be used to determine what parts of the canvas are included inside the shape.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"filter\",\n \"browsers\": [\n \"E12\",\n \"FF35\",\n \"S9.1\",\n \"C53\",\n \"O40\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No filter effects are applied.\"\n },\n {\n \"name\": \"blur()\",\n \"description\": \"Applies a Gaussian blur to the input image.\"\n },\n {\n \"name\": \"brightness()\",\n \"description\": \"Applies a linear multiplier to input image, making it appear more or less bright.\"\n },\n {\n \"name\": \"contrast()\",\n \"description\": \"Adjusts the contrast of the input.\"\n },\n {\n \"name\": \"drop-shadow()\",\n \"description\": \"Applies a drop shadow effect to the input image.\"\n },\n {\n \"name\": \"grayscale()\",\n \"description\": \"Converts the input image to grayscale.\"\n },\n {\n \"name\": \"hue-rotate()\",\n \"description\": \"Applies a hue rotation on the input image. \"\n },\n {\n \"name\": \"invert()\",\n \"description\": \"Inverts the samples in the input image.\"\n },\n {\n \"name\": \"opacity()\",\n \"description\": \"Applies transparency to the samples in the input image.\"\n },\n {\n \"name\": \"saturate()\",\n \"description\": \"Saturates the input image.\"\n },\n {\n \"name\": \"sepia()\",\n \"description\": \"Converts the input image to sepia.\"\n },\n {\n \"name\": \"url()\",\n \"browsers\": [\n \"E12\",\n \"FF35\",\n \"S9.1\",\n \"C53\",\n \"O40\"\n ],\n \"description\": \"A filter reference to a <filter> element.\"\n }\n ],\n \"syntax\": \"none | <filter-function-list>\",\n \"relevance\": 64,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/filter\"\n }\n ],\n \"description\": \"Processes an element\u2019s rendering before it is displayed in the document, by applying one or more filter effects.\",\n \"restrictions\": [\n \"enum\",\n \"url\"\n ]\n },\n {\n \"name\": \"flex\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Retrieves the value of the main size property as the used 'flex-basis'.\"\n },\n {\n \"name\": \"content\",\n \"description\": \"Indicates automatic sizing, based on the flex item\u2019s content.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Expands to '0 0 auto'.\"\n }\n ],\n \"syntax\": \"none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]\",\n \"relevance\": 79,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/flex\"\n }\n ],\n \"description\": \"Specifies the components of a flexible length: the flex grow factor and flex shrink factor, and the flex basis.\",\n \"restrictions\": [\n \"length\",\n \"number\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"flex-basis\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Retrieves the value of the main size property as the used 'flex-basis'.\"\n },\n {\n \"name\": \"content\",\n \"description\": \"Indicates automatic sizing, based on the flex item\u2019s content.\"\n }\n ],\n \"syntax\": \"content | <'width'>\",\n \"relevance\": 64,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/flex-basis\"\n }\n ],\n \"description\": \"Sets the flex basis.\",\n \"restrictions\": [\n \"length\",\n \"number\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"flex-direction\",\n \"values\": [\n {\n \"name\": \"column\",\n \"description\": \"The flex container\u2019s main axis has the same orientation as the block axis of the current writing mode.\"\n },\n {\n \"name\": \"column-reverse\",\n \"description\": \"Same as 'column', except the main-start and main-end directions are swapped.\"\n },\n {\n \"name\": \"row\",\n \"description\": \"The flex container\u2019s main axis has the same orientation as the inline axis of the current writing mode.\"\n },\n {\n \"name\": \"row-reverse\",\n \"description\": \"Same as 'row', except the main-start and main-end directions are swapped.\"\n }\n ],\n \"syntax\": \"row | row-reverse | column | column-reverse\",\n \"relevance\": 81,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/flex-direction\"\n }\n ],\n \"description\": \"Specifies how flex items are placed in the flex container, by setting the direction of the flex container\u2019s main axis.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"flex-flow\",\n \"values\": [\n {\n \"name\": \"column\",\n \"description\": \"The flex container\u2019s main axis has the same orientation as the block axis of the current writing mode.\"\n },\n {\n \"name\": \"column-reverse\",\n \"description\": \"Same as 'column', except the main-start and main-end directions are swapped.\"\n },\n {\n \"name\": \"nowrap\",\n \"description\": \"The flex container is single-line.\"\n },\n {\n \"name\": \"row\",\n \"description\": \"The flex container\u2019s main axis has the same orientation as the inline axis of the current writing mode.\"\n },\n {\n \"name\": \"row-reverse\",\n \"description\": \"Same as 'row', except the main-start and main-end directions are swapped.\"\n },\n {\n \"name\": \"wrap\",\n \"description\": \"The flexbox is multi-line.\"\n },\n {\n \"name\": \"wrap-reverse\",\n \"description\": \"Same as 'wrap', except the cross-start and cross-end directions are swapped.\"\n }\n ],\n \"syntax\": \"<'flex-direction'> || <'flex-wrap'>\",\n \"relevance\": 60,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/flex-flow\"\n }\n ],\n \"description\": \"Specifies how flexbox items are placed in the flexbox.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"flex-grow\",\n \"syntax\": \"<number>\",\n \"relevance\": 74,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/flex-grow\"\n }\n ],\n \"description\": \"Sets the flex grow factor. Negative numbers are invalid.\",\n \"restrictions\": [\n \"number\"\n ]\n },\n {\n \"name\": \"flex-shrink\",\n \"syntax\": \"<number>\",\n \"relevance\": 72,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/flex-shrink\"\n }\n ],\n \"description\": \"Sets the flex shrink factor. Negative numbers are invalid.\",\n \"restrictions\": [\n \"number\"\n ]\n },\n {\n \"name\": \"flex-wrap\",\n \"values\": [\n {\n \"name\": \"nowrap\",\n \"description\": \"The flex container is single-line.\"\n },\n {\n \"name\": \"wrap\",\n \"description\": \"The flexbox is multi-line.\"\n },\n {\n \"name\": \"wrap-reverse\",\n \"description\": \"Same as 'wrap', except the cross-start and cross-end directions are swapped.\"\n }\n ],\n \"syntax\": \"nowrap | wrap | wrap-reverse\",\n \"relevance\": 78,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/flex-wrap\"\n }\n ],\n \"description\": \"Controls whether the flex container is single-line or multi-line, and the direction of the cross-axis, which determines the direction new lines are stacked in.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"float\",\n \"values\": [\n {\n \"name\": \"inline-end\",\n \"description\": \"A keyword indicating that the element must float on the end side of its containing block. That is the right side with ltr scripts, and the left side with rtl scripts.\"\n },\n {\n \"name\": \"inline-start\",\n \"description\": \"A keyword indicating that the element must float on the start side of its containing block. That is the left side with ltr scripts, and the right side with rtl scripts.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"The element generates a block box that is floated to the left. Content flows on the right side of the box, starting at the top (subject to the 'clear' property).\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The box is not floated.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"Similar to 'left', except the box is floated to the right, and content flows on the left side of the box, starting at the top.\"\n }\n ],\n \"syntax\": \"left | right | none | inline-start | inline-end\",\n \"relevance\": 91,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/float\"\n }\n ],\n \"description\": \"Specifies how a box should be floated. It may be set for any element, but only applies to elements that generate boxes that are not absolutely positioned.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"flood-color\",\n \"browsers\": [\n \"E\",\n \"C5\",\n \"FF3\",\n \"IE10\",\n \"O9\",\n \"S6\"\n ],\n \"relevance\": 50,\n \"description\": \"Indicates what color to use to flood the current filter primitive subregion.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"flood-opacity\",\n \"browsers\": [\n \"E\",\n \"C5\",\n \"FF3\",\n \"IE10\",\n \"O9\",\n \"S6\"\n ],\n \"relevance\": 50,\n \"description\": \"Indicates what opacity to use to flood the current filter primitive subregion.\",\n \"restrictions\": [\n \"number(0-1)\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"font\",\n \"values\": [\n {\n \"name\": \"100\",\n \"description\": \"Thin\"\n },\n {\n \"name\": \"200\",\n \"description\": \"Extra Light (Ultra Light)\"\n },\n {\n \"name\": \"300\",\n \"description\": \"Light\"\n },\n {\n \"name\": \"400\",\n \"description\": \"Normal\"\n },\n {\n \"name\": \"500\",\n \"description\": \"Medium\"\n },\n {\n \"name\": \"600\",\n \"description\": \"Semi Bold (Demi Bold)\"\n },\n {\n \"name\": \"700\",\n \"description\": \"Bold\"\n },\n {\n \"name\": \"800\",\n \"description\": \"Extra Bold (Ultra Bold)\"\n },\n {\n \"name\": \"900\",\n \"description\": \"Black (Heavy)\"\n },\n {\n \"name\": \"bold\",\n \"description\": \"Same as 700\"\n },\n {\n \"name\": \"bolder\",\n \"description\": \"Specifies the weight of the face bolder than the inherited value.\"\n },\n {\n \"name\": \"caption\",\n \"description\": \"The font used for captioned controls (e.g., buttons, drop-downs, etc.).\"\n },\n {\n \"name\": \"icon\",\n \"description\": \"The font used to label icons.\"\n },\n {\n \"name\": \"italic\",\n \"description\": \"Selects a font that is labeled 'italic', or, if that is not available, one labeled 'oblique'.\"\n },\n {\n \"name\": \"large\"\n },\n {\n \"name\": \"larger\"\n },\n {\n \"name\": \"lighter\",\n \"description\": \"Specifies the weight of the face lighter than the inherited value.\"\n },\n {\n \"name\": \"medium\"\n },\n {\n \"name\": \"menu\",\n \"description\": \"The font used in menus (e.g., dropdown menus and menu lists).\"\n },\n {\n \"name\": \"message-box\",\n \"description\": \"The font used in dialog boxes.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Specifies a face that is not labeled as a small-caps font.\"\n },\n {\n \"name\": \"oblique\",\n \"description\": \"Selects a font that is labeled 'oblique'.\"\n },\n {\n \"name\": \"small\"\n },\n {\n \"name\": \"small-caps\",\n \"description\": \"Specifies a font that is labeled as a small-caps font. If a genuine small-caps font is not available, user agents should simulate a small-caps font.\"\n },\n {\n \"name\": \"small-caption\",\n \"description\": \"The font used for labeling small controls.\"\n },\n {\n \"name\": \"smaller\"\n },\n {\n \"name\": \"status-bar\",\n \"description\": \"The font used in window status bars.\"\n },\n {\n \"name\": \"x-large\"\n },\n {\n \"name\": \"x-small\"\n },\n {\n \"name\": \"xx-large\"\n },\n {\n \"name\": \"xx-small\"\n }\n ],\n \"syntax\": \"[ [ <'font-style'> || <font-variant-css21> || <'font-weight'> || <'font-stretch'> ]? <'font-size'> [ / <'line-height'> ]? <'font-family'> ] | caption | icon | menu | message-box | small-caption | status-bar\",\n \"relevance\": 83,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font\"\n }\n ],\n \"description\": \"Shorthand property for setting 'font-style', 'font-variant', 'font-weight', 'font-size', 'line-height', and 'font-family', at the same place in the style sheet. The syntax of this property is based on a traditional typographical shorthand notation to set multiple properties related to fonts.\",\n \"restrictions\": [\n \"font\"\n ]\n },\n {\n \"name\": \"font-family\",\n \"values\": [\n {\n \"name\": \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif\"\n },\n {\n \"name\": \"Arial, Helvetica, sans-serif\"\n },\n {\n \"name\": \"Cambria, Cochin, Georgia, Times, 'Times New Roman', serif\"\n },\n {\n \"name\": \"'Courier New', Courier, monospace\"\n },\n {\n \"name\": \"cursive\"\n },\n {\n \"name\": \"fantasy\"\n },\n {\n \"name\": \"'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif\"\n },\n {\n \"name\": \"Georgia, 'Times New Roman', Times, serif\"\n },\n {\n \"name\": \"'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif\"\n },\n {\n \"name\": \"Impact, Haettenschweiler, 'Arial Narrow Bold', sans-serif\"\n },\n {\n \"name\": \"'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif\"\n },\n {\n \"name\": \"monospace\"\n },\n {\n \"name\": \"sans-serif\"\n },\n {\n \"name\": \"'Segoe UI', Tahoma, Geneva, Verdana, sans-serif\"\n },\n {\n \"name\": \"serif\"\n },\n {\n \"name\": \"'Times New Roman', Times, serif\"\n },\n {\n \"name\": \"'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif\"\n },\n {\n \"name\": \"Verdana, Geneva, Tahoma, sans-serif\"\n }\n ],\n \"syntax\": \"<family-name>\",\n \"relevance\": 93,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-family\"\n }\n ],\n \"description\": \"Specifies a prioritized list of font family names or generic family names. A user agent iterates through the list of family names until it matches an available font that contains a glyph for the character to be rendered.\",\n \"restrictions\": [\n \"font\"\n ]\n },\n {\n \"name\": \"font-feature-settings\",\n \"values\": [\n {\n \"name\": \"\\\"aalt\\\"\",\n \"description\": \"Access All Alternates.\"\n },\n {\n \"name\": \"\\\"abvf\\\"\",\n \"description\": \"Above-base Forms. Required in Khmer script.\"\n },\n {\n \"name\": \"\\\"abvm\\\"\",\n \"description\": \"Above-base Mark Positioning. Required in Indic scripts.\"\n },\n {\n \"name\": \"\\\"abvs\\\"\",\n \"description\": \"Above-base Substitutions. Required in Indic scripts.\"\n },\n {\n \"name\": \"\\\"afrc\\\"\",\n \"description\": \"Alternative Fractions.\"\n },\n {\n \"name\": \"\\\"akhn\\\"\",\n \"description\": \"Akhand. Required in most Indic scripts.\"\n },\n {\n \"name\": \"\\\"blwf\\\"\",\n \"description\": \"Below-base Form. Required in a number of Indic scripts.\"\n },\n {\n \"name\": \"\\\"blwm\\\"\",\n \"description\": \"Below-base Mark Positioning. Required in Indic scripts.\"\n },\n {\n \"name\": \"\\\"blws\\\"\",\n \"description\": \"Below-base Substitutions. Required in Indic scripts.\"\n },\n {\n \"name\": \"\\\"calt\\\"\",\n \"description\": \"Contextual Alternates.\"\n },\n {\n \"name\": \"\\\"case\\\"\",\n \"description\": \"Case-Sensitive Forms. Applies only to European scripts; particularly prominent in Spanish-language setting.\"\n },\n {\n \"name\": \"\\\"ccmp\\\"\",\n \"description\": \"Glyph Composition/Decomposition.\"\n },\n {\n \"name\": \"\\\"cfar\\\"\",\n \"description\": \"Conjunct Form After Ro. Required in Khmer scripts.\"\n },\n {\n \"name\": \"\\\"cjct\\\"\",\n \"description\": \"Conjunct Forms. Required in Indic scripts that show similarity to Devanagari.\"\n },\n {\n \"name\": \"\\\"clig\\\"\",\n \"description\": \"Contextual Ligatures.\"\n },\n {\n \"name\": \"\\\"cpct\\\"\",\n \"description\": \"Centered CJK Punctuation. Used primarily in Chinese fonts.\"\n },\n {\n \"name\": \"\\\"cpsp\\\"\",\n \"description\": \"Capital Spacing. Should not be used in connecting scripts (e.g. most Arabic).\"\n },\n {\n \"name\": \"\\\"cswh\\\"\",\n \"description\": \"Contextual Swash.\"\n },\n {\n \"name\": \"\\\"curs\\\"\",\n \"description\": \"Cursive Positioning. Can be used in any cursive script.\"\n },\n {\n \"name\": \"\\\"c2pc\\\"\",\n \"description\": \"Petite Capitals From Capitals. Applies only to bicameral scripts.\"\n },\n {\n \"name\": \"\\\"c2sc\\\"\",\n \"description\": \"Small Capitals From Capitals. Applies only to bicameral scripts.\"\n },\n {\n \"name\": \"\\\"dist\\\"\",\n \"description\": \"Distances. Required in Indic scripts.\"\n },\n {\n \"name\": \"\\\"dlig\\\"\",\n \"description\": \"Discretionary ligatures.\"\n },\n {\n \"name\": \"\\\"dnom\\\"\",\n \"description\": \"Denominators.\"\n },\n {\n \"name\": \"\\\"dtls\\\"\",\n \"description\": \"Dotless Forms. Applied to math formula layout.\"\n },\n {\n \"name\": \"\\\"expt\\\"\",\n \"description\": \"Expert Forms. Applies only to Japanese.\"\n },\n {\n \"name\": \"\\\"falt\\\"\",\n \"description\": \"Final Glyph on Line Alternates. Can be used in any cursive script.\"\n },\n {\n \"name\": \"\\\"fin2\\\"\",\n \"description\": \"Terminal Form #2. Used only with the Syriac script.\"\n },\n {\n \"name\": \"\\\"fin3\\\"\",\n \"description\": \"Terminal Form #3. Used only with the Syriac script.\"\n },\n {\n \"name\": \"\\\"fina\\\"\",\n \"description\": \"Terminal Forms. Can be used in any alphabetic script.\"\n },\n {\n \"name\": \"\\\"flac\\\"\",\n \"description\": \"Flattened ascent forms. Applied to math formula layout.\"\n },\n {\n \"name\": \"\\\"frac\\\"\",\n \"description\": \"Fractions.\"\n },\n {\n \"name\": \"\\\"fwid\\\"\",\n \"description\": \"Full Widths. Applies to any script which can use monospaced forms.\"\n },\n {\n \"name\": \"\\\"half\\\"\",\n \"description\": \"Half Forms. Required in Indic scripts that show similarity to Devanagari.\"\n },\n {\n \"name\": \"\\\"haln\\\"\",\n \"description\": \"Halant Forms. Required in Indic scripts.\"\n },\n {\n \"name\": \"\\\"halt\\\"\",\n \"description\": \"Alternate Half Widths. Used only in CJKV fonts.\"\n },\n {\n \"name\": \"\\\"hist\\\"\",\n \"description\": \"Historical Forms.\"\n },\n {\n \"name\": \"\\\"hkna\\\"\",\n \"description\": \"Horizontal Kana Alternates. Applies only to fonts that support kana (hiragana and katakana).\"\n },\n {\n \"name\": \"\\\"hlig\\\"\",\n \"description\": \"Historical Ligatures.\"\n },\n {\n \"name\": \"\\\"hngl\\\"\",\n \"description\": \"Hangul. Korean only.\"\n },\n {\n \"name\": \"\\\"hojo\\\"\",\n \"description\": \"Hojo Kanji Forms (JIS X 0212-1990 Kanji Forms). Used only with Kanji script.\"\n },\n {\n \"name\": \"\\\"hwid\\\"\",\n \"description\": \"Half Widths. Generally used only in CJKV fonts.\"\n },\n {\n \"name\": \"\\\"init\\\"\",\n \"description\": \"Initial Forms. Can be used in any alphabetic script.\"\n },\n {\n \"name\": \"\\\"isol\\\"\",\n \"description\": \"Isolated Forms. Can be used in any cursive script.\"\n },\n {\n \"name\": \"\\\"ital\\\"\",\n \"description\": \"Italics. Applies mostly to Latin; note that many non-Latin fonts contain Latin as well.\"\n },\n {\n \"name\": \"\\\"jalt\\\"\",\n \"description\": \"Justification Alternates. Can be used in any cursive script.\"\n },\n {\n \"name\": \"\\\"jp78\\\"\",\n \"description\": \"JIS78 Forms. Applies only to Japanese.\"\n },\n {\n \"name\": \"\\\"jp83\\\"\",\n \"description\": \"JIS83 Forms. Applies only to Japanese.\"\n },\n {\n \"name\": \"\\\"jp90\\\"\",\n \"description\": \"JIS90 Forms. Applies only to Japanese.\"\n },\n {\n \"name\": \"\\\"jp04\\\"\",\n \"description\": \"JIS2004 Forms. Applies only to Japanese.\"\n },\n {\n \"name\": \"\\\"kern\\\"\",\n \"description\": \"Kerning.\"\n },\n {\n \"name\": \"\\\"lfbd\\\"\",\n \"description\": \"Left Bounds.\"\n },\n {\n \"name\": \"\\\"liga\\\"\",\n \"description\": \"Standard Ligatures.\"\n },\n {\n \"name\": \"\\\"ljmo\\\"\",\n \"description\": \"Leading Jamo Forms. Required for Hangul script when Ancient Hangul writing system is supported.\"\n },\n {\n \"name\": \"\\\"lnum\\\"\",\n \"description\": \"Lining Figures.\"\n },\n {\n \"name\": \"\\\"locl\\\"\",\n \"description\": \"Localized Forms.\"\n },\n {\n \"name\": \"\\\"ltra\\\"\",\n \"description\": \"Left-to-right glyph alternates.\"\n },\n {\n \"name\": \"\\\"ltrm\\\"\",\n \"description\": \"Left-to-right mirrored forms.\"\n },\n {\n \"name\": \"\\\"mark\\\"\",\n \"description\": \"Mark Positioning.\"\n },\n {\n \"name\": \"\\\"med2\\\"\",\n \"description\": \"Medial Form #2. Used only with the Syriac script.\"\n },\n {\n \"name\": \"\\\"medi\\\"\",\n \"description\": \"Medial Forms.\"\n },\n {\n \"name\": \"\\\"mgrk\\\"\",\n \"description\": \"Mathematical Greek.\"\n },\n {\n \"name\": \"\\\"mkmk\\\"\",\n \"description\": \"Mark to Mark Positioning.\"\n },\n {\n \"name\": \"\\\"nalt\\\"\",\n \"description\": \"Alternate Annotation Forms.\"\n },\n {\n \"name\": \"\\\"nlck\\\"\",\n \"description\": \"NLC Kanji Forms. Used only with Kanji script.\"\n },\n {\n \"name\": \"\\\"nukt\\\"\",\n \"description\": \"Nukta Forms. Required in Indic scripts..\"\n },\n {\n \"name\": \"\\\"numr\\\"\",\n \"description\": \"Numerators.\"\n },\n {\n \"name\": \"\\\"onum\\\"\",\n \"description\": \"Oldstyle Figures.\"\n },\n {\n \"name\": \"\\\"opbd\\\"\",\n \"description\": \"Optical Bounds.\"\n },\n {\n \"name\": \"\\\"ordn\\\"\",\n \"description\": \"Ordinals. Applies mostly to Latin script.\"\n },\n {\n \"name\": \"\\\"ornm\\\"\",\n \"description\": \"Ornaments.\"\n },\n {\n \"name\": \"\\\"palt\\\"\",\n \"description\": \"Proportional Alternate Widths. Used mostly in CJKV fonts.\"\n },\n {\n \"name\": \"\\\"pcap\\\"\",\n \"description\": \"Petite Capitals.\"\n },\n {\n \"name\": \"\\\"pkna\\\"\",\n \"description\": \"Proportional Kana. Generally used only in Japanese fonts.\"\n },\n {\n \"name\": \"\\\"pnum\\\"\",\n \"description\": \"Proportional Figures.\"\n },\n {\n \"name\": \"\\\"pref\\\"\",\n \"description\": \"Pre-base Forms. Required in Khmer and Myanmar (Burmese) scripts and southern Indic scripts that may display a pre-base form of Ra.\"\n },\n {\n \"name\": \"\\\"pres\\\"\",\n \"description\": \"Pre-base Substitutions. Required in Indic scripts.\"\n },\n {\n \"name\": \"\\\"pstf\\\"\",\n \"description\": \"Post-base Forms. Required in scripts of south and southeast Asia that have post-base forms for consonants eg: Gurmukhi, Malayalam, Khmer.\"\n },\n {\n \"name\": \"\\\"psts\\\"\",\n \"description\": \"Post-base Substitutions.\"\n },\n {\n \"name\": \"\\\"pwid\\\"\",\n \"description\": \"Proportional Widths.\"\n },\n {\n \"name\": \"\\\"qwid\\\"\",\n \"description\": \"Quarter Widths. Generally used only in CJKV fonts.\"\n },\n {\n \"name\": \"\\\"rand\\\"\",\n \"description\": \"Randomize.\"\n },\n {\n \"name\": \"\\\"rclt\\\"\",\n \"description\": \"Required Contextual Alternates. May apply to any script, but is especially important for many styles of Arabic.\"\n },\n {\n \"name\": \"\\\"rlig\\\"\",\n \"description\": \"Required Ligatures. Applies to Arabic and Syriac. May apply to some other scripts.\"\n },\n {\n \"name\": \"\\\"rkrf\\\"\",\n \"description\": \"Rakar Forms. Required in Devanagari and Gujarati scripts.\"\n },\n {\n \"name\": \"\\\"rphf\\\"\",\n \"description\": \"Reph Form. Required in Indic scripts. E.g. Devanagari, Kannada.\"\n },\n {\n \"name\": \"\\\"rtbd\\\"\",\n \"description\": \"Right Bounds.\"\n },\n {\n \"name\": \"\\\"rtla\\\"\",\n \"description\": \"Right-to-left alternates.\"\n },\n {\n \"name\": \"\\\"rtlm\\\"\",\n \"description\": \"Right-to-left mirrored forms.\"\n },\n {\n \"name\": \"\\\"ruby\\\"\",\n \"description\": \"Ruby Notation Forms. Applies only to Japanese.\"\n },\n {\n \"name\": \"\\\"salt\\\"\",\n \"description\": \"Stylistic Alternates.\"\n },\n {\n \"name\": \"\\\"sinf\\\"\",\n \"description\": \"Scientific Inferiors.\"\n },\n {\n \"name\": \"\\\"size\\\"\",\n \"description\": \"Optical size.\"\n },\n {\n \"name\": \"\\\"smcp\\\"\",\n \"description\": \"Small Capitals. Applies only to bicameral scripts.\"\n },\n {\n \"name\": \"\\\"smpl\\\"\",\n \"description\": \"Simplified Forms. Applies only to Chinese and Japanese.\"\n },\n {\n \"name\": \"\\\"ssty\\\"\",\n \"description\": \"Math script style alternates.\"\n },\n {\n \"name\": \"\\\"stch\\\"\",\n \"description\": \"Stretching Glyph Decomposition.\"\n },\n {\n \"name\": \"\\\"subs\\\"\",\n \"description\": \"Subscript.\"\n },\n {\n \"name\": \"\\\"sups\\\"\",\n \"description\": \"Superscript.\"\n },\n {\n \"name\": \"\\\"swsh\\\"\",\n \"description\": \"Swash. Does not apply to ideographic scripts.\"\n },\n {\n \"name\": \"\\\"titl\\\"\",\n \"description\": \"Titling.\"\n },\n {\n \"name\": \"\\\"tjmo\\\"\",\n \"description\": \"Trailing Jamo Forms. Required for Hangul script when Ancient Hangul writing system is supported.\"\n },\n {\n \"name\": \"\\\"tnam\\\"\",\n \"description\": \"Traditional Name Forms. Applies only to Japanese.\"\n },\n {\n \"name\": \"\\\"tnum\\\"\",\n \"description\": \"Tabular Figures.\"\n },\n {\n \"name\": \"\\\"trad\\\"\",\n \"description\": \"Traditional Forms. Applies only to Chinese and Japanese.\"\n },\n {\n \"name\": \"\\\"twid\\\"\",\n \"description\": \"Third Widths. Generally used only in CJKV fonts.\"\n },\n {\n \"name\": \"\\\"unic\\\"\",\n \"description\": \"Unicase.\"\n },\n {\n \"name\": \"\\\"valt\\\"\",\n \"description\": \"Alternate Vertical Metrics. Applies only to scripts with vertical writing modes.\"\n },\n {\n \"name\": \"\\\"vatu\\\"\",\n \"description\": \"Vattu Variants. Used for Indic scripts. E.g. Devanagari.\"\n },\n {\n \"name\": \"\\\"vert\\\"\",\n \"description\": \"Vertical Alternates. Applies only to scripts with vertical writing modes.\"\n },\n {\n \"name\": \"\\\"vhal\\\"\",\n \"description\": \"Alternate Vertical Half Metrics. Used only in CJKV fonts.\"\n },\n {\n \"name\": \"\\\"vjmo\\\"\",\n \"description\": \"Vowel Jamo Forms. Required for Hangul script when Ancient Hangul writing system is supported.\"\n },\n {\n \"name\": \"\\\"vkna\\\"\",\n \"description\": \"Vertical Kana Alternates. Applies only to fonts that support kana (hiragana and katakana).\"\n },\n {\n \"name\": \"\\\"vkrn\\\"\",\n \"description\": \"Vertical Kerning.\"\n },\n {\n \"name\": \"\\\"vpal\\\"\",\n \"description\": \"Proportional Alternate Vertical Metrics. Used mostly in CJKV fonts.\"\n },\n {\n \"name\": \"\\\"vrt2\\\"\",\n \"description\": \"Vertical Alternates and Rotation. Applies only to scripts with vertical writing modes.\"\n },\n {\n \"name\": \"\\\"zero\\\"\",\n \"description\": \"Slashed Zero.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"No change in glyph substitution or positioning occurs.\"\n },\n {\n \"name\": \"off\",\n \"description\": \"Disable feature.\"\n },\n {\n \"name\": \"on\",\n \"description\": \"Enable feature.\"\n }\n ],\n \"syntax\": \"normal | <feature-tag-value>#\",\n \"relevance\": 55,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-feature-settings\"\n }\n ],\n \"description\": \"Provides low-level control over OpenType font features. It is intended as a way of providing access to font features that are not widely used but are needed for a particular use case.\",\n \"restrictions\": [\n \"string\",\n \"integer\"\n ]\n },\n {\n \"name\": \"font-kerning\",\n \"browsers\": [\n \"E79\",\n \"FF32\",\n \"S9\",\n \"C33\",\n \"O20\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Specifies that kerning is applied at the discretion of the user agent.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Specifies that kerning is not applied.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Specifies that kerning is applied.\"\n }\n ],\n \"syntax\": \"auto | normal | none\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-kerning\"\n }\n ],\n \"description\": \"Kerning is the contextual adjustment of inter-glyph spacing. This property controls metric kerning, kerning that utilizes adjustment data contained in the font.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-language-override\",\n \"browsers\": [\n \"FF34\"\n ],\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"Implies that when rendering with OpenType fonts the language of the document is used to infer the OpenType language system, used to select language specific features when rendering.\"\n }\n ],\n \"syntax\": \"normal | <string>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-language-override\"\n }\n ],\n \"description\": \"The value of 'normal' implies that when rendering with OpenType fonts the language of the document is used to infer the OpenType language system, used to select language specific features when rendering.\",\n \"restrictions\": [\n \"string\"\n ]\n },\n {\n \"name\": \"font-size\",\n \"values\": [\n {\n \"name\": \"large\"\n },\n {\n \"name\": \"larger\"\n },\n {\n \"name\": \"medium\"\n },\n {\n \"name\": \"small\"\n },\n {\n \"name\": \"smaller\"\n },\n {\n \"name\": \"x-large\"\n },\n {\n \"name\": \"x-small\"\n },\n {\n \"name\": \"xx-large\"\n },\n {\n \"name\": \"xx-small\"\n }\n ],\n \"syntax\": \"<absolute-size> | <relative-size> | <length-percentage>\",\n \"relevance\": 94,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-size\"\n }\n ],\n \"description\": \"Indicates the desired height of glyphs from the font. For scalable fonts, the font-size is a scale factor applied to the EM unit of the font. (Note that certain glyphs may bleed outside their EM box.) For non-scalable fonts, the font-size is converted into absolute units and matched against the declared font-size of the font, using the same absolute coordinate space for both of the matched values.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"font-size-adjust\",\n \"browsers\": [\n \"E79\",\n \"FF40\",\n \"C43\",\n \"O30\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Do not preserve the font\u2019s x-height.\"\n }\n ],\n \"syntax\": \"none | [ ex-height | cap-height | ch-width | ic-width | ic-height ]? [ from-font | <number> ]\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-size-adjust\"\n }\n ],\n \"description\": \"Preserves the readability of text when font fallback occurs by adjusting the font-size so that the x-height is the same regardless of the font used.\",\n \"restrictions\": [\n \"number\"\n ]\n },\n {\n \"name\": \"font-stretch\",\n \"values\": [\n {\n \"name\": \"condensed\"\n },\n {\n \"name\": \"expanded\"\n },\n {\n \"name\": \"extra-condensed\"\n },\n {\n \"name\": \"extra-expanded\"\n },\n {\n \"name\": \"narrower\",\n \"description\": \"Indicates a narrower value relative to the width of the parent element.\"\n },\n {\n \"name\": \"normal\"\n },\n {\n \"name\": \"semi-condensed\"\n },\n {\n \"name\": \"semi-expanded\"\n },\n {\n \"name\": \"ultra-condensed\"\n },\n {\n \"name\": \"ultra-expanded\"\n },\n {\n \"name\": \"wider\",\n \"description\": \"Indicates a wider value relative to the width of the parent element.\"\n }\n ],\n \"syntax\": \"<font-stretch-absolute>{1,2}\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-stretch\"\n }\n ],\n \"description\": \"Selects a normal, condensed, or expanded face from a font family.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-style\",\n \"values\": [\n {\n \"name\": \"italic\",\n \"description\": \"Selects a font that is labeled as an 'italic' face, or an 'oblique' face if one is not\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Selects a face that is classified as 'normal'.\"\n },\n {\n \"name\": \"oblique\",\n \"description\": \"Selects a font that is labeled as an 'oblique' face, or an 'italic' face if one is not.\"\n }\n ],\n \"syntax\": \"normal | italic | oblique <angle>{0,2}\",\n \"relevance\": 84,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-style\"\n }\n ],\n \"description\": \"Allows italic or oblique faces to be selected. Italic forms are generally cursive in nature while oblique faces are typically sloped versions of the regular face.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-synthesis\",\n \"browsers\": [\n \"FF34\",\n \"S9\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Disallow all synthetic faces.\"\n },\n {\n \"name\": \"style\",\n \"description\": \"Allow synthetic italic faces.\"\n },\n {\n \"name\": \"weight\",\n \"description\": \"Allow synthetic bold faces.\"\n }\n ],\n \"syntax\": \"none | [ weight || style || small-caps ]\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-synthesis\"\n }\n ],\n \"description\": \"Controls whether user agents are allowed to synthesize bold or oblique font faces when a font family lacks bold or italic faces.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-variant\",\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"Specifies a face that is not labeled as a small-caps font.\"\n },\n {\n \"name\": \"small-caps\",\n \"description\": \"Specifies a font that is labeled as a small-caps font. If a genuine small-caps font is not available, user agents should simulate a small-caps font.\"\n }\n ],\n \"syntax\": \"normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> || stylistic(<feature-value-name>) || historical-forms || styleset(<feature-value-name>#) || character-variant(<feature-value-name>#) || swash(<feature-value-name>) || ornaments(<feature-value-name>) || annotation(<feature-value-name>) || [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] || <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero || <east-asian-variant-values> || <east-asian-width-values> || ruby ]\",\n \"relevance\": 64,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-variant\"\n }\n ],\n \"description\": \"Specifies variant representations of the font\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-variant-alternates\",\n \"browsers\": [\n \"FF34\",\n \"S9.1\"\n ],\n \"values\": [\n {\n \"name\": \"annotation()\",\n \"description\": \"Enables display of alternate annotation forms.\"\n },\n {\n \"name\": \"character-variant()\",\n \"description\": \"Enables display of specific character variants.\"\n },\n {\n \"name\": \"historical-forms\",\n \"description\": \"Enables display of historical forms.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"None of the features are enabled.\"\n },\n {\n \"name\": \"ornaments()\",\n \"description\": \"Enables replacement of default glyphs with ornaments, if provided in the font.\"\n },\n {\n \"name\": \"styleset()\",\n \"description\": \"Enables display with stylistic sets.\"\n },\n {\n \"name\": \"stylistic()\",\n \"description\": \"Enables display of stylistic alternates.\"\n },\n {\n \"name\": \"swash()\",\n \"description\": \"Enables display of swash glyphs.\"\n }\n ],\n \"syntax\": \"normal | [ stylistic( <feature-value-name> ) || historical-forms || styleset( <feature-value-name># ) || character-variant( <feature-value-name># ) || swash( <feature-value-name> ) || ornaments( <feature-value-name> ) || annotation( <feature-value-name> ) ]\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates\"\n }\n ],\n \"description\": \"For any given character, fonts can provide a variety of alternate glyphs in addition to the default glyph for that character. This property provides control over the selection of these alternate glyphs.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-variant-caps\",\n \"browsers\": [\n \"E79\",\n \"FF34\",\n \"S9.1\",\n \"C52\",\n \"O39\"\n ],\n \"values\": [\n {\n \"name\": \"all-petite-caps\",\n \"description\": \"Enables display of petite capitals for both upper and lowercase letters.\"\n },\n {\n \"name\": \"all-small-caps\",\n \"description\": \"Enables display of small capitals for both upper and lowercase letters.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"None of the features are enabled.\"\n },\n {\n \"name\": \"petite-caps\",\n \"description\": \"Enables display of petite capitals.\"\n },\n {\n \"name\": \"small-caps\",\n \"description\": \"Enables display of small capitals. Small-caps glyphs typically use the form of uppercase letters but are reduced to the size of lowercase letters.\"\n },\n {\n \"name\": \"titling-caps\",\n \"description\": \"Enables display of titling capitals.\"\n },\n {\n \"name\": \"unicase\",\n \"description\": \"Enables display of mixture of small capitals for uppercase letters with normal lowercase letters.\"\n }\n ],\n \"syntax\": \"normal | small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-variant-caps\"\n }\n ],\n \"description\": \"Specifies control over capitalized forms.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-variant-east-asian\",\n \"browsers\": [\n \"E79\",\n \"FF34\",\n \"S9.1\",\n \"C63\",\n \"O50\"\n ],\n \"values\": [\n {\n \"name\": \"full-width\",\n \"description\": \"Enables rendering of full-width variants.\"\n },\n {\n \"name\": \"jis04\",\n \"description\": \"Enables rendering of JIS04 forms.\"\n },\n {\n \"name\": \"jis78\",\n \"description\": \"Enables rendering of JIS78 forms.\"\n },\n {\n \"name\": \"jis83\",\n \"description\": \"Enables rendering of JIS83 forms.\"\n },\n {\n \"name\": \"jis90\",\n \"description\": \"Enables rendering of JIS90 forms.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"None of the features are enabled.\"\n },\n {\n \"name\": \"proportional-width\",\n \"description\": \"Enables rendering of proportionally-spaced variants.\"\n },\n {\n \"name\": \"ruby\",\n \"description\": \"Enables display of ruby variant glyphs.\"\n },\n {\n \"name\": \"simplified\",\n \"description\": \"Enables rendering of simplified forms.\"\n },\n {\n \"name\": \"traditional\",\n \"description\": \"Enables rendering of traditional forms.\"\n }\n ],\n \"syntax\": \"normal | [ <east-asian-variant-values> || <east-asian-width-values> || ruby ]\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-variant-east-asian\"\n }\n ],\n \"description\": \"Allows control of glyph substitute and positioning in East Asian text.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-variant-ligatures\",\n \"browsers\": [\n \"E79\",\n \"FF34\",\n \"S9.1\",\n \"C34\",\n \"O21\"\n ],\n \"values\": [\n {\n \"name\": \"additional-ligatures\",\n \"description\": \"Enables display of additional ligatures.\"\n },\n {\n \"name\": \"common-ligatures\",\n \"description\": \"Enables display of common ligatures.\"\n },\n {\n \"name\": \"contextual\",\n \"browsers\": [\n \"E79\",\n \"FF34\",\n \"S9.1\",\n \"C34\",\n \"O21\"\n ],\n \"description\": \"Enables display of contextual alternates.\"\n },\n {\n \"name\": \"discretionary-ligatures\",\n \"description\": \"Enables display of discretionary ligatures.\"\n },\n {\n \"name\": \"historical-ligatures\",\n \"description\": \"Enables display of historical ligatures.\"\n },\n {\n \"name\": \"no-additional-ligatures\",\n \"description\": \"Disables display of additional ligatures.\"\n },\n {\n \"name\": \"no-common-ligatures\",\n \"description\": \"Disables display of common ligatures.\"\n },\n {\n \"name\": \"no-contextual\",\n \"browsers\": [\n \"E79\",\n \"FF34\",\n \"S9.1\",\n \"C34\",\n \"O21\"\n ],\n \"description\": \"Disables display of contextual alternates.\"\n },\n {\n \"name\": \"no-discretionary-ligatures\",\n \"description\": \"Disables display of discretionary ligatures.\"\n },\n {\n \"name\": \"no-historical-ligatures\",\n \"description\": \"Disables display of historical ligatures.\"\n },\n {\n \"name\": \"none\",\n \"browsers\": [\n \"E79\",\n \"FF34\",\n \"S9.1\",\n \"C34\",\n \"O21\"\n ],\n \"description\": \"Disables all ligatures.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Implies that the defaults set by the font are used.\"\n }\n ],\n \"syntax\": \"normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> ]\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-variant-ligatures\"\n }\n ],\n \"description\": \"Specifies control over which ligatures are enabled or disabled. A value of \u2018normal\u2019 implies that the defaults set by the font are used.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-variant-numeric\",\n \"browsers\": [\n \"E79\",\n \"FF34\",\n \"S9.1\",\n \"C52\",\n \"O39\"\n ],\n \"values\": [\n {\n \"name\": \"diagonal-fractions\",\n \"description\": \"Enables display of lining diagonal fractions.\"\n },\n {\n \"name\": \"lining-nums\",\n \"description\": \"Enables display of lining numerals.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"None of the features are enabled.\"\n },\n {\n \"name\": \"oldstyle-nums\",\n \"description\": \"Enables display of old-style numerals.\"\n },\n {\n \"name\": \"ordinal\",\n \"description\": \"Enables display of letter forms used with ordinal numbers.\"\n },\n {\n \"name\": \"proportional-nums\",\n \"description\": \"Enables display of proportional numerals.\"\n },\n {\n \"name\": \"slashed-zero\",\n \"description\": \"Enables display of slashed zeros.\"\n },\n {\n \"name\": \"stacked-fractions\",\n \"description\": \"Enables display of lining stacked fractions.\"\n },\n {\n \"name\": \"tabular-nums\",\n \"description\": \"Enables display of tabular numerals.\"\n }\n ],\n \"syntax\": \"normal | [ <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero ]\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-variant-numeric\"\n }\n ],\n \"description\": \"Specifies control over numerical forms.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-variant-position\",\n \"browsers\": [\n \"FF34\",\n \"S9.1\"\n ],\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"None of the features are enabled.\"\n },\n {\n \"name\": \"sub\",\n \"description\": \"Enables display of subscript variants (OpenType feature: subs).\"\n },\n {\n \"name\": \"super\",\n \"description\": \"Enables display of superscript variants (OpenType feature: sups).\"\n }\n ],\n \"syntax\": \"normal | sub | super\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-variant-position\"\n }\n ],\n \"description\": \"Specifies the vertical position\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"font-weight\",\n \"values\": [\n {\n \"name\": \"100\",\n \"description\": \"Thin\"\n },\n {\n \"name\": \"200\",\n \"description\": \"Extra Light (Ultra Light)\"\n },\n {\n \"name\": \"300\",\n \"description\": \"Light\"\n },\n {\n \"name\": \"400\",\n \"description\": \"Normal\"\n },\n {\n \"name\": \"500\",\n \"description\": \"Medium\"\n },\n {\n \"name\": \"600\",\n \"description\": \"Semi Bold (Demi Bold)\"\n },\n {\n \"name\": \"700\",\n \"description\": \"Bold\"\n },\n {\n \"name\": \"800\",\n \"description\": \"Extra Bold (Ultra Bold)\"\n },\n {\n \"name\": \"900\",\n \"description\": \"Black (Heavy)\"\n },\n {\n \"name\": \"bold\",\n \"description\": \"Same as 700\"\n },\n {\n \"name\": \"bolder\",\n \"description\": \"Specifies the weight of the face bolder than the inherited value.\"\n },\n {\n \"name\": \"lighter\",\n \"description\": \"Specifies the weight of the face lighter than the inherited value.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Same as 400\"\n }\n ],\n \"syntax\": \"<font-weight-absolute>{1,2}\",\n \"relevance\": 93,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-weight\"\n }\n ],\n \"description\": \"Specifies weight of glyphs in the font, their degree of blackness or stroke thickness.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"glyph-orientation-horizontal\",\n \"relevance\": 50,\n \"description\": \"Controls glyph orientation when the inline-progression-direction is horizontal.\",\n \"restrictions\": [\n \"angle\",\n \"number\"\n ]\n },\n {\n \"name\": \"glyph-orientation-vertical\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Sets the orientation based on the fullwidth or non-fullwidth characters and the most common orientation.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Controls glyph orientation when the inline-progression-direction is vertical.\",\n \"restrictions\": [\n \"angle\",\n \"number\",\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-area\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The property contributes nothing to the grid item\u2019s placement, indicating auto-placement, an automatic span, or a default span of one.\"\n },\n {\n \"name\": \"span\",\n \"description\": \"Contributes a grid span to the grid item\u2019s placement such that the corresponding edge of the grid item\u2019s grid area is N lines from its opposite edge.\"\n }\n ],\n \"syntax\": \"<grid-line> [ / <grid-line> ]{0,3}\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-area\"\n }\n ],\n \"description\": \"Determine a grid item\u2019s size and location within the grid by contributing a line, a span, or nothing (automatic) to its grid placement. Shorthand for 'grid-row-start', 'grid-column-start', 'grid-row-end', and 'grid-column-end'.\",\n \"restrictions\": [\n \"identifier\",\n \"integer\"\n ]\n },\n {\n \"name\": \"grid\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"syntax\": \"<'grid-template'> | <'grid-template-rows'> / [ auto-flow && dense? ] <'grid-auto-columns'>? | [ auto-flow && dense? ] <'grid-auto-rows'>? / <'grid-template-columns'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid\"\n }\n ],\n \"description\": \"The grid CSS property is a shorthand property that sets all of the explicit grid properties ('grid-template-rows', 'grid-template-columns', and 'grid-template-areas'), and all the implicit grid properties ('grid-auto-rows', 'grid-auto-columns', and 'grid-auto-flow'), in a single declaration.\",\n \"restrictions\": [\n \"identifier\",\n \"length\",\n \"percentage\",\n \"string\",\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-auto-columns\",\n \"values\": [\n {\n \"name\": \"min-content\",\n \"description\": \"Represents the largest min-content contribution of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"max-content\",\n \"description\": \"Represents the largest max-content contribution of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"As a maximum, identical to 'max-content'. As a minimum, represents the largest minimum size (as specified by min-width/min-height) of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"minmax()\",\n \"description\": \"Defines a size range greater than or equal to min and less than or equal to max.\"\n }\n ],\n \"syntax\": \"<track-size>+\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-auto-columns\"\n }\n ],\n \"description\": \"Specifies the size of implicitly created columns.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"grid-auto-flow\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"row\",\n \"description\": \"The auto-placement algorithm places items by filling each row in turn, adding new rows as necessary.\"\n },\n {\n \"name\": \"column\",\n \"description\": \"The auto-placement algorithm places items by filling each column in turn, adding new columns as necessary.\"\n },\n {\n \"name\": \"dense\",\n \"description\": \"If specified, the auto-placement algorithm uses a \u201Cdense\u201D packing algorithm, which attempts to fill in holes earlier in the grid if smaller items come up later.\"\n }\n ],\n \"syntax\": \"[ row | column ] || dense\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-auto-flow\"\n }\n ],\n \"description\": \"Controls how the auto-placement algorithm works, specifying exactly how auto-placed items get flowed into the grid.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-auto-rows\",\n \"values\": [\n {\n \"name\": \"min-content\",\n \"description\": \"Represents the largest min-content contribution of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"max-content\",\n \"description\": \"Represents the largest max-content contribution of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"As a maximum, identical to 'max-content'. As a minimum, represents the largest minimum size (as specified by min-width/min-height) of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"minmax()\",\n \"description\": \"Defines a size range greater than or equal to min and less than or equal to max.\"\n }\n ],\n \"syntax\": \"<track-size>+\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-auto-rows\"\n }\n ],\n \"description\": \"Specifies the size of implicitly created rows.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"grid-column\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The property contributes nothing to the grid item\u2019s placement, indicating auto-placement, an automatic span, or a default span of one.\"\n },\n {\n \"name\": \"span\",\n \"description\": \"Contributes a grid span to the grid item\u2019s placement such that the corresponding edge of the grid item\u2019s grid area is N lines from its opposite edge.\"\n }\n ],\n \"syntax\": \"<grid-line> [ / <grid-line> ]?\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-column\"\n }\n ],\n \"description\": \"Shorthand for 'grid-column-start' and 'grid-column-end'.\",\n \"restrictions\": [\n \"identifier\",\n \"integer\",\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-column-end\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The property contributes nothing to the grid item\u2019s placement, indicating auto-placement, an automatic span, or a default span of one.\"\n },\n {\n \"name\": \"span\",\n \"description\": \"Contributes a grid span to the grid item\u2019s placement such that the corresponding edge of the grid item\u2019s grid area is N lines from its opposite edge.\"\n }\n ],\n \"syntax\": \"<grid-line>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-column-end\"\n }\n ],\n \"description\": \"Determine a grid item\u2019s size and location within the grid by contributing a line, a span, or nothing (automatic) to its grid placement.\",\n \"restrictions\": [\n \"identifier\",\n \"integer\",\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-column-gap\",\n \"browsers\": [\n \"FF52\",\n \"C57\",\n \"S10.1\",\n \"O44\"\n ],\n \"status\": \"obsolete\",\n \"syntax\": \"<length-percentage>\",\n \"relevance\": 2,\n \"description\": \"Specifies the gutters between grid columns. Replaced by 'column-gap' property.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"grid-column-start\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The property contributes nothing to the grid item\u2019s placement, indicating auto-placement, an automatic span, or a default span of one.\"\n },\n {\n \"name\": \"span\",\n \"description\": \"Contributes a grid span to the grid item\u2019s placement such that the corresponding edge of the grid item\u2019s grid area is N lines from its opposite edge.\"\n }\n ],\n \"syntax\": \"<grid-line>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-column-start\"\n }\n ],\n \"description\": \"Determine a grid item\u2019s size and location within the grid by contributing a line, a span, or nothing (automatic) to its grid placement.\",\n \"restrictions\": [\n \"identifier\",\n \"integer\",\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-gap\",\n \"browsers\": [\n \"FF52\",\n \"C57\",\n \"S10.1\",\n \"O44\"\n ],\n \"status\": \"obsolete\",\n \"syntax\": \"<'grid-row-gap'> <'grid-column-gap'>?\",\n \"relevance\": 3,\n \"description\": \"Shorthand that specifies the gutters between grid columns and grid rows in one declaration. Replaced by 'gap' property.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"grid-row\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The property contributes nothing to the grid item\u2019s placement, indicating auto-placement, an automatic span, or a default span of one.\"\n },\n {\n \"name\": \"span\",\n \"description\": \"Contributes a grid span to the grid item\u2019s placement such that the corresponding edge of the grid item\u2019s grid area is N lines from its opposite edge.\"\n }\n ],\n \"syntax\": \"<grid-line> [ / <grid-line> ]?\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-row\"\n }\n ],\n \"description\": \"Shorthand for 'grid-row-start' and 'grid-row-end'.\",\n \"restrictions\": [\n \"identifier\",\n \"integer\",\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-row-end\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The property contributes nothing to the grid item\u2019s placement, indicating auto-placement, an automatic span, or a default span of one.\"\n },\n {\n \"name\": \"span\",\n \"description\": \"Contributes a grid span to the grid item\u2019s placement such that the corresponding edge of the grid item\u2019s grid area is N lines from its opposite edge.\"\n }\n ],\n \"syntax\": \"<grid-line>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-row-end\"\n }\n ],\n \"description\": \"Determine a grid item\u2019s size and location within the grid by contributing a line, a span, or nothing (automatic) to its grid placement.\",\n \"restrictions\": [\n \"identifier\",\n \"integer\",\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-row-gap\",\n \"browsers\": [\n \"FF52\",\n \"C57\",\n \"S10.1\",\n \"O44\"\n ],\n \"status\": \"obsolete\",\n \"syntax\": \"<length-percentage>\",\n \"relevance\": 1,\n \"description\": \"Specifies the gutters between grid rows. Replaced by 'row-gap' property.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"grid-row-start\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The property contributes nothing to the grid item\u2019s placement, indicating auto-placement, an automatic span, or a default span of one.\"\n },\n {\n \"name\": \"span\",\n \"description\": \"Contributes a grid span to the grid item\u2019s placement such that the corresponding edge of the grid item\u2019s grid area is N lines from its opposite edge.\"\n }\n ],\n \"syntax\": \"<grid-line>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-row-start\"\n }\n ],\n \"description\": \"Determine a grid item\u2019s size and location within the grid by contributing a line, a span, or nothing (automatic) to its grid placement.\",\n \"restrictions\": [\n \"identifier\",\n \"integer\",\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-template\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Sets all three properties to their initial values.\"\n },\n {\n \"name\": \"min-content\",\n \"description\": \"Represents the largest min-content contribution of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"max-content\",\n \"description\": \"Represents the largest max-content contribution of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"As a maximum, identical to 'max-content'. As a minimum, represents the largest minimum size (as specified by min-width/min-height) of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"subgrid\",\n \"description\": \"Sets 'grid-template-rows' and 'grid-template-columns' to 'subgrid', and 'grid-template-areas' to its initial value.\"\n },\n {\n \"name\": \"minmax()\",\n \"description\": \"Defines a size range greater than or equal to min and less than or equal to max.\"\n },\n {\n \"name\": \"repeat()\",\n \"description\": \"Represents a repeated fragment of the track list, allowing a large number of columns or rows that exhibit a recurring pattern to be written in a more compact form.\"\n }\n ],\n \"syntax\": \"none | [ <'grid-template-rows'> / <'grid-template-columns'> ] | [ <line-names>? <string> <track-size>? <line-names>? ]+ [ / <explicit-track-list> ]?\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-template\"\n }\n ],\n \"description\": \"Shorthand for setting grid-template-columns, grid-template-rows, and grid-template-areas in a single declaration.\",\n \"restrictions\": [\n \"identifier\",\n \"length\",\n \"percentage\",\n \"string\",\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-template-areas\",\n \"browsers\": [\n \"E16\",\n \"FF52\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The grid container doesn\u2019t define any named grid areas.\"\n }\n ],\n \"syntax\": \"none | <string>+\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-template-areas\"\n }\n ],\n \"description\": \"Specifies named grid areas, which are not associated with any particular grid item, but can be referenced from the grid-placement properties.\",\n \"restrictions\": [\n \"string\"\n ]\n },\n {\n \"name\": \"grid-template-columns\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"There is no explicit grid; any rows/columns will be implicitly generated.\"\n },\n {\n \"name\": \"min-content\",\n \"description\": \"Represents the largest min-content contribution of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"max-content\",\n \"description\": \"Represents the largest max-content contribution of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"As a maximum, identical to 'max-content'. As a minimum, represents the largest minimum size (as specified by min-width/min-height) of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"subgrid\",\n \"description\": \"Indicates that the grid will align to its parent grid in that axis.\"\n },\n {\n \"name\": \"minmax()\",\n \"description\": \"Defines a size range greater than or equal to min and less than or equal to max.\"\n },\n {\n \"name\": \"repeat()\",\n \"description\": \"Represents a repeated fragment of the track list, allowing a large number of columns or rows that exhibit a recurring pattern to be written in a more compact form.\"\n }\n ],\n \"syntax\": \"none | <track-list> | <auto-track-list> | subgrid <line-name-list>?\",\n \"relevance\": 57,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-template-columns\"\n }\n ],\n \"description\": \"specifies, as a space-separated track list, the line names and track sizing functions of the grid.\",\n \"restrictions\": [\n \"identifier\",\n \"length\",\n \"percentage\",\n \"enum\"\n ]\n },\n {\n \"name\": \"grid-template-rows\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"There is no explicit grid; any rows/columns will be implicitly generated.\"\n },\n {\n \"name\": \"min-content\",\n \"description\": \"Represents the largest min-content contribution of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"max-content\",\n \"description\": \"Represents the largest max-content contribution of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"As a maximum, identical to 'max-content'. As a minimum, represents the largest minimum size (as specified by min-width/min-height) of the grid items occupying the grid track.\"\n },\n {\n \"name\": \"subgrid\",\n \"description\": \"Indicates that the grid will align to its parent grid in that axis.\"\n },\n {\n \"name\": \"minmax()\",\n \"description\": \"Defines a size range greater than or equal to min and less than or equal to max.\"\n },\n {\n \"name\": \"repeat()\",\n \"description\": \"Represents a repeated fragment of the track list, allowing a large number of columns or rows that exhibit a recurring pattern to be written in a more compact form.\"\n }\n ],\n \"syntax\": \"none | <track-list> | <auto-track-list> | subgrid <line-name-list>?\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/grid-template-rows\"\n }\n ],\n \"description\": \"specifies, as a space-separated track list, the line names and track sizing functions of the grid.\",\n \"restrictions\": [\n \"identifier\",\n \"length\",\n \"percentage\",\n \"string\",\n \"enum\"\n ]\n },\n {\n \"name\": \"height\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The height depends on the values of other properties.\"\n },\n {\n \"name\": \"fit-content\",\n \"description\": \"Use the fit-content inline size or fit-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"max-content\",\n \"description\": \"Use the max-content inline size or max-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"min-content\",\n \"description\": \"Use the min-content inline size or min-content block size, as appropriate to the writing mode.\"\n }\n ],\n \"syntax\": \"<viewport-length>{1,2}\",\n \"relevance\": 96,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/height\"\n }\n ],\n \"description\": \"Specifies the height of the content area, padding area or border area (depending on 'box-sizing') of certain boxes.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"hyphens\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Conditional hyphenation characters inside a word, if present, take priority over automatic resources when determining hyphenation points within the word.\"\n },\n {\n \"name\": \"manual\",\n \"description\": \"Words are only broken at line breaks where there are characters inside the word that suggest line break opportunities\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Words are not broken at line breaks, even if characters inside the word suggest line break points.\"\n }\n ],\n \"syntax\": \"none | manual | auto\",\n \"relevance\": 55,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/hyphens\"\n }\n ],\n \"description\": \"Controls whether hyphenation is allowed to create more break opportunities within a line of text.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"image-orientation\",\n \"browsers\": [\n \"E81\",\n \"FF26\",\n \"S13.1\",\n \"C81\",\n \"O67\"\n ],\n \"values\": [\n {\n \"name\": \"flip\",\n \"description\": \"After rotating by the precededing angle, the image is flipped horizontally. Defaults to 0deg if the angle is ommitted.\"\n },\n {\n \"name\": \"from-image\",\n \"description\": \"If the image has an orientation specified in its metadata, such as EXIF, this value computes to the angle that the metadata specifies is necessary to correctly orient the image.\"\n }\n ],\n \"syntax\": \"from-image | <angle> | [ <angle>? flip ]\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/image-orientation\"\n }\n ],\n \"description\": \"Specifies an orthogonal rotation to be applied to an image before it is laid out.\",\n \"restrictions\": [\n \"angle\"\n ]\n },\n {\n \"name\": \"image-rendering\",\n \"browsers\": [\n \"E79\",\n \"FF3.6\",\n \"S6\",\n \"C13\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The image should be scaled with an algorithm that maximizes the appearance of the image.\"\n },\n {\n \"name\": \"crisp-edges\",\n \"description\": \"The image must be scaled with an algorithm that preserves contrast and edges in the image, and which does not smooth colors or introduce blur to the image in the process.\"\n },\n {\n \"name\": \"-moz-crisp-edges\",\n \"browsers\": [\n \"E79\",\n \"FF3.6\",\n \"S6\",\n \"C13\",\n \"O15\"\n ]\n },\n {\n \"name\": \"optimizeQuality\",\n \"description\": \"Deprecated.\"\n },\n {\n \"name\": \"optimizeSpeed\",\n \"description\": \"Deprecated.\"\n },\n {\n \"name\": \"pixelated\",\n \"description\": \"When scaling the image up, the 'nearest neighbor' or similar algorithm must be used, so that the image appears to be simply composed of very large pixels.\"\n }\n ],\n \"syntax\": \"auto | crisp-edges | pixelated\",\n \"relevance\": 55,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/image-rendering\"\n }\n ],\n \"description\": \"Provides a hint to the user-agent about what aspects of an image are most important to preserve when the image is scaled, to aid the user-agent in the choice of an appropriate scaling algorithm.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"ime-mode\",\n \"browsers\": [\n \"E12\",\n \"FF3\",\n \"IE5\"\n ],\n \"values\": [\n {\n \"name\": \"active\",\n \"description\": \"The input method editor is initially active; text entry is performed using it unless the user specifically dismisses it.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"No change is made to the current input method editor state. This is the default.\"\n },\n {\n \"name\": \"disabled\",\n \"description\": \"The input method editor is disabled and may not be activated by the user.\"\n },\n {\n \"name\": \"inactive\",\n \"description\": \"The input method editor is initially inactive, but the user may activate it if they wish.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"The IME state should be normal; this value can be used in a user style sheet to override the page setting.\"\n }\n ],\n \"status\": \"obsolete\",\n \"syntax\": \"auto | normal | active | inactive | disabled\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/ime-mode\"\n }\n ],\n \"description\": \"Controls the state of the input method editor for text fields.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"inline-size\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Depends on the values of other properties.\"\n }\n ],\n \"syntax\": \"<'width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/inline-size\"\n }\n ],\n \"description\": \"Size of an element in the direction specified by 'writing-mode'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"isolation\",\n \"browsers\": [\n \"E79\",\n \"FF36\",\n \"S8\",\n \"C41\",\n \"O30\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Elements are not isolated unless an operation is applied that causes the creation of a stacking context.\"\n },\n {\n \"name\": \"isolate\",\n \"description\": \"In CSS will turn the element into a stacking context.\"\n }\n ],\n \"syntax\": \"auto | isolate\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/isolation\"\n }\n ],\n \"description\": \"In CSS setting to 'isolate' will turn the element into a stacking context. In SVG, it defines whether an element is isolated or not.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"justify-content\",\n \"values\": [\n {\n \"name\": \"center\",\n \"description\": \"Flex items are packed toward the center of the line.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"The items are packed flush to each other toward the start edge of the alignment container in the main axis.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"The items are packed flush to each other toward the end edge of the alignment container in the main axis.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"The items are packed flush to each other toward the left edge of the alignment container in the main axis.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"The items are packed flush to each other toward the right edge of the alignment container in the main axis.\"\n },\n {\n \"name\": \"safe\",\n \"description\": \"If the size of the item overflows the alignment container, the item is instead aligned as if the alignment mode were start.\"\n },\n {\n \"name\": \"unsafe\",\n \"description\": \"Regardless of the relative sizes of the item and alignment container, the given alignment value is honored.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"If the combined size of the alignment subjects is less than the size of the alignment container, any auto-sized alignment subjects have their size increased equally (not proportionally), while still respecting the constraints imposed by max-height/max-width (or equivalent functionality), so that the combined size exactly fills the alignment container.\"\n },\n {\n \"name\": \"space-evenly\",\n \"description\": \"The items are evenly distributed within the alignment container along the main axis.\"\n },\n {\n \"name\": \"flex-end\",\n \"description\": \"Flex items are packed toward the end of the line.\"\n },\n {\n \"name\": \"flex-start\",\n \"description\": \"Flex items are packed toward the start of the line.\"\n },\n {\n \"name\": \"space-around\",\n \"description\": \"Flex items are evenly distributed in the line, with half-size spaces on either end.\"\n },\n {\n \"name\": \"space-between\",\n \"description\": \"Flex items are evenly distributed in the line.\"\n },\n {\n \"name\": \"baseline\",\n \"description\": \"Specifies participation in first-baseline alignment.\"\n },\n {\n \"name\": \"first baseline\",\n \"description\": \"Specifies participation in first-baseline alignment.\"\n },\n {\n \"name\": \"last baseline\",\n \"description\": \"Specifies participation in last-baseline alignment.\"\n }\n ],\n \"syntax\": \"normal | <content-distribution> | <overflow-position>? [ <content-position> | left | right ]\",\n \"relevance\": 85,\n \"description\": \"Aligns flex items along the main axis of the current line of the flex container.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"kerning\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Indicates that the user agent should adjust inter-glyph spacing based on kerning tables that are included in the font that will be used.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Indicates whether the user agent should adjust inter-glyph spacing based on kerning tables that are included in the relevant font or instead disable auto-kerning and set inter-character spacing to a specific length.\",\n \"restrictions\": [\n \"length\",\n \"enum\"\n ]\n },\n {\n \"name\": \"left\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well\"\n }\n ],\n \"syntax\": \"<length> | <percentage> | auto\",\n \"relevance\": 95,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/left\"\n }\n ],\n \"description\": \"Specifies how far an absolutely positioned box's left margin edge is offset to the right of the left edge of the box's 'containing block'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"letter-spacing\",\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"The spacing is the normal spacing for the current font. It is typically zero-length.\"\n }\n ],\n \"syntax\": \"normal | <length>\",\n \"relevance\": 81,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/letter-spacing\"\n }\n ],\n \"description\": \"Specifies the minimum, maximum, and optimal spacing between grapheme clusters.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"lighting-color\",\n \"browsers\": [\n \"E\",\n \"C5\",\n \"FF3\",\n \"IE10\",\n \"O9\",\n \"S6\"\n ],\n \"relevance\": 50,\n \"description\": \"Defines the color of the light source for filter primitives 'feDiffuseLighting' and 'feSpecularLighting'.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"line-break\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The UA determines the set of line-breaking restrictions to use for CJK scripts, and it may vary the restrictions based on the length of the line; e.g., use a less restrictive set of line-break rules for short lines.\"\n },\n {\n \"name\": \"loose\",\n \"description\": \"Breaks text using the least restrictive set of line-breaking rules. Typically used for short lines, such as in newspapers.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Breaks text using the most common set of line-breaking rules.\"\n },\n {\n \"name\": \"strict\",\n \"description\": \"Breaks CJK scripts using a more restrictive set of line-breaking rules than 'normal'.\"\n }\n ],\n \"syntax\": \"auto | loose | normal | strict | anywhere\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/line-break\"\n }\n ],\n \"description\": \"Specifies what set of line breaking restrictions are in effect within the element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"line-height\",\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"Tells user agents to set the computed value to a 'reasonable' value based on the font size of the element.\"\n }\n ],\n \"syntax\": \"normal | <number> | <length> | <percentage>\",\n \"relevance\": 93,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/line-height\"\n }\n ],\n \"description\": \"Determines the block-progression dimension of the text content area of an inline box.\",\n \"restrictions\": [\n \"number\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"list-style\",\n \"values\": [\n {\n \"name\": \"armenian\"\n },\n {\n \"name\": \"circle\",\n \"description\": \"A hollow circle.\"\n },\n {\n \"name\": \"decimal\"\n },\n {\n \"name\": \"decimal-leading-zero\"\n },\n {\n \"name\": \"disc\",\n \"description\": \"A filled circle.\"\n },\n {\n \"name\": \"georgian\"\n },\n {\n \"name\": \"inside\",\n \"description\": \"The marker box is outside the principal block box, as described in the section on the ::marker pseudo-element below.\"\n },\n {\n \"name\": \"lower-alpha\"\n },\n {\n \"name\": \"lower-greek\"\n },\n {\n \"name\": \"lower-latin\"\n },\n {\n \"name\": \"lower-roman\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"outside\",\n \"description\": \"The ::marker pseudo-element is an inline element placed immediately before all ::before pseudo-elements in the principal block box, after which the element's content flows.\"\n },\n {\n \"name\": \"square\",\n \"description\": \"A filled square.\"\n },\n {\n \"name\": \"symbols()\",\n \"description\": \"Allows a counter style to be defined inline.\"\n },\n {\n \"name\": \"upper-alpha\"\n },\n {\n \"name\": \"upper-latin\"\n },\n {\n \"name\": \"upper-roman\"\n },\n {\n \"name\": \"url()\"\n }\n ],\n \"syntax\": \"<'list-style-type'> || <'list-style-position'> || <'list-style-image'>\",\n \"relevance\": 85,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/list-style\"\n }\n ],\n \"description\": \"Shorthand for setting 'list-style-type', 'list-style-position' and 'list-style-image'\",\n \"restrictions\": [\n \"image\",\n \"enum\",\n \"url\"\n ]\n },\n {\n \"name\": \"list-style-image\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The default contents of the of the list item\u2019s marker are given by 'list-style-type' instead.\"\n }\n ],\n \"syntax\": \"<image> | none\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/list-style-image\"\n }\n ],\n \"description\": \"Sets the image that will be used as the list item marker. When the image is available, it will replace the marker set with the 'list-style-type' marker.\",\n \"restrictions\": [\n \"image\"\n ]\n },\n {\n \"name\": \"list-style-position\",\n \"values\": [\n {\n \"name\": \"inside\",\n \"description\": \"The marker box is outside the principal block box, as described in the section on the ::marker pseudo-element below.\"\n },\n {\n \"name\": \"outside\",\n \"description\": \"The ::marker pseudo-element is an inline element placed immediately before all ::before pseudo-elements in the principal block box, after which the element's content flows.\"\n }\n ],\n \"syntax\": \"inside | outside\",\n \"relevance\": 55,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/list-style-position\"\n }\n ],\n \"description\": \"Specifies the position of the '::marker' pseudo-element's box in the list item.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"list-style-type\",\n \"values\": [\n {\n \"name\": \"armenian\",\n \"description\": \"Traditional uppercase Armenian numbering.\"\n },\n {\n \"name\": \"circle\",\n \"description\": \"A hollow circle.\"\n },\n {\n \"name\": \"decimal\",\n \"description\": \"Western decimal numbers.\"\n },\n {\n \"name\": \"decimal-leading-zero\",\n \"description\": \"Decimal numbers padded by initial zeros.\"\n },\n {\n \"name\": \"disc\",\n \"description\": \"A filled circle.\"\n },\n {\n \"name\": \"georgian\",\n \"description\": \"Traditional Georgian numbering.\"\n },\n {\n \"name\": \"lower-alpha\",\n \"description\": \"Lowercase ASCII letters.\"\n },\n {\n \"name\": \"lower-greek\",\n \"description\": \"Lowercase classical Greek.\"\n },\n {\n \"name\": \"lower-latin\",\n \"description\": \"Lowercase ASCII letters.\"\n },\n {\n \"name\": \"lower-roman\",\n \"description\": \"Lowercase ASCII Roman numerals.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No marker\"\n },\n {\n \"name\": \"square\",\n \"description\": \"A filled square.\"\n },\n {\n \"name\": \"symbols()\",\n \"description\": \"Allows a counter style to be defined inline.\"\n },\n {\n \"name\": \"upper-alpha\",\n \"description\": \"Uppercase ASCII letters.\"\n },\n {\n \"name\": \"upper-latin\",\n \"description\": \"Uppercase ASCII letters.\"\n },\n {\n \"name\": \"upper-roman\",\n \"description\": \"Uppercase ASCII Roman numerals.\"\n }\n ],\n \"syntax\": \"<counter-style> | <string> | none\",\n \"relevance\": 74,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/list-style-type\"\n }\n ],\n \"description\": \"Used to construct the default contents of a list item\u2019s marker\",\n \"restrictions\": [\n \"enum\",\n \"string\"\n ]\n },\n {\n \"name\": \"margin\",\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"syntax\": \"[ <length> | <percentage> | auto ]{1,4}\",\n \"relevance\": 96,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin\"\n }\n ],\n \"description\": \"Shorthand property to set values for the thickness of the margin area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. Negative values for margin properties are allowed, but there may be implementation-specific limits.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"margin-block-end\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"syntax\": \"<'margin-left'>\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-block-end\"\n }\n ],\n \"description\": \"Logical 'margin-bottom'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"margin-block-start\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"syntax\": \"<'margin-left'>\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-block-start\"\n }\n ],\n \"description\": \"Logical 'margin-top'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"margin-bottom\",\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"syntax\": \"<length> | <percentage> | auto\",\n \"relevance\": 91,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-bottom\"\n }\n ],\n \"description\": \"Shorthand property to set values for the thickness of the margin area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. Negative values for margin properties are allowed, but there may be implementation-specific limits..\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"margin-inline-end\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"syntax\": \"<'margin-left'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-inline-end\"\n }\n ],\n \"description\": \"Logical 'margin-right'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"margin-inline-start\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"syntax\": \"<'margin-left'>\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-inline-start\"\n }\n ],\n \"description\": \"Logical 'margin-left'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"margin-left\",\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"syntax\": \"<length> | <percentage> | auto\",\n \"relevance\": 92,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-left\"\n }\n ],\n \"description\": \"Shorthand property to set values for the thickness of the margin area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. Negative values for margin properties are allowed, but there may be implementation-specific limits..\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"margin-right\",\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"syntax\": \"<length> | <percentage> | auto\",\n \"relevance\": 91,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-right\"\n }\n ],\n \"description\": \"Shorthand property to set values for the thickness of the margin area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. Negative values for margin properties are allowed, but there may be implementation-specific limits..\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"margin-top\",\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"syntax\": \"<length> | <percentage> | auto\",\n \"relevance\": 95,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-top\"\n }\n ],\n \"description\": \"Shorthand property to set values for the thickness of the margin area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. Negative values for margin properties are allowed, but there may be implementation-specific limits..\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"marker\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Indicates that no marker symbol will be drawn at the given vertex or vertices.\"\n },\n {\n \"name\": \"url()\",\n \"description\": \"Indicates that the <marker> element referenced will be used.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the marker symbol that shall be used for all points on the sets the value for all vertices on the given \u2018path\u2019 element or basic shape.\",\n \"restrictions\": [\n \"url\"\n ]\n },\n {\n \"name\": \"marker-end\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Indicates that no marker symbol will be drawn at the given vertex or vertices.\"\n },\n {\n \"name\": \"url()\",\n \"description\": \"Indicates that the <marker> element referenced will be used.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the marker that will be drawn at the last vertices of the given markable element.\",\n \"restrictions\": [\n \"url\"\n ]\n },\n {\n \"name\": \"marker-mid\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Indicates that no marker symbol will be drawn at the given vertex or vertices.\"\n },\n {\n \"name\": \"url()\",\n \"description\": \"Indicates that the <marker> element referenced will be used.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the marker that will be drawn at all vertices except the first and last.\",\n \"restrictions\": [\n \"url\"\n ]\n },\n {\n \"name\": \"marker-start\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Indicates that no marker symbol will be drawn at the given vertex or vertices.\"\n },\n {\n \"name\": \"url()\",\n \"description\": \"Indicates that the <marker> element referenced will be used.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the marker that will be drawn at the first vertices of the given markable element.\",\n \"restrictions\": [\n \"url\"\n ]\n },\n {\n \"name\": \"mask-image\",\n \"browsers\": [\n \"E79\",\n \"FF53\",\n \"S4\",\n \"C1\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Counts as a transparent black image layer.\"\n },\n {\n \"name\": \"url()\",\n \"description\": \"Reference to a <mask element or to a CSS image.\"\n }\n ],\n \"syntax\": \"<mask-reference>#\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-image\"\n }\n ],\n \"description\": \"Sets the mask layer image of an element.\",\n \"restrictions\": [\n \"url\",\n \"image\",\n \"enum\"\n ]\n },\n {\n \"name\": \"mask-mode\",\n \"browsers\": [\n \"FF53\"\n ],\n \"values\": [\n {\n \"name\": \"alpha\",\n \"description\": \"Alpha values of the mask layer image should be used as the mask values.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"Use alpha values if 'mask-image' is an image, luminance if a <mask> element or a CSS image.\"\n },\n {\n \"name\": \"luminance\",\n \"description\": \"Luminance values of the mask layer image should be used as the mask values.\"\n }\n ],\n \"syntax\": \"<masking-mode>#\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-mode\"\n }\n ],\n \"description\": \"Indicates whether the mask layer image is treated as luminance mask or alpha mask.\",\n \"restrictions\": [\n \"url\",\n \"image\",\n \"enum\"\n ]\n },\n {\n \"name\": \"mask-origin\",\n \"browsers\": [\n \"E79\",\n \"FF53\",\n \"S4\",\n \"C1\",\n \"O15\"\n ],\n \"syntax\": \"<geometry-box>#\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-origin\"\n }\n ],\n \"description\": \"Specifies the mask positioning area.\",\n \"restrictions\": [\n \"geometry-box\",\n \"enum\"\n ]\n },\n {\n \"name\": \"mask-position\",\n \"browsers\": [\n \"E79\",\n \"FF53\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"syntax\": \"<position>#\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-position\"\n }\n ],\n \"description\": \"Specifies how mask layer images are positioned.\",\n \"restrictions\": [\n \"position\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"mask-repeat\",\n \"browsers\": [\n \"E79\",\n \"FF53\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"syntax\": \"<repeat-style>#\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-repeat\"\n }\n ],\n \"description\": \"Specifies how mask layer images are tiled after they have been sized and positioned.\",\n \"restrictions\": [\n \"repeat\"\n ]\n },\n {\n \"name\": \"mask-size\",\n \"browsers\": [\n \"E79\",\n \"FF53\",\n \"S4\",\n \"C4\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Resolved by using the image\u2019s intrinsic ratio and the size of the other dimension, or failing that, using the image\u2019s intrinsic size, or failing that, treating it as 100%.\"\n },\n {\n \"name\": \"contain\",\n \"description\": \"Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest size such that both its width and its height can fit inside the background positioning area.\"\n },\n {\n \"name\": \"cover\",\n \"description\": \"Scale the image, while preserving its intrinsic aspect ratio (if any), to the smallest size such that both its width and its height can completely cover the background positioning area.\"\n }\n ],\n \"syntax\": \"<bg-size>#\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-size\"\n }\n ],\n \"description\": \"Specifies the size of the mask layer images.\",\n \"restrictions\": [\n \"length\",\n \"percentage\",\n \"enum\"\n ]\n },\n {\n \"name\": \"mask-type\",\n \"browsers\": [\n \"E79\",\n \"FF35\",\n \"S7\",\n \"C24\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"alpha\",\n \"description\": \"Indicates that the alpha values of the mask should be used.\"\n },\n {\n \"name\": \"luminance\",\n \"description\": \"Indicates that the luminance values of the mask should be used.\"\n }\n ],\n \"syntax\": \"luminance | alpha\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-type\"\n }\n ],\n \"description\": \"Defines whether the content of the <mask> element is treated as as luminance mask or alpha mask.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"max-block-size\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No limit on the width of the box.\"\n }\n ],\n \"syntax\": \"<'max-width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/max-block-size\"\n }\n ],\n \"description\": \"Maximum size of an element in the direction opposite that of the direction specified by 'writing-mode'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"max-height\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No limit on the height of the box.\"\n },\n {\n \"name\": \"fit-content\",\n \"description\": \"Use the fit-content inline size or fit-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"max-content\",\n \"description\": \"Use the max-content inline size or max-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"min-content\",\n \"description\": \"Use the min-content inline size or min-content block size, as appropriate to the writing mode.\"\n }\n ],\n \"syntax\": \"<viewport-length>\",\n \"relevance\": 85,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/max-height\"\n }\n ],\n \"description\": \"Allows authors to constrain content height to a certain range.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"max-inline-size\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No limit on the height of the box.\"\n }\n ],\n \"syntax\": \"<'max-width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/max-inline-size\"\n }\n ],\n \"description\": \"Maximum size of an element in the direction specified by 'writing-mode'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"max-width\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No limit on the width of the box.\"\n },\n {\n \"name\": \"fit-content\",\n \"description\": \"Use the fit-content inline size or fit-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"max-content\",\n \"description\": \"Use the max-content inline size or max-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"min-content\",\n \"description\": \"Use the min-content inline size or min-content block size, as appropriate to the writing mode.\"\n }\n ],\n \"syntax\": \"<viewport-length>\",\n \"relevance\": 91,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/max-width\"\n }\n ],\n \"description\": \"Allows authors to constrain content width to a certain range.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"min-block-size\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C57\",\n \"O44\"\n ],\n \"syntax\": \"<'min-width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/min-block-size\"\n }\n ],\n \"description\": \"Minimal size of an element in the direction opposite that of the direction specified by 'writing-mode'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"min-height\",\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"fit-content\",\n \"description\": \"Use the fit-content inline size or fit-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"max-content\",\n \"description\": \"Use the max-content inline size or max-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"min-content\",\n \"description\": \"Use the min-content inline size or min-content block size, as appropriate to the writing mode.\"\n }\n ],\n \"syntax\": \"<viewport-length>\",\n \"relevance\": 89,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/min-height\"\n }\n ],\n \"description\": \"Allows authors to constrain content height to a certain range.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"min-inline-size\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C57\",\n \"O44\"\n ],\n \"syntax\": \"<'min-width'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/min-inline-size\"\n }\n ],\n \"description\": \"Minimal size of an element in the direction specified by 'writing-mode'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"min-width\",\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"fit-content\",\n \"description\": \"Use the fit-content inline size or fit-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"max-content\",\n \"description\": \"Use the max-content inline size or max-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"min-content\",\n \"description\": \"Use the min-content inline size or min-content block size, as appropriate to the writing mode.\"\n }\n ],\n \"syntax\": \"<viewport-length>\",\n \"relevance\": 88,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/min-width\"\n }\n ],\n \"description\": \"Allows authors to constrain content width to a certain range.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"mix-blend-mode\",\n \"browsers\": [\n \"E79\",\n \"FF32\",\n \"S8\",\n \"C41\",\n \"O28\"\n ],\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"Default attribute which specifies no blending\"\n },\n {\n \"name\": \"multiply\",\n \"description\": \"The source color is multiplied by the destination color and replaces the destination.\"\n },\n {\n \"name\": \"screen\",\n \"description\": \"Multiplies the complements of the backdrop and source color values, then complements the result.\"\n },\n {\n \"name\": \"overlay\",\n \"description\": \"Multiplies or screens the colors, depending on the backdrop color value.\"\n },\n {\n \"name\": \"darken\",\n \"description\": \"Selects the darker of the backdrop and source colors.\"\n },\n {\n \"name\": \"lighten\",\n \"description\": \"Selects the lighter of the backdrop and source colors.\"\n },\n {\n \"name\": \"color-dodge\",\n \"description\": \"Brightens the backdrop color to reflect the source color.\"\n },\n {\n \"name\": \"color-burn\",\n \"description\": \"Darkens the backdrop color to reflect the source color.\"\n },\n {\n \"name\": \"hard-light\",\n \"description\": \"Multiplies or screens the colors, depending on the source color value.\"\n },\n {\n \"name\": \"soft-light\",\n \"description\": \"Darkens or lightens the colors, depending on the source color value.\"\n },\n {\n \"name\": \"difference\",\n \"description\": \"Subtracts the darker of the two constituent colors from the lighter color..\"\n },\n {\n \"name\": \"exclusion\",\n \"description\": \"Produces an effect similar to that of the Difference mode but lower in contrast.\"\n },\n {\n \"name\": \"hue\",\n \"browsers\": [\n \"E79\",\n \"FF32\",\n \"S8\",\n \"C41\",\n \"O28\"\n ],\n \"description\": \"Creates a color with the hue of the source color and the saturation and luminosity of the backdrop color.\"\n },\n {\n \"name\": \"saturation\",\n \"browsers\": [\n \"E79\",\n \"FF32\",\n \"S8\",\n \"C41\",\n \"O28\"\n ],\n \"description\": \"Creates a color with the saturation of the source color and the hue and luminosity of the backdrop color.\"\n },\n {\n \"name\": \"color\",\n \"browsers\": [\n \"E79\",\n \"FF32\",\n \"S8\",\n \"C41\",\n \"O28\"\n ],\n \"description\": \"Creates a color with the hue and saturation of the source color and the luminosity of the backdrop color.\"\n },\n {\n \"name\": \"luminosity\",\n \"browsers\": [\n \"E79\",\n \"FF32\",\n \"S8\",\n \"C41\",\n \"O28\"\n ],\n \"description\": \"Creates a color with the luminosity of the source color and the hue and saturation of the backdrop color.\"\n }\n ],\n \"syntax\": \"<blend-mode>\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mix-blend-mode\"\n }\n ],\n \"description\": \"Defines the formula that must be used to mix the colors with the backdrop.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"motion\",\n \"browsers\": [\n \"C46\",\n \"O33\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No motion path gets created.\"\n },\n {\n \"name\": \"path()\",\n \"description\": \"Defines an SVG path as a string, with optional 'fill-rule' as the first argument.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"Indicates that the object is rotated by the angle of the direction of the motion path.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"Indicates that the object is rotated by the angle of the direction of the motion path plus 180 degrees.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property for setting 'motion-path', 'motion-offset' and 'motion-rotation'.\",\n \"restrictions\": [\n \"url\",\n \"length\",\n \"percentage\",\n \"angle\",\n \"shape\",\n \"geometry-box\",\n \"enum\"\n ]\n },\n {\n \"name\": \"motion-offset\",\n \"browsers\": [\n \"C46\",\n \"O33\"\n ],\n \"relevance\": 50,\n \"description\": \"A distance that describes the position along the specified motion path.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"motion-path\",\n \"browsers\": [\n \"C46\",\n \"O33\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No motion path gets created.\"\n },\n {\n \"name\": \"path()\",\n \"description\": \"Defines an SVG path as a string, with optional 'fill-rule' as the first argument.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the motion path the element gets positioned at.\",\n \"restrictions\": [\n \"url\",\n \"shape\",\n \"geometry-box\",\n \"enum\"\n ]\n },\n {\n \"name\": \"motion-rotation\",\n \"browsers\": [\n \"C46\",\n \"O33\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Indicates that the object is rotated by the angle of the direction of the motion path.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"Indicates that the object is rotated by the angle of the direction of the motion path plus 180 degrees.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines the direction of the element while positioning along the motion path.\",\n \"restrictions\": [\n \"angle\"\n ]\n },\n {\n \"name\": \"-moz-animation\",\n \"browsers\": [\n \"FF9\"\n ],\n \"values\": [\n {\n \"name\": \"alternate\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction.\"\n },\n {\n \"name\": \"alternate-reverse\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction.\"\n },\n {\n \"name\": \"backwards\",\n \"description\": \"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'.\"\n },\n {\n \"name\": \"both\",\n \"description\": \"Both forwards and backwards fill modes are applied.\"\n },\n {\n \"name\": \"forwards\",\n \"description\": \"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes.\"\n },\n {\n \"name\": \"infinite\",\n \"description\": \"Causes the animation to repeat forever.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No animation is performed\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Normal playback.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"All iterations of the animation are played in the reverse direction from the way they were specified.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property combines six of the animation properties into a single property.\",\n \"restrictions\": [\n \"time\",\n \"enum\",\n \"timing-function\",\n \"identifier\",\n \"number\"\n ]\n },\n {\n \"name\": \"-moz-animation-delay\",\n \"browsers\": [\n \"FF9\"\n ],\n \"relevance\": 50,\n \"description\": \"Defines when the animation will start.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-moz-animation-direction\",\n \"browsers\": [\n \"FF9\"\n ],\n \"values\": [\n {\n \"name\": \"alternate\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction.\"\n },\n {\n \"name\": \"alternate-reverse\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Normal playback.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"All iterations of the animation are played in the reverse direction from the way they were specified.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines whether or not the animation should play in reverse on alternate cycles.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-animation-duration\",\n \"browsers\": [\n \"FF9\"\n ],\n \"relevance\": 50,\n \"description\": \"Defines the length of time that an animation takes to complete one cycle.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-moz-animation-iteration-count\",\n \"browsers\": [\n \"FF9\"\n ],\n \"values\": [\n {\n \"name\": \"infinite\",\n \"description\": \"Causes the animation to repeat forever.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines the number of times an animation cycle is played. The default value is one, meaning the animation will play from beginning to end once.\",\n \"restrictions\": [\n \"number\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-animation-name\",\n \"browsers\": [\n \"FF9\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No animation is performed\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines a list of animations that apply. Each name is used to select the keyframe at-rule that provides the property values for the animation.\",\n \"restrictions\": [\n \"identifier\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-animation-play-state\",\n \"browsers\": [\n \"FF9\"\n ],\n \"values\": [\n {\n \"name\": \"paused\",\n \"description\": \"A running animation will be paused.\"\n },\n {\n \"name\": \"running\",\n \"description\": \"Resume playback of a paused animation.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines whether the animation is running or paused.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-animation-timing-function\",\n \"browsers\": [\n \"FF9\"\n ],\n \"relevance\": 50,\n \"description\": \"Describes how the animation will progress over one cycle of its duration. See the 'transition-timing-function'.\",\n \"restrictions\": [\n \"timing-function\"\n ]\n },\n {\n \"name\": \"-moz-appearance\",\n \"browsers\": [\n \"FF1\"\n ],\n \"values\": [\n {\n \"name\": \"button\"\n },\n {\n \"name\": \"button-arrow-down\"\n },\n {\n \"name\": \"button-arrow-next\"\n },\n {\n \"name\": \"button-arrow-previous\"\n },\n {\n \"name\": \"button-arrow-up\"\n },\n {\n \"name\": \"button-bevel\"\n },\n {\n \"name\": \"checkbox\"\n },\n {\n \"name\": \"checkbox-container\"\n },\n {\n \"name\": \"checkbox-label\"\n },\n {\n \"name\": \"dialog\"\n },\n {\n \"name\": \"groupbox\"\n },\n {\n \"name\": \"listbox\"\n },\n {\n \"name\": \"menuarrow\"\n },\n {\n \"name\": \"menuimage\"\n },\n {\n \"name\": \"menuitem\"\n },\n {\n \"name\": \"menuitemtext\"\n },\n {\n \"name\": \"menulist\"\n },\n {\n \"name\": \"menulist-button\"\n },\n {\n \"name\": \"menulist-text\"\n },\n {\n \"name\": \"menulist-textfield\"\n },\n {\n \"name\": \"menupopup\"\n },\n {\n \"name\": \"menuradio\"\n },\n {\n \"name\": \"menuseparator\"\n },\n {\n \"name\": \"-moz-mac-unified-toolbar\"\n },\n {\n \"name\": \"-moz-win-borderless-glass\"\n },\n {\n \"name\": \"-moz-win-browsertabbar-toolbox\"\n },\n {\n \"name\": \"-moz-win-communications-toolbox\"\n },\n {\n \"name\": \"-moz-win-glass\"\n },\n {\n \"name\": \"-moz-win-media-toolbox\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"progressbar\"\n },\n {\n \"name\": \"progresschunk\"\n },\n {\n \"name\": \"radio\"\n },\n {\n \"name\": \"radio-container\"\n },\n {\n \"name\": \"radio-label\"\n },\n {\n \"name\": \"radiomenuitem\"\n },\n {\n \"name\": \"resizer\"\n },\n {\n \"name\": \"resizerpanel\"\n },\n {\n \"name\": \"scrollbarbutton-down\"\n },\n {\n \"name\": \"scrollbarbutton-left\"\n },\n {\n \"name\": \"scrollbarbutton-right\"\n },\n {\n \"name\": \"scrollbarbutton-up\"\n },\n {\n \"name\": \"scrollbar-small\"\n },\n {\n \"name\": \"scrollbartrack-horizontal\"\n },\n {\n \"name\": \"scrollbartrack-vertical\"\n },\n {\n \"name\": \"separator\"\n },\n {\n \"name\": \"spinner\"\n },\n {\n \"name\": \"spinner-downbutton\"\n },\n {\n \"name\": \"spinner-textfield\"\n },\n {\n \"name\": \"spinner-upbutton\"\n },\n {\n \"name\": \"statusbar\"\n },\n {\n \"name\": \"statusbarpanel\"\n },\n {\n \"name\": \"tab\"\n },\n {\n \"name\": \"tabpanels\"\n },\n {\n \"name\": \"tab-scroll-arrow-back\"\n },\n {\n \"name\": \"tab-scroll-arrow-forward\"\n },\n {\n \"name\": \"textfield\"\n },\n {\n \"name\": \"textfield-multiline\"\n },\n {\n \"name\": \"toolbar\"\n },\n {\n \"name\": \"toolbox\"\n },\n {\n \"name\": \"tooltip\"\n },\n {\n \"name\": \"treeheadercell\"\n },\n {\n \"name\": \"treeheadersortarrow\"\n },\n {\n \"name\": \"treeitem\"\n },\n {\n \"name\": \"treetwistyopen\"\n },\n {\n \"name\": \"treeview\"\n },\n {\n \"name\": \"treewisty\"\n },\n {\n \"name\": \"window\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | button | button-arrow-down | button-arrow-next | button-arrow-previous | button-arrow-up | button-bevel | button-focus | caret | checkbox | checkbox-container | checkbox-label | checkmenuitem | dualbutton | groupbox | listbox | listitem | menuarrow | menubar | menucheckbox | menuimage | menuitem | menuitemtext | menulist | menulist-button | menulist-text | menulist-textfield | menupopup | menuradio | menuseparator | meterbar | meterchunk | progressbar | progressbar-vertical | progresschunk | progresschunk-vertical | radio | radio-container | radio-label | radiomenuitem | range | range-thumb | resizer | resizerpanel | scale-horizontal | scalethumbend | scalethumb-horizontal | scalethumbstart | scalethumbtick | scalethumb-vertical | scale-vertical | scrollbarbutton-down | scrollbarbutton-left | scrollbarbutton-right | scrollbarbutton-up | scrollbarthumb-horizontal | scrollbarthumb-vertical | scrollbartrack-horizontal | scrollbartrack-vertical | searchfield | separator | sheet | spinner | spinner-downbutton | spinner-textfield | spinner-upbutton | splitter | statusbar | statusbarpanel | tab | tabpanel | tabpanels | tab-scroll-arrow-back | tab-scroll-arrow-forward | textfield | textfield-multiline | toolbar | toolbarbutton | toolbarbutton-dropdown | toolbargripper | toolbox | tooltip | treeheader | treeheadercell | treeheadersortarrow | treeitem | treeline | treetwisty | treetwistyopen | treeview | -moz-mac-unified-toolbar | -moz-win-borderless-glass | -moz-win-browsertabbar-toolbox | -moz-win-communicationstext | -moz-win-communications-toolbox | -moz-win-exclude-glass | -moz-win-glass | -moz-win-mediatext | -moz-win-media-toolbox | -moz-window-button-box | -moz-window-button-box-maximized | -moz-window-button-close | -moz-window-button-maximize | -moz-window-button-minimize | -moz-window-button-restore | -moz-window-frame-bottom | -moz-window-frame-left | -moz-window-frame-right | -moz-window-titlebar | -moz-window-titlebar-maximized\",\n \"relevance\": 0,\n \"description\": \"Used in Gecko (Firefox) to display an element using a platform-native styling based on the operating system's theme.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-backface-visibility\",\n \"browsers\": [\n \"FF10\"\n ],\n \"values\": [\n {\n \"name\": \"hidden\"\n },\n {\n \"name\": \"visible\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Determines whether or not the 'back' side of a transformed element is visible when facing the viewer. With an identity transform, the front side of an element faces the viewer.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-background-clip\",\n \"browsers\": [\n \"FF1-3.6\"\n ],\n \"values\": [\n {\n \"name\": \"padding\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Determines the background painting area.\",\n \"restrictions\": [\n \"box\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-background-inline-policy\",\n \"browsers\": [\n \"FF1\"\n ],\n \"values\": [\n {\n \"name\": \"bounding-box\"\n },\n {\n \"name\": \"continuous\"\n },\n {\n \"name\": \"each-box\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"In Gecko-based applications like Firefox, the -moz-background-inline-policy CSS property specifies how the background image of an inline element is determined when the content of the inline element wraps onto multiple lines. The choice of position has significant effects on repetition.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-background-origin\",\n \"browsers\": [\n \"FF1\"\n ],\n \"relevance\": 50,\n \"description\": \"For elements rendered as a single box, specifies the background positioning area. For elements rendered as multiple boxes (e.g., inline boxes on several lines, boxes on several pages) specifies which boxes 'box-decoration-break' operates on to determine the background positioning area(s).\",\n \"restrictions\": [\n \"box\"\n ]\n },\n {\n \"name\": \"-moz-border-bottom-colors\",\n \"browsers\": [\n \"FF1\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>+ | none\",\n \"relevance\": 0,\n \"description\": \"Sets a list of colors for the bottom border.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-moz-border-image\",\n \"browsers\": [\n \"FF3.6\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"If 'auto' is specified then the border image width is the intrinsic width or height (whichever is applicable) of the corresponding image slice. If the image does not have the required intrinsic dimension then the corresponding border-width is used instead.\"\n },\n {\n \"name\": \"fill\",\n \"description\": \"Causes the middle part of the border-image to be preserved.\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"repeat\",\n \"description\": \"The image is tiled (repeated) to fill the area.\"\n },\n {\n \"name\": \"round\",\n \"description\": \"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the image is rescaled so that it does.\"\n },\n {\n \"name\": \"space\",\n \"description\": \"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the extra space is distributed around the tiles.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"The image is stretched to fill the area.\"\n },\n {\n \"name\": \"url()\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property for setting 'border-image-source', 'border-image-slice', 'border-image-width', 'border-image-outset' and 'border-image-repeat'. Omitted values are set to their initial values.\",\n \"restrictions\": [\n \"length\",\n \"percentage\",\n \"number\",\n \"url\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-border-left-colors\",\n \"browsers\": [\n \"FF1\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>+ | none\",\n \"relevance\": 0,\n \"description\": \"Sets a list of colors for the bottom border.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-moz-border-right-colors\",\n \"browsers\": [\n \"FF1\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>+ | none\",\n \"relevance\": 0,\n \"description\": \"Sets a list of colors for the bottom border.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-moz-border-top-colors\",\n \"browsers\": [\n \"FF1\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>+ | none\",\n \"relevance\": 0,\n \"description\": \"Ske Firefox, -moz-border-bottom-colors sets a list of colors for the bottom border.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-moz-box-align\",\n \"browsers\": [\n \"FF1\"\n ],\n \"values\": [\n {\n \"name\": \"baseline\",\n \"description\": \"If this box orientation is inline-axis or horizontal, all children are placed with their baselines aligned, and extra space placed before or after as necessary. For block flows, the baseline of the first non-empty line box located within the element is used. For tables, the baseline of the first cell is used.\"\n },\n {\n \"name\": \"center\",\n \"description\": \"Any extra space is divided evenly, with half placed above the child and the other half placed after the child.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"For normal direction boxes, the bottom edge of each child is placed along the bottom of the box. Extra space is placed above the element. For reverse direction boxes, the top edge of each child is placed along the top of the box. Extra space is placed below the element.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"For normal direction boxes, the top edge of each child is placed along the top of the box. Extra space is placed below the element. For reverse direction boxes, the bottom edge of each child is placed along the bottom of the box. Extra space is placed above the element.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"The height of each child is adjusted to that of the containing block.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies how a XUL box aligns its contents across (perpendicular to) the direction of its layout. The effect of this is only visible if there is extra space in the box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-box-direction\",\n \"browsers\": [\n \"FF1\"\n ],\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"A box with a computed value of horizontal for box-orient displays its children from left to right. A box with a computed value of vertical displays its children from top to bottom.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"A box with a computed value of horizontal for box-orient displays its children from right to left. A box with a computed value of vertical displays its children from bottom to top.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies whether a box lays out its contents normally (from the top or left edge), or in reverse (from the bottom or right edge).\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-box-flex\",\n \"browsers\": [\n \"FF1\"\n ],\n \"relevance\": 50,\n \"description\": \"Specifies how a box grows to fill the box that contains it, in the direction of the containing box's layout.\",\n \"restrictions\": [\n \"number\"\n ]\n },\n {\n \"name\": \"-moz-box-flexgroup\",\n \"browsers\": [\n \"FF1\"\n ],\n \"relevance\": 50,\n \"description\": \"Flexible elements can be assigned to flex groups using the 'box-flex-group' property.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-moz-box-ordinal-group\",\n \"browsers\": [\n \"FF1\"\n ],\n \"relevance\": 50,\n \"description\": \"Indicates the ordinal group the element belongs to. Elements with a lower ordinal group are displayed before those with a higher ordinal group.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-moz-box-orient\",\n \"browsers\": [\n \"FF1\"\n ],\n \"values\": [\n {\n \"name\": \"block-axis\",\n \"description\": \"Elements are oriented along the box's axis.\"\n },\n {\n \"name\": \"horizontal\",\n \"description\": \"The box displays its children from left to right in a horizontal line.\"\n },\n {\n \"name\": \"inline-axis\",\n \"description\": \"Elements are oriented vertically.\"\n },\n {\n \"name\": \"vertical\",\n \"description\": \"The box displays its children from stacked from top to bottom vertically.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"In Mozilla applications, -moz-box-orient specifies whether a box lays out its contents horizontally or vertically.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-box-pack\",\n \"browsers\": [\n \"FF1\"\n ],\n \"values\": [\n {\n \"name\": \"center\",\n \"description\": \"The extra space is divided evenly, with half placed before the first child and the other half placed after the last child.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"For normal direction boxes, the right edge of the last child is placed at the right side, with all extra space placed before the first child. For reverse direction boxes, the left edge of the first child is placed at the left side, with all extra space placed after the last child.\"\n },\n {\n \"name\": \"justify\",\n \"description\": \"The space is divided evenly in-between each child, with none of the extra space placed before the first child or after the last child. If there is only one child, treat the pack value as if it were start.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"For normal direction boxes, the left edge of the first child is placed at the left side, with all extra space placed after the last child. For reverse direction boxes, the right edge of the last child is placed at the right side, with all extra space placed before the first child.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies how a box packs its contents in the direction of its layout. The effect of this is only visible if there is extra space in the box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-box-sizing\",\n \"browsers\": [\n \"FF1\"\n ],\n \"values\": [\n {\n \"name\": \"border-box\",\n \"description\": \"The specified width and height (and respective min/max properties) on this element determine the border box of the element.\"\n },\n {\n \"name\": \"content-box\",\n \"description\": \"Behavior of width and height as specified by CSS2.1. The specified width and height (and respective min/max properties) apply to the width and height respectively of the content box of the element.\"\n },\n {\n \"name\": \"padding-box\",\n \"description\": \"The specified width and height (and respective min/max properties) on this element determine the padding box of the element.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Box Model addition in CSS3.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-column-count\",\n \"browsers\": [\n \"FF3.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Determines the number of columns by the 'column-width' property and the element width.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes the optimal number of columns into which the content of the element will be flowed.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-moz-column-gap\",\n \"browsers\": [\n \"FF3.5\"\n ],\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"User agent specific and typically equivalent to 1em.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Sets the gap between columns. If there is a column rule between columns, it will appear in the middle of the gap.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-moz-column-rule\",\n \"browsers\": [\n \"FF3.5\"\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand for setting 'column-rule-width', 'column-rule-style', and 'column-rule-color' at the same place in the style sheet. Omitted values are set to their initial values.\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"-moz-column-rule-color\",\n \"browsers\": [\n \"FF3.5\"\n ],\n \"relevance\": 50,\n \"description\": \"Sets the color of the column rule\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-moz-column-rule-style\",\n \"browsers\": [\n \"FF3.5\"\n ],\n \"relevance\": 50,\n \"description\": \"Sets the style of the rule between columns of an element.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"-moz-column-rule-width\",\n \"browsers\": [\n \"FF3.5\"\n ],\n \"relevance\": 50,\n \"description\": \"Sets the width of the rule between columns. Negative values are not allowed.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"-moz-columns\",\n \"browsers\": [\n \"FF9\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The width depends on the values of other properties.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"A shorthand property which sets both 'column-width' and 'column-count'.\",\n \"restrictions\": [\n \"length\",\n \"integer\"\n ]\n },\n {\n \"name\": \"-moz-column-width\",\n \"browsers\": [\n \"FF3.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The width depends on the values of other properties.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"This property describes the width of columns in multicol elements.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-moz-font-feature-settings\",\n \"browsers\": [\n \"FF4\"\n ],\n \"values\": [\n {\n \"name\": \"\\\"c2cs\\\"\"\n },\n {\n \"name\": \"\\\"dlig\\\"\"\n },\n {\n \"name\": \"\\\"kern\\\"\"\n },\n {\n \"name\": \"\\\"liga\\\"\"\n },\n {\n \"name\": \"\\\"lnum\\\"\"\n },\n {\n \"name\": \"\\\"onum\\\"\"\n },\n {\n \"name\": \"\\\"smcp\\\"\"\n },\n {\n \"name\": \"\\\"swsh\\\"\"\n },\n {\n \"name\": \"\\\"tnum\\\"\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"No change in glyph substitution or positioning occurs.\"\n },\n {\n \"name\": \"off\",\n \"browsers\": [\n \"FF4\"\n ]\n },\n {\n \"name\": \"on\",\n \"browsers\": [\n \"FF4\"\n ]\n }\n ],\n \"relevance\": 50,\n \"description\": \"Provides low-level control over OpenType font features. It is intended as a way of providing access to font features that are not widely used but are needed for a particular use case.\",\n \"restrictions\": [\n \"string\",\n \"integer\"\n ]\n },\n {\n \"name\": \"-moz-hyphens\",\n \"browsers\": [\n \"FF9\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Conditional hyphenation characters inside a word, if present, take priority over automatic resources when determining hyphenation points within the word.\"\n },\n {\n \"name\": \"manual\",\n \"description\": \"Words are only broken at line breaks where there are characters inside the word that suggest line break opportunities\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Words are not broken at line breaks, even if characters inside the word suggest line break points.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Controls whether hyphenation is allowed to create more break opportunities within a line of text.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-perspective\",\n \"browsers\": [\n \"FF10\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No perspective transform is applied.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Applies the same transform as the perspective(<number>) transform function, except that it applies only to the positioned or transformed children of the element, not to the transform on the element itself.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-moz-perspective-origin\",\n \"browsers\": [\n \"FF10\"\n ],\n \"relevance\": 50,\n \"description\": \"Establishes the origin for the perspective property. It effectively sets the X and Y position at which the viewer appears to be looking at the children of the element.\",\n \"restrictions\": [\n \"position\",\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"-moz-text-align-last\",\n \"browsers\": [\n \"FF12\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"center\",\n \"description\": \"The inline contents are centered within the line box.\"\n },\n {\n \"name\": \"justify\",\n \"description\": \"The text is justified according to the method specified by the 'text-justify' property.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"The inline contents are aligned to the left edge of the line box. In vertical text, 'left' aligns to the edge of the line box that would be the start edge for left-to-right text.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"The inline contents are aligned to the right edge of the line box. In vertical text, 'right' aligns to the edge of the line box that would be the end edge for left-to-right text.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes how the last line of a block or a line right before a forced line break is aligned when 'text-align' is set to 'justify'.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-text-decoration-color\",\n \"browsers\": [\n \"FF6\"\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the color of text decoration (underlines overlines, and line-throughs) set on the element with text-decoration-line.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-moz-text-decoration-line\",\n \"browsers\": [\n \"FF6\"\n ],\n \"values\": [\n {\n \"name\": \"line-through\",\n \"description\": \"Each line of text has a line through the middle.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Neither produces nor inhibits text decoration.\"\n },\n {\n \"name\": \"overline\",\n \"description\": \"Each line of text has a line above it.\"\n },\n {\n \"name\": \"underline\",\n \"description\": \"Each line of text is underlined.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies what line decorations, if any, are added to the element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-text-decoration-style\",\n \"browsers\": [\n \"FF6\"\n ],\n \"values\": [\n {\n \"name\": \"dashed\",\n \"description\": \"Produces a dashed line style.\"\n },\n {\n \"name\": \"dotted\",\n \"description\": \"Produces a dotted line.\"\n },\n {\n \"name\": \"double\",\n \"description\": \"Produces a double line.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Produces no line.\"\n },\n {\n \"name\": \"solid\",\n \"description\": \"Produces a solid line.\"\n },\n {\n \"name\": \"wavy\",\n \"description\": \"Produces a wavy line.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the line style for underline, line-through and overline text decoration.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-text-size-adjust\",\n \"browsers\": [\n \"FF\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Renderers must use the default size adjustment when displaying on a small device.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Renderers must not do size adjustment when displaying on a small device.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies a size adjustment for displaying text content in mobile browsers.\",\n \"restrictions\": [\n \"enum\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-moz-transform\",\n \"browsers\": [\n \"FF3.5\"\n ],\n \"values\": [\n {\n \"name\": \"matrix()\",\n \"description\": \"Specifies a 2D transformation in the form of a transformation matrix of six values. matrix(a,b,c,d,e,f) is equivalent to applying the transformation matrix [a b c d e f]\"\n },\n {\n \"name\": \"matrix3d()\",\n \"description\": \"Specifies a 3D transformation as a 4x4 homogeneous matrix of 16 values in column-major order.\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"perspective\",\n \"description\": \"Specifies a perspective projection matrix.\"\n },\n {\n \"name\": \"rotate()\",\n \"description\": \"Specifies a 2D rotation by the angle specified in the parameter about the origin of the element, as defined by the transform-origin property.\"\n },\n {\n \"name\": \"rotate3d()\",\n \"description\": \"Specifies a clockwise 3D rotation by the angle specified in last parameter about the [x,y,z] direction vector described by the first 3 parameters.\"\n },\n {\n \"name\": \"rotateX('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the X axis.\"\n },\n {\n \"name\": \"rotateY('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the Y axis.\"\n },\n {\n \"name\": \"rotateZ('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the Z axis.\"\n },\n {\n \"name\": \"scale()\",\n \"description\": \"Specifies a 2D scale operation by the [sx,sy] scaling vector described by the 2 parameters. If the second parameter is not provided, it is takes a value equal to the first.\"\n },\n {\n \"name\": \"scale3d()\",\n \"description\": \"Specifies a 3D scale operation by the [sx,sy,sz] scaling vector described by the 3 parameters.\"\n },\n {\n \"name\": \"scaleX()\",\n \"description\": \"Specifies a scale operation using the [sx,1] scaling vector, where sx is given as the parameter.\"\n },\n {\n \"name\": \"scaleY()\",\n \"description\": \"Specifies a scale operation using the [sy,1] scaling vector, where sy is given as the parameter.\"\n },\n {\n \"name\": \"scaleZ()\",\n \"description\": \"Specifies a scale operation using the [1,1,sz] scaling vector, where sz is given as the parameter.\"\n },\n {\n \"name\": \"skew()\",\n \"description\": \"Specifies a skew transformation along the X and Y axes. The first angle parameter specifies the skew on the X axis. The second angle parameter specifies the skew on the Y axis. If the second parameter is not given then a value of 0 is used for the Y angle (ie: no skew on the Y axis).\"\n },\n {\n \"name\": \"skewX()\",\n \"description\": \"Specifies a skew transformation along the X axis by the given angle.\"\n },\n {\n \"name\": \"skewY()\",\n \"description\": \"Specifies a skew transformation along the Y axis by the given angle.\"\n },\n {\n \"name\": \"translate()\",\n \"description\": \"Specifies a 2D translation by the vector [tx, ty], where tx is the first translation-value parameter and ty is the optional second translation-value parameter.\"\n },\n {\n \"name\": \"translate3d()\",\n \"description\": \"Specifies a 3D translation by the vector [tx,ty,tz], with tx, ty and tz being the first, second and third translation-value parameters respectively.\"\n },\n {\n \"name\": \"translateX()\",\n \"description\": \"Specifies a translation by the given amount in the X direction.\"\n },\n {\n \"name\": \"translateY()\",\n \"description\": \"Specifies a translation by the given amount in the Y direction.\"\n },\n {\n \"name\": \"translateZ()\",\n \"description\": \"Specifies a translation by the given amount in the Z direction. Note that percentage values are not allowed in the translateZ translation-value, and if present are evaluated as 0.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"A two-dimensional transformation is applied to an element through the 'transform' property. This property contains a list of transform functions similar to those allowed by SVG.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-transform-origin\",\n \"browsers\": [\n \"FF3.5\"\n ],\n \"relevance\": 50,\n \"description\": \"Establishes the origin of transformation for an element.\",\n \"restrictions\": [\n \"position\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-moz-transition\",\n \"browsers\": [\n \"FF4\"\n ],\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"Every property that is able to undergo a transition will do so.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No property will transition.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property combines four of the transition properties into a single property.\",\n \"restrictions\": [\n \"time\",\n \"property\",\n \"timing-function\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-moz-transition-delay\",\n \"browsers\": [\n \"FF4\"\n ],\n \"relevance\": 50,\n \"description\": \"Defines when the transition will start. It allows a transition to begin execution some period of time from when it is applied.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-moz-transition-duration\",\n \"browsers\": [\n \"FF4\"\n ],\n \"relevance\": 50,\n \"description\": \"Specifies how long the transition from the old value to the new value should take.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-moz-transition-property\",\n \"browsers\": [\n \"FF4\"\n ],\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"Every property that is able to undergo a transition will do so.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No property will transition.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the name of the CSS property to which the transition is applied.\",\n \"restrictions\": [\n \"property\"\n ]\n },\n {\n \"name\": \"-moz-transition-timing-function\",\n \"browsers\": [\n \"FF4\"\n ],\n \"relevance\": 50,\n \"description\": \"Describes how the intermediate values used during a transition will be calculated.\",\n \"restrictions\": [\n \"timing-function\"\n ]\n },\n {\n \"name\": \"-moz-user-focus\",\n \"browsers\": [\n \"FF1\"\n ],\n \"values\": [\n {\n \"name\": \"ignore\"\n },\n {\n \"name\": \"normal\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"ignore | normal | select-after | select-before | select-menu | select-same | select-all | none\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-user-focus\"\n }\n ],\n \"description\": \"Used to indicate whether the element can have focus.\"\n },\n {\n \"name\": \"-moz-user-select\",\n \"browsers\": [\n \"FF1.5\"\n ],\n \"values\": [\n {\n \"name\": \"all\"\n },\n {\n \"name\": \"element\"\n },\n {\n \"name\": \"elements\"\n },\n {\n \"name\": \"-moz-all\"\n },\n {\n \"name\": \"-moz-none\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"text\"\n },\n {\n \"name\": \"toggle\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Controls the appearance of selection.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-accelerator\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"false\",\n \"description\": \"The element does not contain an accelerator key sequence.\"\n },\n {\n \"name\": \"true\",\n \"description\": \"The element contains an accelerator key sequence.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"false | true\",\n \"relevance\": 0,\n \"description\": \"IE only. Has the ability to turn off its system underlines for accelerator keys until the ALT key is pressed\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-behavior\",\n \"browsers\": [\n \"IE8\"\n ],\n \"relevance\": 50,\n \"description\": \"IE only. Used to extend behaviors of the browser\",\n \"restrictions\": [\n \"url\"\n ]\n },\n {\n \"name\": \"-ms-block-progression\",\n \"browsers\": [\n \"IE8\"\n ],\n \"values\": [\n {\n \"name\": \"bt\",\n \"description\": \"Bottom-to-top block flow. Layout is horizontal.\"\n },\n {\n \"name\": \"lr\",\n \"description\": \"Left-to-right direction. The flow orientation is vertical.\"\n },\n {\n \"name\": \"rl\",\n \"description\": \"Right-to-left direction. The flow orientation is vertical.\"\n },\n {\n \"name\": \"tb\",\n \"description\": \"Top-to-bottom direction. The flow orientation is horizontal.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"tb | rl | bt | lr\",\n \"relevance\": 0,\n \"description\": \"Sets the block-progression value and the flow orientation\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-content-zoom-chaining\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"chained\",\n \"description\": \"The nearest zoomable parent element begins zooming when the user hits a zoom limit during a manipulation. No bounce effect is shown.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"A bounce effect is shown when the user hits a zoom limit during a manipulation.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | chained\",\n \"relevance\": 0,\n \"description\": \"Specifies the zoom behavior that occurs when a user hits the zoom limit during a manipulation.\"\n },\n {\n \"name\": \"-ms-content-zooming\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The element is not zoomable.\"\n },\n {\n \"name\": \"zoom\",\n \"description\": \"The element is zoomable.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | zoom\",\n \"relevance\": 0,\n \"description\": \"Specifies whether zooming is enabled.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-content-zoom-limit\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>\",\n \"relevance\": 0,\n \"description\": \"Shorthand property for the -ms-content-zoom-limit-min and -ms-content-zoom-limit-max properties.\",\n \"restrictions\": [\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-content-zoom-limit-max\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<percentage>\",\n \"relevance\": 0,\n \"description\": \"Specifies the maximum zoom factor.\",\n \"restrictions\": [\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-content-zoom-limit-min\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<percentage>\",\n \"relevance\": 0,\n \"description\": \"Specifies the minimum zoom factor.\",\n \"restrictions\": [\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-content-zoom-snap\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"mandatory\",\n \"description\": \"Indicates that the motion of the content after the contact is picked up is always adjusted so that it lands on a snap-point.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Indicates that zooming is unaffected by any defined snap-points.\"\n },\n {\n \"name\": \"proximity\",\n \"description\": \"Indicates that the motion of the content after the contact is picked up may be adjusted if the content would normally stop \\\"close enough\\\" to a snap-point.\"\n },\n {\n \"name\": \"snapInterval(100%, 100%)\",\n \"description\": \"Specifies where the snap-points will be placed.\"\n },\n {\n \"name\": \"snapList()\",\n \"description\": \"Specifies the position of individual snap-points as a comma-separated list of zoom factors.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<'-ms-content-zoom-snap-type'> || <'-ms-content-zoom-snap-points'>\",\n \"relevance\": 0,\n \"description\": \"Shorthand property for the -ms-content-zoom-snap-type and -ms-content-zoom-snap-points properties.\"\n },\n {\n \"name\": \"-ms-content-zoom-snap-points\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"snapInterval(100%, 100%)\",\n \"description\": \"Specifies where the snap-points will be placed.\"\n },\n {\n \"name\": \"snapList()\",\n \"description\": \"Specifies the position of individual snap-points as a comma-separated list of zoom factors.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"snapInterval( <percentage>, <percentage> ) | snapList( <percentage># )\",\n \"relevance\": 0,\n \"description\": \"Defines where zoom snap-points are located.\"\n },\n {\n \"name\": \"-ms-content-zoom-snap-type\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"mandatory\",\n \"description\": \"Indicates that the motion of the content after the contact is picked up is always adjusted so that it lands on a snap-point.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Indicates that zooming is unaffected by any defined snap-points.\"\n },\n {\n \"name\": \"proximity\",\n \"description\": \"Indicates that the motion of the content after the contact is picked up may be adjusted if the content would normally stop \\\"close enough\\\" to a snap-point.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | proximity | mandatory\",\n \"relevance\": 0,\n \"description\": \"Specifies how zooming is affected by defined snap-points.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-filter\",\n \"browsers\": [\n \"IE8-9\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<string>\",\n \"relevance\": 0,\n \"description\": \"IE only. Used to produce visual effects.\",\n \"restrictions\": [\n \"string\"\n ]\n },\n {\n \"name\": \"-ms-flex\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Retrieves the value of the main size property as the used 'flex-basis'.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Expands to '0 0 auto'.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"specifies the parameters of a flexible length: the positive and negative flexibility, and the preferred size.\",\n \"restrictions\": [\n \"length\",\n \"number\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-flex-align\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"baseline\",\n \"description\": \"If the flex item\u2019s inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment.\"\n },\n {\n \"name\": \"center\",\n \"description\": \"The flex item\u2019s margin box is centered in the cross axis within the line.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"The cross-start margin edge of the flexbox item is placed flush with the cross-start edge of the line.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"If the cross size property of the flexbox item is anything other than 'auto', this value is identical to 'start'.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Aligns flex items along the cross axis of the current line of the flex container.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-flex-direction\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"column\",\n \"description\": \"The flex container\u2019s main axis has the same orientation as the block axis of the current writing mode.\"\n },\n {\n \"name\": \"column-reverse\",\n \"description\": \"Same as 'column', except the main-start and main-end directions are swapped.\"\n },\n {\n \"name\": \"row\",\n \"description\": \"The flex container\u2019s main axis has the same orientation as the inline axis of the current writing mode.\"\n },\n {\n \"name\": \"row-reverse\",\n \"description\": \"Same as 'row', except the main-start and main-end directions are swapped.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies how flex items are placed in the flex container, by setting the direction of the flex container\u2019s main axis.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-flex-flow\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"column\",\n \"description\": \"The flex container\u2019s main axis has the same orientation as the block axis of the current writing mode.\"\n },\n {\n \"name\": \"column-reverse\",\n \"description\": \"Same as 'column', except the main-start and main-end directions are swapped.\"\n },\n {\n \"name\": \"nowrap\",\n \"description\": \"The flex container is single-line.\"\n },\n {\n \"name\": \"row\",\n \"description\": \"The flex container\u2019s main axis has the same orientation as the inline axis of the current writing mode.\"\n },\n {\n \"name\": \"wrap\",\n \"description\": \"The flexbox is multi-line.\"\n },\n {\n \"name\": \"wrap-reverse\",\n \"description\": \"Same as 'wrap', except the cross-start and cross-end directions are swapped.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies how flexbox items are placed in the flexbox.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-flex-item-align\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Computes to the value of 'align-items' on the element\u2019s parent, or 'stretch' if the element has no parent. On absolutely positioned elements, it computes to itself.\"\n },\n {\n \"name\": \"baseline\",\n \"description\": \"If the flex item\u2019s inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment.\"\n },\n {\n \"name\": \"center\",\n \"description\": \"The flex item\u2019s margin box is centered in the cross axis within the line.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Allows the default alignment along the cross axis to be overridden for individual flex items.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-flex-line-pack\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"center\",\n \"description\": \"Lines are packed toward the center of the flex container.\"\n },\n {\n \"name\": \"distribute\",\n \"description\": \"Lines are evenly distributed in the flex container, with half-size spaces on either end.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"Lines are packed toward the end of the flex container.\"\n },\n {\n \"name\": \"justify\",\n \"description\": \"Lines are evenly distributed in the flex container.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"Lines are packed toward the start of the flex container.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"Lines stretch to take up the remaining space.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Aligns a flex container\u2019s lines within the flex container when there is extra space in the cross-axis, similar to how 'justify-content' aligns individual items within the main-axis.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-flex-order\",\n \"browsers\": [\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"Controls the order in which children of a flex container appear within the flex container, by assigning them to ordinal groups.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-ms-flex-pack\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"center\",\n \"description\": \"Flex items are packed toward the center of the line.\"\n },\n {\n \"name\": \"distribute\",\n \"description\": \"Flex items are evenly distributed in the line, with half-size spaces on either end.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"Flex items are packed toward the end of the line.\"\n },\n {\n \"name\": \"justify\",\n \"description\": \"Flex items are evenly distributed in the line.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"Flex items are packed toward the start of the line.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Aligns flex items along the main axis of the current line of the flex container.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-flex-wrap\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"nowrap\",\n \"description\": \"The flex container is single-line.\"\n },\n {\n \"name\": \"wrap\",\n \"description\": \"The flexbox is multi-line.\"\n },\n {\n \"name\": \"wrap-reverse\",\n \"description\": \"Same as 'wrap', except the cross-start and cross-end directions are swapped.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Controls whether the flex container is single-line or multi-line, and the direction of the cross-axis, which determines the direction new lines are stacked in.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-flow-from\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The block container is not a CSS Region.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"[ none | <custom-ident> ]#\",\n \"relevance\": 0,\n \"description\": \"Makes a block container a region and associates it with a named flow.\",\n \"restrictions\": [\n \"identifier\"\n ]\n },\n {\n \"name\": \"-ms-flow-into\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The element is not moved to a named flow and normal CSS processing takes place.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"[ none | <custom-ident> ]#\",\n \"relevance\": 0,\n \"description\": \"Places an element or its contents into a named flow.\",\n \"restrictions\": [\n \"identifier\"\n ]\n },\n {\n \"name\": \"-ms-grid-column\",\n \"browsers\": [\n \"E12\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"end\"\n },\n {\n \"name\": \"start\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Used to place grid items and explicitly defined grid cells in the Grid.\",\n \"restrictions\": [\n \"integer\",\n \"string\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-grid-column-align\",\n \"browsers\": [\n \"E12\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"center\",\n \"description\": \"Places the center of the Grid Item's margin box at the center of the Grid Item's column.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"Aligns the end edge of the Grid Item's margin box to the end edge of the Grid Item's column.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"Aligns the starting edge of the Grid Item's margin box to the starting edge of the Grid Item's column.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"Ensures that the Grid Item's margin box is equal to the size of the Grid Item's column.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Aligns the columns in a grid.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-grid-columns\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | <track-list> | <auto-track-list>\",\n \"relevance\": 0,\n \"description\": \"Lays out the columns of the grid.\"\n },\n {\n \"name\": \"-ms-grid-column-span\",\n \"browsers\": [\n \"E12\",\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the number of columns to span.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-ms-grid-layer\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"Grid-layer is similar in concept to z-index, but avoids overloading the meaning of the z-index property, which is applicable only to positioned elements.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-ms-grid-row\",\n \"browsers\": [\n \"E12\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"end\"\n },\n {\n \"name\": \"start\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"grid-row is used to place grid items and explicitly defined grid cells in the Grid.\",\n \"restrictions\": [\n \"integer\",\n \"string\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-grid-row-align\",\n \"browsers\": [\n \"E12\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"center\",\n \"description\": \"Places the center of the Grid Item's margin box at the center of the Grid Item's row.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"Aligns the end edge of the Grid Item's margin box to the end edge of the Grid Item's row.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"Aligns the starting edge of the Grid Item's margin box to the starting edge of the Grid Item's row.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"Ensures that the Grid Item's margin box is equal to the size of the Grid Item's row.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Aligns the rows in a grid.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-grid-rows\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | <track-list> | <auto-track-list>\",\n \"relevance\": 0,\n \"description\": \"Lays out the columns of the grid.\"\n },\n {\n \"name\": \"-ms-grid-row-span\",\n \"browsers\": [\n \"E12\",\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the number of rows to span.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-ms-high-contrast-adjust\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Properties will be adjusted as applicable.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No adjustments will be applied.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"auto | none\",\n \"relevance\": 0,\n \"description\": \"Specifies if properties should be adjusted in high contrast mode.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-hyphenate-limit-chars\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The user agent chooses a value that adapts to the current layout.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"auto | <integer>{1,3}\",\n \"relevance\": 0,\n \"description\": \"Specifies the minimum number of characters in a hyphenated word.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-ms-hyphenate-limit-lines\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"no-limit\",\n \"description\": \"There is no limit.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"no-limit | <integer>\",\n \"relevance\": 0,\n \"description\": \"Indicates the maximum number of successive hyphenated lines in an element.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-ms-hyphenate-limit-zone\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<percentage> | <length>\",\n \"relevance\": 0,\n \"description\": \"Specifies the maximum amount of unfilled space (before justification) that may be left in the line box before hyphenation is triggered to pull part of a word from the next line back up into the current line.\",\n \"restrictions\": [\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-hyphens\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Conditional hyphenation characters inside a word, if present, take priority over automatic resources when determining hyphenation points within the word.\"\n },\n {\n \"name\": \"manual\",\n \"description\": \"Words are only broken at line breaks where there are characters inside the word that suggest line break opportunities\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Words are not broken at line breaks, even if characters inside the word suggest line break points.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Controls whether hyphenation is allowed to create more break opportunities within a line of text.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-ime-mode\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"active\",\n \"description\": \"The input method editor is initially active; text entry is performed using it unless the user specifically dismisses it.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"No change is made to the current input method editor state. This is the default.\"\n },\n {\n \"name\": \"disabled\",\n \"description\": \"The input method editor is disabled and may not be activated by the user.\"\n },\n {\n \"name\": \"inactive\",\n \"description\": \"The input method editor is initially inactive, but the user may activate it if they wish.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"The IME state should be normal; this value can be used in a user style sheet to override the page setting.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Controls the state of the input method editor for text fields.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-interpolation-mode\",\n \"browsers\": [\n \"IE7\"\n ],\n \"values\": [\n {\n \"name\": \"bicubic\"\n },\n {\n \"name\": \"nearest-neighbor\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Gets or sets the interpolation (resampling) method used to stretch images.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-layout-grid\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"char\",\n \"description\": \"Any of the range of character values available to the -ms-layout-grid-char property.\"\n },\n {\n \"name\": \"line\",\n \"description\": \"Any of the range of line values available to the -ms-layout-grid-line property.\"\n },\n {\n \"name\": \"mode\",\n \"description\": \"Any of the range of mode values available to the -ms-layout-grid-mode property.\"\n },\n {\n \"name\": \"type\",\n \"description\": \"Any of the range of type values available to the -ms-layout-grid-type property.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Sets or retrieves the composite document grid properties that specify the layout of text characters.\"\n },\n {\n \"name\": \"-ms-layout-grid-char\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Largest character in the font of the element is used to set the character grid.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Default. No character grid is set.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Sets or retrieves the size of the character grid used for rendering the text content of an element.\",\n \"restrictions\": [\n \"enum\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-layout-grid-line\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Largest character in the font of the element is used to set the character grid.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Default. No grid line is set.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Sets or retrieves the gridline value used for rendering the text content of an element.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-layout-grid-mode\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"both\",\n \"description\": \"Default. Both the char and line grid modes are enabled. This setting is necessary to fully enable the layout grid on an element.\"\n },\n {\n \"name\": \"char\",\n \"description\": \"Only a character grid is used. This is recommended for use with block-level elements, such as a blockquote, where the line grid is intended to be disabled.\"\n },\n {\n \"name\": \"line\",\n \"description\": \"Only a line grid is used. This is recommended for use with inline elements, such as a span, to disable the horizontal grid on runs of text that act as a single entity in the grid layout.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No grid is used.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Gets or sets whether the text layout grid uses two dimensions.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-layout-grid-type\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"fixed\",\n \"description\": \"Grid used for monospaced layout. All noncursive characters are treated as equal; every character is centered within a single grid space by default.\"\n },\n {\n \"name\": \"loose\",\n \"description\": \"Default. Grid used for Japanese and Korean characters.\"\n },\n {\n \"name\": \"strict\",\n \"description\": \"Grid used for Chinese, as well as Japanese (Genko) and Korean characters. Only the ideographs, kanas, and wide characters are snapped to the grid.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Sets or retrieves the type of grid used for rendering the text content of an element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-line-break\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The UA determines the set of line-breaking restrictions to use for CJK scripts, and it may vary the restrictions based on the length of the line; e.g., use a less restrictive set of line-break rules for short lines.\"\n },\n {\n \"name\": \"keep-all\",\n \"description\": \"Sequences of CJK characters can no longer break on implied break points. This option should only be used where the presence of word separator characters still creates line-breaking opportunities, as in Korean.\"\n },\n {\n \"name\": \"newspaper\",\n \"description\": \"Breaks CJK scripts using the least restrictive set of line-breaking rules. Typically used for short lines, such as in newspapers.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Breaks CJK scripts using a normal set of line-breaking rules.\"\n },\n {\n \"name\": \"strict\",\n \"description\": \"Breaks CJK scripts using a more restrictive set of line-breaking rules than 'normal'.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies what set of line breaking restrictions are in effect within the element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-overflow-style\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"No preference, UA should use the first scrolling method in the list that it supports.\"\n },\n {\n \"name\": \"-ms-autohiding-scrollbar\",\n \"description\": \"Indicates the element displays auto-hiding scrollbars during mouse interactions and panning indicators during touch and keyboard interactions.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Indicates the element does not display scrollbars or panning indicators, even when its content overflows.\"\n },\n {\n \"name\": \"scrollbar\",\n \"description\": \"Scrollbars are typically narrow strips inserted on one or two edges of an element and which often have arrows to click on and a \\\"thumb\\\" to drag up and down (or left and right) to move the contents of the element.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"auto | none | scrollbar | -ms-autohiding-scrollbar\",\n \"relevance\": 0,\n \"description\": \"Specify whether content is clipped when it overflows the element's content area.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-perspective\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No perspective transform is applied.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Applies the same transform as the perspective(<number>) transform function, except that it applies only to the positioned or transformed children of the element, not to the transform on the element itself.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-perspective-origin\",\n \"browsers\": [\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"Establishes the origin for the perspective property. It effectively sets the X and Y position at which the viewer appears to be looking at the children of the element.\",\n \"restrictions\": [\n \"position\",\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-perspective-origin-x\",\n \"browsers\": [\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"Establishes the origin for the perspective property. It effectively sets the X position at which the viewer appears to be looking at the children of the element.\",\n \"restrictions\": [\n \"position\",\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-perspective-origin-y\",\n \"browsers\": [\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"Establishes the origin for the perspective property. It effectively sets the Y position at which the viewer appears to be looking at the children of the element.\",\n \"restrictions\": [\n \"position\",\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-progress-appearance\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"bar\"\n },\n {\n \"name\": \"ring\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Gets or sets a value that specifies whether a progress control displays as a bar or a ring.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-scrollbar-3dlight-color\",\n \"browsers\": [\n \"IE8\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"description\": \"Determines the color of the top and left edges of the scroll box and scroll arrows of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-ms-scrollbar-arrow-color\",\n \"browsers\": [\n \"IE8\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"description\": \"Determines the color of the arrow elements of a scroll arrow.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-ms-scrollbar-base-color\",\n \"browsers\": [\n \"IE8\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"description\": \"Determines the color of the main elements of a scroll bar, which include the scroll box, track, and scroll arrows.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-ms-scrollbar-darkshadow-color\",\n \"browsers\": [\n \"IE8\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"description\": \"Determines the color of the gutter of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-ms-scrollbar-face-color\",\n \"browsers\": [\n \"IE8\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"description\": \"Determines the color of the scroll box and scroll arrows of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-ms-scrollbar-highlight-color\",\n \"browsers\": [\n \"IE8\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"description\": \"Determines the color of the top and left edges of the scroll box and scroll arrows of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-ms-scrollbar-shadow-color\",\n \"browsers\": [\n \"IE8\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"description\": \"Determines the color of the bottom and right edges of the scroll box and scroll arrows of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-ms-scrollbar-track-color\",\n \"browsers\": [\n \"IE5\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-ms-scrollbar-track-color\"\n }\n ],\n \"description\": \"Determines the color of the track element of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-ms-scroll-chaining\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"chained\"\n },\n {\n \"name\": \"none\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"chained | none\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that indicates the scrolling behavior that occurs when a user hits the content boundary during a manipulation.\",\n \"restrictions\": [\n \"enum\",\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-scroll-limit\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a shorthand value that sets values for the -ms-scroll-limit-x-min, -ms-scroll-limit-y-min, -ms-scroll-limit-x-max, and -ms-scroll-limit-y-max properties.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-scroll-limit-x-max\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"auto | <length>\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that specifies the maximum value for the scrollLeft property.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-scroll-limit-x-min\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<length>\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that specifies the minimum value for the scrollLeft property.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-scroll-limit-y-max\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"auto | <length>\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that specifies the maximum value for the scrollTop property.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-scroll-limit-y-min\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<length>\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that specifies the minimum value for the scrollTop property.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-scroll-rails\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"railed\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | railed\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that indicates whether or not small motions perpendicular to the primary axis of motion will result in either changes to both the scrollTop and scrollLeft properties or a change to the primary axis (for instance, either the scrollTop or scrollLeft properties will change, but not both).\",\n \"restrictions\": [\n \"enum\",\n \"length\"\n ]\n },\n {\n \"name\": \"-ms-scroll-snap-points-x\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"snapInterval(100%, 100%)\"\n },\n {\n \"name\": \"snapList()\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"snapInterval( <length-percentage>, <length-percentage> ) | snapList( <length-percentage># )\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that defines where snap-points will be located along the x-axis.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-scroll-snap-points-y\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"snapInterval(100%, 100%)\"\n },\n {\n \"name\": \"snapList()\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"snapInterval( <length-percentage>, <length-percentage> ) | snapList( <length-percentage># )\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that defines where snap-points will be located along the y-axis.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-scroll-snap-type\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The visual viewport of this scroll container must ignore snap points, if any, when scrolled.\"\n },\n {\n \"name\": \"mandatory\",\n \"description\": \"The visual viewport of this scroll container is guaranteed to rest on a snap point when there are no active scrolling operations.\"\n },\n {\n \"name\": \"proximity\",\n \"description\": \"The visual viewport of this scroll container may come to rest on a snap point at the termination of a scroll at the discretion of the UA given the parameters of the scroll.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | proximity | mandatory\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that defines what type of snap-point should be used for the current element. There are two type of snap-points, with the primary difference being whether or not the user is guaranteed to always stop on a snap-point.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-scroll-snap-x\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"mandatory\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"proximity\"\n },\n {\n \"name\": \"snapInterval(100%, 100%)\"\n },\n {\n \"name\": \"snapList()\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a shorthand value that sets values for the -ms-scroll-snap-type and -ms-scroll-snap-points-x properties.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-scroll-snap-y\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"mandatory\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"proximity\"\n },\n {\n \"name\": \"snapInterval(100%, 100%)\"\n },\n {\n \"name\": \"snapList()\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a shorthand value that sets values for the -ms-scroll-snap-type and -ms-scroll-snap-points-y properties.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-scroll-translation\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"vertical-to-horizontal\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | vertical-to-horizontal\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that specifies whether vertical-to-horizontal scroll wheel translation occurs on the specified element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-text-align-last\",\n \"browsers\": [\n \"E\",\n \"IE8\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"center\",\n \"description\": \"The inline contents are centered within the line box.\"\n },\n {\n \"name\": \"justify\",\n \"description\": \"The text is justified according to the method specified by the 'text-justify' property.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"The inline contents are aligned to the left edge of the line box. In vertical text, 'left' aligns to the edge of the line box that would be the start edge for left-to-right text.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"The inline contents are aligned to the right edge of the line box. In vertical text, 'right' aligns to the edge of the line box that would be the end edge for left-to-right text.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes how the last line of a block or a line right before a forced line break is aligned when 'text-align' is set to 'justify'.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-text-autospace\",\n \"browsers\": [\n \"E\",\n \"IE8\"\n ],\n \"values\": [\n {\n \"name\": \"ideograph-alpha\",\n \"description\": \"Creates 1/4em extra spacing between runs of ideographic letters and non-ideographic letters, such as Latin-based, Cyrillic, Greek, Arabic or Hebrew.\"\n },\n {\n \"name\": \"ideograph-numeric\",\n \"description\": \"Creates 1/4em extra spacing between runs of ideographic letters and numeric glyphs.\"\n },\n {\n \"name\": \"ideograph-parenthesis\",\n \"description\": \"Creates extra spacing between normal (non wide) parenthesis and ideographs.\"\n },\n {\n \"name\": \"ideograph-space\",\n \"description\": \"Extends the width of the space character while surrounded by ideographs.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No extra space is created.\"\n },\n {\n \"name\": \"punctuation\",\n \"description\": \"Creates extra non-breaking spacing around punctuation as required by language-specific typographic conventions.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | ideograph-alpha | ideograph-numeric | ideograph-parenthesis | ideograph-space\",\n \"relevance\": 0,\n \"description\": \"Determines whether or not a full-width punctuation mark character should be trimmed if it appears at the beginning of a line, so that its 'ink' lines up with the first glyph in the line above and below.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-text-combine-horizontal\",\n \"browsers\": [\n \"E\",\n \"IE11\"\n ],\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"Attempt to typeset horizontally all consecutive characters within the box such that they take up the space of a single character within the vertical line box.\"\n },\n {\n \"name\": \"digits\",\n \"description\": \"Attempt to typeset horizontally each maximal sequence of consecutive ASCII digits (U+0030\u2013U+0039) that has as many or fewer characters than the specified integer such that it takes up the space of a single character within the vertical line box.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No special processing.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"This property specifies the combination of multiple characters into the space of a single character.\",\n \"restrictions\": [\n \"enum\",\n \"integer\"\n ]\n },\n {\n \"name\": \"-ms-text-justify\",\n \"browsers\": [\n \"E\",\n \"IE8\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The UA determines the justification algorithm to follow, based on a balance between performance and adequate presentation quality.\"\n },\n {\n \"name\": \"distribute\",\n \"description\": \"Justification primarily changes spacing both at word separators and at grapheme cluster boundaries in all scripts except those in the connected and cursive groups. This value is sometimes used in e.g. Japanese, often with the 'text-align-last' property.\"\n },\n {\n \"name\": \"inter-cluster\",\n \"description\": \"Justification primarily changes spacing at word separators and at grapheme cluster boundaries in clustered scripts. This value is typically used for Southeast Asian scripts such as Thai.\"\n },\n {\n \"name\": \"inter-ideograph\",\n \"description\": \"Justification primarily changes spacing at word separators and at inter-graphemic boundaries in scripts that use no word spaces. This value is typically used for CJK languages.\"\n },\n {\n \"name\": \"inter-word\",\n \"description\": \"Justification primarily changes spacing at word separators. This value is typically used for languages that separate words using spaces, like English or (sometimes) Korean.\"\n },\n {\n \"name\": \"kashida\",\n \"description\": \"Justification primarily stretches Arabic and related scripts through the use of kashida or other calligraphic elongation.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Selects the justification algorithm used when 'text-align' is set to 'justify'. The property applies to block containers, but the UA may (but is not required to) also support it on inline elements.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-text-kashida-space\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"Sets or retrieves the ratio of kashida expansion to white space expansion when justifying lines of text in the object.\",\n \"restrictions\": [\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-text-overflow\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"clip\",\n \"description\": \"Clip inline content that overflows. Characters may be only partially rendered.\"\n },\n {\n \"name\": \"ellipsis\",\n \"description\": \"Render an ellipsis character (U+2026) to represent clipped inline content.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Text can overflow for example when it is prevented from wrapping\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-text-size-adjust\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Renderers must use the default size adjustment when displaying on a small device.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Renderers must not do size adjustment when displaying on a small device.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies a size adjustment for displaying text content in mobile browsers.\",\n \"restrictions\": [\n \"enum\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-text-underline-position\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"alphabetic\",\n \"description\": \"The underline is aligned with the alphabetic baseline. In this case the underline is likely to cross some descenders.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"The user agent may use any algorithm to determine the underline's position. In horizontal line layout, the underline should be aligned as for alphabetic. In vertical line layout, if the language is set to Japanese or Korean, the underline should be aligned as for over.\"\n },\n {\n \"name\": \"over\",\n \"description\": \"The underline is aligned with the 'top' (right in vertical writing) edge of the element's em-box. In this mode, an overline also switches sides.\"\n },\n {\n \"name\": \"under\",\n \"description\": \"The underline is aligned with the 'bottom' (left in vertical writing) edge of the element's em-box. In this case the underline usually does not cross the descenders. This is sometimes called 'accounting' underline.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Sets the position of an underline specified on the same element: it does not affect underlines specified by ancestor elements.This property is typically used in vertical writing contexts such as in Japanese documents where it often desired to have the underline appear 'over' (to the right of) the affected run of text\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-touch-action\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The element is a passive element, with several exceptions.\"\n },\n {\n \"name\": \"double-tap-zoom\",\n \"description\": \"The element will zoom on double-tap.\"\n },\n {\n \"name\": \"manipulation\",\n \"description\": \"The element is a manipulation-causing element.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The element is a manipulation-blocking element.\"\n },\n {\n \"name\": \"pan-x\",\n \"description\": \"The element permits touch-driven panning on the horizontal axis. The touch pan is performed on the nearest ancestor with horizontally scrollable content.\"\n },\n {\n \"name\": \"pan-y\",\n \"description\": \"The element permits touch-driven panning on the vertical axis. The touch pan is performed on the nearest ancestor with vertically scrollable content.\"\n },\n {\n \"name\": \"pinch-zoom\",\n \"description\": \"The element permits pinch-zooming. The pinch-zoom is performed on the nearest ancestor with zoomable content.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Gets or sets a value that indicates whether and how a given region can be manipulated by the user.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-touch-select\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"grippers\",\n \"description\": \"Grippers are always on.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Grippers are always off.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"grippers | none\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that toggles the 'gripper' visual elements that enable touch text selection.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-transform\",\n \"browsers\": [\n \"IE9-9\"\n ],\n \"values\": [\n {\n \"name\": \"matrix()\",\n \"description\": \"Specifies a 2D transformation in the form of a transformation matrix of six values. matrix(a,b,c,d,e,f) is equivalent to applying the transformation matrix [a b c d e f]\"\n },\n {\n \"name\": \"matrix3d()\",\n \"description\": \"Specifies a 3D transformation as a 4x4 homogeneous matrix of 16 values in column-major order.\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"rotate()\",\n \"description\": \"Specifies a 2D rotation by the angle specified in the parameter about the origin of the element, as defined by the transform-origin property.\"\n },\n {\n \"name\": \"rotate3d()\",\n \"description\": \"Specifies a clockwise 3D rotation by the angle specified in last parameter about the [x,y,z] direction vector described by the first 3 parameters.\"\n },\n {\n \"name\": \"rotateX('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the X axis.\"\n },\n {\n \"name\": \"rotateY('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the Y axis.\"\n },\n {\n \"name\": \"rotateZ('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the Z axis.\"\n },\n {\n \"name\": \"scale()\",\n \"description\": \"Specifies a 2D scale operation by the [sx,sy] scaling vector described by the 2 parameters. If the second parameter is not provided, it is takes a value equal to the first.\"\n },\n {\n \"name\": \"scale3d()\",\n \"description\": \"Specifies a 3D scale operation by the [sx,sy,sz] scaling vector described by the 3 parameters.\"\n },\n {\n \"name\": \"scaleX()\",\n \"description\": \"Specifies a scale operation using the [sx,1] scaling vector, where sx is given as the parameter.\"\n },\n {\n \"name\": \"scaleY()\",\n \"description\": \"Specifies a scale operation using the [sy,1] scaling vector, where sy is given as the parameter.\"\n },\n {\n \"name\": \"scaleZ()\",\n \"description\": \"Specifies a scale operation using the [1,1,sz] scaling vector, where sz is given as the parameter.\"\n },\n {\n \"name\": \"skew()\",\n \"description\": \"Specifies a skew transformation along the X and Y axes. The first angle parameter specifies the skew on the X axis. The second angle parameter specifies the skew on the Y axis. If the second parameter is not given then a value of 0 is used for the Y angle (ie: no skew on the Y axis).\"\n },\n {\n \"name\": \"skewX()\",\n \"description\": \"Specifies a skew transformation along the X axis by the given angle.\"\n },\n {\n \"name\": \"skewY()\",\n \"description\": \"Specifies a skew transformation along the Y axis by the given angle.\"\n },\n {\n \"name\": \"translate()\",\n \"description\": \"Specifies a 2D translation by the vector [tx, ty], where tx is the first translation-value parameter and ty is the optional second translation-value parameter.\"\n },\n {\n \"name\": \"translate3d()\",\n \"description\": \"Specifies a 3D translation by the vector [tx,ty,tz], with tx, ty and tz being the first, second and third translation-value parameters respectively.\"\n },\n {\n \"name\": \"translateX()\",\n \"description\": \"Specifies a translation by the given amount in the X direction.\"\n },\n {\n \"name\": \"translateY()\",\n \"description\": \"Specifies a translation by the given amount in the Y direction.\"\n },\n {\n \"name\": \"translateZ()\",\n \"description\": \"Specifies a translation by the given amount in the Z direction. Note that percentage values are not allowed in the translateZ translation-value, and if present are evaluated as 0.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"A two-dimensional transformation is applied to an element through the 'transform' property. This property contains a list of transform functions similar to those allowed by SVG.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-transform-origin\",\n \"browsers\": [\n \"IE9-9\"\n ],\n \"relevance\": 50,\n \"description\": \"Establishes the origin of transformation for an element.\",\n \"restrictions\": [\n \"position\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-transform-origin-x\",\n \"browsers\": [\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"The x coordinate of the origin for transforms applied to an element with respect to its border box.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-transform-origin-y\",\n \"browsers\": [\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"The y coordinate of the origin for transforms applied to an element with respect to its border box.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-transform-origin-z\",\n \"browsers\": [\n \"IE10\"\n ],\n \"relevance\": 50,\n \"description\": \"The z coordinate of the origin for transforms applied to an element with respect to its border box.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-user-select\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"element\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"text\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | element | text\",\n \"relevance\": 0,\n \"description\": \"Controls the appearance of selection.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-word-break\",\n \"browsers\": [\n \"IE8\"\n ],\n \"values\": [\n {\n \"name\": \"break-all\",\n \"description\": \"Lines may break between any two grapheme clusters for non-CJK scripts.\"\n },\n {\n \"name\": \"keep-all\",\n \"description\": \"Block characters can no longer create implied break points.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Breaks non-CJK scripts according to their own rules.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies line break opportunities for non-CJK scripts.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-word-wrap\",\n \"browsers\": [\n \"IE8\"\n ],\n \"values\": [\n {\n \"name\": \"break-word\",\n \"description\": \"An unbreakable 'word' may be broken at an arbitrary point if there are no otherwise-acceptable break points in the line.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Lines may break only at allowed break points.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies whether the UA may break within a word to prevent overflow when an otherwise-unbreakable string is too long to fit.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-wrap-flow\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"For floats an exclusion is created, for all other elements an exclusion is not created.\"\n },\n {\n \"name\": \"both\",\n \"description\": \"Inline flow content can flow on all sides of the exclusion.\"\n },\n {\n \"name\": \"clear\",\n \"description\": \"Inline flow content can only wrap on top and bottom of the exclusion and must leave the areas to the start and end edges of the exclusion box empty.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"Inline flow content can wrap on the end side of the exclusion area but must leave the area to the start edge of the exclusion area empty.\"\n },\n {\n \"name\": \"maximum\",\n \"description\": \"Inline flow content can wrap on the side of the exclusion with the largest available space for the given line, and must leave the other side of the exclusion empty.\"\n },\n {\n \"name\": \"minimum\",\n \"description\": \"Inline flow content can flow around the edge of the exclusion with the smallest available space within the flow content\u2019s containing block, and must leave the other edge of the exclusion empty.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"Inline flow content can wrap on the start edge of the exclusion area but must leave the area to end edge of the exclusion area empty.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"auto | both | start | end | maximum | clear\",\n \"relevance\": 0,\n \"description\": \"An element becomes an exclusion when its 'wrap-flow' property has a computed value other than 'auto'.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-wrap-margin\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<length>\",\n \"relevance\": 0,\n \"description\": \"Gets or sets a value that is used to offset the inner wrap shape from other shapes.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-wrap-through\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The exclusion element does not inherit its parent node's wrapping context. Its descendants are only subject to exclusion shapes defined inside the element.\"\n },\n {\n \"name\": \"wrap\",\n \"description\": \"The exclusion element inherits its parent node's wrapping context. Its descendant inline content wraps around exclusions defined outside the element.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"wrap | none\",\n \"relevance\": 0,\n \"description\": \"Specifies if an element inherits its parent wrapping context. In other words if it is subject to the exclusions defined outside the element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-writing-mode\",\n \"browsers\": [\n \"IE8\"\n ],\n \"values\": [\n {\n \"name\": \"bt-lr\"\n },\n {\n \"name\": \"bt-rl\"\n },\n {\n \"name\": \"lr-bt\"\n },\n {\n \"name\": \"lr-tb\"\n },\n {\n \"name\": \"rl-bt\"\n },\n {\n \"name\": \"rl-tb\"\n },\n {\n \"name\": \"tb-lr\"\n },\n {\n \"name\": \"tb-rl\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property for both 'direction' and 'block-progression'.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-ms-zoom\",\n \"browsers\": [\n \"IE8\"\n ],\n \"values\": [\n {\n \"name\": \"normal\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Sets or retrieves the magnification scale of the object.\",\n \"restrictions\": [\n \"enum\",\n \"integer\",\n \"number\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-zoom-animation\",\n \"browsers\": [\n \"IE10\"\n ],\n \"values\": [\n {\n \"name\": \"default\"\n },\n {\n \"name\": \"none\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Gets or sets a value that indicates whether an animation is used when zooming.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"nav-down\",\n \"browsers\": [\n \"O9.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The user agent automatically determines which element to navigate the focus to in response to directional navigational input.\"\n },\n {\n \"name\": \"current\",\n \"description\": \"Indicates that the user agent should target the frame that the element is in.\"\n },\n {\n \"name\": \"root\",\n \"description\": \"Indicates that the user agent should target the full window.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Provides an way to control directional focus navigation.\",\n \"restrictions\": [\n \"enum\",\n \"identifier\",\n \"string\"\n ]\n },\n {\n \"name\": \"nav-index\",\n \"browsers\": [\n \"O9.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The element's sequential navigation order is assigned automatically by the user agent.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Provides an input-method-neutral way of specifying the sequential navigation order (also known as 'tabbing order').\",\n \"restrictions\": [\n \"number\"\n ]\n },\n {\n \"name\": \"nav-left\",\n \"browsers\": [\n \"O9.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The user agent automatically determines which element to navigate the focus to in response to directional navigational input.\"\n },\n {\n \"name\": \"current\",\n \"description\": \"Indicates that the user agent should target the frame that the element is in.\"\n },\n {\n \"name\": \"root\",\n \"description\": \"Indicates that the user agent should target the full window.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Provides an way to control directional focus navigation.\",\n \"restrictions\": [\n \"enum\",\n \"identifier\",\n \"string\"\n ]\n },\n {\n \"name\": \"nav-right\",\n \"browsers\": [\n \"O9.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The user agent automatically determines which element to navigate the focus to in response to directional navigational input.\"\n },\n {\n \"name\": \"current\",\n \"description\": \"Indicates that the user agent should target the frame that the element is in.\"\n },\n {\n \"name\": \"root\",\n \"description\": \"Indicates that the user agent should target the full window.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Provides an way to control directional focus navigation.\",\n \"restrictions\": [\n \"enum\",\n \"identifier\",\n \"string\"\n ]\n },\n {\n \"name\": \"nav-up\",\n \"browsers\": [\n \"O9.5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The user agent automatically determines which element to navigate the focus to in response to directional navigational input.\"\n },\n {\n \"name\": \"current\",\n \"description\": \"Indicates that the user agent should target the frame that the element is in.\"\n },\n {\n \"name\": \"root\",\n \"description\": \"Indicates that the user agent should target the full window.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Provides an way to control directional focus navigation.\",\n \"restrictions\": [\n \"enum\",\n \"identifier\",\n \"string\"\n ]\n },\n {\n \"name\": \"negative\",\n \"browsers\": [\n \"FF33\"\n ],\n \"syntax\": \"<symbol> <symbol>?\",\n \"relevance\": 50,\n \"description\": \"@counter-style descriptor. Defines how to alter the representation when the counter value is negative.\",\n \"restrictions\": [\n \"image\",\n \"identifier\",\n \"string\"\n ]\n },\n {\n \"name\": \"-o-animation\",\n \"browsers\": [\n \"O12\"\n ],\n \"values\": [\n {\n \"name\": \"alternate\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction.\"\n },\n {\n \"name\": \"alternate-reverse\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction.\"\n },\n {\n \"name\": \"backwards\",\n \"description\": \"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'.\"\n },\n {\n \"name\": \"both\",\n \"description\": \"Both forwards and backwards fill modes are applied.\"\n },\n {\n \"name\": \"forwards\",\n \"description\": \"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes.\"\n },\n {\n \"name\": \"infinite\",\n \"description\": \"Causes the animation to repeat forever.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No animation is performed\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Normal playback.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"All iterations of the animation are played in the reverse direction from the way they were specified.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property combines six of the animation properties into a single property.\",\n \"restrictions\": [\n \"time\",\n \"enum\",\n \"timing-function\",\n \"identifier\",\n \"number\"\n ]\n },\n {\n \"name\": \"-o-animation-delay\",\n \"browsers\": [\n \"O12\"\n ],\n \"relevance\": 50,\n \"description\": \"Defines when the animation will start.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-o-animation-direction\",\n \"browsers\": [\n \"O12\"\n ],\n \"values\": [\n {\n \"name\": \"alternate\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction.\"\n },\n {\n \"name\": \"alternate-reverse\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Normal playback.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"All iterations of the animation are played in the reverse direction from the way they were specified.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines whether or not the animation should play in reverse on alternate cycles.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-o-animation-duration\",\n \"browsers\": [\n \"O12\"\n ],\n \"relevance\": 50,\n \"description\": \"Defines the length of time that an animation takes to complete one cycle.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-o-animation-fill-mode\",\n \"browsers\": [\n \"O12\"\n ],\n \"values\": [\n {\n \"name\": \"backwards\",\n \"description\": \"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'.\"\n },\n {\n \"name\": \"both\",\n \"description\": \"Both forwards and backwards fill modes are applied.\"\n },\n {\n \"name\": \"forwards\",\n \"description\": \"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"There is no change to the property value between the time the animation is applied and the time the animation begins playing or after the animation completes.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines what values are applied by the animation outside the time it is executing.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-o-animation-iteration-count\",\n \"browsers\": [\n \"O12\"\n ],\n \"values\": [\n {\n \"name\": \"infinite\",\n \"description\": \"Causes the animation to repeat forever.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines the number of times an animation cycle is played. The default value is one, meaning the animation will play from beginning to end once.\",\n \"restrictions\": [\n \"number\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-o-animation-name\",\n \"browsers\": [\n \"O12\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No animation is performed\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines a list of animations that apply. Each name is used to select the keyframe at-rule that provides the property values for the animation.\",\n \"restrictions\": [\n \"identifier\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-o-animation-play-state\",\n \"browsers\": [\n \"O12\"\n ],\n \"values\": [\n {\n \"name\": \"paused\",\n \"description\": \"A running animation will be paused.\"\n },\n {\n \"name\": \"running\",\n \"description\": \"Resume playback of a paused animation.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines whether the animation is running or paused.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-o-animation-timing-function\",\n \"browsers\": [\n \"O12\"\n ],\n \"relevance\": 50,\n \"description\": \"Describes how the animation will progress over one cycle of its duration. See the 'transition-timing-function'.\",\n \"restrictions\": [\n \"timing-function\"\n ]\n },\n {\n \"name\": \"object-fit\",\n \"browsers\": [\n \"E79\",\n \"FF36\",\n \"S10\",\n \"C32\",\n \"O19\"\n ],\n \"values\": [\n {\n \"name\": \"contain\",\n \"description\": \"The replaced content is sized to maintain its aspect ratio while fitting within the element\u2019s content box: its concrete object size is resolved as a contain constraint against the element's used width and height.\"\n },\n {\n \"name\": \"cover\",\n \"description\": \"The replaced content is sized to maintain its aspect ratio while filling the element's entire content box: its concrete object size is resolved as a cover constraint against the element\u2019s used width and height.\"\n },\n {\n \"name\": \"fill\",\n \"description\": \"The replaced content is sized to fill the element\u2019s content box: the object's concrete object size is the element's used width and height.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The replaced content is not resized to fit inside the element's content box\"\n },\n {\n \"name\": \"scale-down\",\n \"description\": \"Size the content as if \u2018none\u2019 or \u2018contain\u2019 were specified, whichever would result in a smaller concrete object size.\"\n }\n ],\n \"syntax\": \"fill | contain | cover | none | scale-down\",\n \"relevance\": 68,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/object-fit\"\n }\n ],\n \"description\": \"Specifies how the contents of a replaced element should be scaled relative to the box established by its used height and width.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"object-position\",\n \"browsers\": [\n \"E79\",\n \"FF36\",\n \"S10\",\n \"C32\",\n \"O19\"\n ],\n \"syntax\": \"<position>\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/object-position\"\n }\n ],\n \"description\": \"Determines the alignment of the replaced element inside its box.\",\n \"restrictions\": [\n \"position\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-o-border-image\",\n \"browsers\": [\n \"O11.6\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"If 'auto' is specified then the border image width is the intrinsic width or height (whichever is applicable) of the corresponding image slice. If the image does not have the required intrinsic dimension then the corresponding border-width is used instead.\"\n },\n {\n \"name\": \"fill\",\n \"description\": \"Causes the middle part of the border-image to be preserved.\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"repeat\",\n \"description\": \"The image is tiled (repeated) to fill the area.\"\n },\n {\n \"name\": \"round\",\n \"description\": \"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the image is rescaled so that it does.\"\n },\n {\n \"name\": \"space\",\n \"description\": \"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the extra space is distributed around the tiles.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"The image is stretched to fill the area.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property for setting 'border-image-source', 'border-image-slice', 'border-image-width', 'border-image-outset' and 'border-image-repeat'. Omitted values are set to their initial values.\",\n \"restrictions\": [\n \"length\",\n \"percentage\",\n \"number\",\n \"image\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-o-object-fit\",\n \"browsers\": [\n \"O10.6\"\n ],\n \"values\": [\n {\n \"name\": \"contain\",\n \"description\": \"The replaced content is sized to maintain its aspect ratio while fitting within the element\u2019s content box: its concrete object size is resolved as a contain constraint against the element's used width and height.\"\n },\n {\n \"name\": \"cover\",\n \"description\": \"The replaced content is sized to maintain its aspect ratio while filling the element's entire content box: its concrete object size is resolved as a cover constraint against the element\u2019s used width and height.\"\n },\n {\n \"name\": \"fill\",\n \"description\": \"The replaced content is sized to fill the element\u2019s content box: the object's concrete object size is the element's used width and height.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The replaced content is not resized to fit inside the element's content box\"\n },\n {\n \"name\": \"scale-down\",\n \"description\": \"Size the content as if \u2018none\u2019 or \u2018contain\u2019 were specified, whichever would result in a smaller concrete object size.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies how the contents of a replaced element should be scaled relative to the box established by its used height and width.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-o-object-position\",\n \"browsers\": [\n \"O10.6\"\n ],\n \"relevance\": 50,\n \"description\": \"Determines the alignment of the replaced element inside its box.\",\n \"restrictions\": [\n \"position\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"opacity\",\n \"syntax\": \"<alpha-value>\",\n \"relevance\": 93,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/opacity\"\n }\n ],\n \"description\": \"Opacity of an element's text, where 1 is opaque and 0 is entirely transparent.\",\n \"restrictions\": [\n \"number(0-1)\"\n ]\n },\n {\n \"name\": \"order\",\n \"syntax\": \"<integer>\",\n \"relevance\": 63,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/order\"\n }\n ],\n \"description\": \"Controls the order in which children of a flex container appear within the flex container, by assigning them to ordinal groups.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"orphans\",\n \"browsers\": [\n \"E12\",\n \"S1.3\",\n \"C25\",\n \"IE8\",\n \"O9.2\"\n ],\n \"syntax\": \"<integer>\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/orphans\"\n }\n ],\n \"description\": \"Specifies the minimum number of line boxes in a block container that must be left in a fragment before a fragmentation break.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-o-table-baseline\",\n \"browsers\": [\n \"O9.6\"\n ],\n \"relevance\": 50,\n \"description\": \"Determines which row of a inline-table should be used as baseline of inline-table.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-o-tab-size\",\n \"browsers\": [\n \"O10.6\"\n ],\n \"relevance\": 50,\n \"description\": \"This property determines the width of the tab character (U+0009), in space characters (U+0020), when rendered.\",\n \"restrictions\": [\n \"integer\",\n \"length\"\n ]\n },\n {\n \"name\": \"-o-text-overflow\",\n \"browsers\": [\n \"O10\"\n ],\n \"values\": [\n {\n \"name\": \"clip\",\n \"description\": \"Clip inline content that overflows. Characters may be only partially rendered.\"\n },\n {\n \"name\": \"ellipsis\",\n \"description\": \"Render an ellipsis character (U+2026) to represent clipped inline content.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Text can overflow for example when it is prevented from wrapping\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-o-transform\",\n \"browsers\": [\n \"O10.5\"\n ],\n \"values\": [\n {\n \"name\": \"matrix()\",\n \"description\": \"Specifies a 2D transformation in the form of a transformation matrix of six values. matrix(a,b,c,d,e,f) is equivalent to applying the transformation matrix [a b c d e f]\"\n },\n {\n \"name\": \"matrix3d()\",\n \"description\": \"Specifies a 3D transformation as a 4x4 homogeneous matrix of 16 values in column-major order.\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"rotate()\",\n \"description\": \"Specifies a 2D rotation by the angle specified in the parameter about the origin of the element, as defined by the transform-origin property.\"\n },\n {\n \"name\": \"rotate3d()\",\n \"description\": \"Specifies a clockwise 3D rotation by the angle specified in last parameter about the [x,y,z] direction vector described by the first 3 parameters.\"\n },\n {\n \"name\": \"rotateX('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the X axis.\"\n },\n {\n \"name\": \"rotateY('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the Y axis.\"\n },\n {\n \"name\": \"rotateZ('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the Z axis.\"\n },\n {\n \"name\": \"scale()\",\n \"description\": \"Specifies a 2D scale operation by the [sx,sy] scaling vector described by the 2 parameters. If the second parameter is not provided, it is takes a value equal to the first.\"\n },\n {\n \"name\": \"scale3d()\",\n \"description\": \"Specifies a 3D scale operation by the [sx,sy,sz] scaling vector described by the 3 parameters.\"\n },\n {\n \"name\": \"scaleX()\",\n \"description\": \"Specifies a scale operation using the [sx,1] scaling vector, where sx is given as the parameter.\"\n },\n {\n \"name\": \"scaleY()\",\n \"description\": \"Specifies a scale operation using the [sy,1] scaling vector, where sy is given as the parameter.\"\n },\n {\n \"name\": \"scaleZ()\",\n \"description\": \"Specifies a scale operation using the [1,1,sz] scaling vector, where sz is given as the parameter.\"\n },\n {\n \"name\": \"skew()\",\n \"description\": \"Specifies a skew transformation along the X and Y axes. The first angle parameter specifies the skew on the X axis. The second angle parameter specifies the skew on the Y axis. If the second parameter is not given then a value of 0 is used for the Y angle (ie: no skew on the Y axis).\"\n },\n {\n \"name\": \"skewX()\",\n \"description\": \"Specifies a skew transformation along the X axis by the given angle.\"\n },\n {\n \"name\": \"skewY()\",\n \"description\": \"Specifies a skew transformation along the Y axis by the given angle.\"\n },\n {\n \"name\": \"translate()\",\n \"description\": \"Specifies a 2D translation by the vector [tx, ty], where tx is the first translation-value parameter and ty is the optional second translation-value parameter.\"\n },\n {\n \"name\": \"translate3d()\",\n \"description\": \"Specifies a 3D translation by the vector [tx,ty,tz], with tx, ty and tz being the first, second and third translation-value parameters respectively.\"\n },\n {\n \"name\": \"translateX()\",\n \"description\": \"Specifies a translation by the given amount in the X direction.\"\n },\n {\n \"name\": \"translateY()\",\n \"description\": \"Specifies a translation by the given amount in the Y direction.\"\n },\n {\n \"name\": \"translateZ()\",\n \"description\": \"Specifies a translation by the given amount in the Z direction. Note that percentage values are not allowed in the translateZ translation-value, and if present are evaluated as 0.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"A two-dimensional transformation is applied to an element through the 'transform' property. This property contains a list of transform functions similar to those allowed by SVG.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-o-transform-origin\",\n \"browsers\": [\n \"O10.5\"\n ],\n \"relevance\": 50,\n \"description\": \"Establishes the origin of transformation for an element.\",\n \"restrictions\": [\n \"positon\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-o-transition\",\n \"browsers\": [\n \"O11.5\"\n ],\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"Every property that is able to undergo a transition will do so.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No property will transition.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property combines four of the transition properties into a single property.\",\n \"restrictions\": [\n \"time\",\n \"property\",\n \"timing-function\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-o-transition-delay\",\n \"browsers\": [\n \"O11.5\"\n ],\n \"relevance\": 50,\n \"description\": \"Defines when the transition will start. It allows a transition to begin execution some period of time from when it is applied.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-o-transition-duration\",\n \"browsers\": [\n \"O11.5\"\n ],\n \"relevance\": 50,\n \"description\": \"Specifies how long the transition from the old value to the new value should take.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-o-transition-property\",\n \"browsers\": [\n \"O11.5\"\n ],\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"Every property that is able to undergo a transition will do so.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No property will transition.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the name of the CSS property to which the transition is applied.\",\n \"restrictions\": [\n \"property\"\n ]\n },\n {\n \"name\": \"-o-transition-timing-function\",\n \"browsers\": [\n \"O11.5\"\n ],\n \"relevance\": 50,\n \"description\": \"Describes how the intermediate values used during a transition will be calculated.\",\n \"restrictions\": [\n \"timing-function\"\n ]\n },\n {\n \"name\": \"offset-block-end\",\n \"browsers\": [\n \"FF41\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Logical 'bottom'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"offset-block-start\",\n \"browsers\": [\n \"FF41\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Logical 'top'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"offset-inline-end\",\n \"browsers\": [\n \"FF41\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Logical 'right'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"offset-inline-start\",\n \"browsers\": [\n \"FF41\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Logical 'left'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"outline\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Permits the user agent to render a custom outline style, typically the default platform style.\"\n },\n {\n \"name\": \"invert\",\n \"description\": \"Performs a color inversion on the pixels on the screen.\"\n }\n ],\n \"syntax\": \"[ <'outline-color'> || <'outline-style'> || <'outline-width'> ]\",\n \"relevance\": 88,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/outline\"\n }\n ],\n \"description\": \"Shorthand property for 'outline-style', 'outline-width', and 'outline-color'.\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\",\n \"enum\"\n ]\n },\n {\n \"name\": \"outline-color\",\n \"values\": [\n {\n \"name\": \"invert\",\n \"description\": \"Performs a color inversion on the pixels on the screen.\"\n }\n ],\n \"syntax\": \"<color> | invert\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/outline-color\"\n }\n ],\n \"description\": \"The color of the outline.\",\n \"restrictions\": [\n \"enum\",\n \"color\"\n ]\n },\n {\n \"name\": \"outline-offset\",\n \"browsers\": [\n \"E15\",\n \"FF1.5\",\n \"S1.2\",\n \"C1\",\n \"O9.5\"\n ],\n \"syntax\": \"<length>\",\n \"relevance\": 67,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/outline-offset\"\n }\n ],\n \"description\": \"Offset the outline and draw it beyond the border edge.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"outline-style\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Permits the user agent to render a custom outline style, typically the default platform style.\"\n }\n ],\n \"syntax\": \"auto | <'border-style'>\",\n \"relevance\": 61,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/outline-style\"\n }\n ],\n \"description\": \"Style of the outline.\",\n \"restrictions\": [\n \"line-style\",\n \"enum\"\n ]\n },\n {\n \"name\": \"outline-width\",\n \"syntax\": \"<line-width>\",\n \"relevance\": 61,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/outline-width\"\n }\n ],\n \"description\": \"Width of the outline.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"overflow\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The behavior of the 'auto' value is UA-dependent, but should cause a scrolling mechanism to be provided for overflowing boxes.\"\n },\n {\n \"name\": \"hidden\",\n \"description\": \"Content is clipped and no scrolling mechanism should be provided to view the content outside the clipping region.\"\n },\n {\n \"name\": \"-moz-hidden-unscrollable\",\n \"description\": \"Same as the standardized 'clip', except doesn\u2019t establish a block formatting context.\"\n },\n {\n \"name\": \"scroll\",\n \"description\": \"Content is clipped and if the user agent uses a scrolling mechanism that is visible on the screen (such as a scroll bar or a panner), that mechanism should be displayed for a box whether or not any of its content is clipped.\"\n },\n {\n \"name\": \"visible\",\n \"description\": \"Content is not clipped, i.e., it may be rendered outside the content box.\"\n }\n ],\n \"syntax\": \"[ visible | hidden | clip | scroll | auto ]{1,2}\",\n \"relevance\": 93,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overflow\"\n }\n ],\n \"description\": \"Shorthand for setting 'overflow-x' and 'overflow-y'.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"overflow-wrap\",\n \"values\": [\n {\n \"name\": \"break-word\",\n \"description\": \"An otherwise unbreakable sequence of characters may be broken at an arbitrary point if there are no otherwise-acceptable break points in the line.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Lines may break only at allowed break points.\"\n }\n ],\n \"syntax\": \"normal | break-word | anywhere\",\n \"relevance\": 63,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overflow-wrap\"\n }\n ],\n \"description\": \"Specifies whether the UA may break within a word to prevent overflow when an otherwise-unbreakable string is too long to fit within the line box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"overflow-x\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The behavior of the 'auto' value is UA-dependent, but should cause a scrolling mechanism to be provided for overflowing boxes.\"\n },\n {\n \"name\": \"hidden\",\n \"description\": \"Content is clipped and no scrolling mechanism should be provided to view the content outside the clipping region.\"\n },\n {\n \"name\": \"scroll\",\n \"description\": \"Content is clipped and if the user agent uses a scrolling mechanism that is visible on the screen (such as a scroll bar or a panner), that mechanism should be displayed for a box whether or not any of its content is clipped.\"\n },\n {\n \"name\": \"visible\",\n \"description\": \"Content is not clipped, i.e., it may be rendered outside the content box.\"\n }\n ],\n \"syntax\": \"visible | hidden | clip | scroll | auto\",\n \"relevance\": 81,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overflow-x\"\n }\n ],\n \"description\": \"Specifies the handling of overflow in the horizontal direction.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"overflow-y\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The behavior of the 'auto' value is UA-dependent, but should cause a scrolling mechanism to be provided for overflowing boxes.\"\n },\n {\n \"name\": \"hidden\",\n \"description\": \"Content is clipped and no scrolling mechanism should be provided to view the content outside the clipping region.\"\n },\n {\n \"name\": \"scroll\",\n \"description\": \"Content is clipped and if the user agent uses a scrolling mechanism that is visible on the screen (such as a scroll bar or a panner), that mechanism should be displayed for a box whether or not any of its content is clipped.\"\n },\n {\n \"name\": \"visible\",\n \"description\": \"Content is not clipped, i.e., it may be rendered outside the content box.\"\n }\n ],\n \"syntax\": \"visible | hidden | clip | scroll | auto\",\n \"relevance\": 82,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overflow-y\"\n }\n ],\n \"description\": \"Specifies the handling of overflow in the vertical direction.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"pad\",\n \"browsers\": [\n \"FF33\"\n ],\n \"syntax\": \"<integer> && <symbol>\",\n \"relevance\": 50,\n \"description\": \"@counter-style descriptor. Specifies a \u201Cfixed-width\u201D counter style, where representations shorter than the pad value are padded with a particular <symbol>\",\n \"restrictions\": [\n \"integer\",\n \"image\",\n \"string\",\n \"identifier\"\n ]\n },\n {\n \"name\": \"padding\",\n \"values\": [],\n \"syntax\": \"[ <length> | <percentage> ]{1,4}\",\n \"relevance\": 96,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding\"\n }\n ],\n \"description\": \"Shorthand property to set values for the thickness of the padding area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. The value may not be negative.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"padding-bottom\",\n \"syntax\": \"<length> | <percentage>\",\n \"relevance\": 89,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding-bottom\"\n }\n ],\n \"description\": \"Shorthand property to set values for the thickness of the padding area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. The value may not be negative.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"padding-block-end\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'padding-left'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding-block-end\"\n }\n ],\n \"description\": \"Logical 'padding-bottom'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"padding-block-start\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'padding-left'>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding-block-start\"\n }\n ],\n \"description\": \"Logical 'padding-top'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"padding-inline-end\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'padding-left'>\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding-inline-end\"\n }\n ],\n \"description\": \"Logical 'padding-right'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"padding-inline-start\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S12.1\",\n \"C69\",\n \"O56\"\n ],\n \"syntax\": \"<'padding-left'>\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding-inline-start\"\n }\n ],\n \"description\": \"Logical 'padding-left'. Mapping depends on the parent element\u2019s 'writing-mode', 'direction', and 'text-orientation'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"padding-left\",\n \"syntax\": \"<length> | <percentage>\",\n \"relevance\": 90,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding-left\"\n }\n ],\n \"description\": \"Shorthand property to set values for the thickness of the padding area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. The value may not be negative.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"padding-right\",\n \"syntax\": \"<length> | <percentage>\",\n \"relevance\": 89,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding-right\"\n }\n ],\n \"description\": \"Shorthand property to set values for the thickness of the padding area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. The value may not be negative.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"padding-top\",\n \"syntax\": \"<length> | <percentage>\",\n \"relevance\": 90,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding-top\"\n }\n ],\n \"description\": \"Shorthand property to set values for the thickness of the padding area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. The value may not be negative.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"page-break-after\",\n \"values\": [\n {\n \"name\": \"always\",\n \"description\": \"Always force a page break after the generated box.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page break after generated box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a page break after the generated box.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"Force one or two page breaks after the generated box so that the next page is formatted as a left page.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"Force one or two page breaks after the generated box so that the next page is formatted as a right page.\"\n }\n ],\n \"syntax\": \"auto | always | avoid | left | right | recto | verso\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/page-break-after\"\n }\n ],\n \"description\": \"Defines rules for page breaks after an element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"page-break-before\",\n \"values\": [\n {\n \"name\": \"always\",\n \"description\": \"Always force a page break before the generated box.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page break before the generated box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a page break before the generated box.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"Force one or two page breaks before the generated box so that the next page is formatted as a left page.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"Force one or two page breaks before the generated box so that the next page is formatted as a right page.\"\n }\n ],\n \"syntax\": \"auto | always | avoid | left | right | recto | verso\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/page-break-before\"\n }\n ],\n \"description\": \"Defines rules for page breaks before an element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"page-break-inside\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page break inside the generated box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a page break inside the generated box.\"\n }\n ],\n \"syntax\": \"auto | avoid\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/page-break-inside\"\n }\n ],\n \"description\": \"Defines rules for page breaks inside an element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"paint-order\",\n \"browsers\": [\n \"E17\",\n \"FF60\",\n \"S8\",\n \"C35\",\n \"O22\"\n ],\n \"values\": [\n {\n \"name\": \"fill\"\n },\n {\n \"name\": \"markers\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"The element is painted with the standard order of painting operations: the 'fill' is painted first, then its 'stroke' and finally its markers.\"\n },\n {\n \"name\": \"stroke\"\n }\n ],\n \"syntax\": \"normal | [ fill || stroke || markers ]\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/paint-order\"\n }\n ],\n \"description\": \"Controls the order that the three paint operations that shapes and text are rendered with: their fill, their stroke and any markers they might have.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"perspective\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No perspective transform is applied.\"\n }\n ],\n \"syntax\": \"none | <length>\",\n \"relevance\": 55,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/perspective\"\n }\n ],\n \"description\": \"Applies the same transform as the perspective(<number>) transform function, except that it applies only to the positioned or transformed children of the element, not to the transform on the element itself.\",\n \"restrictions\": [\n \"length\",\n \"enum\"\n ]\n },\n {\n \"name\": \"perspective-origin\",\n \"syntax\": \"<position>\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/perspective-origin\"\n }\n ],\n \"description\": \"Establishes the origin for the perspective property. It effectively sets the X and Y position at which the viewer appears to be looking at the children of the element.\",\n \"restrictions\": [\n \"position\",\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"pointer-events\",\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"The given element can be the target element for pointer events whenever the pointer is over either the interior or the perimeter of the element.\"\n },\n {\n \"name\": \"fill\",\n \"description\": \"The given element can be the target element for pointer events whenever the pointer is over the interior of the element.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The given element does not receive pointer events.\"\n },\n {\n \"name\": \"painted\",\n \"description\": \"The given element can be the target element for pointer events when the pointer is over a \\\"painted\\\" area. \"\n },\n {\n \"name\": \"stroke\",\n \"description\": \"The given element can be the target element for pointer events whenever the pointer is over the perimeter of the element.\"\n },\n {\n \"name\": \"visible\",\n \"description\": \"The given element can be the target element for pointer events when the \u2018visibility\u2019 property is set to visible and the pointer is over either the interior or the perimeter of the element.\"\n },\n {\n \"name\": \"visibleFill\",\n \"description\": \"The given element can be the target element for pointer events when the \u2018visibility\u2019 property is set to visible and when the pointer is over the interior of the element.\"\n },\n {\n \"name\": \"visiblePainted\",\n \"description\": \"The given element can be the target element for pointer events when the \u2018visibility\u2019 property is set to visible and when the pointer is over a \u2018painted\u2019 area.\"\n },\n {\n \"name\": \"visibleStroke\",\n \"description\": \"The given element can be the target element for pointer events when the \u2018visibility\u2019 property is set to visible and when the pointer is over the perimeter of the element.\"\n }\n ],\n \"syntax\": \"auto | none | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | inherit\",\n \"relevance\": 82,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/pointer-events\"\n }\n ],\n \"description\": \"Specifies under what circumstances a given element can be the target element for a pointer event.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"position\",\n \"values\": [\n {\n \"name\": \"absolute\",\n \"description\": \"The box's position (and possibly size) is specified with the 'top', 'right', 'bottom', and 'left' properties. These properties specify offsets with respect to the box's 'containing block'.\"\n },\n {\n \"name\": \"fixed\",\n \"description\": \"The box's position is calculated according to the 'absolute' model, but in addition, the box is fixed with respect to some reference. As with the 'absolute' model, the box's margins do not collapse with any other margins.\"\n },\n {\n \"name\": \"-ms-page\",\n \"description\": \"The box's position is calculated according to the 'absolute' model.\"\n },\n {\n \"name\": \"relative\",\n \"description\": \"The box's position is calculated according to the normal flow (this is called the position in normal flow). Then the box is offset relative to its normal position.\"\n },\n {\n \"name\": \"static\",\n \"description\": \"The box is a normal box, laid out according to the normal flow. The 'top', 'right', 'bottom', and 'left' properties do not apply.\"\n },\n {\n \"name\": \"sticky\",\n \"description\": \"The box's position is calculated according to the normal flow. Then the box is offset relative to its flow root and containing block and in all cases, including table elements, does not affect the position of any following boxes.\"\n },\n {\n \"name\": \"-webkit-sticky\",\n \"description\": \"The box's position is calculated according to the normal flow. Then the box is offset relative to its flow root and containing block and in all cases, including table elements, does not affect the position of any following boxes.\"\n }\n ],\n \"syntax\": \"static | relative | absolute | sticky | fixed\",\n \"relevance\": 96,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/position\"\n }\n ],\n \"description\": \"The position CSS property sets how an element is positioned in a document. The top, right, bottom, and left properties determine the final location of positioned elements.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"prefix\",\n \"browsers\": [\n \"FF33\"\n ],\n \"syntax\": \"<symbol>\",\n \"relevance\": 50,\n \"description\": \"@counter-style descriptor. Specifies a <symbol> that is prepended to the marker representation.\",\n \"restrictions\": [\n \"image\",\n \"string\",\n \"identifier\"\n ]\n },\n {\n \"name\": \"quotes\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The 'open-quote' and 'close-quote' values of the 'content' property produce no quotations marks, as if they were 'no-open-quote' and 'no-close-quote' respectively.\"\n }\n ],\n \"syntax\": \"none | auto | [ <string> <string> ]+\",\n \"relevance\": 53,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/quotes\"\n }\n ],\n \"description\": \"Specifies quotation marks for any number of embedded quotations.\",\n \"restrictions\": [\n \"string\"\n ]\n },\n {\n \"name\": \"range\",\n \"browsers\": [\n \"FF33\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The range depends on the counter system.\"\n },\n {\n \"name\": \"infinite\",\n \"description\": \"If used as the first value in a range, it represents negative infinity; if used as the second value, it represents positive infinity.\"\n }\n ],\n \"syntax\": \"[ [ <integer> | infinite ]{2} ]# | auto\",\n \"relevance\": 50,\n \"description\": \"@counter-style descriptor. Defines the ranges over which the counter style is defined.\",\n \"restrictions\": [\n \"integer\",\n \"enum\"\n ]\n },\n {\n \"name\": \"resize\",\n \"browsers\": [\n \"E79\",\n \"FF4\",\n \"S3\",\n \"C1\",\n \"O12.1\"\n ],\n \"values\": [\n {\n \"name\": \"both\",\n \"description\": \"The UA presents a bidirectional resizing mechanism to allow the user to adjust both the height and the width of the element.\"\n },\n {\n \"name\": \"horizontal\",\n \"description\": \"The UA presents a unidirectional horizontal resizing mechanism to allow the user to adjust only the width of the element.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The UA does not present a resizing mechanism on the element, and the user is given no direct manipulation mechanism to resize the element.\"\n },\n {\n \"name\": \"vertical\",\n \"description\": \"The UA presents a unidirectional vertical resizing mechanism to allow the user to adjust only the height of the element.\"\n }\n ],\n \"syntax\": \"none | both | horizontal | vertical | block | inline\",\n \"relevance\": 59,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/resize\"\n }\n ],\n \"description\": \"Specifies whether or not an element is resizable by the user, and if so, along which axis/axes.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"right\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well\"\n }\n ],\n \"syntax\": \"<length> | <percentage> | auto\",\n \"relevance\": 91,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/right\"\n }\n ],\n \"description\": \"Specifies how far an absolutely positioned box's right margin edge is offset to the left of the right edge of the box's 'containing block'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"ruby-align\",\n \"browsers\": [\n \"FF38\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"browsers\": [\n \"FF38\"\n ],\n \"description\": \"The user agent determines how the ruby contents are aligned. This is the initial value.\"\n },\n {\n \"name\": \"center\",\n \"description\": \"The ruby content is centered within its box.\"\n },\n {\n \"name\": \"distribute-letter\",\n \"browsers\": [\n \"FF38\"\n ],\n \"description\": \"If the width of the ruby text is smaller than that of the base, then the ruby text contents are evenly distributed across the width of the base, with the first and last ruby text glyphs lining up with the corresponding first and last base glyphs. If the width of the ruby text is at least the width of the base, then the letters of the base are evenly distributed across the width of the ruby text.\"\n },\n {\n \"name\": \"distribute-space\",\n \"browsers\": [\n \"FF38\"\n ],\n \"description\": \"If the width of the ruby text is smaller than that of the base, then the ruby text contents are evenly distributed across the width of the base, with a certain amount of white space preceding the first and following the last character in the ruby text. That amount of white space is normally equal to half the amount of inter-character space of the ruby text.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"The ruby text content is aligned with the start edge of the base.\"\n },\n {\n \"name\": \"line-edge\",\n \"browsers\": [\n \"FF38\"\n ],\n \"description\": \"If the ruby text is not adjacent to a line edge, it is aligned as in 'auto'. If it is adjacent to a line edge, then it is still aligned as in auto, but the side of the ruby text that touches the end of the line is lined up with the corresponding edge of the base.\"\n },\n {\n \"name\": \"right\",\n \"browsers\": [\n \"FF38\"\n ],\n \"description\": \"The ruby text content is aligned with the end edge of the base.\"\n },\n {\n \"name\": \"start\",\n \"browsers\": [\n \"FF38\"\n ],\n \"description\": \"The ruby text content is aligned with the start edge of the base.\"\n },\n {\n \"name\": \"space-between\",\n \"browsers\": [\n \"FF38\"\n ],\n \"description\": \"The ruby content expands as defined for normal text justification (as defined by 'text-justify'),\"\n },\n {\n \"name\": \"space-around\",\n \"browsers\": [\n \"FF38\"\n ],\n \"description\": \"As for 'space-between' except that there exists an extra justification opportunities whose space is distributed half before and half after the ruby content.\"\n }\n ],\n \"status\": \"experimental\",\n \"syntax\": \"start | center | space-between | space-around\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/ruby-align\"\n }\n ],\n \"description\": \"Specifies how text is distributed within the various ruby boxes when their contents do not exactly fill their respective boxes.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"ruby-overhang\",\n \"browsers\": [\n \"FF10\",\n \"IE5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The ruby text can overhang text adjacent to the base on either side. This is the initial value.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"The ruby text can overhang the text that follows it.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The ruby text cannot overhang any text adjacent to its base, only its own base.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"The ruby text can overhang the text that precedes it.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Determines whether, and on which side, ruby text is allowed to partially overhang any adjacent text in addition to its own base, when the ruby text is wider than the ruby base.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"ruby-position\",\n \"browsers\": [\n \"E84\",\n \"FF38\",\n \"S6.1\",\n \"C84\",\n \"O70\"\n ],\n \"values\": [\n {\n \"name\": \"after\",\n \"description\": \"The ruby text appears after the base. This is a relatively rare setting used in ideographic East Asian writing systems, most easily found in educational text.\"\n },\n {\n \"name\": \"before\",\n \"description\": \"The ruby text appears before the base. This is the most common setting used in ideographic East Asian writing systems.\"\n },\n {\n \"name\": \"inline\"\n },\n {\n \"name\": \"right\",\n \"description\": \"The ruby text appears on the right of the base. Unlike 'before' and 'after', this value is not relative to the text flow direction.\"\n }\n ],\n \"status\": \"experimental\",\n \"syntax\": \"[ alternate || [ over | under ] ] | inter-character\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/ruby-position\"\n }\n ],\n \"description\": \"Used by the parent of elements with display: ruby-text to control the position of the ruby text with respect to its base.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"ruby-span\",\n \"browsers\": [\n \"FF10\"\n ],\n \"values\": [\n {\n \"name\": \"attr(x)\",\n \"description\": \"The value of attribute 'x' is a string value. The string value is evaluated as a <number> to determine the number of ruby base elements to be spanned by the annotation element.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No spanning. The computed value is '1'.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Determines whether, and on which side, ruby text is allowed to partially overhang any adjacent text in addition to its own base, when the ruby text is wider than the ruby base.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"scrollbar-3dlight-color\",\n \"browsers\": [\n \"IE5\"\n ],\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scrollbar-3dlight-color\"\n }\n ],\n \"description\": \"Determines the color of the top and left edges of the scroll box and scroll arrows of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"scrollbar-arrow-color\",\n \"browsers\": [\n \"IE5\"\n ],\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scrollbar-arrow-color\"\n }\n ],\n \"description\": \"Determines the color of the arrow elements of a scroll arrow.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"scrollbar-base-color\",\n \"browsers\": [\n \"IE5\"\n ],\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scrollbar-base-color\"\n }\n ],\n \"description\": \"Determines the color of the main elements of a scroll bar, which include the scroll box, track, and scroll arrows.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"scrollbar-darkshadow-color\",\n \"browsers\": [\n \"IE5\"\n ],\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scrollbar-darkshadow-color\"\n }\n ],\n \"description\": \"Determines the color of the gutter of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"scrollbar-face-color\",\n \"browsers\": [\n \"IE5\"\n ],\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scrollbar-face-color\"\n }\n ],\n \"description\": \"Determines the color of the scroll box and scroll arrows of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"scrollbar-highlight-color\",\n \"browsers\": [\n \"IE5\"\n ],\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scrollbar-highlight-color\"\n }\n ],\n \"description\": \"Determines the color of the top and left edges of the scroll box and scroll arrows of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"scrollbar-shadow-color\",\n \"browsers\": [\n \"IE5\"\n ],\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scrollbar-shadow-color\"\n }\n ],\n \"description\": \"Determines the color of the bottom and right edges of the scroll box and scroll arrows of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"scrollbar-track-color\",\n \"browsers\": [\n \"IE6\"\n ],\n \"relevance\": 50,\n \"description\": \"Determines the color of the track element of a scroll bar.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"scroll-behavior\",\n \"browsers\": [\n \"E79\",\n \"FF36\",\n \"S14\",\n \"C61\",\n \"O48\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Scrolls in an instant fashion.\"\n },\n {\n \"name\": \"smooth\",\n \"description\": \"Scrolls in a smooth fashion using a user-agent-defined timing function and time period.\"\n }\n ],\n \"syntax\": \"auto | smooth\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-behavior\"\n }\n ],\n \"description\": \"Specifies the scrolling behavior for a scrolling box, when scrolling happens due to navigation or CSSOM scrolling APIs.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"scroll-snap-coordinate\",\n \"browsers\": [\n \"FF39\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Specifies that this element does not contribute a snap point.\"\n }\n ],\n \"status\": \"obsolete\",\n \"syntax\": \"none | <position>#\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-coordinate\"\n }\n ],\n \"description\": \"Defines the x and y coordinate within the element which will align with the nearest ancestor scroll container\u2019s snap-destination for the respective axis.\",\n \"restrictions\": [\n \"position\",\n \"length\",\n \"percentage\",\n \"enum\"\n ]\n },\n {\n \"name\": \"scroll-snap-destination\",\n \"browsers\": [\n \"FF39\"\n ],\n \"status\": \"obsolete\",\n \"syntax\": \"<position>\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-destination\"\n }\n ],\n \"description\": \"Define the x and y coordinate within the scroll container\u2019s visual viewport which element snap points will align with.\",\n \"restrictions\": [\n \"position\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"scroll-snap-points-x\",\n \"browsers\": [\n \"FF39\",\n \"S9\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No snap points are defined by this scroll container.\"\n },\n {\n \"name\": \"repeat()\",\n \"description\": \"Defines an interval at which snap points are defined, starting from the container\u2019s relevant start edge.\"\n }\n ],\n \"status\": \"obsolete\",\n \"syntax\": \"none | repeat( <length-percentage> )\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-points-x\"\n }\n ],\n \"description\": \"Defines the positioning of snap points along the x axis of the scroll container it is applied to.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"scroll-snap-points-y\",\n \"browsers\": [\n \"FF39\",\n \"S9\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No snap points are defined by this scroll container.\"\n },\n {\n \"name\": \"repeat()\",\n \"description\": \"Defines an interval at which snap points are defined, starting from the container\u2019s relevant start edge.\"\n }\n ],\n \"status\": \"obsolete\",\n \"syntax\": \"none | repeat( <length-percentage> )\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-points-y\"\n }\n ],\n \"description\": \"Defines the positioning of snap points along the y axis of the scroll container it is applied to.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"scroll-snap-type\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The visual viewport of this scroll container must ignore snap points, if any, when scrolled.\"\n },\n {\n \"name\": \"mandatory\",\n \"description\": \"The visual viewport of this scroll container is guaranteed to rest on a snap point when there are no active scrolling operations.\"\n },\n {\n \"name\": \"proximity\",\n \"description\": \"The visual viewport of this scroll container may come to rest on a snap point at the termination of a scroll at the discretion of the UA given the parameters of the scroll.\"\n }\n ],\n \"syntax\": \"none | [ x | y | block | inline | both ] [ mandatory | proximity ]?\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type\"\n }\n ],\n \"description\": \"Defines how strictly snap points are enforced on the scroll container.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"shape-image-threshold\",\n \"browsers\": [\n \"E79\",\n \"FF62\",\n \"S10.1\",\n \"C37\",\n \"O24\"\n ],\n \"syntax\": \"<alpha-value>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/shape-image-threshold\"\n }\n ],\n \"description\": \"Defines the alpha channel threshold used to extract the shape using an image. A value of 0.5 means that the shape will enclose all the pixels that are more than 50% opaque.\",\n \"restrictions\": [\n \"number\"\n ]\n },\n {\n \"name\": \"shape-margin\",\n \"browsers\": [\n \"E79\",\n \"FF62\",\n \"S10.1\",\n \"C37\",\n \"O24\"\n ],\n \"syntax\": \"<length-percentage>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/shape-margin\"\n }\n ],\n \"description\": \"Adds a margin to a 'shape-outside'. This defines a new shape that is the smallest contour that includes all the points that are the 'shape-margin' distance outward in the perpendicular direction from a point on the underlying shape.\",\n \"restrictions\": [\n \"url\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"shape-outside\",\n \"browsers\": [\n \"E79\",\n \"FF62\",\n \"S10.1\",\n \"C37\",\n \"O24\"\n ],\n \"values\": [\n {\n \"name\": \"margin-box\",\n \"description\": \"The background is painted within (clipped to) the margin box.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The float area is unaffected.\"\n }\n ],\n \"syntax\": \"none | [ <shape-box> || <basic-shape> ] | <image>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/shape-outside\"\n }\n ],\n \"description\": \"Specifies an orthogonal rotation to be applied to an image before it is laid out.\",\n \"restrictions\": [\n \"image\",\n \"box\",\n \"shape\",\n \"enum\"\n ]\n },\n {\n \"name\": \"shape-rendering\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Suppresses aural rendering.\"\n },\n {\n \"name\": \"crispEdges\",\n \"description\": \"Emphasize the contrast between clean edges of artwork over rendering speed and geometric precision.\"\n },\n {\n \"name\": \"geometricPrecision\",\n \"description\": \"Emphasize geometric precision over speed and crisp edges.\"\n },\n {\n \"name\": \"optimizeSpeed\",\n \"description\": \"Emphasize rendering speed over geometric precision and crisp edges.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Provides hints about what tradeoffs to make as it renders vector graphics elements such as <path> elements and basic shapes such as circles and rectangles.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"size\",\n \"browsers\": [\n \"C\",\n \"O8\"\n ],\n \"syntax\": \"<length>{1,2} | auto | [ <page-size> || [ portrait | landscape ] ]\",\n \"relevance\": 52,\n \"description\": \"The size CSS at-rule descriptor, used with the @page at-rule, defines the size and orientation of the box which is used to represent a page. Most of the time, this size corresponds to the target size of the printed page if applicable.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"src\",\n \"values\": [\n {\n \"name\": \"url()\",\n \"description\": \"Reference font by URL\"\n },\n {\n \"name\": \"format()\",\n \"description\": \"Optional hint describing the format of the font resource.\"\n },\n {\n \"name\": \"local()\",\n \"description\": \"Format-specific string that identifies a locally available copy of a given font.\"\n }\n ],\n \"syntax\": \"[ <url> [ format( <string># ) ]? | local( <family-name> ) ]#\",\n \"relevance\": 86,\n \"description\": \"@font-face descriptor. Specifies the resource containing font data. It is required, whether the font is downloadable or locally installed.\",\n \"restrictions\": [\n \"enum\",\n \"url\",\n \"identifier\"\n ]\n },\n {\n \"name\": \"stop-color\",\n \"relevance\": 51,\n \"description\": \"Indicates what color to use at that gradient stop.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"stop-opacity\",\n \"relevance\": 50,\n \"description\": \"Defines the opacity of a given gradient stop.\",\n \"restrictions\": [\n \"number(0-1)\"\n ]\n },\n {\n \"name\": \"stroke\",\n \"values\": [\n {\n \"name\": \"url()\",\n \"description\": \"A URL reference to a paint server element, which is an element that defines a paint server: \u2018hatch\u2019, \u2018linearGradient\u2019, \u2018mesh\u2019, \u2018pattern\u2019, \u2018radialGradient\u2019 and \u2018solidcolor\u2019.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No paint is applied in this layer.\"\n }\n ],\n \"relevance\": 64,\n \"description\": \"Paints along the outline of the given graphical element.\",\n \"restrictions\": [\n \"color\",\n \"enum\",\n \"url\"\n ]\n },\n {\n \"name\": \"stroke-dasharray\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Indicates that no dashing is used.\"\n }\n ],\n \"relevance\": 58,\n \"description\": \"Controls the pattern of dashes and gaps used to stroke paths.\",\n \"restrictions\": [\n \"length\",\n \"percentage\",\n \"number\",\n \"enum\"\n ]\n },\n {\n \"name\": \"stroke-dashoffset\",\n \"relevance\": 58,\n \"description\": \"Specifies the distance into the dash pattern to start the dash.\",\n \"restrictions\": [\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"stroke-linecap\",\n \"values\": [\n {\n \"name\": \"butt\",\n \"description\": \"Indicates that the stroke for each subpath does not extend beyond its two endpoints.\"\n },\n {\n \"name\": \"round\",\n \"description\": \"Indicates that at each end of each subpath, the shape representing the stroke will be extended by a half circle with a radius equal to the stroke width.\"\n },\n {\n \"name\": \"square\",\n \"description\": \"Indicates that at the end of each subpath, the shape representing the stroke will be extended by a rectangle with the same width as the stroke width and whose length is half of the stroke width.\"\n }\n ],\n \"relevance\": 53,\n \"description\": \"Specifies the shape to be used at the end of open subpaths when they are stroked.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"stroke-linejoin\",\n \"values\": [\n {\n \"name\": \"bevel\",\n \"description\": \"Indicates that a bevelled corner is to be used to join path segments.\"\n },\n {\n \"name\": \"miter\",\n \"description\": \"Indicates that a sharp corner is to be used to join path segments.\"\n },\n {\n \"name\": \"round\",\n \"description\": \"Indicates that a round corner is to be used to join path segments.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the shape to be used at the corners of paths or basic shapes when they are stroked.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"stroke-miterlimit\",\n \"relevance\": 50,\n \"description\": \"When two line segments meet at a sharp angle and miter joins have been specified for 'stroke-linejoin', it is possible for the miter to extend far beyond the thickness of the line stroking the path.\",\n \"restrictions\": [\n \"number\"\n ]\n },\n {\n \"name\": \"stroke-opacity\",\n \"relevance\": 52,\n \"description\": \"Specifies the opacity of the painting operation used to stroke the current object.\",\n \"restrictions\": [\n \"number(0-1)\"\n ]\n },\n {\n \"name\": \"stroke-width\",\n \"relevance\": 61,\n \"description\": \"Specifies the width of the stroke on the current object.\",\n \"restrictions\": [\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"suffix\",\n \"browsers\": [\n \"FF33\"\n ],\n \"syntax\": \"<symbol>\",\n \"relevance\": 50,\n \"description\": \"@counter-style descriptor. Specifies a <symbol> that is appended to the marker representation.\",\n \"restrictions\": [\n \"image\",\n \"string\",\n \"identifier\"\n ]\n },\n {\n \"name\": \"system\",\n \"browsers\": [\n \"FF33\"\n ],\n \"values\": [\n {\n \"name\": \"additive\",\n \"description\": \"Represents \u201Csign-value\u201D numbering systems, which, rather than using reusing digits in different positions to change their value, define additional digits with much larger values, so that the value of the number can be obtained by adding all the digits together.\"\n },\n {\n \"name\": \"alphabetic\",\n \"description\": \"Interprets the list of counter symbols as digits to an alphabetic numbering system, similar to the default lower-alpha counter style, which wraps from \\\"a\\\", \\\"b\\\", \\\"c\\\", to \\\"aa\\\", \\\"ab\\\", \\\"ac\\\".\"\n },\n {\n \"name\": \"cyclic\",\n \"description\": \"Cycles repeatedly through its provided symbols, looping back to the beginning when it reaches the end of the list.\"\n },\n {\n \"name\": \"extends\",\n \"description\": \"Use the algorithm of another counter style, but alter other aspects.\"\n },\n {\n \"name\": \"fixed\",\n \"description\": \"Runs through its list of counter symbols once, then falls back.\"\n },\n {\n \"name\": \"numeric\",\n \"description\": \"interprets the list of counter symbols as digits to a \\\"place-value\\\" numbering system, similar to the default 'decimal' counter style.\"\n },\n {\n \"name\": \"symbolic\",\n \"description\": \"Cycles repeatedly through its provided symbols, doubling, tripling, etc. the symbols on each successive pass through the list.\"\n }\n ],\n \"syntax\": \"cyclic | numeric | alphabetic | symbolic | additive | [ fixed <integer>? ] | [ extends <counter-style-name> ]\",\n \"relevance\": 50,\n \"description\": \"@counter-style descriptor. Specifies which algorithm will be used to construct the counter\u2019s representation based on the counter value.\",\n \"restrictions\": [\n \"enum\",\n \"integer\"\n ]\n },\n {\n \"name\": \"symbols\",\n \"browsers\": [\n \"FF33\"\n ],\n \"syntax\": \"<symbol>+\",\n \"relevance\": 50,\n \"description\": \"@counter-style descriptor. Specifies the symbols used by the marker-construction algorithm specified by the system descriptor.\",\n \"restrictions\": [\n \"image\",\n \"string\",\n \"identifier\"\n ]\n },\n {\n \"name\": \"table-layout\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Use any automatic table layout algorithm.\"\n },\n {\n \"name\": \"fixed\",\n \"description\": \"Use the fixed table layout algorithm.\"\n }\n ],\n \"syntax\": \"auto | fixed\",\n \"relevance\": 60,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/table-layout\"\n }\n ],\n \"description\": \"Controls the algorithm used to lay out the table cells, rows, and columns.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"tab-size\",\n \"browsers\": [\n \"E79\",\n \"FF91\",\n \"S7\",\n \"C21\",\n \"O15\"\n ],\n \"syntax\": \"<integer> | <length>\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/tab-size\"\n }\n ],\n \"description\": \"Determines the width of the tab character (U+0009), in space characters (U+0020), when rendered.\",\n \"restrictions\": [\n \"integer\",\n \"length\"\n ]\n },\n {\n \"name\": \"text-align\",\n \"values\": [\n {\n \"name\": \"center\",\n \"description\": \"The inline contents are centered within the line box.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"The inline contents are aligned to the end edge of the line box.\"\n },\n {\n \"name\": \"justify\",\n \"description\": \"The text is justified according to the method specified by the 'text-justify' property.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"The inline contents are aligned to the left edge of the line box. In vertical text, 'left' aligns to the edge of the line box that would be the start edge for left-to-right text.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"The inline contents are aligned to the right edge of the line box. In vertical text, 'right' aligns to the edge of the line box that would be the end edge for left-to-right text.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"The inline contents are aligned to the start edge of the line box.\"\n }\n ],\n \"syntax\": \"start | end | left | right | center | justify | match-parent\",\n \"relevance\": 94,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-align\"\n }\n ],\n \"description\": \"Describes how inline contents of a block are horizontally aligned if the contents do not completely fill the line box.\",\n \"restrictions\": [\n \"string\"\n ]\n },\n {\n \"name\": \"text-align-last\",\n \"browsers\": [\n \"E12\",\n \"FF49\",\n \"C47\",\n \"IE5.5\",\n \"O34\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Content on the affected line is aligned per 'text-align' unless 'text-align' is set to 'justify', in which case it is 'start-aligned'.\"\n },\n {\n \"name\": \"center\",\n \"description\": \"The inline contents are centered within the line box.\"\n },\n {\n \"name\": \"justify\",\n \"description\": \"The text is justified according to the method specified by the 'text-justify' property.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"The inline contents are aligned to the left edge of the line box. In vertical text, 'left' aligns to the edge of the line box that would be the start edge for left-to-right text.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"The inline contents are aligned to the right edge of the line box. In vertical text, 'right' aligns to the edge of the line box that would be the end edge for left-to-right text.\"\n }\n ],\n \"syntax\": \"auto | start | end | left | right | center | justify\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-align-last\"\n }\n ],\n \"description\": \"Describes how the last line of a block or a line right before a forced line break is aligned when 'text-align' is set to 'justify'.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"text-anchor\",\n \"values\": [\n {\n \"name\": \"end\",\n \"description\": \"The rendered characters are aligned such that the end of the resulting rendered text is at the initial current text position.\"\n },\n {\n \"name\": \"middle\",\n \"description\": \"The rendered characters are aligned such that the geometric middle of the resulting rendered text is at the initial current text position.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"The rendered characters are aligned such that the start of the resulting rendered text is at the initial current text position.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Used to align (start-, middle- or end-alignment) a string of text relative to a given point.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"text-decoration\",\n \"values\": [\n {\n \"name\": \"dashed\",\n \"description\": \"Produces a dashed line style.\"\n },\n {\n \"name\": \"dotted\",\n \"description\": \"Produces a dotted line.\"\n },\n {\n \"name\": \"double\",\n \"description\": \"Produces a double line.\"\n },\n {\n \"name\": \"line-through\",\n \"description\": \"Each line of text has a line through the middle.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Produces no line.\"\n },\n {\n \"name\": \"overline\",\n \"description\": \"Each line of text has a line above it.\"\n },\n {\n \"name\": \"solid\",\n \"description\": \"Produces a solid line.\"\n },\n {\n \"name\": \"underline\",\n \"description\": \"Each line of text is underlined.\"\n },\n {\n \"name\": \"wavy\",\n \"description\": \"Produces a wavy line.\"\n }\n ],\n \"syntax\": \"<'text-decoration-line'> || <'text-decoration-style'> || <'text-decoration-color'> || <'text-decoration-thickness'>\",\n \"relevance\": 92,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-decoration\"\n }\n ],\n \"description\": \"Decorations applied to font used for an element's text.\",\n \"restrictions\": [\n \"enum\",\n \"color\"\n ]\n },\n {\n \"name\": \"text-decoration-color\",\n \"browsers\": [\n \"E79\",\n \"FF36\",\n \"S12.1\",\n \"C57\",\n \"O44\"\n ],\n \"syntax\": \"<color>\",\n \"relevance\": 52,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-decoration-color\"\n }\n ],\n \"description\": \"Specifies the color of text decoration (underlines overlines, and line-throughs) set on the element with text-decoration-line.\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"text-decoration-line\",\n \"browsers\": [\n \"E79\",\n \"FF36\",\n \"S12.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"line-through\",\n \"description\": \"Each line of text has a line through the middle.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Neither produces nor inhibits text decoration.\"\n },\n {\n \"name\": \"overline\",\n \"description\": \"Each line of text has a line above it.\"\n },\n {\n \"name\": \"underline\",\n \"description\": \"Each line of text is underlined.\"\n }\n ],\n \"syntax\": \"none | [ underline || overline || line-through || blink ] | spelling-error | grammar-error\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-decoration-line\"\n }\n ],\n \"description\": \"Specifies what line decorations, if any, are added to the element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"text-decoration-style\",\n \"browsers\": [\n \"E79\",\n \"FF36\",\n \"S12.1\",\n \"C57\",\n \"O44\"\n ],\n \"values\": [\n {\n \"name\": \"dashed\",\n \"description\": \"Produces a dashed line style.\"\n },\n {\n \"name\": \"dotted\",\n \"description\": \"Produces a dotted line.\"\n },\n {\n \"name\": \"double\",\n \"description\": \"Produces a double line.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Produces no line.\"\n },\n {\n \"name\": \"solid\",\n \"description\": \"Produces a solid line.\"\n },\n {\n \"name\": \"wavy\",\n \"description\": \"Produces a wavy line.\"\n }\n ],\n \"syntax\": \"solid | double | dotted | dashed | wavy\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-decoration-style\"\n }\n ],\n \"description\": \"Specifies the line style for underline, line-through and overline text decoration.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"text-indent\",\n \"values\": [],\n \"syntax\": \"<length-percentage> && hanging? && each-line?\",\n \"relevance\": 68,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-indent\"\n }\n ],\n \"description\": \"Specifies the indentation applied to lines of inline content in a block. The indentation only affects the first line of inline content in the block unless the 'hanging' keyword is specified, in which case it affects all lines except the first.\",\n \"restrictions\": [\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"text-justify\",\n \"browsers\": [\n \"E12\",\n \"FF55\",\n \"C32\",\n \"IE11\",\n \"O19\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The UA determines the justification algorithm to follow, based on a balance between performance and adequate presentation quality.\"\n },\n {\n \"name\": \"distribute\",\n \"description\": \"Justification primarily changes spacing both at word separators and at grapheme cluster boundaries in all scripts except those in the connected and cursive groups. This value is sometimes used in e.g. Japanese, often with the 'text-align-last' property.\"\n },\n {\n \"name\": \"distribute-all-lines\"\n },\n {\n \"name\": \"inter-cluster\",\n \"description\": \"Justification primarily changes spacing at word separators and at grapheme cluster boundaries in clustered scripts. This value is typically used for Southeast Asian scripts such as Thai.\"\n },\n {\n \"name\": \"inter-ideograph\",\n \"description\": \"Justification primarily changes spacing at word separators and at inter-graphemic boundaries in scripts that use no word spaces. This value is typically used for CJK languages.\"\n },\n {\n \"name\": \"inter-word\",\n \"description\": \"Justification primarily changes spacing at word separators. This value is typically used for languages that separate words using spaces, like English or (sometimes) Korean.\"\n },\n {\n \"name\": \"kashida\",\n \"description\": \"Justification primarily stretches Arabic and related scripts through the use of kashida or other calligraphic elongation.\"\n },\n {\n \"name\": \"newspaper\"\n }\n ],\n \"syntax\": \"auto | inter-character | inter-word | none\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-justify\"\n }\n ],\n \"description\": \"Selects the justification algorithm used when 'text-align' is set to 'justify'. The property applies to block containers, but the UA may (but is not required to) also support it on inline elements.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"text-orientation\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S14\",\n \"C48\",\n \"O35\"\n ],\n \"values\": [\n {\n \"name\": \"sideways\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S14\",\n \"C48\",\n \"O35\"\n ],\n \"description\": \"This value is equivalent to 'sideways-right' in 'vertical-rl' writing mode and equivalent to 'sideways-left' in 'vertical-lr' writing mode.\"\n },\n {\n \"name\": \"sideways-right\",\n \"browsers\": [\n \"E79\",\n \"FF41\",\n \"S14\",\n \"C48\",\n \"O35\"\n ],\n \"description\": \"In vertical writing modes, this causes text to be set as if in a horizontal layout, but rotated 90\u00B0 clockwise.\"\n },\n {\n \"name\": \"upright\",\n \"description\": \"In vertical writing modes, characters from horizontal-only scripts are rendered upright, i.e. in their standard horizontal orientation.\"\n }\n ],\n \"syntax\": \"mixed | upright | sideways\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-orientation\"\n }\n ],\n \"description\": \"Specifies the orientation of text within a line.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"text-overflow\",\n \"values\": [\n {\n \"name\": \"clip\",\n \"description\": \"Clip inline content that overflows. Characters may be only partially rendered.\"\n },\n {\n \"name\": \"ellipsis\",\n \"description\": \"Render an ellipsis character (U+2026) to represent clipped inline content.\"\n }\n ],\n \"syntax\": \"[ clip | ellipsis | <string> ]{1,2}\",\n \"relevance\": 82,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-overflow\"\n }\n ],\n \"description\": \"Text can overflow for example when it is prevented from wrapping.\",\n \"restrictions\": [\n \"enum\",\n \"string\"\n ]\n },\n {\n \"name\": \"text-rendering\",\n \"browsers\": [\n \"E79\",\n \"FF1\",\n \"S5\",\n \"C4\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"geometricPrecision\",\n \"description\": \"Indicates that the user agent shall emphasize geometric precision over legibility and rendering speed.\"\n },\n {\n \"name\": \"optimizeLegibility\",\n \"description\": \"Indicates that the user agent shall emphasize legibility over rendering speed and geometric precision.\"\n },\n {\n \"name\": \"optimizeSpeed\",\n \"description\": \"Indicates that the user agent shall emphasize rendering speed over legibility and geometric precision.\"\n }\n ],\n \"syntax\": \"auto | optimizeSpeed | optimizeLegibility | geometricPrecision\",\n \"relevance\": 68,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-rendering\"\n }\n ],\n \"description\": \"The creator of SVG content might want to provide a hint to the implementation about what tradeoffs to make as it renders text. The \u2018text-rendering\u2019 property provides these hints.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"text-shadow\",\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No shadow.\"\n }\n ],\n \"syntax\": \"none | <shadow-t>#\",\n \"relevance\": 74,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-shadow\"\n }\n ],\n \"description\": \"Enables shadow effects to be applied to the text of the element.\",\n \"restrictions\": [\n \"length\",\n \"color\"\n ]\n },\n {\n \"name\": \"text-transform\",\n \"values\": [\n {\n \"name\": \"capitalize\",\n \"description\": \"Puts the first typographic letter unit of each word in titlecase.\"\n },\n {\n \"name\": \"lowercase\",\n \"description\": \"Puts all letters in lowercase.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No effects.\"\n },\n {\n \"name\": \"uppercase\",\n \"description\": \"Puts all letters in uppercase.\"\n }\n ],\n \"syntax\": \"none | capitalize | uppercase | lowercase | full-width | full-size-kana\",\n \"relevance\": 86,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-transform\"\n }\n ],\n \"description\": \"Controls capitalization effects of an element\u2019s text.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"text-underline-position\",\n \"values\": [\n {\n \"name\": \"above\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"The user agent may use any algorithm to determine the underline\u2019s position. In horizontal line layout, the underline should be aligned as for alphabetic. In vertical line layout, if the language is set to Japanese or Korean, the underline should be aligned as for over.\"\n },\n {\n \"name\": \"below\",\n \"description\": \"The underline is aligned with the under edge of the element\u2019s content box.\"\n }\n ],\n \"syntax\": \"auto | from-font | [ under || [ left | right ] ]\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-underline-position\"\n }\n ],\n \"description\": \"Sets the position of an underline specified on the same element: it does not affect underlines specified by ancestor elements. This property is typically used in vertical writing contexts such as in Japanese documents where it often desired to have the underline appear 'over' (to the right of) the affected run of text\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"top\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well\"\n }\n ],\n \"syntax\": \"<length> | <percentage> | auto\",\n \"relevance\": 95,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/top\"\n }\n ],\n \"description\": \"Specifies how far an absolutely positioned box's top margin edge is offset below the top edge of the box's 'containing block'.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"touch-action\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The user agent may determine any permitted touch behaviors for touches that begin on the element.\"\n },\n {\n \"name\": \"cross-slide-x\"\n },\n {\n \"name\": \"cross-slide-y\"\n },\n {\n \"name\": \"double-tap-zoom\"\n },\n {\n \"name\": \"manipulation\",\n \"description\": \"The user agent may consider touches that begin on the element only for the purposes of scrolling and continuous zooming.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Touches that begin on the element must not trigger default touch behaviors.\"\n },\n {\n \"name\": \"pan-x\",\n \"description\": \"The user agent may consider touches that begin on the element only for the purposes of horizontally scrolling the element\u2019s nearest ancestor with horizontally scrollable content.\"\n },\n {\n \"name\": \"pan-y\",\n \"description\": \"The user agent may consider touches that begin on the element only for the purposes of vertically scrolling the element\u2019s nearest ancestor with vertically scrollable content.\"\n },\n {\n \"name\": \"pinch-zoom\"\n }\n ],\n \"syntax\": \"auto | none | [ [ pan-x | pan-left | pan-right ] || [ pan-y | pan-up | pan-down ] || pinch-zoom ] | manipulation\",\n \"relevance\": 67,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/touch-action\"\n }\n ],\n \"description\": \"Determines whether touch input may trigger default behavior supplied by user agent.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"transform\",\n \"values\": [\n {\n \"name\": \"matrix()\",\n \"description\": \"Specifies a 2D transformation in the form of a transformation matrix of six values. matrix(a,b,c,d,e,f) is equivalent to applying the transformation matrix [a b c d e f]\"\n },\n {\n \"name\": \"matrix3d()\",\n \"description\": \"Specifies a 3D transformation as a 4x4 homogeneous matrix of 16 values in column-major order.\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"perspective()\",\n \"description\": \"Specifies a perspective projection matrix.\"\n },\n {\n \"name\": \"rotate()\",\n \"description\": \"Specifies a 2D rotation by the angle specified in the parameter about the origin of the element, as defined by the transform-origin property.\"\n },\n {\n \"name\": \"rotate3d()\",\n \"description\": \"Specifies a clockwise 3D rotation by the angle specified in last parameter about the [x,y,z] direction vector described by the first 3 parameters.\"\n },\n {\n \"name\": \"rotateX('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the X axis.\"\n },\n {\n \"name\": \"rotateY('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the Y axis.\"\n },\n {\n \"name\": \"rotateZ('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the Z axis.\"\n },\n {\n \"name\": \"scale()\",\n \"description\": \"Specifies a 2D scale operation by the [sx,sy] scaling vector described by the 2 parameters. If the second parameter is not provided, it is takes a value equal to the first.\"\n },\n {\n \"name\": \"scale3d()\",\n \"description\": \"Specifies a 3D scale operation by the [sx,sy,sz] scaling vector described by the 3 parameters.\"\n },\n {\n \"name\": \"scaleX()\",\n \"description\": \"Specifies a scale operation using the [sx,1] scaling vector, where sx is given as the parameter.\"\n },\n {\n \"name\": \"scaleY()\",\n \"description\": \"Specifies a scale operation using the [sy,1] scaling vector, where sy is given as the parameter.\"\n },\n {\n \"name\": \"scaleZ()\",\n \"description\": \"Specifies a scale operation using the [1,1,sz] scaling vector, where sz is given as the parameter.\"\n },\n {\n \"name\": \"skew()\",\n \"description\": \"Specifies a skew transformation along the X and Y axes. The first angle parameter specifies the skew on the X axis. The second angle parameter specifies the skew on the Y axis. If the second parameter is not given then a value of 0 is used for the Y angle (ie: no skew on the Y axis).\"\n },\n {\n \"name\": \"skewX()\",\n \"description\": \"Specifies a skew transformation along the X axis by the given angle.\"\n },\n {\n \"name\": \"skewY()\",\n \"description\": \"Specifies a skew transformation along the Y axis by the given angle.\"\n },\n {\n \"name\": \"translate()\",\n \"description\": \"Specifies a 2D translation by the vector [tx, ty], where tx is the first translation-value parameter and ty is the optional second translation-value parameter.\"\n },\n {\n \"name\": \"translate3d()\",\n \"description\": \"Specifies a 3D translation by the vector [tx,ty,tz], with tx, ty and tz being the first, second and third translation-value parameters respectively.\"\n },\n {\n \"name\": \"translateX()\",\n \"description\": \"Specifies a translation by the given amount in the X direction.\"\n },\n {\n \"name\": \"translateY()\",\n \"description\": \"Specifies a translation by the given amount in the Y direction.\"\n },\n {\n \"name\": \"translateZ()\",\n \"description\": \"Specifies a translation by the given amount in the Z direction. Note that percentage values are not allowed in the translateZ translation-value, and if present are evaluated as 0.\"\n }\n ],\n \"syntax\": \"none | <transform-list>\",\n \"relevance\": 90,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/transform\"\n }\n ],\n \"description\": \"A two-dimensional transformation is applied to an element through the 'transform' property. This property contains a list of transform functions similar to those allowed by SVG.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"transform-origin\",\n \"syntax\": \"[ <length-percentage> | left | center | right | top | bottom ] | [ [ <length-percentage> | left | center | right ] && [ <length-percentage> | top | center | bottom ] ] <length>?\",\n \"relevance\": 76,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/transform-origin\"\n }\n ],\n \"description\": \"Establishes the origin of transformation for an element.\",\n \"restrictions\": [\n \"position\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"transform-style\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C36\",\n \"O23\"\n ],\n \"values\": [\n {\n \"name\": \"flat\",\n \"description\": \"All children of this element are rendered flattened into the 2D plane of the element.\"\n },\n {\n \"name\": \"preserve-3d\",\n \"browsers\": [\n \"E12\",\n \"FF16\",\n \"S9\",\n \"C36\",\n \"O23\"\n ],\n \"description\": \"Flattening is not performed, so children maintain their position in 3D space.\"\n }\n ],\n \"syntax\": \"flat | preserve-3d\",\n \"relevance\": 55,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/transform-style\"\n }\n ],\n \"description\": \"Defines how nested elements are rendered in 3D space.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"transition\",\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"Every property that is able to undergo a transition will do so.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No property will transition.\"\n }\n ],\n \"syntax\": \"<single-transition>#\",\n \"relevance\": 88,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/transition\"\n }\n ],\n \"description\": \"Shorthand property combines four of the transition properties into a single property.\",\n \"restrictions\": [\n \"time\",\n \"property\",\n \"timing-function\",\n \"enum\"\n ]\n },\n {\n \"name\": \"transition-delay\",\n \"syntax\": \"<time>#\",\n \"relevance\": 63,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/transition-delay\"\n }\n ],\n \"description\": \"Defines when the transition will start. It allows a transition to begin execution some period of time from when it is applied.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"transition-duration\",\n \"syntax\": \"<time>#\",\n \"relevance\": 63,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/transition-duration\"\n }\n ],\n \"description\": \"Specifies how long the transition from the old value to the new value should take.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"transition-property\",\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"Every property that is able to undergo a transition will do so.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No property will transition.\"\n }\n ],\n \"syntax\": \"none | <single-transition-property>#\",\n \"relevance\": 63,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/transition-property\"\n }\n ],\n \"description\": \"Specifies the name of the CSS property to which the transition is applied.\",\n \"restrictions\": [\n \"property\"\n ]\n },\n {\n \"name\": \"transition-timing-function\",\n \"syntax\": \"<easing-function>#\",\n \"relevance\": 64,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/transition-timing-function\"\n }\n ],\n \"description\": \"Describes how the intermediate values used during a transition will be calculated.\",\n \"restrictions\": [\n \"timing-function\"\n ]\n },\n {\n \"name\": \"unicode-bidi\",\n \"values\": [\n {\n \"name\": \"bidi-override\",\n \"description\": \"Inside the element, reordering is strictly in sequence according to the 'direction' property; the implicit part of the bidirectional algorithm is ignored.\"\n },\n {\n \"name\": \"embed\",\n \"description\": \"If the element is inline-level, this value opens an additional level of embedding with respect to the bidirectional algorithm. The direction of this embedding level is given by the 'direction' property.\"\n },\n {\n \"name\": \"isolate\",\n \"description\": \"The contents of the element are considered to be inside a separate, independent paragraph.\"\n },\n {\n \"name\": \"isolate-override\",\n \"description\": \"This combines the isolation behavior of 'isolate' with the directional override behavior of 'bidi-override'\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"The element does not open an additional level of embedding with respect to the bidirectional algorithm. For inline-level elements, implicit reordering works across element boundaries.\"\n },\n {\n \"name\": \"plaintext\",\n \"description\": \"For the purposes of the Unicode bidirectional algorithm, the base directionality of each bidi paragraph for which the element forms the containing block is determined not by the element's computed 'direction'.\"\n }\n ],\n \"syntax\": \"normal | embed | isolate | bidi-override | isolate-override | plaintext\",\n \"relevance\": 57,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/unicode-bidi\"\n }\n ],\n \"description\": \"The level of embedding with respect to the bidirectional algorithm.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"unicode-range\",\n \"values\": [\n {\n \"name\": \"U+26\",\n \"description\": \"Ampersand.\"\n },\n {\n \"name\": \"U+20-24F, U+2B0-2FF, U+370-4FF, U+1E00-1EFF, U+2000-20CF, U+2100-23FF, U+2500-26FF, U+E000-F8FF, U+FB00\u2013FB4F\",\n \"description\": \"WGL4 character set (Pan-European).\"\n },\n {\n \"name\": \"U+20-17F, U+2B0-2FF, U+2000-206F, U+20A0-20CF, U+2100-21FF, U+2600-26FF\",\n \"description\": \"The Multilingual European Subset No. 1. Latin. Covers ~44 languages.\"\n },\n {\n \"name\": \"U+20-2FF, U+370-4FF, U+1E00-20CF, U+2100-23FF, U+2500-26FF, U+FB00-FB4F, U+FFF0-FFFD\",\n \"description\": \"The Multilingual European Subset No. 2. Latin, Greek, and Cyrillic. Covers ~128 language.\"\n },\n {\n \"name\": \"U+20-4FF, U+530-58F, U+10D0-10FF, U+1E00-23FF, U+2440-245F, U+2500-26FF, U+FB00-FB4F, U+FE20-FE2F, U+FFF0-FFFD\",\n \"description\": \"The Multilingual European Subset No. 3. Covers all characters belonging to European scripts.\"\n },\n {\n \"name\": \"U+00-7F\",\n \"description\": \"Basic Latin (ASCII).\"\n },\n {\n \"name\": \"U+80-FF\",\n \"description\": \"Latin-1 Supplement. Accented characters for Western European languages, common punctuation characters, multiplication and division signs.\"\n },\n {\n \"name\": \"U+100-17F\",\n \"description\": \"Latin Extended-A. Accented characters for for Czech, Dutch, Polish, and Turkish.\"\n },\n {\n \"name\": \"U+180-24F\",\n \"description\": \"Latin Extended-B. Croatian, Slovenian, Romanian, Non-European and historic latin, Khoisan, Pinyin, Livonian, Sinology.\"\n },\n {\n \"name\": \"U+1E00-1EFF\",\n \"description\": \"Latin Extended Additional. Vietnamese, German captial sharp s, Medievalist, Latin general use.\"\n },\n {\n \"name\": \"U+250-2AF\",\n \"description\": \"International Phonetic Alphabet Extensions.\"\n },\n {\n \"name\": \"U+370-3FF\",\n \"description\": \"Greek and Coptic.\"\n },\n {\n \"name\": \"U+1F00-1FFF\",\n \"description\": \"Greek Extended. Accented characters for polytonic Greek.\"\n },\n {\n \"name\": \"U+400-4FF\",\n \"description\": \"Cyrillic.\"\n },\n {\n \"name\": \"U+500-52F\",\n \"description\": \"Cyrillic Supplement. Extra letters for Komi, Khanty, Chukchi, Mordvin, Kurdish, Aleut, Chuvash, Abkhaz, Azerbaijani, and Orok.\"\n },\n {\n \"name\": \"U+00-52F, U+1E00-1FFF, U+2200\u201322FF\",\n \"description\": \"Latin, Greek, Cyrillic, some punctuation and symbols.\"\n },\n {\n \"name\": \"U+530\u201358F\",\n \"description\": \"Armenian.\"\n },\n {\n \"name\": \"U+590\u20135FF\",\n \"description\": \"Hebrew.\"\n },\n {\n \"name\": \"U+600\u20136FF\",\n \"description\": \"Arabic.\"\n },\n {\n \"name\": \"U+750\u201377F\",\n \"description\": \"Arabic Supplement. Additional letters for African languages, Khowar, Torwali, Burushaski, and early Persian.\"\n },\n {\n \"name\": \"U+8A0\u20138FF\",\n \"description\": \"Arabic Extended-A. Additional letters for African languages, European and Central Asian languages, Rohingya, Tamazight, Arwi, and Koranic annotation signs.\"\n },\n {\n \"name\": \"U+700\u201374F\",\n \"description\": \"Syriac.\"\n },\n {\n \"name\": \"U+900\u201397F\",\n \"description\": \"Devanagari.\"\n },\n {\n \"name\": \"U+980\u20139FF\",\n \"description\": \"Bengali.\"\n },\n {\n \"name\": \"U+A00\u2013A7F\",\n \"description\": \"Gurmukhi.\"\n },\n {\n \"name\": \"U+A80\u2013AFF\",\n \"description\": \"Gujarati.\"\n },\n {\n \"name\": \"U+B00\u2013B7F\",\n \"description\": \"Oriya.\"\n },\n {\n \"name\": \"U+B80\u2013BFF\",\n \"description\": \"Tamil.\"\n },\n {\n \"name\": \"U+C00\u2013C7F\",\n \"description\": \"Telugu.\"\n },\n {\n \"name\": \"U+C80\u2013CFF\",\n \"description\": \"Kannada.\"\n },\n {\n \"name\": \"U+D00\u2013D7F\",\n \"description\": \"Malayalam.\"\n },\n {\n \"name\": \"U+D80\u2013DFF\",\n \"description\": \"Sinhala.\"\n },\n {\n \"name\": \"U+118A0\u2013118FF\",\n \"description\": \"Warang Citi.\"\n },\n {\n \"name\": \"U+E00\u2013E7F\",\n \"description\": \"Thai.\"\n },\n {\n \"name\": \"U+1A20\u20131AAF\",\n \"description\": \"Tai Tham.\"\n },\n {\n \"name\": \"U+AA80\u2013AADF\",\n \"description\": \"Tai Viet.\"\n },\n {\n \"name\": \"U+E80\u2013EFF\",\n \"description\": \"Lao.\"\n },\n {\n \"name\": \"U+F00\u2013FFF\",\n \"description\": \"Tibetan.\"\n },\n {\n \"name\": \"U+1000\u2013109F\",\n \"description\": \"Myanmar (Burmese).\"\n },\n {\n \"name\": \"U+10A0\u201310FF\",\n \"description\": \"Georgian.\"\n },\n {\n \"name\": \"U+1200\u2013137F\",\n \"description\": \"Ethiopic.\"\n },\n {\n \"name\": \"U+1380\u2013139F\",\n \"description\": \"Ethiopic Supplement. Extra Syllables for Sebatbeit, and Tonal marks\"\n },\n {\n \"name\": \"U+2D80\u20132DDF\",\n \"description\": \"Ethiopic Extended. Extra Syllables for Me'en, Blin, and Sebatbeit.\"\n },\n {\n \"name\": \"U+AB00\u2013AB2F\",\n \"description\": \"Ethiopic Extended-A. Extra characters for Gamo-Gofa-Dawro, Basketo, and Gumuz.\"\n },\n {\n \"name\": \"U+1780\u201317FF\",\n \"description\": \"Khmer.\"\n },\n {\n \"name\": \"U+1800\u201318AF\",\n \"description\": \"Mongolian.\"\n },\n {\n \"name\": \"U+1B80\u20131BBF\",\n \"description\": \"Sundanese.\"\n },\n {\n \"name\": \"U+1CC0\u20131CCF\",\n \"description\": \"Sundanese Supplement. Punctuation.\"\n },\n {\n \"name\": \"U+4E00\u20139FD5\",\n \"description\": \"CJK (Chinese, Japanese, Korean) Unified Ideographs. Most common ideographs for modern Chinese and Japanese.\"\n },\n {\n \"name\": \"U+3400\u20134DB5\",\n \"description\": \"CJK Unified Ideographs Extension A. Rare ideographs.\"\n },\n {\n \"name\": \"U+2F00\u20132FDF\",\n \"description\": \"Kangxi Radicals.\"\n },\n {\n \"name\": \"U+2E80\u20132EFF\",\n \"description\": \"CJK Radicals Supplement. Alternative forms of Kangxi Radicals.\"\n },\n {\n \"name\": \"U+1100\u201311FF\",\n \"description\": \"Hangul Jamo.\"\n },\n {\n \"name\": \"U+AC00\u2013D7AF\",\n \"description\": \"Hangul Syllables.\"\n },\n {\n \"name\": \"U+3040\u2013309F\",\n \"description\": \"Hiragana.\"\n },\n {\n \"name\": \"U+30A0\u201330FF\",\n \"description\": \"Katakana.\"\n },\n {\n \"name\": \"U+A5, U+4E00-9FFF, U+30??, U+FF00-FF9F\",\n \"description\": \"Japanese Kanji, Hiragana and Katakana characters plus Yen/Yuan symbol.\"\n },\n {\n \"name\": \"U+A4D0\u2013A4FF\",\n \"description\": \"Lisu.\"\n },\n {\n \"name\": \"U+A000\u2013A48F\",\n \"description\": \"Yi Syllables.\"\n },\n {\n \"name\": \"U+A490\u2013A4CF\",\n \"description\": \"Yi Radicals.\"\n },\n {\n \"name\": \"U+2000-206F\",\n \"description\": \"General Punctuation.\"\n },\n {\n \"name\": \"U+3000\u2013303F\",\n \"description\": \"CJK Symbols and Punctuation.\"\n },\n {\n \"name\": \"U+2070\u2013209F\",\n \"description\": \"Superscripts and Subscripts.\"\n },\n {\n \"name\": \"U+20A0\u201320CF\",\n \"description\": \"Currency Symbols.\"\n },\n {\n \"name\": \"U+2100\u2013214F\",\n \"description\": \"Letterlike Symbols.\"\n },\n {\n \"name\": \"U+2150\u2013218F\",\n \"description\": \"Number Forms.\"\n },\n {\n \"name\": \"U+2190\u201321FF\",\n \"description\": \"Arrows.\"\n },\n {\n \"name\": \"U+2200\u201322FF\",\n \"description\": \"Mathematical Operators.\"\n },\n {\n \"name\": \"U+2300\u201323FF\",\n \"description\": \"Miscellaneous Technical.\"\n },\n {\n \"name\": \"U+E000-F8FF\",\n \"description\": \"Private Use Area.\"\n },\n {\n \"name\": \"U+FB00\u2013FB4F\",\n \"description\": \"Alphabetic Presentation Forms. Ligatures for latin, Armenian, and Hebrew.\"\n },\n {\n \"name\": \"U+FB50\u2013FDFF\",\n \"description\": \"Arabic Presentation Forms-A. Contextual forms / ligatures for Persian, Urdu, Sindhi, Central Asian languages, etc, Arabic pedagogical symbols, word ligatures.\"\n },\n {\n \"name\": \"U+1F600\u20131F64F\",\n \"description\": \"Emoji: Emoticons.\"\n },\n {\n \"name\": \"U+2600\u201326FF\",\n \"description\": \"Emoji: Miscellaneous Symbols.\"\n },\n {\n \"name\": \"U+1F300\u20131F5FF\",\n \"description\": \"Emoji: Miscellaneous Symbols and Pictographs.\"\n },\n {\n \"name\": \"U+1F900\u20131F9FF\",\n \"description\": \"Emoji: Supplemental Symbols and Pictographs.\"\n },\n {\n \"name\": \"U+1F680\u20131F6FF\",\n \"description\": \"Emoji: Transport and Map Symbols.\"\n }\n ],\n \"syntax\": \"<unicode-range>#\",\n \"relevance\": 72,\n \"description\": \"@font-face descriptor. Defines the set of Unicode codepoints that may be supported by the font face for which it is declared.\",\n \"restrictions\": [\n \"unicode-range\"\n ]\n },\n {\n \"name\": \"user-select\",\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"The content of the element must be selected atomically\"\n },\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"contain\",\n \"description\": \"UAs must not allow a selection which is started in this element to be extended outside of this element.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The UA must not allow selections to be started in this element.\"\n },\n {\n \"name\": \"text\",\n \"description\": \"The element imposes no constraint on the selection.\"\n }\n ],\n \"syntax\": \"auto | text | none | contain | all\",\n \"relevance\": 77,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/user-select\"\n }\n ],\n \"description\": \"Controls the appearance of selection.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"vertical-align\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Align the dominant baseline of the parent box with the equivalent, or heuristically reconstructed, baseline of the element inline box.\"\n },\n {\n \"name\": \"baseline\",\n \"description\": \"Align the 'alphabetic' baseline of the element with the 'alphabetic' baseline of the parent element.\"\n },\n {\n \"name\": \"bottom\",\n \"description\": \"Align the after edge of the extended inline box with the after-edge of the line box.\"\n },\n {\n \"name\": \"middle\",\n \"description\": \"Align the 'middle' baseline of the inline element with the middle baseline of the parent.\"\n },\n {\n \"name\": \"sub\",\n \"description\": \"Lower the baseline of the box to the proper position for subscripts of the parent's box. (This value has no effect on the font size of the element's text.)\"\n },\n {\n \"name\": \"super\",\n \"description\": \"Raise the baseline of the box to the proper position for superscripts of the parent's box. (This value has no effect on the font size of the element's text.)\"\n },\n {\n \"name\": \"text-bottom\",\n \"description\": \"Align the bottom of the box with the after-edge of the parent element's font.\"\n },\n {\n \"name\": \"text-top\",\n \"description\": \"Align the top of the box with the before-edge of the parent element's font.\"\n },\n {\n \"name\": \"top\",\n \"description\": \"Align the before edge of the extended inline box with the before-edge of the line box.\"\n },\n {\n \"name\": \"-webkit-baseline-middle\"\n }\n ],\n \"syntax\": \"baseline | sub | super | text-top | text-bottom | middle | top | bottom | <percentage> | <length>\",\n \"relevance\": 92,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/vertical-align\"\n }\n ],\n \"description\": \"Affects the vertical positioning of the inline boxes generated by an inline-level element inside a line box.\",\n \"restrictions\": [\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"visibility\",\n \"values\": [\n {\n \"name\": \"collapse\",\n \"description\": \"Table-specific. If used on elements other than rows, row groups, columns, or column groups, 'collapse' has the same meaning as 'hidden'.\"\n },\n {\n \"name\": \"hidden\",\n \"description\": \"The generated box is invisible (fully transparent, nothing is drawn), but still affects layout.\"\n },\n {\n \"name\": \"visible\",\n \"description\": \"The generated box is visible.\"\n }\n ],\n \"syntax\": \"visible | hidden | collapse\",\n \"relevance\": 88,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/visibility\"\n }\n ],\n \"description\": \"Specifies whether the boxes generated by an element are rendered. Invisible boxes still affect layout (set the \u2018display\u2019 property to \u2018none\u2019 to suppress box generation altogether).\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-animation\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"alternate\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction.\"\n },\n {\n \"name\": \"alternate-reverse\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction.\"\n },\n {\n \"name\": \"backwards\",\n \"description\": \"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'.\"\n },\n {\n \"name\": \"both\",\n \"description\": \"Both forwards and backwards fill modes are applied.\"\n },\n {\n \"name\": \"forwards\",\n \"description\": \"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes.\"\n },\n {\n \"name\": \"infinite\",\n \"description\": \"Causes the animation to repeat forever.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No animation is performed\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Normal playback.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"All iterations of the animation are played in the reverse direction from the way they were specified.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property combines six of the animation properties into a single property.\",\n \"restrictions\": [\n \"time\",\n \"enum\",\n \"timing-function\",\n \"identifier\",\n \"number\"\n ]\n },\n {\n \"name\": \"-webkit-animation-delay\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"relevance\": 50,\n \"description\": \"Defines when the animation will start.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-webkit-animation-direction\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"alternate\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction.\"\n },\n {\n \"name\": \"alternate-reverse\",\n \"description\": \"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Normal playback.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"All iterations of the animation are played in the reverse direction from the way they were specified.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines whether or not the animation should play in reverse on alternate cycles.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-animation-duration\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"relevance\": 50,\n \"description\": \"Defines the length of time that an animation takes to complete one cycle.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-webkit-animation-fill-mode\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"backwards\",\n \"description\": \"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'.\"\n },\n {\n \"name\": \"both\",\n \"description\": \"Both forwards and backwards fill modes are applied.\"\n },\n {\n \"name\": \"forwards\",\n \"description\": \"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"There is no change to the property value between the time the animation is applied and the time the animation begins playing or after the animation completes.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines what values are applied by the animation outside the time it is executing.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-animation-iteration-count\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"infinite\",\n \"description\": \"Causes the animation to repeat forever.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines the number of times an animation cycle is played. The default value is one, meaning the animation will play from beginning to end once.\",\n \"restrictions\": [\n \"number\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-animation-name\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No animation is performed\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines a list of animations that apply. Each name is used to select the keyframe at-rule that provides the property values for the animation.\",\n \"restrictions\": [\n \"identifier\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-animation-play-state\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"paused\",\n \"description\": \"A running animation will be paused.\"\n },\n {\n \"name\": \"running\",\n \"description\": \"Resume playback of a paused animation.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines whether the animation is running or paused.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-animation-timing-function\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"relevance\": 50,\n \"description\": \"Describes how the animation will progress over one cycle of its duration. See the 'transition-timing-function'.\",\n \"restrictions\": [\n \"timing-function\"\n ]\n },\n {\n \"name\": \"-webkit-appearance\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"button\"\n },\n {\n \"name\": \"button-bevel\"\n },\n {\n \"name\": \"caps-lock-indicator\"\n },\n {\n \"name\": \"caret\"\n },\n {\n \"name\": \"checkbox\"\n },\n {\n \"name\": \"default-button\"\n },\n {\n \"name\": \"listbox\"\n },\n {\n \"name\": \"listitem\"\n },\n {\n \"name\": \"media-fullscreen-button\"\n },\n {\n \"name\": \"media-mute-button\"\n },\n {\n \"name\": \"media-play-button\"\n },\n {\n \"name\": \"media-seek-back-button\"\n },\n {\n \"name\": \"media-seek-forward-button\"\n },\n {\n \"name\": \"media-slider\"\n },\n {\n \"name\": \"media-sliderthumb\"\n },\n {\n \"name\": \"menulist\"\n },\n {\n \"name\": \"menulist-button\"\n },\n {\n \"name\": \"menulist-text\"\n },\n {\n \"name\": \"menulist-textfield\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"push-button\"\n },\n {\n \"name\": \"radio\"\n },\n {\n \"name\": \"scrollbarbutton-down\"\n },\n {\n \"name\": \"scrollbarbutton-left\"\n },\n {\n \"name\": \"scrollbarbutton-right\"\n },\n {\n \"name\": \"scrollbarbutton-up\"\n },\n {\n \"name\": \"scrollbargripper-horizontal\"\n },\n {\n \"name\": \"scrollbargripper-vertical\"\n },\n {\n \"name\": \"scrollbarthumb-horizontal\"\n },\n {\n \"name\": \"scrollbarthumb-vertical\"\n },\n {\n \"name\": \"scrollbartrack-horizontal\"\n },\n {\n \"name\": \"scrollbartrack-vertical\"\n },\n {\n \"name\": \"searchfield\"\n },\n {\n \"name\": \"searchfield-cancel-button\"\n },\n {\n \"name\": \"searchfield-decoration\"\n },\n {\n \"name\": \"searchfield-results-button\"\n },\n {\n \"name\": \"searchfield-results-decoration\"\n },\n {\n \"name\": \"slider-horizontal\"\n },\n {\n \"name\": \"sliderthumb-horizontal\"\n },\n {\n \"name\": \"sliderthumb-vertical\"\n },\n {\n \"name\": \"slider-vertical\"\n },\n {\n \"name\": \"square-button\"\n },\n {\n \"name\": \"textarea\"\n },\n {\n \"name\": \"textfield\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"none | button | button-bevel | caret | checkbox | default-button | inner-spin-button | listbox | listitem | media-controls-background | media-controls-fullscreen-background | media-current-time-display | media-enter-fullscreen-button | media-exit-fullscreen-button | media-fullscreen-button | media-mute-button | media-overlay-play-button | media-play-button | media-seek-back-button | media-seek-forward-button | media-slider | media-sliderthumb | media-time-remaining-display | media-toggle-closed-captions-button | media-volume-slider | media-volume-slider-container | media-volume-sliderthumb | menulist | menulist-button | menulist-text | menulist-textfield | meter | progress-bar | progress-bar-value | push-button | radio | searchfield | searchfield-cancel-button | searchfield-decoration | searchfield-results-button | searchfield-results-decoration | slider-horizontal | slider-vertical | sliderthumb-horizontal | sliderthumb-vertical | square-button | textarea | textfield | -apple-pay-button\",\n \"relevance\": 0,\n \"description\": \"Changes the appearance of buttons and other controls to resemble native controls.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-backdrop-filter\",\n \"browsers\": [\n \"S9\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No filter effects are applied.\"\n },\n {\n \"name\": \"blur()\",\n \"description\": \"Applies a Gaussian blur to the input image.\"\n },\n {\n \"name\": \"brightness()\",\n \"description\": \"Applies a linear multiplier to input image, making it appear more or less bright.\"\n },\n {\n \"name\": \"contrast()\",\n \"description\": \"Adjusts the contrast of the input.\"\n },\n {\n \"name\": \"drop-shadow()\",\n \"description\": \"Applies a drop shadow effect to the input image.\"\n },\n {\n \"name\": \"grayscale()\",\n \"description\": \"Converts the input image to grayscale.\"\n },\n {\n \"name\": \"hue-rotate()\",\n \"description\": \"Applies a hue rotation on the input image. \"\n },\n {\n \"name\": \"invert()\",\n \"description\": \"Inverts the samples in the input image.\"\n },\n {\n \"name\": \"opacity()\",\n \"description\": \"Applies transparency to the samples in the input image.\"\n },\n {\n \"name\": \"saturate()\",\n \"description\": \"Saturates the input image.\"\n },\n {\n \"name\": \"sepia()\",\n \"description\": \"Converts the input image to sepia.\"\n },\n {\n \"name\": \"url()\",\n \"description\": \"A filter reference to a <filter> element.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Applies a filter effect where the first filter in the list takes the element's background image as the input image.\",\n \"restrictions\": [\n \"enum\",\n \"url\"\n ]\n },\n {\n \"name\": \"-webkit-backface-visibility\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"hidden\"\n },\n {\n \"name\": \"visible\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Determines whether or not the 'back' side of a transformed element is visible when facing the viewer. With an identity transform, the front side of an element faces the viewer.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-background-clip\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"relevance\": 50,\n \"description\": \"Determines the background painting area.\",\n \"restrictions\": [\n \"box\"\n ]\n },\n {\n \"name\": \"-webkit-background-composite\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"border\"\n },\n {\n \"name\": \"padding\"\n }\n ],\n \"relevance\": 50,\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-background-origin\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"relevance\": 50,\n \"description\": \"For elements rendered as a single box, specifies the background positioning area. For elements rendered as multiple boxes (e.g., inline boxes on several lines, boxes on several pages) specifies which boxes 'box-decoration-break' operates on to determine the background positioning area(s).\",\n \"restrictions\": [\n \"box\"\n ]\n },\n {\n \"name\": \"-webkit-border-image\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"If 'auto' is specified then the border image width is the intrinsic width or height (whichever is applicable) of the corresponding image slice. If the image does not have the required intrinsic dimension then the corresponding border-width is used instead.\"\n },\n {\n \"name\": \"fill\",\n \"description\": \"Causes the middle part of the border-image to be preserved.\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"repeat\",\n \"description\": \"The image is tiled (repeated) to fill the area.\"\n },\n {\n \"name\": \"round\",\n \"description\": \"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the image is rescaled so that it does.\"\n },\n {\n \"name\": \"space\",\n \"description\": \"The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the extra space is distributed around the tiles.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"The image is stretched to fill the area.\"\n },\n {\n \"name\": \"url()\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property for setting 'border-image-source', 'border-image-slice', 'border-image-width', 'border-image-outset' and 'border-image-repeat'. Omitted values are set to their initial values.\",\n \"restrictions\": [\n \"length\",\n \"percentage\",\n \"number\",\n \"url\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-box-align\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"baseline\",\n \"description\": \"If this box orientation is inline-axis or horizontal, all children are placed with their baselines aligned, and extra space placed before or after as necessary. For block flows, the baseline of the first non-empty line box located within the element is used. For tables, the baseline of the first cell is used.\"\n },\n {\n \"name\": \"center\",\n \"description\": \"Any extra space is divided evenly, with half placed above the child and the other half placed after the child.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"For normal direction boxes, the bottom edge of each child is placed along the bottom of the box. Extra space is placed above the element. For reverse direction boxes, the top edge of each child is placed along the top of the box. Extra space is placed below the element.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"For normal direction boxes, the top edge of each child is placed along the top of the box. Extra space is placed below the element. For reverse direction boxes, the bottom edge of each child is placed along the bottom of the box. Extra space is placed above the element.\"\n },\n {\n \"name\": \"stretch\",\n \"description\": \"The height of each child is adjusted to that of the containing block.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the alignment of nested elements within an outer flexible box element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-box-direction\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"A box with a computed value of horizontal for box-orient displays its children from left to right. A box with a computed value of vertical displays its children from top to bottom.\"\n },\n {\n \"name\": \"reverse\",\n \"description\": \"A box with a computed value of horizontal for box-orient displays its children from right to left. A box with a computed value of vertical displays its children from bottom to top.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"In webkit applications, -webkit-box-direction specifies whether a box lays out its contents normally (from the top or left edge), or in reverse (from the bottom or right edge).\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-box-flex\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"relevance\": 50,\n \"description\": \"Specifies an element's flexibility.\",\n \"restrictions\": [\n \"number\"\n ]\n },\n {\n \"name\": \"-webkit-box-flex-group\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"relevance\": 50,\n \"description\": \"Flexible elements can be assigned to flex groups using the 'box-flex-group' property.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-webkit-box-ordinal-group\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"relevance\": 50,\n \"description\": \"Indicates the ordinal group the element belongs to. Elements with a lower ordinal group are displayed before those with a higher ordinal group.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-webkit-box-orient\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"block-axis\",\n \"description\": \"Elements are oriented along the box's axis.\"\n },\n {\n \"name\": \"horizontal\",\n \"description\": \"The box displays its children from left to right in a horizontal line.\"\n },\n {\n \"name\": \"inline-axis\",\n \"description\": \"Elements are oriented vertically.\"\n },\n {\n \"name\": \"vertical\",\n \"description\": \"The box displays its children from stacked from top to bottom vertically.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"In webkit applications, -webkit-box-orient specifies whether a box lays out its contents horizontally or vertically.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-box-pack\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"center\",\n \"description\": \"The extra space is divided evenly, with half placed before the first child and the other half placed after the last child.\"\n },\n {\n \"name\": \"end\",\n \"description\": \"For normal direction boxes, the right edge of the last child is placed at the right side, with all extra space placed before the first child. For reverse direction boxes, the left edge of the first child is placed at the left side, with all extra space placed after the last child.\"\n },\n {\n \"name\": \"justify\",\n \"description\": \"The space is divided evenly in-between each child, with none of the extra space placed before the first child or after the last child. If there is only one child, treat the pack value as if it were start.\"\n },\n {\n \"name\": \"start\",\n \"description\": \"For normal direction boxes, the left edge of the first child is placed at the left side, with all extra space placed after the last child. For reverse direction boxes, the right edge of the last child is placed at the right side, with all extra space placed before the first child.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies alignment of child elements within the current element in the direction of orientation.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-box-reflect\",\n \"browsers\": [\n \"E79\",\n \"S4\",\n \"C4\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"above\",\n \"description\": \"The reflection appears above the border box.\"\n },\n {\n \"name\": \"below\",\n \"description\": \"The reflection appears below the border box.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"The reflection appears to the left of the border box.\"\n },\n {\n \"name\": \"right\",\n \"description\": \"The reflection appears to the right of the border box.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"[ above | below | right | left ]? <length>? <image>?\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-box-reflect\"\n }\n ],\n \"description\": \"Defines a reflection of a border box.\"\n },\n {\n \"name\": \"-webkit-box-sizing\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"border-box\",\n \"description\": \"The specified width and height (and respective min/max properties) on this element determine the border box of the element.\"\n },\n {\n \"name\": \"content-box\",\n \"description\": \"Behavior of width and height as specified by CSS2.1. The specified width and height (and respective min/max properties) apply to the width and height respectively of the content box of the element.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Box Model addition in CSS3.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-break-after\",\n \"browsers\": [\n \"S7\"\n ],\n \"values\": [\n {\n \"name\": \"always\",\n \"description\": \"Always force a page break before/after the generated box.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page/column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a page/column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-column\",\n \"description\": \"Avoid a column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-page\",\n \"description\": \"Avoid a page break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-region\"\n },\n {\n \"name\": \"column\",\n \"description\": \"Always force a column break before/after the generated box.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a left page.\"\n },\n {\n \"name\": \"page\",\n \"description\": \"Always force a page break before/after the generated box.\"\n },\n {\n \"name\": \"region\"\n },\n {\n \"name\": \"right\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a right page.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes the page/column break behavior before the generated box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-break-before\",\n \"browsers\": [\n \"S7\"\n ],\n \"values\": [\n {\n \"name\": \"always\",\n \"description\": \"Always force a page break before/after the generated box.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page/column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a page/column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-column\",\n \"description\": \"Avoid a column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-page\",\n \"description\": \"Avoid a page break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-region\"\n },\n {\n \"name\": \"column\",\n \"description\": \"Always force a column break before/after the generated box.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a left page.\"\n },\n {\n \"name\": \"page\",\n \"description\": \"Always force a page break before/after the generated box.\"\n },\n {\n \"name\": \"region\"\n },\n {\n \"name\": \"right\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a right page.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes the page/column break behavior before the generated box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-break-inside\",\n \"browsers\": [\n \"S7\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page/column break inside the generated box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a page/column break inside the generated box.\"\n },\n {\n \"name\": \"avoid-column\",\n \"description\": \"Avoid a column break inside the generated box.\"\n },\n {\n \"name\": \"avoid-page\",\n \"description\": \"Avoid a page break inside the generated box.\"\n },\n {\n \"name\": \"avoid-region\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes the page/column break behavior inside the generated box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-column-break-after\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"always\",\n \"description\": \"Always force a page break before/after the generated box.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page/column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a page/column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-column\",\n \"description\": \"Avoid a column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-page\",\n \"description\": \"Avoid a page break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-region\"\n },\n {\n \"name\": \"column\",\n \"description\": \"Always force a column break before/after the generated box.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a left page.\"\n },\n {\n \"name\": \"page\",\n \"description\": \"Always force a page break before/after the generated box.\"\n },\n {\n \"name\": \"region\"\n },\n {\n \"name\": \"right\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a right page.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes the page/column break behavior before the generated box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-column-break-before\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"always\",\n \"description\": \"Always force a page break before/after the generated box.\"\n },\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page/column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a page/column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-column\",\n \"description\": \"Avoid a column break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-page\",\n \"description\": \"Avoid a page break before/after the generated box.\"\n },\n {\n \"name\": \"avoid-region\"\n },\n {\n \"name\": \"column\",\n \"description\": \"Always force a column break before/after the generated box.\"\n },\n {\n \"name\": \"left\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a left page.\"\n },\n {\n \"name\": \"page\",\n \"description\": \"Always force a page break before/after the generated box.\"\n },\n {\n \"name\": \"region\"\n },\n {\n \"name\": \"right\",\n \"description\": \"Force one or two page breaks before/after the generated box so that the next page is formatted as a right page.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes the page/column break behavior before the generated box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-column-break-inside\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Neither force nor forbid a page/column break inside the generated box.\"\n },\n {\n \"name\": \"avoid\",\n \"description\": \"Avoid a page/column break inside the generated box.\"\n },\n {\n \"name\": \"avoid-column\",\n \"description\": \"Avoid a column break inside the generated box.\"\n },\n {\n \"name\": \"avoid-page\",\n \"description\": \"Avoid a page break inside the generated box.\"\n },\n {\n \"name\": \"avoid-region\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes the page/column break behavior inside the generated box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-column-count\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Determines the number of columns by the 'column-width' property and the element width.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes the optimal number of columns into which the content of the element will be flowed.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"-webkit-column-gap\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"User agent specific and typically equivalent to 1em.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Sets the gap between columns. If there is a column rule between columns, it will appear in the middle of the gap.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-webkit-column-rule\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"relevance\": 50,\n \"description\": \"This property is a shorthand for setting 'column-rule-width', 'column-rule-style', and 'column-rule-color' at the same place in the style sheet. Omitted values are set to their initial values.\",\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"line-style\",\n \"color\"\n ]\n },\n {\n \"name\": \"-webkit-column-rule-color\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"relevance\": 50,\n \"description\": \"Sets the color of the column rule\",\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-webkit-column-rule-style\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"relevance\": 50,\n \"description\": \"Sets the style of the rule between columns of an element.\",\n \"restrictions\": [\n \"line-style\"\n ]\n },\n {\n \"name\": \"-webkit-column-rule-width\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"relevance\": 50,\n \"description\": \"Sets the width of the rule between columns. Negative values are not allowed.\",\n \"restrictions\": [\n \"length\",\n \"line-width\"\n ]\n },\n {\n \"name\": \"-webkit-columns\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The width depends on the values of other properties.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"A shorthand property which sets both 'column-width' and 'column-count'.\",\n \"restrictions\": [\n \"length\",\n \"integer\"\n ]\n },\n {\n \"name\": \"-webkit-column-span\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"The element spans across all columns. Content in the normal flow that appears before the element is automatically balanced across all columns before the element appear.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"The element does not span multiple columns.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Describes the page/column break behavior after the generated box.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-column-width\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The width depends on the values of other properties.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"This property describes the width of columns in multicol elements.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-webkit-filter\",\n \"browsers\": [\n \"C18\",\n \"O15\",\n \"S6\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No filter effects are applied.\"\n },\n {\n \"name\": \"blur()\",\n \"description\": \"Applies a Gaussian blur to the input image.\"\n },\n {\n \"name\": \"brightness()\",\n \"description\": \"Applies a linear multiplier to input image, making it appear more or less bright.\"\n },\n {\n \"name\": \"contrast()\",\n \"description\": \"Adjusts the contrast of the input.\"\n },\n {\n \"name\": \"drop-shadow()\",\n \"description\": \"Applies a drop shadow effect to the input image.\"\n },\n {\n \"name\": \"grayscale()\",\n \"description\": \"Converts the input image to grayscale.\"\n },\n {\n \"name\": \"hue-rotate()\",\n \"description\": \"Applies a hue rotation on the input image. \"\n },\n {\n \"name\": \"invert()\",\n \"description\": \"Inverts the samples in the input image.\"\n },\n {\n \"name\": \"opacity()\",\n \"description\": \"Applies transparency to the samples in the input image.\"\n },\n {\n \"name\": \"saturate()\",\n \"description\": \"Saturates the input image.\"\n },\n {\n \"name\": \"sepia()\",\n \"description\": \"Converts the input image to sepia.\"\n },\n {\n \"name\": \"url()\",\n \"description\": \"A filter reference to a <filter> element.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Processes an element\u2019s rendering before it is displayed in the document, by applying one or more filter effects.\",\n \"restrictions\": [\n \"enum\",\n \"url\"\n ]\n },\n {\n \"name\": \"-webkit-flow-from\",\n \"browsers\": [\n \"S6.1\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The block container is not a CSS Region.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Makes a block container a region and associates it with a named flow.\",\n \"restrictions\": [\n \"identifier\"\n ]\n },\n {\n \"name\": \"-webkit-flow-into\",\n \"browsers\": [\n \"S6.1\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"The element is not moved to a named flow and normal CSS processing takes place.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Places an element or its contents into a named flow.\",\n \"restrictions\": [\n \"identifier\"\n ]\n },\n {\n \"name\": \"-webkit-font-feature-settings\",\n \"browsers\": [\n \"C16\"\n ],\n \"values\": [\n {\n \"name\": \"\\\"c2cs\\\"\"\n },\n {\n \"name\": \"\\\"dlig\\\"\"\n },\n {\n \"name\": \"\\\"kern\\\"\"\n },\n {\n \"name\": \"\\\"liga\\\"\"\n },\n {\n \"name\": \"\\\"lnum\\\"\"\n },\n {\n \"name\": \"\\\"onum\\\"\"\n },\n {\n \"name\": \"\\\"smcp\\\"\"\n },\n {\n \"name\": \"\\\"swsh\\\"\"\n },\n {\n \"name\": \"\\\"tnum\\\"\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"No change in glyph substitution or positioning occurs.\"\n },\n {\n \"name\": \"off\"\n },\n {\n \"name\": \"on\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"This property provides low-level control over OpenType font features. It is intended as a way of providing access to font features that are not widely used but are needed for a particular use case.\",\n \"restrictions\": [\n \"string\",\n \"integer\"\n ]\n },\n {\n \"name\": \"-webkit-hyphens\",\n \"browsers\": [\n \"S5.1\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Conditional hyphenation characters inside a word, if present, take priority over automatic resources when determining hyphenation points within the word.\"\n },\n {\n \"name\": \"manual\",\n \"description\": \"Words are only broken at line breaks where there are characters inside the word that suggest line break opportunities\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Words are not broken at line breaks, even if characters inside the word suggest line break points.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Controls whether hyphenation is allowed to create more break opportunities within a line of text.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-line-break\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"after-white-space\"\n },\n {\n \"name\": \"normal\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies line-breaking rules for CJK (Chinese, Japanese, and Korean) text.\"\n },\n {\n \"name\": \"-webkit-margin-bottom-collapse\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"collapse\"\n },\n {\n \"name\": \"discard\"\n },\n {\n \"name\": \"separate\"\n }\n ],\n \"relevance\": 50,\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-margin-collapse\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"collapse\"\n },\n {\n \"name\": \"discard\"\n },\n {\n \"name\": \"separate\"\n }\n ],\n \"relevance\": 50,\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-margin-start\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n }\n ],\n \"relevance\": 50,\n \"restrictions\": [\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"-webkit-margin-top-collapse\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"collapse\"\n },\n {\n \"name\": \"discard\"\n },\n {\n \"name\": \"separate\"\n }\n ],\n \"relevance\": 50,\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-mask-clip\",\n \"browsers\": [\n \"C\",\n \"O15\",\n \"S4\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"[ <box> | border | padding | content | text ]#\",\n \"relevance\": 0,\n \"description\": \"Determines the mask painting area, which determines the area that is affected by the mask.\",\n \"restrictions\": [\n \"box\"\n ]\n },\n {\n \"name\": \"-webkit-mask-image\",\n \"browsers\": [\n \"C\",\n \"O15\",\n \"S4\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"Counts as a transparent black image layer.\"\n },\n {\n \"name\": \"url()\",\n \"description\": \"Reference to a <mask element or to a CSS image.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<mask-reference>#\",\n \"relevance\": 0,\n \"description\": \"Sets the mask layer image of an element.\",\n \"restrictions\": [\n \"url\",\n \"image\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-mask-origin\",\n \"browsers\": [\n \"C\",\n \"O15\",\n \"S4\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"[ <box> | border | padding | content ]#\",\n \"relevance\": 0,\n \"description\": \"Specifies the mask positioning area.\",\n \"restrictions\": [\n \"box\"\n ]\n },\n {\n \"name\": \"-webkit-mask-repeat\",\n \"browsers\": [\n \"C\",\n \"O15\",\n \"S4\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<repeat-style>#\",\n \"relevance\": 0,\n \"description\": \"Specifies how mask layer images are tiled after they have been sized and positioned.\",\n \"restrictions\": [\n \"repeat\"\n ]\n },\n {\n \"name\": \"-webkit-mask-size\",\n \"browsers\": [\n \"C\",\n \"O15\",\n \"S4\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Resolved by using the image\u2019s intrinsic ratio and the size of the other dimension, or failing that, using the image\u2019s intrinsic size, or failing that, treating it as 100%.\"\n },\n {\n \"name\": \"contain\",\n \"description\": \"Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest size such that both its width and its height can fit inside the background positioning area.\"\n },\n {\n \"name\": \"cover\",\n \"description\": \"Scale the image, while preserving its intrinsic aspect ratio (if any), to the smallest size such that both its width and its height can completely cover the background positioning area.\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<bg-size>#\",\n \"relevance\": 0,\n \"description\": \"Specifies the size of the mask layer images.\",\n \"restrictions\": [\n \"length\",\n \"percentage\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-nbsp-mode\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"normal\"\n },\n {\n \"name\": \"space\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines the behavior of nonbreaking spaces within text.\"\n },\n {\n \"name\": \"-webkit-overflow-scrolling\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"touch\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"auto | touch\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-overflow-scrolling\"\n }\n ],\n \"description\": \"Specifies whether to use native-style scrolling in an overflow:scroll element.\"\n },\n {\n \"name\": \"-webkit-padding-start\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"relevance\": 50,\n \"restrictions\": [\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"-webkit-perspective\",\n \"browsers\": [\n \"C\",\n \"S4\"\n ],\n \"values\": [\n {\n \"name\": \"none\",\n \"description\": \"No perspective transform is applied.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Applies the same transform as the perspective(<number>) transform function, except that it applies only to the positioned or transformed children of the element, not to the transform on the element itself.\",\n \"restrictions\": [\n \"length\"\n ]\n },\n {\n \"name\": \"-webkit-perspective-origin\",\n \"browsers\": [\n \"C\",\n \"S4\"\n ],\n \"relevance\": 50,\n \"description\": \"Establishes the origin for the perspective property. It effectively sets the X and Y position at which the viewer appears to be looking at the children of the element.\",\n \"restrictions\": [\n \"position\",\n \"percentage\",\n \"length\"\n ]\n },\n {\n \"name\": \"-webkit-region-fragment\",\n \"browsers\": [\n \"S7\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Content flows as it would in a regular content box.\"\n },\n {\n \"name\": \"break\",\n \"description\": \"If the content fits within the CSS Region, then this property has no effect.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"The 'region-fragment' property controls the behavior of the last region associated with a named flow.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-tap-highlight-color\",\n \"browsers\": [\n \"E12\",\n \"C16\",\n \"O15\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-tap-highlight-color\"\n }\n ],\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-webkit-text-fill-color\",\n \"browsers\": [\n \"E12\",\n \"FF49\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-fill-color\"\n }\n ],\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-webkit-text-size-adjust\",\n \"browsers\": [\n \"E\",\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Renderers must use the default size adjustment when displaying on a small device.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"Renderers must not do size adjustment when displaying on a small device.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies a size adjustment for displaying text content in mobile browsers.\",\n \"restrictions\": [\n \"percentage\"\n ]\n },\n {\n \"name\": \"-webkit-text-stroke\",\n \"browsers\": [\n \"E15\",\n \"FF49\",\n \"S3\",\n \"C4\",\n \"O15\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<length> || <color>\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke\"\n }\n ],\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"color\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-webkit-text-stroke-color\",\n \"browsers\": [\n \"E15\",\n \"FF49\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke-color\"\n }\n ],\n \"restrictions\": [\n \"color\"\n ]\n },\n {\n \"name\": \"-webkit-text-stroke-width\",\n \"browsers\": [\n \"E15\",\n \"FF49\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"<length>\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke-width\"\n }\n ],\n \"restrictions\": [\n \"length\",\n \"line-width\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-webkit-touch-callout\",\n \"browsers\": [\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"none\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"default | none\",\n \"relevance\": 0,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-touch-callout\"\n }\n ],\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-transform\",\n \"browsers\": [\n \"C\",\n \"O12\",\n \"S3.1\"\n ],\n \"values\": [\n {\n \"name\": \"matrix()\",\n \"description\": \"Specifies a 2D transformation in the form of a transformation matrix of six values. matrix(a,b,c,d,e,f) is equivalent to applying the transformation matrix [a b c d e f]\"\n },\n {\n \"name\": \"matrix3d()\",\n \"description\": \"Specifies a 3D transformation as a 4x4 homogeneous matrix of 16 values in column-major order.\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"perspective()\",\n \"description\": \"Specifies a perspective projection matrix.\"\n },\n {\n \"name\": \"rotate()\",\n \"description\": \"Specifies a 2D rotation by the angle specified in the parameter about the origin of the element, as defined by the transform-origin property.\"\n },\n {\n \"name\": \"rotate3d()\",\n \"description\": \"Specifies a clockwise 3D rotation by the angle specified in last parameter about the [x,y,z] direction vector described by the first 3 parameters.\"\n },\n {\n \"name\": \"rotateX('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the X axis.\"\n },\n {\n \"name\": \"rotateY('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the Y axis.\"\n },\n {\n \"name\": \"rotateZ('angle')\",\n \"description\": \"Specifies a clockwise rotation by the given angle about the Z axis.\"\n },\n {\n \"name\": \"scale()\",\n \"description\": \"Specifies a 2D scale operation by the [sx,sy] scaling vector described by the 2 parameters. If the second parameter is not provided, it is takes a value equal to the first.\"\n },\n {\n \"name\": \"scale3d()\",\n \"description\": \"Specifies a 3D scale operation by the [sx,sy,sz] scaling vector described by the 3 parameters.\"\n },\n {\n \"name\": \"scaleX()\",\n \"description\": \"Specifies a scale operation using the [sx,1] scaling vector, where sx is given as the parameter.\"\n },\n {\n \"name\": \"scaleY()\",\n \"description\": \"Specifies a scale operation using the [sy,1] scaling vector, where sy is given as the parameter.\"\n },\n {\n \"name\": \"scaleZ()\",\n \"description\": \"Specifies a scale operation using the [1,1,sz] scaling vector, where sz is given as the parameter.\"\n },\n {\n \"name\": \"skew()\",\n \"description\": \"Specifies a skew transformation along the X and Y axes. The first angle parameter specifies the skew on the X axis. The second angle parameter specifies the skew on the Y axis. If the second parameter is not given then a value of 0 is used for the Y angle (ie: no skew on the Y axis).\"\n },\n {\n \"name\": \"skewX()\",\n \"description\": \"Specifies a skew transformation along the X axis by the given angle.\"\n },\n {\n \"name\": \"skewY()\",\n \"description\": \"Specifies a skew transformation along the Y axis by the given angle.\"\n },\n {\n \"name\": \"translate()\",\n \"description\": \"Specifies a 2D translation by the vector [tx, ty], where tx is the first translation-value parameter and ty is the optional second translation-value parameter.\"\n },\n {\n \"name\": \"translate3d()\",\n \"description\": \"Specifies a 3D translation by the vector [tx,ty,tz], with tx, ty and tz being the first, second and third translation-value parameters respectively.\"\n },\n {\n \"name\": \"translateX()\",\n \"description\": \"Specifies a translation by the given amount in the X direction.\"\n },\n {\n \"name\": \"translateY()\",\n \"description\": \"Specifies a translation by the given amount in the Y direction.\"\n },\n {\n \"name\": \"translateZ()\",\n \"description\": \"Specifies a translation by the given amount in the Z direction. Note that percentage values are not allowed in the translateZ translation-value, and if present are evaluated as 0.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"A two-dimensional transformation is applied to an element through the 'transform' property. This property contains a list of transform functions similar to those allowed by SVG.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-transform-origin\",\n \"browsers\": [\n \"C\",\n \"O15\",\n \"S3.1\"\n ],\n \"relevance\": 50,\n \"description\": \"Establishes the origin of transformation for an element.\",\n \"restrictions\": [\n \"position\",\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-webkit-transform-origin-x\",\n \"browsers\": [\n \"C\",\n \"S3.1\"\n ],\n \"relevance\": 50,\n \"description\": \"The x coordinate of the origin for transforms applied to an element with respect to its border box.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-webkit-transform-origin-y\",\n \"browsers\": [\n \"C\",\n \"S3.1\"\n ],\n \"relevance\": 50,\n \"description\": \"The y coordinate of the origin for transforms applied to an element with respect to its border box.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-webkit-transform-origin-z\",\n \"browsers\": [\n \"C\",\n \"S4\"\n ],\n \"relevance\": 50,\n \"description\": \"The z coordinate of the origin for transforms applied to an element with respect to its border box.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-webkit-transform-style\",\n \"browsers\": [\n \"C\",\n \"S4\"\n ],\n \"values\": [\n {\n \"name\": \"flat\",\n \"description\": \"All children of this element are rendered flattened into the 2D plane of the element.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Defines how nested elements are rendered in 3D space.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-transition\",\n \"browsers\": [\n \"C\",\n \"O12\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"Every property that is able to undergo a transition will do so.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No property will transition.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Shorthand property combines four of the transition properties into a single property.\",\n \"restrictions\": [\n \"time\",\n \"property\",\n \"timing-function\",\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-transition-delay\",\n \"browsers\": [\n \"C\",\n \"O12\",\n \"S5\"\n ],\n \"relevance\": 50,\n \"description\": \"Defines when the transition will start. It allows a transition to begin execution some period of time from when it is applied.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-webkit-transition-duration\",\n \"browsers\": [\n \"C\",\n \"O12\",\n \"S5\"\n ],\n \"relevance\": 50,\n \"description\": \"Specifies how long the transition from the old value to the new value should take.\",\n \"restrictions\": [\n \"time\"\n ]\n },\n {\n \"name\": \"-webkit-transition-property\",\n \"browsers\": [\n \"C\",\n \"O12\",\n \"S5\"\n ],\n \"values\": [\n {\n \"name\": \"all\",\n \"description\": \"Every property that is able to undergo a transition will do so.\"\n },\n {\n \"name\": \"none\",\n \"description\": \"No property will transition.\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Specifies the name of the CSS property to which the transition is applied.\",\n \"restrictions\": [\n \"property\"\n ]\n },\n {\n \"name\": \"-webkit-transition-timing-function\",\n \"browsers\": [\n \"C\",\n \"O12\",\n \"S5\"\n ],\n \"relevance\": 50,\n \"description\": \"Describes how the intermediate values used during a transition will be calculated.\",\n \"restrictions\": [\n \"timing-function\"\n ]\n },\n {\n \"name\": \"-webkit-user-drag\",\n \"browsers\": [\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"element\"\n },\n {\n \"name\": \"none\"\n }\n ],\n \"relevance\": 50,\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-user-modify\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"read-only\"\n },\n {\n \"name\": \"read-write\"\n },\n {\n \"name\": \"read-write-plaintext-only\"\n }\n ],\n \"status\": \"nonstandard\",\n \"syntax\": \"read-only | read-write | read-write-plaintext-only\",\n \"relevance\": 0,\n \"description\": \"Determines whether a user can edit the content of an element.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"-webkit-user-select\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"values\": [\n {\n \"name\": \"auto\"\n },\n {\n \"name\": \"none\"\n },\n {\n \"name\": \"text\"\n }\n ],\n \"relevance\": 50,\n \"description\": \"Controls the appearance of selection.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"white-space\",\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"Sets 'white-space-collapsing' to 'collapse' and 'text-wrap' to 'normal'.\"\n },\n {\n \"name\": \"nowrap\",\n \"description\": \"Sets 'white-space-collapsing' to 'collapse' and 'text-wrap' to 'none'.\"\n },\n {\n \"name\": \"pre\",\n \"description\": \"Sets 'white-space-collapsing' to 'preserve' and 'text-wrap' to 'none'.\"\n },\n {\n \"name\": \"pre-line\",\n \"description\": \"Sets 'white-space-collapsing' to 'preserve-breaks' and 'text-wrap' to 'normal'.\"\n },\n {\n \"name\": \"pre-wrap\",\n \"description\": \"Sets 'white-space-collapsing' to 'preserve' and 'text-wrap' to 'normal'.\"\n }\n ],\n \"syntax\": \"normal | pre | nowrap | pre-wrap | pre-line | break-spaces\",\n \"relevance\": 90,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/white-space\"\n }\n ],\n \"description\": \"Shorthand property for the 'white-space-collapsing' and 'text-wrap' properties.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"widows\",\n \"browsers\": [\n \"E12\",\n \"S1.3\",\n \"C25\",\n \"IE8\",\n \"O9.2\"\n ],\n \"syntax\": \"<integer>\",\n \"relevance\": 51,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/widows\"\n }\n ],\n \"description\": \"Specifies the minimum number of line boxes of a block container that must be left in a fragment after a break.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"width\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The width depends on the values of other properties.\"\n },\n {\n \"name\": \"fit-content\",\n \"description\": \"Use the fit-content inline size or fit-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"max-content\",\n \"description\": \"Use the max-content inline size or max-content block size, as appropriate to the writing mode.\"\n },\n {\n \"name\": \"min-content\",\n \"description\": \"Use the min-content inline size or min-content block size, as appropriate to the writing mode.\"\n }\n ],\n \"syntax\": \"<viewport-length>{1,2}\",\n \"relevance\": 96,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/width\"\n }\n ],\n \"description\": \"Specifies the width of the content area, padding area or border area (depending on 'box-sizing') of certain boxes.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"will-change\",\n \"browsers\": [\n \"E79\",\n \"FF36\",\n \"S9.1\",\n \"C36\",\n \"O24\"\n ],\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"Expresses no particular intent.\"\n },\n {\n \"name\": \"contents\",\n \"description\": \"Indicates that the author expects to animate or change something about the element\u2019s contents in the near future.\"\n },\n {\n \"name\": \"scroll-position\",\n \"description\": \"Indicates that the author expects to animate or change the scroll position of the element in the near future.\"\n }\n ],\n \"syntax\": \"auto | <animateable-feature>#\",\n \"relevance\": 63,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/will-change\"\n }\n ],\n \"description\": \"Provides a rendering hint to the user agent, stating what kinds of changes the author expects to perform on the element.\",\n \"restrictions\": [\n \"enum\",\n \"identifier\"\n ]\n },\n {\n \"name\": \"word-break\",\n \"values\": [\n {\n \"name\": \"break-all\",\n \"description\": \"Lines may break between any two grapheme clusters for non-CJK scripts.\"\n },\n {\n \"name\": \"keep-all\",\n \"description\": \"Block characters can no longer create implied break points.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Breaks non-CJK scripts according to their own rules.\"\n }\n ],\n \"syntax\": \"normal | break-all | keep-all | break-word\",\n \"relevance\": 74,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/word-break\"\n }\n ],\n \"description\": \"Specifies line break opportunities for non-CJK scripts.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"word-spacing\",\n \"values\": [\n {\n \"name\": \"normal\",\n \"description\": \"No additional spacing is applied. Computes to zero.\"\n }\n ],\n \"syntax\": \"normal | <length>\",\n \"relevance\": 57,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/word-spacing\"\n }\n ],\n \"description\": \"Specifies additional spacing between \u201Cwords\u201D.\",\n \"restrictions\": [\n \"length\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"word-wrap\",\n \"values\": [\n {\n \"name\": \"break-word\",\n \"description\": \"An otherwise unbreakable sequence of characters may be broken at an arbitrary point if there are no otherwise-acceptable break points in the line.\"\n },\n {\n \"name\": \"normal\",\n \"description\": \"Lines may break only at allowed break points.\"\n }\n ],\n \"syntax\": \"normal | break-word\",\n \"relevance\": 77,\n \"description\": \"Specifies whether the UA may break within a word to prevent overflow when an otherwise-unbreakable string is too long to fit.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"writing-mode\",\n \"values\": [\n {\n \"name\": \"horizontal-tb\",\n \"description\": \"Top-to-bottom block flow direction. The writing mode is horizontal.\"\n },\n {\n \"name\": \"sideways-lr\",\n \"description\": \"Left-to-right block flow direction. The writing mode is vertical, while the typographic mode is horizontal.\"\n },\n {\n \"name\": \"sideways-rl\",\n \"description\": \"Right-to-left block flow direction. The writing mode is vertical, while the typographic mode is horizontal.\"\n },\n {\n \"name\": \"vertical-lr\",\n \"description\": \"Left-to-right block flow direction. The writing mode is vertical.\"\n },\n {\n \"name\": \"vertical-rl\",\n \"description\": \"Right-to-left block flow direction. The writing mode is vertical.\"\n }\n ],\n \"syntax\": \"horizontal-tb | vertical-rl | vertical-lr | sideways-rl | sideways-lr\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/writing-mode\"\n }\n ],\n \"description\": \"This is a shorthand property for both 'direction' and 'block-progression'.\",\n \"restrictions\": [\n \"enum\"\n ]\n },\n {\n \"name\": \"z-index\",\n \"values\": [\n {\n \"name\": \"auto\",\n \"description\": \"The stack level of the generated box in the current stacking context is 0. The box does not establish a new stacking context unless it is the root element.\"\n }\n ],\n \"syntax\": \"auto | <integer>\",\n \"relevance\": 92,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/z-index\"\n }\n ],\n \"description\": \"For a positioned box, the 'z-index' property specifies the stack level of the box in the current stacking context and whether the box establishes a local stacking context.\",\n \"restrictions\": [\n \"integer\"\n ]\n },\n {\n \"name\": \"zoom\",\n \"browsers\": [\n \"E12\",\n \"S3.1\",\n \"C1\",\n \"IE5.5\",\n \"O15\"\n ],\n \"values\": [\n {\n \"name\": \"normal\"\n }\n ],\n \"syntax\": \"auto | <number> | <percentage>\",\n \"relevance\": 68,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/zoom\"\n }\n ],\n \"description\": \"Non-standard. Specifies the magnification scale of the object. See 'transform: scale()' for a standards-based alternative.\",\n \"restrictions\": [\n \"enum\",\n \"integer\",\n \"number\",\n \"percentage\"\n ]\n },\n {\n \"name\": \"-ms-ime-align\",\n \"status\": \"nonstandard\",\n \"syntax\": \"auto | after\",\n \"relevance\": 0,\n \"description\": \"Aligns the Input Method Editor (IME) candidate window box relative to the element on which the IME composition is active.\"\n },\n {\n \"name\": \"-moz-binding\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<url> | none\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-binding\"\n }\n ],\n \"description\": \"The -moz-binding CSS property is used by Mozilla-based applications to attach an XBL binding to a DOM element.\"\n },\n {\n \"name\": \"-moz-context-properties\",\n \"status\": \"nonstandard\",\n \"syntax\": \"none | [ fill | fill-opacity | stroke | stroke-opacity ]#\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF55\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-context-properties\"\n }\n ],\n \"description\": \"If you reference an SVG image in a webpage (such as with the <img> element or as a background image), the SVG image can coordinate with the embedding element (its context) to have the image adopt property values set on the embedding element. To do this the embedding element needs to list the properties that are to be made available to the image by listing them as values of the -moz-context-properties property, and the image needs to opt in to using those properties by using values such as the context-fill value.\\n\\nThis feature is available since Firefox 55, but is only currently supported with SVG images loaded via chrome:// or resource:// URLs. To experiment with the feature in SVG on the Web it is necessary to set the svg.context-properties.content.enabled pref to true.\"\n },\n {\n \"name\": \"-moz-float-edge\",\n \"status\": \"nonstandard\",\n \"syntax\": \"border-box | content-box | margin-box | padding-box\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-float-edge\"\n }\n ],\n \"description\": \"The non-standard -moz-float-edge CSS property specifies whether the height and width properties of the element include the margin, border, or padding thickness.\"\n },\n {\n \"name\": \"-moz-force-broken-image-icon\",\n \"status\": \"nonstandard\",\n \"syntax\": \"0 | 1\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-force-broken-image-icon\"\n }\n ],\n \"description\": \"The -moz-force-broken-image-icon extended CSS property can be used to force the broken image icon to be shown even when a broken image has an alt attribute.\"\n },\n {\n \"name\": \"-moz-image-region\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<shape> | auto\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-image-region\"\n }\n ],\n \"description\": \"For certain XUL elements and pseudo-elements that use an image from the list-style-image property, this property specifies a region of the image that is used in place of the whole image. This allows elements to use different pieces of the same image to improve performance.\"\n },\n {\n \"name\": \"-moz-orient\",\n \"status\": \"nonstandard\",\n \"syntax\": \"inline | block | horizontal | vertical\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF6\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-orient\"\n }\n ],\n \"description\": \"The -moz-orient CSS property specifies the orientation of the element to which it's applied.\"\n },\n {\n \"name\": \"-moz-outline-radius\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<outline-radius>{1,4} [ / <outline-radius>{1,4} ]?\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius\"\n }\n ],\n \"description\": \"In Mozilla applications like Firefox, the -moz-outline-radius CSS property can be used to give an element's outline rounded corners.\"\n },\n {\n \"name\": \"-moz-outline-radius-bottomleft\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<outline-radius>\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-bottomleft\"\n }\n ],\n \"description\": \"In Mozilla applications, the -moz-outline-radius-bottomleft CSS property can be used to round the bottom-left corner of an element's outline.\"\n },\n {\n \"name\": \"-moz-outline-radius-bottomright\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<outline-radius>\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-bottomright\"\n }\n ],\n \"description\": \"In Mozilla applications, the -moz-outline-radius-bottomright CSS property can be used to round the bottom-right corner of an element's outline.\"\n },\n {\n \"name\": \"-moz-outline-radius-topleft\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<outline-radius>\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-topleft\"\n }\n ],\n \"description\": \"In Mozilla applications, the -moz-outline-radius-topleft CSS property can be used to round the top-left corner of an element's outline.\"\n },\n {\n \"name\": \"-moz-outline-radius-topright\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<outline-radius>\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-topright\"\n }\n ],\n \"description\": \"In Mozilla applications, the -moz-outline-radius-topright CSS property can be used to round the top-right corner of an element's outline.\"\n },\n {\n \"name\": \"-moz-stack-sizing\",\n \"status\": \"nonstandard\",\n \"syntax\": \"ignore | stretch-to-fit\",\n \"relevance\": 0,\n \"description\": \"-moz-stack-sizing is an extended CSS property. Normally, a stack will change its size so that all of its child elements are completely visible. For example, moving a child of the stack far to the right will widen the stack so the child remains visible.\"\n },\n {\n \"name\": \"-moz-text-blink\",\n \"status\": \"nonstandard\",\n \"syntax\": \"none | blink\",\n \"relevance\": 0,\n \"description\": \"The -moz-text-blink non-standard Mozilla CSS extension specifies the blink mode.\"\n },\n {\n \"name\": \"-moz-user-input\",\n \"status\": \"nonstandard\",\n \"syntax\": \"auto | none | enabled | disabled\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-moz-user-input\"\n }\n ],\n \"description\": \"In Mozilla applications, -moz-user-input determines if an element will accept user input.\"\n },\n {\n \"name\": \"-moz-user-modify\",\n \"status\": \"nonstandard\",\n \"syntax\": \"read-only | read-write | write-only\",\n \"relevance\": 0,\n \"description\": \"The -moz-user-modify property has no effect. It was originally planned to determine whether or not the content of an element can be edited by a user.\"\n },\n {\n \"name\": \"-moz-window-dragging\",\n \"status\": \"nonstandard\",\n \"syntax\": \"drag | no-drag\",\n \"relevance\": 0,\n \"description\": \"The -moz-window-dragging CSS property specifies whether a window is draggable or not. It only works in Chrome code, and only on Mac OS X.\"\n },\n {\n \"name\": \"-moz-window-shadow\",\n \"status\": \"nonstandard\",\n \"syntax\": \"default | menu | tooltip | sheet | none\",\n \"relevance\": 0,\n \"description\": \"The -moz-window-shadow CSS property specifies whether a window will have a shadow. It only works on Mac OS X.\"\n },\n {\n \"name\": \"-webkit-border-before\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<'border-width'> || <'border-style'> || <color>\",\n \"relevance\": 0,\n \"browsers\": [\n \"E79\",\n \"S5.1\",\n \"C8\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-border-before\"\n }\n ],\n \"description\": \"The -webkit-border-before CSS property is a shorthand property for setting the individual logical block start border property values in a single place in the style sheet.\"\n },\n {\n \"name\": \"-webkit-border-before-color\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<color>\",\n \"relevance\": 0,\n \"description\": \"The -webkit-border-before-color CSS property sets the color of the individual logical block start border in a single place in the style sheet.\"\n },\n {\n \"name\": \"-webkit-border-before-style\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<'border-style'>\",\n \"relevance\": 0,\n \"description\": \"The -webkit-border-before-style CSS property sets the style of the individual logical block start border in a single place in the style sheet.\"\n },\n {\n \"name\": \"-webkit-border-before-width\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<'border-width'>\",\n \"relevance\": 0,\n \"description\": \"The -webkit-border-before-width CSS property sets the width of the individual logical block start border in a single place in the style sheet.\"\n },\n {\n \"name\": \"-webkit-line-clamp\",\n \"syntax\": \"none | <integer>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E17\",\n \"FF68\",\n \"S5\",\n \"C6\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-line-clamp\"\n }\n ],\n \"description\": \"The -webkit-line-clamp CSS property allows limiting of the contents of a block container to the specified number of lines.\"\n },\n {\n \"name\": \"-webkit-mask\",\n \"status\": \"nonstandard\",\n \"syntax\": \"[ <mask-reference> || <position> [ / <bg-size> ]? || <repeat-style> || [ <box> | border | padding | content | text ] || [ <box> | border | padding | content ] ]#\",\n \"relevance\": 0,\n \"description\": \"The mask CSS property alters the visibility of an element by either partially or fully hiding it. This is accomplished by either masking or clipping the image at specific points.\"\n },\n {\n \"name\": \"-webkit-mask-attachment\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<attachment>#\",\n \"relevance\": 0,\n \"browsers\": [\n \"S4\",\n \"C1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-attachment\"\n }\n ],\n \"description\": \"If a -webkit-mask-image is specified, -webkit-mask-attachment determines whether the mask image's position is fixed within the viewport, or scrolls along with its containing block.\"\n },\n {\n \"name\": \"-webkit-mask-composite\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<composite-style>#\",\n \"relevance\": 0,\n \"browsers\": [\n \"E18\",\n \"FF53\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-composite\"\n }\n ],\n \"description\": \"The -webkit-mask-composite property specifies the manner in which multiple mask images applied to the same element are composited with one another. Mask images are composited in the opposite order that they are declared with the -webkit-mask-image property.\"\n },\n {\n \"name\": \"-webkit-mask-position\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<position>#\",\n \"relevance\": 0,\n \"description\": \"The mask-position CSS property sets the initial position, relative to the mask position layer defined by mask-origin, for each defined mask image.\"\n },\n {\n \"name\": \"-webkit-mask-position-x\",\n \"status\": \"nonstandard\",\n \"syntax\": \"[ <length-percentage> | left | center | right ]#\",\n \"relevance\": 0,\n \"browsers\": [\n \"E18\",\n \"FF49\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-position-x\"\n }\n ],\n \"description\": \"The -webkit-mask-position-x CSS property sets the initial horizontal position of a mask image.\"\n },\n {\n \"name\": \"-webkit-mask-position-y\",\n \"status\": \"nonstandard\",\n \"syntax\": \"[ <length-percentage> | top | center | bottom ]#\",\n \"relevance\": 0,\n \"browsers\": [\n \"E18\",\n \"FF49\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-position-y\"\n }\n ],\n \"description\": \"The -webkit-mask-position-y CSS property sets the initial vertical position of a mask image.\"\n },\n {\n \"name\": \"-webkit-mask-repeat-x\",\n \"status\": \"nonstandard\",\n \"syntax\": \"repeat | no-repeat | space | round\",\n \"relevance\": 0,\n \"browsers\": [\n \"E18\",\n \"S5\",\n \"C3\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-repeat-x\"\n }\n ],\n \"description\": \"The -webkit-mask-repeat-x property specifies whether and how a mask image is repeated (tiled) horizontally.\"\n },\n {\n \"name\": \"-webkit-mask-repeat-y\",\n \"status\": \"nonstandard\",\n \"syntax\": \"repeat | no-repeat | space | round\",\n \"relevance\": 0,\n \"browsers\": [\n \"E18\",\n \"S5\",\n \"C3\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-repeat-y\"\n }\n ],\n \"description\": \"The -webkit-mask-repeat-y property specifies whether and how a mask image is repeated (tiled) vertically.\"\n },\n {\n \"name\": \"accent-color\",\n \"syntax\": \"auto | <color>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E93\",\n \"FF92\",\n \"C93\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/accent-color\"\n }\n ],\n \"description\": \"Sets the color of the elements accent\"\n },\n {\n \"name\": \"align-tracks\",\n \"status\": \"experimental\",\n \"syntax\": \"[ normal | <baseline-position> | <content-distribution> | <overflow-position>? <content-position> ]#\",\n \"relevance\": 50,\n \"browsers\": [\n \"FF77\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/align-tracks\"\n }\n ],\n \"description\": \"The align-tracks CSS property sets the alignment in the masonry axis for grid containers that have masonry in their block axis.\"\n },\n {\n \"name\": \"appearance\",\n \"status\": \"experimental\",\n \"syntax\": \"none | auto | textfield | menulist-button | <compat-auto>\",\n \"relevance\": 61,\n \"browsers\": [\n \"E84\",\n \"FF80\",\n \"S3\",\n \"C84\",\n \"O70\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/appearance\"\n }\n ],\n \"description\": \"Changes the appearance of buttons and other controls to resemble native controls.\"\n },\n {\n \"name\": \"aspect-ratio\",\n \"status\": \"experimental\",\n \"syntax\": \"auto | <ratio>\",\n \"relevance\": 52,\n \"browsers\": [\n \"E88\",\n \"FF89\",\n \"S15\",\n \"C88\",\n \"O74\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/aspect-ratio\"\n }\n ],\n \"description\": \"The aspect-ratio CSS property sets a preferred aspect ratio for the box, which will be used in the calculation of auto sizes and some other layout functions.\"\n },\n {\n \"name\": \"azimuth\",\n \"status\": \"obsolete\",\n \"syntax\": \"<angle> | [ [ left-side | far-left | left | center-left | center | center-right | right | far-right | right-side ] || behind ] | leftwards | rightwards\",\n \"relevance\": 0,\n \"description\": \"In combination with elevation, the azimuth CSS property enables different audio sources to be positioned spatially for aural presentation. This is important in that it provides a natural way to tell several voices apart, as each can be positioned to originate at a different location on the sound stage. Stereo output produce a lateral sound stage, while binaural headphones and multi-speaker setups allow for a fully three-dimensional stage.\"\n },\n {\n \"name\": \"backdrop-filter\",\n \"syntax\": \"none | <filter-function-list>\",\n \"relevance\": 52,\n \"browsers\": [\n \"E17\",\n \"FF70\",\n \"S9\",\n \"C76\",\n \"O63\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/backdrop-filter\"\n }\n ],\n \"description\": \"The backdrop-filter CSS property lets you apply graphical effects such as blurring or color shifting to the area behind an element. Because it applies to everything behind the element, to see the effect you must make the element or its background at least partially transparent.\"\n },\n {\n \"name\": \"border-block\",\n \"syntax\": \"<'border-top-width'> || <'border-top-style'> || <color>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block\"\n }\n ],\n \"description\": \"The border-block CSS property is a shorthand property for setting the individual logical block border property values in a single place in the style sheet.\"\n },\n {\n \"name\": \"border-block-color\",\n \"syntax\": \"<'border-top-color'>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-color\"\n }\n ],\n \"description\": \"The border-block-color CSS property defines the color of the logical block borders of an element, which maps to a physical border color depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-color and border-bottom-color, or border-right-color and border-left-color property depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"border-block-style\",\n \"syntax\": \"<'border-top-style'>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-style\"\n }\n ],\n \"description\": \"The border-block-style CSS property defines the style of the logical block borders of an element, which maps to a physical border style depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-style and border-bottom-style, or border-left-style and border-right-style properties depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"border-block-width\",\n \"syntax\": \"<'border-top-width'>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-block-width\"\n }\n ],\n \"description\": \"The border-block-width CSS property defines the width of the logical block borders of an element, which maps to a physical border width depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-width and border-bottom-width, or border-left-width, and border-right-width property depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"border-end-end-radius\",\n \"syntax\": \"<length-percentage>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E89\",\n \"FF66\",\n \"S15\",\n \"C89\",\n \"O75\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-end-end-radius\"\n }\n ],\n \"description\": \"The border-end-end-radius CSS property defines a logical border radius on an element, which maps to a physical border radius that depends on on the element's writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"border-end-start-radius\",\n \"syntax\": \"<length-percentage>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E89\",\n \"FF66\",\n \"S15\",\n \"C89\",\n \"O75\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-end-start-radius\"\n }\n ],\n \"description\": \"The border-end-start-radius CSS property defines a logical border radius on an element, which maps to a physical border radius depending on the element's writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"border-inline\",\n \"syntax\": \"<'border-top-width'> || <'border-top-style'> || <color>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline\"\n }\n ],\n \"description\": \"The border-inline CSS property is a shorthand property for setting the individual logical inline border property values in a single place in the style sheet.\"\n },\n {\n \"name\": \"border-inline-color\",\n \"syntax\": \"<'border-top-color'>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-color\"\n }\n ],\n \"description\": \"The border-inline-color CSS property defines the color of the logical inline borders of an element, which maps to a physical border color depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-color and border-bottom-color, or border-right-color and border-left-color property depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"border-inline-style\",\n \"syntax\": \"<'border-top-style'>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-style\"\n }\n ],\n \"description\": \"The border-inline-style CSS property defines the style of the logical inline borders of an element, which maps to a physical border style depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-style and border-bottom-style, or border-left-style and border-right-style properties depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"border-inline-width\",\n \"syntax\": \"<'border-top-width'>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-inline-width\"\n }\n ],\n \"description\": \"The border-inline-width CSS property defines the width of the logical inline borders of an element, which maps to a physical border width depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-width and border-bottom-width, or border-left-width, and border-right-width property depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"border-start-end-radius\",\n \"syntax\": \"<length-percentage>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E89\",\n \"FF66\",\n \"S15\",\n \"C89\",\n \"O75\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-start-end-radius\"\n }\n ],\n \"description\": \"The border-start-end-radius CSS property defines a logical border radius on an element, which maps to a physical border radius depending on the element's writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"border-start-start-radius\",\n \"syntax\": \"<length-percentage>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E89\",\n \"FF66\",\n \"S15\",\n \"C89\",\n \"O75\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/border-start-start-radius\"\n }\n ],\n \"description\": \"The border-start-start-radius CSS property defines a logical border radius on an element, which maps to a physical border radius that depends on the element's writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"box-align\",\n \"status\": \"nonstandard\",\n \"syntax\": \"start | center | end | baseline | stretch\",\n \"relevance\": 0,\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-align\"\n }\n ],\n \"description\": \"The box-align CSS property specifies how an element aligns its contents across its layout in a perpendicular direction. The effect of the property is only visible if there is extra space in the box.\"\n },\n {\n \"name\": \"box-direction\",\n \"status\": \"nonstandard\",\n \"syntax\": \"normal | reverse | inherit\",\n \"relevance\": 0,\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-direction\"\n }\n ],\n \"description\": \"The box-direction CSS property specifies whether a box lays out its contents normally (from the top or left edge), or in reverse (from the bottom or right edge).\"\n },\n {\n \"name\": \"box-flex\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<number>\",\n \"relevance\": 0,\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-flex\"\n }\n ],\n \"description\": \"The -moz-box-flex and -webkit-box-flex CSS properties specify how a -moz-box or -webkit-box grows to fill the box that contains it, in the direction of the containing box's layout.\"\n },\n {\n \"name\": \"box-flex-group\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<integer>\",\n \"relevance\": 0,\n \"browsers\": [\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-flex-group\"\n }\n ],\n \"description\": \"The box-flex-group CSS property assigns the flexbox's child elements to a flex group.\"\n },\n {\n \"name\": \"box-lines\",\n \"status\": \"nonstandard\",\n \"syntax\": \"single | multiple\",\n \"relevance\": 0,\n \"browsers\": [\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-lines\"\n }\n ],\n \"description\": \"The box-lines CSS property determines whether the box may have a single or multiple lines (rows for horizontally oriented boxes, columns for vertically oriented boxes).\"\n },\n {\n \"name\": \"box-ordinal-group\",\n \"status\": \"nonstandard\",\n \"syntax\": \"<integer>\",\n \"relevance\": 0,\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-ordinal-group\"\n }\n ],\n \"description\": \"The box-ordinal-group CSS property assigns the flexbox's child elements to an ordinal group.\"\n },\n {\n \"name\": \"box-orient\",\n \"status\": \"nonstandard\",\n \"syntax\": \"horizontal | vertical | inline-axis | block-axis | inherit\",\n \"relevance\": 0,\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-orient\"\n }\n ],\n \"description\": \"The box-orient CSS property specifies whether an element lays out its contents horizontally or vertically.\"\n },\n {\n \"name\": \"box-pack\",\n \"status\": \"nonstandard\",\n \"syntax\": \"start | center | end | justify\",\n \"relevance\": 0,\n \"browsers\": [\n \"E12\",\n \"FF1\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/box-pack\"\n }\n ],\n \"description\": \"The -moz-box-pack and -webkit-box-pack CSS properties specify how a -moz-box or -webkit-box packs its contents in the direction of its layout. The effect of this is only visible if there is extra space in the box.\"\n },\n {\n \"name\": \"color-adjust\",\n \"syntax\": \"economy | exact\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF48\",\n \"S6\",\n \"C49\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/color-adjust\"\n }\n ],\n \"description\": \"The color-adjust property is a non-standard CSS extension that can be used to force printing of background colors and images in browsers based on the WebKit engine.\"\n },\n {\n \"name\": \"color-scheme\",\n \"syntax\": \"normal | [ light | dark | <custom-ident> ]+\",\n \"relevance\": 51,\n \"browsers\": [\n \"E81\",\n \"S13\",\n \"C81\",\n \"O68\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/color-scheme\"\n }\n ],\n \"description\": \"The color-scheme CSS property allows an element to indicate which color schemes it can comfortably be rendered in.\"\n },\n {\n \"name\": \"content-visibility\",\n \"syntax\": \"visible | auto | hidden\",\n \"relevance\": 51,\n \"browsers\": [\n \"E85\",\n \"C85\",\n \"O71\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/content-visibility\"\n }\n ],\n \"description\": \"Controls whether or not an element renders its contents at all, along with forcing a strong set of containments, allowing user agents to potentially omit large swathes of layout and rendering work until it becomes needed.\"\n },\n {\n \"name\": \"counter-set\",\n \"syntax\": \"[ <custom-ident> <integer>? ]+ | none\",\n \"relevance\": 50,\n \"browsers\": [\n \"E85\",\n \"FF68\",\n \"C85\",\n \"O71\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/counter-set\"\n }\n ],\n \"description\": \"The counter-set CSS property sets a CSS counter to a given value. It manipulates the value of existing counters, and will only create new counters if there isn't already a counter of the given name on the element.\"\n },\n {\n \"name\": \"font-optical-sizing\",\n \"syntax\": \"auto | none\",\n \"relevance\": 50,\n \"browsers\": [\n \"E17\",\n \"FF62\",\n \"S11\",\n \"C79\",\n \"O66\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-optical-sizing\"\n }\n ],\n \"description\": \"The font-optical-sizing CSS property allows developers to control whether browsers render text with slightly differing visual representations to optimize viewing at different sizes, or not. This only works for fonts that have an optical size variation axis.\"\n },\n {\n \"name\": \"font-variation-settings\",\n \"syntax\": \"normal | [ <string> <number> ]#\",\n \"relevance\": 50,\n \"browsers\": [\n \"E17\",\n \"FF62\",\n \"S11\",\n \"C62\",\n \"O49\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-variation-settings\"\n }\n ],\n \"description\": \"The font-variation-settings CSS property provides low-level control over OpenType or TrueType font variations, by specifying the four letter axis names of the features you want to vary, along with their variation values.\"\n },\n {\n \"name\": \"font-smooth\",\n \"status\": \"nonstandard\",\n \"syntax\": \"auto | never | always | <absolute-size> | <length>\",\n \"relevance\": 0,\n \"browsers\": [\n \"E79\",\n \"FF25\",\n \"S4\",\n \"C5\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/font-smooth\"\n }\n ],\n \"description\": \"The font-smooth CSS property controls the application of anti-aliasing when fonts are rendered.\"\n },\n {\n \"name\": \"forced-color-adjust\",\n \"status\": \"experimental\",\n \"syntax\": \"auto | none\",\n \"relevance\": 51,\n \"browsers\": [\n \"E79\",\n \"C89\",\n \"IE10\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/forced-color-adjust\"\n }\n ],\n \"description\": \"Allows authors to opt certain elements out of forced colors mode. This then restores the control of those values to CSS\"\n },\n {\n \"name\": \"gap\",\n \"syntax\": \"<'row-gap'> <'column-gap'>?\",\n \"relevance\": 51,\n \"browsers\": [\n \"E84\",\n \"FF63\",\n \"S14.1\",\n \"C84\",\n \"O70\"\n ],\n \"description\": \"The gap CSS property is a shorthand property for row-gap and column-gap specifying the gutters between grid rows and columns.\"\n },\n {\n \"name\": \"hanging-punctuation\",\n \"syntax\": \"none | [ first || [ force-end | allow-end ] || last ]\",\n \"relevance\": 50,\n \"browsers\": [\n \"S10\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/hanging-punctuation\"\n }\n ],\n \"description\": \"The hanging-punctuation CSS property specifies whether a punctuation mark should hang at the start or end of a line of text. Hanging punctuation may be placed outside the line box.\"\n },\n {\n \"name\": \"image-resolution\",\n \"status\": \"experimental\",\n \"syntax\": \"[ from-image || <resolution> ] && snap?\",\n \"relevance\": 50,\n \"description\": \"The image-resolution property specifies the intrinsic resolution of all raster images used in or on the element. It affects both content images (e.g. replaced elements and generated content) and decorative images (such as background-image). The intrinsic resolution of an image is used to determine the image\u2019s intrinsic dimensions.\"\n },\n {\n \"name\": \"initial-letter\",\n \"status\": \"experimental\",\n \"syntax\": \"normal | [ <number> <integer>? ]\",\n \"relevance\": 50,\n \"browsers\": [\n \"S9\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/initial-letter\"\n }\n ],\n \"description\": \"The initial-letter CSS property specifies styling for dropped, raised, and sunken initial letters.\"\n },\n {\n \"name\": \"initial-letter-align\",\n \"status\": \"experimental\",\n \"syntax\": \"[ auto | alphabetic | hanging | ideographic ]\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/initial-letter-align\"\n }\n ],\n \"description\": \"The initial-letter-align CSS property specifies the alignment of initial letters within a paragraph.\"\n },\n {\n \"name\": \"inset\",\n \"syntax\": \"<'top'>{1,4}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/inset\"\n }\n ],\n \"description\": \"The inset CSS property defines the logical block and inline start and end offsets of an element, which map to physical offsets depending on the element's writing mode, directionality, and text orientation. It corresponds to the top and bottom, or right and left properties depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"inset-block\",\n \"syntax\": \"<'top'>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF63\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/inset-block\"\n }\n ],\n \"description\": \"The inset-block CSS property defines the logical block start and end offsets of an element, which maps to physical offsets depending on the element's writing mode, directionality, and text orientation. It corresponds to the top and bottom, or right and left properties depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"inset-block-end\",\n \"syntax\": \"<'top'>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF63\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/inset-block-end\"\n }\n ],\n \"description\": \"The inset-block-end CSS property defines the logical block end offset of an element, which maps to a physical offset depending on the element's writing mode, directionality, and text orientation. It corresponds to the top, right, bottom, or left property depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"inset-block-start\",\n \"syntax\": \"<'top'>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF63\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/inset-block-start\"\n }\n ],\n \"description\": \"The inset-block-start CSS property defines the logical block start offset of an element, which maps to a physical offset depending on the element's writing mode, directionality, and text orientation. It corresponds to the top, right, bottom, or left property depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"inset-inline\",\n \"syntax\": \"<'top'>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF63\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/inset-inline\"\n }\n ],\n \"description\": \"The inset-inline CSS property defines the logical block start and end offsets of an element, which maps to physical offsets depending on the element's writing mode, directionality, and text orientation. It corresponds to the top and bottom, or right and left properties depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"inset-inline-end\",\n \"syntax\": \"<'top'>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF63\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/inset-inline-end\"\n }\n ],\n \"description\": \"The inset-inline-end CSS property defines the logical inline end inset of an element, which maps to a physical inset depending on the element's writing mode, directionality, and text orientation. It corresponds to the top, right, bottom, or left property depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"inset-inline-start\",\n \"syntax\": \"<'top'>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF63\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/inset-inline-start\"\n }\n ],\n \"description\": \"The inset-inline-start CSS property defines the logical inline start inset of an element, which maps to a physical offset depending on the element's writing mode, directionality, and text orientation. It corresponds to the top, right, bottom, or left property depending on the values defined for writing-mode, direction, and text-orientation.\"\n },\n {\n \"name\": \"justify-tracks\",\n \"status\": \"experimental\",\n \"syntax\": \"[ normal | <content-distribution> | <overflow-position>? [ <content-position> | left | right ] ]#\",\n \"relevance\": 50,\n \"browsers\": [\n \"FF77\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/justify-tracks\"\n }\n ],\n \"description\": \"The justify-tracks CSS property sets the alignment in the masonry axis for grid containers that have masonry in their inline axis\"\n },\n {\n \"name\": \"line-clamp\",\n \"status\": \"experimental\",\n \"syntax\": \"none | <integer>\",\n \"relevance\": 50,\n \"description\": \"The line-clamp property allows limiting the contents of a block container to the specified number of lines; remaining content is fragmented away and neither rendered nor measured. Optionally, it also allows inserting content into the last line box to indicate the continuity of truncated/interrupted content.\"\n },\n {\n \"name\": \"line-height-step\",\n \"status\": \"experimental\",\n \"syntax\": \"<length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"C60\",\n \"O47\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/line-height-step\"\n }\n ],\n \"description\": \"The line-height-step CSS property defines the step units for line box heights. When the step unit is positive, line box heights are rounded up to the closest multiple of the unit. Negative values are invalid.\"\n },\n {\n \"name\": \"margin-block\",\n \"syntax\": \"<'margin-left'>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-block\"\n }\n ],\n \"description\": \"The margin-block CSS property defines the logical block start and end margins of an element, which maps to physical margins depending on the element's writing mode, directionality, and text orientation.\"\n },\n {\n \"name\": \"margin-inline\",\n \"syntax\": \"<'margin-left'>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-inline\"\n }\n ],\n \"description\": \"The margin-inline CSS property defines the logical inline start and end margins of an element, which maps to physical margins depending on the element's writing mode, directionality, and text orientation.\"\n },\n {\n \"name\": \"margin-trim\",\n \"status\": \"experimental\",\n \"syntax\": \"none | in-flow | all\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/margin-trim\"\n }\n ],\n \"description\": \"The margin-trim property allows the container to trim the margins of its children where they adjoin the container\u2019s edges.\"\n },\n {\n \"name\": \"mask\",\n \"syntax\": \"<mask-layer>#\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF2\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask\"\n }\n ],\n \"description\": \"The mask CSS property alters the visibility of an element by either partially or fully hiding it. This is accomplished by either masking or clipping the image at specific points.\"\n },\n {\n \"name\": \"mask-border\",\n \"syntax\": \"<'mask-border-source'> || <'mask-border-slice'> [ / <'mask-border-width'>? [ / <'mask-border-outset'> ]? ]? || <'mask-border-repeat'> || <'mask-border-mode'>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-border\"\n }\n ],\n \"description\": \"The mask-border CSS property lets you create a mask along the edge of an element's border.\\n\\nThis property is a shorthand for mask-border-source, mask-border-slice, mask-border-width, mask-border-outset, mask-border-repeat, and mask-border-mode. As with all shorthand properties, any omitted sub-values will be set to their initial value.\"\n },\n {\n \"name\": \"mask-border-mode\",\n \"syntax\": \"luminance | alpha\",\n \"relevance\": 50,\n \"description\": \"The mask-border-mode CSS property specifies the blending mode used in a mask border.\"\n },\n {\n \"name\": \"mask-border-outset\",\n \"syntax\": \"[ <length> | <number> ]{1,4}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-border-outset\"\n }\n ],\n \"description\": \"The mask-border-outset CSS property specifies the distance by which an element's mask border is set out from its border box.\"\n },\n {\n \"name\": \"mask-border-repeat\",\n \"syntax\": \"[ stretch | repeat | round | space ]{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-border-repeat\"\n }\n ],\n \"description\": \"The mask-border-repeat CSS property defines how the edge regions of a source image are adjusted to fit the dimensions of an element's mask border.\"\n },\n {\n \"name\": \"mask-border-slice\",\n \"syntax\": \"<number-percentage>{1,4} fill?\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-border-slice\"\n }\n ],\n \"description\": \"The mask-border-slice CSS property divides the image specified by mask-border-source into regions. These regions are used to form the components of an element's mask border.\"\n },\n {\n \"name\": \"mask-border-source\",\n \"syntax\": \"none | <image>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-border-source\"\n }\n ],\n \"description\": \"The mask-border-source CSS property specifies the source image used to create an element's mask border.\\n\\nThe mask-border-slice property is used to divide the source image into regions, which are then dynamically applied to the final mask border.\"\n },\n {\n \"name\": \"mask-border-width\",\n \"syntax\": \"[ <length-percentage> | <number> | auto ]{1,4}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"S3.1\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-border-width\"\n }\n ],\n \"description\": \"The mask-border-width CSS property specifies the width of an element's mask border.\"\n },\n {\n \"name\": \"mask-clip\",\n \"syntax\": \"[ <geometry-box> | no-clip ]#\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF53\",\n \"S4\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-clip\"\n }\n ],\n \"description\": \"The mask-clip CSS property determines the area, which is affected by a mask. The painted content of an element must be restricted to this area.\"\n },\n {\n \"name\": \"mask-composite\",\n \"syntax\": \"<compositing-operator>#\",\n \"relevance\": 50,\n \"browsers\": [\n \"E18\",\n \"FF53\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/mask-composite\"\n }\n ],\n \"description\": \"The mask-composite CSS property represents a compositing operation used on the current mask layer with the mask layers below it.\"\n },\n {\n \"name\": \"masonry-auto-flow\",\n \"status\": \"experimental\",\n \"syntax\": \"[ pack | next ] || [ definite-first | ordered ]\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/masonry-auto-flow\"\n }\n ],\n \"description\": \"The masonry-auto-flow CSS property modifies how items are placed when using masonry in CSS Grid Layout.\"\n },\n {\n \"name\": \"math-style\",\n \"syntax\": \"normal | compact\",\n \"relevance\": 50,\n \"browsers\": [\n \"FF83\",\n \"S14.1\",\n \"C83\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/math-style\"\n }\n ],\n \"description\": \"The math-style property indicates whether MathML equations should render with normal or compact height.\"\n },\n {\n \"name\": \"max-lines\",\n \"status\": \"experimental\",\n \"syntax\": \"none | <integer>\",\n \"relevance\": 50,\n \"description\": \"The max-liens property forces a break after a set number of lines\"\n },\n {\n \"name\": \"offset\",\n \"syntax\": \"[ <'offset-position'>? [ <'offset-path'> [ <'offset-distance'> || <'offset-rotate'> ]? ]? ]! [ / <'offset-anchor'> ]?\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF72\",\n \"C55\",\n \"O42\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/offset\"\n }\n ],\n \"description\": \"The offset CSS property is a shorthand property for animating an element along a defined path.\"\n },\n {\n \"name\": \"offset-anchor\",\n \"syntax\": \"auto | <position>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF72\",\n \"C79\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/offset-anchor\"\n }\n ],\n \"description\": \"Defines an anchor point of the box positioned along the path. The anchor point specifies the point of the box which is to be considered as the point that is moved along the path.\"\n },\n {\n \"name\": \"offset-distance\",\n \"syntax\": \"<length-percentage>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF72\",\n \"C55\",\n \"O42\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/offset-distance\"\n }\n ],\n \"description\": \"The offset-distance CSS property specifies a position along an offset-path.\"\n },\n {\n \"name\": \"offset-path\",\n \"syntax\": \"none | ray( [ <angle> && <size> && contain? ] ) | <path()> | <url> | [ <basic-shape> || <geometry-box> ]\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF72\",\n \"C55\",\n \"O45\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/offset-path\"\n }\n ],\n \"description\": \"The offset-path CSS property specifies the offset path where the element gets positioned. The exact element\u2019s position on the offset path is determined by the offset-distance property. An offset path is either a specified path with one or multiple sub-paths or the geometry of a not-styled basic shape. Each shape or path must define an initial position for the computed value of \\\"0\\\" for offset-distance and an initial direction which specifies the rotation of the object to the initial position.\\n\\nIn this specification, a direction (or rotation) of 0 degrees is equivalent to the direction of the positive x-axis in the object\u2019s local coordinate system. In other words, a rotation of 0 degree points to the right side of the UA if the object and its ancestors have no transformation applied.\"\n },\n {\n \"name\": \"offset-position\",\n \"status\": \"experimental\",\n \"syntax\": \"auto | <position>\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/offset-position\"\n }\n ],\n \"description\": \"Specifies the initial position of the offset path. If position is specified with static, offset-position would be ignored.\"\n },\n {\n \"name\": \"offset-rotate\",\n \"syntax\": \"[ auto | reverse ] || <angle>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF72\",\n \"C56\",\n \"O43\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/offset-rotate\"\n }\n ],\n \"description\": \"The offset-rotate CSS property defines the direction of the element while positioning along the offset path.\"\n },\n {\n \"name\": \"overflow-anchor\",\n \"syntax\": \"auto | none\",\n \"relevance\": 52,\n \"browsers\": [\n \"E79\",\n \"FF66\",\n \"C56\",\n \"O43\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overflow-anchor\"\n }\n ],\n \"description\": \"The overflow-anchor CSS property provides a way to opt out browser scroll anchoring behavior which adjusts scroll position to minimize content shifts.\"\n },\n {\n \"name\": \"overflow-block\",\n \"syntax\": \"visible | hidden | clip | scroll | auto\",\n \"relevance\": 50,\n \"browsers\": [\n \"FF69\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overflow-block\"\n }\n ],\n \"description\": \"The overflow-block CSS media feature can be used to test how the output device handles content that overflows the initial containing block along the block axis.\"\n },\n {\n \"name\": \"overflow-clip-box\",\n \"status\": \"nonstandard\",\n \"syntax\": \"padding-box | content-box\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF29\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Mozilla/Gecko/Chrome/CSS/overflow-clip-box\"\n }\n ],\n \"description\": \"The overflow-clip-box CSS property specifies relative to which box the clipping happens when there is an overflow. It is short hand for the overflow-clip-box-inline and overflow-clip-box-block properties.\"\n },\n {\n \"name\": \"overflow-clip-margin\",\n \"syntax\": \"<visual-box> || <length [0,\u221E]>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E90\",\n \"C90\",\n \"O76\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overflow-clip-margin\"\n }\n ],\n \"description\": \"The overflow-clip-margin CSS property determines how far outside its bounds an element with overflow: clip may be painted before being clipped.\"\n },\n {\n \"name\": \"overflow-inline\",\n \"syntax\": \"visible | hidden | clip | scroll | auto\",\n \"relevance\": 50,\n \"browsers\": [\n \"FF69\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overflow-inline\"\n }\n ],\n \"description\": \"The overflow-inline CSS media feature can be used to test how the output device handles content that overflows the initial containing block along the inline axis.\"\n },\n {\n \"name\": \"overscroll-behavior\",\n \"syntax\": \"[ contain | none | auto ]{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E18\",\n \"FF59\",\n \"C63\",\n \"O50\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior\"\n }\n ],\n \"description\": \"The overscroll-behavior CSS property is shorthand for the overscroll-behavior-x and overscroll-behavior-y properties, which allow you to control the browser's scroll overflow behavior \u2014 what happens when the boundary of a scrolling area is reached.\"\n },\n {\n \"name\": \"overscroll-behavior-block\",\n \"syntax\": \"contain | none | auto\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF73\",\n \"C77\",\n \"O64\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-block\"\n }\n ],\n \"description\": \"The overscroll-behavior-block CSS property sets the browser's behavior when the block direction boundary of a scrolling area is reached.\"\n },\n {\n \"name\": \"overscroll-behavior-inline\",\n \"syntax\": \"contain | none | auto\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF73\",\n \"C77\",\n \"O64\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-inline\"\n }\n ],\n \"description\": \"The overscroll-behavior-inline CSS property sets the browser's behavior when the inline direction boundary of a scrolling area is reached.\"\n },\n {\n \"name\": \"overscroll-behavior-x\",\n \"syntax\": \"contain | none | auto\",\n \"relevance\": 50,\n \"browsers\": [\n \"E18\",\n \"FF59\",\n \"C63\",\n \"O50\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-x\"\n }\n ],\n \"description\": \"The overscroll-behavior-x CSS property is allows you to control the browser's scroll overflow behavior \u2014 what happens when the boundary of a scrolling area is reached \u2014 in the x axis direction.\"\n },\n {\n \"name\": \"overscroll-behavior-y\",\n \"syntax\": \"contain | none | auto\",\n \"relevance\": 50,\n \"browsers\": [\n \"E18\",\n \"FF59\",\n \"C63\",\n \"O50\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-y\"\n }\n ],\n \"description\": \"The overscroll-behavior-y CSS property is allows you to control the browser's scroll overflow behavior \u2014 what happens when the boundary of a scrolling area is reached \u2014 in the y axis direction.\"\n },\n {\n \"name\": \"padding-block\",\n \"syntax\": \"<'padding-left'>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding-block\"\n }\n ],\n \"description\": \"The padding-block CSS property defines the logical block start and end padding of an element, which maps to physical padding properties depending on the element's writing mode, directionality, and text orientation.\"\n },\n {\n \"name\": \"padding-inline\",\n \"syntax\": \"<'padding-left'>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF66\",\n \"S14.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/padding-inline\"\n }\n ],\n \"description\": \"The padding-inline CSS property defines the logical inline start and end padding of an element, which maps to physical padding properties depending on the element's writing mode, directionality, and text orientation.\"\n },\n {\n \"name\": \"place-content\",\n \"syntax\": \"<'align-content'> <'justify-content'>?\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF45\",\n \"S9\",\n \"C59\",\n \"O46\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/place-content\"\n }\n ],\n \"description\": \"The place-content CSS shorthand property sets both the align-content and justify-content properties.\"\n },\n {\n \"name\": \"place-items\",\n \"syntax\": \"<'align-items'> <'justify-items'>?\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF45\",\n \"S11\",\n \"C59\",\n \"O46\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/place-items\"\n }\n ],\n \"description\": \"The CSS place-items shorthand property sets both the align-items and justify-items properties. The first value is the align-items property value, the second the justify-items one. If the second value is not present, the first value is also used for it.\"\n },\n {\n \"name\": \"place-self\",\n \"syntax\": \"<'align-self'> <'justify-self'>?\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF45\",\n \"S11\",\n \"C59\",\n \"O46\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/place-self\"\n }\n ],\n \"description\": \"The place-self CSS property is a shorthand property sets both the align-self and justify-self properties. The first value is the align-self property value, the second the justify-self one. If the second value is not present, the first value is also used for it.\"\n },\n {\n \"name\": \"rotate\",\n \"syntax\": \"none | <angle> | [ x | y | z | <number>{3} ] && <angle>\",\n \"relevance\": 50,\n \"browsers\": [\n \"FF72\",\n \"S14.1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/rotate\"\n }\n ],\n \"description\": \"The rotate CSS property allows you to specify rotation transforms individually and independently of the transform property. This maps better to typical user interface usage, and saves having to remember the exact order of transform functions to specify in the transform value.\"\n },\n {\n \"name\": \"row-gap\",\n \"syntax\": \"normal | <length-percentage>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E84\",\n \"FF63\",\n \"S14.1\",\n \"C84\",\n \"O70\"\n ],\n \"description\": \"The row-gap CSS property specifies the gutter between grid rows.\"\n },\n {\n \"name\": \"ruby-merge\",\n \"status\": \"experimental\",\n \"syntax\": \"separate | collapse | auto\",\n \"relevance\": 50,\n \"description\": \"This property controls how ruby annotation boxes should be rendered when there are more than one in a ruby container box: whether each pair should be kept separate, the annotations should be collapsed and rendered as a group, or the separation should be determined based on the space available.\"\n },\n {\n \"name\": \"scale\",\n \"syntax\": \"none | <number>{1,3}\",\n \"relevance\": 50,\n \"browsers\": [\n \"FF72\",\n \"S14.1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scale\"\n }\n ],\n \"description\": \"The scale CSS property allows you to specify scale transforms individually and independently of the transform property. This maps better to typical user interface usage, and saves having to remember the exact order of transform functions to specify in the transform value.\"\n },\n {\n \"name\": \"scrollbar-color\",\n \"syntax\": \"auto | <color>{2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"FF64\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scrollbar-color\"\n }\n ],\n \"description\": \"The scrollbar-color CSS property sets the color of the scrollbar track and thumb.\"\n },\n {\n \"name\": \"scrollbar-gutter\",\n \"syntax\": \"auto | stable && both-edges?\",\n \"relevance\": 50,\n \"browsers\": [\n \"C88\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scrollbar-gutter\"\n }\n ],\n \"description\": \"The scrollbar-gutter CSS property allows authors to reserve space for the scrollbar, preventing unwanted layout changes as the content grows while also avoiding unnecessary visuals when scrolling isn't needed.\"\n },\n {\n \"name\": \"scrollbar-width\",\n \"syntax\": \"auto | thin | none\",\n \"relevance\": 50,\n \"browsers\": [\n \"FF64\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scrollbar-width\"\n }\n ],\n \"description\": \"The scrollbar-width property allows the author to set the maximum thickness of an element\u2019s scrollbars when they are shown. \"\n },\n {\n \"name\": \"scroll-margin\",\n \"syntax\": \"<length>{1,4}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF90\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin\"\n }\n ],\n \"description\": \"The scroll-margin property is a shorthand property which sets all of the scroll-margin longhands, assigning values much like the margin property does for the margin-* longhands.\"\n },\n {\n \"name\": \"scroll-margin-block\",\n \"syntax\": \"<length>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block\"\n }\n ],\n \"description\": \"The scroll-margin-block property is a shorthand property which sets the scroll-margin longhands in the block dimension.\"\n },\n {\n \"name\": \"scroll-margin-block-start\",\n \"syntax\": \"<length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block-start\"\n }\n ],\n \"description\": \"The scroll-margin-block-start property defines the margin of the scroll snap area at the start of the block dimension that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets.\"\n },\n {\n \"name\": \"scroll-margin-block-end\",\n \"syntax\": \"<length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block-end\"\n }\n ],\n \"description\": \"The scroll-margin-block-end property defines the margin of the scroll snap area at the end of the block dimension that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets.\"\n },\n {\n \"name\": \"scroll-margin-bottom\",\n \"syntax\": \"<length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-bottom\"\n }\n ],\n \"description\": \"The scroll-margin-bottom property defines the bottom margin of the scroll snap area that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets.\"\n },\n {\n \"name\": \"scroll-margin-inline\",\n \"syntax\": \"<length>{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"FF68\",\n \"S14.1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline\"\n }\n ],\n \"description\": \"The scroll-margin-inline property is a shorthand property which sets the scroll-margin longhands in the inline dimension.\"\n },\n {\n \"name\": \"scroll-margin-inline-start\",\n \"syntax\": \"<length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline-start\"\n }\n ],\n \"description\": \"The scroll-margin-inline-start property defines the margin of the scroll snap area at the start of the inline dimension that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets.\"\n },\n {\n \"name\": \"scroll-margin-inline-end\",\n \"syntax\": \"<length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline-end\"\n }\n ],\n \"description\": \"The scroll-margin-inline-end property defines the margin of the scroll snap area at the end of the inline dimension that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets.\"\n },\n {\n \"name\": \"scroll-margin-left\",\n \"syntax\": \"<length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-left\"\n }\n ],\n \"description\": \"The scroll-margin-left property defines the left margin of the scroll snap area that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets.\"\n },\n {\n \"name\": \"scroll-margin-right\",\n \"syntax\": \"<length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-right\"\n }\n ],\n \"description\": \"The scroll-margin-right property defines the right margin of the scroll snap area that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets.\"\n },\n {\n \"name\": \"scroll-margin-top\",\n \"syntax\": \"<length>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S14.1\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-margin-top\"\n }\n ],\n \"description\": \"The scroll-margin-top property defines the top margin of the scroll snap area that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container\u2019s coordinate space), then adding the specified outsets.\"\n },\n {\n \"name\": \"scroll-padding\",\n \"syntax\": \"[ auto | <length-percentage> ]{1,4}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S11\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding\"\n }\n ],\n \"description\": \"The scroll-padding property is a shorthand property which sets all of the scroll-padding longhands, assigning values much like the padding property does for the padding-* longhands.\"\n },\n {\n \"name\": \"scroll-padding-block\",\n \"syntax\": \"[ auto | <length-percentage> ]{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S15\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block\"\n }\n ],\n \"description\": \"The scroll-padding-block property is a shorthand property which sets the scroll-padding longhands for the block dimension.\"\n },\n {\n \"name\": \"scroll-padding-block-start\",\n \"syntax\": \"auto | <length-percentage>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S15\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block-start\"\n }\n ],\n \"description\": \"The scroll-padding-block-start property defines offsets for the start edge in the block dimension of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport.\"\n },\n {\n \"name\": \"scroll-padding-block-end\",\n \"syntax\": \"auto | <length-percentage>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S15\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block-end\"\n }\n ],\n \"description\": \"The scroll-padding-block-end property defines offsets for the end edge in the block dimension of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport.\"\n },\n {\n \"name\": \"scroll-padding-bottom\",\n \"syntax\": \"auto | <length-percentage>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S11\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-bottom\"\n }\n ],\n \"description\": \"The scroll-padding-bottom property defines offsets for the bottom of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport.\"\n },\n {\n \"name\": \"scroll-padding-inline\",\n \"syntax\": \"[ auto | <length-percentage> ]{1,2}\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S15\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline\"\n }\n ],\n \"description\": \"The scroll-padding-inline property is a shorthand property which sets the scroll-padding longhands for the inline dimension.\"\n },\n {\n \"name\": \"scroll-padding-inline-start\",\n \"syntax\": \"auto | <length-percentage>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S15\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline-start\"\n }\n ],\n \"description\": \"The scroll-padding-inline-start property defines offsets for the start edge in the inline dimension of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport.\"\n },\n {\n \"name\": \"scroll-padding-inline-end\",\n \"syntax\": \"auto | <length-percentage>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S15\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline-end\"\n }\n ],\n \"description\": \"The scroll-padding-inline-end property defines offsets for the end edge in the inline dimension of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport.\"\n },\n {\n \"name\": \"scroll-padding-left\",\n \"syntax\": \"auto | <length-percentage>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S11\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-left\"\n }\n ],\n \"description\": \"The scroll-padding-left property defines offsets for the left of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport.\"\n },\n {\n \"name\": \"scroll-padding-right\",\n \"syntax\": \"auto | <length-percentage>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S11\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-right\"\n }\n ],\n \"description\": \"The scroll-padding-right property defines offsets for the right of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport.\"\n },\n {\n \"name\": \"scroll-padding-top\",\n \"syntax\": \"auto | <length-percentage>\",\n \"relevance\": 51,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S11\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-padding-top\"\n }\n ],\n \"description\": \"The scroll-padding-top property defines offsets for the top of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport.\"\n },\n {\n \"name\": \"scroll-snap-align\",\n \"syntax\": \"[ none | start | end | center ]{1,2}\",\n \"relevance\": 52,\n \"browsers\": [\n \"E79\",\n \"FF68\",\n \"S11\",\n \"C69\",\n \"O56\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-align\"\n }\n ],\n \"description\": \"The scroll-snap-align property specifies the box\u2019s snap position as an alignment of its snap area (as the alignment subject) within its snap container\u2019s snapport (as the alignment container). The two values specify the snapping alignment in the block axis and inline axis, respectively. If only one value is specified, the second value defaults to the same value.\"\n },\n {\n \"name\": \"scroll-snap-stop\",\n \"syntax\": \"normal | always\",\n \"relevance\": 51,\n \"browsers\": [\n \"E79\",\n \"S15\",\n \"C75\",\n \"O62\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-stop\"\n }\n ],\n \"description\": \"The scroll-snap-stop CSS property defines whether the scroll container is allowed to \\\"pass over\\\" possible snap positions.\"\n },\n {\n \"name\": \"scroll-snap-type-x\",\n \"status\": \"obsolete\",\n \"syntax\": \"none | mandatory | proximity\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF39\",\n \"S9\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type-x\"\n }\n ],\n \"description\": \"The scroll-snap-type-x CSS property defines how strictly snap points are enforced on the horizontal axis of the scroll container in case there is one.\\n\\nSpecifying any precise animations or physics used to enforce those snap points is not covered by this property but instead left up to the user agent.\"\n },\n {\n \"name\": \"scroll-snap-type-y\",\n \"status\": \"obsolete\",\n \"syntax\": \"none | mandatory | proximity\",\n \"relevance\": 0,\n \"browsers\": [\n \"FF39\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type-y\"\n }\n ],\n \"description\": \"The scroll-snap-type-y CSS property defines how strictly snap points are enforced on the vertical axis of the scroll container in case there is one.\\n\\nSpecifying any precise animations or physics used to enforce those snap points is not covered by this property but instead left up to the user agent.\"\n },\n {\n \"name\": \"text-combine-upright\",\n \"syntax\": \"none | all | [ digits <integer>? ]\",\n \"relevance\": 50,\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-combine-upright\"\n }\n ],\n \"description\": \"The text-combine-upright CSS property specifies the combination of multiple characters into the space of a single character. If the combined text is wider than 1em, the user agent must fit the contents within 1em. The resulting composition is treated as a single upright glyph for layout and decoration. This property only has an effect in vertical writing modes.\\n\\nThis is used to produce an effect that is known as tate-ch\u016B-yoko (\u7E26\u4E2D\u6A2A) in Japanese, or as \u76F4\u66F8\u6A6B\u5411 in Chinese.\"\n },\n {\n \"name\": \"text-decoration-skip\",\n \"status\": \"experimental\",\n \"syntax\": \"none | [ objects || [ spaces | [ leading-spaces || trailing-spaces ] ] || edges || box-decoration ]\",\n \"relevance\": 52,\n \"browsers\": [\n \"S12.1\",\n \"C57\",\n \"O44\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-decoration-skip\"\n }\n ],\n \"description\": \"The text-decoration-skip CSS property specifies what parts of the element\u2019s content any text decoration affecting the element must skip over. It controls all text decoration lines drawn by the element and also any text decoration lines drawn by its ancestors.\"\n },\n {\n \"name\": \"text-decoration-skip-ink\",\n \"syntax\": \"auto | all | none\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF70\",\n \"C64\",\n \"O50\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-decoration-skip-ink\"\n }\n ],\n \"description\": \"The text-decoration-skip-ink CSS property specifies how overlines and underlines are drawn when they pass over glyph ascenders and descenders.\"\n },\n {\n \"name\": \"text-decoration-thickness\",\n \"syntax\": \"auto | from-font | <length> | <percentage> \",\n \"relevance\": 50,\n \"browsers\": [\n \"E89\",\n \"FF70\",\n \"S12.1\",\n \"C89\",\n \"O75\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-decoration-thickness\"\n }\n ],\n \"description\": \"The text-decoration-thickness CSS property sets the thickness, or width, of the decoration line that is used on text in an element, such as a line-through, underline, or overline.\"\n },\n {\n \"name\": \"text-emphasis\",\n \"syntax\": \"<'text-emphasis-style'> || <'text-emphasis-color'>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF46\",\n \"S7\",\n \"C25\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-emphasis\"\n }\n ],\n \"description\": \"The text-emphasis CSS property is a shorthand property for setting text-emphasis-style and text-emphasis-color in one declaration. This property will apply the specified emphasis mark to each character of the element's text, except separator characters, like spaces, and control characters.\"\n },\n {\n \"name\": \"text-emphasis-color\",\n \"syntax\": \"<color>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF46\",\n \"S7\",\n \"C25\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-emphasis-color\"\n }\n ],\n \"description\": \"The text-emphasis-color CSS property defines the color used to draw emphasis marks on text being rendered in the HTML document. This value can also be set and reset using the text-emphasis shorthand.\"\n },\n {\n \"name\": \"text-emphasis-position\",\n \"syntax\": \"[ over | under ] && [ right | left ]\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF46\",\n \"S7\",\n \"C25\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-emphasis-position\"\n }\n ],\n \"description\": \"The text-emphasis-position CSS property describes where emphasis marks are drawn at. The effect of emphasis marks on the line height is the same as for ruby text: if there isn't enough place, the line height is increased.\"\n },\n {\n \"name\": \"text-emphasis-style\",\n \"syntax\": \"none | [ [ filled | open ] || [ dot | circle | double-circle | triangle | sesame ] ] | <string>\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF46\",\n \"S7\",\n \"C25\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-emphasis-style\"\n }\n ],\n \"description\": \"The text-emphasis-style CSS property defines the type of emphasis used. It can also be set, and reset, using the text-emphasis shorthand.\"\n },\n {\n \"name\": \"text-size-adjust\",\n \"status\": \"experimental\",\n \"syntax\": \"none | auto | <percentage>\",\n \"relevance\": 57,\n \"browsers\": [\n \"E79\",\n \"C54\",\n \"O41\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-size-adjust\"\n }\n ],\n \"description\": \"The text-size-adjust CSS property controls the text inflation algorithm used on some smartphones and tablets. Other browsers will ignore this property.\"\n },\n {\n \"name\": \"text-underline-offset\",\n \"syntax\": \"auto | <length> | <percentage> \",\n \"relevance\": 50,\n \"browsers\": [\n \"E87\",\n \"FF70\",\n \"S12.1\",\n \"C87\",\n \"O73\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/text-underline-offset\"\n }\n ],\n \"description\": \"The text-underline-offset CSS property sets the offset distance of an underline text decoration line (applied using text-decoration) from its original position.\"\n },\n {\n \"name\": \"transform-box\",\n \"syntax\": \"content-box | border-box | fill-box | stroke-box | view-box\",\n \"relevance\": 50,\n \"browsers\": [\n \"E79\",\n \"FF55\",\n \"S11\",\n \"C64\",\n \"O51\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/transform-box\"\n }\n ],\n \"description\": \"The transform-box CSS property defines the layout box to which the transform and transform-origin properties relate.\"\n },\n {\n \"name\": \"translate\",\n \"syntax\": \"none | <length-percentage> [ <length-percentage> <length>? ]?\",\n \"relevance\": 50,\n \"browsers\": [\n \"FF72\",\n \"S14.1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/translate\"\n }\n ],\n \"description\": \"The translate CSS property allows you to specify translation transforms individually and independently of the transform property. This maps better to typical user interface usage, and saves having to remember the exact order of transform functions to specify in the transform value.\"\n },\n {\n \"name\": \"speak-as\",\n \"syntax\": \"auto | bullets | numbers | words | spell-out | <counter-style-name>\",\n \"relevance\": 50,\n \"description\": \"The speak-as descriptor specifies how a counter symbol constructed with a given @counter-style will be represented in the spoken form. For example, an author can specify a counter symbol to be either spoken as its numerical value or just represented with an audio cue.\"\n },\n {\n \"name\": \"ascent-override\",\n \"status\": \"experimental\",\n \"syntax\": \"normal | <percentage>\",\n \"relevance\": 50,\n \"description\": \"Describes the ascent metric of a font.\"\n },\n {\n \"name\": \"descent-override\",\n \"status\": \"experimental\",\n \"syntax\": \"normal | <percentage>\",\n \"relevance\": 50,\n \"description\": \"Describes the descent metric of a font.\"\n },\n {\n \"name\": \"font-display\",\n \"status\": \"experimental\",\n \"syntax\": \"[ auto | block | swap | fallback | optional ]\",\n \"relevance\": 69,\n \"description\": \"The font-display descriptor determines how a font face is displayed based on whether and when it is downloaded and ready to use.\"\n },\n {\n \"name\": \"line-gap-override\",\n \"status\": \"experimental\",\n \"syntax\": \"normal | <percentage>\",\n \"relevance\": 50,\n \"description\": \"Describes the line-gap metric of a font.\"\n },\n {\n \"name\": \"size-adjust\",\n \"status\": \"experimental\",\n \"syntax\": \"<percentage>\",\n \"relevance\": 50,\n \"description\": \"A multiplier for glyph outlines and metrics of a font.\"\n },\n {\n \"name\": \"bleed\",\n \"syntax\": \"auto | <length>\",\n \"relevance\": 50,\n \"description\": \"The bleed CSS at-rule descriptor, used with the @page at-rule, specifies the extent of the page bleed area outside the page box. This property only has effect if crop marks are enabled using the marks property.\"\n },\n {\n \"name\": \"marks\",\n \"syntax\": \"none | [ crop || cross ]\",\n \"relevance\": 50,\n \"description\": \"The marks CSS at-rule descriptor, used with the @page at-rule, adds crop and/or cross marks to the presentation of the document. Crop marks indicate where the page should be cut. Cross marks are used to align sheets.\"\n },\n {\n \"name\": \"syntax\",\n \"status\": \"experimental\",\n \"syntax\": \"<string>\",\n \"relevance\": 50,\n \"description\": \"Specifies the syntax of the custom property registration represented by the @property rule, controlling how the property\u2019s value is parsed at computed value time.\"\n },\n {\n \"name\": \"inherits\",\n \"status\": \"experimental\",\n \"syntax\": \"true | false\",\n \"relevance\": 50,\n \"description\": \"Specifies the inherit flag of the custom property registration represented by the @property rule, controlling whether or not the property inherits by default.\"\n },\n {\n \"name\": \"initial-value\",\n \"status\": \"experimental\",\n \"syntax\": \"<string>\",\n \"relevance\": 50,\n \"description\": \"Specifies the initial value of the custom property registration represented by the @property rule, controlling the property\u2019s initial value.\"\n },\n {\n \"name\": \"max-zoom\",\n \"syntax\": \"auto | <number> | <percentage>\",\n \"relevance\": 50,\n \"description\": \"The max-zoom CSS descriptor sets the maximum zoom factor of a document defined by the @viewport at-rule. The browser will not zoom in any further than this, whether automatically or at the user's request.\\n\\nA zoom factor of 1.0 or 100% corresponds to no zooming. Larger values are zoomed in. Smaller values are zoomed out.\"\n },\n {\n \"name\": \"min-zoom\",\n \"syntax\": \"auto | <number> | <percentage>\",\n \"relevance\": 50,\n \"description\": \"The min-zoom CSS descriptor sets the minimum zoom factor of a document defined by the @viewport at-rule. The browser will not zoom out any further than this, whether automatically or at the user's request.\\n\\nA zoom factor of 1.0 or 100% corresponds to no zooming. Larger values are zoomed in. Smaller values are zoomed out.\"\n },\n {\n \"name\": \"orientation\",\n \"syntax\": \"auto | portrait | landscape\",\n \"relevance\": 50,\n \"description\": \"The orientation CSS @media media feature can be used to apply styles based on the orientation of the viewport (or the page box, for paged media).\"\n },\n {\n \"name\": \"user-zoom\",\n \"syntax\": \"zoom | fixed\",\n \"relevance\": 50,\n \"description\": \"The user-zoom CSS descriptor controls whether or not the user can change the zoom factor of a document defined by @viewport.\"\n },\n {\n \"name\": \"viewport-fit\",\n \"syntax\": \"auto | contain | cover\",\n \"relevance\": 50,\n \"description\": \"The border-block-style CSS property defines the style of the logical block borders of an element, which maps to a physical border style depending on the element's writing mode, directionality, and text orientation.\"\n }\n ],\n \"atDirectives\": [\n {\n \"name\": \"@charset\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@charset\"\n }\n ],\n \"description\": \"Defines character set of the document.\"\n },\n {\n \"name\": \"@counter-style\",\n \"browsers\": [\n \"E91\",\n \"FF33\",\n \"C91\",\n \"O77\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@counter-style\"\n }\n ],\n \"description\": \"Defines a custom counter style.\"\n },\n {\n \"name\": \"@font-face\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@font-face\"\n }\n ],\n \"description\": \"Allows for linking to fonts that are automatically activated when needed. This permits authors to work around the limitation of 'web-safe' fonts, allowing for consistent rendering independent of the fonts available in a given user's environment.\"\n },\n {\n \"name\": \"@font-feature-values\",\n \"browsers\": [\n \"FF34\",\n \"S9.1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@font-feature-values\"\n }\n ],\n \"description\": \"Defines named values for the indices used to select alternate glyphs for a given font family.\"\n },\n {\n \"name\": \"@import\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@import\"\n }\n ],\n \"description\": \"Includes content of another file.\"\n },\n {\n \"name\": \"@keyframes\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@keyframes\"\n }\n ],\n \"description\": \"Defines set of animation key frames.\"\n },\n {\n \"name\": \"@media\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@media\"\n }\n ],\n \"description\": \"Defines a stylesheet for a particular media type.\"\n },\n {\n \"name\": \"@-moz-document\",\n \"browsers\": [\n \"FF1.8\"\n ],\n \"description\": \"Gecko-specific at-rule that restricts the style rules contained within it based on the URL of the document.\"\n },\n {\n \"name\": \"@-moz-keyframes\",\n \"browsers\": [\n \"FF5\"\n ],\n \"description\": \"Defines set of animation key frames.\"\n },\n {\n \"name\": \"@-ms-viewport\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Specifies the size, zoom factor, and orientation of the viewport.\"\n },\n {\n \"name\": \"@namespace\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@namespace\"\n }\n ],\n \"description\": \"Declares a prefix and associates it with a namespace name.\"\n },\n {\n \"name\": \"@-o-keyframes\",\n \"browsers\": [\n \"O12\"\n ],\n \"description\": \"Defines set of animation key frames.\"\n },\n {\n \"name\": \"@-o-viewport\",\n \"browsers\": [\n \"O11\"\n ],\n \"description\": \"Specifies the size, zoom factor, and orientation of the viewport.\"\n },\n {\n \"name\": \"@page\",\n \"browsers\": [\n \"E12\",\n \"FF19\",\n \"C2\",\n \"IE8\",\n \"O6\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@page\"\n }\n ],\n \"description\": \"Directive defines various page parameters.\"\n },\n {\n \"name\": \"@supports\",\n \"browsers\": [\n \"E12\",\n \"FF22\",\n \"S9\",\n \"C28\",\n \"O12.1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/@supports\"\n }\n ],\n \"description\": \"A conditional group rule whose condition tests whether the user agent supports CSS property:value pairs.\"\n },\n {\n \"name\": \"@-webkit-keyframes\",\n \"browsers\": [\n \"C\",\n \"S4\"\n ],\n \"description\": \"Defines set of animation key frames.\"\n }\n ],\n \"pseudoClasses\": [\n {\n \"name\": \":active\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:active\"\n }\n ],\n \"description\": \"Applies while an element is being activated by the user. For example, between the times the user presses the mouse button and releases it.\"\n },\n {\n \"name\": \":any-link\",\n \"browsers\": [\n \"E79\",\n \"FF50\",\n \"S9\",\n \"C65\",\n \"O52\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:any-link\"\n }\n ],\n \"description\": \"Represents an element that acts as the source anchor of a hyperlink. Applies to both visited and unvisited links.\"\n },\n {\n \"name\": \":checked\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:checked\"\n }\n ],\n \"description\": \"Radio and checkbox elements can be toggled by the user. Some menu items are 'checked' when the user selects them. When such elements are toggled 'on' the :checked pseudo-class applies.\"\n },\n {\n \"name\": \":corner-present\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Non-standard. Indicates whether or not a scrollbar corner is present.\"\n },\n {\n \"name\": \":decrement\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Non-standard. Applies to buttons and track pieces. Indicates whether or not the button or track piece will decrement the view\u2019s position when used.\"\n },\n {\n \"name\": \":default\",\n \"browsers\": [\n \"E79\",\n \"FF4\",\n \"S5\",\n \"C10\",\n \"O10\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:default\"\n }\n ],\n \"description\": \"Applies to the one or more UI elements that are the default among a set of similar elements. Typically applies to context menu items, buttons, and select lists/menus.\"\n },\n {\n \"name\": \":disabled\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:disabled\"\n }\n ],\n \"description\": \"Represents user interface elements that are in a disabled state; such elements have a corresponding enabled state.\"\n },\n {\n \"name\": \":double-button\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Non-standard. Applies to buttons and track pieces. Applies when both buttons are displayed together at the same end of the scrollbar.\"\n },\n {\n \"name\": \":empty\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:empty\"\n }\n ],\n \"description\": \"Represents an element that has no children at all.\"\n },\n {\n \"name\": \":enabled\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:enabled\"\n }\n ],\n \"description\": \"Represents user interface elements that are in an enabled state; such elements have a corresponding disabled state.\"\n },\n {\n \"name\": \":end\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Non-standard. Applies to buttons and track pieces. Indicates whether the object is placed after the thumb.\"\n },\n {\n \"name\": \":first\",\n \"browsers\": [\n \"E12\",\n \"S6\",\n \"C18\",\n \"IE8\",\n \"O9.2\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:first\"\n }\n ],\n \"description\": \"When printing double-sided documents, the page boxes on left and right pages may be different. This can be expressed through CSS pseudo-classes defined in the page context.\"\n },\n {\n \"name\": \":first-child\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:first-child\"\n }\n ],\n \"description\": \"Same as :nth-child(1). Represents an element that is the first child of some other element.\"\n },\n {\n \"name\": \":first-of-type\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:first-of-type\"\n }\n ],\n \"description\": \"Same as :nth-of-type(1). Represents an element that is the first sibling of its type in the list of children of its parent element.\"\n },\n {\n \"name\": \":focus\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:focus\"\n }\n ],\n \"description\": \"Applies while an element has the focus (accepts keyboard or mouse events, or other forms of input).\"\n },\n {\n \"name\": \":fullscreen\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:fullscreen\"\n }\n ],\n \"description\": \"Matches any element that has its fullscreen flag set.\"\n },\n {\n \"name\": \":future\",\n \"browsers\": [\n \"S6.1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:future\"\n }\n ],\n \"description\": \"Represents any element that is defined to occur entirely after a :current element.\"\n },\n {\n \"name\": \":horizontal\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Non-standard. Applies to any scrollbar pieces that have a horizontal orientation.\"\n },\n {\n \"name\": \":host\",\n \"browsers\": [\n \"E79\",\n \"FF63\",\n \"S10\",\n \"C54\",\n \"O41\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:host\"\n }\n ],\n \"description\": \"When evaluated in the context of a shadow tree, matches the shadow tree\u2019s host element.\"\n },\n {\n \"name\": \":host()\",\n \"browsers\": [\n \"C35\",\n \"O22\"\n ],\n \"description\": \"When evaluated in the context of a shadow tree, it matches the shadow tree\u2019s host element if the host element, in its normal context, matches the selector argument.\"\n },\n {\n \"name\": \":host-context()\",\n \"browsers\": [\n \"C35\",\n \"O22\"\n ],\n \"description\": \"Tests whether there is an ancestor, outside the shadow tree, which matches a particular selector.\"\n },\n {\n \"name\": \":hover\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:hover\"\n }\n ],\n \"description\": \"Applies while the user designates an element with a pointing device, but does not necessarily activate it. For example, a visual user agent could apply this pseudo-class when the cursor (mouse pointer) hovers over a box generated by the element.\"\n },\n {\n \"name\": \":increment\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Non-standard. Applies to buttons and track pieces. Indicates whether or not the button or track piece will increment the view\u2019s position when used.\"\n },\n {\n \"name\": \":indeterminate\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:indeterminate\"\n }\n ],\n \"description\": \"Applies to UI elements whose value is in an indeterminate state.\"\n },\n {\n \"name\": \":in-range\",\n \"browsers\": [\n \"E13\",\n \"FF29\",\n \"S5.1\",\n \"C10\",\n \"O11\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:in-range\"\n }\n ],\n \"description\": \"Used in conjunction with the min and max attributes, whether on a range input, a number field, or any other types that accept those attributes.\"\n },\n {\n \"name\": \":invalid\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:invalid\"\n }\n ],\n \"description\": \"An element is :valid or :invalid when it is, respectively, valid or invalid with respect to data validity semantics defined by a different specification.\"\n },\n {\n \"name\": \":lang()\",\n \"browsers\": [\n \"E\",\n \"C\",\n \"FF1\",\n \"IE8\",\n \"O8\",\n \"S3\"\n ],\n \"description\": \"Represents an element that is in language specified.\"\n },\n {\n \"name\": \":last-child\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:last-child\"\n }\n ],\n \"description\": \"Same as :nth-last-child(1). Represents an element that is the last child of some other element.\"\n },\n {\n \"name\": \":last-of-type\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:last-of-type\"\n }\n ],\n \"description\": \"Same as :nth-last-of-type(1). Represents an element that is the last sibling of its type in the list of children of its parent element.\"\n },\n {\n \"name\": \":left\",\n \"browsers\": [\n \"E12\",\n \"S5.1\",\n \"C6\",\n \"IE8\",\n \"O9.2\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:left\"\n }\n ],\n \"description\": \"When printing double-sided documents, the page boxes on left and right pages may be different. This can be expressed through CSS pseudo-classes defined in the page context.\"\n },\n {\n \"name\": \":link\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:link\"\n }\n ],\n \"description\": \"Applies to links that have not yet been visited.\"\n },\n {\n \"name\": \":matches()\",\n \"browsers\": [\n \"S9\"\n ],\n \"description\": \"Takes a selector list as its argument. It represents an element that is represented by its argument.\"\n },\n {\n \"name\": \":-moz-any()\",\n \"browsers\": [\n \"FF4\"\n ],\n \"description\": \"Represents an element that is represented by the selector list passed as its argument. Standardized as :matches().\"\n },\n {\n \"name\": \":-moz-any-link\",\n \"browsers\": [\n \"FF1\"\n ],\n \"description\": \"Represents an element that acts as the source anchor of a hyperlink. Applies to both visited and unvisited links.\"\n },\n {\n \"name\": \":-moz-broken\",\n \"browsers\": [\n \"FF3\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:-moz-broken\"\n }\n ],\n \"description\": \"Non-standard. Matches elements representing broken images.\"\n },\n {\n \"name\": \":-moz-drag-over\",\n \"browsers\": [\n \"FF1\"\n ],\n \"description\": \"Non-standard. Matches elements when a drag-over event applies to it.\"\n },\n {\n \"name\": \":-moz-first-node\",\n \"browsers\": [\n \"FF1\"\n ],\n \"description\": \"Non-standard. Represents an element that is the first child node of some other element.\"\n },\n {\n \"name\": \":-moz-focusring\",\n \"browsers\": [\n \"FF4\"\n ],\n \"description\": \"Non-standard. Matches an element that has focus and focus ring drawing is enabled in the browser.\"\n },\n {\n \"name\": \":-moz-full-screen\",\n \"browsers\": [\n \"FF9\"\n ],\n \"description\": \"Matches any element that has its fullscreen flag set. Standardized as :fullscreen.\"\n },\n {\n \"name\": \":-moz-last-node\",\n \"browsers\": [\n \"FF1\"\n ],\n \"description\": \"Non-standard. Represents an element that is the last child node of some other element.\"\n },\n {\n \"name\": \":-moz-loading\",\n \"browsers\": [\n \"FF3\"\n ],\n \"description\": \"Non-standard. Matches elements, such as images, that haven\u2019t started loading yet.\"\n },\n {\n \"name\": \":-moz-only-whitespace\",\n \"browsers\": [\n \"FF1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:-moz-only-whitespace\"\n }\n ],\n \"description\": \"The same as :empty, except that it additionally matches elements that only contain code points affected by whitespace processing. Standardized as :blank.\"\n },\n {\n \"name\": \":-moz-placeholder\",\n \"browsers\": [\n \"FF4\"\n ],\n \"description\": \"Deprecated. Represents placeholder text in an input field. Use ::-moz-placeholder for Firefox 19+.\"\n },\n {\n \"name\": \":-moz-submit-invalid\",\n \"browsers\": [\n \"FF88\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:-moz-submit-invalid\"\n }\n ],\n \"description\": \"Non-standard. Represents any submit button when the contents of the associated form are not valid.\"\n },\n {\n \"name\": \":-moz-suppressed\",\n \"browsers\": [\n \"FF3\"\n ],\n \"description\": \"Non-standard. Matches elements representing images that have been blocked from loading.\"\n },\n {\n \"name\": \":-moz-ui-invalid\",\n \"browsers\": [\n \"FF4\"\n ],\n \"description\": \"Non-standard. Represents any validated form element whose value isn't valid \"\n },\n {\n \"name\": \":-moz-ui-valid\",\n \"browsers\": [\n \"FF4\"\n ],\n \"description\": \"Non-standard. Represents any validated form element whose value is valid \"\n },\n {\n \"name\": \":-moz-user-disabled\",\n \"browsers\": [\n \"FF3\"\n ],\n \"description\": \"Non-standard. Matches elements representing images that have been disabled due to the user\u2019s preferences.\"\n },\n {\n \"name\": \":-moz-window-inactive\",\n \"browsers\": [\n \"FF4\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:-moz-window-inactive\"\n }\n ],\n \"description\": \"Non-standard. Matches elements in an inactive window.\"\n },\n {\n \"name\": \":-ms-fullscreen\",\n \"browsers\": [\n \"IE11\"\n ],\n \"description\": \"Matches any element that has its fullscreen flag set.\"\n },\n {\n \"name\": \":-ms-input-placeholder\",\n \"browsers\": [\n \"IE10\"\n ],\n \"description\": \"Represents placeholder text in an input field. Note: for Edge use the pseudo-element ::-ms-input-placeholder. Standardized as ::placeholder.\"\n },\n {\n \"name\": \":-ms-keyboard-active\",\n \"browsers\": [\n \"IE10\"\n ],\n \"description\": \"Windows Store apps only. Applies one or more styles to an element when it has focus and the user presses the space bar.\"\n },\n {\n \"name\": \":-ms-lang()\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents an element that is in the language specified. Accepts a comma separated list of language tokens.\"\n },\n {\n \"name\": \":no-button\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Non-standard. Applies to track pieces. Applies when there is no button at that end of the track.\"\n },\n {\n \"name\": \":not()\",\n \"browsers\": [\n \"E\",\n \"C\",\n \"FF1\",\n \"IE9\",\n \"O9.5\",\n \"S2\"\n ],\n \"description\": \"The negation pseudo-class, :not(X), is a functional notation taking a simple selector (excluding the negation pseudo-class itself) as an argument. It represents an element that is not represented by its argument.\"\n },\n {\n \"name\": \":nth-child()\",\n \"browsers\": [\n \"E\",\n \"C\",\n \"FF3.5\",\n \"IE9\",\n \"O9.5\",\n \"S3.1\"\n ],\n \"description\": \"Represents an element that has an+b-1 siblings before it in the document tree, for any positive integer or zero value of n, and has a parent element.\"\n },\n {\n \"name\": \":nth-last-child()\",\n \"browsers\": [\n \"E\",\n \"C\",\n \"FF3.5\",\n \"IE9\",\n \"O9.5\",\n \"S3.1\"\n ],\n \"description\": \"Represents an element that has an+b-1 siblings after it in the document tree, for any positive integer or zero value of n, and has a parent element.\"\n },\n {\n \"name\": \":nth-last-of-type()\",\n \"browsers\": [\n \"E\",\n \"C\",\n \"FF3.5\",\n \"IE9\",\n \"O9.5\",\n \"S3.1\"\n ],\n \"description\": \"Represents an element that has an+b-1 siblings with the same expanded element name after it in the document tree, for any zero or positive integer value of n, and has a parent element.\"\n },\n {\n \"name\": \":nth-of-type()\",\n \"browsers\": [\n \"E\",\n \"C\",\n \"FF3.5\",\n \"IE9\",\n \"O9.5\",\n \"S3.1\"\n ],\n \"description\": \"Represents an element that has an+b-1 siblings with the same expanded element name before it in the document tree, for any zero or positive integer value of n, and has a parent element.\"\n },\n {\n \"name\": \":only-child\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:only-child\"\n }\n ],\n \"description\": \"Represents an element that has a parent element and whose parent element has no other element children. Same as :first-child:last-child or :nth-child(1):nth-last-child(1), but with a lower specificity.\"\n },\n {\n \"name\": \":only-of-type\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:only-of-type\"\n }\n ],\n \"description\": \"Matches every element that is the only child of its type, of its parent. Same as :first-of-type:last-of-type or :nth-of-type(1):nth-last-of-type(1), but with a lower specificity.\"\n },\n {\n \"name\": \":optional\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:optional\"\n }\n ],\n \"description\": \"A form element is :required or :optional if a value for it is, respectively, required or optional before the form it belongs to is submitted. Elements that are not form elements are neither required nor optional.\"\n },\n {\n \"name\": \":out-of-range\",\n \"browsers\": [\n \"E13\",\n \"FF29\",\n \"S5.1\",\n \"C10\",\n \"O11\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:out-of-range\"\n }\n ],\n \"description\": \"Used in conjunction with the min and max attributes, whether on a range input, a number field, or any other types that accept those attributes.\"\n },\n {\n \"name\": \":past\",\n \"browsers\": [\n \"S6.1\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:past\"\n }\n ],\n \"description\": \"Represents any element that is defined to occur entirely prior to a :current element.\"\n },\n {\n \"name\": \":read-only\",\n \"browsers\": [\n \"E13\",\n \"FF78\",\n \"S4\",\n \"C1\",\n \"O9\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:read-only\"\n }\n ],\n \"description\": \"An element whose contents are not user-alterable is :read-only. However, elements whose contents are user-alterable (such as text input fields) are considered to be in a :read-write state. In typical documents, most elements are :read-only.\"\n },\n {\n \"name\": \":read-write\",\n \"browsers\": [\n \"E13\",\n \"FF78\",\n \"S4\",\n \"C1\",\n \"O9\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:read-write\"\n }\n ],\n \"description\": \"An element whose contents are not user-alterable is :read-only. However, elements whose contents are user-alterable (such as text input fields) are considered to be in a :read-write state. In typical documents, most elements are :read-only.\"\n },\n {\n \"name\": \":required\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:required\"\n }\n ],\n \"description\": \"A form element is :required or :optional if a value for it is, respectively, required or optional before the form it belongs to is submitted. Elements that are not form elements are neither required nor optional.\"\n },\n {\n \"name\": \":right\",\n \"browsers\": [\n \"E12\",\n \"S5.1\",\n \"C6\",\n \"IE8\",\n \"O9.2\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:right\"\n }\n ],\n \"description\": \"When printing double-sided documents, the page boxes on left and right pages may be different. This can be expressed through CSS pseudo-classes defined in the page context.\"\n },\n {\n \"name\": \":root\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:root\"\n }\n ],\n \"description\": \"Represents an element that is the root of the document. In HTML 4, this is always the HTML element.\"\n },\n {\n \"name\": \":scope\",\n \"browsers\": [\n \"E79\",\n \"FF32\",\n \"S7\",\n \"C27\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:scope\"\n }\n ],\n \"description\": \"Represents any element that is in the contextual reference element set.\"\n },\n {\n \"name\": \":single-button\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Non-standard. Applies to buttons and track pieces. Applies when both buttons are displayed separately at either end of the scrollbar.\"\n },\n {\n \"name\": \":start\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Non-standard. Applies to buttons and track pieces. Indicates whether the object is placed before the thumb.\"\n },\n {\n \"name\": \":target\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:target\"\n }\n ],\n \"description\": \"Some URIs refer to a location within a resource. This kind of URI ends with a 'number sign' (#) followed by an anchor identifier (called the fragment identifier).\"\n },\n {\n \"name\": \":valid\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:valid\"\n }\n ],\n \"description\": \"An element is :valid or :invalid when it is, respectively, valid or invalid with respect to data validity semantics defined by a different specification.\"\n },\n {\n \"name\": \":vertical\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Non-standard. Applies to any scrollbar pieces that have a vertical orientation.\"\n },\n {\n \"name\": \":visited\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:visited\"\n }\n ],\n \"description\": \"Applies once the link has been visited by the user.\"\n },\n {\n \"name\": \":-webkit-any()\",\n \"browsers\": [\n \"C\",\n \"S5\"\n ],\n \"description\": \"Represents an element that is represented by the selector list passed as its argument. Standardized as :matches().\"\n },\n {\n \"name\": \":-webkit-full-screen\",\n \"browsers\": [\n \"C\",\n \"S6\"\n ],\n \"description\": \"Matches any element that has its fullscreen flag set. Standardized as :fullscreen.\"\n },\n {\n \"name\": \":window-inactive\",\n \"browsers\": [\n \"C\",\n \"S3\"\n ],\n \"description\": \"Non-standard. Applies to all scrollbar pieces. Indicates whether or not the window containing the scrollbar is currently active.\"\n },\n {\n \"name\": \":current\",\n \"status\": \"experimental\",\n \"description\": \"The :current CSS pseudo-class selector is a time-dimensional pseudo-class that represents the element, or an ancestor of the element, that is currently being displayed\"\n },\n {\n \"name\": \":blank\",\n \"status\": \"experimental\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:blank\"\n }\n ],\n \"description\": \"The :blank CSS pseudo-class selects empty user input elements (eg. <input> or <textarea>).\"\n },\n {\n \"name\": \":defined\",\n \"status\": \"experimental\",\n \"browsers\": [\n \"E79\",\n \"FF63\",\n \"S10\",\n \"C54\",\n \"O41\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:defined\"\n }\n ],\n \"description\": \"The :defined CSS pseudo-class represents any element that has been defined. This includes any standard element built in to the browser, and custom elements that have been successfully defined (i.e. with the CustomElementRegistry.define() method).\"\n },\n {\n \"name\": \":dir\",\n \"browsers\": [\n \"FF49\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:dir\"\n }\n ],\n \"description\": \"The :dir() CSS pseudo-class matches elements based on the directionality of the text contained in them.\"\n },\n {\n \"name\": \":focus-visible\",\n \"browsers\": [\n \"E86\",\n \"FF85\",\n \"C86\",\n \"O72\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:focus-visible\"\n }\n ],\n \"description\": \"The :focus-visible pseudo-class applies while an element matches the :focus pseudo-class and the UA determines via heuristics that the focus should be made evident on the element.\"\n },\n {\n \"name\": \":focus-within\",\n \"browsers\": [\n \"E79\",\n \"FF52\",\n \"S10.1\",\n \"C60\",\n \"O47\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:focus-within\"\n }\n ],\n \"description\": \"The :focus-within pseudo-class applies to any element for which the :focus pseudo class applies as well as to an element whose descendant in the flat tree (including non-element nodes, such as text nodes) matches the conditions for matching :focus.\"\n },\n {\n \"name\": \":has\",\n \"status\": \"experimental\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:has\"\n }\n ],\n \"description\": \":The :has() CSS pseudo-class represents an element if any of the selectors passed as parameters (relative to the :scope of the given element), match at least one element.\"\n },\n {\n \"name\": \":is\",\n \"status\": \"experimental\",\n \"browsers\": [\n \"E88\",\n \"FF78\",\n \"S14\",\n \"C88\",\n \"O74\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:is\"\n }\n ],\n \"description\": \"The :is() CSS pseudo-class function takes a selector list as its argument, and selects any element that can be selected by one of the selectors in that list. This is useful for writing large selectors in a more compact form.\"\n },\n {\n \"name\": \":local-link\",\n \"status\": \"experimental\",\n \"description\": \"The :local-link CSS pseudo-class represents an link to the same document\"\n },\n {\n \"name\": \":nth-col\",\n \"status\": \"experimental\",\n \"description\": \"The :nth-col() CSS pseudo-class is designed for tables and grids. It accepts the An+B notation such as used with the :nth-child selector, using this to target every nth column. \"\n },\n {\n \"name\": \":nth-last-col\",\n \"status\": \"experimental\",\n \"description\": \"The :nth-last-col() CSS pseudo-class is designed for tables and grids. It accepts the An+B notation such as used with the :nth-child selector, using this to target every nth column before it, therefore counting back from the end of the set of columns.\"\n },\n {\n \"name\": \":paused\",\n \"status\": \"experimental\",\n \"description\": \"The :paused CSS pseudo-class selector is a resource state pseudo-class that will match an audio, video, or similar resource that is capable of being \u201Cplayed\u201D or \u201Cpaused\u201D, when that element is \u201Cpaused\u201D.\"\n },\n {\n \"name\": \":placeholder-shown\",\n \"status\": \"experimental\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:placeholder-shown\"\n }\n ],\n \"description\": \"The :placeholder-shown CSS pseudo-class represents any <input> or <textarea> element that is currently displaying placeholder text.\"\n },\n {\n \"name\": \":playing\",\n \"status\": \"experimental\",\n \"description\": \"The :playing CSS pseudo-class selector is a resource state pseudo-class that will match an audio, video, or similar resource that is capable of being \u201Cplayed\u201D or \u201Cpaused\u201D, when that element is \u201Cplaying\u201D. \"\n },\n {\n \"name\": \":target-within\",\n \"status\": \"experimental\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:target-within\"\n }\n ],\n \"description\": \"The :target-within CSS pseudo-class represents an element that is a target element or contains an element that is a target. A target element is a unique element with an id matching the URL's fragment.\"\n },\n {\n \"name\": \":user-invalid\",\n \"status\": \"experimental\",\n \"browsers\": [\n \"FF88\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:user-invalid\"\n }\n ],\n \"description\": \"The :user-invalid CSS pseudo-class represents any validated form element whose value isn't valid based on their validation constraints, after the user has interacted with it.\"\n },\n {\n \"name\": \":user-valid\",\n \"status\": \"experimental\",\n \"browsers\": [\n \"FF88\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:user-valid\"\n }\n ],\n \"description\": \"The :user-valid CSS pseudo-class represents any validated form element whose value validates correctly based on its validation constraints. However, unlike :valid it only matches once the user has interacted with it.\"\n },\n {\n \"name\": \":where\",\n \"status\": \"experimental\",\n \"browsers\": [\n \"E88\",\n \"FF78\",\n \"S14\",\n \"C88\",\n \"O74\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/:where\"\n }\n ],\n \"description\": \"The :where() CSS pseudo-class function takes a selector list as its argument, and selects any element that can be selected by one of the selectors in that list.\"\n },\n {\n \"name\": \":picture-in-picture\",\n \"status\": \"experimental\",\n \"description\": \"The :picture-in-picture CSS pseudo-class matches the element which is currently in picture-in-picture mode.\"\n }\n ],\n \"pseudoElements\": [\n {\n \"name\": \"::after\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::after\"\n }\n ],\n \"description\": \"Represents a styleable child pseudo-element immediately after the originating element\u2019s actual content.\"\n },\n {\n \"name\": \"::backdrop\",\n \"browsers\": [\n \"E79\",\n \"FF47\",\n \"C37\",\n \"IE11\",\n \"O24\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::backdrop\"\n }\n ],\n \"description\": \"Used to create a backdrop that hides the underlying document for an element in a top layer (such as an element that is displayed fullscreen).\"\n },\n {\n \"name\": \"::before\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::before\"\n }\n ],\n \"description\": \"Represents a styleable child pseudo-element immediately before the originating element\u2019s actual content.\"\n },\n {\n \"name\": \"::content\",\n \"browsers\": [\n \"C35\",\n \"O22\"\n ],\n \"description\": \"Deprecated. Matches the distribution list itself, on elements that have one. Use ::slotted for forward compatibility.\"\n },\n {\n \"name\": \"::cue\",\n \"browsers\": [\n \"E79\",\n \"FF55\",\n \"S6.1\",\n \"C26\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::cue\"\n }\n ]\n },\n {\n \"name\": \"::cue()\",\n \"browsers\": [\n \"C\",\n \"O16\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::cue-region\",\n \"browsers\": [\n \"C\",\n \"O16\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::cue-region()\",\n \"browsers\": [\n \"C\",\n \"O16\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::first-letter\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::first-letter\"\n }\n ],\n \"description\": \"Represents the first letter of an element, if it is not preceded by any other content (such as images or inline tables) on its line.\"\n },\n {\n \"name\": \"::first-line\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::first-line\"\n }\n ],\n \"description\": \"Describes the contents of the first formatted line of its originating element.\"\n },\n {\n \"name\": \"::-moz-focus-inner\",\n \"browsers\": [\n \"FF4\"\n ]\n },\n {\n \"name\": \"::-moz-focus-outer\",\n \"browsers\": [\n \"FF4\"\n ]\n },\n {\n \"name\": \"::-moz-list-bullet\",\n \"browsers\": [\n \"FF1\"\n ],\n \"description\": \"Used to style the bullet of a list element. Similar to the standardized ::marker.\"\n },\n {\n \"name\": \"::-moz-list-number\",\n \"browsers\": [\n \"FF1\"\n ],\n \"description\": \"Used to style the numbers of a list element. Similar to the standardized ::marker.\"\n },\n {\n \"name\": \"::-moz-placeholder\",\n \"browsers\": [\n \"FF19\"\n ],\n \"description\": \"Represents placeholder text in an input field\"\n },\n {\n \"name\": \"::-moz-progress-bar\",\n \"browsers\": [\n \"FF9\"\n ],\n \"description\": \"Represents the bar portion of a progress bar.\"\n },\n {\n \"name\": \"::-moz-selection\",\n \"browsers\": [\n \"FF1\"\n ],\n \"description\": \"Represents the portion of a document that has been highlighted by the user.\"\n },\n {\n \"name\": \"::-ms-backdrop\",\n \"browsers\": [\n \"IE11\"\n ],\n \"description\": \"Used to create a backdrop that hides the underlying document for an element in a top layer (such as an element that is displayed fullscreen).\"\n },\n {\n \"name\": \"::-ms-browse\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the browse button of an input type=file control.\"\n },\n {\n \"name\": \"::-ms-check\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the check of a checkbox or radio button input control.\"\n },\n {\n \"name\": \"::-ms-clear\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the clear button of a text input control\"\n },\n {\n \"name\": \"::-ms-expand\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the drop-down button of a select control.\"\n },\n {\n \"name\": \"::-ms-fill\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the bar portion of a progress bar.\"\n },\n {\n \"name\": \"::-ms-fill-lower\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the portion of the slider track from its smallest value up to the value currently selected by the thumb. In a left-to-right layout, this is the portion of the slider track to the left of the thumb.\"\n },\n {\n \"name\": \"::-ms-fill-upper\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the portion of the slider track from the value currently selected by the thumb up to the slider's largest value. In a left-to-right layout, this is the portion of the slider track to the right of the thumb.\"\n },\n {\n \"name\": \"::-ms-reveal\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the password reveal button of an input type=password control.\"\n },\n {\n \"name\": \"::-ms-thumb\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the portion of range input control (also known as a slider control) that the user drags.\"\n },\n {\n \"name\": \"::-ms-ticks-after\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the tick marks of a slider that begin just after the thumb and continue up to the slider's largest value. In a left-to-right layout, these are the ticks to the right of the thumb.\"\n },\n {\n \"name\": \"::-ms-ticks-before\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the tick marks of a slider that represent its smallest values up to the value currently selected by the thumb. In a left-to-right layout, these are the ticks to the left of the thumb.\"\n },\n {\n \"name\": \"::-ms-tooltip\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the tooltip of a slider (input type=range).\"\n },\n {\n \"name\": \"::-ms-track\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the track of a slider.\"\n },\n {\n \"name\": \"::-ms-value\",\n \"browsers\": [\n \"E\",\n \"IE10\"\n ],\n \"description\": \"Represents the content of a text or password input control, or a select control.\"\n },\n {\n \"name\": \"::selection\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::selection\"\n }\n ],\n \"description\": \"Represents the portion of a document that has been highlighted by the user.\"\n },\n {\n \"name\": \"::shadow\",\n \"browsers\": [\n \"C35\",\n \"O22\"\n ],\n \"description\": \"Matches the shadow root if an element has a shadow tree.\"\n },\n {\n \"name\": \"::-webkit-file-upload-button\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::-webkit-inner-spin-button\",\n \"browsers\": [\n \"E79\",\n \"S5\",\n \"C6\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-inner-spin-button\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-input-placeholder\",\n \"browsers\": [\n \"C\",\n \"S4\"\n ]\n },\n {\n \"name\": \"::-webkit-keygen-select\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::-webkit-meter-bar\",\n \"browsers\": [\n \"E79\",\n \"S5.1\",\n \"C12\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-meter-bar\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-meter-even-less-good-value\",\n \"browsers\": [\n \"E79\",\n \"S5.1\",\n \"C12\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-meter-even-less-good-value\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-meter-optimum-value\",\n \"browsers\": [\n \"E79\",\n \"S5.1\",\n \"C12\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-meter-optimum-value\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-meter-suboptimum-value\",\n \"browsers\": [\n \"E79\",\n \"S5.1\",\n \"C12\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-meter-suboptimum-value\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-outer-spin-button\",\n \"browsers\": [\n \"S5\",\n \"C6\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-outer-spin-button\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-progress-bar\",\n \"browsers\": [\n \"E79\",\n \"S7\",\n \"C25\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-progress-bar\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-progress-inner-element\",\n \"browsers\": [\n \"E79\",\n \"S7\",\n \"C23\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-progress-inner-element\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-progress-value\",\n \"browsers\": [\n \"E79\",\n \"S7\",\n \"C25\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-progress-value\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-resizer\",\n \"browsers\": [\n \"E79\",\n \"S4\",\n \"C2\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-scrollbar\",\n \"browsers\": [\n \"E79\",\n \"S4\",\n \"C2\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-scrollbar-button\",\n \"browsers\": [\n \"E79\",\n \"S4\",\n \"C2\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-scrollbar-corner\",\n \"browsers\": [\n \"E79\",\n \"S4\",\n \"C2\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-scrollbar-thumb\",\n \"browsers\": [\n \"E79\",\n \"S4\",\n \"C2\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-scrollbar-track\",\n \"browsers\": [\n \"E79\",\n \"S4\",\n \"C2\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-scrollbar-track-piece\",\n \"browsers\": [\n \"E79\",\n \"S4\",\n \"C2\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-search-cancel-button\",\n \"browsers\": [\n \"E79\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-search-cancel-button\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-search-decoration\",\n \"browsers\": [\n \"C\",\n \"S4\"\n ]\n },\n {\n \"name\": \"::-webkit-search-results-button\",\n \"browsers\": [\n \"E79\",\n \"S3\",\n \"C1\",\n \"O15\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-webkit-search-results-button\"\n }\n ]\n },\n {\n \"name\": \"::-webkit-search-results-decoration\",\n \"browsers\": [\n \"C\",\n \"S4\"\n ]\n },\n {\n \"name\": \"::-webkit-slider-runnable-track\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::-webkit-slider-thumb\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::-webkit-textfield-decoration-container\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::-webkit-validation-bubble\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::-webkit-validation-bubble-arrow\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::-webkit-validation-bubble-arrow-clipper\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::-webkit-validation-bubble-heading\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::-webkit-validation-bubble-message\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::-webkit-validation-bubble-text-block\",\n \"browsers\": [\n \"C\",\n \"O\",\n \"S6\"\n ]\n },\n {\n \"name\": \"::target-text\",\n \"status\": \"experimental\",\n \"browsers\": [\n \"E89\",\n \"C89\",\n \"O75\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::target-text\"\n }\n ],\n \"description\": \"The ::target-text CSS pseudo-element represents the text that has been scrolled to if the browser supports scroll-to-text fragments. It allows authors to choose how to highlight that section of text.\"\n },\n {\n \"name\": \"::-moz-range-progress\",\n \"status\": \"nonstandard\",\n \"browsers\": [\n \"FF22\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-moz-range-progress\"\n }\n ],\n \"description\": \"The ::-moz-range-progress CSS pseudo-element is a Mozilla extension that represents the lower portion of the track (i.e., groove) in which the indicator slides in an <input> of type=\\\"range\\\". This portion corresponds to values lower than the value currently selected by the thumb (i.e., virtual knob).\"\n },\n {\n \"name\": \"::-moz-range-thumb\",\n \"status\": \"nonstandard\",\n \"browsers\": [\n \"FF21\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-moz-range-thumb\"\n }\n ],\n \"description\": \"The ::-moz-range-thumb CSS pseudo-element is a Mozilla extension that represents the thumb (i.e., virtual knob) of an <input> of type=\\\"range\\\". The user can move the thumb along the input's track to alter its numerical value.\"\n },\n {\n \"name\": \"::-moz-range-track\",\n \"status\": \"nonstandard\",\n \"browsers\": [\n \"FF21\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::-moz-range-track\"\n }\n ],\n \"description\": \"The ::-moz-range-track CSS pseudo-element is a Mozilla extension that represents the track (i.e., groove) in which the indicator slides in an <input> of type=\\\"range\\\".\"\n },\n {\n \"name\": \"::-webkit-progress-inner-value\",\n \"status\": \"nonstandard\",\n \"description\": \"The ::-webkit-progress-value CSS pseudo-element represents the filled-in portion of the bar of a <progress> element. It is a child of the ::-webkit-progress-bar pseudo-element.\\n\\nIn order to let ::-webkit-progress-value take effect, -webkit-appearance needs to be set to none on the <progress> element.\"\n },\n {\n \"name\": \"::grammar-error\",\n \"status\": \"experimental\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::grammar-error\"\n }\n ],\n \"description\": \"The ::grammar-error CSS pseudo-element represents a text segment which the user agent has flagged as grammatically incorrect.\"\n },\n {\n \"name\": \"::marker\",\n \"browsers\": [\n \"E86\",\n \"FF68\",\n \"S11.1\",\n \"C86\",\n \"O72\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::marker\"\n }\n ],\n \"description\": \"The ::marker CSS pseudo-element selects the marker box of a list item, which typically contains a bullet or number. It works on any element or pseudo-element set to display: list-item, such as the <li> and <summary> elements.\"\n },\n {\n \"name\": \"::part\",\n \"status\": \"experimental\",\n \"browsers\": [\n \"E79\",\n \"FF72\",\n \"S13.1\",\n \"C73\",\n \"O60\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::part\"\n }\n ],\n \"description\": \"The ::part CSS pseudo-element represents any element within a shadow tree that has a matching part attribute.\"\n },\n {\n \"name\": \"::placeholder\",\n \"browsers\": [\n \"E79\",\n \"FF51\",\n \"S10.1\",\n \"C57\",\n \"O44\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::placeholder\"\n }\n ],\n \"description\": \"The ::placeholder CSS pseudo-element represents the placeholder text of a form element.\"\n },\n {\n \"name\": \"::slotted\",\n \"browsers\": [\n \"E79\",\n \"FF63\",\n \"S10\",\n \"C50\",\n \"O37\"\n ],\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::slotted\"\n }\n ],\n \"description\": \"The :slotted() CSS pseudo-element represents any element that has been placed into a slot inside an HTML template.\"\n },\n {\n \"name\": \"::spelling-error\",\n \"status\": \"experimental\",\n \"references\": [\n {\n \"name\": \"MDN Reference\",\n \"url\": \"https://developer.mozilla.org/docs/Web/CSS/::spelling-error\"\n }\n ],\n \"description\": \"The ::spelling-error CSS pseudo-element represents a text segment which the user agent has flagged as incorrectly spelled.\"\n }\n ]\n}", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport {\n CSSDataV1,\n IPropertyData,\n IAtDirectiveData,\n IPseudoClassData,\n IPseudoElementData\n} from 'vscode-css-languageservice';\n// @ts-ignore\nimport CssData from 'vscode-web-custom-data/data/browsers.css-data.json';\n\nexport interface LoadedCSSData {\n properties: IPropertyData[];\n atDirectives: IAtDirectiveData[];\n pseudoClasses: IPseudoClassData[];\n pseudoElements: IPseudoElementData[];\n}\n\nconst rawData = CssData as CSSDataV1;\n\nexport const cssData: LoadedCSSData = {\n properties: rawData.properties || [],\n atDirectives: rawData.atDirectives || [],\n pseudoClasses: rawData.pseudoClasses || [],\n pseudoElements: rawData.pseudoElements || []\n};\n", "/* tslint:disable:max-line-length */\nimport { CompletionItem, CompletionItemKind } from 'vscode-languageserver-types';\n\nconst _builtIn = [\n {\n name: 'red(color[, value])',\n desc: 'Return the red component of the given color, or set the red component to the optional second value argument.',\n insertText: 'red'\n },\n {\n name: 'green(color[, value])',\n desc: 'Return the green component of the given color, or set the green component to the optional second value argument.',\n insertText: 'green'\n },\n {\n name: 'blue(color[, value])',\n desc: 'Return the blue component of the given color, or set the blue component to the optional second value argument.',\n insertText: 'blue'\n },\n {\n name: 'alpha(color[, value])',\n desc: 'Return the alpha component of the given color, or set the alpha component to the optional second value argument.',\n insertText: 'alpha'\n },\n {\n name: 'dark(color)',\n desc: 'Check if color is dark:',\n insertText: 'dark'\n },\n {\n name: 'light(color)',\n desc: 'Check if color is light:',\n insertText: 'light'\n },\n {\n name: 'hue(color[, value])',\n desc: 'Return the hue of the given color, or set the hue component to the optional second value argument.',\n insertText: 'hue'\n },\n {\n name: 'saturation(color[, value])',\n desc: 'Return the saturation of the given color, or set the saturation component to the optional second value argument.',\n insertText: 'saturation'\n },\n {\n name: 'lightness(color[, value])',\n desc: 'Return the lightness of the given color, or set the lightness component to the optional second value argument.',\n insertText: 'lightness'\n },\n {\n name: 'push(expr, args\u2026)',\n desc: 'Push the given args to expr.',\n insertText: 'push'\n },\n {\n name: 'pop(expr)',\n desc: 'Pop a value from expr.',\n insertText: 'pop'\n },\n {\n name: 'shift(expr)',\n desc: 'Shift an element from expr.',\n insertText: 'shift'\n },\n {\n name: 'unshift(expr, args\u2026)',\n desc: 'Unshift the given args to expr.',\n insertText: 'unshift'\n },\n {\n name: 'index(list, value)',\n desc: 'Returns the index (zero-based) of a value within a list.',\n insertText: 'index'\n },\n {\n name: 'keys(pairs)',\n desc: 'Return keys in the given pairs:',\n insertText: 'keys'\n },\n {\n name: 'values(pairs)',\n desc: 'Return values in the given pairs:',\n insertText: 'values'\n },\n {\n name: 'list-separator(list)',\n desc: 'Return the separator of the given list.',\n insertText: 'list-separator'\n },\n {\n name: 'typeof(node)',\n desc: 'Return type of node as a string.',\n insertText: 'typeof'\n },\n {\n name: 'unit(unit[, type])',\n desc: 'Return a string for the type of unit or an empty string, or assign the given type without unit conversion.',\n insertText: 'unit'\n },\n {\n name: 'percentage(num)',\n desc: 'Convert a num to a percentage.',\n insertText: 'percentage'\n },\n {\n name: 'abs(unit)',\n desc: ' abs(-5px)\\n // => 5px\\n\\n abs(5px)\\n // => 5px\\n',\n insertText: 'abs'\n },\n {\n name: 'ceil(unit)',\n desc: ' ceil(5.5in)\\n // => 6in\\n',\n insertText: 'ceil'\n },\n {\n name: 'floor(unit)',\n desc: ' floor(5.6px)\\n // => 5px\\n',\n insertText: 'floor'\n },\n {\n name: 'round(unit)',\n desc: ' round(5.5px)\\n // => 6px\\n\\n round(5.4px)\\n // => 5px\\n',\n insertText: 'round'\n },\n {\n name: 'sin(angle)',\n desc: 'Returns the value of sine for the given angle. If the angle is given as a degree unit, like 45deg, it is treated as a degree, otherwise it is treated as radians.',\n insertText: 'sin'\n },\n {\n name: 'cos(angle)',\n desc: 'Returns the value of cosine for the given angle. If the angle is given as a degree unit, like 45deg, it is treated as a degree, otherwise it is treated as radians.',\n insertText: 'cos'\n },\n {\n name: 'tan(angle)',\n desc: 'Returns the value of tangent for the given angle. If the angle is given as a degree unit, like 45deg, it is treated as a degree, otherwise it is treated as radians.',\n insertText: 'tan'\n },\n {\n name: 'min(a, b)',\n desc: ' min(1, 5)\\n // => 1\\n',\n insertText: 'min'\n },\n {\n name: 'max(a, b)',\n desc: ' max(1, 5)\\n // => 5\\n',\n insertText: 'max'\n },\n {\n name: 'even(unit)',\n desc: ' even(6px)\\n // => true\\n',\n insertText: 'even'\n },\n {\n name: 'odd(unit)',\n desc: ' odd(5mm)\\n // => true\\n',\n insertText: 'odd'\n },\n {\n name: 'sum(nums)',\n desc: ' sum(1 2 3)\\n // => 6\\n',\n insertText: 'sum'\n },\n {\n name: 'avg(nums)',\n desc: ' avg(1 2 3)\\n // => 2\\n',\n insertText: 'avg'\n },\n {\n name: 'range(start, stop[, step])',\n desc: 'Returns a list of units from start to stop (included) by given step. If step argument is omitted, it defaults to 1. The step must not be zero.',\n insertText: 'range'\n },\n {\n name: 'base-convert(num, base, width)',\n desc: 'Returns a Literal num converted to the provided base, padded to width with zeroes (default width is 2)',\n insertText: 'base-convert'\n },\n {\n name: 'match(pattern, string[, flags])',\n desc: 'Retrieves the matches when matching a val(string) against a pattern(regular expression).',\n insertText: 'match'\n },\n {\n name: 'replace(pattern, replacement, val)',\n desc: 'Returns string with all matches of pattern replaced by replacement in given val',\n insertText: 'replace'\n },\n {\n name: 'join(delim, vals\u2026)',\n desc: 'Join the given vals with delim.',\n insertText: 'join'\n },\n {\n name: 'split(delim, val)',\n desc: 'The split()` method splits a string/ident into an array of strings by separating the string into substrings.',\n insertText: 'split'\n },\n {\n name: 'substr(val, start, length)',\n desc: 'The substr() method returns the characters in a string beginning at the specified location through the specified number of characters.',\n insertText: 'substr'\n },\n {\n name: 'slice(val, start[, end])',\n desc: 'The slice() method extracts a section of a string/list and returns a new string/list.',\n insertText: 'slice'\n },\n {\n name: 'hsla(color | h,s,l,a)',\n desc: 'Convert the given color to an HSLA node, or h,s,l,a component values.',\n insertText: 'hsla'\n },\n {\n name: 'hsl(color | h,s,l)',\n desc: 'Convert the given color to an HSLA node, or h,s,l,a component values.',\n insertText: 'hsl'\n },\n {\n name: 'rgba(color | r,g,b,a)',\n desc: 'Return RGBA from the r,g,b,a channels or provide a color to tweak the alpha.',\n insertText: 'rgba'\n },\n {\n name: 'rgb(color | r,g,b)',\n desc: 'Return a RGBA from the r,g,b channels or cast to an RGBA node.',\n insertText: 'rgb'\n },\n {\n name: 'blend(top[, bottom])',\n desc: 'Blends the given top color over the bottom one using the normal blending. The bottom argument is optional and is defaulted to #fff.',\n insertText: 'blend'\n },\n {\n name: 'lighten(color, amount)',\n desc: 'Lighten the given color by amount. This function is unit-sensitive, for example supporting percentages as shown below.',\n insertText: 'lighten'\n },\n {\n name: 'darken(color, amount)',\n desc: 'Darken the given color by amount.This function is unit-sensitive, for example supporting percentages as shown below.',\n insertText: 'darken'\n },\n {\n name: 'desaturate(color, amount)',\n desc: 'Desaturate the given color by amount.',\n insertText: 'desaturate'\n },\n {\n name: 'saturate(color, amount)',\n desc: 'Saturate the given color by amount.',\n insertText: 'saturate'\n },\n {\n name: 'complement(color)',\n desc: 'Gives the complementary color. Equals to spinning hue to 180deg.',\n insertText: 'complement'\n },\n {\n name: 'invert(color)',\n desc: 'Inverts the color. The red, green, and blue values are inverted, while the opacity is left alone.',\n insertText: 'invert'\n },\n {\n name: 'spin(color, amount)',\n desc: 'Spins hue of the given color by amount.',\n insertText: 'spin'\n },\n {\n name: 'grayscale(color)',\n desc: 'Gives the grayscale equivalent of the given color. Equals to desaturate by 100%.',\n insertText: 'grayscale'\n },\n {\n name: 'mix(color1, color2[, amount])',\n desc: 'Mix two colors by a given amount. The amount is optional and is defaulted to 50%.',\n insertText: 'mix'\n },\n {\n name: 'tint(color, amount)',\n desc: 'Mix the given color with white.',\n insertText: 'tint'\n },\n {\n name: 'shade(color, amount)',\n desc: 'Mix the given color with black.',\n insertText: 'shade'\n },\n {\n name: 'luminosity(color)',\n desc: 'Returns the relative luminance of the given color.',\n insertText: 'luminosity'\n },\n {\n name: 'contrast(top[, bottom])',\n desc: 'Returns the contrast ratio object between top and bottom colors, based on script underlying \u201Ccontrast ratio\u201D tool by Lea Verou.',\n insertText: 'contrast'\n },\n {\n name: 'transparentify(top[, bottom, alpha])',\n desc: 'Returns the transparent version of the given top color, as if it was blend over the given bottom color (or the closest to it, if it is possible).',\n insertText: 'transparentify'\n },\n {\n name: 'unquote(str | ident)',\n desc: 'Unquote the given str and returned as a Literal node.',\n insertText: 'unquote'\n },\n {\n name: 'convert(str)',\n desc: 'Like unquote() but tries to convert the given str to a Stylus node.',\n insertText: 'convert'\n },\n {\n name: 's(fmt, \u2026)',\n desc: 'The s() function is similar to unquote(), in that it returns a Literal node, however it accepts a format string much like C\u2019s sprintf(). Currently the only specifier is %s.',\n insertText: 's'\n },\n {\n name: 'basename(path[, ext])',\n desc: 'Returns the basename of path, (optionally) with ext extension removed.',\n insertText: 'basename'\n },\n {\n name: 'dirname(path)',\n desc: 'Returns the dirname of path.',\n insertText: 'dirname'\n },\n {\n name: 'extname(path)',\n desc: 'Returns the filename extension of path including the dot.',\n insertText: 'extname'\n },\n {\n name: 'pathjoin(\u2026)',\n desc: 'Peform a path join.',\n insertText: 'pathjoin'\n },\n {\n name: 'current-media()',\n desc: \"current-media() function returns the string of the current block\u2019s @media rule or '' if there is no @media above the block.\",\n insertText: 'current-media'\n },\n {\n name: '+cache(keys\u2026)',\n desc: '+cache is a really powerful built-in function that allows you to create your own \u201Ccachable\u201D mixins.',\n insertText: '+cache'\n },\n {\n name: '+prefix-classes(prefix)',\n desc: 'Stylus comes with a block mixin prefix-classes that can be used for prefixing the classes inside any given Stylus\u2019 block. For example:',\n insertText: '+prefix-classes'\n },\n {\n name: 'lookup(name)',\n desc: 'Allows to lookup a variable with a given name, passed as a string. Returns null if the variable is undefined.',\n insertText: 'lookup(name)'\n },\n {\n name: 'define(name, expr[, global])',\n desc: 'Allows to create or overwrite a variable with a given name, passed as a string, onto current scope (or global scope if global is true).',\n insertText: 'define'\n },\n {\n name: 'operate(op, left, right)',\n desc: 'Perform the given op on the left and right operands:',\n insertText: 'operate'\n },\n {\n name: 'length([expr])',\n desc: 'Parenthesized expressions may act as tuples, the length() function returns the length of such expressions.',\n insertText: 'length'\n },\n {\n name: 'selector()',\n desc: 'Returns the compiled current selector or & if called at root level.',\n insertText: 'selector'\n },\n {\n name: 'selector-exists(selector)',\n desc: 'Returns true if the given selector exists.',\n insertText: 'selector-exists'\n },\n {\n name: 'warn(msg)',\n desc: 'Warn with the given error msg, does not exit.',\n insertText: 'warn'\n },\n {\n name: 'error(msg)',\n desc: 'Exits with the given error msg.',\n insertText: 'error'\n },\n {\n name: 'last(expr)',\n desc: 'Return the last value in the given expr:',\n insertText: 'last'\n },\n {\n name: 'p(expr)',\n desc: 'Inspect the given expr:',\n insertText: 'p'\n },\n {\n name: 'opposite-position(positions)',\n desc: 'Return the opposites of the given positions.',\n insertText: 'opposite-position'\n },\n {\n name: 'image-size(path)',\n desc: 'Returns the width and height of the image found at path. Lookups are performed in the same manner as @import, altered by the paths setting.',\n insertText: 'image-size'\n },\n {\n name: 'embedurl(path[, encoding])',\n desc: 'Returns an inline image as a url() literal, encoded with encoding (available encodings: base64 (default), and utf8).',\n insertText: 'embedurl'\n },\n {\n name: 'add-property(name, expr)',\n desc: 'Adds property name, with the given expr to the closest block.',\n insertText: 'add-property'\n },\n {\n name: 'json(path[, options])',\n desc: 'Convert a .json file into stylus variables or an object. Nested variable object keys are joined with a dash (-).',\n insertText: 'json'\n },\n {\n name: 'use(path)',\n desc: 'You can use any given js-plugin at given path with use() function right inside your \u2018.styl\u2019 files, like this:',\n insertText: 'use'\n }\n];\n\nconst builtIn = _builtIn.map(item => {\n const completionItem = CompletionItem.create(item.insertText);\n completionItem.detail = item.name;\n completionItem.insertText = item.insertText;\n completionItem.documentation = item.desc;\n completionItem.kind = CompletionItemKind.Function;\n\n return completionItem;\n});\n\nexport default builtIn;\n", "import { SymbolInformation, SymbolKind, Range, Position } from 'vscode-languageserver-types';\nimport type { TextDocument } from 'vscode-languageserver-textdocument';\n\nimport {\n StylusNode,\n buildAst,\n flattenAndFilterAst,\n isAtRuleNode,\n isFunctionNode,\n isSelectorCallNode,\n isSelectorNode,\n isVariableNode\n} from './parser';\n\nimport _ from 'lodash';\n\n/**\n * Generates hash for symbol for comparison with other symbols\n * @param {SymbolInformation} symbol\n * @return {String}\n */\nfunction _buildHashFromSymbol(symbol: SymbolInformation): string {\n return `${symbol.kind}_${symbol.name}_${symbol.location.range.start.line}_${symbol.location.range.end.line}`;\n}\n\n/**\n * Removes useless characters from symbol name\n * @param {String} name\n * @return String\n */\nfunction prepareName(name: string): string {\n return name.replace(/\\{|\\}/g, '').trim();\n}\n\n/**\n * Handler for variables\n * @param {Object} node\n * @param {String[]} text - text editor content splitted by lines\n * @return {SymbolInformation}\n */\nfunction _variableSymbol(node: StylusNode, text: string[]): SymbolInformation {\n const name = node.name;\n const lineno = Number(node.val!.lineno) - 1;\n const column = Math.max(text[lineno].indexOf(name), 0);\n const range = Range.create(lineno, column, lineno, column + name.length);\n\n return SymbolInformation.create(name, SymbolKind.Variable, range);\n}\n\n/**\n * Handler for function\n * @param {Object} node\n * @param {String[]} text - text editor content splitted by lines\n * @return {SymbolInformation}\n */\nfunction _functionSymbol(node: StylusNode, text: string[]): SymbolInformation {\n const name = node.name;\n const lineno = Number(node.val!.lineno) - 1;\n const column = Math.max(text[lineno].indexOf(name), 0);\n\n const posStart = Position.create(lineno, column);\n const posEnd = Position.create(lineno, column + name.length);\n const range = Range.create(posStart, posEnd);\n\n return SymbolInformation.create(name, SymbolKind.Function, range);\n}\n\n/**\n * Handler for selectors\n * @param {Object} node\n * @param {String[]} text - text editor content splitted by lines\n * @return {SymbolInformation}\n */\nfunction _selectorSymbol(node: StylusNode, text: string[]): SymbolInformation {\n const firstSegment = node.segments[0];\n const name = firstSegment.string\n ? node.segments.map(s => s.string).join('')\n : firstSegment.nodes!.map(s => s.name).join('');\n const lineno = Number(firstSegment.lineno) - 1;\n const column = node.column - 1;\n\n const posStart = Position.create(lineno, column);\n const posEnd = Position.create(lineno, column + name.length);\n const range = Range.create(posStart, posEnd);\n\n return SymbolInformation.create(name, SymbolKind.Class, range);\n}\n\n/**\n * Handler for selector call symbols\n * @param {Object} node\n * @param {String[]} text - text editor content splitted by lines\n * @return {SymbolInformation}\n */\nfunction _selectorCallSymbol(node: StylusNode, text: string[]): SymbolInformation {\n const lineno = Number(node.lineno) - 1;\n const name = prepareName(text[lineno]);\n const column = Math.max(text[lineno].indexOf(name), 0);\n\n const posStart = Position.create(lineno, column);\n const posEnd = Position.create(lineno, column + name.length);\n\n return SymbolInformation.create(name, SymbolKind.Class, Range.create(posStart, posEnd));\n}\n\n/**\n * Handler for at rules\n * @param {Object} node\n * @param {String[]} text - text editor content splitted by lines\n * @return {SymbolInformation}\n */\nfunction _atRuleSymbol(node: StylusNode, text: string[]): SymbolInformation {\n const lineno = Number(node.lineno) - 1;\n const name = prepareName(text[lineno]);\n const column = Math.max(text[lineno].indexOf(name), 0);\n\n const posStart = Position.create(lineno, column);\n const posEnd = Position.create(lineno, column + name.length);\n\n return SymbolInformation.create(name, SymbolKind.Namespace, Range.create(posStart, posEnd));\n}\n\n/**\n * Iterates through raw symbols and choose appropriate handler for each one\n * @param {Array} rawSymbols\n * @param {String[]} text - text editor content splitted by lines\n * @return {SymbolInformation[]}\n */\nfunction processRawSymbols(rawSymbols: StylusNode[], text: string[]): SymbolInformation[] {\n return _.compact(\n rawSymbols.map(symNode => {\n if (isVariableNode(symNode)) {\n return _variableSymbol(symNode, text);\n }\n\n if (isFunctionNode(symNode)) {\n return _functionSymbol(symNode, text);\n }\n\n if (isSelectorNode(symNode)) {\n return _selectorSymbol(symNode, text);\n }\n\n if (isSelectorCallNode(symNode)) {\n return _selectorCallSymbol(symNode, text);\n }\n\n if (isAtRuleNode(symNode)) {\n return _atRuleSymbol(symNode, text);\n }\n })\n );\n}\n\nexport function provideDocumentSymbols(document: TextDocument): SymbolInformation[] {\n const text = document.getText();\n const ast = buildAst(text);\n if (!ast) {\n return [];\n }\n const rawSymbols = _.compact(flattenAndFilterAst(ast));\n const symbolInfos = processRawSymbols(rawSymbols, text.split('\\n'));\n\n return _.uniqBy(symbolInfos, _buildHashFromSymbol);\n}\n", "import { Position, Hover, Range } from 'vscode-languageserver-types';\nimport type { TextDocument } from 'vscode-languageserver-textdocument';\n\nimport { buildAst, findNodeAtPosition } from './parser';\n\nimport { cssData } from './css-browser-data';\nimport _ from 'lodash';\n\nexport function stylusHover(document: TextDocument, position: Position): Hover {\n const ast = buildAst(document.getText());\n if (!ast) {\n return {\n contents: ''\n };\n }\n const node = findNodeAtPosition(ast, position);\n if (!node) {\n return {\n contents: 'no node found!'\n };\n }\n\n if (node.__type === 'Property') {\n const property = node.segments[0].name;\n const properties = cssData.properties;\n const item = _.find(properties, item => item.name === property);\n const lineno = node.lineno - 1;\n const column = node.column;\n return {\n contents: (item && item.description) || 'unknown property',\n range: Range.create(lineno, column, lineno, column + properties.length)\n };\n }\n return {\n contents: []\n };\n}\n", "import type ts from 'typescript';\nimport { URI } from 'vscode-uri';\nimport { TextDocument } from 'vscode-languageserver-textdocument';\nimport parseGitIgnore from 'parse-gitignore';\n\nimport { LanguageModelCache } from '../../embeddedSupport/languageModelCache';\nimport { createUpdater, parseVueScript } from './preprocess';\nimport { getFileFsPath, getFilePath, normalizeFileNameToFsPath } from '../../utils/paths';\nimport * as bridge from './bridge';\nimport { getVueSys } from './vueSys';\nimport { TemplateSourceMap, stringifySourceMapNodes } from './sourceMap';\nimport { isVirtualVueTemplateFile, isVueFile } from './util';\nimport { logger } from '../../log';\nimport { ModuleResolutionCache } from './moduleResolutionCache';\nimport { globalScope } from './transformTemplate';\nimport { ChildComponent } from '../vueInfoService';\nimport { RuntimeLibrary } from '../dependencyService';\nimport { EnvironmentService } from '../EnvironmentService';\nimport { VueVersion } from '../../utils/vueVersion';\nimport { dirname } from 'path';\nimport { flatten } from 'lodash';\n\nconst NEWLINE = process.platform === 'win32' ? '\\r\\n' : '\\n';\n\n/**\n * For prop validation\n */\nconst allChildComponentsInfo = new Map<string, ChildComponent[]>();\n\nfunction patchTS(tsModule: RuntimeLibrary['typescript']) {\n // Patch typescript functions to insert `import Vue from 'vue'` and `new Vue` around export default.\n // NOTE: this is a global hack that all ts instances after is changed\n const { createLanguageServiceSourceFile, updateLanguageServiceSourceFile } = createUpdater(\n tsModule,\n allChildComponentsInfo\n );\n (tsModule as any).createLanguageServiceSourceFile = createLanguageServiceSourceFile;\n (tsModule as any).updateLanguageServiceSourceFile = updateLanguageServiceSourceFile;\n}\n\nfunction getDefaultCompilerOptions(tsModule: RuntimeLibrary['typescript']) {\n const defaultCompilerOptions: ts.CompilerOptions = {\n allowNonTsExtensions: true,\n allowJs: true,\n lib: ['lib.dom.d.ts', 'lib.es2017.d.ts'],\n target: tsModule.ScriptTarget.Latest,\n moduleResolution: tsModule.ModuleResolutionKind.NodeJs,\n module: tsModule.ModuleKind.CommonJS,\n jsx: tsModule.JsxEmit.Preserve,\n allowSyntheticDefaultImports: true,\n experimentalDecorators: true\n };\n\n return defaultCompilerOptions;\n}\n\nexport const templateSourceMap: TemplateSourceMap = {};\n\nexport interface IServiceHost {\n queryVirtualFileInfo(fileName: string, currFileText: string): { source: string; sourceMapNodesString: string };\n updateCurrentVirtualVueTextDocument(\n doc: TextDocument,\n childComponents?: ChildComponent[]\n ): {\n templateService: ts.LanguageService;\n templateSourceMap: TemplateSourceMap;\n };\n updateCurrentVueTextDocument(doc: TextDocument): {\n service: ts.LanguageService;\n scriptDoc: TextDocument;\n };\n getLanguageService(): ts.LanguageService;\n updateExternalDocument(filePath: string): void;\n getFileNames(): string[];\n getComplierOptions(): ts.CompilerOptions;\n dispose(): void;\n}\n\n/**\n * Manges 4 set of files\n *\n * - `vue` files in workspace\n * - `js/ts` files in workspace\n * - `vue` files in `node_modules`\n * - `js/ts` files in `node_modules`\n */\nexport function getServiceHost(\n tsModule: RuntimeLibrary['typescript'],\n env: EnvironmentService,\n updatedScriptRegionDocuments: LanguageModelCache<TextDocument>\n): IServiceHost {\n patchTS(tsModule);\n\n let currentScriptDoc: TextDocument;\n\n // host variable\n let vueVersion = env.getVueVersion();\n let projectVersion = 1;\n let versions = new Map<string, number>();\n let localScriptRegionDocuments = new Map<string, TextDocument>();\n let nodeModuleSnapshots = new Map<string, ts.IScriptSnapshot>();\n let projectFileSnapshots = new Map<string, ts.IScriptSnapshot>();\n let moduleResolutionCache = new ModuleResolutionCache();\n\n let parsedConfig: ts.ParsedCommandLine;\n let scriptFileNameSet: Set<string>;\n\n let vueSys: ts.System;\n let compilerOptions: ts.CompilerOptions;\n\n let jsHost: ts.LanguageServiceHost;\n let templateHost: ts.LanguageServiceHost;\n\n let registry: ts.DocumentRegistry;\n let jsLanguageService: ts.LanguageService;\n let templateLanguageService: ts.LanguageService;\n init();\n\n function getCompilerOptions() {\n const compilerOptions = {\n ...getDefaultCompilerOptions(tsModule),\n ...parsedConfig.options\n };\n compilerOptions.allowNonTsExtensions = true;\n return compilerOptions;\n }\n\n function init() {\n vueVersion = env.getVueVersion();\n projectVersion = 1;\n versions = new Map<string, number>();\n localScriptRegionDocuments = new Map<string, TextDocument>();\n nodeModuleSnapshots = new Map<string, ts.IScriptSnapshot>();\n projectFileSnapshots = new Map<string, ts.IScriptSnapshot>();\n moduleResolutionCache = new ModuleResolutionCache();\n\n parsedConfig = getParsedConfig(tsModule, env.getProjectRoot(), env.getTsConfigPath());\n const initialProjectFiles = parsedConfig.fileNames;\n logger.logDebug(\n `Initializing ServiceHost with ${initialProjectFiles.length} files: ${JSON.stringify(initialProjectFiles)}`\n );\n scriptFileNameSet = new Set(initialProjectFiles);\n vueSys = getVueSys(tsModule, scriptFileNameSet);\n compilerOptions = getCompilerOptions();\n\n jsHost = createLanguageServiceHost(compilerOptions);\n templateHost = createLanguageServiceHost({\n ...compilerOptions,\n noUnusedLocals: false,\n noUnusedParameters: false,\n allowJs: true,\n checkJs: true\n });\n registry = tsModule.createDocumentRegistry(true);\n jsLanguageService = tsModule.createLanguageService(jsHost, registry);\n templateLanguageService = patchTemplateService(tsModule.createLanguageService(templateHost, registry));\n }\n\n function queryVirtualFileInfo(\n fileName: string,\n currFileText: string\n ): { source: string; sourceMapNodesString: string } {\n const program = templateLanguageService.getProgram();\n if (program) {\n const tsVirtualFile = program.getSourceFile(fileName + '.template');\n if (tsVirtualFile) {\n return {\n source: tsVirtualFile.getText(),\n sourceMapNodesString: stringifySourceMapNodes(\n templateSourceMap[fileName],\n currFileText,\n tsVirtualFile.getText()\n )\n };\n }\n }\n\n return {\n source: '',\n sourceMapNodesString: ''\n };\n }\n\n function updateCurrentVirtualVueTextDocument(doc: TextDocument, childComponents?: ChildComponent[]) {\n const fileFsPath = getFileFsPath(doc.uri);\n const filePath = getFilePath(doc.uri);\n // When file is not in language service, add it\n if (!localScriptRegionDocuments.has(fileFsPath)) {\n if (fileFsPath.endsWith('.vue') || fileFsPath.endsWith('.vue.template')) {\n scriptFileNameSet.add(filePath);\n }\n }\n\n if (isVirtualVueTemplateFile(fileFsPath)) {\n const oldDocVersion = localScriptRegionDocuments.get(fileFsPath)?.version;\n scriptFileNameSet.add(filePath);\n if (childComponents) {\n allChildComponentsInfo.set(filePath, childComponents);\n }\n if (oldDocVersion !== doc.version) {\n localScriptRegionDocuments.set(fileFsPath, doc);\n versions.set(fileFsPath, (versions.get(fileFsPath) || 0) + 1);\n projectVersion++;\n }\n }\n\n return {\n templateService: templateLanguageService,\n templateSourceMap\n };\n }\n\n function updateCurrentVueTextDocument(doc: TextDocument) {\n const fileFsPath = getFileFsPath(doc.uri);\n const filePath = getFilePath(doc.uri);\n // When file is not in language service, add it\n if (!localScriptRegionDocuments.has(fileFsPath)) {\n if (fileFsPath.endsWith('.vue') || fileFsPath.endsWith('.vue.template')) {\n scriptFileNameSet.add(filePath);\n }\n }\n\n if (!currentScriptDoc || doc.uri !== currentScriptDoc.uri || doc.version !== currentScriptDoc.version) {\n currentScriptDoc = updatedScriptRegionDocuments.refreshAndGet(doc)!;\n const localLastDoc = localScriptRegionDocuments.get(fileFsPath);\n if (localLastDoc && currentScriptDoc.languageId !== localLastDoc.languageId) {\n // if languageId changed, restart the language service; it can't handle file type changes\n jsLanguageService.dispose();\n jsLanguageService = tsModule.createLanguageService(jsHost);\n }\n localScriptRegionDocuments.set(fileFsPath, currentScriptDoc);\n scriptFileNameSet.add(filePath);\n versions.set(fileFsPath, (versions.get(fileFsPath) || 0) + 1);\n projectVersion++;\n }\n return {\n service: jsLanguageService,\n scriptDoc: currentScriptDoc\n };\n }\n\n // External Documents: JS/TS, non Vue documents\n function updateExternalDocument(fileFsPath: string) {\n // reload `tsconfig.json` or vue version changed\n if (fileFsPath === env.getTsConfigPath() || vueVersion !== env.getVueVersion()) {\n logger.logInfo(`refresh ts language service when ${fileFsPath} changed.`);\n init();\n return;\n }\n\n // respect tsconfig\n // use *internal* function\n const configFileSpecs = (parsedConfig as any).configFileSpecs;\n const isExcludedFile = (tsModule as any).isExcludedFile;\n if (\n isExcludedFile &&\n configFileSpecs &&\n isExcludedFile(fileFsPath, configFileSpecs, env.getProjectRoot(), true, env.getProjectRoot())\n ) {\n return;\n }\n logger.logInfo(`update ${fileFsPath} in ts language service.`);\n\n const ver = versions.get(fileFsPath) || 0;\n versions.set(fileFsPath, ver + 1);\n projectVersion++;\n\n // Clear cache so we read the js/ts file from file system again\n if (projectFileSnapshots.has(fileFsPath)) {\n projectFileSnapshots.delete(fileFsPath);\n }\n }\n\n function getFileNames() {\n return Array.from(scriptFileNameSet);\n }\n\n function createLanguageServiceHost(options: ts.CompilerOptions): ts.LanguageServiceHost {\n return {\n getProjectVersion: () => projectVersion.toString(),\n getCompilationSettings: () => options,\n getScriptFileNames: () => Array.from(scriptFileNameSet),\n getScriptVersion(fileName) {\n if (fileName.includes('node_modules')) {\n return '0';\n }\n\n if (fileName === bridge.fileName) {\n return '0';\n }\n\n const normalizedFileFsPath = normalizeFileNameToFsPath(fileName);\n const version = versions.get(normalizedFileFsPath);\n return version ? version.toString() : '0';\n },\n getScriptKind(fileName) {\n if (fileName.includes('node_modules')) {\n return (tsModule as any).getScriptKindFromFileName(fileName);\n }\n\n if (isVueFile(fileName)) {\n const uri = URI.file(fileName);\n const fileFsPath = normalizeFileNameToFsPath(fileName);\n let doc = localScriptRegionDocuments.get(fileFsPath);\n if (!doc) {\n doc = updatedScriptRegionDocuments.refreshAndGet(\n TextDocument.create(uri.toString(), 'vue', 0, tsModule.sys.readFile(fileName) || '')\n );\n localScriptRegionDocuments.set(fileFsPath, doc);\n scriptFileNameSet.add(fileName);\n }\n return getScriptKind(tsModule, doc.languageId);\n } else if (isVirtualVueTemplateFile(fileName)) {\n return tsModule.ScriptKind.TS;\n } else {\n if (fileName === bridge.fileName) {\n return tsModule.ScriptKind.TS;\n }\n // NOTE: Typescript 2.3 should export getScriptKindFromFileName. Then this cast should be removed.\n return (tsModule as any).getScriptKindFromFileName(fileName);\n }\n },\n\n getDirectories: vueSys.getDirectories,\n directoryExists: vueSys.directoryExists,\n fileExists: vueSys.fileExists,\n readFile: vueSys.readFile,\n readDirectory(\n path: string,\n extensions?: ReadonlyArray<string>,\n exclude?: ReadonlyArray<string>,\n include?: ReadonlyArray<string>,\n depth?: number\n ): string[] {\n const allExtensions = extensions ? extensions.concat(['.vue']) : extensions;\n return vueSys.readDirectory(path, allExtensions, exclude, include, depth);\n },\n\n resolveModuleNames(moduleNames: string[], containingFile: string): (ts.ResolvedModule | undefined)[] {\n // in the normal case, delegate to ts.resolveModuleName\n // in the relative-imported.vue case, manually build a resolved filename\n const result: (ts.ResolvedModule | undefined)[] = moduleNames.map(name => {\n if (name === bridge.moduleName) {\n return {\n resolvedFileName: bridge.fileName,\n extension: tsModule.Extension.Ts,\n /* tslint:disable:max-line-length */\n // https://github.com/microsoft/TypeScript/blob/bcbe1d763823eacd4b252c904e77761a6b8636a1/src/compiler/types.ts#L6216\n isExternalLibraryImport: true\n };\n }\n const cachedResolvedModule = moduleResolutionCache.getCache(name, containingFile);\n if (cachedResolvedModule) {\n return cachedResolvedModule;\n }\n\n if (!isVueFile(name)) {\n const tsResolvedModule = tsModule.resolveModuleName(\n name,\n containingFile,\n options,\n tsModule.sys\n ).resolvedModule;\n\n if (tsResolvedModule) {\n moduleResolutionCache.setCache(name, containingFile, tsResolvedModule);\n }\n\n return tsResolvedModule;\n }\n\n const tsResolvedModule = tsModule.resolveModuleName(name, containingFile, options, vueSys).resolvedModule;\n if (!tsResolvedModule) {\n return undefined;\n }\n\n if (tsResolvedModule.resolvedFileName.endsWith('.vue.ts')) {\n const resolvedFileName = tsResolvedModule.resolvedFileName.slice(0, -'.ts'.length);\n const uri = URI.file(resolvedFileName);\n const resolvedFileFsPath = normalizeFileNameToFsPath(resolvedFileName);\n let doc = localScriptRegionDocuments.get(resolvedFileFsPath);\n // Vue file not created yet\n if (!doc) {\n doc = updatedScriptRegionDocuments.refreshAndGet(\n TextDocument.create(uri.toString(), 'vue', 0, tsModule.sys.readFile(resolvedFileName) || '')\n );\n localScriptRegionDocuments.set(resolvedFileFsPath, doc);\n scriptFileNameSet.add(resolvedFileName);\n }\n\n const extension =\n doc.languageId === 'typescript'\n ? tsModule.Extension.Ts\n : doc.languageId === 'tsx'\n ? tsModule.Extension.Tsx\n : tsModule.Extension.Js;\n\n const tsResolvedVueModule = { resolvedFileName, extension };\n moduleResolutionCache.setCache(name, containingFile, tsResolvedVueModule);\n return tsResolvedVueModule;\n } else {\n moduleResolutionCache.setCache(name, containingFile, tsResolvedModule);\n return tsResolvedModule;\n }\n });\n\n return result;\n },\n getScriptSnapshot: (fileName: string) => {\n if (fileName.includes('node_modules')) {\n if (nodeModuleSnapshots.has(fileName)) {\n return nodeModuleSnapshots.get(fileName);\n }\n const fileText = tsModule.sys.readFile(fileName) || '';\n const snapshot: ts.IScriptSnapshot = {\n getText: (start, end) => fileText.substring(start, end),\n getLength: () => fileText.length,\n getChangeRange: () => void 0\n };\n nodeModuleSnapshots.set(fileName, snapshot);\n return snapshot;\n }\n\n if (fileName === bridge.fileName) {\n const text =\n vueVersion === VueVersion.VPre25\n ? bridge.preVue25Content\n : vueVersion === VueVersion.V25\n ? bridge.vue25Content\n : bridge.vue30Content;\n\n return {\n getText: (start, end) => text.substring(start, end),\n getLength: () => text.length,\n getChangeRange: () => void 0\n };\n }\n\n const fileFsPath = normalizeFileNameToFsPath(fileName);\n\n // .vue.template files are handled in pre-process phase\n if (isVirtualVueTemplateFile(fileFsPath)) {\n const doc = localScriptRegionDocuments.get(fileFsPath);\n const fileText = doc ? doc.getText() : '';\n return {\n getText: (start, end) => fileText.substring(start, end),\n getLength: () => fileText.length,\n getChangeRange: () => void 0\n };\n }\n\n // js/ts files in workspace\n if (!isVueFile(fileFsPath)) {\n if (projectFileSnapshots.has(fileFsPath)) {\n return projectFileSnapshots.get(fileFsPath);\n }\n const fileText = tsModule.sys.readFile(fileFsPath) || '';\n const snapshot: ts.IScriptSnapshot = {\n getText: (start, end) => fileText.substring(start, end),\n getLength: () => fileText.length,\n getChangeRange: () => void 0\n };\n projectFileSnapshots.set(fileFsPath, snapshot);\n return snapshot;\n }\n\n // vue files in workspace\n const doc = localScriptRegionDocuments.get(fileFsPath);\n let fileText = '';\n if (doc) {\n fileText = doc.getText();\n } else {\n // Note: This is required in addition to the parsing in embeddedSupport because\n // this works for .vue files that aren't even loaded by VS Code yet.\n const rawVueFileText = tsModule.sys.readFile(fileFsPath) || '';\n fileText = parseVueScript(rawVueFileText);\n }\n\n return {\n getText: (start, end) => fileText.substring(start, end),\n getLength: () => fileText.length,\n getChangeRange: () => void 0\n };\n },\n getCurrentDirectory: () => env.getProjectRoot(),\n getDefaultLibFileName: tsModule.getDefaultLibFilePath,\n getNewLine: () => NEWLINE,\n useCaseSensitiveFileNames: () => true\n };\n }\n\n return {\n queryVirtualFileInfo,\n updateCurrentVirtualVueTextDocument,\n updateCurrentVueTextDocument,\n updateExternalDocument,\n getFileNames,\n getComplierOptions: () => compilerOptions,\n getLanguageService: () => jsLanguageService,\n dispose: () => {\n jsLanguageService.dispose();\n }\n };\n}\n\nfunction patchTemplateService(original: ts.LanguageService): ts.LanguageService {\n const allowedGlobals = new Set(globalScope);\n\n return {\n ...original,\n\n getCompletionsAtPosition(fileName, position, options) {\n const result = original.getCompletionsAtPosition(fileName, position, options);\n if (!result) {\n return;\n }\n\n if (result.isMemberCompletion) {\n return result;\n }\n\n return {\n ...result,\n\n entries: result.entries.filter(entry => {\n return allowedGlobals.has(entry.name);\n })\n };\n }\n };\n}\n\nfunction defaultIgnorePatterns(tsModule: RuntimeLibrary['typescript'], projectPath: string) {\n const nodeModules = ['node_modules', '**/node_modules/*'];\n const gitignore = tsModule.findConfigFile(projectPath, tsModule.sys.fileExists, '.gitignore');\n if (!gitignore) {\n return nodeModules;\n }\n try {\n const parsedGlobs = parseGitIgnore.globs(gitignore);\n const ignoreGlobs: string[] = flatten(\n parsedGlobs\n .filter((r: { type: 'ignore' | 'unignore' }) => r.type === 'ignore')\n .map((r: { patterns: string[] }) => r.patterns)\n );\n const filtered = ignoreGlobs.filter(s => !s.startsWith('!'));\n return nodeModules.concat(filtered);\n } catch (_) {\n return nodeModules;\n }\n}\n\nfunction getScriptKind(tsModule: RuntimeLibrary['typescript'], langId: string): ts.ScriptKind {\n return langId === 'typescript'\n ? tsModule.ScriptKind.TS\n : langId === 'tsx'\n ? tsModule.ScriptKind.TSX\n : tsModule.ScriptKind.JS;\n}\n\nfunction getParsedConfig(\n tsModule: RuntimeLibrary['typescript'],\n projectRoot: string,\n tsconfigPath: string | undefined\n) {\n const currentProjectPath = tsconfigPath ? dirname(tsconfigPath) : projectRoot;\n const configJson = (tsconfigPath && tsModule.readConfigFile(tsconfigPath, tsModule.sys.readFile).config) || {\n include: ['**/*.vue'],\n exclude: defaultIgnorePatterns(tsModule, currentProjectPath)\n };\n // existingOptions should be empty since it always takes priority\n return tsModule.parseJsonConfigFileContent(\n configJson,\n tsModule.sys,\n currentProjectPath,\n /*existingOptions*/ {},\n tsconfigPath,\n /*resolutionStack*/ undefined,\n [\n {\n extension: 'vue',\n isMixedContent: true,\n // Note: in order for parsed config to include *.vue files, scriptKind must be set to Deferred.\n // tslint:disable-next-line max-line-length\n // See: https://github.com/microsoft/TypeScript/blob/2106b07f22d6d8f2affe34b9869767fa5bc7a4d9/src/compiler/utilities.ts#L6356\n scriptKind: tsModule.ScriptKind.Deferred\n }\n ]\n );\n}\n", "import type ts from 'typescript';\nimport path from 'path';\nimport { parse } from 'vue-eslint-parser';\n\nimport { URI } from 'vscode-uri';\nimport { getVueDocumentRegions } from '../../embeddedSupport/embeddedSupport';\nimport { TextDocument } from 'vscode-languageserver-textdocument';\nimport {\n getTemplateTransformFunctions,\n componentHelperName,\n iterationHelperName,\n renderHelperName,\n componentDataName\n} from './transformTemplate';\nimport { templateSourceMap } from './serviceHost';\nimport { generateSourceMap } from './sourceMap';\nimport { isVirtualVueTemplateFile, isVueFile } from './util';\nimport { ChildComponent } from '../vueInfoService';\nimport { kebabCase, snakeCase } from 'lodash';\nimport { RuntimeLibrary } from '../dependencyService';\n\nconst importedComponentName = '__vlsComponent';\n\nexport function parseVueScript(text: string): string {\n const doc = TextDocument.create('test://test/test.vue', 'vue', 0, text);\n const regions = getVueDocumentRegions(doc);\n const script = regions.getSingleTypeDocument('script');\n return script.getText();\n}\n\nfunction parseVueScriptSrc(text: string): string | undefined {\n const doc = TextDocument.create('test://test/test.vue', 'vue', 0, text);\n const regions = getVueDocumentRegions(doc);\n return regions.getImportedScripts()[0];\n}\n\nexport function parseVueTemplate(text: string): string {\n const doc = TextDocument.create('test://test/test.vue', 'vue', 0, text);\n const regions = getVueDocumentRegions(doc);\n const template = regions.getSingleTypeDocument('template');\n\n if (template.languageId !== 'vue-html') {\n return '';\n }\n const rawText = template.getText();\n // skip checking on empty template\n if (rawText.replace(/\\s/g, '') === '') {\n return '';\n }\n return rawText.replace(/ {10}/, '<template>') + '</template>';\n}\n\nexport function createUpdater(\n tsModule: RuntimeLibrary['typescript'],\n allChildComponentsInfo: Map<string, ChildComponent[]>\n) {\n const clssf = tsModule.createLanguageServiceSourceFile;\n const ulssf = tsModule.updateLanguageServiceSourceFile;\n const scriptKindTracker = new WeakMap<ts.SourceFile, ts.ScriptKind | undefined>();\n const modificationTracker = new WeakSet<ts.SourceFile>();\n const printer = tsModule.createPrinter();\n\n function modifySourceFile(\n fileName: string,\n sourceFile: ts.SourceFile,\n scriptSnapshot: ts.IScriptSnapshot,\n version: string,\n scriptKind?: ts.ScriptKind\n ): void {\n if (modificationTracker.has(sourceFile)) {\n return;\n }\n\n if (isVueFile(fileName)) {\n modifyVueScript(tsModule, sourceFile);\n modificationTracker.add(sourceFile);\n return;\n }\n }\n\n /**\n * The transformed TS AST has synthetic nodes so language features would fail on them\n * Use printer to print the AST as re-parse the source to get a valid SourceFile\n */\n function recreateVueTemplateSourceFile(\n vueTemplateFileName: string,\n sourceFile: ts.SourceFile,\n scriptSnapshot: ts.IScriptSnapshot\n ) {\n // TODO: share the logic of transforming the code into AST\n // with the template mode\n const vueText = scriptSnapshot.getText(0, scriptSnapshot.getLength());\n const templateCode = parseVueTemplate(vueText);\n const scriptSrc = parseVueScriptSrc(vueText);\n const program = parse(templateCode, { sourceType: 'module' });\n\n const childComponentNames = allChildComponentsInfo.get(vueTemplateFileName)?.map(c => snakeCase(c.name));\n let expressions: ts.Expression[] = [];\n try {\n expressions = getTemplateTransformFunctions(tsModule, childComponentNames).transformTemplate(\n program,\n templateCode\n );\n injectVueTemplate(tsModule, sourceFile, expressions, scriptSrc);\n } catch (err) {\n console.log(`Failed to transform template of ${vueTemplateFileName}`);\n console.error((err as Error).stack);\n }\n\n let newText = printer.printFile(sourceFile);\n\n if (allChildComponentsInfo.has(vueTemplateFileName)) {\n const childComponents = allChildComponentsInfo.get(vueTemplateFileName)!;\n newText += convertChildComponentsInfoToSource(childComponents);\n }\n\n const newSourceFile = tsModule.createSourceFile(\n vueTemplateFileName,\n newText,\n sourceFile.languageVersion,\n true /* setParentNodes: Need this to walk the AST */,\n tsModule.ScriptKind.TS\n );\n // Assign version to the new template sourceFile to avoid re-processing\n // *internal* property\n (newSourceFile as any).version = (sourceFile as any).version;\n (newSourceFile as any).scriptSnapshot = {\n getText: (start: number, end: number) => newText.substring(start, end),\n getLength: () => newText.length,\n getChangeRange: () => void 0\n };\n\n const templateFsPath = URI.file(vueTemplateFileName).fsPath;\n const sourceMapNodes = generateSourceMap(tsModule, sourceFile, newSourceFile);\n templateSourceMap[templateFsPath] = sourceMapNodes;\n templateSourceMap[templateFsPath.slice(0, -'.template'.length)] = sourceMapNodes;\n\n return newSourceFile;\n }\n\n function createLanguageServiceSourceFile(\n fileName: string,\n scriptSnapshot: ts.IScriptSnapshot,\n scriptTarget: ts.ScriptTarget,\n version: string,\n setNodeParents: boolean,\n scriptKind?: ts.ScriptKind\n ): ts.SourceFile {\n let sourceFile = clssf(fileName, scriptSnapshot, scriptTarget, version, setNodeParents, scriptKind);\n scriptKindTracker.set(sourceFile, scriptKind);\n if (isVirtualVueTemplateFile(fileName)) {\n sourceFile = recreateVueTemplateSourceFile(fileName, sourceFile, scriptSnapshot);\n modificationTracker.add(sourceFile);\n } else {\n modifySourceFile(fileName, sourceFile, scriptSnapshot, version, scriptKind);\n }\n return sourceFile;\n }\n\n function updateLanguageServiceSourceFile(\n sourceFile: ts.SourceFile,\n scriptSnapshot: ts.IScriptSnapshot,\n version: string,\n textChangeRange: ts.TextChangeRange,\n aggressiveChecks?: boolean\n ): ts.SourceFile {\n const scriptKind = scriptKindTracker.get(sourceFile);\n sourceFile = ulssf(sourceFile, scriptSnapshot, version, textChangeRange, aggressiveChecks);\n if (isVirtualVueTemplateFile(sourceFile.fileName)) {\n sourceFile = recreateVueTemplateSourceFile(sourceFile.fileName, sourceFile, scriptSnapshot);\n modificationTracker.add(sourceFile);\n } else {\n modifySourceFile(sourceFile.fileName, sourceFile, scriptSnapshot, version, scriptKind);\n }\n return sourceFile;\n }\n\n return {\n createLanguageServiceSourceFile,\n updateLanguageServiceSourceFile\n };\n}\n\nfunction modifyVueScript(tsModule: RuntimeLibrary['typescript'], sourceFile: ts.SourceFile): void {\n const exportDefaultObject = sourceFile.statements.find(\n st =>\n st.kind === tsModule.SyntaxKind.ExportAssignment &&\n (st as ts.ExportAssignment).expression.kind === tsModule.SyntaxKind.ObjectLiteralExpression\n ) as ts.ExportAssignment;\n if (exportDefaultObject) {\n // 1. add `import Vue from 'vue'\n // (the span of the inserted statement must be (0,0) to avoid overlapping existing statements)\n const setZeroPos = getWrapperRangeSetter(tsModule, { pos: 0, end: 0 });\n const vueImport = setZeroPos(\n createImportDeclaration(\n tsModule,\n undefined,\n undefined,\n setZeroPos(tsModule.createImportClause(tsModule.createIdentifier('__vueEditorBridge'), undefined as any)),\n setZeroPos(tsModule.createLiteral('vue-editor-bridge'))\n )\n );\n const statements: Array<ts.Statement> = sourceFile.statements as any;\n statements.unshift(vueImport);\n\n // 2. find the export default and wrap it in `__vueEditorBridge(...)` if it exists and is an object literal\n // (the span of the function construct call and *all* its members must be the same as the object literal it wraps)\n const objectLiteral = (exportDefaultObject as ts.ExportAssignment).expression as ts.ObjectLiteralExpression;\n const setObjPos = getWrapperRangeSetter(tsModule, objectLiteral);\n const vue = tsModule.setTextRange(tsModule.createIdentifier('__vueEditorBridge'), {\n pos: objectLiteral.pos,\n end: objectLiteral.pos + 1\n });\n (exportDefaultObject as any).expression = setObjPos(tsModule.createCall(vue, undefined, [objectLiteral]));\n setObjPos((exportDefaultObject.expression as ts.CallExpression).arguments!);\n } else {\n // @ts-expect-error\n sourceFile.externalModuleIndicator = createExportAssignment(\n tsModule,\n undefined,\n undefined,\n tsModule.createCall(tsModule.createIdentifier('__vueEditorBridge'), undefined, [tsModule.createObjectLiteral([])])\n );\n }\n}\n\n/**\n * Wrap render function with component options in the script block\n * to validate its types\n */\nexport function injectVueTemplate(\n tsModule: RuntimeLibrary['typescript'],\n sourceFile: ts.SourceFile,\n renderBlock: ts.Expression[],\n scriptSrc?: string\n): void {\n // add import statement for corresponding Vue file\n // so that we acquire the component type from it.\n let componentFilePath: string;\n\n if (scriptSrc) {\n // When script block refers external file (<script src=\"./MyComp.ts\"></script>).\n // We need to strip `.ts` suffix to avoid a compilation error.\n componentFilePath = scriptSrc.replace(/\\.ts$/, '');\n } else {\n // Importing original `.vue` file will get component type when the script is written by inline.\n componentFilePath = './' + path.basename(sourceFile.fileName.slice(0, -'.template'.length));\n }\n\n const componentImport = createImportDeclaration(\n tsModule,\n undefined,\n undefined,\n tsModule.createImportClause(tsModule.createIdentifier(importedComponentName), undefined),\n tsModule.createLiteral(componentFilePath)\n );\n\n const createImportSpecifier = (name: string) => {\n const [major, minor] = tsModule.version.split('.');\n if ((Number(major) === 4 && Number(minor) >= 5) || Number(major) > 4) {\n return tsModule.createImportSpecifier(false, undefined, tsModule.createIdentifier(name));\n }\n // @ts-expect-error\n return tsModule.createImportSpecifier(undefined, tsModule.createIdentifier(name));\n };\n\n // import helper type to handle Vue's private methods\n const helperImport = createImportDeclaration(\n tsModule,\n undefined,\n undefined,\n tsModule.createImportClause(\n undefined,\n tsModule.createNamedImports([\n createImportSpecifier(renderHelperName),\n createImportSpecifier(componentHelperName),\n createImportSpecifier(iterationHelperName),\n createImportSpecifier(componentDataName)\n ])\n ),\n tsModule.createLiteral('vue-editor-bridge')\n );\n\n // wrap render code with a function decralation\n // with `this` type of component.\n const statements = renderBlock.map(exp => tsModule.createExpressionStatement(exp));\n const renderElement = tsModule.createExpressionStatement(\n tsModule.createCall(tsModule.createIdentifier(renderHelperName), undefined, [\n // Reference to the component\n tsModule.createIdentifier(importedComponentName),\n // A function simulating the render function\n tsModule.createFunctionExpression(\n undefined,\n undefined,\n undefined,\n undefined,\n [],\n undefined,\n tsModule.createBlock(statements)\n )\n ])\n );\n\n // replace the original statements with wrapped code.\n (sourceFile as any).statements = tsModule.createNodeArray([componentImport, helperImport, renderElement]);\n\n // Update external module indicator to the transformed template node,\n // otherwise symbols in this template (e.g. __Component) will be put\n // into global namespace and it causes duplicated identifier error.\n (sourceFile as any).externalModuleIndicator = componentImport;\n}\n\nfunction createImportDeclaration(\n tsModule: RuntimeLibrary['typescript'],\n decorators: readonly ts.Decorator[] | undefined,\n modifiers: readonly ts.Modifier[] | undefined,\n importClause: ts.ImportClause | undefined,\n moduleSpecifier: ts.Expression\n) {\n const [major, minor] = tsModule.version.split('.');\n if ((Number(major) === 4 && Number(minor) >= 8) || Number(major) > 4) {\n return tsModule.factory.createImportDeclaration(decorators, modifiers, importClause, moduleSpecifier);\n }\n return tsModule.createImportDeclaration(decorators, modifiers, importClause, moduleSpecifier);\n}\n\nfunction createExportAssignment(\n tsModule: RuntimeLibrary['typescript'],\n modifiers: readonly ts.Modifier[] | undefined,\n isExportEquals: boolean | undefined,\n expression: ts.Expression\n) {\n const [major, minor] = tsModule.version.split('.');\n if ((Number(major) === 4 && Number(minor) >= 8) || Number(major) > 4) {\n return tsModule.factory.createExportAssignment(modifiers, isExportEquals, expression);\n }\n // @ts-expect-error\n return tsModule.createExportAssignment(modifiers, isExportEquals, undefined, expression);\n}\n\n/** Create a function that calls setTextRange on synthetic wrapper nodes that need a valid range */\nfunction getWrapperRangeSetter(\n tsModule: RuntimeLibrary['typescript'],\n wrapped: ts.TextRange\n): <T extends ts.TextRange>(wrapperNode: T) => T {\n return wrapperNode => tsModule.setTextRange(wrapperNode, wrapped);\n}\n\nfunction convertChildComponentsInfoToSource(childComponents: ChildComponent[]) {\n let src = '';\n childComponents.forEach(c => {\n const componentDataInterfaceName = componentDataName + '__' + snakeCase(c.name);\n const componentHelperInterfaceName = componentHelperName + '__' + snakeCase(c.name);\n\n const propTypeStrings: string[] = [];\n c.info?.componentInfo.props?.forEach(p => {\n let typeKey = kebabCase(p.name);\n if (typeKey.includes('-')) {\n typeKey = `'` + typeKey + `'`;\n }\n if (!p.required) {\n typeKey += '?';\n }\n\n if (p.typeString) {\n propTypeStrings.push(`${typeKey}: ${p.typeString}`);\n } else {\n propTypeStrings.push(`${typeKey}: any`);\n }\n });\n propTypeStrings.push('[other: string]: any');\n\n const onTypeStrings: string[] = [];\n c.info?.componentInfo.emits?.forEach(e => {\n let typeKey = kebabCase(e.name);\n if (typeKey.includes('-')) {\n typeKey = `'` + typeKey + `'`;\n }\n typeKey += '?';\n\n if (e.typeString) {\n onTypeStrings.push(`${typeKey}: ($event: any) => (${e.typeString})`);\n } else {\n onTypeStrings.push(`${typeKey}: ($event: any) => any`);\n }\n });\n\n src += `\ninterface ${componentDataInterfaceName}<T, TH> extends ${componentDataName}<T, TH> {\n props: { ${propTypeStrings.join(', ')} }\n on: { ${onTypeStrings.join(', ')} } & { [K in keyof T]?: (this: TH, $event: T[K]) => any; }\n}\ndeclare const ${componentHelperInterfaceName}: {\n <T>(\n vm: T,\n tag: string,\n data: ${componentDataInterfaceName}<Record<string, any>, T> & ThisType<T>,\n children: any[]\n ): any\n}`;\n });\n\n return src;\n}\n", "import { kebabCase, snakeCase } from 'lodash';\nimport type ts from 'typescript';\nimport { AST } from 'vue-eslint-parser';\nimport { RuntimeLibrary } from '../dependencyService';\nimport { walkExpression } from './walkExpression';\n\nexport const renderHelperName = '__vlsRenderHelper';\nexport const componentHelperName = '__vlsComponentHelper';\nexport const iterationHelperName = '__vlsIterationHelper';\nexport const componentDataName = '__vlsComponentData';\n\n/**\n * Allowed global variables in templates.\n * Borrowed from: https://github.com/vuejs/vue/blob/dev/src/core/instance/proxy.js\n */\nexport const globalScope = (\n 'Infinity,undefined,NaN,isFinite,isNaN,' +\n 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +\n 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +\n 'require'\n).split(',');\n\nconst vOnScope = ['$event', 'arguments'];\n\ntype ESLintVChild = AST.VElement | AST.VExpressionContainer | AST.VText;\n\n/**\n * @param tsModule Loaded TS dependency\n * @param childComponentNamesInSnakeCase If `VElement`'s name matches one of the child components'\n * name, generate expression with `${componentHelperName}__${name}`, which will enforce type-check\n * on props\n */\nexport function getTemplateTransformFunctions(\n tsModule: RuntimeLibrary['typescript'],\n childComponentNamesInSnakeCase?: string[]\n) {\n return {\n transformTemplate,\n parseExpression\n };\n\n /**\n * Transform template AST to TypeScript AST.\n * Note: The returned TS AST is not compatible with\n * the regular Vue render function and does not work on runtime\n * because we just need type information for the template.\n * Each TypeScript node should be set a range because\n * the compiler may clash or do incorrect type inference\n * when it has an invalid range.\n */\n function transformTemplate(program: AST.ESLintProgram, code: string) {\n const template = program.templateBody;\n\n if (!template) {\n return [];\n }\n\n return transformChildren(template.children, code, globalScope);\n }\n\n /**\n * Transform an HTML to TypeScript AST.\n * It will be a call expression like Vue's $createElement.\n * e.g.\n * __vlsComponentHelper('div', { props: { title: this.foo } }, [ ...children... ]);\n */\n function transformElement(node: AST.VElement, code: string, scope: string[]): ts.Expression {\n /**\n * `vModel` -> need info from other components to do type check\n * `v-bind` -> do this later\n * `v-bind:[foo] -> don't do type-check. do make `[]` an interpolation area\n */\n const hasUnhandledAttributes = node.startTag.attributes.some(attr => {\n return isVModel(attr) || (isVBind(attr) && !isVBindShorthand(attr)) || isVBindWithDynamicAttributeName(attr);\n });\n\n const identifier =\n !hasUnhandledAttributes &&\n childComponentNamesInSnakeCase &&\n childComponentNamesInSnakeCase.indexOf(snakeCase(node.rawName)) !== -1\n ? tsModule.createIdentifier(componentHelperName + '__' + snakeCase(node.rawName))\n : tsModule.createIdentifier(componentHelperName);\n\n return tsModule.createCall(identifier, undefined, [\n // Pass this value to propagate ThisType in listener handlers\n tsModule.createIdentifier('this'),\n\n // Element / Component name\n tsModule.createLiteral(node.name),\n\n // Attributes / Directives\n transformAttributes(node, node.startTag.attributes, code, scope),\n\n // Children\n tsModule.createArrayLiteral(transformChildren(node.children, code, scope))\n ]);\n }\n\n function transformAttributes(\n node: AST.VElement,\n attrs: (AST.VAttribute | AST.VDirective)[],\n code: string,\n scope: string[]\n ): ts.Expression {\n interface AttributeData {\n props: ts.ObjectLiteralElementLike[];\n on: ts.ObjectLiteralElementLike[];\n directives: ts.Expression[];\n }\n\n const data: AttributeData = {\n props: [],\n on: [],\n directives: []\n };\n\n attrs.forEach(attr => {\n // Normal attributes\n // e.g. title=\"title\"\n if (isVAttribute(attr)) {\n const name = attr.key.name;\n\n // Skip style and class because there may be v-bind for the same attribute which\n // occurs duplicate property name error.\n // Since native attribute value is not JS expression, we don't have to check it.\n if (name !== 'class' && name !== 'style') {\n data.props.push(transformNativeAttribute(attr));\n }\n return;\n }\n\n // v-bind directives\n // e.g. :class=\"{ selected: foo }\"\n if (isVBind(attr)) {\n data.props.push(transformVBind(attr, code, scope));\n return;\n }\n\n // v-on directives\n // e.g. @click=\"onClick\"\n if (isVOn(attr)) {\n data.on.push(transformVOn(attr, code, scope));\n return;\n }\n\n // Skip v-slot, v-for and v-if family directive (handled in `transformChildren`)\n if (isVSlot(attr) || isVFor(attr) || isVIf(attr) || isVElseIf(attr) || isVElse(attr)) {\n return;\n }\n\n // Other directives\n const exp = transformDirective(attr, code, scope);\n if (exp) {\n data.directives.push(...exp);\n }\n });\n\n // Fold all AST into VNodeData-like object\n // example output:\n // {\n // props: { class: 'title' },\n // on: { click: __vlsListenerHelper(this, function($event) { this.onClick($event) } }\n // }\n const propsAssignment = tsModule.createPropertyAssignment('props', tsModule.createObjectLiteral(data.props));\n tsModule.setSourceMapRange(propsAssignment.name, {\n pos: node.startTag.range[0] + '<'.length,\n end: node.startTag.range[0] + '<'.length + node.rawName.length\n });\n\n return tsModule.createObjectLiteral([\n propsAssignment,\n tsModule.createPropertyAssignment('on', tsModule.createObjectLiteral(data.on)),\n tsModule.createPropertyAssignment('directives', tsModule.createArrayLiteral(data.directives))\n ]);\n }\n\n function transformNativeAttribute(attr: AST.VAttribute): ts.ObjectLiteralElementLike {\n return tsModule.createPropertyAssignment(\n tsModule.createStringLiteral(attr.key.name),\n attr.value ? tsModule.createLiteral(attr.value.value) : tsModule.createLiteral(true)\n );\n }\n\n function transformVBind(vBind: AST.VDirective, code: string, scope: string[]): ts.ObjectLiteralElementLike {\n const exp = vBind.value ? transformExpressionContainer(vBind.value, code, scope) : tsModule.createLiteral(true);\n return directiveToObjectElement(vBind, exp, code, scope);\n }\n\n function transformVOn(vOn: AST.VDirective, code: string, scope: string[]): ts.ObjectLiteralElementLike {\n let exp: ts.Expression;\n if (vOn.value) {\n if (!vOn.key.argument) {\n // e.g.\n // v-on=\"$listeners\"\n\n // Annotate the expression with `any` because we do not expect type error\n // with bridge type and it. Currently, bridge type should only be used\n // for inferring `$event` type.\n exp = tsModule.createAsExpression(\n transformExpressionContainer(vOn.value, code, scope),\n tsModule.createKeywordTypeNode(tsModule.SyntaxKind.AnyKeyword)\n );\n } else {\n // e.g.\n // @click=\"onClick\"\n // @click=\"onClick($event, 'test')\"\n\n // value.expression can be ESLintExpression (e.g. ArrowFunctionExpression)\n const vOnExp = vOn.value.expression as AST.VOnExpression | AST.ESLintExpression | null;\n const newScope = scope.concat(vOnScope);\n const statements =\n !vOnExp || vOnExp.type !== 'VOnExpression'\n ? [tsModule.createReturn(transformExpressionContainer(vOn.value, code, newScope))]\n : vOnExp.body.map(st => transformStatement(st, code, newScope));\n\n const createParameter = (name: string) => {\n const [major, minor] = tsModule.version.split('.');\n if ((Number(major) === 4 && Number(minor) >= 8) || Number(major) > 4) {\n return tsModule.createParameter(undefined, undefined, name);\n }\n return tsModule.createParameter(undefined, undefined, undefined, name);\n };\n\n exp = tsModule.createFunctionExpression(\n undefined,\n undefined,\n undefined,\n undefined,\n [createParameter('$event')],\n undefined,\n tsModule.createBlock(statements)\n );\n }\n } else {\n // There are no statement in v-on value\n exp = tsModule.createFunctionExpression(\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n tsModule.createBlock([])\n );\n }\n return directiveToObjectElement(vOn, exp, code, scope);\n }\n\n /**\n * To transform v-bind and v-on directive\n */\n function directiveToObjectElement(\n dir: AST.VDirective,\n dirExp: ts.Expression,\n code: string,\n scope: string[]\n ): ts.ObjectLiteralElementLike {\n const name = dir.key.argument;\n\n if (name) {\n if (name.type === 'VIdentifier') {\n // Attribute name is specified\n // e.g. v-bind:value=\"foo\"\n const fullName =\n dir.key.modifiers.length === 0 || isVBind(dir)\n ? kebabCase(name.rawName)\n : [kebabCase(name.rawName), ...dir.key.modifiers.map(m => m.rawName)].join('.');\n const propNameNode = tsModule.setSourceMapRange(tsModule.createStringLiteral(fullName), {\n pos: name.range[0],\n end: name.range[1]\n });\n return tsModule.createPropertyAssignment(propNameNode, dirExp);\n } else {\n // Attribute name is dynamic\n // e.g. v-bind:[value]=\"foo\"\n const propertyName = tsModule.createComputedPropertyName(transformExpressionContainer(name, code, scope));\n return tsModule.createPropertyAssignment(propertyName, dirExp);\n }\n } else {\n // Attribute name is omitted\n // e.g. v-bind=\"{ value: foo }\"\n return tsModule.createSpreadAssignment(dirExp);\n }\n }\n\n /**\n * Return directive expression. May include dynamic argument expression.\n */\n function transformDirective(dir: AST.VDirective, code: string, scope: string[]): ts.Expression[] {\n const res: ts.Expression[] = [];\n\n if (dir.key.argument && dir.key.argument.type === 'VExpressionContainer') {\n res.push(transformExpressionContainer(dir.key.argument, code, scope));\n }\n\n if (dir.value) {\n res.push(transformExpressionContainer(dir.value, code, scope));\n }\n\n return res;\n }\n\n function transformChildren(children: ESLintVChild[], code: string, originalScope: string[]): ts.Expression[] {\n type ChildData = VIfFamilyData | VForData | VSlotData | NodeData;\n\n /**\n * For v-if, v-else-if and v-else\n */\n interface VIfFamilyData {\n type: 'v-if-family';\n data: ChildData;\n directive: AST.VDirective;\n next?: VIfFamilyData;\n }\n\n interface VForData {\n type: 'v-for';\n data: ChildData;\n vFor: AST.VDirective;\n scope: string[];\n }\n\n interface VSlotData {\n type: 'v-slot';\n data: ChildData;\n vSlot: AST.VDirective;\n scope: string[];\n }\n\n interface NodeData {\n type: 'node';\n data: ESLintVChild;\n }\n\n // Pre-transform child nodes to make further transformation easier\n function preTransform(children: ESLintVChild[]): ChildData[] {\n const queue = children.slice();\n\n function element(el: AST.VElement, attrs: (AST.VAttribute | AST.VDirective)[]): ChildData {\n const vSlot = attrs.find(isVSlot);\n if (vSlot && isVDirective(vSlot)) {\n const index = attrs.indexOf(vSlot);\n const scope = el.variables.filter(v => v.kind === 'scope').map(v => v.id.name);\n\n return {\n type: 'v-slot',\n vSlot,\n data: element(el, [...attrs.slice(0, index), ...attrs.slice(index + 1)]),\n scope\n };\n }\n\n // v-for has higher priority than v-if\n // https://vuejs.org/v2/guide/list.html#v-for-with-v-if\n const vFor = attrs.find(isVFor);\n if (vFor && isVDirective(vFor)) {\n const index = attrs.indexOf(vFor);\n const scope = el.variables.filter(v => v.kind === 'v-for').map(v => v.id.name);\n\n return {\n type: 'v-for',\n vFor,\n data: element(el, [...attrs.slice(0, index), ...attrs.slice(index + 1)]),\n scope\n };\n }\n\n const vIf = attrs.find(isVIf);\n if (vIf && isVDirective(vIf)) {\n const index = attrs.indexOf(vIf);\n return {\n type: 'v-if-family',\n directive: vIf,\n data: element(el, [...attrs.slice(0, index), ...attrs.slice(index + 1)]),\n next: followVIf()\n };\n }\n\n return {\n type: 'node',\n data: el\n };\n }\n\n function followVIf(): VIfFamilyData | undefined {\n const el = queue[0];\n if (!el || el.type !== 'VElement') {\n return undefined;\n }\n\n const attrs = el.startTag.attributes;\n const directive = attrs.find(isVElseIf) || attrs.find(isVElse);\n\n if (!directive || !isVDirective(directive)) {\n return undefined;\n }\n\n queue.shift();\n return {\n type: 'v-if-family',\n directive,\n data: element(el, attrs),\n next: followVIf()\n };\n }\n\n function loop(acc: ChildData[]): ChildData[] {\n const target = queue.shift();\n if (!target) {\n return acc;\n }\n\n if (target.type !== 'VElement') {\n return loop(\n acc.concat({\n type: 'node',\n data: target\n })\n );\n }\n\n return loop(acc.concat(element(target, target.startTag.attributes)));\n }\n\n return loop([]);\n }\n\n function mainTransform(children: ChildData[]): ts.Expression[] {\n function genericTransform(child: ChildData, scope: string[]): ts.Expression {\n switch (child.type) {\n case 'v-for':\n return vForTransform(child, scope);\n case 'v-if-family':\n return vIfFamilyTransform(child, scope);\n case 'v-slot':\n return vSlotTransform(child, scope);\n case 'node':\n return nodeTransform(child, scope);\n }\n }\n\n function vIfFamilyTransform(vIfFamily: VIfFamilyData, scope: string[]): ts.Expression {\n const dir = vIfFamily.directive;\n\n const condition = dir.value\n ? transformExpressionContainer(dir.value, code, scope)\n : tsModule.createLiteral(true);\n const next = vIfFamily.next ? vIfFamilyTransform(vIfFamily.next, scope) : tsModule.createLiteral(true);\n\n return tsModule.createConditional(\n // v-if or v-else-if condition\n condition,\n\n // element that the v-if family directive belongs to\n genericTransform(vIfFamily.data, scope),\n\n // next sibling element of v-if or v-else if any\n next\n );\n }\n\n function vForTransform(vForData: VForData, scope: string[]): ts.Expression {\n const vFor = vForData.vFor;\n if (!vFor.value || !vFor.value.expression) {\n return genericTransform(vForData.data, scope);\n }\n\n // Convert v-for directive to the iteration helper\n const exp = vFor.value.expression as AST.VForExpression;\n const newScope = scope.concat(vForData.scope);\n\n return tsModule.createCall(tsModule.createIdentifier(iterationHelperName), undefined, [\n // Iteration target\n transformExpression(exp.right, code, scope),\n\n // Callback\n\n tsModule.createArrowFunction(\n undefined,\n undefined,\n parseParams(exp.left, code, scope),\n undefined,\n tsModule.createToken(tsModule.SyntaxKind.EqualsGreaterThanToken),\n genericTransform(vForData.data, newScope)\n )\n ]);\n }\n\n function vSlotTransform(vSlotData: VSlotData, scope: string[]): ts.Expression {\n const vSlot = vSlotData.vSlot;\n if (!vSlot.value || !vSlot.value.expression) {\n return genericTransform(vSlotData.data, scope);\n }\n\n const exp = vSlot.value.expression as AST.VSlotScopeExpression;\n const newScope = scope.concat(vSlotData.scope);\n\n return tsModule.createArrowFunction(\n undefined,\n undefined,\n parseParams(exp.params, code, scope),\n undefined,\n tsModule.createToken(tsModule.SyntaxKind.EqualsGreaterThanToken),\n genericTransform(vSlotData.data, newScope)\n );\n }\n\n function nodeTransform(nodeData: NodeData, scope: string[]): ts.Expression {\n const child = nodeData.data;\n switch (child.type) {\n case 'VElement':\n return transformElement(child, code, scope);\n case 'VExpressionContainer':\n return transformExpressionContainer(child, code, scope);\n case 'VText':\n return tsModule.createLiteral(child.value);\n }\n }\n\n return children.map(child => genericTransform(child, originalScope));\n }\n\n // Remove whitespace nodes\n const filtered = children.filter(child => {\n return child.type !== 'VText' || child.value.trim() !== '';\n });\n\n return mainTransform(preTransform(filtered));\n }\n\n function transformStatement(statement: AST.ESLintStatement, code: string, scope: string[]): ts.Statement {\n if (statement.type !== 'ExpressionStatement') {\n console.error('Unexpected statement type:', statement.type);\n return tsModule.createExpressionStatement(tsModule.createLiteral(''));\n }\n\n return tsModule.createExpressionStatement(transformExpression(statement.expression, code, scope));\n }\n\n function transformFilter(filter: AST.VFilterSequenceExpression, code: string, scope: string[]): ts.Expression {\n const exp = transformExpression(filter.expression, code, scope);\n\n // Simply convert all filter arguments into array literal because\n // we just want to check their types.\n // Do not care about existence of filters and matching between parameter\n // and argument types because filters will not appear on component type.\n const filterExps = tsModule.createArrayLiteral(\n filter.filters.map(f => {\n return tsModule.createArrayLiteral(\n f.arguments.map(arg => {\n const exp = arg.type === 'SpreadElement' ? arg.argument : arg;\n return transformExpression(exp, code, scope);\n })\n );\n })\n );\n\n return tsModule.createBinary(filterExps, tsModule.SyntaxKind.BarBarToken, exp);\n }\n\n function transformExpressionContainer(\n container: AST.VExpressionContainer,\n code: string,\n scope: string[]\n ): ts.Expression {\n const exp = container.expression;\n if (exp) {\n if (exp.type === 'VOnExpression' || exp.type === 'VForExpression' || exp.type === 'VSlotScopeExpression') {\n throw new Error(`'${exp.type}' should not be transformed with 'transformExpressionContainer'`);\n }\n\n if (exp.type === 'VFilterSequenceExpression') {\n return transformFilter(exp, code, scope);\n }\n }\n\n // Other type of expression should parsed by TypeScript compiler\n const [start, end] = expressionCodeRange(container);\n const expStr = code.slice(start, end);\n\n return parseExpression(expStr, scope, start);\n }\n\n function transformExpression(exp: AST.ESLintExpression, code: string, scope: string[]): ts.Expression {\n const [start, end] = exp.range;\n const expStr = code.slice(start, end);\n\n return parseExpression(expStr, scope, start);\n }\n\n function parseExpression(exp: string, scope: string[], start: number): ts.Expression {\n // Add parenthesis to deal with object literal expression\n const wrappedExp = '(' + exp + ')';\n const source = tsModule.createSourceFile('/tmp/parsed.ts', wrappedExp, tsModule.ScriptTarget.Latest, true);\n const statement = source.statements[0];\n\n if (!statement || !tsModule.isExpressionStatement(statement)) {\n console.error('Unexpected statement kind:', statement.kind);\n return tsModule.createLiteral('');\n }\n\n const parenthesis = statement.expression as ts.ParenthesizedExpression;\n\n // Compensate for the added `(` that adds 1 to each Node's offset\n const offset = start - '('.length;\n return walkExpression(tsModule, parenthesis.expression, createWalkCallback(scope, offset, source));\n }\n\n function expressionCodeRange(container: AST.VExpressionContainer): [number, number] {\n const parent = container.parent;\n const offset =\n parent.type === 'VElement' || parent.type === 'VDocumentFragment'\n ? // Text node interpolation\n // {{ exp }} => 2\n 2\n : // Attribute interpolation\n // v-test:[exp] => 1\n // :name=\"exp\" => 1\n 1;\n\n return [container.range[0] + offset, container.range[1] - offset];\n }\n\n function createWalkCallback(scope: string[], offset: number, source: ts.SourceFile) {\n return (node: ts.Expression, additionalScope: ts.Identifier[]) => {\n const thisScope = scope.concat(additionalScope.map(id => id.text));\n\n const injected = injectThis(node, thisScope, offset, source);\n setSourceMapRange(injected, node, offset, source);\n resetTextRange(injected);\n return injected;\n };\n }\n\n function parseParams(\n params: AST.ESLintPattern[],\n code: string,\n scope: string[]\n ): ts.NodeArray<ts.ParameterDeclaration> {\n const start = params[0].range[0];\n const end = params[params.length - 1].range[1];\n const paramsStr = code.slice(start, end);\n // Wrap parameters with an arrow function to extract them as ts parameter declarations.\n const arrowFnStr = '(' + paramsStr + ') => {}';\n\n // Decrement the offset since the expression now has the open parenthesis.\n const exp = parseExpression(arrowFnStr, scope, start - 1) as ts.ArrowFunction;\n return exp.parameters;\n }\n\n function injectThis(exp: ts.Expression, scope: string[], start: number, source: ts.SourceFile): ts.Expression {\n if (tsModule.isIdentifier(exp)) {\n return scope.indexOf(exp.text) < 0 ? tsModule.createPropertyAccess(tsModule.createThis(), exp) : exp;\n }\n\n if (tsModule.isObjectLiteralExpression(exp)) {\n const properties = exp.properties.map(p => {\n if (!tsModule.isShorthandPropertyAssignment(p)) {\n return p;\n }\n\n // Divide short hand property to name and initializer and inject `this`\n // We need to walk generated initializer expression.\n const initializer = createWalkCallback(scope, start, source)(p.name, []);\n return tsModule.createPropertyAssignment(p.name, initializer);\n });\n return tsModule.createObjectLiteral(properties);\n }\n\n return exp;\n }\n\n function setSourceMapRange(exp: ts.Expression, range: ts.Expression, offset: number, source: ts.SourceFile): void {\n tsModule.setSourceMapRange(exp, {\n pos: offset + range.getStart(source),\n end: offset + range.getEnd()\n });\n\n if (tsModule.isPropertyAccessExpression(exp)) {\n // May be transformed from Identifier by injecting `this`\n const r = tsModule.isPropertyAccessExpression(range) ? range.name : range;\n tsModule.setSourceMapRange(exp.name, {\n pos: offset + r.getStart(source),\n end: offset + r.getEnd()\n });\n return;\n }\n\n if (tsModule.isArrowFunction(exp)) {\n const walkBinding = (name: ts.BindingName, range: ts.BindingName) => {\n tsModule.setSourceMapRange(name, {\n pos: offset + range.getStart(source),\n end: offset + range.getEnd()\n });\n\n if (tsModule.isObjectBindingPattern(name) || tsModule.isArrayBindingPattern(name)) {\n name.elements.forEach((el, i) => {\n if (tsModule.isOmittedExpression(el)) {\n return;\n }\n const elRange = (range as typeof name).elements[i] as typeof el;\n\n tsModule.setSourceMapRange(el, {\n pos: offset + elRange.getStart(source),\n end: offset + elRange.getEnd()\n });\n\n walkBinding(el.name, elRange.name);\n });\n }\n };\n\n const r = range as ts.ArrowFunction;\n exp.parameters.forEach((p, i) => {\n const range = r.parameters[i];\n tsModule.setSourceMapRange(p, {\n pos: offset + range.getStart(source),\n end: offset + range.getEnd()\n });\n\n walkBinding(p.name, range.name);\n });\n }\n }\n\n /**\n * Because Nodes can have non-virtual positions\n * Set them to synthetic positions so printers could print correctly\n */\n function resetTextRange(exp: ts.Expression): void {\n if (tsModule.isObjectLiteralExpression(exp)) {\n exp.properties.forEach((p, i) => {\n if (tsModule.isPropertyAssignment(p) && !tsModule.isComputedPropertyName(p.name)) {\n tsModule.setTextRange(p.name, {\n pos: -1,\n end: -1\n });\n }\n });\n }\n\n if (tsModule.isTemplateExpression(exp)) {\n tsModule.setTextRange(exp.head, { pos: -1, end: -1 });\n exp.templateSpans.forEach(span => {\n tsModule.setTextRange(span.literal, {\n pos: -1,\n end: -1\n });\n });\n }\n\n tsModule.setTextRange(exp, { pos: -1, end: -1 });\n }\n\n function isVAttribute(node: AST.VAttribute | AST.VDirective): node is AST.VAttribute {\n return !node.directive;\n }\n\n function isVDirective(node: AST.VAttribute | AST.VDirective): node is AST.VDirective {\n return node.directive;\n }\n\n function isVModel(node: AST.VAttribute | AST.VDirective): boolean {\n return node.directive && node.key.name.name === 'model';\n }\n\n function isVBind(node: AST.VAttribute | AST.VDirective): boolean {\n return node.directive && node.key.name.name === 'bind';\n }\n\n function isVBindShorthand(node: AST.VAttribute | AST.VDirective): boolean {\n return node.directive && node.key.name.name === 'bind' && node.key.name.rawName === ':';\n }\n\n function isVBindWithDynamicAttributeName(node: AST.VAttribute | AST.VDirective): boolean {\n return node.directive && node.key.argument?.type === 'VExpressionContainer';\n }\n\n function isVOn(node: AST.VAttribute | AST.VDirective): boolean {\n return node.directive && node.key.name.name === 'on';\n }\n\n function isVIf(node: AST.VAttribute | AST.VDirective): boolean {\n return node.directive && node.key.name.name === 'if';\n }\n\n function isVElseIf(node: AST.VAttribute | AST.VDirective): boolean {\n return node.directive && node.key.name.name === 'else-if';\n }\n\n function isVElse(node: AST.VAttribute | AST.VDirective): boolean {\n return node.directive && node.key.name.name === 'else';\n }\n\n function isVFor(node: AST.VAttribute | AST.VDirective): boolean {\n return node.directive && node.key.name.name === 'for';\n }\n\n function isVSlot(node: AST.VAttribute | AST.VDirective): boolean {\n return node.directive && (node.key.name.name === 'slot' || node.key.name.name === 'slot-scope');\n }\n}\n", "import type ts from 'typescript';\nimport { RuntimeLibrary } from '../dependencyService';\n\ntype NodeChanges<T extends ts.Node> = { [K in keyof T]?: T[K] | ts.Node | ts.NodeArray<ts.Node> };\n\n/**\n * Walk all descendant expressions included root node naively. Not comprehensive walker.\n * Traversal type is post-order (LRN).\n * If some expression node is returned in predicate function, the node will be replaced.\n */\nexport function walkExpression(\n tsModule: RuntimeLibrary['typescript'],\n root: ts.Expression,\n predicate: (node: ts.Expression, additionalScope: ts.Identifier[]) => ts.Expression | void\n): ts.Expression {\n function visit(node: ts.Expression, scope: ts.Identifier[]): ts.Expression {\n return predicate(node, scope) || node;\n }\n\n function update<T extends ts.Node>(changes: NodeChanges<T>, original: T, updated: T): T {\n const changedKeys = Object.keys(changes) as Array<keyof T>;\n const isUpdated = changedKeys.reduce((acc, key) => {\n return acc || changes[key] !== original[key];\n }, false);\n return isUpdated ? tsModule.setTextRange(updated, original) : original;\n }\n\n function loop(node: ts.Expression, scope: ts.Identifier[]): ts.Expression {\n if (tsModule.isPropertyAccessChain(node)) {\n const expression = loop(node.expression, scope);\n return visit(\n update({ expression }, node, tsModule.createPropertyAccessChain(expression, node.questionDotToken, node.name)),\n scope\n );\n }\n\n if (tsModule.isPropertyAccessExpression(node)) {\n const expression = loop(node.expression, scope);\n return visit(update({ expression }, node, tsModule.createPropertyAccess(expression, node.name)), scope);\n }\n\n if (tsModule.isElementAccessExpression(node)) {\n const expression = loop(node.expression, scope);\n const argumentExpression = loop(node.argumentExpression, scope);\n return visit(\n update({ expression, argumentExpression }, node, tsModule.createElementAccess(expression, argumentExpression)),\n scope\n );\n }\n\n if (tsModule.isPrefixUnaryExpression(node)) {\n const operand = loop(node.operand, scope);\n return visit(update({ operand }, node, tsModule.createPrefix(node.operator, operand)), scope);\n }\n\n if (tsModule.isPostfixUnaryExpression(node)) {\n const operand = loop(node.operand, scope);\n return visit(update({ operand }, node, tsModule.createPostfix(operand, node.operator)), scope);\n }\n\n // Manually check `kind` for typeof expression\n // since ts.isTypeOfExpression is not working.\n if (node.kind === tsModule.SyntaxKind.TypeOfExpression) {\n const n = node as ts.TypeOfExpression;\n const expression = loop(n.expression, scope);\n return visit(update({ expression }, n, tsModule.createTypeOf(expression)), scope);\n }\n\n if (tsModule.isDeleteExpression(node)) {\n const expression = loop(node.expression, scope);\n return visit(update({ expression }, node, tsModule.createDelete(expression)), scope);\n }\n\n if (tsModule.isVoidExpression(node)) {\n const expression = loop(node.expression, scope);\n return visit(update({ expression }, node, tsModule.createVoid(expression)), scope);\n }\n\n if (tsModule.isBinaryExpression(node)) {\n const left = loop(node.left, scope);\n const right = loop(node.right, scope);\n return visit(update({ left, right }, node, tsModule.createBinary(left, node.operatorToken, right)), scope);\n }\n\n if (tsModule.isConditionalExpression(node)) {\n const condition = loop(node.condition, scope);\n const whenTrue = loop(node.whenTrue, scope);\n const whenFalse = loop(node.whenFalse, scope);\n return visit(\n update({ condition, whenTrue, whenFalse }, node, tsModule.createConditional(condition, whenTrue, whenFalse)),\n scope\n );\n }\n\n if (tsModule.isCallExpression(node)) {\n const expression = loop(node.expression, scope);\n const args = mapNodeArray(tsModule, node.arguments, arg => loop(arg, scope));\n return visit(\n update({ expression, arguments: args }, node, tsModule.createCall(expression, node.typeArguments, args)),\n scope\n );\n }\n\n if (tsModule.isParenthesizedExpression(node)) {\n const expression = loop(node.expression, scope);\n return visit(update({ expression }, node, tsModule.createParen(expression)), scope);\n }\n\n if (tsModule.isObjectLiteralExpression(node)) {\n const properties = mapNodeArray(tsModule, node.properties, p => {\n return walkObjectLiteralElementLike(p, scope);\n });\n return visit(update({ properties }, node, tsModule.createObjectLiteral(properties)), scope);\n }\n\n if (tsModule.isArrayLiteralExpression(node)) {\n const elements = mapNodeArray(tsModule, node.elements, el => loop(el, scope));\n return visit(update({ elements }, node, tsModule.createArrayLiteral(elements)), scope);\n }\n\n if (tsModule.isSpreadElement(node)) {\n const expression = loop(node.expression, scope);\n return visit(update({ expression }, node, tsModule.createSpread(expression)), scope);\n }\n\n if (tsModule.isArrowFunction(node)) {\n const fnScope = scope.concat(flatMap(node.parameters, value => collectScope(tsModule, value)));\n let body: ts.ConciseBody;\n if (tsModule.isBlock(node.body)) {\n const statements = mapNodeArray(tsModule, node.body.statements, st => {\n if (tsModule.isExpressionStatement(st)) {\n const expression = loop(st.expression, fnScope);\n return update({ expression }, st, tsModule.createExpressionStatement(expression));\n } else {\n return st;\n }\n });\n body = update({ statements }, node.body, tsModule.createBlock(statements));\n } else {\n body = loop(node.body, fnScope);\n }\n\n return visit(\n update(\n { body },\n node,\n tsModule.createArrowFunction(\n node.modifiers,\n node.typeParameters,\n node.parameters,\n node.type,\n node.equalsGreaterThanToken,\n body\n )\n ),\n scope\n );\n }\n\n if (tsModule.isTemplateExpression(node)) {\n const templateSpans = mapNodeArray(tsModule, node.templateSpans, span => {\n const expression = loop(span.expression, scope);\n return update({ expression }, span, tsModule.createTemplateSpan(expression, span.literal));\n });\n return visit(update({ templateSpans }, node, tsModule.createTemplateExpression(node.head, templateSpans)), scope);\n }\n\n if (tsModule.isNewExpression(node)) {\n const expression = loop(node.expression, scope);\n const args = node.arguments && mapNodeArray(tsModule, node.arguments, arg => loop(arg, scope));\n return update(\n {\n expression,\n arguments: args\n },\n node,\n tsModule.createNew(expression, node.typeArguments, args)\n );\n }\n\n return visit(node, scope);\n }\n\n function walkObjectLiteralElementLike(\n node: ts.ObjectLiteralElementLike,\n scope: ts.Identifier[]\n ): ts.ObjectLiteralElementLike {\n if (tsModule.isPropertyAssignment(node)) {\n let name: ts.PropertyName;\n if (tsModule.isComputedPropertyName(node.name)) {\n const expression = loop(node.name.expression, scope);\n name = update({ expression }, node.name, tsModule.createComputedPropertyName(expression));\n } else {\n name = node.name;\n }\n const initializer = loop(node.initializer, scope);\n return update({ name, initializer }, node, tsModule.createPropertyAssignment(name, initializer));\n }\n\n if (tsModule.isSpreadAssignment(node)) {\n const expression = loop(node.expression, scope);\n return update({ expression }, node, tsModule.createSpreadAssignment(expression));\n }\n\n return node;\n }\n\n return loop(root, []);\n}\n\n/**\n * Collect newly added variable names from function parameters.\n * e.g.\n * If the function parameters look like following:\n * (foo, { bar, baz: qux }) => { ... }\n * The output should be:\n * ['foo', 'bar', 'qux']\n */\nfunction collectScope(\n tsModule: RuntimeLibrary['typescript'],\n param: ts.ParameterDeclaration | ts.BindingElement\n): ts.Identifier[] {\n const binding = param.name;\n if (tsModule.isIdentifier(binding)) {\n return [binding];\n } else if (tsModule.isObjectBindingPattern(binding)) {\n return flatMap(binding.elements, value => collectScope(tsModule, value));\n } else if (tsModule.isArrayBindingPattern(binding)) {\n const filtered = binding.elements.filter(tsModule.isBindingElement);\n return flatMap(filtered, value => collectScope(tsModule, value));\n } else {\n return [];\n }\n}\n\n/**\n * Map node array to the same item type. If all item references are not changed, it returns the input list.\n */\nfunction mapNodeArray<T extends ts.Node>(\n tsModule: RuntimeLibrary['typescript'],\n list: ts.NodeArray<T>,\n fn: (value: T) => T\n): ts.NodeArray<T> {\n const mapped = list.map(fn);\n const isUpdated = mapped.some((v, i) => {\n const old = list[i];\n return v !== old;\n });\n return isUpdated ? tsModule.createNodeArray(mapped) : list;\n}\n\nfunction flatMap<T extends ts.Node, R>(list: ReadonlyArray<T>, fn: (value: T) => R[]): R[] {\n return list.reduce<R[]>((acc, item) => {\n return acc.concat(fn(item));\n }, []);\n}\n", "import { renderHelperName, componentHelperName, iterationHelperName, componentDataName } from './transformTemplate';\n\n// This bridge file will be injected into TypeScript language service\n// it enable type checking and completion, yet still preserve precise option type\n\nexport const moduleName = 'vue-editor-bridge';\n\nexport const fileName = 'vue-temp/vue-editor-bridge.ts';\n\nconst renderHelpers = `\ntype ComponentListeners<T, TH> = {\n [K in keyof T]?: (this: TH, $event: T[K]) => any;\n};\nexport interface ${componentDataName}<T, TH> {\n props: Record<string, any>;\n on: ComponentListeners<T, TH>;\n directives: any[];\n}\nexport declare const ${renderHelperName}: {\n <T>(Component: (new (...args: any[]) => T), fn: (this: T) => any): any;\n};\nexport declare const ${componentHelperName}: {\n <T>(\n vm: T,\n tag: string,\n data: ${componentDataName}<Record<string, any>, T> & ThisType<T>,\n children: any[]\n ): any;\n};\nexport declare const ${iterationHelperName}: {\n <T>(list: readonly T[], fn: (value: T, index: number) => any): any;\n <T>(obj: { [key: string]: T }, fn: (value: T, key: string, index: number) => any): any;\n (num: number, fn: (value: number, index: number) => any): any;\n <T>(obj: object, fn: (value: any, key: string, index: number) => any): any;\n};\n`;\n\nexport const preVue25Content =\n `\nimport Vue from 'vue';\nexport interface GeneralOption extends Vue.ComponentOptions<Vue> {\n [key: string]: any;\n}\nexport default function bridge<T>(t: T & GeneralOption): T {\n return t;\n}\n` + renderHelpers;\n\nexport const vue25Content =\n `\nimport Vue from 'vue';\nconst func = Vue.extend;\nexport default func;\n` + renderHelpers;\n\nexport const vue30Content =\n `\nimport { defineComponent } from 'vue';\nconst func = defineComponent;\nexport default func;\n` + renderHelpers;\n", "import { parseVueScript } from './preprocess';\nimport type ts from 'typescript';\nimport { isVirtualVueFile } from './util';\nimport { RuntimeLibrary } from '../dependencyService';\n\nexport function getVueSys(tsModule: RuntimeLibrary['typescript'], scriptFileNameSet: Set<string>) {\n /**\n * This part is only accessed by TS module resolution\n */\n const vueSys: ts.System = {\n ...tsModule.sys,\n fileExists(path: string) {\n if (isVirtualVueFile(path, scriptFileNameSet)) {\n return tsModule.sys.fileExists(path.slice(0, -'.ts'.length));\n }\n return tsModule.sys.fileExists(path);\n },\n readFile(path, encoding) {\n if (isVirtualVueFile(path, scriptFileNameSet)) {\n const fileText = tsModule.sys.readFile(path.slice(0, -'.ts'.length), encoding);\n return fileText ? parseVueScript(fileText) : fileText;\n }\n const fileText = tsModule.sys.readFile(path, encoding);\n return fileText;\n }\n };\n\n if (tsModule.sys.realpath) {\n const realpath = tsModule.sys.realpath;\n vueSys.realpath = function (path) {\n if (isVirtualVueFile(path, scriptFileNameSet)) {\n return realpath(path.slice(0, -'.ts'.length)) + '.ts';\n }\n return realpath(path);\n };\n }\n\n return vueSys;\n}\n", "import type ts from 'typescript';\n\nexport class ModuleResolutionCache {\n private _cache: {\n [containingFile: string]: {\n [moduleName: string]: ts.ResolvedModule;\n };\n } = {};\n\n getCache(moduleName: string, containingFile: string): ts.ResolvedModule | undefined {\n if (!this._cache[containingFile]) {\n if (containingFile.endsWith('.vue')) {\n this._cache[containingFile] = this._cache[containingFile + '.template'] = {};\n } else if (containingFile.endsWith('.vue.template')) {\n this._cache[containingFile.slice(0, -'.template'.length)] = this._cache[containingFile] = {};\n } else {\n this._cache[containingFile] = {};\n }\n return undefined;\n }\n\n return this._cache[containingFile][moduleName];\n }\n\n setCache(moduleName: string, containingFile: string, cache: ts.ResolvedModule) {\n if (!this._cache[containingFile]) {\n if (containingFile.endsWith('.vue')) {\n this._cache[containingFile] = this._cache[containingFile + '.template'] = {};\n } else if (containingFile.endsWith('.vue.template')) {\n this._cache[containingFile.slice(0, -'.template'.length)] = this._cache[containingFile] = {};\n } else {\n this._cache[containingFile] = {};\n }\n return undefined;\n }\n\n this._cache[containingFile][moduleName] = cache;\n }\n}\n", "import { LanguageMode } from '../../../embeddedSupport/languageModes';\n\nimport type { TextDocument } from 'vscode-languageserver-textdocument';\nimport { Range, FormattingOptions, CompletionList } from 'vscode-languageserver-types';\n\nimport { TextEdit, Position } from 'vscode-css-languageservice';\n\nimport { SassFormatter, SassFormatterConfig } from 'sass-formatter';\n\nimport * as emmet from 'vscode-emmet-helper';\nimport { StylePriority } from '../emmet';\nimport { EnvironmentService } from '../../../services/EnvironmentService';\n\nexport class SassLanguageMode implements LanguageMode {\n constructor(private env: EnvironmentService) {}\n\n getId() {\n return 'sass';\n }\n\n doComplete(document: TextDocument, position: Position): CompletionList {\n const emmetCompletions = emmet.doComplete(document, position, 'sass', this.env.getConfig().emmet);\n if (!emmetCompletions) {\n return { isIncomplete: false, items: [] };\n } else {\n const emmetItems = emmetCompletions.items.map(i => {\n return {\n ...i,\n sortText: StylePriority.Emmet + i.label\n };\n });\n return {\n isIncomplete: emmetCompletions.isIncomplete,\n items: emmetItems\n };\n }\n }\n\n format(document: TextDocument, range: Range, formattingOptions: FormattingOptions) {\n if (this.env.getConfig().vetur.format.defaultFormatter.sass === 'sass-formatter') {\n return [\n TextEdit.replace(\n range,\n SassFormatter.Format(document.getText(range), { ...formattingOptions, ...this.env.getConfig()?.sass?.format })\n )\n ];\n }\n return [];\n }\n\n onDocumentRemoved(document: TextDocument) {}\n dispose() {}\n}\n", "import { Position, Range } from 'vscode-languageserver-types';\nimport type { TextDocument } from 'vscode-languageserver-textdocument';\nimport { LanguageMode } from '../../embeddedSupport/languageModes';\nimport { prettierPluginPugify } from '../../utils/prettier';\nimport { VLSFormatConfig } from '../../config';\nimport { getFileFsPath } from '../../utils/paths';\nimport { DependencyService } from '../../services/dependencyService';\nimport { EnvironmentService } from '../../services/EnvironmentService';\nimport { findTokenAtPosition } from './languageService';\nimport { getLanguageModelCache, LanguageModelCache } from '../../embeddedSupport/languageModelCache';\nimport { VueDocumentRegions } from '../../embeddedSupport/embeddedSupport';\nimport { VueInfoService } from '../../services/vueInfoService';\nimport { getTagDefinition } from '../template-common/tagDefinition';\n\nexport function getPugMode(\n env: EnvironmentService,\n dependencyService: DependencyService,\n documentRegions: LanguageModelCache<VueDocumentRegions>,\n vueInfoService?: VueInfoService\n): LanguageMode {\n const embeddedDocuments = getLanguageModelCache<TextDocument>(10, 60, document =>\n documentRegions.refreshAndGet(document).getSingleLanguageDocument('pug')\n );\n\n return {\n getId: () => 'pug',\n format(document, currRange, formattingOptions) {\n if (env.getConfig().vetur.format.defaultFormatter['pug'] === 'none') {\n return [];\n }\n\n const { value, range } = getValueAndRange(document, currRange);\n\n return prettierPluginPugify(\n dependencyService,\n value,\n getFileFsPath(document.uri),\n 'pug',\n range,\n env.getConfig().vetur.format as VLSFormatConfig,\n false\n );\n },\n findDefinition(document, position) {\n const embedded = embeddedDocuments.refreshAndGet(document);\n\n const token = findTokenAtPosition(embedded.getText(), position);\n if (!token || token.type !== 'tag') {\n return [];\n }\n\n const info = vueInfoService?.getInfo(document);\n if (!info) {\n return [];\n }\n\n return getTagDefinition(info, token.val);\n },\n onDocumentRemoved() {},\n dispose() {}\n };\n}\n\nfunction getValueAndRange(document: TextDocument, currRange: Range): { value: string; range: Range } {\n let value = document.getText();\n let range = currRange;\n\n if (currRange) {\n const startOffset = document.offsetAt(currRange.start);\n const endOffset = document.offsetAt(currRange.end);\n value = value.substring(startOffset, endOffset);\n } else {\n range = Range.create(Position.create(0, 0), document.positionAt(value.length));\n }\n return { value, range };\n}\n", "import lex, { Loc } from 'pug-lexer';\nimport { Position, Range } from 'vscode-languageserver-types';\n\nexport function findTokenAtPosition(code: string, position: Position): lex.Token | null {\n const tokens = lex(code);\n\n const oneBasedPos = Position.create(position.line + 1, position.character + 1);\n\n return (\n tokens.find(\n ({ loc, type }) =>\n loc.start.line <= oneBasedPos.line &&\n loc.end.line >= oneBasedPos.line &&\n loc.start.column <= oneBasedPos.character &&\n loc.end.column > oneBasedPos.character &&\n type !== 'newline'\n ) || null\n );\n}\n\nexport const locToRange = (loc: Loc): Range => ({\n start: Position.create(loc.start.line - 1, loc.start.column - 1),\n end: Position.create(loc.end.line - 1, loc.end.column - 1)\n});\n", "import { camelCase, kebabCase, upperFirst } from 'lodash';\nimport { EOL as NEW_LINE } from 'os';\nimport { basename } from 'path';\nimport type ts from 'typescript';\nimport { CompletionItem } from 'vscode-languageserver';\nimport { TextDocument } from 'vscode-languageserver-textdocument';\nimport { TextEdit } from 'vscode-languageserver-types';\nimport { VLSFullConfig } from '../../config';\nimport { modulePathToValidIdentifier, toMarkupContent } from '../../utils/strings';\nimport { RuntimeLibrary } from '../../services/dependencyService';\nimport { ChildComponent, VueInfoService } from '../../services/vueInfoService';\n\nexport interface AutoImportSfcPlugin {\n setGetConfigure(fn: () => VLSFullConfig): void;\n setGetFilesFn(fn: () => string[]): void;\n setGetJSResolve(fn: (doc: TextDocument, item: CompletionItem) => CompletionItem): void;\n setGetTSScriptTarget(fn: () => ts.ScriptTarget | undefined): void;\n doComplete(document: TextDocument): CompletionItem[];\n isMyResolve(item: CompletionItem): boolean;\n doResolve(document: TextDocument, item: CompletionItem): CompletionItem;\n}\n\n/**\n * Auto import component in script when completion in template.\n * ## Implementation:\n * 1. Get all vue files path from ts language service host.\n * 2. Record more data in VueInfoService. Like: componentsDefine position.\n * 3. Provide completion list in template from vue files path\n * 4. Mock code to trigger auto import in TS for make importing component TextEdit.\n * 5. Add component define TextEdit from second step.\n * 6. Provide completion/resolve from fourth and fifth steps.\n *\n * ## Example\n * For mock code example in TS when componentName is `Item`.\n * The `=` is position for call completion/resolve in TS language service.\n * ```typescript\n * export default {\n * components: {\n * Item: ItemV=\n * }\n * }\n * ```\n */\nexport function createAutoImportSfcPlugin(\n tsModule: RuntimeLibrary['typescript'],\n vueInfoService?: VueInfoService\n): AutoImportSfcPlugin {\n let getConfigure: () => VLSFullConfig;\n let getVueFiles: () => string[];\n let getJSResolve: (doc: TextDocument, item: CompletionItem) => CompletionItem;\n let getTSScriptTarget: () => ts.ScriptTarget | undefined = () => undefined;\n\n function createMockDoc(document: TextDocument, componentInsertPos: number, mockPartContent: string) {\n const mockDocContent =\n document.getText().slice(0, componentInsertPos) + mockPartContent + document.getText().slice(componentInsertPos);\n const mockDoc = TextDocument.create(document.uri, document.languageId, document.version + 1, mockDocContent);\n return mockDoc;\n }\n\n function getJSImportEdits(\n nameForTriggerResolveInTs: string,\n mockDoc: TextDocument,\n offset: number,\n item: CompletionItem,\n componentName: string\n ) {\n const mockCompletionItem: CompletionItem = {\n label: nameForTriggerResolveInTs + 'Vue',\n data: {\n languageId: 'vue-html',\n uri: mockDoc.uri,\n offset,\n source: item.data.path\n }\n };\n const textEdits = getJSResolve(mockDoc, mockCompletionItem)?.additionalTextEdits?.map(edit => {\n edit.newText = edit.newText.replace(nameForTriggerResolveInTs + 'Vue', componentName);\n return edit;\n });\n return textEdits;\n }\n\n function getNoDuplicateComponentName(childComponents: ChildComponent[], componentCompletionName: string) {\n let index = 1;\n while (\n childComponents.some(el =>\n [componentCompletionName, componentCompletionName.toLowerCase(), kebabCase(componentCompletionName)].includes(\n el.name\n )\n )\n ) {\n componentCompletionName = `${componentCompletionName}${index++}`;\n }\n return upperFirst(componentCompletionName);\n }\n\n return {\n setGetConfigure(fn) {\n getConfigure = fn;\n },\n setGetFilesFn(fn) {\n getVueFiles = fn;\n },\n setGetJSResolve(fn) {\n getJSResolve = fn;\n },\n setGetTSScriptTarget(fn) {\n getTSScriptTarget = fn;\n },\n doComplete(document): CompletionItem[] {\n const config = getConfigure();\n if (!config.vetur.completion.autoImport) {\n return [];\n }\n if (!getVueFiles || !getJSResolve || !vueInfoService) {\n return [];\n }\n\n const childComponentsPath =\n vueInfoService.getInfo(document)?.componentInfo.childComponents?.map(el => el.definition?.path) ?? [];\n return getVueFiles()\n .filter(fileName => !childComponentsPath.includes(fileName))\n .map(fileName => {\n let tagName = basename(fileName, '.vue');\n if (config.vetur.completion.tagCasing === 'kebab') {\n tagName = kebabCase(tagName);\n }\n const documentation = `\n\\`\\`\\`typescript\nimport ${upperFirst(camelCase(tagName))} from '${fileName}'\n\\`\\`\\`\n`;\n\n return {\n label: tagName,\n insertText: tagName,\n documentation: toMarkupContent(documentation),\n data: {\n languageId: 'vue-html',\n uri: document.uri,\n isFromAutoImportVueService: true,\n path: fileName\n }\n };\n });\n },\n isMyResolve(item: CompletionItem) {\n return item.data?.isFromAutoImportVueService ?? false;\n },\n doResolve(document: TextDocument, item: CompletionItem) {\n const config = getConfigure();\n const componentInfo = vueInfoService?.getInfo(document)?.componentInfo;\n if (!componentInfo) {\n return item;\n }\n\n const componentDefine = componentInfo?.componentsDefine;\n const childComponents = componentInfo?.childComponents?.filter(c => !c.global);\n const nameForTriggerResolveInTs = modulePathToValidIdentifier(\n tsModule,\n item.data.path,\n getTSScriptTarget() ?? tsModule.ScriptTarget.ESNext\n );\n /**\n * have `components` property case\n */\n if (componentDefine && childComponents) {\n const componentName = getNoDuplicateComponentName(childComponents, nameForTriggerResolveInTs);\n const componentInsertPos = componentDefine?.insertPos;\n const mockPartContent = `${nameForTriggerResolveInTs}: ${nameForTriggerResolveInTs.slice(\n 0,\n nameForTriggerResolveInTs.length - 2\n )}`;\n const mockDoc = createMockDoc(document, componentInsertPos, mockPartContent);\n\n const textEdits = getJSImportEdits(\n nameForTriggerResolveInTs,\n mockDoc,\n componentInsertPos + mockPartContent.length,\n item,\n componentName\n );\n if (textEdits) {\n const currentComponentText = document.getText().slice(componentDefine.start, componentDefine.end);\n const newInsertTexts = [];\n if (document.getText().charAt(componentInsertPos - 1) !== ',' && childComponents.length !== 0) {\n newInsertTexts.push(',');\n }\n if (currentComponentText.includes('\\n')) {\n newInsertTexts.push(NEW_LINE);\n const textInLine = document\n .getText()\n .slice(\n document.getText().lastIndexOf('\\n', componentDefine.start),\n document.getText().indexOf('\\n', componentDefine.start)\n );\n newInsertTexts.push(textInLine.slice(1, textInLine.slice(1).search(/[^ ]/) + 1).repeat(2));\n } else if (childComponents.length !== 0) {\n newInsertTexts.push(' ');\n }\n newInsertTexts.push(componentName);\n textEdits.push(TextEdit.insert(document.positionAt(componentInsertPos), newInsertTexts.join('')));\n }\n item.additionalTextEdits = textEdits;\n item.insertText = config.vetur.completion.tagCasing === 'initial' ? componentName : kebabCase(componentName);\n } else if (componentInfo.insertInOptionAPIPos) {\n /**\n * no have `components` property case\n */\n const componentName = nameForTriggerResolveInTs;\n const mockEndPart = '},';\n const mockPartContent =\n `components: {${nameForTriggerResolveInTs}: ` +\n nameForTriggerResolveInTs.slice(0, nameForTriggerResolveInTs.length - 2) +\n mockEndPart;\n const mockDoc = createMockDoc(document, componentInfo.insertInOptionAPIPos, mockPartContent);\n\n const textEdits = getJSImportEdits(\n nameForTriggerResolveInTs,\n mockDoc,\n componentInfo.insertInOptionAPIPos + mockPartContent.length - mockEndPart.length,\n item,\n componentName\n );\n if (textEdits) {\n const newInsertTexts = [NEW_LINE];\n if (config.vetur.format.options.useTabs) {\n newInsertTexts.push('\\t');\n } else {\n newInsertTexts.push(' '.repeat(config.vetur.format.options.tabSize));\n }\n newInsertTexts.push(`components: { ${componentName} },`);\n textEdits.push(\n TextEdit.insert(document.positionAt(componentInfo.insertInOptionAPIPos), newInsertTexts.join(''))\n );\n }\n item.additionalTextEdits = textEdits;\n item.insertText = config.vetur.completion.tagCasing === 'initial' ? componentName : kebabCase(componentName);\n }\n\n return item;\n }\n };\n}\n", "import {\n CompletionItem,\n Location,\n SignatureHelp,\n Definition,\n TextEdit,\n Diagnostic,\n DocumentLink,\n Range,\n Hover,\n DocumentHighlight,\n CompletionList,\n Position,\n FormattingOptions,\n SymbolInformation,\n CodeActionContext,\n ColorInformation,\n Color,\n ColorPresentation,\n CodeAction,\n WorkspaceEdit,\n FoldingRange,\n TextDocumentEdit\n} from 'vscode-languageserver-types';\nimport type { TextDocument } from 'vscode-languageserver-textdocument';\n\nimport { getLanguageModelCache, LanguageModelCache } from './languageModelCache';\nimport { getVueDocumentRegions, VueDocumentRegions, LanguageId, LanguageRange } from './embeddedSupport';\nimport { getVueMode } from '../modes/vue';\nimport { getCSSMode, getSCSSMode, getLESSMode, getPostCSSMode } from '../modes/style';\nimport { getJavascriptMode } from '../modes/script/javascript';\nimport { VueHTMLMode } from '../modes/template';\nimport { getStylusMode } from '../modes/style/stylus';\nimport { DocumentContext, SemanticTokenData } from '../types';\nimport { VueInfoService } from '../services/vueInfoService';\nimport { DependencyService } from '../services/dependencyService';\nimport { nullMode } from '../modes/nullMode';\nimport { getServiceHost, IServiceHost } from '../services/typescriptService/serviceHost';\nimport { SassLanguageMode } from '../modes/style/sass/sassLanguageMode';\nimport { getPugMode } from '../modes/pug';\nimport { VCancellationToken } from '../utils/cancellationToken';\nimport { createAutoImportSfcPlugin } from '../modes/plugins/autoImportSfcPlugin';\nimport { EnvironmentService } from '../services/EnvironmentService';\nimport { FileRename } from 'vscode-languageserver';\nimport { RefTokensService } from '../services/RefTokenService';\n\nexport interface VLSServices {\n dependencyService: DependencyService;\n infoService: VueInfoService;\n refTokensService: RefTokensService;\n}\n\nexport interface LanguageMode {\n getId(): string;\n updateFileInfo?(doc: TextDocument): void;\n\n doValidation?(document: TextDocument, cancellationToken?: VCancellationToken): Promise<Diagnostic[]>;\n getCodeActions?(\n document: TextDocument,\n range: Range,\n formatParams: FormattingOptions,\n context: CodeActionContext\n ): CodeAction[];\n doCodeActionResolve?(document: TextDocument, action: CodeAction): CodeAction;\n doComplete?(document: TextDocument, position: Position): CompletionList;\n doResolve?(document: TextDocument, item: CompletionItem): CompletionItem;\n doHover?(document: TextDocument, position: Position): Hover;\n doSignatureHelp?(document: TextDocument, position: Position): SignatureHelp | null;\n findDocumentHighlight?(document: TextDocument, position: Position): DocumentHighlight[];\n findDocumentSymbols?(document: TextDocument): SymbolInformation[];\n findDocumentLinks?(document: TextDocument, documentContext: DocumentContext): DocumentLink[];\n findDefinition?(document: TextDocument, position: Position): Definition;\n findReferences?(document: TextDocument, position: Position): Location[];\n format?(document: TextDocument, range: Range, options: FormattingOptions): TextEdit[];\n findDocumentColors?(document: TextDocument): ColorInformation[];\n getColorPresentations?(document: TextDocument, color: Color, range: Range): ColorPresentation[];\n getFoldingRanges?(document: TextDocument): FoldingRange[];\n getRenameFileEdit?(renames: FileRename): TextDocumentEdit[];\n getSemanticTokens?(document: TextDocument, range?: Range): SemanticTokenData[];\n\n onDocumentChanged?(filePath: string): void;\n onDocumentRemoved(document: TextDocument): void;\n dispose(): void;\n}\n\nexport interface LanguageModeRange extends LanguageRange {\n mode: LanguageMode;\n}\n\nexport class LanguageModes {\n private modes: { [k in LanguageId]: LanguageMode } = {\n vue: nullMode,\n pug: nullMode,\n 'vue-html': nullMode,\n css: nullMode,\n postcss: nullMode,\n scss: nullMode,\n less: nullMode,\n sass: nullMode,\n stylus: nullMode,\n javascript: nullMode,\n typescript: nullMode,\n tsx: nullMode,\n unknown: nullMode\n };\n\n private documentRegions: LanguageModelCache<VueDocumentRegions>;\n private modelCaches: LanguageModelCache<any>[];\n private serviceHost: IServiceHost;\n\n constructor() {\n this.documentRegions = getLanguageModelCache<VueDocumentRegions>(10, 60, document =>\n getVueDocumentRegions(document)\n );\n\n this.modelCaches = [];\n this.modelCaches.push(this.documentRegions);\n }\n\n async init(env: EnvironmentService, services: VLSServices, globalSnippetDir?: string) {\n const tsModule = services.dependencyService.get('typescript', env.getPackagePath()).module;\n\n /**\n * Documents where everything outside `<script>` is replaced with whitespace\n */\n const scriptRegionDocuments = getLanguageModelCache(10, 60, document => {\n const vueDocument = this.documentRegions.refreshAndGet(document);\n return vueDocument.getSingleTypeDocument('script');\n });\n this.serviceHost = getServiceHost(tsModule, env, scriptRegionDocuments);\n const autoImportSfcPlugin = createAutoImportSfcPlugin(tsModule, services.infoService);\n autoImportSfcPlugin.setGetTSScriptTarget(() => this.serviceHost.getComplierOptions().target);\n autoImportSfcPlugin.setGetFilesFn(() =>\n this.serviceHost.getFileNames().filter(fileName => fileName.endsWith('.vue'))\n );\n\n const vueHtmlMode = new VueHTMLMode(\n tsModule,\n this.serviceHost,\n env,\n this.documentRegions,\n autoImportSfcPlugin,\n services.dependencyService,\n services.infoService\n );\n\n const jsMode = await getJavascriptMode(\n tsModule,\n this.serviceHost,\n env,\n this.documentRegions,\n services.dependencyService,\n env.getGlobalComponentInfos(),\n services.infoService,\n services.refTokensService\n );\n autoImportSfcPlugin.setGetConfigure(env.getConfig);\n autoImportSfcPlugin.setGetJSResolve(jsMode.doResolve!);\n\n this.modes['vue'] = getVueMode(env, globalSnippetDir);\n this.modes['vue-html'] = vueHtmlMode;\n this.modes['pug'] = getPugMode(env, services.dependencyService, this.documentRegions, services.infoService);\n this.modes['css'] = getCSSMode(env, this.documentRegions, services.dependencyService);\n this.modes['postcss'] = getPostCSSMode(env, this.documentRegions, services.dependencyService);\n this.modes['scss'] = getSCSSMode(env, this.documentRegions, services.dependencyService);\n this.modes['sass'] = new SassLanguageMode(env);\n this.modes['less'] = getLESSMode(env, this.documentRegions, services.dependencyService);\n this.modes['stylus'] = getStylusMode(env, this.documentRegions, services.dependencyService);\n this.modes['javascript'] = jsMode;\n this.modes['typescript'] = jsMode;\n this.modes['tsx'] = jsMode;\n }\n\n getModeAtPosition(document: TextDocument, position: Position): LanguageMode | undefined {\n const languageId = this.documentRegions.refreshAndGet(document).getLanguageAtPosition(position);\n return this.modes?.[languageId];\n }\n\n getAllLanguageModeRangesInDocument(document: TextDocument): LanguageModeRange[] {\n const result: LanguageModeRange[] = [];\n\n const documentRegions = this.documentRegions.refreshAndGet(document);\n\n documentRegions.getAllLanguageRanges().forEach(lr => {\n const mode = this.modes[lr.languageId];\n if (mode) {\n result.push({\n mode,\n ...lr\n });\n }\n });\n\n return result;\n }\n\n getAllModes(): LanguageMode[] {\n const result = [];\n for (const languageId in this.modes) {\n const mode = this.modes[<LanguageId>languageId];\n if (mode) {\n result.push(mode);\n }\n }\n return result;\n }\n\n getMode(languageId: LanguageId): LanguageMode | undefined {\n return this.modes[languageId];\n }\n\n onDocumentRemoved(document: TextDocument) {\n this.modelCaches.forEach(mc => mc.onDocumentRemoved(document));\n for (const mode in this.modes) {\n this.modes[<LanguageId>mode].onDocumentRemoved(document);\n }\n }\n\n dispose(): void {\n this.modelCaches.forEach(mc => mc.dispose());\n this.modelCaches = [];\n for (const mode in this.modes) {\n this.modes[<LanguageId>mode].dispose();\n }\n this.serviceHost.dispose();\n }\n}\n", "import { BasicComponentInfo, VLSConfig, VLSFullConfig } from '../config';\nimport { inferVueVersion, VueVersion } from '../utils/vueVersion';\n\nexport interface EnvironmentService {\n configure(config: VLSFullConfig): void;\n getConfig(): VLSFullConfig;\n getRootPathForConfig(): string;\n getProjectRoot(): string;\n getTsConfigPath(): string | undefined;\n getPackagePath(): string | undefined;\n getVueVersion(): VueVersion;\n getSnippetFolder(): string;\n getGlobalComponentInfos(): BasicComponentInfo[];\n}\n\nexport function createEnvironmentService(\n rootPathForConfig: string,\n projectPath: string,\n tsconfigPath: string | undefined,\n packagePath: string | undefined,\n snippetFolder: string,\n globalComponentInfos: BasicComponentInfo[],\n initialConfig: VLSConfig\n): EnvironmentService {\n let $config = initialConfig;\n\n return {\n configure(config: VLSFullConfig) {\n $config = config;\n },\n getConfig: () => $config,\n getRootPathForConfig: () => rootPathForConfig,\n getProjectRoot: () => projectPath,\n getTsConfigPath: () => tsconfigPath,\n getPackagePath: () => packagePath,\n getVueVersion: () => inferVueVersion(packagePath),\n getSnippetFolder: () => snippetFolder,\n getGlobalComponentInfos: () => globalComponentInfos\n };\n}\n", "import { Connection, Range } from 'vscode-languageserver';\n\nexport interface RefTokensService {\n send(uri: string, tokens: Range[]): void;\n}\n\nexport function createRefTokensService(conn: Connection) {\n return {\n send(uri: string, tokens: Range[]) {\n conn.sendNotification('$/refTokens', { uri, tokens });\n }\n };\n}\n", "import path from 'path';\nimport fg from 'fast-glob';\nimport fs from 'fs';\nimport util from 'util';\nimport { performance } from 'perf_hooks';\nimport { logger } from '../log';\nimport { getPathDepth } from '../utils/paths';\n// dependencies\nimport ts from 'typescript';\nimport prettier from 'prettier';\nimport prettyHTML from '@starptech/prettyhtml';\nimport prettierEslint from 'prettier-eslint';\nimport * as prettierTslint from 'prettier-tslint';\nimport stylusSupremacy from 'stylus-supremacy';\nimport * as prettierPluginPug from '@prettier/plugin-pug';\n\nconst readFileAsync = util.promisify(fs.readFile);\nconst accessFileAsync = util.promisify(fs.access);\n\nexport function createNodeModulesPaths(rootPath: string) {\n if (process.versions.pnp) {\n return [];\n }\n const startTime = performance.now();\n const nodeModules = fg.sync('**/node_modules', {\n cwd: rootPath.replace(/\\\\/g, '/'),\n absolute: true,\n unique: true,\n onlyFiles: false,\n onlyDirectories: true,\n suppressErrors: true,\n deep: 6,\n followSymbolicLinks: true,\n ignore: ['**/node_modules/**/node_modules']\n });\n\n logger.logInfo(`Find node_modules paths in ${rootPath} - ${Math.round(performance.now() - startTime)}ms`);\n return nodeModules;\n}\n\nasync function findAllPackages(nodeModulesPaths: string[], moduleName: string) {\n async function getPackage(nodeModulesPath: string) {\n const packageJSONPath = path.resolve(nodeModulesPath, moduleName, 'package.json');\n try {\n await accessFileAsync(packageJSONPath, fs.constants.R_OK);\n const info: { name: string; version: string; main: string } = JSON.parse(\n await readFileAsync(packageJSONPath, { encoding: 'utf8' })\n );\n return {\n name: info.name,\n dir: path.dirname(packageJSONPath),\n version: info.version,\n module: require(path.resolve(path.dirname(packageJSONPath), info.main))\n };\n } catch {\n return null;\n }\n }\n\n const packages = (await Promise.all(nodeModulesPaths.map(path => getPackage(path)))).filter(info => info) as Array<{\n name: string;\n dir: string;\n version: string;\n module: unknown;\n }>;\n\n return packages;\n}\n\nfunction compareDependency<M>(a: Dependency<M>, b: Dependency<M>) {\n const aDepth = getPathDepth(a.dir, path.sep);\n const bDepth = getPathDepth(b.dir, path.sep);\n\n return bDepth - aDepth;\n}\n\ninterface Dependency<M> {\n dir: string;\n version: string;\n bundled: boolean;\n module: M;\n}\n\nexport interface RuntimeLibrary {\n typescript: typeof ts;\n prettier: typeof prettier;\n '@starptech/prettyhtml': typeof prettyHTML;\n 'prettier-eslint': typeof prettierEslint;\n 'prettier-tslint': typeof prettierTslint;\n 'stylus-supremacy': typeof stylusSupremacy;\n '@prettier/plugin-pug': typeof prettierPluginPug;\n}\n\nexport interface DependencyService {\n readonly useWorkspaceDependencies: boolean;\n readonly nodeModulesPaths: string[];\n get<L extends keyof RuntimeLibrary>(lib: L, filePath?: string): Dependency<RuntimeLibrary[L]>;\n getBundled<L extends keyof RuntimeLibrary>(lib: L): Dependency<RuntimeLibrary[L]>;\n}\n\nconst bundledModules = {\n typescript: ts,\n prettier,\n '@starptech/prettyhtml': prettyHTML,\n 'prettier-eslint': prettierEslint,\n 'prettier-tslint': prettierTslint,\n 'stylus-supremacy': stylusSupremacy,\n '@prettier/plugin-pug': prettierPluginPug\n};\n\nexport const createDependencyService = async (\n rootPathForConfig: string,\n workspacePath: string,\n useWorkspaceDependencies: boolean,\n nodeModulesPaths: string[],\n tsSDKPath?: string\n): Promise<DependencyService> => {\n let loaded: { [K in keyof RuntimeLibrary]: Dependency<RuntimeLibrary[K]>[] };\n\n const loadTsSDKPath = () => {\n if (!tsSDKPath) {\n throw new Error('No tsSDKPath in settings');\n }\n const dir = path.isAbsolute(tsSDKPath)\n ? path.resolve(tsSDKPath, '..')\n : path.resolve(workspacePath, tsSDKPath, '..');\n const tsModule = require(dir);\n logger.logInfo(`Loaded typescript@${tsModule.version} from ${dir} for tsdk.`);\n\n return {\n dir,\n version: tsModule.version as string,\n bundled: false,\n module: tsModule as typeof ts\n };\n };\n\n const loadTypeScript = async (): Promise<Dependency<typeof ts>[]> => {\n try {\n if (useWorkspaceDependencies && tsSDKPath) {\n return [loadTsSDKPath()];\n }\n\n if (useWorkspaceDependencies) {\n const packages = await findAllPackages(nodeModulesPaths, 'typescript');\n if (packages.length === 0) {\n throw new Error(`No find any packages in ${rootPathForConfig}.`);\n }\n\n return packages\n .map(pkg => {\n logger.logInfo(`Loaded typescript@${pkg.version} from ${pkg.dir}.`);\n\n return {\n dir: pkg.dir,\n version: pkg.version as string,\n bundled: false,\n module: pkg.module as typeof ts\n };\n })\n .sort(compareDependency);\n }\n\n throw new Error('No useWorkspaceDependencies.');\n } catch (e) {\n logger.logDebug((e as Error).message);\n logger.logInfo(`Loaded bundled typescript@${ts.version}.`);\n return [\n {\n dir: '',\n version: ts.version,\n bundled: true,\n module: ts\n }\n ];\n }\n };\n\n const loadCommonDep = async <N extends string, BM>(name: N, bundleModule: BM): Promise<Dependency<BM>[]> => {\n try {\n if (useWorkspaceDependencies) {\n const packages = await findAllPackages(nodeModulesPaths, name);\n if (packages.length === 0) {\n throw new Error(`No find ${name} packages in ${rootPathForConfig}.`);\n }\n\n return packages\n .map(pkg => {\n logger.logInfo(`Loaded ${name}@${pkg.version} from ${pkg.dir}.`);\n\n return {\n dir: pkg.dir,\n version: pkg.version as string,\n bundled: false,\n module: pkg.module as BM\n };\n })\n .sort(compareDependency);\n }\n throw new Error('No useWorkspaceDependencies.');\n } catch (e) {\n logger.logDebug((e as Error).message);\n // TODO: Get bundle package version\n logger.logInfo(`Loaded bundled ${name}.`);\n return [\n {\n dir: '',\n version: '',\n bundled: true,\n module: bundleModule as BM\n }\n ];\n }\n };\n\n if (!process.versions.pnp) {\n loaded = {\n typescript: await loadTypeScript(),\n prettier: await loadCommonDep('prettier', bundledModules['prettier']),\n '@starptech/prettyhtml': await loadCommonDep('@starptech/prettyhtml', bundledModules['@starptech/prettyhtml']),\n 'prettier-eslint': await loadCommonDep('prettier-eslint', bundledModules['prettier-eslint']),\n 'prettier-tslint': await loadCommonDep('prettier-tslint', bundledModules['prettier-tslint']),\n 'stylus-supremacy': await loadCommonDep('stylus-supremacy', bundledModules['stylus-supremacy']),\n '@prettier/plugin-pug': await loadCommonDep('@prettier/plugin-pug', bundledModules['@prettier/plugin-pug'])\n };\n }\n\n const get = <L extends keyof RuntimeLibrary>(lib: L, filePath?: string): Dependency<RuntimeLibrary[L]> => {\n // We find it when yarn pnp. https://yarnpkg.com/features/pnp\n if (process.versions.pnp) {\n if (!useWorkspaceDependencies) {\n return getBundled(lib);\n }\n if (useWorkspaceDependencies && tsSDKPath && lib === 'typescript') {\n return loadTsSDKPath();\n }\n const pkgPath = require.resolve(lib, { paths: [filePath ?? workspacePath] });\n\n return {\n dir: path.dirname(pkgPath),\n version: '',\n bundled: false,\n module: require(pkgPath)\n };\n }\n if (!loaded) {\n throw new Error('Please call init function before get dependency.');\n }\n const deps = loaded[lib] as Dependency<RuntimeLibrary[L]>[];\n\n // When no filePath, read root workspace dep\n if (!filePath) {\n return deps[deps.length - 1];\n }\n // When only one dep, return it\n if (deps.length === 1) {\n return deps[0];\n }\n\n const possiblePaths: string[] = [];\n let tempPath = path.dirname(filePath);\n while (\n rootPathForConfig === tempPath ||\n getPathDepth(rootPathForConfig, path.sep) < getPathDepth(tempPath, path.sep)\n ) {\n possiblePaths.push(path.resolve(tempPath, `node_modules/${lib}`));\n tempPath = path.resolve(tempPath, '../');\n }\n\n const result = deps.find(dep => possiblePaths.includes(dep.dir));\n return result ?? deps[0];\n };\n\n const getBundled = <L extends keyof RuntimeLibrary>(lib: L): Dependency<RuntimeLibrary[L]> => {\n return {\n dir: '',\n version: '',\n bundled: true,\n module: bundledModules[lib]\n };\n };\n\n return {\n useWorkspaceDependencies,\n nodeModulesPaths,\n get,\n getBundled\n };\n};\n", "import { Connection, TextDocuments } from 'vscode-languageserver';\nimport { TextDocument } from 'vscode-languageserver-textdocument';\n\n/**\n * Service responsible for managing documents being syned through LSP\n * Todo - Switch to incremental sync\n */\nexport class DocumentService {\n private documents: TextDocuments<TextDocument>;\n\n constructor(conn: Connection) {\n this.documents = new TextDocuments(TextDocument);\n this.documents.listen(conn);\n }\n\n getDocument(uri: string) {\n return this.documents.get(uri);\n }\n\n getAllDocuments() {\n return this.documents.all();\n }\n\n get onDidChangeContent() {\n return this.documents.onDidChangeContent;\n }\n get onDidClose() {\n return this.documents.onDidClose;\n }\n}\n", "import path from 'path';\nimport {\n CodeAction,\n CodeActionParams,\n ColorInformation,\n ColorPresentation,\n ColorPresentationParams,\n CompletionItem,\n CompletionList,\n CompletionParams,\n CompletionTriggerKind,\n Definition,\n Diagnostic,\n DocumentColorParams,\n DocumentFormattingParams,\n DocumentHighlight,\n DocumentLink,\n DocumentLinkParams,\n DocumentSymbolParams,\n FileRename,\n FoldingRange,\n FoldingRangeParams,\n Hover,\n Location,\n SemanticTokens,\n SemanticTokensBuilder,\n SemanticTokensParams,\n SemanticTokensRangeParams,\n SignatureHelp,\n SymbolInformation,\n TextDocumentEdit,\n TextDocumentPositionParams,\n TextEdit\n} from 'vscode-languageserver';\nimport { TextDocument } from 'vscode-languageserver-textdocument';\nimport { URI } from 'vscode-uri';\nimport { LanguageId } from '../embeddedSupport/embeddedSupport';\nimport { LanguageMode, LanguageModes } from '../embeddedSupport/languageModes';\nimport { NULL_COMPLETION, NULL_HOVER, NULL_SIGNATURE } from '../modes/nullMode';\nimport { DocumentContext, CodeActionData, SemanticTokenData } from '../types';\nimport { VCancellationToken } from '../utils/cancellationToken';\nimport { getFileFsPath } from '../utils/paths';\nimport { DependencyService } from './dependencyService';\nimport { DocumentService } from './documentService';\nimport { EnvironmentService } from './EnvironmentService';\nimport { RefTokensService } from './RefTokenService';\nimport { VueInfoService } from './vueInfoService';\n\nexport interface ProjectService {\n env: EnvironmentService;\n languageModes: LanguageModes;\n onDocumentFormatting(params: DocumentFormattingParams): Promise<TextEdit[]>;\n onCompletion(params: CompletionParams): Promise<CompletionList>;\n onCompletionResolve(item: CompletionItem): Promise<CompletionItem>;\n onHover(params: TextDocumentPositionParams): Promise<Hover>;\n onDocumentHighlight(params: TextDocumentPositionParams): Promise<DocumentHighlight[]>;\n onDefinition(params: TextDocumentPositionParams): Promise<Definition>;\n onReferences(params: TextDocumentPositionParams): Promise<Location[]>;\n onDocumentLinks(params: DocumentLinkParams): Promise<DocumentLink[]>;\n onDocumentSymbol(params: DocumentSymbolParams): Promise<SymbolInformation[]>;\n onDocumentColors(params: DocumentColorParams): Promise<ColorInformation[]>;\n onColorPresentations(params: ColorPresentationParams): Promise<ColorPresentation[]>;\n onSignatureHelp(params: TextDocumentPositionParams): Promise<SignatureHelp | null>;\n onFoldingRanges(params: FoldingRangeParams): Promise<FoldingRange[]>;\n onCodeAction(params: CodeActionParams): Promise<CodeAction[]>;\n onCodeActionResolve(action: CodeAction): Promise<CodeAction>;\n onWillRenameFile(fileRename: FileRename): Promise<TextDocumentEdit[]>;\n onSemanticTokens(params: SemanticTokensParams | SemanticTokensRangeParams): Promise<SemanticTokens>;\n doValidate(doc: TextDocument, cancellationToken?: VCancellationToken): Promise<Diagnostic[] | null>;\n dispose(): Promise<void>;\n}\n\nexport async function createProjectService(\n env: EnvironmentService,\n documentService: DocumentService,\n globalSnippetDir: string | undefined,\n dependencyService: DependencyService,\n refTokensService: RefTokensService\n): Promise<ProjectService> {\n const vueInfoService = new VueInfoService();\n const languageModes = new LanguageModes();\n\n function getValidationFlags(): Record<string, boolean> {\n const config = env.getConfig();\n return {\n 'vue-html': config.vetur.validation.template || config.vetur.validation.templateProps,\n css: config.vetur.validation.style,\n postcss: config.vetur.validation.style,\n scss: config.vetur.validation.style,\n less: config.vetur.validation.style,\n javascript: config.vetur.validation.script\n };\n }\n\n vueInfoService.init(languageModes);\n await languageModes.init(\n env,\n {\n infoService: vueInfoService,\n dependencyService,\n refTokensService\n },\n globalSnippetDir\n );\n\n return {\n env,\n languageModes,\n async onDocumentFormatting({ textDocument, options }) {\n if (!env.getConfig().vetur.format.enable) {\n return [];\n }\n\n const doc = documentService.getDocument(textDocument.uri)!;\n\n const modeRanges = languageModes.getAllLanguageModeRangesInDocument(doc);\n const allEdits: TextEdit[] = [];\n\n const errMessages: string[] = [];\n\n modeRanges.forEach(modeRange => {\n if (modeRange.mode && modeRange.mode.format) {\n try {\n const edits = modeRange.mode.format(doc, { start: modeRange.start, end: modeRange.end }, options);\n for (const edit of edits) {\n allEdits.push(edit);\n }\n } catch (err) {\n errMessages.push((err as Error).toString());\n }\n }\n });\n\n if (errMessages.length !== 0) {\n console.error('Formatting failed: \"' + errMessages.join('\\n') + '\"');\n return [];\n }\n\n return allEdits;\n },\n async onCompletion({ textDocument, position, context }) {\n const doc = documentService.getDocument(textDocument.uri)!;\n const mode = languageModes.getModeAtPosition(doc, position);\n if (mode && mode.doComplete) {\n /**\n * Only use space as trigger character in `vue-html` mode\n */\n if (\n mode.getId() !== 'vue-html' &&\n context &&\n context?.triggerKind === CompletionTriggerKind.TriggerCharacter &&\n context.triggerCharacter === ' '\n ) {\n return NULL_COMPLETION;\n }\n\n return mode.doComplete(doc, position);\n }\n\n return NULL_COMPLETION;\n },\n async onCompletionResolve(item) {\n if (item.data) {\n const uri: string = item.data.uri;\n const languageId: LanguageId = item.data.languageId;\n\n /**\n * Template files need to go through HTML-template service\n */\n if (uri.endsWith('.template')) {\n const doc = documentService.getDocument(uri.slice(0, -'.template'.length));\n const mode = languageModes.getMode(languageId);\n if (doc && mode && mode.doResolve) {\n return mode.doResolve(doc, item);\n }\n }\n\n if (uri && languageId) {\n const doc = documentService.getDocument(uri);\n const mode = languageModes.getMode(languageId);\n if (doc && mode && mode.doResolve) {\n return mode.doResolve(doc, item);\n }\n }\n }\n\n return item;\n },\n async onHover({ textDocument, position }) {\n const doc = documentService.getDocument(textDocument.uri)!;\n const mode = languageModes.getModeAtPosition(doc, position);\n if (mode && mode.doHover) {\n return mode.doHover(doc, position);\n }\n return NULL_HOVER;\n },\n async onDocumentHighlight({ textDocument, position }) {\n const doc = documentService.getDocument(textDocument.uri)!;\n const mode = languageModes.getModeAtPosition(doc, position);\n if (mode && mode.findDocumentHighlight) {\n return mode.findDocumentHighlight(doc, position);\n }\n return [];\n },\n async onDefinition({ textDocument, position }) {\n const doc = documentService.getDocument(textDocument.uri)!;\n const mode = languageModes.getModeAtPosition(doc, position);\n if (mode && mode.findDefinition) {\n return mode.findDefinition(doc, position);\n }\n return [];\n },\n async onReferences({ textDocument, position }) {\n const doc = documentService.getDocument(textDocument.uri)!;\n const mode = languageModes.getModeAtPosition(doc, position);\n if (mode && mode.findReferences) {\n return mode.findReferences(doc, position);\n }\n return [];\n },\n async onDocumentLinks({ textDocument }) {\n const doc = documentService.getDocument(textDocument.uri)!;\n const documentContext: DocumentContext = {\n resolveReference: ref => {\n if (ref[0] === '/') {\n return URI.file(path.resolve(env.getProjectRoot(), ref)).toString();\n }\n const fsPath = getFileFsPath(doc.uri);\n return URI.file(path.resolve(fsPath, '..', ref)).toString();\n }\n };\n\n const links: DocumentLink[] = [];\n languageModes.getAllLanguageModeRangesInDocument(doc).forEach(m => {\n if (m.mode.findDocumentLinks) {\n links.push.apply(links, m.mode.findDocumentLinks(doc, documentContext));\n }\n });\n return links;\n },\n async onDocumentSymbol({ textDocument }) {\n const doc = documentService.getDocument(textDocument.uri)!;\n const symbols: SymbolInformation[] = [];\n\n languageModes.getAllLanguageModeRangesInDocument(doc).forEach(m => {\n if (m.mode.findDocumentSymbols) {\n symbols.push.apply(symbols, m.mode.findDocumentSymbols(doc));\n }\n });\n return symbols;\n },\n async onDocumentColors({ textDocument }) {\n const doc = documentService.getDocument(textDocument.uri)!;\n const colors: ColorInformation[] = [];\n\n const distinctModes: Set<LanguageMode> = new Set();\n languageModes.getAllLanguageModeRangesInDocument(doc).forEach(m => {\n distinctModes.add(m.mode);\n });\n\n for (const mode of distinctModes) {\n if (mode.findDocumentColors) {\n colors.push.apply(colors, mode.findDocumentColors(doc));\n }\n }\n\n return colors;\n },\n async onColorPresentations({ textDocument, color, range }) {\n const doc = documentService.getDocument(textDocument.uri)!;\n const mode = languageModes.getModeAtPosition(doc, range.start);\n if (mode && mode.getColorPresentations) {\n return mode.getColorPresentations(doc, color, range);\n }\n return [];\n },\n async onSignatureHelp({ textDocument, position }) {\n const doc = documentService.getDocument(textDocument.uri)!;\n const mode = languageModes.getModeAtPosition(doc, position);\n if (mode && mode.doSignatureHelp) {\n return mode.doSignatureHelp(doc, position);\n }\n return NULL_SIGNATURE;\n },\n async onFoldingRanges({ textDocument }) {\n const doc = documentService.getDocument(textDocument.uri)!;\n const lmrs = languageModes.getAllLanguageModeRangesInDocument(doc);\n\n const result: FoldingRange[] = [];\n\n lmrs.forEach(lmr => {\n if (lmr.mode.getFoldingRanges) {\n lmr.mode.getFoldingRanges(doc).forEach(r => result.push(r));\n }\n\n result.push({\n startLine: lmr.start.line,\n startCharacter: lmr.start.character,\n endLine: lmr.end.line,\n endCharacter: lmr.end.character\n });\n });\n\n return result;\n },\n async onCodeAction({ textDocument, range, context }: CodeActionParams) {\n if (!env.getConfig().vetur.languageFeatures.codeActions) {\n return [];\n }\n\n const doc = documentService.getDocument(textDocument.uri)!;\n const mode = languageModes.getModeAtPosition(doc, range.start);\n if (languageModes.getModeAtPosition(doc, range.end) !== mode) {\n return [];\n }\n if (mode && mode.getCodeActions) {\n return mode.getCodeActions(doc, range, /*formatParams*/ {} as any, context);\n }\n return [];\n },\n async onCodeActionResolve(action) {\n const data = action.data as CodeActionData | undefined;\n if (data) {\n const uri: string = data.uri;\n const languageId: LanguageId = data.languageId;\n\n if (uri && languageId) {\n const doc = documentService.getDocument(uri);\n const mode = languageModes.getMode(languageId);\n if (doc && mode && mode.doCodeActionResolve) {\n return mode.doCodeActionResolve(doc, action);\n }\n }\n }\n\n return action;\n },\n async onWillRenameFile(fileRename: FileRename) {\n if (!env.getConfig().vetur.languageFeatures.updateImportOnFileMove) {\n return [];\n }\n\n const textDocumentEdit = languageModes.getMode('typescript')?.getRenameFileEdit?.(fileRename);\n\n return textDocumentEdit ?? [];\n },\n async onSemanticTokens(params: SemanticTokensParams | SemanticTokensRangeParams) {\n if (!env.getConfig().vetur.languageFeatures.semanticTokens) {\n return {\n data: []\n };\n }\n\n const { textDocument } = params;\n const range = 'range' in params ? params.range : undefined;\n const doc = documentService.getDocument(textDocument.uri)!;\n const modes = languageModes.getAllLanguageModeRangesInDocument(doc);\n const data: SemanticTokenData[] = [];\n\n for (const mode of modes) {\n const tokenData = mode.mode.getSemanticTokens?.(doc, range);\n\n data.push(...(tokenData ?? []));\n }\n\n const builder = new SemanticTokensBuilder();\n const sorted = data.sort((a, b) => {\n return a.line - b.line || a.character - b.character;\n });\n sorted.forEach(token =>\n builder.push(token.line, token.character, token.length, token.classificationType, token.modifierSet)\n );\n\n return builder.build();\n },\n async doValidate(doc: TextDocument, cancellationToken?: VCancellationToken) {\n const diagnostics: Diagnostic[] = [];\n if (doc.languageId === 'vue') {\n const validationFlags = getValidationFlags();\n for (const lmr of languageModes.getAllLanguageModeRangesInDocument(doc)) {\n if (lmr.mode.doValidation) {\n if (validationFlags[lmr.mode.getId()]) {\n diagnostics.push.apply(diagnostics, await lmr.mode.doValidation(doc, cancellationToken));\n }\n // Special case for template type checking\n else if (\n lmr.mode.getId() === 'vue-html' &&\n env.getConfig().vetur.experimental.templateInterpolationService\n ) {\n diagnostics.push.apply(diagnostics, await lmr.mode.doValidation(doc, cancellationToken));\n }\n }\n }\n }\n if (cancellationToken?.isCancellationRequested) {\n return null;\n }\n return diagnostics;\n },\n async dispose() {\n languageModes.dispose();\n }\n };\n}\n", "import { TextDocument } from 'vscode-languageserver-textdocument';\nimport { getFileFsPath } from '../utils/paths';\nimport { Definition } from 'vscode-languageserver-types';\nimport { LanguageModes } from '../embeddedSupport/languageModes';\n\n/**\n * State associated with a specific Vue file\n * The state is shared between different modes\n */\nexport interface VueFileInfo {\n /**\n * The default export component info from script section\n */\n componentInfo: ComponentInfo;\n}\n\nexport interface ComponentInfo {\n name?: string;\n definition?: Definition;\n\n insertInOptionAPIPos?: number;\n componentsDefine?: {\n start: number;\n end: number;\n insertPos: number;\n };\n childComponents?: ChildComponent[];\n\n emits?: EmitInfo[];\n /**\n * Todo: Extract type info in cases like\n * props: {\n * foo: String\n * }\n */\n props?: PropInfo[];\n data?: DataInfo[];\n computed?: ComputedInfo[];\n methods?: MethodInfo[];\n}\n\nexport interface ChildComponent {\n name: string;\n documentation?: string;\n definition?: {\n path: string;\n start: number;\n end: number;\n };\n global: boolean;\n info?: VueFileInfo;\n}\n\nexport interface EmitInfo {\n name: string;\n /**\n * `true` if\n * emits: {\n * foo: (...) => {...}\n * }\n *\n * `false` if\n * - `emits: ['foo']`\n * - `@Emit()`\n * - `emits: { foo: null }`\n */\n hasValidator: boolean;\n documentation?: string;\n typeString?: string;\n}\n\nexport interface PropInfo {\n name: string;\n /**\n * `true` if\n * props: {\n * foo: { ... }\n * }\n *\n * `false` if\n * - `props: ['foo']`\n * - `props: { foo: String }`\n *\n */\n hasObjectValidator: boolean;\n required: boolean;\n isBoundToModel: boolean;\n documentation?: string;\n typeString?: string;\n}\nexport interface DataInfo {\n name: string;\n documentation?: string;\n}\nexport interface ComputedInfo {\n name: string;\n documentation?: string;\n}\nexport interface MethodInfo {\n name: string;\n documentation?: string;\n}\n\nexport class VueInfoService {\n private languageModes: LanguageModes;\n private vueFileInfo: Map<string, VueFileInfo> = new Map();\n\n constructor() {}\n\n init(languageModes: LanguageModes) {\n this.languageModes = languageModes;\n }\n\n updateInfo(doc: TextDocument, info: VueFileInfo) {\n this.vueFileInfo.set(getFileFsPath(doc.uri), info);\n }\n\n getInfo(doc: TextDocument) {\n this.languageModes.getAllLanguageModeRangesInDocument(doc).forEach(m => {\n if (m.mode.updateFileInfo) {\n m.mode.updateFileInfo(doc);\n }\n });\n return this.vueFileInfo.get(getFileFsPath(doc.uri));\n }\n}\n", "import path from 'path';\nimport {\n getFileFsPath,\n getFsPathToUri,\n getPathDepth,\n normalizeFileNameToFsPath,\n normalizeFileNameResolve\n} from '../utils/paths';\n\nimport {\n DidChangeConfigurationParams,\n DocumentColorParams,\n DocumentFormattingParams,\n DocumentLinkParams,\n FileChangeType,\n Connection,\n TextDocumentPositionParams,\n ColorPresentationParams,\n InitializeParams,\n ServerCapabilities,\n TextDocumentSyncKind,\n DocumentFormattingRequest,\n Disposable,\n DocumentSymbolParams,\n CodeActionParams,\n CompletionParams,\n ExecuteCommandParams,\n FoldingRangeParams,\n RenameFilesParams,\n SemanticTokensParams,\n SemanticTokens,\n SemanticTokensRangeParams,\n SemanticTokensRequest,\n SemanticTokensRangeRequest\n} from 'vscode-languageserver';\nimport {\n ColorInformation,\n CompletionItem,\n CompletionList,\n Definition,\n DocumentHighlight,\n DocumentLink,\n Hover,\n Location,\n SignatureHelp,\n SymbolInformation,\n TextEdit,\n ColorPresentation,\n FoldingRange,\n DocumentUri,\n CodeAction,\n CodeActionKind,\n TextDocumentIdentifier\n} from 'vscode-languageserver-types';\nimport type { Range, TextDocument } from 'vscode-languageserver-textdocument';\n\nimport { NULL_COMPLETION, NULL_HOVER, NULL_SIGNATURE } from '../modes/nullMode';\nimport { createDependencyService, createNodeModulesPaths } from './dependencyService';\nimport _ from 'lodash';\nimport { DocumentService } from './documentService';\nimport { VueHTMLMode } from '../modes/template';\nimport { logger } from '../log';\nimport { getDefaultVLSConfig, VLSFullConfig, getVeturFullConfig, VeturFullConfig, BasicComponentInfo } from '../config';\nimport { VCancellationToken, VCancellationTokenSource } from '../utils/cancellationToken';\nimport { findConfigFile, requireUncached } from '../utils/workspace';\nimport { createProjectService, ProjectService } from './projectService';\nimport { createEnvironmentService } from './EnvironmentService';\nimport { getVueVersionKey, inferVueVersion, VueVersion } from '../utils/vueVersion';\nimport { accessSync, constants, existsSync } from 'fs';\nimport { sleep } from '../utils/sleep';\nimport { URI } from 'vscode-uri';\nimport { getSemanticTokenLegends } from '../modes/script/semanticToken';\nimport { createRefTokensService } from './RefTokenService';\n\ninterface ProjectConfig {\n vlsFullConfig: VLSFullConfig;\n isExistVeturConfig: boolean;\n rootPathForConfig: string;\n workspaceFsPath: string;\n rootFsPath: string;\n tsconfigPath: string | undefined;\n packagePath: string | undefined;\n snippetFolder: string;\n globalComponents: BasicComponentInfo[];\n}\n\nexport class VLS {\n private workspaces: Map<\n string,\n VeturFullConfig & { name: string; workspaceFsPath: string; isExistVeturConfig: boolean }\n >;\n private nodeModulesMap: Map<string, string[]>;\n private documentService: DocumentService;\n private globalSnippetDir: string;\n private loadingProjects: string[];\n private projects: Map<string, ProjectService>;\n private pendingValidationRequests: { [uri: string]: NodeJS.Timer } = {};\n private cancellationTokenValidationRequests: { [uri: string]: VCancellationTokenSource } = {};\n private validationDelayMs = 200;\n\n private documentFormatterRegistration: Disposable | undefined;\n\n private workspaceConfig: unknown;\n\n constructor(private lspConnection: Connection) {\n this.documentService = new DocumentService(this.lspConnection);\n this.workspaces = new Map();\n this.projects = new Map();\n this.nodeModulesMap = new Map();\n this.loadingProjects = [];\n }\n\n async init(params: InitializeParams) {\n let rootFsPath = '';\n if (params.rootPath) {\n rootFsPath = normalizeFileNameToFsPath(params.rootPath);\n } else if (params.rootUri) {\n rootFsPath = getFileFsPath(params.rootUri);\n }\n const workspaceFolders =\n Array.isArray(params.workspaceFolders) && params.capabilities.workspace?.workspaceFolders\n ? params.workspaceFolders.map(el => ({ name: el.name, fsPath: getFileFsPath(el.uri) }))\n : rootFsPath\n ? [{ name: '', fsPath: rootFsPath }]\n : [];\n\n if (workspaceFolders.length === 0) {\n console.error('No workspace path found. Vetur initialization failed.');\n return {\n capabilities: {}\n };\n }\n\n this.globalSnippetDir = params.initializationOptions?.globalSnippetDir;\n\n await Promise.all(workspaceFolders.map(workspace => this.addWorkspace(workspace)));\n\n this.workspaceConfig = this.getVLSFullConfig({}, params.initializationOptions?.config);\n\n if (params.capabilities.workspace?.workspaceFolders) {\n this.setupWorkspaceListeners();\n }\n this.setupConfigListeners();\n this.setupLSPHandlers();\n this.setupCustomLSPHandlers();\n this.setupFileChangeListeners();\n\n this.lspConnection.onShutdown(() => {\n this.dispose();\n });\n }\n\n listen() {\n this.lspConnection.listen();\n }\n\n private getVLSFullConfig(settings: VeturFullConfig['settings'], config: any | undefined): VLSFullConfig {\n const result = config ? _.merge(getDefaultVLSConfig(), config) : getDefaultVLSConfig();\n Object.keys(settings).forEach(key => {\n _.set(result, key, settings[key]);\n });\n return result;\n }\n\n private async addWorkspace(workspace: { name: string; fsPath: string }) {\n // Enable Yarn PnP support https://yarnpkg.com/features/pnp\n if (!process.versions.pnp) {\n if (existsSync(path.join(workspace.fsPath, '.pnp.js'))) {\n require(path.join(workspace.fsPath, '.pnp.js')).setup();\n } else if (existsSync(path.join(workspace.fsPath, '.pnp.cjs'))) {\n require(path.join(workspace.fsPath, '.pnp.cjs')).setup();\n }\n }\n\n let veturConfigPath = findConfigFile(workspace.fsPath, 'vetur.config.js');\n if (!veturConfigPath) {\n veturConfigPath = findConfigFile(workspace.fsPath, 'vetur.config.cjs');\n }\n const rootPathForConfig = normalizeFileNameToFsPath(\n veturConfigPath ? path.dirname(veturConfigPath) : workspace.fsPath\n );\n if (!this.workspaces.has(rootPathForConfig)) {\n this.workspaces.set(rootPathForConfig, {\n name: workspace.name,\n ...(await getVeturFullConfig(\n rootPathForConfig,\n workspace.fsPath,\n veturConfigPath ? requireUncached(veturConfigPath) : {}\n )),\n isExistVeturConfig: !!veturConfigPath,\n workspaceFsPath: workspace.fsPath\n });\n }\n }\n\n private setupWorkspaceListeners() {\n this.lspConnection.onInitialized(() => {\n this.lspConnection.workspace.onDidChangeWorkspaceFolders(async e => {\n await Promise.all(e.added.map(el => this.addWorkspace({ name: el.name, fsPath: getFileFsPath(el.uri) })));\n });\n });\n }\n\n private setupConfigListeners() {\n this.lspConnection.onDidChangeConfiguration(async ({ settings }: DidChangeConfigurationParams) => {\n this.workspaceConfig = this.getVLSFullConfig({}, settings);\n let isFormatEnable = (this.workspaceConfig as VLSFullConfig)?.vetur?.format?.enable ?? false;\n logger.setLevel((this.workspaceConfig as VLSFullConfig)?.vetur?.dev.logLevel);\n this.projects.forEach(project => {\n const veturConfig = this.workspaces.get(project.env.getRootPathForConfig());\n if (!veturConfig) {\n return;\n }\n const fullConfig = this.getVLSFullConfig(veturConfig.settings, this.workspaceConfig);\n project.env.configure(fullConfig);\n isFormatEnable = isFormatEnable || fullConfig.vetur.format.enable;\n });\n this.setupDynamicFormatters(isFormatEnable);\n });\n\n this.documentService.getAllDocuments().forEach(this.triggerValidation);\n }\n\n private getAllProjectConfigs(): ProjectConfig[] {\n return _.flatten(\n Array.from(this.workspaces.entries()).map(([rootPathForConfig, veturConfig]) =>\n veturConfig.projects.map(project => ({\n ...project,\n rootPathForConfig,\n vlsFullConfig: this.getVLSFullConfig(veturConfig.settings, this.workspaceConfig),\n workspaceFsPath: veturConfig.workspaceFsPath,\n isExistVeturConfig: veturConfig.isExistVeturConfig\n }))\n )\n )\n .map(project => ({\n vlsFullConfig: project.vlsFullConfig,\n isExistVeturConfig: project.isExistVeturConfig,\n rootPathForConfig: project.rootPathForConfig,\n workspaceFsPath: project.workspaceFsPath,\n rootFsPath: project.root,\n tsconfigPath: project.tsconfig,\n packagePath: project.package,\n snippetFolder: project.snippetFolder,\n globalComponents: project.globalComponents\n }))\n .sort((a, b) => getPathDepth(b.rootFsPath, '/') - getPathDepth(a.rootFsPath, '/'));\n }\n\n private warnProjectIfNeed(projectConfig: ProjectConfig) {\n if (projectConfig.vlsFullConfig.vetur.ignoreProjectWarning) {\n return;\n }\n\n const isFileCanAccess = (fsPath: string) => {\n try {\n accessSync(fsPath, constants.R_OK);\n return true;\n } catch {\n return false;\n }\n };\n const showErrorIfCantAccess = (name: string, fsPath: string) => {\n this.lspConnection.window.showErrorMessage(`Vetur can't access ${fsPath} for ${name}.`);\n };\n\n const showWarningAndLearnMore = (message: string, url: string) => {\n this.lspConnection.window.showWarningMessage(message, { title: 'Learn More' }).then(action => {\n if (action) {\n this.openWebsite(url);\n }\n });\n };\n\n const getCantFindMessage = (fileNames: string[]) =>\n `Vetur can't find ${fileNames.map(el => `\\`${el}\\``).join(' or ')} in ${projectConfig.rootFsPath}.`;\n if (!projectConfig.tsconfigPath) {\n showWarningAndLearnMore(\n getCantFindMessage(['tsconfig.json', 'jsconfig.json']),\n 'https://vuejs.github.io/vetur/guide/FAQ.html#vetur-can-t-find-tsconfig-json-jsconfig-json-in-xxxx-xxxxxx'\n );\n } else if (!isFileCanAccess(projectConfig.tsconfigPath)) {\n showErrorIfCantAccess('ts/js config', projectConfig.tsconfigPath);\n } else {\n if (\n !projectConfig.isExistVeturConfig &&\n ![\n normalizeFileNameResolve(projectConfig.rootFsPath, 'tsconfig.json'),\n normalizeFileNameResolve(projectConfig.rootFsPath, 'jsconfig.json')\n ].includes(projectConfig.tsconfigPath ?? '')\n ) {\n showWarningAndLearnMore(\n `Vetur found \\`tsconfig.json\\`/\\`jsconfig.json\\`, but they aren\\'t in the project root.`,\n 'https://vuejs.github.io/vetur/guide/FAQ.html#vetur-found-xxx-but-they-aren-t-in-the-project-root'\n );\n }\n }\n\n if (!projectConfig.packagePath) {\n showWarningAndLearnMore(\n getCantFindMessage(['package.json']),\n 'https://vuejs.github.io/vetur/guide/FAQ.html#vetur-can-t-find-package-json-in-xxxx-xxxxxx'\n );\n } else if (!isFileCanAccess(projectConfig.packagePath)) {\n showErrorIfCantAccess('ts/js config', projectConfig.packagePath);\n } else {\n if (\n !projectConfig.isExistVeturConfig &&\n normalizeFileNameResolve(projectConfig.rootFsPath, 'package.json') !== projectConfig.packagePath\n ) {\n showWarningAndLearnMore(\n `Vetur found \\`package.json\\`/, but it isn\\'t in the project root.`,\n 'https://vuejs.github.io/vetur/guide/FAQ.html#vetur-found-xxx-but-they-aren-t-in-the-project-root'\n );\n }\n if (inferVueVersion(projectConfig.packagePath) === VueVersion.V30) {\n showWarningAndLearnMore(\n `In the vue 3 project, The Vue Language Features (Volar) is new recommended extension in VSCode.`,\n 'https://marketplace.visualstudio.com/items?itemName=Vue.volar'\n );\n }\n }\n }\n\n getProjectRootPath(uri: DocumentUri): string | undefined {\n return this.getProjectConfig(uri)?.rootFsPath;\n }\n\n private getProjectConfig(uri: DocumentUri): ProjectConfig | undefined {\n const projectConfigs = this.getAllProjectConfigs();\n const docFsPath = getFileFsPath(uri);\n const projectConfig = projectConfigs.find(\n projectConfig =>\n docFsPath.startsWith(projectConfig.rootFsPath) &&\n ['/', '\\\\'].includes(docFsPath.substring(projectConfig.rootFsPath.length, projectConfig.rootFsPath.length + 1))\n );\n\n return projectConfig;\n }\n\n private async getProjectService(uri: DocumentUri): Promise<ProjectService | undefined> {\n const projectConfig = this.getProjectConfig(uri);\n if (!projectConfig) {\n return undefined;\n }\n const useWorkspaceDependencies = projectConfig.vlsFullConfig.vetur.useWorkspaceDependencies;\n if (this.projects.has(projectConfig.rootFsPath)) {\n const project = this.projects.get(projectConfig.rootFsPath);\n if (project?.env.getConfig().vetur.useWorkspaceDependencies === useWorkspaceDependencies) {\n return project;\n }\n }\n // Load project once\n if (this.loadingProjects.includes(projectConfig.rootFsPath)) {\n while (!this.projects.has(projectConfig.rootFsPath)) {\n await sleep(500);\n }\n return this.projects.get(projectConfig.rootFsPath);\n }\n\n // init project\n // Yarn Pnp don't need this. https://yarnpkg.com/features/pnp\n this.loadingProjects.push(projectConfig.rootFsPath);\n const workDoneProgress = await this.lspConnection.window.createWorkDoneProgress();\n workDoneProgress.begin(`Load project: ${projectConfig.rootFsPath}`, undefined);\n const nodeModulePaths = useWorkspaceDependencies\n ? this.nodeModulesMap.get(projectConfig.rootPathForConfig) ??\n createNodeModulesPaths(projectConfig.rootPathForConfig)\n : [];\n if (useWorkspaceDependencies) {\n this.nodeModulesMap.set(projectConfig.rootPathForConfig, nodeModulePaths);\n }\n const dependencyService = await createDependencyService(\n projectConfig.rootPathForConfig,\n projectConfig.workspaceFsPath,\n projectConfig.vlsFullConfig.vetur.useWorkspaceDependencies,\n nodeModulePaths,\n projectConfig.vlsFullConfig.typescript.tsdk\n );\n this.warnProjectIfNeed(projectConfig);\n const project = await createProjectService(\n createEnvironmentService(\n projectConfig.rootPathForConfig,\n projectConfig.rootFsPath,\n projectConfig.tsconfigPath,\n projectConfig.packagePath,\n projectConfig.snippetFolder,\n projectConfig.globalComponents,\n projectConfig.vlsFullConfig\n ),\n this.documentService,\n this.globalSnippetDir,\n dependencyService,\n createRefTokensService(this.lspConnection)\n );\n this.projects.set(projectConfig.rootFsPath, project);\n workDoneProgress.done();\n return project;\n }\n\n private setupLSPHandlers() {\n this.lspConnection.onCompletion(this.onCompletion.bind(this));\n this.lspConnection.onCompletionResolve(this.onCompletionResolve.bind(this));\n\n this.lspConnection.onDefinition(this.onDefinition.bind(this));\n this.lspConnection.onDocumentFormatting(this.onDocumentFormatting.bind(this));\n this.lspConnection.onDocumentHighlight(this.onDocumentHighlight.bind(this));\n this.lspConnection.onDocumentLinks(this.onDocumentLinks.bind(this));\n this.lspConnection.onDocumentSymbol(this.onDocumentSymbol.bind(this));\n this.lspConnection.onHover(this.onHover.bind(this));\n this.lspConnection.onReferences(this.onReferences.bind(this));\n this.lspConnection.onSignatureHelp(this.onSignatureHelp.bind(this));\n this.lspConnection.onFoldingRanges(this.onFoldingRanges.bind(this));\n this.lspConnection.onCodeAction(this.onCodeAction.bind(this));\n this.lspConnection.onCodeActionResolve(this.onCodeActionResolve.bind(this));\n this.lspConnection.workspace.onWillRenameFiles(this.onWillRenameFiles.bind(this));\n this.lspConnection.languages.semanticTokens.on(this.onSemanticToken.bind(this));\n this.lspConnection.languages.semanticTokens.onRange(this.onSemanticToken.bind(this));\n\n this.lspConnection.onDocumentColor(this.onDocumentColors.bind(this));\n this.lspConnection.onColorPresentation(this.onColorPresentations.bind(this));\n\n this.lspConnection.onExecuteCommand(this.executeCommand.bind(this));\n }\n\n private setupCustomLSPHandlers() {\n this.lspConnection.onRequest('$/doctor', async ({ fileName }) => {\n const uri = getFsPathToUri(fileName);\n const projectConfigs = this.getAllProjectConfigs();\n const project = await this.getProjectService(uri);\n\n return JSON.stringify(\n {\n name: 'Vetur doctor info',\n fileName,\n currentProject: {\n vueVersion: project ? getVueVersionKey(project?.env.getVueVersion()) : null,\n rootPathForConfig: project?.env.getRootPathForConfig() ?? null,\n projectRootFsPath: project?.env.getProjectRoot() ?? null\n },\n activeProjects: Array.from(this.projects.keys()),\n projectConfigs\n },\n null,\n 2\n );\n });\n\n this.lspConnection.onRequest('$/queryVirtualFileInfo', async ({ fileName, currFileText }) => {\n const project = await this.getProjectService(getFsPathToUri(fileName));\n return (project?.languageModes.getMode('vue-html') as VueHTMLMode).queryVirtualFileInfo(fileName, currFileText);\n });\n\n this.lspConnection.onRequest('$/getDiagnostics', async params => {\n const doc = this.documentService.getDocument(params.uri);\n if (doc) {\n const diagnostics = await this.doValidate(doc);\n return diagnostics ?? [];\n }\n return [];\n });\n }\n\n private async setupDynamicFormatters(enable: boolean) {\n if (enable) {\n if (!this.documentFormatterRegistration) {\n this.documentFormatterRegistration = await this.lspConnection.client.register(DocumentFormattingRequest.type, {\n documentSelector: [{ language: 'vue' }]\n });\n }\n } else {\n if (this.documentFormatterRegistration) {\n this.documentFormatterRegistration.dispose();\n }\n }\n }\n\n private setupFileChangeListeners() {\n this.documentService.onDidChangeContent(change => {\n this.triggerValidation(change.document);\n });\n this.documentService.onDidClose(e => {\n this.removeDocument(e.document);\n this.lspConnection.sendDiagnostics({ uri: e.document.uri, diagnostics: [] });\n });\n this.lspConnection.onDidChangeWatchedFiles(({ changes }) => {\n changes.forEach(async c => {\n if (c.type === FileChangeType.Changed) {\n const fsPath = getFileFsPath(c.uri);\n\n // when `vetur.config.js` changed\n if (this.workspaces.has(fsPath)) {\n logger.logInfo(`refresh vetur config when ${fsPath} changed.`);\n const name = this.workspaces.get(fsPath)?.name ?? '';\n this.workspaces.delete(fsPath);\n await this.addWorkspace({ name, fsPath });\n this.projects.forEach((project, projectRoot) => {\n if (project.env.getRootPathForConfig() === fsPath) {\n project.dispose();\n this.projects.delete(projectRoot);\n }\n });\n return;\n }\n\n const project = await this.getProjectService(c.uri);\n project?.languageModes.getAllModes().forEach(m => {\n if (m.onDocumentChanged) {\n m.onDocumentChanged(fsPath);\n }\n });\n }\n });\n\n this.documentService.getAllDocuments().forEach(d => {\n this.triggerValidation(d);\n });\n });\n }\n\n /**\n * Custom Notifications\n */\n openWebsite(url: string): void {\n this.lspConnection.window.showDocument({ uri: URI.parse(url).toString(), external: true });\n }\n\n /**\n * Language Features\n */\n\n async onDocumentFormatting(params: DocumentFormattingParams): Promise<TextEdit[]> {\n const project = await this.getProjectService(params.textDocument.uri);\n\n return project?.onDocumentFormatting(params) ?? [];\n }\n\n async onCompletion(params: CompletionParams): Promise<CompletionList> {\n const project = await this.getProjectService(params.textDocument.uri);\n\n return project?.onCompletion(params) ?? NULL_COMPLETION;\n }\n\n async onCompletionResolve(item: CompletionItem): Promise<CompletionItem> {\n if (!item.data) {\n return item;\n }\n const project = await this.getProjectService(item.data.uri);\n\n return project?.onCompletionResolve(item) ?? item;\n }\n\n async onHover(params: TextDocumentPositionParams): Promise<Hover> {\n const project = await this.getProjectService(params.textDocument.uri);\n\n return project?.onHover(params) ?? NULL_HOVER;\n }\n\n async onDocumentHighlight(params: TextDocumentPositionParams): Promise<DocumentHighlight[]> {\n const project = await this.getProjectService(params.textDocument.uri);\n\n return project?.onDocumentHighlight(params) ?? [];\n }\n\n async onDefinition(params: TextDocumentPositionParams): Promise<Definition> {\n const project = await this.getProjectService(params.textDocument.uri);\n\n return project?.onDefinition(params) ?? [];\n }\n\n async onReferences(params: TextDocumentPositionParams): Promise<Location[]> {\n const project = await this.getProjectService(params.textDocument.uri);\n\n return project?.onReferences(params) ?? [];\n }\n\n async onDocumentLinks(params: DocumentLinkParams): Promise<DocumentLink[]> {\n const project = await this.getProjectService(params.textDocument.uri);\n\n return project?.onDocumentLinks(params) ?? [];\n }\n\n async onDocumentSymbol(params: DocumentSymbolParams): Promise<SymbolInformation[]> {\n const project = await this.getProjectService(params.textDocument.uri);\n\n return project?.onDocumentSymbol(params) ?? [];\n }\n\n async onDocumentColors(params: DocumentColorParams): Promise<ColorInformation[]> {\n const project = await this.getProjectService(params.textDocument.uri);\n\n return project?.onDocumentColors(params) ?? [];\n }\n\n async onColorPresentations(params: ColorPresentationParams): Promise<ColorPresentation[]> {\n const project = await this.getProjectService(params.textDocument.uri);\n\n return project?.onColorPresentations(params) ?? [];\n }\n\n async onSignatureHelp(params: TextDocumentPositionParams): Promise<SignatureHelp | null> {\n const project = await this.getProjectService(params.textDocument.uri);\n\n return project?.onSignatureHelp(params) ?? NULL_SIGNATURE;\n }\n\n async onFoldingRanges(params: FoldingRangeParams): Promise<FoldingRange[]> {\n const project = await this.getProjectService(params.textDocument.uri);\n\n return project?.onFoldingRanges(params) ?? [];\n }\n\n async onCodeAction(params: CodeActionParams) {\n const project = await this.getProjectService(params.textDocument.uri);\n\n return project?.onCodeAction(params) ?? [];\n }\n\n async onCodeActionResolve(action: CodeAction) {\n if (!action.data) {\n return action;\n }\n const project = await this.getProjectService((action.data as { uri: string })?.uri);\n\n return project?.onCodeActionResolve(action) ?? action;\n }\n\n async onWillRenameFiles({ files }: RenameFilesParams) {\n const inTheSameProject = files.filter(file => {\n const oldFileProject = this.getProjectRootPath(file.oldUri);\n const newFileProject = this.getProjectRootPath(file.newUri);\n\n return oldFileProject && newFileProject && oldFileProject === newFileProject;\n });\n\n const documentChanges = _.flatten(\n await Promise.all(\n inTheSameProject.map(async rename => {\n const projectService = await this.getProjectService(rename.newUri);\n\n return projectService?.onWillRenameFile(rename) ?? [];\n })\n )\n );\n\n if (!documentChanges.length) {\n return null;\n }\n\n return {\n documentChanges\n };\n }\n\n async onSemanticToken(params: SemanticTokensParams | SemanticTokensRangeParams): Promise<SemanticTokens> {\n const project = await this.getProjectService(params.textDocument.uri);\n\n return project?.onSemanticTokens(params) ?? { data: [] as number[] };\n }\n\n private triggerValidation(textDocument: TextDocument): void {\n if (textDocument.uri.includes('node_modules')) {\n return;\n }\n\n this.cleanPendingValidation(textDocument);\n this.cancelPastValidation(textDocument);\n this.pendingValidationRequests[textDocument.uri] = setTimeout(() => {\n delete this.pendingValidationRequests[textDocument.uri];\n this.cancellationTokenValidationRequests[textDocument.uri] = new VCancellationTokenSource();\n this.validateTextDocument(textDocument, this.cancellationTokenValidationRequests[textDocument.uri].token);\n }, this.validationDelayMs);\n }\n\n cancelPastValidation(textDocument: TextDocument): void {\n const source = this.cancellationTokenValidationRequests[textDocument.uri];\n if (source) {\n source.cancel();\n source.dispose();\n delete this.cancellationTokenValidationRequests[textDocument.uri];\n }\n }\n\n cleanPendingValidation(textDocument: TextDocument): void {\n const request = this.pendingValidationRequests[textDocument.uri];\n if (request) {\n clearTimeout(request);\n delete this.pendingValidationRequests[textDocument.uri];\n }\n }\n\n async validateTextDocument(textDocument: TextDocument, cancellationToken?: VCancellationToken) {\n const diagnostics = await this.doValidate(textDocument, cancellationToken);\n if (diagnostics) {\n this.lspConnection.sendDiagnostics({ uri: textDocument.uri, diagnostics });\n }\n }\n\n async doValidate(doc: TextDocument, cancellationToken?: VCancellationToken) {\n const project = await this.getProjectService(doc.uri);\n\n return project?.doValidate(doc, cancellationToken) ?? null;\n }\n\n async executeCommand(arg: ExecuteCommandParams) {\n logger.logInfo(`Unknown command ${arg.command}.`);\n }\n\n async removeDocument(doc: TextDocument): Promise<void> {\n const project = await this.getProjectService(doc.uri);\n project?.languageModes.onDocumentRemoved(doc);\n }\n\n dispose(): void {\n this.projects.forEach(project => {\n project.dispose();\n });\n }\n\n get capabilities(): ServerCapabilities {\n return {\n textDocumentSync: TextDocumentSyncKind.Incremental,\n workspace: {\n workspaceFolders: { supported: true, changeNotifications: true },\n fileOperations: { willRename: { filters: [{ pattern: { glob: '**/*.{ts,js,vue}' } }] } }\n },\n completionProvider: { resolveProvider: true, triggerCharacters: ['.', ':', '<', '\"', \"'\", '/', '@', '*', ' '] },\n signatureHelpProvider: { triggerCharacters: ['('] },\n documentFormattingProvider: false,\n hoverProvider: true,\n documentHighlightProvider: true,\n documentLinkProvider: {\n resolveProvider: false\n },\n documentSymbolProvider: true,\n definitionProvider: true,\n referencesProvider: true,\n codeActionProvider: {\n codeActionKinds: [\n CodeActionKind.QuickFix,\n CodeActionKind.Refactor,\n CodeActionKind.RefactorExtract,\n CodeActionKind.RefactorInline,\n CodeActionKind.RefactorRewrite,\n CodeActionKind.Source,\n CodeActionKind.SourceOrganizeImports\n ],\n resolveProvider: true\n },\n colorProvider: true,\n executeCommandProvider: {\n commands: []\n },\n foldingRangeProvider: true,\n semanticTokensProvider: {\n range: true,\n full: true,\n legend: getSemanticTokenLegends()\n }\n };\n }\n}\n", "export function sleep(ms: number) {\n return new Promise(resolve => {\n setTimeout(resolve, ms);\n });\n}\n", "import assert from 'assert';\nimport {\n CompletionList,\n CompletionItemKind,\n Position,\n CompletionItem,\n TextEdit,\n InsertReplaceEdit\n} from 'vscode-languageserver-types';\nimport { TextDocument } from 'vscode-languageserver-textdocument';\n\nexport interface CompletionTestSetup {\n doComplete(doc: TextDocument, pos: Position): CompletionList;\n langId: string;\n docUri: string;\n}\n\nexport function testDSL(setup: CompletionTestSetup): (text: TemplateStringsArray) => CompletionAsserter {\n return function test([value]: TemplateStringsArray) {\n const offset = value.indexOf('|');\n value = value.substring(0, offset) + value.slice(offset + 1);\n\n const document = TextDocument.create(setup.docUri, setup.langId, 0, value);\n const position = document.positionAt(offset);\n const items = setup.doComplete(document, position).items;\n return new CompletionAsserter(items, document);\n };\n}\n\nexport class CompletionAsserter {\n lastMatch!: CompletionItem;\n constructor(public items: CompletionItem[], public doc: TextDocument) {}\n count(expect: number) {\n const actual = this.items.length;\n assert.equal(actual, expect, `Expect completions has length: ${expect}, actual: ${actual}`);\n return this;\n }\n has(label: string) {\n const items = this.items;\n const matches = items.filter(completion => completion.label === label);\n assert.equal(matches.length, 1, label + ' should exist once: Actual: ' + items.map(c => c.label).join(', '));\n this.lastMatch = matches[0];\n return this;\n }\n withDoc(doc: string) {\n const documentation = this.lastMatch.documentation;\n if (typeof documentation === 'object' && documentation !== null) {\n assert.equal(documentation.value, doc);\n } else {\n assert.equal(documentation, doc);\n }\n return this;\n }\n withKind(kind: CompletionItemKind) {\n assert.equal(this.lastMatch.kind, kind);\n return this;\n }\n become(resultText: string) {\n assert.equal(applyEdits(this.doc, [this.lastMatch.textEdit!]), resultText);\n return this;\n }\n hasNo(label: string) {\n this.lastMatch = undefined as any;\n const items = this.items;\n const matches = items.filter(completion => completion.label === label);\n assert.equal(matches.length, 0, label + ' should not exist. Actual: ' + items.map(c => c.label).join(', '));\n return this;\n }\n}\n\nfunction applyEdits(document: TextDocument, edits: (TextEdit | InsertReplaceEdit | undefined)[]): string {\n let text = document.getText();\n\n const textEdits = edits.filter(isTextEdit);\n const textReplaceEdits = edits.filter(isInsertReplaceEdit);\n\n text = applyTextEdits(document, text, textEdits);\n text = applyInsertReplaceEdits(document, text, textReplaceEdits);\n return text;\n}\n\nfunction applyTextEdits(document: TextDocument, text: string, edits: TextEdit[]) {\n const sortedEdits = edits.sort((a, b) => document.offsetAt(b.range.start) - document.offsetAt(a.range.start));\n let lastOffset = text.length;\n sortedEdits.forEach(e => {\n const startOffset = document.offsetAt(e.range.start);\n const endOffset = document.offsetAt(e.range.end);\n assert.ok(startOffset <= endOffset);\n assert.ok(endOffset <= lastOffset);\n text = text.substring(0, startOffset) + e.newText + text.substring(endOffset, text.length);\n lastOffset = startOffset;\n });\n\n return text;\n}\n\nfunction applyInsertReplaceEdits(document: TextDocument, text: string, edits: InsertReplaceEdit[]) {\n if (edits.length > 0) {\n throw new Error('applyInsertReplaceEdits is not implemented');\n }\n\n return text;\n}\n\nfunction isTextEdit(value: TextEdit | InsertReplaceEdit | undefined): value is TextEdit {\n return !!value && 'range' in value;\n}\n\nfunction isInsertReplaceEdit(value: TextEdit | InsertReplaceEdit | undefined): value is InsertReplaceEdit {\n return !!value && ('insert' in value || 'replace' in value);\n}\n", "import assert from 'assert';\nimport { Position, Hover } from 'vscode-languageserver-types';\nimport { TextDocument } from 'vscode-languageserver-textdocument';\n\nexport interface HoverTestSetup {\n docUri: string;\n langId: string;\n doHover(document: TextDocument, position: Position): Hover;\n}\n\nexport class HoverAsserter {\n constructor(public hover: Hover, public document: TextDocument) {}\n hasNothing() {\n const contents = this.hover.contents;\n if (Array.isArray(contents) || typeof contents === 'string') {\n assert(contents.length === 0, 'expect nothing, but get hover: ' + contents);\n } else {\n }\n }\n hasHoverAt(label: string, offset: number) {\n const contents = this.hover.contents;\n if (Array.isArray(contents) || typeof contents === 'string') {\n assert(contents.length !== 0, 'expect hover, but get nothing');\n } else {\n assert(contents.value.length !== 0, 'expect hover, but get nothing');\n }\n const strOrMarked = Array.isArray(contents) ? contents[0] : contents;\n const str = typeof strOrMarked === 'string' ? strOrMarked : strOrMarked.value;\n assert.equal(str, label);\n const hover = this.hover;\n assert.equal(this.document.offsetAt(hover.range!.start), offset);\n }\n}\nexport function hoverDSL(setup: HoverTestSetup) {\n return function test([value]: TemplateStringsArray) {\n const offset = value.indexOf('|');\n value = value.slice(0, offset) + value.slice(offset + 1);\n const document = TextDocument.create(setup.docUri, setup.langId, 0, value);\n\n const position = document.positionAt(offset);\n\n const hover = setup.doHover(document, position);\n return new HoverAsserter(hover, document);\n };\n}\n"], "mappings": "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,EACA,eAAgB,CACZ,OACJ,EACA,eAAgB,CACZ,SACA,WACJ,EACA,YAAa,CACT,QACA,MACJ,EACA,gBAAiB,CACb,YACJ,EACA,UAAW,CACP,MACJ,EACA,iBAAkB,CACd,KACA,aACA,MACJ,EACA,gBAAiB,CACb,KACA,aACA,MACJ,EACA,sBAAuB,CACnB,OACA,aACA,WACJ,EACA,kBAAmB,CACf,OACJ,EACA,kBAAmB,CAAC,EACpB,iBAAkB,CACd,OACA,MACJ,EACA,eAAgB,CAAC,EACjB,qBAAsB,CAClB,WACA,QACJ,EACA,yBAA0B,CACtB,aACJ,EACA,uBAAwB,CACpB,cACA,aACA,QACJ,EACA,gBAAiB,CACb,WACA,OACJ,EACA,oBAAqB,CACjB,YACJ,EACA,yBAA0B,CACtB,UACJ,EACA,2BAA4B,CACxB,UACJ,EACA,aAAc,CACV,OACA,OACA,SACA,MACJ,EACA,eAAgB,CACZ,OACA,QACA,MACJ,EACA,eAAgB,CACZ,OACA,QACA,MACJ,EACA,oBAAqB,CACjB,KACA,SACA,MACJ,EACA,mBAAoB,CAChB,KACA,SACA,MACJ,EACA,WAAY,CAAC,EACb,YAAa,CACT,OACA,aACA,WACJ,EACA,kBAAmB,CACf,aACA,QACJ,EACA,uBAAwB,CACpB,OACJ,EACA,iBAAkB,CACd,QACJ,EACA,yBAA0B,CACtB,OACJ,EACA,gBAAiB,CACb,WACA,OACJ,EACA,aAAc,CACV,OACA,OACJ,EACA,kBAAmB,CACf,MACJ,EACA,WAAY,CACR,iBACA,WACA,gBACJ,EACA,mBAAoB,CAAC,EACrB,uBAAwB,CACpB,YACJ,EACA,cAAe,CAAC,EAChB,oBAAqB,CACjB,SACA,UACJ,EACA,kBAAmB,CACf,YACA,MACJ,EACA,kBAAmB,CACf,OACA,YACJ,EACA,mBAAoB,CAChB,UACJ,EACA,QAAS,CAAC,EACV,YAAa,CACT,kBACA,WACA,iBACJ,EACA,mBAAoB,CAAC,EACrB,mBAAoB,CAAC,EACrB,QAAS,CAAC,EACV,iBAAkB,CACd,QACA,MACJ,EACA,kBAAmB,CACf,OACA,OACJ,E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,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,IAAK,GAAI,GAAI,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,IAAK,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,IAAK,GAAI,IAAK,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,IAAK,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,IAAK,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,KAAM,GAAI,GAAI,KAAM,KAAM,IAAK,KAAM,IAAK,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,IAAK,GAAI,IAAK,GAAI,EAAG,EAAG,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,GAAI,KAAM,EAAG,KAAM,GAAI,EAAG,KAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,GAAI,EAAG,GAAI,EAAG,EAAG,IAAK,KAAM,IAAK,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,KAAM,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,KAAM,GAAI,IAAK,GAAI,GAAI,EAAG,GAAI,EAAG,IAAK,GAAI,GAAI,GAAI,KAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,IAAK,GAAI,GAAI,EAAG,EAAG,KAAM,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG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AAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAS,GAAG,SAAW,CAAC,kBAAkB,CAAC,GAAG,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAS,GAAG,SAAW,CAAC,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,CAAC,KAAK,GAAG,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,MAAM,KAAK,EAAE,iBAAiB,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC,OAAS,GAAG,SAAW,CAAC,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,KAAK,GAAG,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,GAAG,EAAE,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,CAAC,KAAK,KAAK,EAAE,gBAAgB,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC,OAAS,GAAG,SAAW,CAAC,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,KAAK,GAAG,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,KAAK,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,KAAK,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe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,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAS,EAAE,SAAW,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,MAAM,GAAG,EAAE,YAAY,CAAC,KAAK,GAAG,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,OAAS,EAAE,SAAW,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,GAAG,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,IAAI,EAAE,WAAW,CAAC,MAAM,GAAG,EAAE,WAAW,CAAC,KAAK,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,IAAI,EAAE,WAAW,CAAC,KAAK,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAS,EAAE,SAAW,CAAC,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,GAAG,EAAE,UAAU,CAAC,MAAM,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,GAAG,EAAE,UAAU,CAAC,KAAK,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,KAAK,EAAE,UAAU,CAAC,KAAK,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,MAAM,KAAK,EAAE,UAAU,CAAC,KAAK,KAAK,EAAE,UAAU,CAAC,MAAM,KAAK,EAAE,UAAU,CAAC,KAAK,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAS,EAAE,SAAW,CAAC,SAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,GAAG,EAAE,SAAS,CAAC,KAAK,GAAG,EAAE,SAAS,CAAC,KAAK,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,OAAS,CAAC,GAAG,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,IAAI,EAAE,SAAS,CAAC,KAAK,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,OAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,OAAS,EAAE,SAAW,CAAC,MAAQ,CAAC,GAAG,EAAE,MAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAQ,CAAC,GAAG,EAAE,MAAQ,CAAC,GAAG,EAAE,MAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,MAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,KAAK,EAAE,QAAQ,CAAC,GAAG,EAAE,MAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,KAAK,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,GAAG,EAAE,QAAQ,CAAC,KAAK,GAAG,EAAE,QAAQ,CAAC,KAAK,IAAI,EAAE,QAAQ,CAAC,MAAM,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,GAAG,EAAE,QAAQ,CAAC,MAAM,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,IAAI,EAAE,QAAQ,CAAC,KAAK,IAAI,EAAE,QAAQ,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,KAAK,IAAI,EAAE,QAAQ,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAQ,CAAC,GAAG,EAAE,MAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAS,EAAE,SAAW,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,KAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,KAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,KAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,KAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAO,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,KAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,KAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,KAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,KAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,GAAG,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC,KAAK,GAAG,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,KAAO,CAAC,GAAG,EAAE,KAAO,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,EAAE,KAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,KAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,KAAO,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,KAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAO,CAAC,GAAG,EAAE,KAAO,CAAC,GAAG,EAAE,KAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,KAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,KAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAS,EAAE,SAAW,CAAC,IAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,IAAM,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,IAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,IAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAM,CAAC,GAAG,EAAE,IAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,IAAM,CAAC,GAAG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